diff --git a/.astro/settings.json b/.astro/settings.json
index 498e0f077..d6953d35d 100644
--- a/.astro/settings.json
+++ b/.astro/settings.json
@@ -3,6 +3,6 @@
 		"enabled": false
 	},
 	"_variables": {
-		"lastUpdateCheck": 1734436957813
+		"lastUpdateCheck": 1741697790683
 	}
 }
\ No newline at end of file
diff --git a/.env.example b/.env.example
index f42d92d18..9bb481b2b 100644
--- a/.env.example
+++ b/.env.example
@@ -1,3 +1,10 @@
 PUBLIC_API_URL=https://api.roadmap.sh
 PUBLIC_AVATAR_BASE_URL=https://dodrc8eu8m09s.cloudfront.net/avatars
-PUBLIC_EDITOR_APP_URL=https://draw.roadmap.sh
\ No newline at end of file
+PUBLIC_EDITOR_APP_URL=https://draw.roadmap.sh
+PUBLIC_COURSE_APP_URL=http://localhost:5173
+
+PUBLIC_STRIPE_INDIVIDUAL_MONTHLY_PRICE_ID=
+PUBLIC_STRIPE_INDIVIDUAL_YEARLY_PRICE_ID=
+
+PUBLIC_STRIPE_INDIVIDUAL_MONTHLY_PRICE_AMOUNT=10
+PUBLIC_STRIPE_INDIVIDUAL_YEARLY_PRICE_AMOUNT=100
\ No newline at end of file
diff --git a/.github/workflows/cloudfront-fe-cache.yml b/.github/workflows/cloudfront-fe-cache.yml
index b9cc87f7e..35e3e841a 100644
--- a/.github/workflows/cloudfront-fe-cache.yml
+++ b/.github/workflows/cloudfront-fe-cache.yml
@@ -13,4 +13,4 @@ jobs:
             -H "Authorization: Bearer ${{ secrets.GH_PAT }}" \
             -H "X-GitHub-Api-Version: 2022-11-28" \
             https://api.github.com/repos/roadmapsh/infra-ansible/actions/workflows/playbook.yml/dispatches \
-            -d '{ "ref":"master", "inputs": { "playbook": "roadmap_web.yml", "tags": "cloudfront", "is_verbose": false } }'
+            -d '{ "ref":"master", "inputs": { "playbook": "roadmap_web.yml", "tags": "cloudfront,cloudfront-course", "is_verbose": false } }'
diff --git a/.github/workflows/greetings.yml b/.github/workflows/greetings.yml
index 858c202fb..7b0b36d0b 100644
--- a/.github/workflows/greetings.yml
+++ b/.github/workflows/greetings.yml
@@ -15,19 +15,9 @@ jobs:
       - uses: actions/first-interaction@v1
         with:
           repo-token: ${{ secrets.GITHUB_TOKEN }}
-          issue-message: |
-            🙌 Hello! Thank you for taking the time to file an issue. 
-            
-            If this is a bug report, please include any relevant logs or details that can help us debug the problem. Your help is greatly appreciated! 💡
-
-            We'll get back to you as soon as possible, kindly be patient for a response from a maintainer.
           pr-message: |
-            🎉 Warm regards and welcome! Thank you for your first ever contribution to **Roadmap.sh**! 
+            Thank you for your first ever contribution to [roadmap.sh](https://roadmap.sh)! 🎉
             
-            We appreciate your effort and enthusiasm. Before diving in, we kindly ask you to take a moment to go through our [Contribution Guidelines](https://github.com/kamranahmedse/developer-roadmap/blob/master/contributing.md) 📘 to ensure your contribution aligns with the project's standards and goals.
-
-            If you are fixing a bug, please reference the associated issue number in your pull request description. 🐛
-
-            If you're working on a new feature, feel free to check with the community on [discord](https://roadmap.sh/discord) to ensure the feature will be accepted. *Also, kindly refrain pinging the maintainer(s).* 🚀
+            Please make sure to follow the [contribution guidelines](https://github.com/kamranahmedse/developer-roadmap/blob/master/contributing.md) when contributing to this project. Any PRs that don't follow the guidelines will be closed.
 
-            Thanks for choosing to contribute, and for making this project better! 🌟
\ No newline at end of file
+            Thanks for choosing to contribute, and for helping make this project better! 🌟
\ No newline at end of file
diff --git a/astro.config.mjs b/astro.config.mjs
index 89e8133ef..1993cefe8 100644
--- a/astro.config.mjs
+++ b/astro.config.mjs
@@ -11,6 +11,14 @@ import react from '@astrojs/react';
 // https://astro.build/config
 export default defineConfig({
   site: 'https://roadmap.sh/',
+  vite: {
+    server: {
+      allowedHosts: [
+        'roadmap.sh',
+        'port3k.kamranahmed.info',
+      ],
+    },
+  },
   markdown: {
     shikiConfig: {
       theme: 'dracula',
diff --git a/license b/license
index 4dcb35a46..ff786d417 100644
--- a/license
+++ b/license
@@ -1,6 +1,7 @@
 Everything including text and images in this project are protected by the copyright laws.
 You are allowed to use this material for personal use but are not allowed to use it for
-any other purpose including publishing the images, the project files or the content in the images in any form either digital, non-digital, textual, graphical or written formats.
+any other purpose including publishing the images, the project files or the content in
+the images in any form either digital, non-digital, textual, graphical or written formats.
 You are allowed to share the links to the repository or the website roadmap.sh but not
 the content for any sort of usage that involves the content of this repository taken out
 of the repository and be shared from any other medium including but not limited to blog
diff --git a/package.json b/package.json
index 28b522487..aeb3d2be3 100644
--- a/package.json
+++ b/package.json
@@ -34,6 +34,7 @@
     "@astrojs/sitemap": "^3.2.0",
     "@astrojs/tailwind": "^5.1.2",
     "@fingerprintjs/fingerprintjs": "^4.5.0",
+    "@microsoft/clarity": "^1.0.0",
     "@nanostores/react": "^0.8.0",
     "@napi-rs/image": "^1.9.2",
     "@resvg/resvg-js": "^2.6.2",
@@ -52,6 +53,7 @@
     "js-cookie": "^3.0.5",
     "lucide-react": "^0.452.0",
     "luxon": "^3.5.0",
+    "markdown-it-async": "^2.0.0",
     "nanoid": "^5.0.7",
     "nanostores": "^0.11.3",
     "node-html-parser": "^6.1.13",
@@ -62,22 +64,27 @@
     "react-calendar-heatmap": "^1.9.0",
     "react-confetti": "^6.1.0",
     "react-dom": "^18.3.1",
+    "react-textarea-autosize": "^8.5.7",
     "react-tooltip": "^5.28.0",
     "reactflow": "^11.11.4",
     "rehype-external-links": "^3.0.0",
     "remark-parse": "^11.0.0",
     "roadmap-renderer": "^1.0.6",
+    "sanitize-html": "^2.13.1",
     "satori": "^0.11.2",
     "satori-html": "^0.3.2",
     "sharp": "^0.33.5",
+    "shiki": "^3.1.0",
     "slugify": "^1.6.6",
     "tailwind-merge": "^2.5.3",
     "tailwindcss": "^3.4.13",
+    "tiptap-markdown": "^0.8.10",
     "turndown": "^7.2.0",
     "unified": "^11.0.5",
     "zustand": "^4.5.5"
   },
   "devDependencies": {
+    "@ai-sdk/google": "^1.1.19",
     "@playwright/test": "^1.48.0",
     "@tailwindcss/typography": "^0.5.15",
     "@types/dom-to-image": "^2.6.7",
@@ -86,7 +93,9 @@
     "@types/prismjs": "^1.26.4",
     "@types/react-calendar-heatmap": "^1.6.7",
     "@types/react-slick": "^0.23.13",
+    "@types/sanitize-html": "^2.13.0",
     "@types/turndown": "^5.0.5",
+    "ai": "^4.1.51",
     "csv-parser": "^3.0.0",
     "gh-pages": "^6.2.0",
     "js-yaml": "^4.1.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index c65650762..2a8d60a16 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -10,22 +10,25 @@ importers:
     dependencies:
       '@astrojs/node':
         specifier: ^8.3.4
-        version: 8.3.4(astro@4.16.1(@types/node@18.19.50)(rollup@4.22.4)(typescript@5.6.2))
+        version: 8.3.4(astro@4.16.18(@types/node@18.19.74)(rollup@4.32.0)(typescript@5.7.3))
       '@astrojs/react':
         specifier: ^3.6.2
-        version: 3.6.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@5.4.8(@types/node@18.19.50))
+        version: 3.6.3(@types/node@18.19.74)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@astrojs/sitemap':
         specifier: ^3.2.0
-        version: 3.2.0
+        version: 3.2.1
       '@astrojs/tailwind':
         specifier: ^5.1.2
-        version: 5.1.2(astro@4.16.1(@types/node@18.19.50)(rollup@4.22.4)(typescript@5.6.2))(tailwindcss@3.4.13)
+        version: 5.1.5(astro@4.16.18(@types/node@18.19.74)(rollup@4.32.0)(typescript@5.7.3))(tailwindcss@3.4.17)
       '@fingerprintjs/fingerprintjs':
         specifier: ^4.5.0
-        version: 4.5.0
+        version: 4.5.1
+      '@microsoft/clarity':
+        specifier: ^1.0.0
+        version: 1.0.0
       '@nanostores/react':
         specifier: ^0.8.0
-        version: 0.8.0(nanostores@0.11.3)(react@18.3.1)
+        version: 0.8.4(nanostores@0.11.3)(react@18.3.1)
       '@napi-rs/image':
         specifier: ^1.9.2
         version: 1.9.2
@@ -34,16 +37,16 @@ importers:
         version: 2.6.2
       '@tanstack/react-query':
         specifier: ^5.59.16
-        version: 5.59.16(react@18.3.1)
+        version: 5.64.2(react@18.3.1)
       '@types/react':
         specifier: ^18.3.11
-        version: 18.3.11
+        version: 18.3.18
       '@types/react-dom':
         specifier: ^18.3.1
-        version: 18.3.1
+        version: 18.3.5(@types/react@18.3.18)
       astro:
         specifier: ^4.16.1
-        version: 4.16.1(@types/node@18.19.50)(rollup@4.22.4)(typescript@5.6.2)
+        version: 4.16.18(@types/node@18.19.74)(rollup@4.32.0)(typescript@5.7.3)
       clsx:
         specifier: ^2.1.1
         version: 2.1.1
@@ -64,10 +67,10 @@ importers:
         version: 3.1.1
       image-size:
         specifier: ^1.1.1
-        version: 1.1.1
+        version: 1.2.0
       jose:
         specifier: ^5.9.4
-        version: 5.9.4
+        version: 5.9.6
       js-cookie:
         specifier: ^3.0.5
         version: 3.0.5
@@ -77,9 +80,12 @@ importers:
       luxon:
         specifier: ^3.5.0
         version: 3.5.0
+      markdown-it-async:
+        specifier: ^2.0.0
+        version: 2.0.0
       nanoid:
         specifier: ^5.0.7
-        version: 5.0.7
+        version: 5.0.9
       nanostores:
         specifier: ^0.11.3
         version: 0.11.3
@@ -88,10 +94,10 @@ importers:
         version: 6.1.13
       npm-check-updates:
         specifier: ^17.1.3
-        version: 17.1.3
+        version: 17.1.14
       playwright:
         specifier: ^1.48.0
-        version: 1.48.0
+        version: 1.50.0
       prismjs:
         specifier: ^1.29.0
         version: 1.29.0
@@ -103,16 +109,19 @@ importers:
         version: 1.9.0(react@18.3.1)
       react-confetti:
         specifier: ^6.1.0
-        version: 6.1.0(react@18.3.1)
+        version: 6.2.2(react@18.3.1)
       react-dom:
         specifier: ^18.3.1
         version: 18.3.1(react@18.3.1)
+      react-textarea-autosize:
+        specifier: ^8.5.7
+        version: 8.5.7(@types/react@18.3.18)(react@18.3.1)
       react-tooltip:
         specifier: ^5.28.0
         version: 5.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       reactflow:
         specifier: ^11.11.4
-        version: 11.11.4(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+        version: 11.11.4(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       rehype-external-links:
         specifier: ^3.0.0
         version: 3.0.0
@@ -122,24 +131,33 @@ importers:
       roadmap-renderer:
         specifier: ^1.0.6
         version: 1.0.6
+      sanitize-html:
+        specifier: ^2.13.1
+        version: 2.14.0
       satori:
         specifier: ^0.11.2
-        version: 0.11.2
+        version: 0.11.3
       satori-html:
         specifier: ^0.3.2
         version: 0.3.2
       sharp:
         specifier: ^0.33.5
         version: 0.33.5
+      shiki:
+        specifier: ^3.1.0
+        version: 3.1.0
       slugify:
         specifier: ^1.6.6
         version: 1.6.6
       tailwind-merge:
         specifier: ^2.5.3
-        version: 2.5.3
+        version: 2.6.0
       tailwindcss:
         specifier: ^3.4.13
-        version: 3.4.13
+        version: 3.4.17
+      tiptap-markdown:
+        specifier: ^0.8.10
+        version: 0.8.10(@tiptap/core@2.11.3(@tiptap/pm@2.11.3))
       turndown:
         specifier: ^7.2.0
         version: 7.2.0
@@ -148,14 +166,17 @@ importers:
         version: 11.0.5
       zustand:
         specifier: ^4.5.5
-        version: 4.5.5(@types/react@18.3.11)(react@18.3.1)
+        version: 4.5.6(@types/react@18.3.18)(react@18.3.1)
     devDependencies:
+      '@ai-sdk/google':
+        specifier: ^1.1.19
+        version: 1.1.19(zod@3.24.1)
       '@playwright/test':
         specifier: ^1.48.0
-        version: 1.48.0
+        version: 1.50.0
       '@tailwindcss/typography':
         specifier: ^0.5.15
-        version: 0.5.15(tailwindcss@3.4.13)
+        version: 0.5.16(tailwindcss@3.4.17)
       '@types/dom-to-image':
         specifier: ^2.6.7
         version: 2.6.7
@@ -167,22 +188,28 @@ importers:
         version: 3.4.2
       '@types/prismjs':
         specifier: ^1.26.4
-        version: 1.26.4
+        version: 1.26.5
       '@types/react-calendar-heatmap':
         specifier: ^1.6.7
-        version: 1.6.7
+        version: 1.9.0
       '@types/react-slick':
         specifier: ^0.23.13
         version: 0.23.13
+      '@types/sanitize-html':
+        specifier: ^2.13.0
+        version: 2.13.0
       '@types/turndown':
         specifier: ^5.0.5
         version: 5.0.5
+      ai:
+        specifier: ^4.1.51
+        version: 4.1.51(react@18.3.1)(zod@3.24.1)
       csv-parser:
         specifier: ^3.0.0
-        version: 3.0.0
+        version: 3.1.0
       gh-pages:
         specifier: ^6.2.0
-        version: 6.2.0
+        version: 6.3.0
       js-yaml:
         specifier: ^4.1.0
         version: 4.1.0
@@ -191,22 +218,62 @@ importers:
         version: 14.1.0
       openai:
         specifier: ^4.67.3
-        version: 4.67.3(zod@3.23.8)
+        version: 4.80.1(zod@3.24.1)
       prettier:
         specifier: ^3.3.3
-        version: 3.3.3
+        version: 3.4.2
       prettier-plugin-astro:
         specifier: ^0.14.1
         version: 0.14.1
       prettier-plugin-tailwindcss:
         specifier: ^0.6.8
-        version: 0.6.8(prettier-plugin-astro@0.14.1)(prettier@3.3.3)
+        version: 0.6.11(prettier-plugin-astro@0.14.1)(prettier@3.4.2)
       tsx:
         specifier: ^4.19.1
-        version: 4.19.1
+        version: 4.19.2
 
 packages:
 
+  '@ai-sdk/google@1.1.19':
+    resolution: {integrity: sha512-Q4l2iWAADUf1pGbXX60A2nnUqEtPLtLpXsbjr3hVcgI9M3q9BqUmSoGsoJ/AAwvZU3uarEb0IJuv+7zlitvCBw==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      zod: ^3.0.0
+
+  '@ai-sdk/provider-utils@2.1.10':
+    resolution: {integrity: sha512-4GZ8GHjOFxePFzkl3q42AU0DQOtTQ5w09vmaWUf/pKFXJPizlnzKSUkF0f+VkapIUfDugyMqPMT1ge8XQzVI7Q==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      zod: ^3.0.0
+    peerDependenciesMeta:
+      zod:
+        optional: true
+
+  '@ai-sdk/provider@1.0.9':
+    resolution: {integrity: sha512-jie6ZJT2ZR0uVOVCDc9R2xCX5I/Dum/wEK28lx21PJx6ZnFAN9EzD2WsPhcDWfCgGx3OAZZ0GyM3CEobXpa9LA==}
+    engines: {node: '>=18'}
+
+  '@ai-sdk/react@1.1.20':
+    resolution: {integrity: sha512-4QOM9fR9SryaRraybckDjrhl1O6XejqELdKmrM5g9y9eLnWAfjwF+W1aN0knkSHzbbjMqN77sy9B9yL8EuJbDw==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      react: ^18 || ^19 || ^19.0.0-rc
+      zod: ^3.0.0
+    peerDependenciesMeta:
+      react:
+        optional: true
+      zod:
+        optional: true
+
+  '@ai-sdk/ui-utils@1.1.16':
+    resolution: {integrity: sha512-jfblR2yZVISmNK2zyNzJZFtkgX57WDAUQXcmn3XUBJyo8LFsADu+/vYMn5AOyBi9qJT0RBk11PEtIxIqvByw3Q==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      zod: ^3.0.0
+    peerDependenciesMeta:
+      zod:
+        optional: true
+
   '@alloc/quick-lru@5.2.0':
     resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
     engines: {node: '>=10'}
@@ -233,8 +300,8 @@ packages:
     resolution: {integrity: sha512-Z9IYjuXSArkAUx3N6xj6+Bnvx8OdUSHA8YoOgyepp3+zJmtVYJIl/I18GozdJVW1p5u/CNpl3Km7/gwTJK85cw==}
     engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0}
 
-  '@astrojs/react@3.6.2':
-    resolution: {integrity: sha512-fK29lYI7zK/KG4ZBy956x4dmauZcZ18osFkuyGa8r3gmmCQa2NZ9XNu9WaVYEUm0j89f4Gii4tbxLoyM8nk2MA==}
+  '@astrojs/react@3.6.3':
+    resolution: {integrity: sha512-5ihLQDH5Runddug5AZYlnp/Q5T81QxhwnWJXA9rchBAdh11c6UhBbv9Kdk7b2PkXoEU70CGWBP9hSh0VCR58eA==}
     engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0}
     peerDependencies:
       '@types/react': ^17.0.50 || ^18.0.21
@@ -242,202 +309,123 @@ packages:
       react: ^17.0.2 || ^18.0.0 || ^19.0.0-beta
       react-dom: ^17.0.2 || ^18.0.0 || ^19.0.0-beta
 
-  '@astrojs/sitemap@3.2.0':
-    resolution: {integrity: sha512-SkrOCL3Z6HxdiXreZ1+aPBWgnBMJ31EgPdcscgQeLqI2Gqk/4EKLuw9q0SqKU9MmHpcPXXtcd0odfCk4barPoA==}
+  '@astrojs/sitemap@3.2.1':
+    resolution: {integrity: sha512-uxMfO8f7pALq0ADL6Lk68UV6dNYjJ2xGUzyjjVj60JLBs5a6smtlkBYv3tQ0DzoqwS7c9n4FUx5lgv0yPo/fgA==}
 
-  '@astrojs/tailwind@5.1.2':
-    resolution: {integrity: sha512-IvOF0W/dtHElcXvhrPR35nHmhyV3cfz1EzPitMGtU7sYy9Hci3BNK1To6FWmVuuNKPxza1IgCGetSynJZL7fOg==}
+  '@astrojs/tailwind@5.1.5':
+    resolution: {integrity: sha512-1diguZEau7FZ9vIjzE4BwavGdhD3+JkdS8zmibl1ene+EHgIU5hI0NMgRYG3yea+Niaf7cyMwjeWeLvzq/maxg==}
     peerDependencies:
-      astro: ^3.0.0 || ^4.0.0 || ^5.0.0-beta.0
+      astro: ^3.0.0 || ^4.0.0 || ^5.0.0
       tailwindcss: ^3.0.24
 
   '@astrojs/telemetry@3.1.0':
     resolution: {integrity: sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA==}
     engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0}
 
-  '@babel/code-frame@7.24.7':
-    resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==}
+  '@babel/code-frame@7.26.2':
+    resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/code-frame@7.25.7':
-    resolution: {integrity: sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==}
+  '@babel/compat-data@7.26.5':
+    resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/compat-data@7.25.4':
-    resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==}
+  '@babel/core@7.26.7':
+    resolution: {integrity: sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/compat-data@7.25.8':
-    resolution: {integrity: sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==}
+  '@babel/generator@7.26.5':
+    resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/core@7.25.2':
-    resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==}
+  '@babel/helper-annotate-as-pure@7.25.9':
+    resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/core@7.25.8':
-    resolution: {integrity: sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==}
+  '@babel/helper-compilation-targets@7.26.5':
+    resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/generator@7.25.6':
-    resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==}
+  '@babel/helper-module-imports@7.25.9':
+    resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/generator@7.25.7':
-    resolution: {integrity: sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==}
-    engines: {node: '>=6.9.0'}
-
-  '@babel/helper-annotate-as-pure@7.25.7':
-    resolution: {integrity: sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==}
-    engines: {node: '>=6.9.0'}
-
-  '@babel/helper-compilation-targets@7.25.2':
-    resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==}
-    engines: {node: '>=6.9.0'}
-
-  '@babel/helper-compilation-targets@7.25.7':
-    resolution: {integrity: sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==}
-    engines: {node: '>=6.9.0'}
-
-  '@babel/helper-module-imports@7.24.7':
-    resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==}
-    engines: {node: '>=6.9.0'}
-
-  '@babel/helper-module-imports@7.25.7':
-    resolution: {integrity: sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==}
-    engines: {node: '>=6.9.0'}
-
-  '@babel/helper-module-transforms@7.25.2':
-    resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==}
+  '@babel/helper-module-transforms@7.26.0':
+    resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0
 
-  '@babel/helper-module-transforms@7.25.7':
-    resolution: {integrity: sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-
-  '@babel/helper-plugin-utils@7.24.8':
-    resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==}
-    engines: {node: '>=6.9.0'}
-
-  '@babel/helper-plugin-utils@7.25.7':
-    resolution: {integrity: sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==}
-    engines: {node: '>=6.9.0'}
-
-  '@babel/helper-simple-access@7.24.7':
-    resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==}
-    engines: {node: '>=6.9.0'}
-
-  '@babel/helper-simple-access@7.25.7':
-    resolution: {integrity: sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==}
-    engines: {node: '>=6.9.0'}
-
-  '@babel/helper-string-parser@7.24.8':
-    resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==}
-    engines: {node: '>=6.9.0'}
-
-  '@babel/helper-string-parser@7.25.7':
-    resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==}
-    engines: {node: '>=6.9.0'}
-
-  '@babel/helper-validator-identifier@7.24.7':
-    resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
-    engines: {node: '>=6.9.0'}
-
-  '@babel/helper-validator-identifier@7.25.7':
-    resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==}
-    engines: {node: '>=6.9.0'}
-
-  '@babel/helper-validator-option@7.24.8':
-    resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==}
-    engines: {node: '>=6.9.0'}
-
-  '@babel/helper-validator-option@7.25.7':
-    resolution: {integrity: sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==}
+  '@babel/helper-plugin-utils@7.26.5':
+    resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helpers@7.25.6':
-    resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==}
+  '@babel/helper-string-parser@7.25.9':
+    resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helpers@7.25.7':
-    resolution: {integrity: sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==}
+  '@babel/helper-validator-identifier@7.25.9':
+    resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/highlight@7.24.7':
-    resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==}
+  '@babel/helper-validator-option@7.25.9':
+    resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/highlight@7.25.7':
-    resolution: {integrity: sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==}
+  '@babel/helpers@7.26.7':
+    resolution: {integrity: sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/parser@7.25.6':
-    resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==}
-    engines: {node: '>=6.0.0'}
-    hasBin: true
-
-  '@babel/parser@7.25.8':
-    resolution: {integrity: sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==}
+  '@babel/parser@7.26.7':
+    resolution: {integrity: sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==}
     engines: {node: '>=6.0.0'}
     hasBin: true
 
-  '@babel/plugin-syntax-jsx@7.25.7':
-    resolution: {integrity: sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==}
+  '@babel/plugin-syntax-jsx@7.25.9':
+    resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-react-jsx-self@7.24.7':
-    resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==}
+  '@babel/plugin-transform-react-jsx-self@7.25.9':
+    resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-react-jsx-source@7.24.7':
-    resolution: {integrity: sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==}
+  '@babel/plugin-transform-react-jsx-source@7.25.9':
+    resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-react-jsx@7.25.7':
-    resolution: {integrity: sha512-vILAg5nwGlR9EXE8JIOX4NHXd49lrYbN8hnjffDtoULwpL9hUx/N55nqh2qd0q6FyNDfjl9V79ecKGvFbcSA0Q==}
+  '@babel/plugin-transform-react-jsx@7.25.9':
+    resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/template@7.25.0':
-    resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==}
+  '@babel/runtime@7.26.9':
+    resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/template@7.25.7':
-    resolution: {integrity: sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==}
+  '@babel/template@7.25.9':
+    resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/traverse@7.25.6':
-    resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==}
+  '@babel/traverse@7.26.7':
+    resolution: {integrity: sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/traverse@7.25.7':
-    resolution: {integrity: sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==}
+  '@babel/types@7.26.7':
+    resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/types@7.25.6':
-    resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==}
-    engines: {node: '>=6.9.0'}
-
-  '@babel/types@7.25.8':
-    resolution: {integrity: sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==}
-    engines: {node: '>=6.9.0'}
-
-  '@emnapi/core@1.2.0':
-    resolution: {integrity: sha512-E7Vgw78I93we4ZWdYCb4DGAwRROGkMIXk7/y87UmANR+J6qsWusmC3gLt0H+O0KOt5e6O38U8oJamgbudrES/w==}
+  '@emnapi/core@1.3.1':
+    resolution: {integrity: sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==}
 
-  '@emnapi/runtime@1.2.0':
-    resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==}
+  '@emnapi/runtime@1.3.1':
+    resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==}
 
   '@emnapi/wasi-threads@1.0.1':
     resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==}
@@ -724,17 +712,17 @@ packages:
     cpu: [x64]
     os: [win32]
 
-  '@fingerprintjs/fingerprintjs@4.5.0':
-    resolution: {integrity: sha512-mFSQoxyt8SGGRp1QUlhcnVtquW2HzCKfHKxAoIurR6soIJpuK3VvZuH0sg8eNaHH2dJhI3mZOEUx4k+P4GqXzw==}
+  '@fingerprintjs/fingerprintjs@4.5.1':
+    resolution: {integrity: sha512-hKJaRoLHNeUUPhb+Md3pTlY/Js2YR4aXjroaDHpxrjoM8kGnEFyZVZxXo6l3gRyKnQN52Uoqsycd3M73eCdMzw==}
 
-  '@floating-ui/core@1.6.8':
-    resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==}
+  '@floating-ui/core@1.6.9':
+    resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==}
 
-  '@floating-ui/dom@1.6.11':
-    resolution: {integrity: sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==}
+  '@floating-ui/dom@1.6.13':
+    resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==}
 
-  '@floating-ui/utils@0.2.8':
-    resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==}
+  '@floating-ui/utils@0.2.9':
+    resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==}
 
   '@img/sharp-darwin-arm64@0.33.5':
     resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==}
@@ -845,8 +833,8 @@ packages:
     resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
     engines: {node: '>=12'}
 
-  '@jridgewell/gen-mapping@0.3.5':
-    resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
+  '@jridgewell/gen-mapping@0.3.8':
+    resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
     engines: {node: '>=6.0.0'}
 
   '@jridgewell/resolve-uri@3.1.2':
@@ -863,11 +851,14 @@ packages:
   '@jridgewell/trace-mapping@0.3.25':
     resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
 
+  '@microsoft/clarity@1.0.0':
+    resolution: {integrity: sha512-2QY6SmXnqRj6dWhNY8NYCN3e53j4zCFebH4wGnNhdGV1mqAsQwql2fT0w8TISxCvwwfVp8idsWLIdrRHOms1PQ==}
+
   '@mixmark-io/domino@2.2.0':
     resolution: {integrity: sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==}
 
-  '@nanostores/react@0.8.0':
-    resolution: {integrity: sha512-MhbVB7NQLboq/Z9fRTDen9zib/YCffe6mn+3Xg5MOYByMX5Xx98SOZjk/Nd3yvOd/g7GjlQqwXj0KF2lPb6CEQ==}
+  '@nanostores/react@0.8.4':
+    resolution: {integrity: sha512-EciHSzDXg7GmGODjegGG1VldPEinbAK+12/Uz5+MAdHmxf082Rl6eXqKFxAAu4pZAcr5dNTpv6wMfEe7XacjkQ==}
     engines: {node: ^18.0.0 || >=20.0.0}
     peerDependencies:
       nanostores: ^0.9.0 || ^0.10.0 || ^0.11.0
@@ -948,8 +939,8 @@ packages:
     resolution: {integrity: sha512-CvTC3XL5/BzHaVkJOZy31xOJLNSY3rBuUIQixaE/LwEQNSUdaxWa9gUyUkC9lUekkUp26CzaLLj2w7l7bxB1ag==}
     engines: {node: '>= 10'}
 
-  '@napi-rs/wasm-runtime@0.2.4':
-    resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==}
+  '@napi-rs/wasm-runtime@0.2.6':
+    resolution: {integrity: sha512-z8YVS3XszxFTO73iwvFDNpQIzdMmSDTP/mB3E/ucR37V3Sx57hSExcXyMoNwaucWxnsWf4xfbZv0iZ30jr0M4Q==}
 
   '@nodelib/fs.scandir@2.1.5':
     resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
@@ -963,6 +954,10 @@ packages:
     resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
     engines: {node: '>= 8'}
 
+  '@opentelemetry/api@1.9.0':
+    resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
+    engines: {node: '>=8.0.0'}
+
   '@oslojs/encoding@1.1.0':
     resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==}
 
@@ -970,8 +965,8 @@ packages:
     resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
     engines: {node: '>=14'}
 
-  '@playwright/test@1.48.0':
-    resolution: {integrity: sha512-W5lhqPUVPqhtc/ySvZI5Q8X2ztBOUgZ8LbAFy0JQgrXZs2xaILrUcNO3rQjwbLPfGK13+rZsDa1FpG+tqYkT5w==}
+  '@playwright/test@1.50.0':
+    resolution: {integrity: sha512-ZGNXbt+d65EGjBORQHuYKj+XhCewlwpnSd/EDuLPZGSiEWmgOJB5RmMCCYGy5aMfTs9wx61RivfDKi8H/hcMvw==}
     engines: {node: '>=18'}
     hasBin: true
 
@@ -1011,6 +1006,9 @@ packages:
       react: '>=17'
       react-dom: '>=17'
 
+  '@remirror/core-constants@3.0.0':
+    resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==}
+
   '@resvg/resvg-js-android-arm-eabi@2.6.2':
     resolution: {integrity: sha512-FrJibrAk6v29eabIPgcTUMPXiEz8ssrAk7TXxsiZzww9UTQ1Z5KAbFJs+Z0Ez+VZTYgnE5IQJqBcoSiMebtPHA==}
     engines: {node: '>= 10'}
@@ -1087,8 +1085,8 @@ packages:
     resolution: {integrity: sha512-xBaJish5OeGmniDj9cW5PRa/PtmuVU3ziqrbr5xJj901ZDN4TosrVaNZpEiLZAxdfnhAe7uQ7QFWfjPe9d9K2Q==}
     engines: {node: '>= 10'}
 
-  '@rollup/pluginutils@5.1.2':
-    resolution: {integrity: sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==}
+  '@rollup/pluginutils@5.1.4':
+    resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==}
     engines: {node: '>=14.0.0'}
     peerDependencies:
       rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
@@ -1096,119 +1094,169 @@ packages:
       rollup:
         optional: true
 
-  '@rollup/rollup-android-arm-eabi@4.22.4':
-    resolution: {integrity: sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==}
+  '@rollup/rollup-android-arm-eabi@4.32.0':
+    resolution: {integrity: sha512-G2fUQQANtBPsNwiVFg4zKiPQyjVKZCUdQUol53R8E71J7AsheRMV/Yv/nB8giOcOVqP7//eB5xPqieBYZe9bGg==}
     cpu: [arm]
     os: [android]
 
-  '@rollup/rollup-android-arm64@4.22.4':
-    resolution: {integrity: sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==}
+  '@rollup/rollup-android-arm64@4.32.0':
+    resolution: {integrity: sha512-qhFwQ+ljoymC+j5lXRv8DlaJYY/+8vyvYmVx074zrLsu5ZGWYsJNLjPPVJJjhZQpyAKUGPydOq9hRLLNvh1s3A==}
     cpu: [arm64]
     os: [android]
 
-  '@rollup/rollup-darwin-arm64@4.22.4':
-    resolution: {integrity: sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==}
+  '@rollup/rollup-darwin-arm64@4.32.0':
+    resolution: {integrity: sha512-44n/X3lAlWsEY6vF8CzgCx+LQaoqWGN7TzUfbJDiTIOjJm4+L2Yq+r5a8ytQRGyPqgJDs3Rgyo8eVL7n9iW6AQ==}
     cpu: [arm64]
     os: [darwin]
 
-  '@rollup/rollup-darwin-x64@4.22.4':
-    resolution: {integrity: sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==}
+  '@rollup/rollup-darwin-x64@4.32.0':
+    resolution: {integrity: sha512-F9ct0+ZX5Np6+ZDztxiGCIvlCaW87HBdHcozUfsHnj1WCUTBUubAoanhHUfnUHZABlElyRikI0mgcw/qdEm2VQ==}
     cpu: [x64]
     os: [darwin]
 
-  '@rollup/rollup-linux-arm-gnueabihf@4.22.4':
-    resolution: {integrity: sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==}
+  '@rollup/rollup-freebsd-arm64@4.32.0':
+    resolution: {integrity: sha512-JpsGxLBB2EFXBsTLHfkZDsXSpSmKD3VxXCgBQtlPcuAqB8TlqtLcbeMhxXQkCDv1avgwNjF8uEIbq5p+Cee0PA==}
+    cpu: [arm64]
+    os: [freebsd]
+
+  '@rollup/rollup-freebsd-x64@4.32.0':
+    resolution: {integrity: sha512-wegiyBT6rawdpvnD9lmbOpx5Sph+yVZKHbhnSP9MqUEDX08G4UzMU+D87jrazGE7lRSyTRs6NEYHtzfkJ3FjjQ==}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@rollup/rollup-linux-arm-gnueabihf@4.32.0':
+    resolution: {integrity: sha512-3pA7xecItbgOs1A5H58dDvOUEboG5UfpTq3WzAdF54acBbUM+olDJAPkgj1GRJ4ZqE12DZ9/hNS2QZk166v92A==}
     cpu: [arm]
     os: [linux]
 
-  '@rollup/rollup-linux-arm-musleabihf@4.22.4':
-    resolution: {integrity: sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==}
+  '@rollup/rollup-linux-arm-musleabihf@4.32.0':
+    resolution: {integrity: sha512-Y7XUZEVISGyge51QbYyYAEHwpGgmRrAxQXO3siyYo2kmaj72USSG8LtlQQgAtlGfxYiOwu+2BdbPjzEpcOpRmQ==}
     cpu: [arm]
     os: [linux]
 
-  '@rollup/rollup-linux-arm64-gnu@4.22.4':
-    resolution: {integrity: sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==}
+  '@rollup/rollup-linux-arm64-gnu@4.32.0':
+    resolution: {integrity: sha512-r7/OTF5MqeBrZo5omPXcTnjvv1GsrdH8a8RerARvDFiDwFpDVDnJyByYM/nX+mvks8XXsgPUxkwe/ltaX2VH7w==}
     cpu: [arm64]
     os: [linux]
 
-  '@rollup/rollup-linux-arm64-musl@4.22.4':
-    resolution: {integrity: sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==}
+  '@rollup/rollup-linux-arm64-musl@4.32.0':
+    resolution: {integrity: sha512-HJbifC9vex9NqnlodV2BHVFNuzKL5OnsV2dvTw6e1dpZKkNjPG6WUq+nhEYV6Hv2Bv++BXkwcyoGlXnPrjAKXw==}
     cpu: [arm64]
     os: [linux]
 
-  '@rollup/rollup-linux-powerpc64le-gnu@4.22.4':
-    resolution: {integrity: sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==}
+  '@rollup/rollup-linux-loongarch64-gnu@4.32.0':
+    resolution: {integrity: sha512-VAEzZTD63YglFlWwRj3taofmkV1V3xhebDXffon7msNz4b14xKsz7utO6F8F4cqt8K/ktTl9rm88yryvDpsfOw==}
+    cpu: [loong64]
+    os: [linux]
+
+  '@rollup/rollup-linux-powerpc64le-gnu@4.32.0':
+    resolution: {integrity: sha512-Sts5DST1jXAc9YH/iik1C9QRsLcCoOScf3dfbY5i4kH9RJpKxiTBXqm7qU5O6zTXBTEZry69bGszr3SMgYmMcQ==}
     cpu: [ppc64]
     os: [linux]
 
-  '@rollup/rollup-linux-riscv64-gnu@4.22.4':
-    resolution: {integrity: sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==}
+  '@rollup/rollup-linux-riscv64-gnu@4.32.0':
+    resolution: {integrity: sha512-qhlXeV9AqxIyY9/R1h1hBD6eMvQCO34ZmdYvry/K+/MBs6d1nRFLm6BOiITLVI+nFAAB9kUB6sdJRKyVHXnqZw==}
     cpu: [riscv64]
     os: [linux]
 
-  '@rollup/rollup-linux-s390x-gnu@4.22.4':
-    resolution: {integrity: sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==}
+  '@rollup/rollup-linux-s390x-gnu@4.32.0':
+    resolution: {integrity: sha512-8ZGN7ExnV0qjXa155Rsfi6H8M4iBBwNLBM9lcVS+4NcSzOFaNqmt7djlox8pN1lWrRPMRRQ8NeDlozIGx3Omsw==}
     cpu: [s390x]
     os: [linux]
 
-  '@rollup/rollup-linux-x64-gnu@4.22.4':
-    resolution: {integrity: sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==}
+  '@rollup/rollup-linux-x64-gnu@4.32.0':
+    resolution: {integrity: sha512-VDzNHtLLI5s7xd/VubyS10mq6TxvZBp+4NRWoW+Hi3tgV05RtVm4qK99+dClwTN1McA6PHwob6DEJ6PlXbY83A==}
     cpu: [x64]
     os: [linux]
 
-  '@rollup/rollup-linux-x64-musl@4.22.4':
-    resolution: {integrity: sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==}
+  '@rollup/rollup-linux-x64-musl@4.32.0':
+    resolution: {integrity: sha512-qcb9qYDlkxz9DxJo7SDhWxTWV1gFuwznjbTiov289pASxlfGbaOD54mgbs9+z94VwrXtKTu+2RqwlSTbiOqxGg==}
     cpu: [x64]
     os: [linux]
 
-  '@rollup/rollup-win32-arm64-msvc@4.22.4':
-    resolution: {integrity: sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==}
+  '@rollup/rollup-win32-arm64-msvc@4.32.0':
+    resolution: {integrity: sha512-pFDdotFDMXW2AXVbfdUEfidPAk/OtwE/Hd4eYMTNVVaCQ6Yl8et0meDaKNL63L44Haxv4UExpv9ydSf3aSayDg==}
     cpu: [arm64]
     os: [win32]
 
-  '@rollup/rollup-win32-ia32-msvc@4.22.4':
-    resolution: {integrity: sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==}
+  '@rollup/rollup-win32-ia32-msvc@4.32.0':
+    resolution: {integrity: sha512-/TG7WfrCAjeRNDvI4+0AAMoHxea/USWhAzf9PVDFHbcqrQ7hMMKp4jZIy4VEjk72AAfN5k4TiSMRXRKf/0akSw==}
     cpu: [ia32]
     os: [win32]
 
-  '@rollup/rollup-win32-x64-msvc@4.22.4':
-    resolution: {integrity: sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==}
+  '@rollup/rollup-win32-x64-msvc@4.32.0':
+    resolution: {integrity: sha512-5hqO5S3PTEO2E5VjCePxv40gIgyS2KvO7E7/vvC/NbIW4SIRamkMr1hqj+5Y67fbBWv/bQLB6KelBQmXlyCjWA==}
     cpu: [x64]
     os: [win32]
 
-  '@shikijs/core@1.22.0':
-    resolution: {integrity: sha512-S8sMe4q71TJAW+qG93s5VaiihujRK6rqDFqBnxqvga/3LvqHEnxqBIOPkt//IdXVtHkQWKu4nOQNk0uBGicU7Q==}
+  '@shikijs/core@1.29.1':
+    resolution: {integrity: sha512-Mo1gGGkuOYjDu5H8YwzmOuly9vNr8KDVkqj9xiKhhhFS8jisAtDSEWB9hzqRHLVQgFdA310e8XRJcW4tYhRB2A==}
+
+  '@shikijs/core@3.1.0':
+    resolution: {integrity: sha512-1ppAOyg3F18N8Ge9DmJjGqRVswihN33rOgPovR6gUHW17Hw1L4RlRhnmVQcsacSHh0A8IO1FIgNbtTxUFwodmg==}
+
+  '@shikijs/engine-javascript@1.29.1':
+    resolution: {integrity: sha512-Hpi8k9x77rCQ7F/7zxIOUruNkNidMyBnP5qAGbLFqg4kRrg1HZhkB8btib5EXbQWTtLb5gBHOdBwshk20njD7Q==}
+
+  '@shikijs/engine-javascript@3.1.0':
+    resolution: {integrity: sha512-/LwkhW17jYi7uPcdaaSQQDNW+xgrHXarkrxYPoC6WPzH2xW5mFMw12doHXJBqxmYvtcTbaatcv2MkH9+3PU1FA==}
+
+  '@shikijs/engine-oniguruma@1.29.1':
+    resolution: {integrity: sha512-gSt2WhLNgEeLstcweQOSp+C+MhOpTsgdNXRqr3zP6M+BUBZ8Md9OU2BYwUYsALBxHza7hwaIWtFHjQ/aOOychw==}
+
+  '@shikijs/engine-oniguruma@3.1.0':
+    resolution: {integrity: sha512-reRgy8VzDPdiDocuGDD60Rk/jLxgcgy+6H4n6jYLeN2Yw5ikasRjQQx8ERXtDM35yg2v/d6KolDBcK8hYYhcmw==}
 
-  '@shikijs/engine-javascript@1.22.0':
-    resolution: {integrity: sha512-AeEtF4Gcck2dwBqCFUKYfsCq0s+eEbCEbkUuFou53NZ0sTGnJnJ/05KHQFZxpii5HMXbocV9URYVowOP2wH5kw==}
+  '@shikijs/langs@1.29.1':
+    resolution: {integrity: sha512-iERn4HlyuT044/FgrvLOaZgKVKf3PozjKjyV/RZ5GnlyYEAZFcgwHGkYboeBv2IybQG1KVS/e7VGgiAU4JY2Gw==}
 
-  '@shikijs/engine-oniguruma@1.22.0':
-    resolution: {integrity: sha512-5iBVjhu/DYs1HB0BKsRRFipRrD7rqjxlWTj4F2Pf+nQSPqc3kcyqFFeZXnBMzDf0HdqaFVvhDRAGiYNvyLP+Mw==}
+  '@shikijs/langs@3.1.0':
+    resolution: {integrity: sha512-hAM//sExPXAXG3ZDWjrmV6Vlw4zlWFOcT1ZXNhFRBwPP27scZu/ZIdZ+TdTgy06zSvyF4KIjnF8j6+ScKGu6ww==}
 
-  '@shikijs/types@1.22.0':
-    resolution: {integrity: sha512-Fw/Nr7FGFhlQqHfxzZY8Cwtwk5E9nKDUgeLjZgt3UuhcM3yJR9xj3ZGNravZZok8XmEZMiYkSMTPlPkULB8nww==}
+  '@shikijs/themes@1.29.1':
+    resolution: {integrity: sha512-lb11zf72Vc9uxkl+aec2oW1HVTHJ2LtgZgumb4Rr6By3y/96VmlU44bkxEb8WBWH3RUtbqAJEN0jljD9cF7H7g==}
 
-  '@shikijs/vscode-textmate@9.3.0':
-    resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==}
+  '@shikijs/themes@3.1.0':
+    resolution: {integrity: sha512-A4MJmy9+ydLNbNCtkmdTp8a+ON+MMXoUe1KTkELkyu0+pHGOcbouhNuobhZoK59cL4cOST6CCz1x+kUdkp9UZA==}
+
+  '@shikijs/types@1.29.1':
+    resolution: {integrity: sha512-aBqAuhYRp5vSir3Pc9+QPu9WESBOjUo03ao0IHLC4TyTioSsp/SkbAZSrIH4ghYYC1T1KTEpRSBa83bas4RnPA==}
+
+  '@shikijs/types@3.1.0':
+    resolution: {integrity: sha512-F8e7Fy4ihtcNpJG572BZZC1ErYrBrzJ5Cbc9Zi3REgWry43gIvjJ9lFAoUnuy7Bvy4IFz7grUSxL5edfrrjFEA==}
+
+  '@shikijs/vscode-textmate@10.0.1':
+    resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==}
+
+  '@shikijs/vscode-textmate@10.0.2':
+    resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
 
   '@shuding/opentype.js@1.4.0-beta.0':
     resolution: {integrity: sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==}
     engines: {node: '>= 8.0.0'}
     hasBin: true
 
-  '@tailwindcss/typography@0.5.15':
-    resolution: {integrity: sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==}
+  '@tailwindcss/typography@0.5.16':
+    resolution: {integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==}
     peerDependencies:
-      tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20'
+      tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1'
 
-  '@tanstack/query-core@5.59.16':
-    resolution: {integrity: sha512-crHn+G3ltqb5JG0oUv6q+PMz1m1YkjpASrXTU+sYWW9pLk0t2GybUHNRqYPZWhxgjPaVGC4yp92gSFEJgYEsPw==}
+  '@tanstack/query-core@5.64.2':
+    resolution: {integrity: sha512-hdO8SZpWXoADNTWXV9We8CwTkXU88OVWRBcsiFrk7xJQnhm6WRlweDzMD+uH+GnuieTBVSML6xFa17C2cNV8+g==}
 
-  '@tanstack/react-query@5.59.16':
-    resolution: {integrity: sha512-MuyWheG47h6ERd4PKQ6V8gDyBu3ThNG22e1fRVwvq6ap3EqsFhyuxCAwhNP/03m/mLg+DAb0upgbPaX6VB+CkQ==}
+  '@tanstack/react-query@5.64.2':
+    resolution: {integrity: sha512-3pakNscZNm8KJkxmovvtZ4RaXLyiYYobwleTMvpIGUoKRa8j8VlrQKNl5W8VUEfVfZKkikvXVddLuWMbcSCA1Q==}
     peerDependencies:
       react: ^18 || ^19
 
+  '@tiptap/core@2.11.3':
+    resolution: {integrity: sha512-ibfi6U1gMRLo319Re6olv8uAuxtUpK343ygcVoZrJ8O4sqRnU9CEqPAM+n7YAKlOks1+Di0sTheIxZRak7Pj4g==}
+    peerDependencies:
+      '@tiptap/pm': ^2.7.0
+
+  '@tiptap/pm@2.11.3':
+    resolution: {integrity: sha512-AEpiWvYmXdELpuGGhX6lS2aU155ANwS7WbQ/+/SFqH3YIYHjgUzP8UnY6KSiEBI7a7kX4TWhG84mWrzPA3dPaw==}
+
   '@tybys/wasm-util@0.9.0':
     resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==}
 
@@ -1290,29 +1338,29 @@ packages:
   '@types/d3-random@3.0.3':
     resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==}
 
-  '@types/d3-scale-chromatic@3.0.3':
-    resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==}
+  '@types/d3-scale-chromatic@3.1.0':
+    resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==}
 
   '@types/d3-scale@4.0.8':
     resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==}
 
-  '@types/d3-selection@3.0.10':
-    resolution: {integrity: sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==}
+  '@types/d3-selection@3.0.11':
+    resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==}
 
-  '@types/d3-shape@3.1.6':
-    resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==}
+  '@types/d3-shape@3.1.7':
+    resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==}
 
   '@types/d3-time-format@4.0.3':
     resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==}
 
-  '@types/d3-time@3.0.3':
-    resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==}
+  '@types/d3-time@3.0.4':
+    resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==}
 
   '@types/d3-timer@3.0.2':
     resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==}
 
-  '@types/d3-transition@3.0.8':
-    resolution: {integrity: sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==}
+  '@types/d3-transition@3.0.9':
+    resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==}
 
   '@types/d3-zoom@3.0.8':
     resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==}
@@ -1323,17 +1371,17 @@ packages:
   '@types/debug@4.1.12':
     resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
 
+  '@types/diff-match-patch@1.0.36':
+    resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==}
+
   '@types/dom-to-image@2.6.7':
     resolution: {integrity: sha512-me5VbCv+fcXozblWwG13krNBvuEOm6kA5xoa4RrjDJCNFOZSWR3/QLtOXimBHk1Fisq69Gx3JtOoXtg1N1tijg==}
 
-  '@types/estree@1.0.5':
-    resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
-
   '@types/estree@1.0.6':
     resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
 
-  '@types/geojson@7946.0.14':
-    resolution: {integrity: sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==}
+  '@types/geojson@7946.0.16':
+    resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==}
 
   '@types/hast@3.0.4':
     resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
@@ -1341,44 +1389,67 @@ packages:
   '@types/js-cookie@3.0.6':
     resolution: {integrity: sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==}
 
+  '@types/linkify-it@3.0.5':
+    resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==}
+
+  '@types/linkify-it@5.0.0':
+    resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==}
+
   '@types/luxon@3.4.2':
     resolution: {integrity: sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==}
 
+  '@types/markdown-it@13.0.9':
+    resolution: {integrity: sha512-1XPwR0+MgXLWfTn9gCsZ55AHOKW1WN+P9vr0PaQh5aerR9LLQXUbjfEAFhjmEmyoYFWAyuN2Mqkn40MZ4ukjBw==}
+
+  '@types/markdown-it@14.1.2':
+    resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==}
+
   '@types/mdast@4.0.4':
     resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
 
-  '@types/ms@0.7.34':
-    resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
+  '@types/mdurl@1.0.5':
+    resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==}
+
+  '@types/mdurl@2.0.0':
+    resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==}
+
+  '@types/ms@2.1.0':
+    resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
 
   '@types/nlcst@2.0.3':
     resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==}
 
-  '@types/node-fetch@2.6.11':
-    resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==}
+  '@types/node-fetch@2.6.12':
+    resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==}
 
   '@types/node@17.0.45':
     resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==}
 
-  '@types/node@18.19.50':
-    resolution: {integrity: sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg==}
+  '@types/node@18.19.74':
+    resolution: {integrity: sha512-HMwEkkifei3L605gFdV+/UwtpxP6JSzM+xFk2Ia6DNFSwSVBRh9qp5Tgf4lNFOMfPVuU0WnkcWpXZpgn5ufO4A==}
 
-  '@types/prismjs@1.26.4':
-    resolution: {integrity: sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg==}
+  '@types/prismjs@1.26.5':
+    resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==}
 
-  '@types/prop-types@15.7.13':
-    resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==}
+  '@types/prop-types@15.7.14':
+    resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==}
 
-  '@types/react-calendar-heatmap@1.6.7':
-    resolution: {integrity: sha512-xWBS9iOvw+aCidPk8QwCH69OCO7jnj6/9TjooqGQ9W+rA5m1aw36GjQMlSYKAg86otDeg9dzA+hSAIcvw/y9Rg==}
+  '@types/react-calendar-heatmap@1.9.0':
+    resolution: {integrity: sha512-BH8M/nsXoLGa3hxWbrq3guPwlK0cV+w1i4c/ktrTxTzN5fBths6WbeUZ4dK0+tE76qiGoVSo9Tse8WVVuMIV+w==}
 
-  '@types/react-dom@18.3.1':
-    resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==}
+  '@types/react-dom@18.3.5':
+    resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==}
+    peerDependencies:
+      '@types/react': ^18.0.0
 
   '@types/react-slick@0.23.13':
     resolution: {integrity: sha512-bNZfDhe/L8t5OQzIyhrRhBr/61pfBcWaYJoq6UDqFtv5LMwfg4NsVDD2J8N01JqdAdxLjOt66OZEp6PX+dGs/A==}
 
-  '@types/react@18.3.11':
-    resolution: {integrity: sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==}
+  '@types/react@18.3.18':
+    resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==}
+
+  '@types/sanitize-html@2.13.0':
+    resolution: {integrity: sha512-X31WxbvW9TjIhZZNyNBZ/p5ax4ti7qsNDBDEnH4zAgmEh35YnFD1UiS6z9Cd34kKm0LslFW0KPmTQzu/oGtsqQ==}
 
   '@types/sax@1.2.7':
     resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==}
@@ -1389,28 +1460,40 @@ packages:
   '@types/unist@3.0.3':
     resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
 
-  '@ungap/structured-clone@1.2.0':
-    resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
+  '@ungap/structured-clone@1.3.0':
+    resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
 
-  '@vitejs/plugin-react@4.3.1':
-    resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==}
+  '@vitejs/plugin-react@4.3.4':
+    resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==}
     engines: {node: ^14.18.0 || >=16.0.0}
     peerDependencies:
-      vite: ^4.2.0 || ^5.0.0
+      vite: ^4.2.0 || ^5.0.0 || ^6.0.0
 
   abort-controller@3.0.0:
     resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
     engines: {node: '>=6.5'}
 
-  acorn@8.12.1:
-    resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==}
+  acorn@8.14.0:
+    resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==}
     engines: {node: '>=0.4.0'}
     hasBin: true
 
-  agentkeepalive@4.5.0:
-    resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==}
+  agentkeepalive@4.6.0:
+    resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==}
     engines: {node: '>= 8.0.0'}
 
+  ai@4.1.51:
+    resolution: {integrity: sha512-CuJgbi2Ktfv/7jjxvUhFOGZ8OFxWQ8a7ZF19lwJuVLauL4uWHLetm6R3iaafahJ8ZkueSbhR/Bnroy5apd1nCw==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      react: ^18 || ^19 || ^19.0.0-rc
+      zod: ^3.0.0
+    peerDependenciesMeta:
+      react:
+        optional: true
+      zod:
+        optional: true
+
   ansi-align@3.0.1:
     resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
 
@@ -1422,10 +1505,6 @@ packages:
     resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
     engines: {node: '>=12'}
 
-  ansi-styles@3.2.1:
-    resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
-    engines: {node: '>=4'}
-
   ansi-styles@4.3.0:
     resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
     engines: {node: '>=8'}
@@ -1461,8 +1540,8 @@ packages:
     resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
     engines: {node: '>=8'}
 
-  astro@4.16.1:
-    resolution: {integrity: sha512-ZeZd+L147HHgHmvoSkve7KM3EutV+hY0mOCa4PwARHEFAAh+omo4MUNoTWsFkfq7ozTgR0PCXQwslrZduoWHNg==}
+  astro@4.16.18:
+    resolution: {integrity: sha512-G7zfwJt9BDHEZwlaLNvjbInIw2hPryyD654314KV/XT34pJU6SfN1S+mWa8RAkALcZNJnJXCJmT3JXLQStD3Lw==}
     engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'}
     hasBin: true
 
@@ -1514,13 +1593,8 @@ packages:
     resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
     engines: {node: '>=8'}
 
-  browserslist@4.23.3:
-    resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==}
-    engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
-    hasBin: true
-
-  browserslist@4.24.0:
-    resolution: {integrity: sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==}
+  browserslist@4.24.4:
+    resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==}
     engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
     hasBin: true
 
@@ -1535,18 +1609,14 @@ packages:
   camelize@1.0.1:
     resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==}
 
-  caniuse-lite@1.0.30001663:
-    resolution: {integrity: sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA==}
+  caniuse-lite@1.0.30001695:
+    resolution: {integrity: sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==}
 
   ccount@2.0.1:
     resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
 
-  chalk@2.4.2:
-    resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
-    engines: {node: '>=4'}
-
-  chalk@5.3.0:
-    resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
+  chalk@5.4.1:
+    resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==}
     engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
 
   character-entities-html4@2.1.0:
@@ -1562,8 +1632,8 @@ packages:
     resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
     engines: {node: '>= 8.10.0'}
 
-  ci-info@4.0.0:
-    resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==}
+  ci-info@4.1.0:
+    resolution: {integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==}
     engines: {node: '>=8'}
 
   classcat@5.0.5:
@@ -1588,16 +1658,10 @@ packages:
     resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
     engines: {node: '>=6'}
 
-  color-convert@1.9.3:
-    resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
-
   color-convert@2.0.1:
     resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
     engines: {node: '>=7.0.0'}
 
-  color-name@1.1.3:
-    resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
-
   color-name@1.1.4:
     resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
 
@@ -1615,9 +1679,9 @@ packages:
   comma-separated-tokens@2.0.3:
     resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
 
-  commander@11.1.0:
-    resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==}
-    engines: {node: '>=16'}
+  commander@13.1.0:
+    resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==}
+    engines: {node: '>=18'}
 
   commander@4.1.1:
     resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
@@ -1636,8 +1700,11 @@ packages:
     resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
     engines: {node: '>= 0.6'}
 
-  cross-spawn@7.0.3:
-    resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
+  crelt@1.0.6:
+    resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==}
+
+  cross-spawn@7.0.6:
+    resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
     engines: {node: '>= 8'}
 
   css-background-parser@0.1.0:
@@ -1672,8 +1739,8 @@ packages:
   csstype@3.1.3:
     resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
 
-  csv-parser@3.0.0:
-    resolution: {integrity: sha512-s6OYSXAK3IdKqYO33y09jhypG/bSDHPuyCme/IdEHfWpLf/jKcpitVFyOC6UemgGk8v7Q5u2XE0vvwmanxhGlQ==}
+  csv-parser@3.1.0:
+    resolution: {integrity: sha512-egOwFF+imkpAE0gTrbzdf7c322lonHAmLPT2Ou1b5lhTSeXyfEdaMBdWuVeUJ6fsYuR0/ENonFo16kEXWKOQFw==}
     engines: {node: '>= 10'}
     hasBin: true
 
@@ -1726,8 +1793,8 @@ packages:
       supports-color:
         optional: true
 
-  debug@4.3.7:
-    resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
+  debug@4.4.0:
+    resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
     engines: {node: '>=6.0'}
     peerDependencies:
       supports-color: '*'
@@ -1738,6 +1805,10 @@ packages:
   decode-named-character-reference@1.0.2:
     resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
 
+  deepmerge@4.3.1:
+    resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+    engines: {node: '>=0.10.0'}
+
   delayed-stream@1.0.0:
     resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
     engines: {node: '>=0.4.0'}
@@ -1771,6 +1842,9 @@ packages:
   didyoumean@1.2.2:
     resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
 
+  diff-match-patch@1.0.5:
+    resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==}
+
   diff@5.2.0:
     resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==}
     engines: {node: '>=0.3.1'}
@@ -1795,8 +1869,8 @@ packages:
     resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
     engines: {node: '>= 4'}
 
-  domutils@3.1.0:
-    resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==}
+  domutils@3.2.2:
+    resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
 
   dracula-prism@2.1.16:
     resolution: {integrity: sha512-fNZU8sMYOFYq/K8WFtsVUJEHemYlQJy7E3wm+Lndp3hTWG+Hp3+sCcbQdWVvQTfw+xIJeI+mIrjfUWHb9Q/s2Q==}
@@ -1811,15 +1885,15 @@ packages:
   ee-first@1.1.1:
     resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
 
-  electron-to-chromium@1.5.27:
-    resolution: {integrity: sha512-o37j1vZqCoEgBuWWXLHQgTN/KDKe7zwpiY5CPeq2RvUqOyJw9xnrULzZAEVQ5p4h+zjMk7hgtOoPdnLxr7m/jw==}
-
-  electron-to-chromium@1.5.36:
-    resolution: {integrity: sha512-HYTX8tKge/VNp6FGO+f/uVDmUkq+cEfcxYhKf15Akc4M5yxt5YmorwlAitKWjWhWQnKcDRBAQKXkhqqXMqcrjw==}
+  electron-to-chromium@1.5.88:
+    resolution: {integrity: sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw==}
 
   email-addresses@5.0.0:
     resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==}
 
+  emoji-regex-xs@1.0.0:
+    resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==}
+
   emoji-regex@10.4.0:
     resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
 
@@ -1829,16 +1903,16 @@ packages:
   emoji-regex@9.2.2:
     resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
 
-  encodeurl@1.0.2:
-    resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
+  encodeurl@2.0.0:
+    resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
     engines: {node: '>= 0.8'}
 
   entities@4.5.0:
     resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
     engines: {node: '>=0.12'}
 
-  es-module-lexer@1.5.4:
-    resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==}
+  es-module-lexer@1.6.0:
+    resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==}
 
   esbuild@0.21.5:
     resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
@@ -1861,6 +1935,10 @@ packages:
     resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
     engines: {node: '>=0.8.0'}
 
+  escape-string-regexp@4.0.0:
+    resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+    engines: {node: '>=10'}
+
   escape-string-regexp@5.0.0:
     resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
     engines: {node: '>=12'}
@@ -1887,6 +1965,10 @@ packages:
   eventemitter3@5.0.1:
     resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
 
+  eventsource-parser@3.0.0:
+    resolution: {integrity: sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==}
+    engines: {node: '>=18.0.0'}
+
   extend-shallow@2.0.1:
     resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
     engines: {node: '>=0.10.0'}
@@ -1894,12 +1976,12 @@ packages:
   extend@3.0.2:
     resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
 
-  fast-glob@3.3.2:
-    resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
+  fast-glob@3.3.3:
+    resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
     engines: {node: '>=8.6.0'}
 
-  fastq@1.17.1:
-    resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
+  fastq@1.18.0:
+    resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==}
 
   fflate@0.7.4:
     resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==}
@@ -1942,8 +2024,8 @@ packages:
   form-data-encoder@1.7.2:
     resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==}
 
-  form-data@4.0.0:
-    resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
+  form-data@4.0.1:
+    resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==}
     engines: {node: '>= 6'}
 
   formdata-node@4.4.1:
@@ -1957,8 +2039,8 @@ packages:
     resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
     engines: {node: '>= 0.6'}
 
-  fs-extra@11.2.0:
-    resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==}
+  fs-extra@11.3.0:
+    resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==}
     engines: {node: '>=14.14'}
 
   fsevents@2.3.2:
@@ -1978,15 +2060,15 @@ packages:
     resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
     engines: {node: '>=6.9.0'}
 
-  get-east-asian-width@1.2.0:
-    resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==}
+  get-east-asian-width@1.3.0:
+    resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==}
     engines: {node: '>=18'}
 
-  get-tsconfig@4.8.1:
-    resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==}
+  get-tsconfig@4.10.0:
+    resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==}
 
-  gh-pages@6.2.0:
-    resolution: {integrity: sha512-HMXJ8th9u5wRXaZCnLcs/d3oVvCHiZkaP5KQExQljYGwJjQbSPyTdHe/Gc1IvYUR/rWiZLxNobIqfoMHKTKjHQ==}
+  gh-pages@6.3.0:
+    resolution: {integrity: sha512-Ot5lU6jK0Eb+sszG8pciXdjMXdBJ5wODvgjR+imihTqsUWF2K6dJ9HST55lgqcs8wWcw6o6wAsUzfcYRhJPXbA==}
     engines: {node: '>=10'}
     hasBin: true
 
@@ -2020,10 +2102,6 @@ packages:
     resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==}
     engines: {node: '>=6.0'}
 
-  has-flag@3.0.0:
-    resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
-    engines: {node: '>=4'}
-
   hasown@2.0.2:
     resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
     engines: {node: '>= 0.4'}
@@ -2031,8 +2109,8 @@ packages:
   hast-util-from-html@2.0.3:
     resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==}
 
-  hast-util-from-parse5@8.0.1:
-    resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==}
+  hast-util-from-parse5@8.0.2:
+    resolution: {integrity: sha512-SfMzfdAi/zAoZ1KkFEyyeXBn7u/ShQrfd675ZEE9M3qj+PMFX05xubzRyF76CCSJu8au9jgVxDV1+okFvgZU4A==}
 
   hast-util-is-element@3.0.0:
     resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==}
@@ -2040,11 +2118,14 @@ packages:
   hast-util-parse-selector@4.0.0:
     resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
 
-  hast-util-raw@9.0.4:
-    resolution: {integrity: sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA==}
+  hast-util-raw@9.1.0:
+    resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==}
 
-  hast-util-to-html@9.0.3:
-    resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==}
+  hast-util-to-html@9.0.4:
+    resolution: {integrity: sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==}
+
+  hast-util-to-html@9.0.5:
+    resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==}
 
   hast-util-to-parse5@8.0.0:
     resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==}
@@ -2055,8 +2136,8 @@ packages:
   hast-util-whitespace@3.0.0:
     resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
 
-  hastscript@8.0.0:
-    resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==}
+  hastscript@9.0.0:
+    resolution: {integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==}
 
   he@1.2.0:
     resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
@@ -2075,6 +2156,9 @@ packages:
   html-void-elements@3.0.0:
     resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
 
+  htmlparser2@8.0.2:
+    resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==}
+
   http-cache-semantics@4.1.1:
     resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
 
@@ -2089,8 +2173,8 @@ packages:
     resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
     engines: {node: '>= 4'}
 
-  image-size@1.1.1:
-    resolution: {integrity: sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==}
+  image-size@1.2.0:
+    resolution: {integrity: sha512-4S8fwbO6w3GeCVN6OPtA9I5IGKkcDMPcKndtUlpJuCwu7JLjtj7JZpwqLuyY2nrmQT3AWsCJLSKPsc2mPBSl3w==}
     engines: {node: '>=16.x'}
     hasBin: true
 
@@ -2111,8 +2195,8 @@ packages:
     resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
     engines: {node: '>=8'}
 
-  is-core-module@2.15.1:
-    resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==}
+  is-core-module@2.16.1:
+    resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
     engines: {node: '>= 0.4'}
 
   is-docker@3.0.0:
@@ -2153,6 +2237,10 @@ packages:
     resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
     engines: {node: '>=12'}
 
+  is-plain-object@5.0.0:
+    resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
+    engines: {node: '>=0.10.0'}
+
   is-unicode-supported@1.3.0:
     resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==}
     engines: {node: '>=12'}
@@ -2171,12 +2259,12 @@ packages:
   jackspeak@3.4.3:
     resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
 
-  jiti@1.21.6:
-    resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==}
+  jiti@1.21.7:
+    resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==}
     hasBin: true
 
-  jose@5.9.4:
-    resolution: {integrity: sha512-WBBl6au1qg6OHj67yCffCgFR3BADJBXN8MdRvCgJDuMv3driV2nHr7jdGvaKX9IolosAsn+M0XRArqLXUhyJHQ==}
+  jose@5.9.6:
+    resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==}
 
   js-cookie@3.0.5:
     resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==}
@@ -2193,21 +2281,24 @@ packages:
     resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
     hasBin: true
 
-  jsesc@2.5.2:
-    resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
-    engines: {node: '>=4'}
-    hasBin: true
-
-  jsesc@3.0.2:
-    resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
+  jsesc@3.1.0:
+    resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
     engines: {node: '>=6'}
     hasBin: true
 
+  json-schema@0.4.0:
+    resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
+
   json5@2.2.3:
     resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
     engines: {node: '>=6'}
     hasBin: true
 
+  jsondiffpatch@0.6.0:
+    resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==}
+    engines: {node: ^18.0.0 || >=20.0.0}
+    hasBin: true
+
   jsonfile@6.1.0:
     resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
 
@@ -2223,12 +2314,8 @@ packages:
     resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
     engines: {node: '>=6'}
 
-  lilconfig@2.1.0:
-    resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
-    engines: {node: '>=10'}
-
-  lilconfig@3.1.2:
-    resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==}
+  lilconfig@3.1.3:
+    resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
     engines: {node: '>=14'}
 
   linebreak@1.1.0:
@@ -2283,8 +2370,8 @@ packages:
     resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==}
     engines: {node: '>=12'}
 
-  magic-string@0.30.11:
-    resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==}
+  magic-string@0.30.17:
+    resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
 
   magicast@0.3.5:
     resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==}
@@ -2293,21 +2380,27 @@ packages:
     resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
     engines: {node: '>=8'}
 
+  markdown-it-async@2.0.0:
+    resolution: {integrity: sha512-jBthmQR5MwXR9Y8Y0teRoZAenaKQMdjuTfpbNARqMBSRPvyzyXCVduHZHakyyhL3ugIacCobXJrO07t277sIjw==}
+
+  markdown-it-task-lists@2.1.1:
+    resolution: {integrity: sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==}
+
   markdown-it@14.1.0:
     resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==}
     hasBin: true
 
-  markdown-table@3.0.3:
-    resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==}
+  markdown-table@3.0.4:
+    resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
 
   mdast-util-definitions@6.0.0:
     resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==}
 
-  mdast-util-find-and-replace@3.0.1:
-    resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==}
+  mdast-util-find-and-replace@3.0.2:
+    resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==}
 
-  mdast-util-from-markdown@2.0.1:
-    resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==}
+  mdast-util-from-markdown@2.0.2:
+    resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==}
 
   mdast-util-gfm-autolink-literal@2.0.1:
     resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==}
@@ -2333,8 +2426,8 @@ packages:
   mdast-util-to-hast@13.2.0:
     resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==}
 
-  mdast-util-to-markdown@2.1.0:
-    resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==}
+  mdast-util-to-markdown@2.1.2:
+    resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==}
 
   mdast-util-to-string@4.0.0:
     resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
@@ -2349,8 +2442,8 @@ packages:
     resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
     engines: {node: '>= 8'}
 
-  micromark-core-commonmark@2.0.1:
-    resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==}
+  micromark-core-commonmark@2.0.2:
+    resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==}
 
   micromark-extension-gfm-autolink-literal@2.1.0:
     resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==}
@@ -2361,8 +2454,8 @@ packages:
   micromark-extension-gfm-strikethrough@2.1.0:
     resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==}
 
-  micromark-extension-gfm-table@2.1.0:
-    resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==}
+  micromark-extension-gfm-table@2.1.1:
+    resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==}
 
   micromark-extension-gfm-tagfilter@2.0.0:
     resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==}
@@ -2373,65 +2466,65 @@ packages:
   micromark-extension-gfm@3.0.0:
     resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
 
-  micromark-factory-destination@2.0.0:
-    resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==}
+  micromark-factory-destination@2.0.1:
+    resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==}
 
-  micromark-factory-label@2.0.0:
-    resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==}
+  micromark-factory-label@2.0.1:
+    resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==}
 
-  micromark-factory-space@2.0.0:
-    resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==}
+  micromark-factory-space@2.0.1:
+    resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==}
 
-  micromark-factory-title@2.0.0:
-    resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==}
+  micromark-factory-title@2.0.1:
+    resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==}
 
-  micromark-factory-whitespace@2.0.0:
-    resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==}
+  micromark-factory-whitespace@2.0.1:
+    resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==}
 
-  micromark-util-character@2.1.0:
-    resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==}
+  micromark-util-character@2.1.1:
+    resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==}
 
-  micromark-util-chunked@2.0.0:
-    resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==}
+  micromark-util-chunked@2.0.1:
+    resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==}
 
-  micromark-util-classify-character@2.0.0:
-    resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==}
+  micromark-util-classify-character@2.0.1:
+    resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==}
 
-  micromark-util-combine-extensions@2.0.0:
-    resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==}
+  micromark-util-combine-extensions@2.0.1:
+    resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==}
 
-  micromark-util-decode-numeric-character-reference@2.0.1:
-    resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==}
+  micromark-util-decode-numeric-character-reference@2.0.2:
+    resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==}
 
-  micromark-util-decode-string@2.0.0:
-    resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==}
+  micromark-util-decode-string@2.0.1:
+    resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==}
 
-  micromark-util-encode@2.0.0:
-    resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==}
+  micromark-util-encode@2.0.1:
+    resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==}
 
-  micromark-util-html-tag-name@2.0.0:
-    resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==}
+  micromark-util-html-tag-name@2.0.1:
+    resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==}
 
-  micromark-util-normalize-identifier@2.0.0:
-    resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==}
+  micromark-util-normalize-identifier@2.0.1:
+    resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==}
 
-  micromark-util-resolve-all@2.0.0:
-    resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==}
+  micromark-util-resolve-all@2.0.1:
+    resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==}
 
-  micromark-util-sanitize-uri@2.0.0:
-    resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==}
+  micromark-util-sanitize-uri@2.0.1:
+    resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==}
 
-  micromark-util-subtokenize@2.0.1:
-    resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==}
+  micromark-util-subtokenize@2.0.4:
+    resolution: {integrity: sha512-N6hXjrin2GTJDe3MVjf5FuXpm12PGm80BrUAeub9XFXca8JZbP+oIwY4LJSVwFUCL1IPm/WwSVUN7goFHmSGGQ==}
 
-  micromark-util-symbol@2.0.0:
-    resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==}
+  micromark-util-symbol@2.0.1:
+    resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==}
 
-  micromark-util-types@2.0.0:
-    resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==}
+  micromark-util-types@2.0.1:
+    resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==}
 
-  micromark@4.0.0:
-    resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==}
+  micromark@4.0.1:
+    resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==}
 
   micromatch@4.0.8:
     resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
@@ -2458,9 +2551,6 @@ packages:
     resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
     engines: {node: '>=16 || 14 >=14.17'}
 
-  minimist@1.2.8:
-    resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
-
   minipass@7.1.2:
     resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
     engines: {node: '>=16 || 14 >=14.17'}
@@ -2478,13 +2568,13 @@ packages:
   mz@2.7.0:
     resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
 
-  nanoid@3.3.7:
-    resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
+  nanoid@3.3.8:
+    resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
     engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
     hasBin: true
 
-  nanoid@5.0.7:
-    resolution: {integrity: sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==}
+  nanoid@5.0.9:
+    resolution: {integrity: sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==}
     engines: {node: ^18 || >=20}
     hasBin: true
 
@@ -2515,8 +2605,8 @@ packages:
   node-html-parser@6.1.13:
     resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==}
 
-  node-releases@2.0.18:
-    resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==}
+  node-releases@2.0.19:
+    resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
 
   normalize-path@3.0.0:
     resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
@@ -2526,8 +2616,8 @@ packages:
     resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
     engines: {node: '>=0.10.0'}
 
-  npm-check-updates@17.1.3:
-    resolution: {integrity: sha512-4uDLBWPuDHT5KLieIJ20FoAB8yqJejmupI42wPyfObgQOBbPAikQSwT73afDwREvhuxYrRDqlRvxTMSfvO+L8A==}
+  npm-check-updates@17.1.14:
+    resolution: {integrity: sha512-dr4bXIxETubLI1tFGeock5hN8yVjahvaVpx+lPO4/O2md3zJuxB7FgH3MIoTvQSCgsgkIRpe0skti01IEAA5tA==}
     engines: {node: ^18.18.0 || >=20.0.0, npm: '>=8.12.1'}
     hasBin: true
 
@@ -2550,48 +2640,57 @@ packages:
     resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
     engines: {node: '>=18'}
 
-  oniguruma-to-js@0.4.3:
-    resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==}
+  oniguruma-to-es@2.3.0:
+    resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==}
+
+  oniguruma-to-es@3.1.1:
+    resolution: {integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==}
 
-  openai@4.67.3:
-    resolution: {integrity: sha512-HT2tZgjLgRqbLQNKmYtjdF/4TQuiBvg1oGvTDhwpSEQzxo6/oM1us8VQ53vBK2BiKvCxFuq6gKGG70qfwrNhKg==}
+  openai@4.80.1:
+    resolution: {integrity: sha512-+6+bbXFwbIE88foZsBEt36bPkgZPdyFN82clAXG61gnHb2gXdZApDyRrcAHqEtpYICywpqaNo57kOm9dtnb7Cw==}
     hasBin: true
     peerDependencies:
+      ws: ^8.18.0
       zod: ^3.23.8
     peerDependenciesMeta:
+      ws:
+        optional: true
       zod:
         optional: true
 
-  ora@8.1.0:
-    resolution: {integrity: sha512-GQEkNkH/GHOhPFXcqZs3IDahXEQcQxsSjEkK4KvEEST4t7eNzoMjxTzef+EZ+JluDEV+Raoi3WQ2CflnRdSVnQ==}
+  ora@8.1.1:
+    resolution: {integrity: sha512-YWielGi1XzG1UTvOaCFaNgEnuhZVMSHYkW/FQ7UX8O26PtlpdM84c0f7wLPlkvx2RfiQmnzd61d/MGxmpQeJPw==}
     engines: {node: '>=18'}
 
+  orderedmap@2.1.1:
+    resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==}
+
   p-limit@2.3.0:
     resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
     engines: {node: '>=6'}
 
-  p-limit@6.1.0:
-    resolution: {integrity: sha512-H0jc0q1vOzlEk0TqAKXKZxdl7kX3OFUzCnNVUnq5Pc3DGo0kpeaMuPqxQn235HibwBEb0/pm9dgKTjXy66fBkg==}
+  p-limit@6.2.0:
+    resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==}
     engines: {node: '>=18'}
 
   p-locate@4.1.0:
     resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
     engines: {node: '>=8'}
 
-  p-queue@8.0.1:
-    resolution: {integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==}
+  p-queue@8.1.0:
+    resolution: {integrity: sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==}
     engines: {node: '>=18'}
 
-  p-timeout@6.1.2:
-    resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==}
+  p-timeout@6.1.4:
+    resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==}
     engines: {node: '>=14.16'}
 
   p-try@2.2.0:
     resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
     engines: {node: '>=6'}
 
-  package-json-from-dist@1.0.0:
-    resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==}
+  package-json-from-dist@1.0.1:
+    resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
 
   pako@0.2.9:
     resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==}
@@ -2602,8 +2701,11 @@ packages:
   parse-latin@7.0.0:
     resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==}
 
-  parse5@7.1.2:
-    resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==}
+  parse-srcset@1.0.2:
+    resolution: {integrity: sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==}
+
+  parse5@7.2.1:
+    resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==}
 
   path-exists@4.0.0:
     resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
@@ -2624,13 +2726,17 @@ packages:
     resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
     engines: {node: '>=8'}
 
-  picocolors@1.1.0:
-    resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==}
+  picocolors@1.1.1:
+    resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
 
   picomatch@2.3.1:
     resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
     engines: {node: '>=8.6'}
 
+  picomatch@4.0.2:
+    resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
+    engines: {node: '>=12'}
+
   pify@2.3.0:
     resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
     engines: {node: '>=0.10.0'}
@@ -2647,13 +2753,13 @@ packages:
     resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
     engines: {node: '>=8'}
 
-  playwright-core@1.48.0:
-    resolution: {integrity: sha512-RBvzjM9rdpP7UUFrQzRwR8L/xR4HyC1QXMzGYTbf1vjw25/ya9NRAVnXi/0fvFopjebvyPzsmoK58xxeEOaVvA==}
+  playwright-core@1.50.0:
+    resolution: {integrity: sha512-CXkSSlr4JaZs2tZHI40DsZUN/NIwgaUPsyLuOAaIZp2CyF2sN5MM5NJsyB188lFSSozFxQ5fPT4qM+f0tH/6wQ==}
     engines: {node: '>=18'}
     hasBin: true
 
-  playwright@1.48.0:
-    resolution: {integrity: sha512-qPqFaMEHuY/ug8o0uteYJSRfMGFikhUysk8ZvAtfKmUK3kc/6oNl/y3EczF8OFGYIi/Ex2HspMfzYArk6+XQSA==}
+  playwright@1.50.0:
+    resolution: {integrity: sha512-+GinGfGTrd2IfX1TA4N2gNmeIksSb+IAe589ZH+FlmpV3MYTx6+buChGIuDLQwrGNCw2lWibqV50fU510N7S+w==}
     engines: {node: '>=18'}
     hasBin: true
 
@@ -2698,8 +2804,8 @@ packages:
   postcss-value-parser@4.2.0:
     resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
 
-  postcss@8.4.47:
-    resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==}
+  postcss@8.5.1:
+    resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==}
     engines: {node: ^10 || ^12 || >=14}
 
   preferred-pm@4.0.0:
@@ -2710,15 +2816,15 @@ packages:
     resolution: {integrity: sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw==}
     engines: {node: ^14.15.0 || >=16.0.0}
 
-  prettier-plugin-tailwindcss@0.6.8:
-    resolution: {integrity: sha512-dGu3kdm7SXPkiW4nzeWKCl3uoImdd5CTZEJGxyypEPL37Wj0HT2pLqjrvSei1nTeuQfO4PUfjeW5cTUNRLZ4sA==}
+  prettier-plugin-tailwindcss@0.6.11:
+    resolution: {integrity: sha512-YxaYSIvZPAqhrrEpRtonnrXdghZg1irNg4qrjboCXrpybLWVs55cW2N3juhspVJiO0JBvYJT8SYsJpc8OQSnsA==}
     engines: {node: '>=14.21.3'}
     peerDependencies:
       '@ianvs/prettier-plugin-sort-imports': '*'
       '@prettier/plugin-pug': '*'
       '@shopify/prettier-plugin-liquid': '*'
       '@trivago/prettier-plugin-sort-imports': '*'
-      '@zackad/prettier-plugin-twig-melody': '*'
+      '@zackad/prettier-plugin-twig': '*'
       prettier: ^3.0
       prettier-plugin-astro: '*'
       prettier-plugin-css-order: '*'
@@ -2740,7 +2846,7 @@ packages:
         optional: true
       '@trivago/prettier-plugin-sort-imports':
         optional: true
-      '@zackad/prettier-plugin-twig-melody':
+      '@zackad/prettier-plugin-twig':
         optional: true
       prettier-plugin-astro:
         optional: true
@@ -2765,8 +2871,8 @@ packages:
       prettier-plugin-svelte:
         optional: true
 
-  prettier@3.3.3:
-    resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==}
+  prettier@3.4.2:
+    resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==}
     engines: {node: '>=14'}
     hasBin: true
 
@@ -2784,6 +2890,67 @@ packages:
   property-information@6.5.0:
     resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==}
 
+  property-information@7.0.0:
+    resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==}
+
+  prosemirror-changeset@2.2.1:
+    resolution: {integrity: sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==}
+
+  prosemirror-collab@1.3.1:
+    resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==}
+
+  prosemirror-commands@1.6.2:
+    resolution: {integrity: sha512-0nDHH++qcf/BuPLYvmqZTUUsPJUCPBUXt0J1ErTcDIS369CTp773itzLGIgIXG4LJXOlwYCr44+Mh4ii6MP1QA==}
+
+  prosemirror-dropcursor@1.8.1:
+    resolution: {integrity: sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==}
+
+  prosemirror-gapcursor@1.3.2:
+    resolution: {integrity: sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==}
+
+  prosemirror-history@1.4.1:
+    resolution: {integrity: sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==}
+
+  prosemirror-inputrules@1.4.0:
+    resolution: {integrity: sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==}
+
+  prosemirror-keymap@1.2.2:
+    resolution: {integrity: sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==}
+
+  prosemirror-markdown@1.13.1:
+    resolution: {integrity: sha512-Sl+oMfMtAjWtlcZoj/5L/Q39MpEnVZ840Xo330WJWUvgyhNmLBLN7MsHn07s53nG/KImevWHSE6fEj4q/GihHw==}
+
+  prosemirror-menu@1.2.4:
+    resolution: {integrity: sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==}
+
+  prosemirror-model@1.24.1:
+    resolution: {integrity: sha512-YM053N+vTThzlWJ/AtPtF1j0ebO36nvbmDy4U7qA2XQB8JVaQp1FmB9Jhrps8s+z+uxhhVTny4m20ptUvhk0Mg==}
+
+  prosemirror-schema-basic@1.2.3:
+    resolution: {integrity: sha512-h+H0OQwZVqMon1PNn0AG9cTfx513zgIG2DY00eJ00Yvgb3UD+GQ/VlWW5rcaxacpCGT1Yx8nuhwXk4+QbXUfJA==}
+
+  prosemirror-schema-list@1.5.0:
+    resolution: {integrity: sha512-gg1tAfH1sqpECdhIHOA/aLg2VH3ROKBWQ4m8Qp9mBKrOxQRW61zc+gMCI8nh22gnBzd1t2u1/NPLmO3nAa3ssg==}
+
+  prosemirror-state@1.4.3:
+    resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==}
+
+  prosemirror-tables@1.6.2:
+    resolution: {integrity: sha512-97dKocVLrEVTQjZ4GBLdrrMw7Gv3no8H8yMwf5IRM9OoHrzbWpcH5jJxYgNQIRCtdIqwDctT1HdMHrGTiwp1dQ==}
+
+  prosemirror-trailing-node@3.0.0:
+    resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==}
+    peerDependencies:
+      prosemirror-model: ^1.22.1
+      prosemirror-state: ^1.4.2
+      prosemirror-view: ^1.33.8
+
+  prosemirror-transform@1.10.2:
+    resolution: {integrity: sha512-2iUq0wv2iRoJO/zj5mv8uDUriOHWzXRnOTVgCzSXnktS/2iQRa3UUQwVlkBlYZFtygw6Nh1+X4mGqoYBINn5KQ==}
+
+  prosemirror-view@1.37.2:
+    resolution: {integrity: sha512-ApcyrfV/cRcaL65on7TQcfWElwLyOgIjnIynfAuV+fIdlpbSvSWRwfuPaH7T5mo4AbO/FID29qOtjiDIKGWyog==}
+
   punycode.js@2.3.1:
     resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==}
     engines: {node: '>=6'}
@@ -2803,11 +2970,11 @@ packages:
     peerDependencies:
       react: ^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0
 
-  react-confetti@6.1.0:
-    resolution: {integrity: sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw==}
-    engines: {node: '>=10.18'}
+  react-confetti@6.2.2:
+    resolution: {integrity: sha512-K+kTyOPgX+ZujMZ+Rmb7pZdHBvg+DzinG/w4Eh52WOB8/pfO38efnnrtEZNJmjTvLxc16RBYO+tPM68Fg8viBA==}
+    engines: {node: '>=16'}
     peerDependencies:
-      react: ^16.3.0 || ^17.0.1 || ^18.0.0
+      react: ^16.3.0 || ^17.0.1 || ^18.0.0 || ^19.0.0
 
   react-dom@18.3.1:
     resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
@@ -2821,6 +2988,12 @@ packages:
     resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==}
     engines: {node: '>=0.10.0'}
 
+  react-textarea-autosize@8.5.7:
+    resolution: {integrity: sha512-2MqJ3p0Jh69yt9ktFIaZmORHXw4c4bxSIhCeWiFwmJ9EYKgLmuNII3e9c9b2UO+ijl4StnpZdqpxNIhTdHvqtQ==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
   react-tooltip@5.28.0:
     resolution: {integrity: sha512-R5cO3JPPXk6FRbBHMO0rI9nkUG/JKfalBSQfZedZYzmqaZQgq7GLzF8vcCWx6IhUCKg0yPqJhXIzmIO5ff15xg==}
     peerDependencies:
@@ -2844,14 +3017,29 @@ packages:
     resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
     engines: {node: '>=8.10.0'}
 
-  regex@4.3.2:
-    resolution: {integrity: sha512-kK/AA3A9K6q2js89+VMymcboLOlF5lZRCYJv3gzszXFHBr6kO6qLGzbm+UIugBEV8SMMKCTR59txoY6ctRHYVw==}
+  regenerator-runtime@0.14.1:
+    resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
+  regex-recursion@5.1.1:
+    resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==}
+
+  regex-recursion@6.0.2:
+    resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==}
+
+  regex-utilities@2.3.0:
+    resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==}
+
+  regex@5.1.1:
+    resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==}
+
+  regex@6.0.1:
+    resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==}
 
   rehype-external-links@3.0.0:
     resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==}
 
-  rehype-parse@9.0.0:
-    resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==}
+  rehype-parse@9.0.1:
+    resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==}
 
   rehype-raw@7.0.0:
     resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==}
@@ -2881,8 +3069,9 @@ packages:
   resolve-pkg-maps@1.0.0:
     resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
 
-  resolve@1.22.8:
-    resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
+  resolve@1.22.10:
+    resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
+    engines: {node: '>= 0.4'}
     hasBin: true
 
   restore-cursor@5.1.0:
@@ -2892,8 +3081,8 @@ packages:
   retext-latin@4.0.0:
     resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==}
 
-  retext-smartypants@6.1.1:
-    resolution: {integrity: sha512-onsHf34i/GzgElJgtT1K2V+31yEhWs7NJboKNxXJcmVMMPxLpgxZ9iADoMdydd6j/bHic5F/aNq0CGqElEtu2g==}
+  retext-smartypants@6.2.0:
+    resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==}
 
   retext-stringify@4.0.0:
     resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==}
@@ -2908,25 +3097,31 @@ packages:
   roadmap-renderer@1.0.6:
     resolution: {integrity: sha512-IQejjIfr9RIvesNwp3SyhEq1DMQ2RdJfJhgsb1AyPuKXsfJgOG8F++Cz1p3SIcY0bnB57Q16Ke2VJLjiUVwI3Q==}
 
-  rollup@4.22.4:
-    resolution: {integrity: sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==}
+  rollup@4.32.0:
+    resolution: {integrity: sha512-JmrhfQR31Q4AuNBjjAX4s+a/Pu/Q8Q9iwjWBsjRH1q52SPFE2NqRMK6fUZKKnvKO6id+h7JIRf0oYsph53eATg==}
     engines: {node: '>=18.0.0', npm: '>=8.0.0'}
     hasBin: true
 
+  rope-sequence@1.3.4:
+    resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==}
+
   run-parallel@1.2.0:
     resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
 
   s.color@0.0.15:
     resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==}
 
+  sanitize-html@2.14.0:
+    resolution: {integrity: sha512-CafX+IUPxZshXqqRaG9ZClSlfPVjSxI0td7n07hk8QO2oO+9JDnlcL8iM8TWeOXOIBFgIOx6zioTzM53AOMn3g==}
+
   sass-formatter@0.7.9:
     resolution: {integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==}
 
   satori-html@0.3.2:
     resolution: {integrity: sha512-wjTh14iqADFKDK80e51/98MplTGfxz2RmIzh0GqShlf4a67+BooLywF17TvJPD6phO0Hxm7Mf1N5LtRYvdkYRA==}
 
-  satori@0.11.2:
-    resolution: {integrity: sha512-uEPLbx89BfwzJroECvnTg8IQ+XxqkMl0apvB41mm8fmc6brzHA8bu9Etu43UoUF4ECnACPiDDFz6PfYDG0S46Q==}
+  satori@0.11.3:
+    resolution: {integrity: sha512-Wg7sls0iYAEETzi9YYcY16QVIqXjZT06XjkwondC5CGhw1mhmgKBCub8cCmkxdl/naXXQD+m29CFgn8pwtYCnA==}
     engines: {node: '>=16'}
 
   sax@1.4.1:
@@ -2939,6 +3134,9 @@ packages:
     resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==}
     engines: {node: '>=4'}
 
+  secure-json-parse@2.7.0:
+    resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==}
+
   semver@6.3.1:
     resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
     hasBin: true
@@ -2948,8 +3146,8 @@ packages:
     engines: {node: '>=10'}
     hasBin: true
 
-  send@0.19.0:
-    resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
+  send@0.19.1:
+    resolution: {integrity: sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==}
     engines: {node: '>= 0.8.0'}
 
   server-destroy@1.0.1:
@@ -2970,8 +3168,11 @@ packages:
     resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
     engines: {node: '>=8'}
 
-  shiki@1.22.0:
-    resolution: {integrity: sha512-/t5LlhNs+UOKQCYBtl5ZsH/Vclz73GIqT2yQsCBygr8L/ppTdmpL4w3kPLoZJbMKVWtoG77Ue1feOjZfDxvMkw==}
+  shiki@1.29.1:
+    resolution: {integrity: sha512-TghWKV9pJTd/N+IgAIVJtr0qZkB7FfFCUrrEJc0aRmZupo3D1OCVRknQWVRVA7AX/M0Ld7QfoAruPzr3CnUJuw==}
+
+  shiki@3.1.0:
+    resolution: {integrity: sha512-LdTNyWQlC5zdCaHdcp1zPA1OVA2ivb+KjGOOnGcy02tGaF5ja+dGibWFH7Ar8YlngUgK/scDqworK18Ys9cbYA==}
 
   signal-exit@4.1.0:
     resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
@@ -3063,19 +3264,20 @@ packages:
   suf-log@2.5.3:
     resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==}
 
-  supports-color@5.5.0:
-    resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
-    engines: {node: '>=4'}
-
   supports-preserve-symlinks-flag@1.0.0:
     resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
     engines: {node: '>= 0.4'}
 
-  tailwind-merge@2.5.3:
-    resolution: {integrity: sha512-d9ZolCAIzom1nf/5p4LdD5zvjmgSxY0BGgdSvmXIoMYAiPdAW/dSpP7joCDYFY7r/HkEa2qmPtkgsu0xjQeQtw==}
+  swr@2.3.2:
+    resolution: {integrity: sha512-RosxFpiabojs75IwQ316DGoDRmOqtiAj0tg8wCcbEu4CiLZBs/a9QNtHV7TUfDXmmlgqij/NqzKq/eLelyv9xA==}
+    peerDependencies:
+      react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+  tailwind-merge@2.6.0:
+    resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==}
 
-  tailwindcss@3.4.13:
-    resolution: {integrity: sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==}
+  tailwindcss@3.4.17:
+    resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==}
     engines: {node: '>=14.0.0'}
     hasBin: true
 
@@ -3086,15 +3288,20 @@ packages:
   thenify@3.3.1:
     resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
 
+  throttleit@2.1.0:
+    resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==}
+    engines: {node: '>=18'}
+
   tiny-inflate@1.0.3:
     resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==}
 
-  tinyexec@0.3.0:
-    resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==}
+  tinyexec@0.3.2:
+    resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
 
-  to-fast-properties@2.0.0:
-    resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
-    engines: {node: '>=4'}
+  tiptap-markdown@0.8.10:
+    resolution: {integrity: sha512-iDVkR2BjAqkTDtFX0h94yVvE2AihCXlF0Q7RIXSJPRSR5I0PA1TMuAg6FHFpmqTn4tPxJ0by0CK7PUMlnFLGEQ==}
+    peerDependencies:
+      '@tiptap/core': ^2.0.3
 
   to-regex-range@5.0.1:
     resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
@@ -3120,8 +3327,8 @@ packages:
   ts-interface-checker@0.1.13:
     resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
 
-  tsconfck@3.1.3:
-    resolution: {integrity: sha512-ulNZP1SVpRDesxeMLON/LtWM8HIgAJEIVpVVhBM6gsmvQ8+Rh+ZG7FWGvHh7Ah3pRABwVJWklWCr/BTZSv0xnQ==}
+  tsconfck@3.1.4:
+    resolution: {integrity: sha512-kdqWFGVJqe+KGYvlSO9NIaWn9jT1Ny4oKVzAJsKii5eoE9snzTJzL4+MMVOMn+fikWGFmKEylcXL710V/kIPJQ==}
     engines: {node: ^18 || >=20}
     hasBin: true
     peerDependencies:
@@ -3130,11 +3337,11 @@ packages:
       typescript:
         optional: true
 
-  tslib@2.7.0:
-    resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==}
+  tslib@2.8.1:
+    resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
 
-  tsx@4.19.1:
-    resolution: {integrity: sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==}
+  tsx@4.19.2:
+    resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==}
     engines: {node: '>=18.0.0'}
     hasBin: true
 
@@ -3144,12 +3351,12 @@ packages:
   tween-functions@1.2.0:
     resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==}
 
-  type-fest@4.26.1:
-    resolution: {integrity: sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==}
+  type-fest@4.33.0:
+    resolution: {integrity: sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g==}
     engines: {node: '>=16'}
 
-  typescript@5.6.2:
-    resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==}
+  typescript@5.7.3:
+    resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
     engines: {node: '>=14.17'}
     hasBin: true
 
@@ -3199,16 +3406,43 @@ packages:
     resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
     engines: {node: '>= 10.0.0'}
 
-  update-browserslist-db@1.1.0:
-    resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==}
+  update-browserslist-db@1.1.2:
+    resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==}
     hasBin: true
     peerDependencies:
       browserslist: '>= 4.21.0'
 
-  use-sync-external-store@1.2.2:
-    resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==}
+  use-composed-ref@1.4.0:
+    resolution: {integrity: sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==}
     peerDependencies:
-      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+      '@types/react': '*'
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+    peerDependenciesMeta:
+      '@types/react':
+        optional: true
+
+  use-isomorphic-layout-effect@1.2.0:
+    resolution: {integrity: sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w==}
+    peerDependencies:
+      '@types/react': '*'
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+    peerDependenciesMeta:
+      '@types/react':
+        optional: true
+
+  use-latest@1.3.0:
+    resolution: {integrity: sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==}
+    peerDependencies:
+      '@types/react': '*'
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+    peerDependenciesMeta:
+      '@types/react':
+        optional: true
+
+  use-sync-external-store@1.4.0:
+    resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
 
   util-deprecate@1.0.2:
     resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
@@ -3222,8 +3456,8 @@ packages:
   vfile@6.0.3:
     resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
 
-  vite@5.4.8:
-    resolution: {integrity: sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==}
+  vite@5.4.14:
+    resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==}
     engines: {node: ^18.0.0 || >=20.0.0}
     hasBin: true
     peerDependencies:
@@ -3253,14 +3487,17 @@ packages:
       terser:
         optional: true
 
-  vitefu@1.0.2:
-    resolution: {integrity: sha512-0/iAvbXyM3RiPPJ4lyD4w6Mjgtf4ejTK6TPvTNG3H32PLwuT0N/ZjJLiXug7ETE/LWtTeHw9WRv7uX/tIKYyKg==}
+  vitefu@1.0.5:
+    resolution: {integrity: sha512-h4Vflt9gxODPFNGPwp4zAMZRpZR7eslzwH2c5hn5kNZ5rhnKyRJ50U+yGCdc2IRaBs8O4haIgLNGrV5CrpMsCA==}
     peerDependencies:
-      vite: ^3.0.0 || ^4.0.0 || ^5.0.0
+      vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0
     peerDependenciesMeta:
       vite:
         optional: true
 
+  w3c-keyname@2.2.8:
+    resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==}
+
   web-namespaces@2.0.1:
     resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
 
@@ -3303,14 +3540,14 @@ packages:
     resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==}
     engines: {node: '>=18'}
 
-  xxhash-wasm@1.0.2:
-    resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==}
+  xxhash-wasm@1.1.0:
+    resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==}
 
   yallist@3.1.1:
     resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
 
-  yaml@2.5.1:
-    resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==}
+  yaml@2.7.0:
+    resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==}
     engines: {node: '>= 14'}
     hasBin: true
 
@@ -3325,10 +3562,10 @@ packages:
   yoga-wasm-web@0.3.3:
     resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==}
 
-  zod-to-json-schema@3.23.3:
-    resolution: {integrity: sha512-TYWChTxKQbRJp5ST22o/Irt9KC5nj7CdBKYB/AosCRdj/wxEMvv4NNaj9XVUHDOIp53ZxArGhnw5HMZziPFjog==}
+  zod-to-json-schema@3.24.1:
+    resolution: {integrity: sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==}
     peerDependencies:
-      zod: ^3.23.3
+      zod: ^3.24.1
 
   zod-to-ts@1.2.0:
     resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==}
@@ -3336,11 +3573,11 @@ packages:
       typescript: ^4.9.4 || ^5.0.2
       zod: ^3
 
-  zod@3.23.8:
-    resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==}
+  zod@3.24.1:
+    resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==}
 
-  zustand@4.5.5:
-    resolution: {integrity: sha512-+0PALYNJNgK6hldkgDq2vLrw5f6g/jCInz52n9RTpropGgeAf/ioFUCdtsjCqu4gNhW9D01rUQBROoRjdzyn2Q==}
+  zustand@4.5.6:
+    resolution: {integrity: sha512-ibr/n1hBzLLj5Y+yUcU7dYw8p6WnIVzdJbnX+1YpaScvZVF2ziugqHs+LAmHw4lWO9c/zRj+K1ncgWDQuthEdQ==}
     engines: {node: '>=12.7.0'}
     peerDependencies:
       '@types/react': '>=16.8'
@@ -3359,11 +3596,48 @@ packages:
 
 snapshots:
 
+  '@ai-sdk/google@1.1.19(zod@3.24.1)':
+    dependencies:
+      '@ai-sdk/provider': 1.0.9
+      '@ai-sdk/provider-utils': 2.1.10(zod@3.24.1)
+      zod: 3.24.1
+
+  '@ai-sdk/provider-utils@2.1.10(zod@3.24.1)':
+    dependencies:
+      '@ai-sdk/provider': 1.0.9
+      eventsource-parser: 3.0.0
+      nanoid: 3.3.8
+      secure-json-parse: 2.7.0
+    optionalDependencies:
+      zod: 3.24.1
+
+  '@ai-sdk/provider@1.0.9':
+    dependencies:
+      json-schema: 0.4.0
+
+  '@ai-sdk/react@1.1.20(react@18.3.1)(zod@3.24.1)':
+    dependencies:
+      '@ai-sdk/provider-utils': 2.1.10(zod@3.24.1)
+      '@ai-sdk/ui-utils': 1.1.16(zod@3.24.1)
+      swr: 2.3.2(react@18.3.1)
+      throttleit: 2.1.0
+    optionalDependencies:
+      react: 18.3.1
+      zod: 3.24.1
+
+  '@ai-sdk/ui-utils@1.1.16(zod@3.24.1)':
+    dependencies:
+      '@ai-sdk/provider': 1.0.9
+      '@ai-sdk/provider-utils': 2.1.10(zod@3.24.1)
+      zod-to-json-schema: 3.24.1(zod@3.24.1)
+    optionalDependencies:
+      zod: 3.24.1
+
   '@alloc/quick-lru@5.2.0': {}
 
   '@ampproject/remapping@2.3.0':
     dependencies:
-      '@jridgewell/gen-mapping': 0.3.5
+      '@jridgewell/gen-mapping': 0.3.8
       '@jridgewell/trace-mapping': 0.3.25
 
   '@astrojs/compiler@2.10.3': {}
@@ -3384,7 +3658,7 @@ snapshots:
       remark-parse: 11.0.0
       remark-rehype: 11.1.1
       remark-smartypants: 3.0.2
-      shiki: 1.22.0
+      shiki: 1.29.1
       unified: 11.0.5
       unist-util-remove-position: 5.0.0
       unist-util-visit: 5.0.0
@@ -3393,10 +3667,10 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@astrojs/node@8.3.4(astro@4.16.1(@types/node@18.19.50)(rollup@4.22.4)(typescript@5.6.2))':
+  '@astrojs/node@8.3.4(astro@4.16.18(@types/node@18.19.74)(rollup@4.32.0)(typescript@5.7.3))':
     dependencies:
-      astro: 4.16.1(@types/node@18.19.50)(rollup@4.22.4)(typescript@5.6.2)
-      send: 0.19.0
+      astro: 4.16.18(@types/node@18.19.74)(rollup@4.32.0)(typescript@5.7.3)
+      send: 0.19.1
       server-destroy: 1.0.1
     transitivePeerDependencies:
       - supports-color
@@ -3405,38 +3679,46 @@ snapshots:
     dependencies:
       prismjs: 1.29.0
 
-  '@astrojs/react@3.6.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@5.4.8(@types/node@18.19.50))':
+  '@astrojs/react@3.6.3(@types/node@18.19.74)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
-      '@types/react': 18.3.11
-      '@types/react-dom': 18.3.1
-      '@vitejs/plugin-react': 4.3.1(vite@5.4.8(@types/node@18.19.50))
+      '@types/react': 18.3.18
+      '@types/react-dom': 18.3.5(@types/react@18.3.18)
+      '@vitejs/plugin-react': 4.3.4(vite@5.4.14(@types/node@18.19.74))
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
       ultrahtml: 1.5.3
+      vite: 5.4.14(@types/node@18.19.74)
     transitivePeerDependencies:
+      - '@types/node'
+      - less
+      - lightningcss
+      - sass
+      - sass-embedded
+      - stylus
+      - sugarss
       - supports-color
-      - vite
+      - terser
 
-  '@astrojs/sitemap@3.2.0':
+  '@astrojs/sitemap@3.2.1':
     dependencies:
       sitemap: 8.0.0
       stream-replace-string: 2.0.0
-      zod: 3.23.8
+      zod: 3.24.1
 
-  '@astrojs/tailwind@5.1.2(astro@4.16.1(@types/node@18.19.50)(rollup@4.22.4)(typescript@5.6.2))(tailwindcss@3.4.13)':
+  '@astrojs/tailwind@5.1.5(astro@4.16.18(@types/node@18.19.74)(rollup@4.32.0)(typescript@5.7.3))(tailwindcss@3.4.17)':
     dependencies:
-      astro: 4.16.1(@types/node@18.19.50)(rollup@4.22.4)(typescript@5.6.2)
-      autoprefixer: 10.4.20(postcss@8.4.47)
-      postcss: 8.4.47
-      postcss-load-config: 4.0.2(postcss@8.4.47)
-      tailwindcss: 3.4.13
+      astro: 4.16.18(@types/node@18.19.74)(rollup@4.32.0)(typescript@5.7.3)
+      autoprefixer: 10.4.20(postcss@8.5.1)
+      postcss: 8.5.1
+      postcss-load-config: 4.0.2(postcss@8.5.1)
+      tailwindcss: 3.4.17
     transitivePeerDependencies:
       - ts-node
 
   '@astrojs/telemetry@3.1.0':
     dependencies:
-      ci-info: 4.0.0
-      debug: 4.3.7
+      ci-info: 4.1.0
+      debug: 4.4.0
       dlv: 1.1.3
       dset: 3.1.4
       is-docker: 3.0.0
@@ -3445,278 +3727,154 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/code-frame@7.24.7':
-    dependencies:
-      '@babel/highlight': 7.24.7
-      picocolors: 1.1.0
-
-  '@babel/code-frame@7.25.7':
+  '@babel/code-frame@7.26.2':
     dependencies:
-      '@babel/highlight': 7.25.7
-      picocolors: 1.1.0
-
-  '@babel/compat-data@7.25.4': {}
-
-  '@babel/compat-data@7.25.8': {}
+      '@babel/helper-validator-identifier': 7.25.9
+      js-tokens: 4.0.0
+      picocolors: 1.1.1
 
-  '@babel/core@7.25.2':
-    dependencies:
-      '@ampproject/remapping': 2.3.0
-      '@babel/code-frame': 7.24.7
-      '@babel/generator': 7.25.6
-      '@babel/helper-compilation-targets': 7.25.2
-      '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2)
-      '@babel/helpers': 7.25.6
-      '@babel/parser': 7.25.6
-      '@babel/template': 7.25.0
-      '@babel/traverse': 7.25.6
-      '@babel/types': 7.25.6
-      convert-source-map: 2.0.0
-      debug: 4.3.7
-      gensync: 1.0.0-beta.2
-      json5: 2.2.3
-      semver: 6.3.1
-    transitivePeerDependencies:
-      - supports-color
+  '@babel/compat-data@7.26.5': {}
 
-  '@babel/core@7.25.8':
+  '@babel/core@7.26.7':
     dependencies:
       '@ampproject/remapping': 2.3.0
-      '@babel/code-frame': 7.25.7
-      '@babel/generator': 7.25.7
-      '@babel/helper-compilation-targets': 7.25.7
-      '@babel/helper-module-transforms': 7.25.7(@babel/core@7.25.8)
-      '@babel/helpers': 7.25.7
-      '@babel/parser': 7.25.8
-      '@babel/template': 7.25.7
-      '@babel/traverse': 7.25.7
-      '@babel/types': 7.25.8
+      '@babel/code-frame': 7.26.2
+      '@babel/generator': 7.26.5
+      '@babel/helper-compilation-targets': 7.26.5
+      '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.7)
+      '@babel/helpers': 7.26.7
+      '@babel/parser': 7.26.7
+      '@babel/template': 7.25.9
+      '@babel/traverse': 7.26.7
+      '@babel/types': 7.26.7
       convert-source-map: 2.0.0
-      debug: 4.3.7
+      debug: 4.4.0
       gensync: 1.0.0-beta.2
       json5: 2.2.3
       semver: 6.3.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/generator@7.25.6':
-    dependencies:
-      '@babel/types': 7.25.6
-      '@jridgewell/gen-mapping': 0.3.5
-      '@jridgewell/trace-mapping': 0.3.25
-      jsesc: 2.5.2
-
-  '@babel/generator@7.25.7':
+  '@babel/generator@7.26.5':
     dependencies:
-      '@babel/types': 7.25.8
-      '@jridgewell/gen-mapping': 0.3.5
+      '@babel/parser': 7.26.7
+      '@babel/types': 7.26.7
+      '@jridgewell/gen-mapping': 0.3.8
       '@jridgewell/trace-mapping': 0.3.25
-      jsesc: 3.0.2
+      jsesc: 3.1.0
 
-  '@babel/helper-annotate-as-pure@7.25.7':
+  '@babel/helper-annotate-as-pure@7.25.9':
     dependencies:
-      '@babel/types': 7.25.8
-
-  '@babel/helper-compilation-targets@7.25.2':
-    dependencies:
-      '@babel/compat-data': 7.25.4
-      '@babel/helper-validator-option': 7.24.8
-      browserslist: 4.23.3
-      lru-cache: 5.1.1
-      semver: 6.3.1
+      '@babel/types': 7.26.7
 
-  '@babel/helper-compilation-targets@7.25.7':
+  '@babel/helper-compilation-targets@7.26.5':
     dependencies:
-      '@babel/compat-data': 7.25.8
-      '@babel/helper-validator-option': 7.25.7
-      browserslist: 4.24.0
+      '@babel/compat-data': 7.26.5
+      '@babel/helper-validator-option': 7.25.9
+      browserslist: 4.24.4
       lru-cache: 5.1.1
       semver: 6.3.1
 
-  '@babel/helper-module-imports@7.24.7':
+  '@babel/helper-module-imports@7.25.9':
     dependencies:
-      '@babel/traverse': 7.25.6
-      '@babel/types': 7.25.6
+      '@babel/traverse': 7.26.7
+      '@babel/types': 7.26.7
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/helper-module-imports@7.25.7':
+  '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.7)':
     dependencies:
-      '@babel/traverse': 7.25.7
-      '@babel/types': 7.25.8
+      '@babel/core': 7.26.7
+      '@babel/helper-module-imports': 7.25.9
+      '@babel/helper-validator-identifier': 7.25.9
+      '@babel/traverse': 7.26.7
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)':
-    dependencies:
-      '@babel/core': 7.25.2
-      '@babel/helper-module-imports': 7.24.7
-      '@babel/helper-simple-access': 7.24.7
-      '@babel/helper-validator-identifier': 7.24.7
-      '@babel/traverse': 7.25.6
-    transitivePeerDependencies:
-      - supports-color
+  '@babel/helper-plugin-utils@7.26.5': {}
 
-  '@babel/helper-module-transforms@7.25.7(@babel/core@7.25.8)':
-    dependencies:
-      '@babel/core': 7.25.8
-      '@babel/helper-module-imports': 7.25.7
-      '@babel/helper-simple-access': 7.25.7
-      '@babel/helper-validator-identifier': 7.25.7
-      '@babel/traverse': 7.25.7
-    transitivePeerDependencies:
-      - supports-color
+  '@babel/helper-string-parser@7.25.9': {}
 
-  '@babel/helper-plugin-utils@7.24.8': {}
+  '@babel/helper-validator-identifier@7.25.9': {}
 
-  '@babel/helper-plugin-utils@7.25.7': {}
+  '@babel/helper-validator-option@7.25.9': {}
 
-  '@babel/helper-simple-access@7.24.7':
+  '@babel/helpers@7.26.7':
     dependencies:
-      '@babel/traverse': 7.25.6
-      '@babel/types': 7.25.6
-    transitivePeerDependencies:
-      - supports-color
+      '@babel/template': 7.25.9
+      '@babel/types': 7.26.7
 
-  '@babel/helper-simple-access@7.25.7':
+  '@babel/parser@7.26.7':
     dependencies:
-      '@babel/traverse': 7.25.7
-      '@babel/types': 7.25.8
-    transitivePeerDependencies:
-      - supports-color
-
-  '@babel/helper-string-parser@7.24.8': {}
-
-  '@babel/helper-string-parser@7.25.7': {}
-
-  '@babel/helper-validator-identifier@7.24.7': {}
-
-  '@babel/helper-validator-identifier@7.25.7': {}
-
-  '@babel/helper-validator-option@7.24.8': {}
+      '@babel/types': 7.26.7
 
-  '@babel/helper-validator-option@7.25.7': {}
-
-  '@babel/helpers@7.25.6':
-    dependencies:
-      '@babel/template': 7.25.0
-      '@babel/types': 7.25.6
-
-  '@babel/helpers@7.25.7':
+  '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.7)':
     dependencies:
-      '@babel/template': 7.25.7
-      '@babel/types': 7.25.8
+      '@babel/core': 7.26.7
+      '@babel/helper-plugin-utils': 7.26.5
 
-  '@babel/highlight@7.24.7':
+  '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.7)':
     dependencies:
-      '@babel/helper-validator-identifier': 7.24.7
-      chalk: 2.4.2
-      js-tokens: 4.0.0
-      picocolors: 1.1.0
-
-  '@babel/highlight@7.25.7':
-    dependencies:
-      '@babel/helper-validator-identifier': 7.25.7
-      chalk: 2.4.2
-      js-tokens: 4.0.0
-      picocolors: 1.1.0
+      '@babel/core': 7.26.7
+      '@babel/helper-plugin-utils': 7.26.5
 
-  '@babel/parser@7.25.6':
+  '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.7)':
     dependencies:
-      '@babel/types': 7.25.6
+      '@babel/core': 7.26.7
+      '@babel/helper-plugin-utils': 7.26.5
 
-  '@babel/parser@7.25.8':
+  '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.7)':
     dependencies:
-      '@babel/types': 7.25.8
-
-  '@babel/plugin-syntax-jsx@7.25.7(@babel/core@7.25.8)':
-    dependencies:
-      '@babel/core': 7.25.8
-      '@babel/helper-plugin-utils': 7.25.7
-
-  '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.25.2)':
-    dependencies:
-      '@babel/core': 7.25.2
-      '@babel/helper-plugin-utils': 7.24.8
-
-  '@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.25.2)':
-    dependencies:
-      '@babel/core': 7.25.2
-      '@babel/helper-plugin-utils': 7.24.8
-
-  '@babel/plugin-transform-react-jsx@7.25.7(@babel/core@7.25.8)':
-    dependencies:
-      '@babel/core': 7.25.8
-      '@babel/helper-annotate-as-pure': 7.25.7
-      '@babel/helper-module-imports': 7.25.7
-      '@babel/helper-plugin-utils': 7.25.7
-      '@babel/plugin-syntax-jsx': 7.25.7(@babel/core@7.25.8)
-      '@babel/types': 7.25.8
+      '@babel/core': 7.26.7
+      '@babel/helper-annotate-as-pure': 7.25.9
+      '@babel/helper-module-imports': 7.25.9
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.7)
+      '@babel/types': 7.26.7
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/template@7.25.0':
+  '@babel/runtime@7.26.9':
     dependencies:
-      '@babel/code-frame': 7.24.7
-      '@babel/parser': 7.25.6
-      '@babel/types': 7.25.6
+      regenerator-runtime: 0.14.1
 
-  '@babel/template@7.25.7':
+  '@babel/template@7.25.9':
     dependencies:
-      '@babel/code-frame': 7.25.7
-      '@babel/parser': 7.25.8
-      '@babel/types': 7.25.8
+      '@babel/code-frame': 7.26.2
+      '@babel/parser': 7.26.7
+      '@babel/types': 7.26.7
 
-  '@babel/traverse@7.25.6':
+  '@babel/traverse@7.26.7':
     dependencies:
-      '@babel/code-frame': 7.24.7
-      '@babel/generator': 7.25.6
-      '@babel/parser': 7.25.6
-      '@babel/template': 7.25.0
-      '@babel/types': 7.25.6
-      debug: 4.3.7
+      '@babel/code-frame': 7.26.2
+      '@babel/generator': 7.26.5
+      '@babel/parser': 7.26.7
+      '@babel/template': 7.25.9
+      '@babel/types': 7.26.7
+      debug: 4.4.0
       globals: 11.12.0
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/traverse@7.25.7':
-    dependencies:
-      '@babel/code-frame': 7.25.7
-      '@babel/generator': 7.25.7
-      '@babel/parser': 7.25.8
-      '@babel/template': 7.25.7
-      '@babel/types': 7.25.8
-      debug: 4.3.7
-      globals: 11.12.0
-    transitivePeerDependencies:
-      - supports-color
-
-  '@babel/types@7.25.6':
-    dependencies:
-      '@babel/helper-string-parser': 7.24.8
-      '@babel/helper-validator-identifier': 7.24.7
-      to-fast-properties: 2.0.0
-
-  '@babel/types@7.25.8':
+  '@babel/types@7.26.7':
     dependencies:
-      '@babel/helper-string-parser': 7.25.7
-      '@babel/helper-validator-identifier': 7.25.7
-      to-fast-properties: 2.0.0
+      '@babel/helper-string-parser': 7.25.9
+      '@babel/helper-validator-identifier': 7.25.9
 
-  '@emnapi/core@1.2.0':
+  '@emnapi/core@1.3.1':
     dependencies:
       '@emnapi/wasi-threads': 1.0.1
-      tslib: 2.7.0
+      tslib: 2.8.1
     optional: true
 
-  '@emnapi/runtime@1.2.0':
+  '@emnapi/runtime@1.3.1':
     dependencies:
-      tslib: 2.7.0
+      tslib: 2.8.1
     optional: true
 
   '@emnapi/wasi-threads@1.0.1':
     dependencies:
-      tslib: 2.7.0
+      tslib: 2.8.1
     optional: true
 
   '@esbuild/aix-ppc64@0.21.5':
@@ -3860,20 +4018,20 @@ snapshots:
   '@esbuild/win32-x64@0.23.1':
     optional: true
 
-  '@fingerprintjs/fingerprintjs@4.5.0':
+  '@fingerprintjs/fingerprintjs@4.5.1':
     dependencies:
-      tslib: 2.7.0
+      tslib: 2.8.1
 
-  '@floating-ui/core@1.6.8':
+  '@floating-ui/core@1.6.9':
     dependencies:
-      '@floating-ui/utils': 0.2.8
+      '@floating-ui/utils': 0.2.9
 
-  '@floating-ui/dom@1.6.11':
+  '@floating-ui/dom@1.6.13':
     dependencies:
-      '@floating-ui/core': 1.6.8
-      '@floating-ui/utils': 0.2.8
+      '@floating-ui/core': 1.6.9
+      '@floating-ui/utils': 0.2.9
 
-  '@floating-ui/utils@0.2.8': {}
+  '@floating-ui/utils@0.2.9': {}
 
   '@img/sharp-darwin-arm64@0.33.5':
     optionalDependencies:
@@ -3941,7 +4099,7 @@ snapshots:
 
   '@img/sharp-wasm32@0.33.5':
     dependencies:
-      '@emnapi/runtime': 1.2.0
+      '@emnapi/runtime': 1.3.1
     optional: true
 
   '@img/sharp-win32-ia32@0.33.5':
@@ -3959,7 +4117,7 @@ snapshots:
       wrap-ansi: 8.1.0
       wrap-ansi-cjs: wrap-ansi@7.0.0
 
-  '@jridgewell/gen-mapping@0.3.5':
+  '@jridgewell/gen-mapping@0.3.8':
     dependencies:
       '@jridgewell/set-array': 1.2.1
       '@jridgewell/sourcemap-codec': 1.5.0
@@ -3976,9 +4134,11 @@ snapshots:
       '@jridgewell/resolve-uri': 3.1.2
       '@jridgewell/sourcemap-codec': 1.5.0
 
+  '@microsoft/clarity@1.0.0': {}
+
   '@mixmark-io/domino@2.2.0': {}
 
-  '@nanostores/react@0.8.0(nanostores@0.11.3)(react@18.3.1)':
+  '@nanostores/react@0.8.4(nanostores@0.11.3)(react@18.3.1)':
     dependencies:
       nanostores: 0.11.3
       react: 18.3.1
@@ -4012,7 +4172,7 @@ snapshots:
 
   '@napi-rs/image-wasm32-wasi@1.9.2':
     dependencies:
-      '@napi-rs/wasm-runtime': 0.2.4
+      '@napi-rs/wasm-runtime': 0.2.6
     optional: true
 
   '@napi-rs/image-win32-ia32-msvc@1.9.2':
@@ -4036,10 +4196,10 @@ snapshots:
       '@napi-rs/image-win32-ia32-msvc': 1.9.2
       '@napi-rs/image-win32-x64-msvc': 1.9.2
 
-  '@napi-rs/wasm-runtime@0.2.4':
+  '@napi-rs/wasm-runtime@0.2.6':
     dependencies:
-      '@emnapi/core': 1.2.0
-      '@emnapi/runtime': 1.2.0
+      '@emnapi/core': 1.3.1
+      '@emnapi/runtime': 1.3.1
       '@tybys/wasm-util': 0.9.0
     optional: true
 
@@ -4053,44 +4213,46 @@ snapshots:
   '@nodelib/fs.walk@1.2.8':
     dependencies:
       '@nodelib/fs.scandir': 2.1.5
-      fastq: 1.17.1
+      fastq: 1.18.0
+
+  '@opentelemetry/api@1.9.0': {}
 
   '@oslojs/encoding@1.1.0': {}
 
   '@pkgjs/parseargs@0.11.0':
     optional: true
 
-  '@playwright/test@1.48.0':
+  '@playwright/test@1.50.0':
     dependencies:
-      playwright: 1.48.0
+      playwright: 1.50.0
 
-  '@reactflow/background@11.3.14(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+  '@reactflow/background@11.3.14(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
-      '@reactflow/core': 11.11.4(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@reactflow/core': 11.11.4(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       classcat: 5.0.5
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
-      zustand: 4.5.5(@types/react@18.3.11)(react@18.3.1)
+      zustand: 4.5.6(@types/react@18.3.18)(react@18.3.1)
     transitivePeerDependencies:
       - '@types/react'
       - immer
 
-  '@reactflow/controls@11.2.14(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+  '@reactflow/controls@11.2.14(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
-      '@reactflow/core': 11.11.4(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@reactflow/core': 11.11.4(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       classcat: 5.0.5
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
-      zustand: 4.5.5(@types/react@18.3.11)(react@18.3.1)
+      zustand: 4.5.6(@types/react@18.3.18)(react@18.3.1)
     transitivePeerDependencies:
       - '@types/react'
       - immer
 
-  '@reactflow/core@11.11.4(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+  '@reactflow/core@11.11.4(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
       '@types/d3': 7.4.3
       '@types/d3-drag': 3.0.7
-      '@types/d3-selection': 3.0.10
+      '@types/d3-selection': 3.0.11
       '@types/d3-zoom': 3.0.8
       classcat: 5.0.5
       d3-drag: 3.0.0
@@ -4098,50 +4260,52 @@ snapshots:
       d3-zoom: 3.0.0
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
-      zustand: 4.5.5(@types/react@18.3.11)(react@18.3.1)
+      zustand: 4.5.6(@types/react@18.3.18)(react@18.3.1)
     transitivePeerDependencies:
       - '@types/react'
       - immer
 
-  '@reactflow/minimap@11.7.14(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+  '@reactflow/minimap@11.7.14(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
-      '@reactflow/core': 11.11.4(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@types/d3-selection': 3.0.10
+      '@reactflow/core': 11.11.4(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@types/d3-selection': 3.0.11
       '@types/d3-zoom': 3.0.8
       classcat: 5.0.5
       d3-selection: 3.0.0
       d3-zoom: 3.0.0
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
-      zustand: 4.5.5(@types/react@18.3.11)(react@18.3.1)
+      zustand: 4.5.6(@types/react@18.3.18)(react@18.3.1)
     transitivePeerDependencies:
       - '@types/react'
       - immer
 
-  '@reactflow/node-resizer@2.2.14(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+  '@reactflow/node-resizer@2.2.14(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
-      '@reactflow/core': 11.11.4(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@reactflow/core': 11.11.4(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       classcat: 5.0.5
       d3-drag: 3.0.0
       d3-selection: 3.0.0
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
-      zustand: 4.5.5(@types/react@18.3.11)(react@18.3.1)
+      zustand: 4.5.6(@types/react@18.3.18)(react@18.3.1)
     transitivePeerDependencies:
       - '@types/react'
       - immer
 
-  '@reactflow/node-toolbar@1.3.14(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+  '@reactflow/node-toolbar@1.3.14(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
-      '@reactflow/core': 11.11.4(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@reactflow/core': 11.11.4(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       classcat: 5.0.5
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
-      zustand: 4.5.5(@types/react@18.3.11)(react@18.3.1)
+      zustand: 4.5.6(@types/react@18.3.18)(react@18.3.1)
     transitivePeerDependencies:
       - '@types/react'
       - immer
 
+  '@remirror/core-constants@3.0.0': {}
+
   '@resvg/resvg-js-android-arm-eabi@2.6.2':
     optional: true
 
@@ -4193,134 +4357,209 @@ snapshots:
       '@resvg/resvg-js-win32-ia32-msvc': 2.6.2
       '@resvg/resvg-js-win32-x64-msvc': 2.6.2
 
-  '@rollup/pluginutils@5.1.2(rollup@4.22.4)':
+  '@rollup/pluginutils@5.1.4(rollup@4.32.0)':
     dependencies:
       '@types/estree': 1.0.6
       estree-walker: 2.0.2
-      picomatch: 2.3.1
+      picomatch: 4.0.2
     optionalDependencies:
-      rollup: 4.22.4
+      rollup: 4.32.0
+
+  '@rollup/rollup-android-arm-eabi@4.32.0':
+    optional: true
 
-  '@rollup/rollup-android-arm-eabi@4.22.4':
+  '@rollup/rollup-android-arm64@4.32.0':
     optional: true
 
-  '@rollup/rollup-android-arm64@4.22.4':
+  '@rollup/rollup-darwin-arm64@4.32.0':
     optional: true
 
-  '@rollup/rollup-darwin-arm64@4.22.4':
+  '@rollup/rollup-darwin-x64@4.32.0':
     optional: true
 
-  '@rollup/rollup-darwin-x64@4.22.4':
+  '@rollup/rollup-freebsd-arm64@4.32.0':
     optional: true
 
-  '@rollup/rollup-linux-arm-gnueabihf@4.22.4':
+  '@rollup/rollup-freebsd-x64@4.32.0':
     optional: true
 
-  '@rollup/rollup-linux-arm-musleabihf@4.22.4':
+  '@rollup/rollup-linux-arm-gnueabihf@4.32.0':
     optional: true
 
-  '@rollup/rollup-linux-arm64-gnu@4.22.4':
+  '@rollup/rollup-linux-arm-musleabihf@4.32.0':
     optional: true
 
-  '@rollup/rollup-linux-arm64-musl@4.22.4':
+  '@rollup/rollup-linux-arm64-gnu@4.32.0':
     optional: true
 
-  '@rollup/rollup-linux-powerpc64le-gnu@4.22.4':
+  '@rollup/rollup-linux-arm64-musl@4.32.0':
     optional: true
 
-  '@rollup/rollup-linux-riscv64-gnu@4.22.4':
+  '@rollup/rollup-linux-loongarch64-gnu@4.32.0':
     optional: true
 
-  '@rollup/rollup-linux-s390x-gnu@4.22.4':
+  '@rollup/rollup-linux-powerpc64le-gnu@4.32.0':
     optional: true
 
-  '@rollup/rollup-linux-x64-gnu@4.22.4':
+  '@rollup/rollup-linux-riscv64-gnu@4.32.0':
     optional: true
 
-  '@rollup/rollup-linux-x64-musl@4.22.4':
+  '@rollup/rollup-linux-s390x-gnu@4.32.0':
     optional: true
 
-  '@rollup/rollup-win32-arm64-msvc@4.22.4':
+  '@rollup/rollup-linux-x64-gnu@4.32.0':
     optional: true
 
-  '@rollup/rollup-win32-ia32-msvc@4.22.4':
+  '@rollup/rollup-linux-x64-musl@4.32.0':
     optional: true
 
-  '@rollup/rollup-win32-x64-msvc@4.22.4':
+  '@rollup/rollup-win32-arm64-msvc@4.32.0':
     optional: true
 
-  '@shikijs/core@1.22.0':
+  '@rollup/rollup-win32-ia32-msvc@4.32.0':
+    optional: true
+
+  '@rollup/rollup-win32-x64-msvc@4.32.0':
+    optional: true
+
+  '@shikijs/core@1.29.1':
     dependencies:
-      '@shikijs/engine-javascript': 1.22.0
-      '@shikijs/engine-oniguruma': 1.22.0
-      '@shikijs/types': 1.22.0
-      '@shikijs/vscode-textmate': 9.3.0
+      '@shikijs/engine-javascript': 1.29.1
+      '@shikijs/engine-oniguruma': 1.29.1
+      '@shikijs/types': 1.29.1
+      '@shikijs/vscode-textmate': 10.0.1
       '@types/hast': 3.0.4
-      hast-util-to-html: 9.0.3
+      hast-util-to-html: 9.0.4
+
+  '@shikijs/core@3.1.0':
+    dependencies:
+      '@shikijs/types': 3.1.0
+      '@shikijs/vscode-textmate': 10.0.2
+      '@types/hast': 3.0.4
+      hast-util-to-html: 9.0.5
+
+  '@shikijs/engine-javascript@1.29.1':
+    dependencies:
+      '@shikijs/types': 1.29.1
+      '@shikijs/vscode-textmate': 10.0.1
+      oniguruma-to-es: 2.3.0
+
+  '@shikijs/engine-javascript@3.1.0':
+    dependencies:
+      '@shikijs/types': 3.1.0
+      '@shikijs/vscode-textmate': 10.0.2
+      oniguruma-to-es: 3.1.1
+
+  '@shikijs/engine-oniguruma@1.29.1':
+    dependencies:
+      '@shikijs/types': 1.29.1
+      '@shikijs/vscode-textmate': 10.0.1
+
+  '@shikijs/engine-oniguruma@3.1.0':
+    dependencies:
+      '@shikijs/types': 3.1.0
+      '@shikijs/vscode-textmate': 10.0.2
 
-  '@shikijs/engine-javascript@1.22.0':
+  '@shikijs/langs@1.29.1':
     dependencies:
-      '@shikijs/types': 1.22.0
-      '@shikijs/vscode-textmate': 9.3.0
-      oniguruma-to-js: 0.4.3
+      '@shikijs/types': 1.29.1
 
-  '@shikijs/engine-oniguruma@1.22.0':
+  '@shikijs/langs@3.1.0':
     dependencies:
-      '@shikijs/types': 1.22.0
-      '@shikijs/vscode-textmate': 9.3.0
+      '@shikijs/types': 3.1.0
 
-  '@shikijs/types@1.22.0':
+  '@shikijs/themes@1.29.1':
     dependencies:
-      '@shikijs/vscode-textmate': 9.3.0
+      '@shikijs/types': 1.29.1
+
+  '@shikijs/themes@3.1.0':
+    dependencies:
+      '@shikijs/types': 3.1.0
+
+  '@shikijs/types@1.29.1':
+    dependencies:
+      '@shikijs/vscode-textmate': 10.0.1
       '@types/hast': 3.0.4
 
-  '@shikijs/vscode-textmate@9.3.0': {}
+  '@shikijs/types@3.1.0':
+    dependencies:
+      '@shikijs/vscode-textmate': 10.0.2
+      '@types/hast': 3.0.4
+
+  '@shikijs/vscode-textmate@10.0.1': {}
+
+  '@shikijs/vscode-textmate@10.0.2': {}
 
   '@shuding/opentype.js@1.4.0-beta.0':
     dependencies:
       fflate: 0.7.4
       string.prototype.codepointat: 0.2.1
 
-  '@tailwindcss/typography@0.5.15(tailwindcss@3.4.13)':
+  '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17)':
     dependencies:
       lodash.castarray: 4.4.0
       lodash.isplainobject: 4.0.6
       lodash.merge: 4.6.2
       postcss-selector-parser: 6.0.10
-      tailwindcss: 3.4.13
+      tailwindcss: 3.4.17
 
-  '@tanstack/query-core@5.59.16': {}
+  '@tanstack/query-core@5.64.2': {}
 
-  '@tanstack/react-query@5.59.16(react@18.3.1)':
+  '@tanstack/react-query@5.64.2(react@18.3.1)':
     dependencies:
-      '@tanstack/query-core': 5.59.16
+      '@tanstack/query-core': 5.64.2
       react: 18.3.1
 
+  '@tiptap/core@2.11.3(@tiptap/pm@2.11.3)':
+    dependencies:
+      '@tiptap/pm': 2.11.3
+
+  '@tiptap/pm@2.11.3':
+    dependencies:
+      prosemirror-changeset: 2.2.1
+      prosemirror-collab: 1.3.1
+      prosemirror-commands: 1.6.2
+      prosemirror-dropcursor: 1.8.1
+      prosemirror-gapcursor: 1.3.2
+      prosemirror-history: 1.4.1
+      prosemirror-inputrules: 1.4.0
+      prosemirror-keymap: 1.2.2
+      prosemirror-markdown: 1.13.1
+      prosemirror-menu: 1.2.4
+      prosemirror-model: 1.24.1
+      prosemirror-schema-basic: 1.2.3
+      prosemirror-schema-list: 1.5.0
+      prosemirror-state: 1.4.3
+      prosemirror-tables: 1.6.2
+      prosemirror-trailing-node: 3.0.0(prosemirror-model@1.24.1)(prosemirror-state@1.4.3)(prosemirror-view@1.37.2)
+      prosemirror-transform: 1.10.2
+      prosemirror-view: 1.37.2
+
   '@tybys/wasm-util@0.9.0':
     dependencies:
-      tslib: 2.7.0
+      tslib: 2.8.1
     optional: true
 
   '@types/babel__core@7.20.5':
     dependencies:
-      '@babel/parser': 7.25.6
-      '@babel/types': 7.25.6
+      '@babel/parser': 7.26.7
+      '@babel/types': 7.26.7
       '@types/babel__generator': 7.6.8
       '@types/babel__template': 7.4.4
       '@types/babel__traverse': 7.20.6
 
   '@types/babel__generator@7.6.8':
     dependencies:
-      '@babel/types': 7.25.6
+      '@babel/types': 7.26.7
 
   '@types/babel__template@7.4.4':
     dependencies:
-      '@babel/parser': 7.25.6
-      '@babel/types': 7.25.6
+      '@babel/parser': 7.26.7
+      '@babel/types': 7.26.7
 
   '@types/babel__traverse@7.20.6':
     dependencies:
-      '@babel/types': 7.25.6
+      '@babel/types': 7.26.7
 
   '@types/cookie@0.6.0': {}
 
@@ -4328,11 +4567,11 @@ snapshots:
 
   '@types/d3-axis@3.0.6':
     dependencies:
-      '@types/d3-selection': 3.0.10
+      '@types/d3-selection': 3.0.11
 
   '@types/d3-brush@3.0.6':
     dependencies:
-      '@types/d3-selection': 3.0.10
+      '@types/d3-selection': 3.0.11
 
   '@types/d3-chord@3.0.6': {}
 
@@ -4341,7 +4580,7 @@ snapshots:
   '@types/d3-contour@3.0.6':
     dependencies:
       '@types/d3-array': 3.2.1
-      '@types/geojson': 7946.0.14
+      '@types/geojson': 7946.0.16
 
   '@types/d3-delaunay@6.0.4': {}
 
@@ -4349,7 +4588,7 @@ snapshots:
 
   '@types/d3-drag@3.0.7':
     dependencies:
-      '@types/d3-selection': 3.0.10
+      '@types/d3-selection': 3.0.11
 
   '@types/d3-dsv@3.0.7': {}
 
@@ -4365,7 +4604,7 @@ snapshots:
 
   '@types/d3-geo@3.1.0':
     dependencies:
-      '@types/geojson': 7946.0.14
+      '@types/geojson': 7946.0.16
 
   '@types/d3-hierarchy@3.1.7': {}
 
@@ -4381,32 +4620,32 @@ snapshots:
 
   '@types/d3-random@3.0.3': {}
 
-  '@types/d3-scale-chromatic@3.0.3': {}
+  '@types/d3-scale-chromatic@3.1.0': {}
 
   '@types/d3-scale@4.0.8':
     dependencies:
-      '@types/d3-time': 3.0.3
+      '@types/d3-time': 3.0.4
 
-  '@types/d3-selection@3.0.10': {}
+  '@types/d3-selection@3.0.11': {}
 
-  '@types/d3-shape@3.1.6':
+  '@types/d3-shape@3.1.7':
     dependencies:
       '@types/d3-path': 3.1.0
 
   '@types/d3-time-format@4.0.3': {}
 
-  '@types/d3-time@3.0.3': {}
+  '@types/d3-time@3.0.4': {}
 
   '@types/d3-timer@3.0.2': {}
 
-  '@types/d3-transition@3.0.8':
+  '@types/d3-transition@3.0.9':
     dependencies:
-      '@types/d3-selection': 3.0.10
+      '@types/d3-selection': 3.0.11
 
   '@types/d3-zoom@3.0.8':
     dependencies:
       '@types/d3-interpolate': 3.0.4
-      '@types/d3-selection': 3.0.10
+      '@types/d3-selection': 3.0.11
 
   '@types/d3@7.4.3':
     dependencies:
@@ -4432,26 +4671,26 @@ snapshots:
       '@types/d3-quadtree': 3.0.6
       '@types/d3-random': 3.0.3
       '@types/d3-scale': 4.0.8
-      '@types/d3-scale-chromatic': 3.0.3
-      '@types/d3-selection': 3.0.10
-      '@types/d3-shape': 3.1.6
-      '@types/d3-time': 3.0.3
+      '@types/d3-scale-chromatic': 3.1.0
+      '@types/d3-selection': 3.0.11
+      '@types/d3-shape': 3.1.7
+      '@types/d3-time': 3.0.4
       '@types/d3-time-format': 4.0.3
       '@types/d3-timer': 3.0.2
-      '@types/d3-transition': 3.0.8
+      '@types/d3-transition': 3.0.9
       '@types/d3-zoom': 3.0.8
 
   '@types/debug@4.1.12':
     dependencies:
-      '@types/ms': 0.7.34
+      '@types/ms': 2.1.0
 
-  '@types/dom-to-image@2.6.7': {}
+  '@types/diff-match-patch@1.0.36': {}
 
-  '@types/estree@1.0.5': {}
+  '@types/dom-to-image@2.6.7': {}
 
   '@types/estree@1.0.6': {}
 
-  '@types/geojson@7946.0.14': {}
+  '@types/geojson@7946.0.16': {}
 
   '@types/hast@3.0.4':
     dependencies:
@@ -4459,68 +4698,90 @@ snapshots:
 
   '@types/js-cookie@3.0.6': {}
 
+  '@types/linkify-it@3.0.5': {}
+
+  '@types/linkify-it@5.0.0': {}
+
   '@types/luxon@3.4.2': {}
 
+  '@types/markdown-it@13.0.9':
+    dependencies:
+      '@types/linkify-it': 3.0.5
+      '@types/mdurl': 1.0.5
+
+  '@types/markdown-it@14.1.2':
+    dependencies:
+      '@types/linkify-it': 5.0.0
+      '@types/mdurl': 2.0.0
+
   '@types/mdast@4.0.4':
     dependencies:
       '@types/unist': 3.0.3
 
-  '@types/ms@0.7.34': {}
+  '@types/mdurl@1.0.5': {}
+
+  '@types/mdurl@2.0.0': {}
+
+  '@types/ms@2.1.0': {}
 
   '@types/nlcst@2.0.3':
     dependencies:
       '@types/unist': 3.0.3
 
-  '@types/node-fetch@2.6.11':
+  '@types/node-fetch@2.6.12':
     dependencies:
-      '@types/node': 18.19.50
-      form-data: 4.0.0
+      '@types/node': 18.19.74
+      form-data: 4.0.1
 
   '@types/node@17.0.45': {}
 
-  '@types/node@18.19.50':
+  '@types/node@18.19.74':
     dependencies:
       undici-types: 5.26.5
 
-  '@types/prismjs@1.26.4': {}
+  '@types/prismjs@1.26.5': {}
 
-  '@types/prop-types@15.7.13': {}
+  '@types/prop-types@15.7.14': {}
 
-  '@types/react-calendar-heatmap@1.6.7':
+  '@types/react-calendar-heatmap@1.9.0':
     dependencies:
-      '@types/react': 18.3.11
+      '@types/react': 18.3.18
 
-  '@types/react-dom@18.3.1':
+  '@types/react-dom@18.3.5(@types/react@18.3.18)':
     dependencies:
-      '@types/react': 18.3.11
+      '@types/react': 18.3.18
 
   '@types/react-slick@0.23.13':
     dependencies:
-      '@types/react': 18.3.11
+      '@types/react': 18.3.18
 
-  '@types/react@18.3.11':
+  '@types/react@18.3.18':
     dependencies:
-      '@types/prop-types': 15.7.13
+      '@types/prop-types': 15.7.14
       csstype: 3.1.3
 
+  '@types/sanitize-html@2.13.0':
+    dependencies:
+      htmlparser2: 8.0.2
+
   '@types/sax@1.2.7':
     dependencies:
-      '@types/node': 18.19.50
+      '@types/node': 17.0.45
 
   '@types/turndown@5.0.5': {}
 
   '@types/unist@3.0.3': {}
 
-  '@ungap/structured-clone@1.2.0': {}
+  '@ungap/structured-clone@1.3.0': {}
 
-  '@vitejs/plugin-react@4.3.1(vite@5.4.8(@types/node@18.19.50))':
+  '@vitejs/plugin-react@4.3.4(vite@5.4.14(@types/node@18.19.74))':
     dependencies:
-      '@babel/core': 7.25.2
-      '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2)
-      '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2)
+      '@babel/core': 7.26.7
+      '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.7)
+      '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.7)
       '@types/babel__core': 7.20.5
       react-refresh: 0.14.2
-      vite: 5.4.8(@types/node@18.19.50)
+      vite: 5.4.14(@types/node@18.19.74)
     transitivePeerDependencies:
       - supports-color
 
@@ -4528,12 +4789,24 @@ snapshots:
     dependencies:
       event-target-shim: 5.0.1
 
-  acorn@8.12.1: {}
+  acorn@8.14.0: {}
 
-  agentkeepalive@4.5.0:
+  agentkeepalive@4.6.0:
     dependencies:
       humanize-ms: 1.2.1
 
+  ai@4.1.51(react@18.3.1)(zod@3.24.1):
+    dependencies:
+      '@ai-sdk/provider': 1.0.9
+      '@ai-sdk/provider-utils': 2.1.10(zod@3.24.1)
+      '@ai-sdk/react': 1.1.20(react@18.3.1)(zod@3.24.1)
+      '@ai-sdk/ui-utils': 1.1.16(zod@3.24.1)
+      '@opentelemetry/api': 1.9.0
+      jsondiffpatch: 0.6.0
+    optionalDependencies:
+      react: 18.3.1
+      zod: 3.24.1
+
   ansi-align@3.0.1:
     dependencies:
       string-width: 4.2.3
@@ -4542,10 +4815,6 @@ snapshots:
 
   ansi-regex@6.1.0: {}
 
-  ansi-styles@3.2.1:
-    dependencies:
-      color-convert: 1.9.3
-
   ansi-styles@4.3.0:
     dependencies:
       color-convert: 2.0.1
@@ -4573,38 +4842,38 @@ snapshots:
 
   array-union@2.1.0: {}
 
-  astro@4.16.1(@types/node@18.19.50)(rollup@4.22.4)(typescript@5.6.2):
+  astro@4.16.18(@types/node@18.19.74)(rollup@4.32.0)(typescript@5.7.3):
     dependencies:
       '@astrojs/compiler': 2.10.3
       '@astrojs/internal-helpers': 0.4.1
       '@astrojs/markdown-remark': 5.3.0
       '@astrojs/telemetry': 3.1.0
-      '@babel/core': 7.25.8
-      '@babel/plugin-transform-react-jsx': 7.25.7(@babel/core@7.25.8)
-      '@babel/types': 7.25.8
+      '@babel/core': 7.26.7
+      '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.7)
+      '@babel/types': 7.26.7
       '@oslojs/encoding': 1.1.0
-      '@rollup/pluginutils': 5.1.2(rollup@4.22.4)
+      '@rollup/pluginutils': 5.1.4(rollup@4.32.0)
       '@types/babel__core': 7.20.5
       '@types/cookie': 0.6.0
-      acorn: 8.12.1
+      acorn: 8.14.0
       aria-query: 5.3.2
       axobject-query: 4.1.0
       boxen: 8.0.1
-      ci-info: 4.0.0
+      ci-info: 4.1.0
       clsx: 2.1.1
       common-ancestor-path: 1.0.1
       cookie: 0.7.2
       cssesc: 3.0.0
-      debug: 4.3.7
+      debug: 4.4.0
       deterministic-object-hash: 2.0.2
       devalue: 5.1.1
       diff: 5.2.0
       dlv: 1.1.3
       dset: 3.1.4
-      es-module-lexer: 1.5.4
+      es-module-lexer: 1.6.0
       esbuild: 0.21.5
       estree-walker: 3.0.3
-      fast-glob: 3.3.2
+      fast-glob: 3.3.3
       flattie: 1.1.1
       github-slugger: 2.0.0
       gray-matter: 4.0.3
@@ -4612,31 +4881,31 @@ snapshots:
       http-cache-semantics: 4.1.1
       js-yaml: 4.1.0
       kleur: 4.1.5
-      magic-string: 0.30.11
+      magic-string: 0.30.17
       magicast: 0.3.5
       micromatch: 4.0.8
       mrmime: 2.0.0
       neotraverse: 0.6.18
-      ora: 8.1.0
-      p-limit: 6.1.0
-      p-queue: 8.0.1
+      ora: 8.1.1
+      p-limit: 6.2.0
+      p-queue: 8.1.0
       preferred-pm: 4.0.0
       prompts: 2.4.2
       rehype: 13.0.2
       semver: 7.6.3
-      shiki: 1.22.0
-      tinyexec: 0.3.0
-      tsconfck: 3.1.3(typescript@5.6.2)
+      shiki: 1.29.1
+      tinyexec: 0.3.2
+      tsconfck: 3.1.4(typescript@5.7.3)
       unist-util-visit: 5.0.0
       vfile: 6.0.3
-      vite: 5.4.8(@types/node@18.19.50)
-      vitefu: 1.0.2(vite@5.4.8(@types/node@18.19.50))
+      vite: 5.4.14(@types/node@18.19.74)
+      vitefu: 1.0.5(vite@5.4.14(@types/node@18.19.74))
       which-pm: 3.0.0
-      xxhash-wasm: 1.0.2
+      xxhash-wasm: 1.1.0
       yargs-parser: 21.1.1
-      zod: 3.23.8
-      zod-to-json-schema: 3.23.3(zod@3.23.8)
-      zod-to-ts: 1.2.0(typescript@5.6.2)(zod@3.23.8)
+      zod: 3.24.1
+      zod-to-json-schema: 3.24.1(zod@3.24.1)
+      zod-to-ts: 1.2.0(typescript@5.7.3)(zod@3.24.1)
     optionalDependencies:
       sharp: 0.33.5
     transitivePeerDependencies:
@@ -4656,14 +4925,14 @@ snapshots:
 
   asynckit@0.4.0: {}
 
-  autoprefixer@10.4.20(postcss@8.4.47):
+  autoprefixer@10.4.20(postcss@8.5.1):
     dependencies:
-      browserslist: 4.24.0
-      caniuse-lite: 1.0.30001663
+      browserslist: 4.24.4
+      caniuse-lite: 1.0.30001695
       fraction.js: 4.3.7
       normalize-range: 0.1.2
-      picocolors: 1.1.0
-      postcss: 8.4.47
+      picocolors: 1.1.1
+      postcss: 8.5.1
       postcss-value-parser: 4.2.0
 
   axobject-query@4.1.0: {}
@@ -4684,10 +4953,10 @@ snapshots:
     dependencies:
       ansi-align: 3.0.1
       camelcase: 8.0.0
-      chalk: 5.3.0
+      chalk: 5.4.1
       cli-boxes: 3.0.0
       string-width: 7.2.0
-      type-fest: 4.26.1
+      type-fest: 4.33.0
       widest-line: 5.0.0
       wrap-ansi: 9.0.0
 
@@ -4699,19 +4968,12 @@ snapshots:
     dependencies:
       fill-range: 7.1.1
 
-  browserslist@4.23.3:
-    dependencies:
-      caniuse-lite: 1.0.30001663
-      electron-to-chromium: 1.5.27
-      node-releases: 2.0.18
-      update-browserslist-db: 1.1.0(browserslist@4.23.3)
-
-  browserslist@4.24.0:
+  browserslist@4.24.4:
     dependencies:
-      caniuse-lite: 1.0.30001663
-      electron-to-chromium: 1.5.36
-      node-releases: 2.0.18
-      update-browserslist-db: 1.1.0(browserslist@4.24.0)
+      caniuse-lite: 1.0.30001695
+      electron-to-chromium: 1.5.88
+      node-releases: 2.0.19
+      update-browserslist-db: 1.1.2(browserslist@4.24.4)
 
   camelcase-css@2.0.1: {}
 
@@ -4719,17 +4981,11 @@ snapshots:
 
   camelize@1.0.1: {}
 
-  caniuse-lite@1.0.30001663: {}
+  caniuse-lite@1.0.30001695: {}
 
   ccount@2.0.1: {}
 
-  chalk@2.4.2:
-    dependencies:
-      ansi-styles: 3.2.1
-      escape-string-regexp: 1.0.5
-      supports-color: 5.5.0
-
-  chalk@5.3.0: {}
+  chalk@5.4.1: {}
 
   character-entities-html4@2.1.0: {}
 
@@ -4749,7 +5005,7 @@ snapshots:
     optionalDependencies:
       fsevents: 2.3.3
 
-  ci-info@4.0.0: {}
+  ci-info@4.1.0: {}
 
   classcat@5.0.5: {}
 
@@ -4765,16 +5021,10 @@ snapshots:
 
   clsx@2.1.1: {}
 
-  color-convert@1.9.3:
-    dependencies:
-      color-name: 1.1.3
-
   color-convert@2.0.1:
     dependencies:
       color-name: 1.1.4
 
-  color-name@1.1.3: {}
-
   color-name@1.1.4: {}
 
   color-string@1.9.1:
@@ -4793,7 +5043,7 @@ snapshots:
 
   comma-separated-tokens@2.0.3: {}
 
-  commander@11.1.0: {}
+  commander@13.1.0: {}
 
   commander@4.1.1: {}
 
@@ -4805,7 +5055,9 @@ snapshots:
 
   cookie@0.7.2: {}
 
-  cross-spawn@7.0.3:
+  crelt@1.0.6: {}
+
+  cross-spawn@7.0.6:
     dependencies:
       path-key: 3.1.1
       shebang-command: 2.0.0
@@ -4824,7 +5076,7 @@ snapshots:
       boolbase: 1.0.0
       css-what: 6.1.0
       domhandler: 5.0.3
-      domutils: 3.1.0
+      domutils: 3.2.2
       nth-check: 2.1.1
 
   css-to-react-native@3.2.0:
@@ -4839,9 +5091,7 @@ snapshots:
 
   csstype@3.1.3: {}
 
-  csv-parser@3.0.0:
-    dependencies:
-      minimist: 1.2.8
+  csv-parser@3.1.0: {}
 
   d3-color@3.1.0: {}
 
@@ -4885,7 +5135,7 @@ snapshots:
     dependencies:
       ms: 2.0.0
 
-  debug@4.3.7:
+  debug@4.4.0:
     dependencies:
       ms: 2.1.3
 
@@ -4893,6 +5143,8 @@ snapshots:
     dependencies:
       character-entities: 2.0.2
 
+  deepmerge@4.3.1: {}
+
   delayed-stream@1.0.0: {}
 
   depd@2.0.0: {}
@@ -4915,6 +5167,8 @@ snapshots:
 
   didyoumean@1.2.2: {}
 
+  diff-match-patch@1.0.5: {}
+
   diff@5.2.0: {}
 
   dir-glob@3.0.1:
@@ -4937,7 +5191,7 @@ snapshots:
     dependencies:
       domelementtype: 2.3.0
 
-  domutils@3.1.0:
+  domutils@3.2.2:
     dependencies:
       dom-serializer: 2.0.0
       domelementtype: 2.3.0
@@ -4951,23 +5205,23 @@ snapshots:
 
   ee-first@1.1.1: {}
 
-  electron-to-chromium@1.5.27: {}
-
-  electron-to-chromium@1.5.36: {}
+  electron-to-chromium@1.5.88: {}
 
   email-addresses@5.0.0: {}
 
+  emoji-regex-xs@1.0.0: {}
+
   emoji-regex@10.4.0: {}
 
   emoji-regex@8.0.0: {}
 
   emoji-regex@9.2.2: {}
 
-  encodeurl@1.0.2: {}
+  encodeurl@2.0.0: {}
 
   entities@4.5.0: {}
 
-  es-module-lexer@1.5.4: {}
+  es-module-lexer@1.6.0: {}
 
   esbuild@0.21.5:
     optionalDependencies:
@@ -5028,6 +5282,8 @@ snapshots:
 
   escape-string-regexp@1.0.5: {}
 
+  escape-string-regexp@4.0.0: {}
+
   escape-string-regexp@5.0.0: {}
 
   esprima@4.0.1: {}
@@ -5044,13 +5300,15 @@ snapshots:
 
   eventemitter3@5.0.1: {}
 
+  eventsource-parser@3.0.0: {}
+
   extend-shallow@2.0.1:
     dependencies:
       is-extendable: 0.1.1
 
   extend@3.0.2: {}
 
-  fast-glob@3.3.2:
+  fast-glob@3.3.3:
     dependencies:
       '@nodelib/fs.stat': 2.0.5
       '@nodelib/fs.walk': 1.2.8
@@ -5058,7 +5316,7 @@ snapshots:
       merge2: 1.4.1
       micromatch: 4.0.8
 
-  fastq@1.17.1:
+  fastq@1.18.0:
     dependencies:
       reusify: 1.0.4
 
@@ -5098,12 +5356,12 @@ snapshots:
 
   foreground-child@3.3.0:
     dependencies:
-      cross-spawn: 7.0.3
+      cross-spawn: 7.0.6
       signal-exit: 4.1.0
 
   form-data-encoder@1.7.2: {}
 
-  form-data@4.0.0:
+  form-data@4.0.1:
     dependencies:
       asynckit: 0.4.0
       combined-stream: 1.0.8
@@ -5118,7 +5376,7 @@ snapshots:
 
   fresh@0.5.2: {}
 
-  fs-extra@11.2.0:
+  fs-extra@11.3.0:
     dependencies:
       graceful-fs: 4.2.11
       jsonfile: 6.1.0
@@ -5134,20 +5392,20 @@ snapshots:
 
   gensync@1.0.0-beta.2: {}
 
-  get-east-asian-width@1.2.0: {}
+  get-east-asian-width@1.3.0: {}
 
-  get-tsconfig@4.8.1:
+  get-tsconfig@4.10.0:
     dependencies:
       resolve-pkg-maps: 1.0.0
 
-  gh-pages@6.2.0:
+  gh-pages@6.3.0:
     dependencies:
       async: 3.2.6
-      commander: 11.1.0
+      commander: 13.1.0
       email-addresses: 5.0.0
       filenamify: 4.3.0
       find-cache-dir: 3.3.2
-      fs-extra: 11.2.0
+      fs-extra: 11.3.0
       globby: 11.1.0
 
   github-slugger@2.0.0: {}
@@ -5166,7 +5424,7 @@ snapshots:
       jackspeak: 3.4.3
       minimatch: 9.0.5
       minipass: 7.1.2
-      package-json-from-dist: 1.0.0
+      package-json-from-dist: 1.0.1
       path-scurry: 1.11.1
 
   globals@11.12.0: {}
@@ -5175,7 +5433,7 @@ snapshots:
     dependencies:
       array-union: 2.1.0
       dir-glob: 3.0.1
-      fast-glob: 3.3.2
+      fast-glob: 3.3.3
       ignore: 5.3.2
       merge2: 1.4.1
       slash: 3.0.0
@@ -5189,8 +5447,6 @@ snapshots:
       section-matter: 1.0.0
       strip-bom-string: 1.0.0
 
-  has-flag@3.0.0: {}
-
   hasown@2.0.2:
     dependencies:
       function-bind: 1.1.2
@@ -5199,17 +5455,17 @@ snapshots:
     dependencies:
       '@types/hast': 3.0.4
       devlop: 1.1.0
-      hast-util-from-parse5: 8.0.1
-      parse5: 7.1.2
+      hast-util-from-parse5: 8.0.2
+      parse5: 7.2.1
       vfile: 6.0.3
       vfile-message: 4.0.2
 
-  hast-util-from-parse5@8.0.1:
+  hast-util-from-parse5@8.0.2:
     dependencies:
       '@types/hast': 3.0.4
       '@types/unist': 3.0.3
       devlop: 1.1.0
-      hastscript: 8.0.0
+      hastscript: 9.0.0
       property-information: 6.5.0
       vfile: 6.0.3
       vfile-location: 5.0.3
@@ -5223,23 +5479,23 @@ snapshots:
     dependencies:
       '@types/hast': 3.0.4
 
-  hast-util-raw@9.0.4:
+  hast-util-raw@9.1.0:
     dependencies:
       '@types/hast': 3.0.4
       '@types/unist': 3.0.3
-      '@ungap/structured-clone': 1.2.0
-      hast-util-from-parse5: 8.0.1
+      '@ungap/structured-clone': 1.3.0
+      hast-util-from-parse5: 8.0.2
       hast-util-to-parse5: 8.0.0
       html-void-elements: 3.0.0
       mdast-util-to-hast: 13.2.0
-      parse5: 7.1.2
+      parse5: 7.2.1
       unist-util-position: 5.0.0
       unist-util-visit: 5.0.0
       vfile: 6.0.3
       web-namespaces: 2.0.1
       zwitch: 2.0.4
 
-  hast-util-to-html@9.0.3:
+  hast-util-to-html@9.0.4:
     dependencies:
       '@types/hast': 3.0.4
       '@types/unist': 3.0.3
@@ -5253,6 +5509,20 @@ snapshots:
       stringify-entities: 4.0.4
       zwitch: 2.0.4
 
+  hast-util-to-html@9.0.5:
+    dependencies:
+      '@types/hast': 3.0.4
+      '@types/unist': 3.0.3
+      ccount: 2.0.1
+      comma-separated-tokens: 2.0.3
+      hast-util-whitespace: 3.0.0
+      html-void-elements: 3.0.0
+      mdast-util-to-hast: 13.2.0
+      property-information: 7.0.0
+      space-separated-tokens: 2.0.2
+      stringify-entities: 4.0.4
+      zwitch: 2.0.4
+
   hast-util-to-parse5@8.0.0:
     dependencies:
       '@types/hast': 3.0.4
@@ -5274,7 +5544,7 @@ snapshots:
     dependencies:
       '@types/hast': 3.0.4
 
-  hastscript@8.0.0:
+  hastscript@9.0.0:
     dependencies:
       '@types/hast': 3.0.4
       comma-separated-tokens: 2.0.3
@@ -5292,6 +5562,13 @@ snapshots:
 
   html-void-elements@3.0.0: {}
 
+  htmlparser2@8.0.2:
+    dependencies:
+      domelementtype: 2.3.0
+      domhandler: 5.0.3
+      domutils: 3.2.2
+      entities: 4.5.0
+
   http-cache-semantics@4.1.1: {}
 
   http-errors@2.0.0:
@@ -5308,7 +5585,7 @@ snapshots:
 
   ignore@5.3.2: {}
 
-  image-size@1.1.1:
+  image-size@1.2.0:
     dependencies:
       queue: 6.0.2
 
@@ -5324,7 +5601,7 @@ snapshots:
     dependencies:
       binary-extensions: 2.3.0
 
-  is-core-module@2.15.1:
+  is-core-module@2.16.1:
     dependencies:
       hasown: 2.0.2
 
@@ -5350,6 +5627,8 @@ snapshots:
 
   is-plain-obj@4.1.0: {}
 
+  is-plain-object@5.0.0: {}
+
   is-unicode-supported@1.3.0: {}
 
   is-unicode-supported@2.1.0: {}
@@ -5366,9 +5645,9 @@ snapshots:
     optionalDependencies:
       '@pkgjs/parseargs': 0.11.0
 
-  jiti@1.21.6: {}
+  jiti@1.21.7: {}
 
-  jose@5.9.4: {}
+  jose@5.9.6: {}
 
   js-cookie@3.0.5: {}
 
@@ -5383,12 +5662,18 @@ snapshots:
     dependencies:
       argparse: 2.0.1
 
-  jsesc@2.5.2: {}
+  jsesc@3.1.0: {}
 
-  jsesc@3.0.2: {}
+  json-schema@0.4.0: {}
 
   json5@2.2.3: {}
 
+  jsondiffpatch@0.6.0:
+    dependencies:
+      '@types/diff-match-patch': 1.0.36
+      chalk: 5.4.1
+      diff-match-patch: 1.0.5
+
   jsonfile@6.1.0:
     dependencies:
       universalify: 2.0.1
@@ -5401,9 +5686,7 @@ snapshots:
 
   kleur@4.1.5: {}
 
-  lilconfig@2.1.0: {}
-
-  lilconfig@3.1.2: {}
+  lilconfig@3.1.3: {}
 
   linebreak@1.1.0:
     dependencies:
@@ -5435,7 +5718,7 @@ snapshots:
 
   log-symbols@6.0.0:
     dependencies:
-      chalk: 5.3.0
+      chalk: 5.4.1
       is-unicode-supported: 1.3.0
 
   longest-streak@3.1.0: {}
@@ -5456,20 +5739,27 @@ snapshots:
 
   luxon@3.5.0: {}
 
-  magic-string@0.30.11:
+  magic-string@0.30.17:
     dependencies:
       '@jridgewell/sourcemap-codec': 1.5.0
 
   magicast@0.3.5:
     dependencies:
-      '@babel/parser': 7.25.8
-      '@babel/types': 7.25.8
+      '@babel/parser': 7.26.7
+      '@babel/types': 7.26.7
       source-map-js: 1.2.1
 
   make-dir@3.1.0:
     dependencies:
       semver: 6.3.1
 
+  markdown-it-async@2.0.0:
+    dependencies:
+      '@types/markdown-it': 14.1.2
+      markdown-it: 14.1.0
+
+  markdown-it-task-lists@2.1.1: {}
+
   markdown-it@14.1.0:
     dependencies:
       argparse: 2.0.1
@@ -5479,7 +5769,7 @@ snapshots:
       punycode.js: 2.3.1
       uc.micro: 2.1.0
 
-  markdown-table@3.0.3: {}
+  markdown-table@3.0.4: {}
 
   mdast-util-definitions@6.0.0:
     dependencies:
@@ -5487,26 +5777,26 @@ snapshots:
       '@types/unist': 3.0.3
       unist-util-visit: 5.0.0
 
-  mdast-util-find-and-replace@3.0.1:
+  mdast-util-find-and-replace@3.0.2:
     dependencies:
       '@types/mdast': 4.0.4
       escape-string-regexp: 5.0.0
       unist-util-is: 6.0.0
       unist-util-visit-parents: 6.0.1
 
-  mdast-util-from-markdown@2.0.1:
+  mdast-util-from-markdown@2.0.2:
     dependencies:
       '@types/mdast': 4.0.4
       '@types/unist': 3.0.3
       decode-named-character-reference: 1.0.2
       devlop: 1.1.0
       mdast-util-to-string: 4.0.0
-      micromark: 4.0.0
-      micromark-util-decode-numeric-character-reference: 2.0.1
-      micromark-util-decode-string: 2.0.0
-      micromark-util-normalize-identifier: 2.0.0
-      micromark-util-symbol: 2.0.0
-      micromark-util-types: 2.0.0
+      micromark: 4.0.1
+      micromark-util-decode-numeric-character-reference: 2.0.2
+      micromark-util-decode-string: 2.0.1
+      micromark-util-normalize-identifier: 2.0.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.1
       unist-util-stringify-position: 4.0.0
     transitivePeerDependencies:
       - supports-color
@@ -5516,24 +5806,24 @@ snapshots:
       '@types/mdast': 4.0.4
       ccount: 2.0.1
       devlop: 1.1.0
-      mdast-util-find-and-replace: 3.0.1
-      micromark-util-character: 2.1.0
+      mdast-util-find-and-replace: 3.0.2
+      micromark-util-character: 2.1.1
 
   mdast-util-gfm-footnote@2.0.0:
     dependencies:
       '@types/mdast': 4.0.4
       devlop: 1.1.0
-      mdast-util-from-markdown: 2.0.1
-      mdast-util-to-markdown: 2.1.0
-      micromark-util-normalize-identifier: 2.0.0
+      mdast-util-from-markdown: 2.0.2
+      mdast-util-to-markdown: 2.1.2
+      micromark-util-normalize-identifier: 2.0.1
     transitivePeerDependencies:
       - supports-color
 
   mdast-util-gfm-strikethrough@2.0.0:
     dependencies:
       '@types/mdast': 4.0.4
-      mdast-util-from-markdown: 2.0.1
-      mdast-util-to-markdown: 2.1.0
+      mdast-util-from-markdown: 2.0.2
+      mdast-util-to-markdown: 2.1.2
     transitivePeerDependencies:
       - supports-color
 
@@ -5541,9 +5831,9 @@ snapshots:
     dependencies:
       '@types/mdast': 4.0.4
       devlop: 1.1.0
-      markdown-table: 3.0.3
-      mdast-util-from-markdown: 2.0.1
-      mdast-util-to-markdown: 2.1.0
+      markdown-table: 3.0.4
+      mdast-util-from-markdown: 2.0.2
+      mdast-util-to-markdown: 2.1.2
     transitivePeerDependencies:
       - supports-color
 
@@ -5551,20 +5841,20 @@ snapshots:
     dependencies:
       '@types/mdast': 4.0.4
       devlop: 1.1.0
-      mdast-util-from-markdown: 2.0.1
-      mdast-util-to-markdown: 2.1.0
+      mdast-util-from-markdown: 2.0.2
+      mdast-util-to-markdown: 2.1.2
     transitivePeerDependencies:
       - supports-color
 
   mdast-util-gfm@3.0.0:
     dependencies:
-      mdast-util-from-markdown: 2.0.1
+      mdast-util-from-markdown: 2.0.2
       mdast-util-gfm-autolink-literal: 2.0.1
       mdast-util-gfm-footnote: 2.0.0
       mdast-util-gfm-strikethrough: 2.0.0
       mdast-util-gfm-table: 2.0.0
       mdast-util-gfm-task-list-item: 2.0.0
-      mdast-util-to-markdown: 2.1.0
+      mdast-util-to-markdown: 2.1.2
     transitivePeerDependencies:
       - supports-color
 
@@ -5577,22 +5867,23 @@ snapshots:
     dependencies:
       '@types/hast': 3.0.4
       '@types/mdast': 4.0.4
-      '@ungap/structured-clone': 1.2.0
+      '@ungap/structured-clone': 1.3.0
       devlop: 1.1.0
-      micromark-util-sanitize-uri: 2.0.0
+      micromark-util-sanitize-uri: 2.0.1
       trim-lines: 3.0.1
       unist-util-position: 5.0.0
       unist-util-visit: 5.0.0
       vfile: 6.0.3
 
-  mdast-util-to-markdown@2.1.0:
+  mdast-util-to-markdown@2.1.2:
     dependencies:
       '@types/mdast': 4.0.4
       '@types/unist': 3.0.3
       longest-streak: 3.1.0
       mdast-util-phrasing: 4.1.0
       mdast-util-to-string: 4.0.0
-      micromark-util-decode-string: 2.0.0
+      micromark-util-classify-character: 2.0.1
+      micromark-util-decode-string: 2.0.1
       unist-util-visit: 5.0.0
       zwitch: 2.0.4
 
@@ -5606,194 +5897,194 @@ snapshots:
 
   merge2@1.4.1: {}
 
-  micromark-core-commonmark@2.0.1:
+  micromark-core-commonmark@2.0.2:
     dependencies:
       decode-named-character-reference: 1.0.2
       devlop: 1.1.0
-      micromark-factory-destination: 2.0.0
-      micromark-factory-label: 2.0.0
-      micromark-factory-space: 2.0.0
-      micromark-factory-title: 2.0.0
-      micromark-factory-whitespace: 2.0.0
-      micromark-util-character: 2.1.0
-      micromark-util-chunked: 2.0.0
-      micromark-util-classify-character: 2.0.0
-      micromark-util-html-tag-name: 2.0.0
-      micromark-util-normalize-identifier: 2.0.0
-      micromark-util-resolve-all: 2.0.0
-      micromark-util-subtokenize: 2.0.1
-      micromark-util-symbol: 2.0.0
-      micromark-util-types: 2.0.0
+      micromark-factory-destination: 2.0.1
+      micromark-factory-label: 2.0.1
+      micromark-factory-space: 2.0.1
+      micromark-factory-title: 2.0.1
+      micromark-factory-whitespace: 2.0.1
+      micromark-util-character: 2.1.1
+      micromark-util-chunked: 2.0.1
+      micromark-util-classify-character: 2.0.1
+      micromark-util-html-tag-name: 2.0.1
+      micromark-util-normalize-identifier: 2.0.1
+      micromark-util-resolve-all: 2.0.1
+      micromark-util-subtokenize: 2.0.4
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.1
 
   micromark-extension-gfm-autolink-literal@2.1.0:
     dependencies:
-      micromark-util-character: 2.1.0
-      micromark-util-sanitize-uri: 2.0.0
-      micromark-util-symbol: 2.0.0
-      micromark-util-types: 2.0.0
+      micromark-util-character: 2.1.1
+      micromark-util-sanitize-uri: 2.0.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.1
 
   micromark-extension-gfm-footnote@2.1.0:
     dependencies:
       devlop: 1.1.0
-      micromark-core-commonmark: 2.0.1
-      micromark-factory-space: 2.0.0
-      micromark-util-character: 2.1.0
-      micromark-util-normalize-identifier: 2.0.0
-      micromark-util-sanitize-uri: 2.0.0
-      micromark-util-symbol: 2.0.0
-      micromark-util-types: 2.0.0
+      micromark-core-commonmark: 2.0.2
+      micromark-factory-space: 2.0.1
+      micromark-util-character: 2.1.1
+      micromark-util-normalize-identifier: 2.0.1
+      micromark-util-sanitize-uri: 2.0.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.1
 
   micromark-extension-gfm-strikethrough@2.1.0:
     dependencies:
       devlop: 1.1.0
-      micromark-util-chunked: 2.0.0
-      micromark-util-classify-character: 2.0.0
-      micromark-util-resolve-all: 2.0.0
-      micromark-util-symbol: 2.0.0
-      micromark-util-types: 2.0.0
+      micromark-util-chunked: 2.0.1
+      micromark-util-classify-character: 2.0.1
+      micromark-util-resolve-all: 2.0.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.1
 
-  micromark-extension-gfm-table@2.1.0:
+  micromark-extension-gfm-table@2.1.1:
     dependencies:
       devlop: 1.1.0
-      micromark-factory-space: 2.0.0
-      micromark-util-character: 2.1.0
-      micromark-util-symbol: 2.0.0
-      micromark-util-types: 2.0.0
+      micromark-factory-space: 2.0.1
+      micromark-util-character: 2.1.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.1
 
   micromark-extension-gfm-tagfilter@2.0.0:
     dependencies:
-      micromark-util-types: 2.0.0
+      micromark-util-types: 2.0.1
 
   micromark-extension-gfm-task-list-item@2.1.0:
     dependencies:
       devlop: 1.1.0
-      micromark-factory-space: 2.0.0
-      micromark-util-character: 2.1.0
-      micromark-util-symbol: 2.0.0
-      micromark-util-types: 2.0.0
+      micromark-factory-space: 2.0.1
+      micromark-util-character: 2.1.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.1
 
   micromark-extension-gfm@3.0.0:
     dependencies:
       micromark-extension-gfm-autolink-literal: 2.1.0
       micromark-extension-gfm-footnote: 2.1.0
       micromark-extension-gfm-strikethrough: 2.1.0
-      micromark-extension-gfm-table: 2.1.0
+      micromark-extension-gfm-table: 2.1.1
       micromark-extension-gfm-tagfilter: 2.0.0
       micromark-extension-gfm-task-list-item: 2.1.0
-      micromark-util-combine-extensions: 2.0.0
-      micromark-util-types: 2.0.0
+      micromark-util-combine-extensions: 2.0.1
+      micromark-util-types: 2.0.1
 
-  micromark-factory-destination@2.0.0:
+  micromark-factory-destination@2.0.1:
     dependencies:
-      micromark-util-character: 2.1.0
-      micromark-util-symbol: 2.0.0
-      micromark-util-types: 2.0.0
+      micromark-util-character: 2.1.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.1
 
-  micromark-factory-label@2.0.0:
+  micromark-factory-label@2.0.1:
     dependencies:
       devlop: 1.1.0
-      micromark-util-character: 2.1.0
-      micromark-util-symbol: 2.0.0
-      micromark-util-types: 2.0.0
+      micromark-util-character: 2.1.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.1
 
-  micromark-factory-space@2.0.0:
+  micromark-factory-space@2.0.1:
     dependencies:
-      micromark-util-character: 2.1.0
-      micromark-util-types: 2.0.0
+      micromark-util-character: 2.1.1
+      micromark-util-types: 2.0.1
 
-  micromark-factory-title@2.0.0:
+  micromark-factory-title@2.0.1:
     dependencies:
-      micromark-factory-space: 2.0.0
-      micromark-util-character: 2.1.0
-      micromark-util-symbol: 2.0.0
-      micromark-util-types: 2.0.0
+      micromark-factory-space: 2.0.1
+      micromark-util-character: 2.1.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.1
 
-  micromark-factory-whitespace@2.0.0:
+  micromark-factory-whitespace@2.0.1:
     dependencies:
-      micromark-factory-space: 2.0.0
-      micromark-util-character: 2.1.0
-      micromark-util-symbol: 2.0.0
-      micromark-util-types: 2.0.0
+      micromark-factory-space: 2.0.1
+      micromark-util-character: 2.1.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.1
 
-  micromark-util-character@2.1.0:
+  micromark-util-character@2.1.1:
     dependencies:
-      micromark-util-symbol: 2.0.0
-      micromark-util-types: 2.0.0
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.1
 
-  micromark-util-chunked@2.0.0:
+  micromark-util-chunked@2.0.1:
     dependencies:
-      micromark-util-symbol: 2.0.0
+      micromark-util-symbol: 2.0.1
 
-  micromark-util-classify-character@2.0.0:
+  micromark-util-classify-character@2.0.1:
     dependencies:
-      micromark-util-character: 2.1.0
-      micromark-util-symbol: 2.0.0
-      micromark-util-types: 2.0.0
+      micromark-util-character: 2.1.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.1
 
-  micromark-util-combine-extensions@2.0.0:
+  micromark-util-combine-extensions@2.0.1:
     dependencies:
-      micromark-util-chunked: 2.0.0
-      micromark-util-types: 2.0.0
+      micromark-util-chunked: 2.0.1
+      micromark-util-types: 2.0.1
 
-  micromark-util-decode-numeric-character-reference@2.0.1:
+  micromark-util-decode-numeric-character-reference@2.0.2:
     dependencies:
-      micromark-util-symbol: 2.0.0
+      micromark-util-symbol: 2.0.1
 
-  micromark-util-decode-string@2.0.0:
+  micromark-util-decode-string@2.0.1:
     dependencies:
       decode-named-character-reference: 1.0.2
-      micromark-util-character: 2.1.0
-      micromark-util-decode-numeric-character-reference: 2.0.1
-      micromark-util-symbol: 2.0.0
+      micromark-util-character: 2.1.1
+      micromark-util-decode-numeric-character-reference: 2.0.2
+      micromark-util-symbol: 2.0.1
 
-  micromark-util-encode@2.0.0: {}
+  micromark-util-encode@2.0.1: {}
 
-  micromark-util-html-tag-name@2.0.0: {}
+  micromark-util-html-tag-name@2.0.1: {}
 
-  micromark-util-normalize-identifier@2.0.0:
+  micromark-util-normalize-identifier@2.0.1:
     dependencies:
-      micromark-util-symbol: 2.0.0
+      micromark-util-symbol: 2.0.1
 
-  micromark-util-resolve-all@2.0.0:
+  micromark-util-resolve-all@2.0.1:
     dependencies:
-      micromark-util-types: 2.0.0
+      micromark-util-types: 2.0.1
 
-  micromark-util-sanitize-uri@2.0.0:
+  micromark-util-sanitize-uri@2.0.1:
     dependencies:
-      micromark-util-character: 2.1.0
-      micromark-util-encode: 2.0.0
-      micromark-util-symbol: 2.0.0
+      micromark-util-character: 2.1.1
+      micromark-util-encode: 2.0.1
+      micromark-util-symbol: 2.0.1
 
-  micromark-util-subtokenize@2.0.1:
+  micromark-util-subtokenize@2.0.4:
     dependencies:
       devlop: 1.1.0
-      micromark-util-chunked: 2.0.0
-      micromark-util-symbol: 2.0.0
-      micromark-util-types: 2.0.0
+      micromark-util-chunked: 2.0.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.1
 
-  micromark-util-symbol@2.0.0: {}
+  micromark-util-symbol@2.0.1: {}
 
-  micromark-util-types@2.0.0: {}
+  micromark-util-types@2.0.1: {}
 
-  micromark@4.0.0:
+  micromark@4.0.1:
     dependencies:
       '@types/debug': 4.1.12
-      debug: 4.3.7
+      debug: 4.4.0
       decode-named-character-reference: 1.0.2
       devlop: 1.1.0
-      micromark-core-commonmark: 2.0.1
-      micromark-factory-space: 2.0.0
-      micromark-util-character: 2.1.0
-      micromark-util-chunked: 2.0.0
-      micromark-util-combine-extensions: 2.0.0
-      micromark-util-decode-numeric-character-reference: 2.0.1
-      micromark-util-encode: 2.0.0
-      micromark-util-normalize-identifier: 2.0.0
-      micromark-util-resolve-all: 2.0.0
-      micromark-util-sanitize-uri: 2.0.0
-      micromark-util-subtokenize: 2.0.1
-      micromark-util-symbol: 2.0.0
-      micromark-util-types: 2.0.0
+      micromark-core-commonmark: 2.0.2
+      micromark-factory-space: 2.0.1
+      micromark-util-character: 2.1.1
+      micromark-util-chunked: 2.0.1
+      micromark-util-combine-extensions: 2.0.1
+      micromark-util-decode-numeric-character-reference: 2.0.2
+      micromark-util-encode: 2.0.1
+      micromark-util-normalize-identifier: 2.0.1
+      micromark-util-resolve-all: 2.0.1
+      micromark-util-sanitize-uri: 2.0.1
+      micromark-util-subtokenize: 2.0.4
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.1
     transitivePeerDependencies:
       - supports-color
 
@@ -5816,8 +6107,6 @@ snapshots:
     dependencies:
       brace-expansion: 2.0.1
 
-  minimist@1.2.8: {}
-
   minipass@7.1.2: {}
 
   mrmime@2.0.0: {}
@@ -5832,9 +6121,9 @@ snapshots:
       object-assign: 4.1.1
       thenify-all: 1.6.0
 
-  nanoid@3.3.7: {}
+  nanoid@3.3.8: {}
 
-  nanoid@5.0.7: {}
+  nanoid@5.0.9: {}
 
   nanostores@0.11.3: {}
 
@@ -5855,13 +6144,13 @@ snapshots:
       css-select: 5.1.0
       he: 1.2.0
 
-  node-releases@2.0.18: {}
+  node-releases@2.0.19: {}
 
   normalize-path@3.0.0: {}
 
   normalize-range@0.1.2: {}
 
-  npm-check-updates@17.1.3: {}
+  npm-check-updates@17.1.14: {}
 
   nth-check@2.1.1:
     dependencies:
@@ -5879,27 +6168,35 @@ snapshots:
     dependencies:
       mimic-function: 5.0.1
 
-  oniguruma-to-js@0.4.3:
+  oniguruma-to-es@2.3.0:
+    dependencies:
+      emoji-regex-xs: 1.0.0
+      regex: 5.1.1
+      regex-recursion: 5.1.1
+
+  oniguruma-to-es@3.1.1:
     dependencies:
-      regex: 4.3.2
+      emoji-regex-xs: 1.0.0
+      regex: 6.0.1
+      regex-recursion: 6.0.2
 
-  openai@4.67.3(zod@3.23.8):
+  openai@4.80.1(zod@3.24.1):
     dependencies:
-      '@types/node': 18.19.50
-      '@types/node-fetch': 2.6.11
+      '@types/node': 18.19.74
+      '@types/node-fetch': 2.6.12
       abort-controller: 3.0.0
-      agentkeepalive: 4.5.0
+      agentkeepalive: 4.6.0
       form-data-encoder: 1.7.2
       formdata-node: 4.4.1
       node-fetch: 2.7.0
     optionalDependencies:
-      zod: 3.23.8
+      zod: 3.24.1
     transitivePeerDependencies:
       - encoding
 
-  ora@8.1.0:
+  ora@8.1.1:
     dependencies:
-      chalk: 5.3.0
+      chalk: 5.4.1
       cli-cursor: 5.0.0
       cli-spinners: 2.9.2
       is-interactive: 2.0.0
@@ -5909,11 +6206,13 @@ snapshots:
       string-width: 7.2.0
       strip-ansi: 7.1.0
 
+  orderedmap@2.1.1: {}
+
   p-limit@2.3.0:
     dependencies:
       p-try: 2.2.0
 
-  p-limit@6.1.0:
+  p-limit@6.2.0:
     dependencies:
       yocto-queue: 1.1.1
 
@@ -5921,16 +6220,16 @@ snapshots:
     dependencies:
       p-limit: 2.3.0
 
-  p-queue@8.0.1:
+  p-queue@8.1.0:
     dependencies:
       eventemitter3: 5.0.1
-      p-timeout: 6.1.2
+      p-timeout: 6.1.4
 
-  p-timeout@6.1.2: {}
+  p-timeout@6.1.4: {}
 
   p-try@2.2.0: {}
 
-  package-json-from-dist@1.0.0: {}
+  package-json-from-dist@1.0.1: {}
 
   pako@0.2.9: {}
 
@@ -5948,7 +6247,9 @@ snapshots:
       unist-util-visit-children: 3.0.0
       vfile: 6.0.3
 
-  parse5@7.1.2:
+  parse-srcset@1.0.2: {}
+
+  parse5@7.2.1:
     dependencies:
       entities: 4.5.0
 
@@ -5965,10 +6266,12 @@ snapshots:
 
   path-type@4.0.0: {}
 
-  picocolors@1.1.0: {}
+  picocolors@1.1.1: {}
 
   picomatch@2.3.1: {}
 
+  picomatch@4.0.2: {}
+
   pify@2.3.0: {}
 
   pify@4.0.1: {}
@@ -5979,36 +6282,36 @@ snapshots:
     dependencies:
       find-up: 4.1.0
 
-  playwright-core@1.48.0: {}
+  playwright-core@1.50.0: {}
 
-  playwright@1.48.0:
+  playwright@1.50.0:
     dependencies:
-      playwright-core: 1.48.0
+      playwright-core: 1.50.0
     optionalDependencies:
       fsevents: 2.3.2
 
-  postcss-import@15.1.0(postcss@8.4.47):
+  postcss-import@15.1.0(postcss@8.5.1):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.5.1
       postcss-value-parser: 4.2.0
       read-cache: 1.0.0
-      resolve: 1.22.8
+      resolve: 1.22.10
 
-  postcss-js@4.0.1(postcss@8.4.47):
+  postcss-js@4.0.1(postcss@8.5.1):
     dependencies:
       camelcase-css: 2.0.1
-      postcss: 8.4.47
+      postcss: 8.5.1
 
-  postcss-load-config@4.0.2(postcss@8.4.47):
+  postcss-load-config@4.0.2(postcss@8.5.1):
     dependencies:
-      lilconfig: 3.1.2
-      yaml: 2.5.1
+      lilconfig: 3.1.3
+      yaml: 2.7.0
     optionalDependencies:
-      postcss: 8.4.47
+      postcss: 8.5.1
 
-  postcss-nested@6.2.0(postcss@8.4.47):
+  postcss-nested@6.2.0(postcss@8.5.1):
     dependencies:
-      postcss: 8.4.47
+      postcss: 8.5.1
       postcss-selector-parser: 6.1.2
 
   postcss-selector-parser@6.0.10:
@@ -6023,10 +6326,10 @@ snapshots:
 
   postcss-value-parser@4.2.0: {}
 
-  postcss@8.4.47:
+  postcss@8.5.1:
     dependencies:
-      nanoid: 3.3.7
-      picocolors: 1.1.0
+      nanoid: 3.3.8
+      picocolors: 1.1.1
       source-map-js: 1.2.1
 
   preferred-pm@4.0.0:
@@ -6038,16 +6341,16 @@ snapshots:
   prettier-plugin-astro@0.14.1:
     dependencies:
       '@astrojs/compiler': 2.10.3
-      prettier: 3.3.3
+      prettier: 3.4.2
       sass-formatter: 0.7.9
 
-  prettier-plugin-tailwindcss@0.6.8(prettier-plugin-astro@0.14.1)(prettier@3.3.3):
+  prettier-plugin-tailwindcss@0.6.11(prettier-plugin-astro@0.14.1)(prettier@3.4.2):
     dependencies:
-      prettier: 3.3.3
+      prettier: 3.4.2
     optionalDependencies:
       prettier-plugin-astro: 0.14.1
 
-  prettier@3.3.3: {}
+  prettier@3.4.2: {}
 
   prismjs@1.29.0: {}
 
@@ -6064,6 +6367,111 @@ snapshots:
 
   property-information@6.5.0: {}
 
+  property-information@7.0.0: {}
+
+  prosemirror-changeset@2.2.1:
+    dependencies:
+      prosemirror-transform: 1.10.2
+
+  prosemirror-collab@1.3.1:
+    dependencies:
+      prosemirror-state: 1.4.3
+
+  prosemirror-commands@1.6.2:
+    dependencies:
+      prosemirror-model: 1.24.1
+      prosemirror-state: 1.4.3
+      prosemirror-transform: 1.10.2
+
+  prosemirror-dropcursor@1.8.1:
+    dependencies:
+      prosemirror-state: 1.4.3
+      prosemirror-transform: 1.10.2
+      prosemirror-view: 1.37.2
+
+  prosemirror-gapcursor@1.3.2:
+    dependencies:
+      prosemirror-keymap: 1.2.2
+      prosemirror-model: 1.24.1
+      prosemirror-state: 1.4.3
+      prosemirror-view: 1.37.2
+
+  prosemirror-history@1.4.1:
+    dependencies:
+      prosemirror-state: 1.4.3
+      prosemirror-transform: 1.10.2
+      prosemirror-view: 1.37.2
+      rope-sequence: 1.3.4
+
+  prosemirror-inputrules@1.4.0:
+    dependencies:
+      prosemirror-state: 1.4.3
+      prosemirror-transform: 1.10.2
+
+  prosemirror-keymap@1.2.2:
+    dependencies:
+      prosemirror-state: 1.4.3
+      w3c-keyname: 2.2.8
+
+  prosemirror-markdown@1.13.1:
+    dependencies:
+      '@types/markdown-it': 14.1.2
+      markdown-it: 14.1.0
+      prosemirror-model: 1.24.1
+
+  prosemirror-menu@1.2.4:
+    dependencies:
+      crelt: 1.0.6
+      prosemirror-commands: 1.6.2
+      prosemirror-history: 1.4.1
+      prosemirror-state: 1.4.3
+
+  prosemirror-model@1.24.1:
+    dependencies:
+      orderedmap: 2.1.1
+
+  prosemirror-schema-basic@1.2.3:
+    dependencies:
+      prosemirror-model: 1.24.1
+
+  prosemirror-schema-list@1.5.0:
+    dependencies:
+      prosemirror-model: 1.24.1
+      prosemirror-state: 1.4.3
+      prosemirror-transform: 1.10.2
+
+  prosemirror-state@1.4.3:
+    dependencies:
+      prosemirror-model: 1.24.1
+      prosemirror-transform: 1.10.2
+      prosemirror-view: 1.37.2
+
+  prosemirror-tables@1.6.2:
+    dependencies:
+      prosemirror-keymap: 1.2.2
+      prosemirror-model: 1.24.1
+      prosemirror-state: 1.4.3
+      prosemirror-transform: 1.10.2
+      prosemirror-view: 1.37.2
+
+  prosemirror-trailing-node@3.0.0(prosemirror-model@1.24.1)(prosemirror-state@1.4.3)(prosemirror-view@1.37.2):
+    dependencies:
+      '@remirror/core-constants': 3.0.0
+      escape-string-regexp: 4.0.0
+      prosemirror-model: 1.24.1
+      prosemirror-state: 1.4.3
+      prosemirror-view: 1.37.2
+
+  prosemirror-transform@1.10.2:
+    dependencies:
+      prosemirror-model: 1.24.1
+
+  prosemirror-view@1.37.2:
+    dependencies:
+      prosemirror-model: 1.24.1
+      prosemirror-state: 1.4.3
+      prosemirror-transform: 1.10.2
+
   punycode.js@2.3.1: {}
 
   queue-microtask@1.2.3: {}
@@ -6080,7 +6488,7 @@ snapshots:
       prop-types: 15.8.1
       react: 18.3.1
 
-  react-confetti@6.1.0(react@18.3.1):
+  react-confetti@6.2.2(react@18.3.1):
     dependencies:
       react: 18.3.1
       tween-functions: 1.2.0
@@ -6095,9 +6503,18 @@ snapshots:
 
   react-refresh@0.14.2: {}
 
+  react-textarea-autosize@8.5.7(@types/react@18.3.18)(react@18.3.1):
+    dependencies:
+      '@babel/runtime': 7.26.9
+      react: 18.3.1
+      use-composed-ref: 1.4.0(@types/react@18.3.18)(react@18.3.1)
+      use-latest: 1.3.0(@types/react@18.3.18)(react@18.3.1)
+    transitivePeerDependencies:
+      - '@types/react'
+
   react-tooltip@5.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
     dependencies:
-      '@floating-ui/dom': 1.6.11
+      '@floating-ui/dom': 1.6.13
       classnames: 2.5.1
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
@@ -6106,14 +6523,14 @@ snapshots:
     dependencies:
       loose-envify: 1.4.0
 
-  reactflow@11.11.4(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+  reactflow@11.11.4(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
     dependencies:
-      '@reactflow/background': 11.3.14(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@reactflow/controls': 11.2.14(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@reactflow/core': 11.11.4(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@reactflow/minimap': 11.7.14(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@reactflow/node-resizer': 2.2.14(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@reactflow/node-toolbar': 1.3.14(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@reactflow/background': 11.3.14(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@reactflow/controls': 11.2.14(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@reactflow/core': 11.11.4(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@reactflow/minimap': 11.7.14(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@reactflow/node-resizer': 2.2.14(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@reactflow/node-toolbar': 1.3.14(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
     transitivePeerDependencies:
@@ -6128,18 +6545,37 @@ snapshots:
     dependencies:
       picomatch: 2.3.1
 
-  regex@4.3.2: {}
+  regenerator-runtime@0.14.1: {}
+
+  regex-recursion@5.1.1:
+    dependencies:
+      regex: 5.1.1
+      regex-utilities: 2.3.0
+
+  regex-recursion@6.0.2:
+    dependencies:
+      regex-utilities: 2.3.0
+
+  regex-utilities@2.3.0: {}
+
+  regex@5.1.1:
+    dependencies:
+      regex-utilities: 2.3.0
+
+  regex@6.0.1:
+    dependencies:
+      regex-utilities: 2.3.0
 
   rehype-external-links@3.0.0:
     dependencies:
       '@types/hast': 3.0.4
-      '@ungap/structured-clone': 1.2.0
+      '@ungap/structured-clone': 1.3.0
       hast-util-is-element: 3.0.0
       is-absolute-url: 4.0.1
       space-separated-tokens: 2.0.2
       unist-util-visit: 5.0.0
 
-  rehype-parse@9.0.0:
+  rehype-parse@9.0.1:
     dependencies:
       '@types/hast': 3.0.4
       hast-util-from-html: 2.0.3
@@ -6148,19 +6584,19 @@ snapshots:
   rehype-raw@7.0.0:
     dependencies:
       '@types/hast': 3.0.4
-      hast-util-raw: 9.0.4
+      hast-util-raw: 9.1.0
       vfile: 6.0.3
 
   rehype-stringify@10.0.1:
     dependencies:
       '@types/hast': 3.0.4
-      hast-util-to-html: 9.0.3
+      hast-util-to-html: 9.0.4
       unified: 11.0.5
 
   rehype@13.0.2:
     dependencies:
       '@types/hast': 3.0.4
-      rehype-parse: 9.0.0
+      rehype-parse: 9.0.1
       rehype-stringify: 10.0.1
       unified: 11.0.5
 
@@ -6178,8 +6614,8 @@ snapshots:
   remark-parse@11.0.0:
     dependencies:
       '@types/mdast': 4.0.4
-      mdast-util-from-markdown: 2.0.1
-      micromark-util-types: 2.0.0
+      mdast-util-from-markdown: 2.0.2
+      micromark-util-types: 2.0.1
       unified: 11.0.5
     transitivePeerDependencies:
       - supports-color
@@ -6195,21 +6631,21 @@ snapshots:
   remark-smartypants@3.0.2:
     dependencies:
       retext: 9.0.0
-      retext-smartypants: 6.1.1
+      retext-smartypants: 6.2.0
       unified: 11.0.5
       unist-util-visit: 5.0.0
 
   remark-stringify@11.0.0:
     dependencies:
       '@types/mdast': 4.0.4
-      mdast-util-to-markdown: 2.1.0
+      mdast-util-to-markdown: 2.1.2
       unified: 11.0.5
 
   resolve-pkg-maps@1.0.0: {}
 
-  resolve@1.22.8:
+  resolve@1.22.10:
     dependencies:
-      is-core-module: 2.15.1
+      is-core-module: 2.16.1
       path-parse: 1.0.7
       supports-preserve-symlinks-flag: 1.0.0
 
@@ -6224,7 +6660,7 @@ snapshots:
       parse-latin: 7.0.0
       unified: 11.0.5
 
-  retext-smartypants@6.1.1:
+  retext-smartypants@6.2.0:
     dependencies:
       '@types/nlcst': 2.0.3
       nlcst-to-string: 4.0.0
@@ -6247,34 +6683,48 @@ snapshots:
 
   roadmap-renderer@1.0.6: {}
 
-  rollup@4.22.4:
+  rollup@4.32.0:
     dependencies:
-      '@types/estree': 1.0.5
+      '@types/estree': 1.0.6
     optionalDependencies:
-      '@rollup/rollup-android-arm-eabi': 4.22.4
-      '@rollup/rollup-android-arm64': 4.22.4
-      '@rollup/rollup-darwin-arm64': 4.22.4
-      '@rollup/rollup-darwin-x64': 4.22.4
-      '@rollup/rollup-linux-arm-gnueabihf': 4.22.4
-      '@rollup/rollup-linux-arm-musleabihf': 4.22.4
-      '@rollup/rollup-linux-arm64-gnu': 4.22.4
-      '@rollup/rollup-linux-arm64-musl': 4.22.4
-      '@rollup/rollup-linux-powerpc64le-gnu': 4.22.4
-      '@rollup/rollup-linux-riscv64-gnu': 4.22.4
-      '@rollup/rollup-linux-s390x-gnu': 4.22.4
-      '@rollup/rollup-linux-x64-gnu': 4.22.4
-      '@rollup/rollup-linux-x64-musl': 4.22.4
-      '@rollup/rollup-win32-arm64-msvc': 4.22.4
-      '@rollup/rollup-win32-ia32-msvc': 4.22.4
-      '@rollup/rollup-win32-x64-msvc': 4.22.4
+      '@rollup/rollup-android-arm-eabi': 4.32.0
+      '@rollup/rollup-android-arm64': 4.32.0
+      '@rollup/rollup-darwin-arm64': 4.32.0
+      '@rollup/rollup-darwin-x64': 4.32.0
+      '@rollup/rollup-freebsd-arm64': 4.32.0
+      '@rollup/rollup-freebsd-x64': 4.32.0
+      '@rollup/rollup-linux-arm-gnueabihf': 4.32.0
+      '@rollup/rollup-linux-arm-musleabihf': 4.32.0
+      '@rollup/rollup-linux-arm64-gnu': 4.32.0
+      '@rollup/rollup-linux-arm64-musl': 4.32.0
+      '@rollup/rollup-linux-loongarch64-gnu': 4.32.0
+      '@rollup/rollup-linux-powerpc64le-gnu': 4.32.0
+      '@rollup/rollup-linux-riscv64-gnu': 4.32.0
+      '@rollup/rollup-linux-s390x-gnu': 4.32.0
+      '@rollup/rollup-linux-x64-gnu': 4.32.0
+      '@rollup/rollup-linux-x64-musl': 4.32.0
+      '@rollup/rollup-win32-arm64-msvc': 4.32.0
+      '@rollup/rollup-win32-ia32-msvc': 4.32.0
+      '@rollup/rollup-win32-x64-msvc': 4.32.0
       fsevents: 2.3.3
 
+  rope-sequence@1.3.4: {}
+
   run-parallel@1.2.0:
     dependencies:
       queue-microtask: 1.2.3
 
   s.color@0.0.15: {}
 
+  sanitize-html@2.14.0:
+    dependencies:
+      deepmerge: 4.3.1
+      escape-string-regexp: 4.0.0
+      htmlparser2: 8.0.2
+      is-plain-object: 5.0.0
+      parse-srcset: 1.0.2
+      postcss: 8.5.1
+
   sass-formatter@0.7.9:
     dependencies:
       suf-log: 2.5.3
@@ -6283,7 +6733,7 @@ snapshots:
     dependencies:
       ultrahtml: 1.5.3
 
-  satori@0.11.2:
+  satori@0.11.3:
     dependencies:
       '@shuding/opentype.js': 1.4.0-beta.0
       css-background-parser: 0.1.0
@@ -6308,16 +6758,18 @@ snapshots:
       extend-shallow: 2.0.1
       kind-of: 6.0.3
 
+  secure-json-parse@2.7.0: {}
+
   semver@6.3.1: {}
 
   semver@7.6.3: {}
 
-  send@0.19.0:
+  send@0.19.1:
     dependencies:
       debug: 2.6.9
       depd: 2.0.0
       destroy: 1.2.0
-      encodeurl: 1.0.2
+      encodeurl: 2.0.0
       escape-html: 1.0.3
       etag: 1.8.1
       fresh: 0.5.2
@@ -6366,13 +6818,26 @@ snapshots:
 
   shebang-regex@3.0.0: {}
 
-  shiki@1.22.0:
+  shiki@1.29.1:
     dependencies:
-      '@shikijs/core': 1.22.0
-      '@shikijs/engine-javascript': 1.22.0
-      '@shikijs/engine-oniguruma': 1.22.0
-      '@shikijs/types': 1.22.0
-      '@shikijs/vscode-textmate': 9.3.0
+      '@shikijs/core': 1.29.1
+      '@shikijs/engine-javascript': 1.29.1
+      '@shikijs/engine-oniguruma': 1.29.1
+      '@shikijs/langs': 1.29.1
+      '@shikijs/themes': 1.29.1
+      '@shikijs/types': 1.29.1
+      '@shikijs/vscode-textmate': 10.0.1
+      '@types/hast': 3.0.4
+
+  shiki@3.1.0:
+    dependencies:
+      '@shikijs/core': 3.1.0
+      '@shikijs/engine-javascript': 3.1.0
+      '@shikijs/engine-oniguruma': 3.1.0
+      '@shikijs/langs': 3.1.0
+      '@shikijs/themes': 3.1.0
+      '@shikijs/types': 3.1.0
+      '@shikijs/vscode-textmate': 10.0.2
       '@types/hast': 3.0.4
 
   signal-exit@4.1.0: {}
@@ -6421,7 +6886,7 @@ snapshots:
   string-width@7.2.0:
     dependencies:
       emoji-regex: 10.4.0
-      get-east-asian-width: 1.2.0
+      get-east-asian-width: 1.3.0
       strip-ansi: 7.1.0
 
   string.prototype.codepointat@0.2.1: {}
@@ -6449,7 +6914,7 @@ snapshots:
 
   sucrase@3.35.0:
     dependencies:
-      '@jridgewell/gen-mapping': 0.3.5
+      '@jridgewell/gen-mapping': 0.3.8
       commander: 4.1.1
       glob: 10.4.5
       lines-and-columns: 1.2.4
@@ -6461,37 +6926,39 @@ snapshots:
     dependencies:
       s.color: 0.0.15
 
-  supports-color@5.5.0:
-    dependencies:
-      has-flag: 3.0.0
-
   supports-preserve-symlinks-flag@1.0.0: {}
 
-  tailwind-merge@2.5.3: {}
+  swr@2.3.2(react@18.3.1):
+    dependencies:
+      dequal: 2.0.3
+      react: 18.3.1
+      use-sync-external-store: 1.4.0(react@18.3.1)
+
+  tailwind-merge@2.6.0: {}
 
-  tailwindcss@3.4.13:
+  tailwindcss@3.4.17:
     dependencies:
       '@alloc/quick-lru': 5.2.0
       arg: 5.0.2
       chokidar: 3.6.0
       didyoumean: 1.2.2
       dlv: 1.1.3
-      fast-glob: 3.3.2
+      fast-glob: 3.3.3
       glob-parent: 6.0.2
       is-glob: 4.0.3
-      jiti: 1.21.6
-      lilconfig: 2.1.0
+      jiti: 1.21.7
+      lilconfig: 3.1.3
       micromatch: 4.0.8
       normalize-path: 3.0.0
       object-hash: 3.0.0
-      picocolors: 1.1.0
-      postcss: 8.4.47
-      postcss-import: 15.1.0(postcss@8.4.47)
-      postcss-js: 4.0.1(postcss@8.4.47)
-      postcss-load-config: 4.0.2(postcss@8.4.47)
-      postcss-nested: 6.2.0(postcss@8.4.47)
+      picocolors: 1.1.1
+      postcss: 8.5.1
+      postcss-import: 15.1.0(postcss@8.5.1)
+      postcss-js: 4.0.1(postcss@8.5.1)
+      postcss-load-config: 4.0.2(postcss@8.5.1)
+      postcss-nested: 6.2.0(postcss@8.5.1)
       postcss-selector-parser: 6.1.2
-      resolve: 1.22.8
+      resolve: 1.22.10
       sucrase: 3.35.0
     transitivePeerDependencies:
       - ts-node
@@ -6504,11 +6971,19 @@ snapshots:
     dependencies:
       any-promise: 1.3.0
 
+  throttleit@2.1.0: {}
+
   tiny-inflate@1.0.3: {}
 
-  tinyexec@0.3.0: {}
+  tinyexec@0.3.2: {}
 
-  to-fast-properties@2.0.0: {}
+  tiptap-markdown@0.8.10(@tiptap/core@2.11.3(@tiptap/pm@2.11.3)):
+    dependencies:
+      '@tiptap/core': 2.11.3(@tiptap/pm@2.11.3)
+      '@types/markdown-it': 13.0.9
+      markdown-it: 14.1.0
+      markdown-it-task-lists: 2.1.1
+      prosemirror-markdown: 1.13.1
 
   to-regex-range@5.0.1:
     dependencies:
@@ -6528,16 +7003,16 @@ snapshots:
 
   ts-interface-checker@0.1.13: {}
 
-  tsconfck@3.1.3(typescript@5.6.2):
+  tsconfck@3.1.4(typescript@5.7.3):
     optionalDependencies:
-      typescript: 5.6.2
+      typescript: 5.7.3
 
-  tslib@2.7.0: {}
+  tslib@2.8.1: {}
 
-  tsx@4.19.1:
+  tsx@4.19.2:
     dependencies:
       esbuild: 0.23.1
-      get-tsconfig: 4.8.1
+      get-tsconfig: 4.10.0
     optionalDependencies:
       fsevents: 2.3.3
 
@@ -6547,9 +7022,9 @@ snapshots:
 
   tween-functions@1.2.0: {}
 
-  type-fest@4.26.1: {}
+  type-fest@4.33.0: {}
 
-  typescript@5.6.2: {}
+  typescript@5.7.3: {}
 
   uc.micro@2.1.0: {}
 
@@ -6616,19 +7091,32 @@ snapshots:
 
   universalify@2.0.1: {}
 
-  update-browserslist-db@1.1.0(browserslist@4.23.3):
+  update-browserslist-db@1.1.2(browserslist@4.24.4):
     dependencies:
-      browserslist: 4.23.3
+      browserslist: 4.24.4
       escalade: 3.2.0
-      picocolors: 1.1.0
+      picocolors: 1.1.1
 
-  update-browserslist-db@1.1.0(browserslist@4.24.0):
+  use-composed-ref@1.4.0(@types/react@18.3.18)(react@18.3.1):
     dependencies:
-      browserslist: 4.24.0
-      escalade: 3.2.0
-      picocolors: 1.1.0
+      react: 18.3.1
+    optionalDependencies:
+      '@types/react': 18.3.18
+
+  use-isomorphic-layout-effect@1.2.0(@types/react@18.3.18)(react@18.3.1):
+    dependencies:
+      react: 18.3.1
+    optionalDependencies:
+      '@types/react': 18.3.18
 
-  use-sync-external-store@1.2.2(react@18.3.1):
+  use-latest@1.3.0(@types/react@18.3.18)(react@18.3.1):
+    dependencies:
+      react: 18.3.1
+      use-isomorphic-layout-effect: 1.2.0(@types/react@18.3.18)(react@18.3.1)
+    optionalDependencies:
+      '@types/react': 18.3.18
+
+  use-sync-external-store@1.4.0(react@18.3.1):
     dependencies:
       react: 18.3.1
 
@@ -6649,18 +7137,20 @@ snapshots:
       '@types/unist': 3.0.3
       vfile-message: 4.0.2
 
-  vite@5.4.8(@types/node@18.19.50):
+  vite@5.4.14(@types/node@18.19.74):
     dependencies:
       esbuild: 0.21.5
-      postcss: 8.4.47
-      rollup: 4.22.4
+      postcss: 8.5.1
+      rollup: 4.32.0
     optionalDependencies:
-      '@types/node': 18.19.50
+      '@types/node': 18.19.74
       fsevents: 2.3.3
 
-  vitefu@1.0.2(vite@5.4.8(@types/node@18.19.50)):
+  vitefu@1.0.5(vite@5.4.14(@types/node@18.19.74)):
     optionalDependencies:
-      vite: 5.4.8(@types/node@18.19.50)
+      vite: 5.4.14(@types/node@18.19.74)
+
+  w3c-keyname@2.2.8: {}
 
   web-namespaces@2.0.1: {}
 
@@ -6705,11 +7195,11 @@ snapshots:
       string-width: 7.2.0
       strip-ansi: 7.1.0
 
-  xxhash-wasm@1.0.2: {}
+  xxhash-wasm@1.1.0: {}
 
   yallist@3.1.1: {}
 
-  yaml@2.5.1: {}
+  yaml@2.7.0: {}
 
   yargs-parser@21.1.1: {}
 
@@ -6717,22 +7207,22 @@ snapshots:
 
   yoga-wasm-web@0.3.3: {}
 
-  zod-to-json-schema@3.23.3(zod@3.23.8):
+  zod-to-json-schema@3.24.1(zod@3.24.1):
     dependencies:
-      zod: 3.23.8
+      zod: 3.24.1
 
-  zod-to-ts@1.2.0(typescript@5.6.2)(zod@3.23.8):
+  zod-to-ts@1.2.0(typescript@5.7.3)(zod@3.24.1):
     dependencies:
-      typescript: 5.6.2
-      zod: 3.23.8
+      typescript: 5.7.3
+      zod: 3.24.1
 
-  zod@3.23.8: {}
+  zod@3.24.1: {}
 
-  zustand@4.5.5(@types/react@18.3.11)(react@18.3.1):
+  zustand@4.5.6(@types/react@18.3.18)(react@18.3.1):
     dependencies:
-      use-sync-external-store: 1.2.2(react@18.3.1)
+      use-sync-external-store: 1.4.0(react@18.3.1)
     optionalDependencies:
-      '@types/react': 18.3.11
+      '@types/react': 18.3.18
       react: 18.3.1
 
   zwitch@2.0.4: {}
diff --git a/public/pdfs/roadmaps/aspnet-core.pdf b/public/pdfs/roadmaps/aspnet-core.pdf
index a972131b8..f89ff146b 100644
Binary files a/public/pdfs/roadmaps/aspnet-core.pdf and b/public/pdfs/roadmaps/aspnet-core.pdf differ
diff --git a/public/pdfs/roadmaps/cloudflare.pdf b/public/pdfs/roadmaps/cloudflare.pdf
new file mode 100644
index 000000000..3e2a7fb85
Binary files /dev/null and b/public/pdfs/roadmaps/cloudflare.pdf differ
diff --git a/public/pdfs/roadmaps/cpp.pdf b/public/pdfs/roadmaps/cpp.pdf
index 75f7361d1..842a8952a 100644
Binary files a/public/pdfs/roadmaps/cpp.pdf and b/public/pdfs/roadmaps/cpp.pdf differ
diff --git a/public/pdfs/roadmaps/java.pdf b/public/pdfs/roadmaps/java.pdf
index 96d775a7c..b41e2f7cb 100644
Binary files a/public/pdfs/roadmaps/java.pdf and b/public/pdfs/roadmaps/java.pdf differ
diff --git a/public/roadmap-content/ai-data-scientist.json b/public/roadmap-content/ai-data-scientist.json
index cd8aaab40..dffb98364 100644
--- a/public/roadmap-content/ai-data-scientist.json
+++ b/public/roadmap-content/ai-data-scientist.json
@@ -42,7 +42,7 @@
     ]
   },
   "mwPJh33MEUQ4Co_LiVEOb": {
-    "title": "Differential Calculus",
+    "title": "Differential Calculus ",
     "description": "",
     "links": [
       {
@@ -330,17 +330,17 @@
     "links": [
       {
         "title": "Advantages and Disadvantages of AI",
-        "url": "https://towardsdatascience.com/advantages-and-disadvantages-of-artificial-intelligence-182a5ef6588c",
+        "url": "https://medium.com/@laners.org/advantages-and-disadvantages-of-artificial-intelligence-cd6e42819b20",
         "type": "article"
       },
       {
         "title": "Reinforcement Learning 101",
-        "url": "https://towardsdatascience.com/reinforcement-learning-101-e24b50e1d292",
+        "url": "https://medium.com/towards-data-science/reinforcement-learning-101-e24b50e1d292",
         "type": "article"
       },
       {
         "title": "Understanding AUC-ROC Curve",
-        "url": "https://towardsdatascience.com/understanding-auc-roc-curve-68b2303cc9c5",
+        "url": "https://medium.com/towards-data-science/understanding-auc-roc-curve-68b2303cc9c5",
         "type": "article"
       }
     ]
diff --git a/public/roadmap-content/ai-engineer.json b/public/roadmap-content/ai-engineer.json
index 1c80bfca2..72880ac2e 100644
--- a/public/roadmap-content/ai-engineer.json
+++ b/public/roadmap-content/ai-engineer.json
@@ -633,7 +633,7 @@
     ]
   },
   "lhIU0ulpvDAn1Xc3ooYz_": {
-    "title": "Bias and Fareness",
+    "title": "Bias and Fairness",
     "description": "Bias and fairness in AI refer to the challenges of ensuring that machine learning models do not produce discriminatory or skewed outcomes. Bias can arise from imbalanced training data, flawed assumptions, or biased algorithms, leading to unfair treatment of certain groups based on race, gender, or other factors. Fairness aims to address these issues by developing techniques to detect, mitigate, and prevent biases in AI systems. Ensuring fairness involves improving data diversity, applying fairness constraints during model training, and continuously monitoring models in production to avoid unintended consequences, promoting ethical and equitable AI use.\n\nLearn more from the following resources:",
     "links": [
       {
diff --git a/public/roadmap-content/api-design.json b/public/roadmap-content/api-design.json
index def48f46c..d5a237da5 100644
--- a/public/roadmap-content/api-design.json
+++ b/public/roadmap-content/api-design.json
@@ -458,8 +458,29 @@
   },
   "O7wjldZ3yTA2s_F-UnJw_": {
     "title": "Rate Limiting",
-    "description": "Rate Limiting is a critical aspect of API Design that dictates the number of API calls a client can make within a specified timeframe. This helps in managing resource allocation, preventing abuse of the API, and maintaining the overall health of the API system. Proper rate limiting measures should be in place to ensure the API's stability, thereby delivering a consistent and reliable service to all consumers. It works primarily by setting a limit on the frequency of client requests, thereby preventing individual users from overloading the system. It is crucial to design and implement rate limiting carefully for maintaining API availability and performance.",
-    "links": []
+    "description": "Rate Limiting is a critical aspect of API Design that dictates the number of API calls a client can make within a specified timeframe. This helps in managing resource allocation, preventing abuse of the API, and maintaining the overall health of the API system. Proper rate limiting measures should be in place to ensure the API's stability, thereby delivering a consistent and reliable service to all consumers. It works primarily by setting a limit on the frequency of client requests, thereby preventing individual users from overloading the system. It is crucial to design and implement rate limiting carefully for maintaining API availability and performance.\n\nLearn more from the following resources:",
+    "links": [
+      {
+        "title": "Rate limit",
+        "url": "https://developer.mozilla.org/en-US/docs/Glossary/Rate_limit",
+        "type": "article"
+      },
+      {
+        "title": "Throttle",
+        "url": "https://developer.mozilla.org/en-US/docs/Glossary/Throttle",
+        "type": "article"
+      },
+      {
+        "title": "Debounce",
+        "url": "https://developer.mozilla.org/en-US/docs/Glossary/Debounce",
+        "type": "article"
+      },
+      {
+        "title": "What is rate limiting? | Rate limiting and bots",
+        "url": "https://www.cloudflare.com/en-gb/learning/bots/what-is-rate-limiting/",
+        "type": "article"
+      }
+    ]
   },
   "20KEgZH6cu_UokqWpV-9I": {
     "title": "Idempotency",
@@ -569,6 +590,11 @@
         "title": "Caching REST API Response",
         "url": "https://restfulapi.net/caching/",
         "type": "article"
+      },
+      {
+        "title": "HTTP caching",
+        "url": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching",
+        "type": "article"
       }
     ]
   },
@@ -709,7 +735,7 @@
     "links": [
       {
         "title": "API Authorization Methods",
-        "url": "https://konghq.com/blog/engineering/common-api-authentication-methods",
+        "url": "https://www.pingidentity.com/en/resources/identity-fundamentals/authorization/authorization-methods.html",
         "type": "article"
       }
     ]
diff --git a/public/roadmap-content/aspnet-core.json b/public/roadmap-content/aspnet-core.json
new file mode 100644
index 000000000..d9171d977
--- /dev/null
+++ b/public/roadmap-content/aspnet-core.json
@@ -0,0 +1,2875 @@
+{
+  "NEnna_8DstfYH4T9qrP3-": {
+    "title": "General Development Skills",
+    "description": "There are several skills that are generally considered to be important for working with .NET and C#:\n\n*   Object-oriented programming: Understanding the concepts of classes, objects, inheritance, and polymorphism is essential for working with C# and the .NET Framework.\n    \n*   C# language: A strong understanding of the C# language, including its syntax, keywords, and built-in classes and types, is necessary for writing efficient and maintainable code.\n    \n*   .NET Framework: Familiarity with the .NET Framework, including the Common Language Runtime (CLR) and the Base Class Library (BCL), is important for understanding how C# code is executed and for utilizing the framework's many built-in features.\n    \n*   Web & Software development: Knowledge of web development technologies such as HTML, CSS, JavaScript, and [ASP.NET](http://ASP.NET) is important for creating web applications using C# and the .NET Framework and knowledge of software development methodologies such as Agile, Scrum, or Waterfall is also useful.\n    \n*   Database: Familiarity with database concepts and technologies, such as SQL and [ADO.NET](http://ADO.NET), is important for working with data in C# applications.\n    \n*   Cloud computing: Familiarity with cloud computing concepts and technologies, such as Azure, is becoming increasingly important for deploying and scaling C# applications.\n    \n*   DevOps: Understanding of DevOps concepts and practices, such as continuous integration and continuous deployment, is necessary for automating and streamlining the software development process.\n    \n\nFor more information, visit the following links:",
+    "links": [
+      {
+        "title": "Explore top posts about Career",
+        "url": "https://app.daily.dev/tags/career?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "Asp.net - Complete Tutorial",
+        "url": "https://www.youtube.com/watch?v=kdPtNMb8tPw",
+        "type": "video"
+      },
+      {
+        "title": "Learn Cloud Computing",
+        "url": "https://www.youtube.com/watch?v=eWwK2FKWp0g",
+        "type": "video"
+      },
+      {
+        "title": "DevOps Course for Beginners",
+        "url": "https://www.youtube.com/watch?v=hQcFE0RD0cQ",
+        "type": "video"
+      }
+    ]
+  },
+  "fxANnSiTb2VzA9u-YeBL1": {
+    "title": "C#",
+    "description": "C# is a modern coding language that was developed by Microsoft that focuses on applying the coding style to C++ and making it so that way it's more condensed and simple. It's similar to Java by both being static, strong, and manifestive languages. Both use the System's prebuilt class to do certain features like printing output to the screen, etc.C#, like Java, also contains a garbage collection, which removes lower-level maintenance code from the programmer.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "C# official website?",
+        "url": "https://learn.microsoft.com/en-us/dotnet/csharp//",
+        "type": "article"
+      },
+      {
+        "title": "The Beginners Guide to C#",
+        "url": "https://www.w3schools.com/CS/index.php",
+        "type": "article"
+      },
+      {
+        "title": "C# Tutorial",
+        "url": "https://www.w3schools.com/cs/index.php",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about C#",
+        "url": "https://app.daily.dev/tags/csharp?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "C# Full Course - Learn C# 10 and .NET 6 in 7 hours",
+        "url": "https://www.youtube.com/watch?v=q_F4PyW8GTg",
+        "type": "video"
+      }
+    ]
+  },
+  "3GGvuxdfuDwLpNX_gtjCK": {
+    "title": ".NET",
+    "description": ".NET (pronounced \"dot net\") is a software framework developed by Microsoft that can be used to create a wide range of applications, including Windows desktop and web applications, mobile apps, and gaming. The .NET Framework provides a large library of pre-built functionality, including collections, file input/output, and networking, that can be used by .NET applications. It also includes a Common Language Runtime (CLR) which manages the execution of code, providing features such as memory management, security, and exception handling.\n\nFor more information, visit the following link:",
+    "links": [
+      {
+        "title": "What is .NET?",
+        "url": "https://dotnet.microsoft.com/en-us/learn/dotnet/what-is-dotnet",
+        "type": "article"
+      },
+      {
+        "title": "An Overview of .NET",
+        "url": "https://auth0.com/blog/what-is-dotnet-platform-overview/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about .NET",
+        "url": "https://app.daily.dev/tags/.net?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "6HJQ1Evgah0Pki04Z2hQt": {
+    "title": ".NET CLI",
+    "description": ".NET CLI is the command-line interface (CLI) for the .NET platform. It is a tool that provides a common interface for running .NET Core command-line tools and utilities. .NET Core is a cross-platform, open-source, and modular version of the .NET framework, and the .NET CLI provides a way to interact with it from the command line.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Microsoft - .NET CLI overview",
+        "url": "https://learn.microsoft.com/en-us/dotnet/core/tools/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about CLI",
+        "url": "https://app.daily.dev/tags/cli?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "Intro To The .NET CLI",
+        "url": "https://youtu.be/RQLzp2Z8-BE",
+        "type": "video"
+      }
+    ]
+  },
+  "NvODRFR0DLINB0RlPSsvt": {
+    "title": "Learn the Basics of C#",
+    "description": "C# (pronounced \"C-sharp\") is a general-purpose, object-oriented programming language developed by Microsoft. It is part of the .NET family of languages and is used to build a wide range of applications, from web and mobile applications to games and cloud services.\n\nC# is a statically-typed language, which means that the type of a variable must be specified when it is declared, and that the type of a value cannot be changed after it has been assigned. C# also supports object-oriented programming, which means that it provides features such as encapsulation, inheritance, and polymorphism.\n\nC# is a popular language for building .NET applications, and it is used by many large companies and organizations, including Microsoft, Dell, and IBM. It is a versatile language that can be used for a wide range of purposes, and it is well-suited for building scalable and maintainable software systems.\n\nVisit the following links for more information:",
+    "links": [
+      {
+        "title": "Introduction to C#",
+        "url": "https://learn.microsoft.com/en-us/dotnet/csharp/tour-of-csharp/tutorials/",
+        "type": "article"
+      },
+      {
+        "title": "Basics Of C#",
+        "url": "https://www.c-sharpcorner.com/UploadFile/e9fdcd/basics-of-C-Sharp/",
+        "type": "article"
+      },
+      {
+        "title": "C# Tutorials",
+        "url": "https://dotnettutorials.net/course/csharp-dot-net-tutorials/",
+        "type": "article"
+      },
+      {
+        "title": "C# tutorials - W3Schools",
+        "url": "https://www.w3schools.com/cs/index.php",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about C#",
+        "url": "https://app.daily.dev/tags/csharp?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "OtdCmkj0SvrGwCUSfm96C": {
+    "title": "Git - Version Control",
+    "description": "[Git](https://git-scm.com/) is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Learn Git with Tutorials, News and Tips - Atlassian",
+        "url": "https://www.atlassian.com/git",
+        "type": "article"
+      },
+      {
+        "title": "Git Cheat Sheet",
+        "url": "https://cs.fyi/guide/git-cheatsheet",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Git",
+        "url": "https://app.daily.dev/tags/git?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "Git & GitHub Crash Course For Beginners",
+        "url": "https://www.youtube.com/watch?v=SWYqp7iY_Tc",
+        "type": "video"
+      }
+    ]
+  },
+  "KAZF-mIg-FlfMonfdOLhb": {
+    "title": "GitHub, GitLab, BitBucket",
+    "description": "There are different repository hosting services with the most famous one being GitHub, GitLab and BitBucket. I would recommend creating an account on GitHub because that is where most of the OpenSource work is done and most of the developers are.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "GitHub: Where the world builds software",
+        "url": "https://github.com",
+        "type": "opensource"
+      },
+      {
+        "title": "GitLab: Iterate faster, innovate together",
+        "url": "https://gitlab.com",
+        "type": "opensource"
+      },
+      {
+        "title": "BitBucket: The Git solution for professional teams",
+        "url": "https://bitbucket.com",
+        "type": "article"
+      }
+    ]
+  },
+  "YI3cAezupWNntFw4B6elY": {
+    "title": "HTTP / HTTPs Protocol",
+    "description": "HTTP is the `TCP/IP` based application layer communication protocol which standardizes how the client and server communicate with each other. It defines how the content is requested and transmitted across the internet.\n\nHTTPS\n=====\n\nHTTPS (**H**ypertext **T**ransfer **P**rotocol **S**ecure) is the secure version of HTTP, which is the primary protocol used to send data between a web browser and a website.\n\n`HTTPS = HTTP + SSL/TLS`\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Everything you need to know about HTTP",
+        "url": "https://cs.fyi/guide/http-in-depth",
+        "type": "article"
+      },
+      {
+        "title": "What is HTTP?",
+        "url": "https://www.cloudflare.com/en-gb/learning/ddos/glossary/hypertext-transfer-protocol-http/",
+        "type": "article"
+      },
+      {
+        "title": "An overview of HTTP",
+        "url": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview",
+        "type": "article"
+      },
+      {
+        "title": "HTTP/3 From A To Z: Core Concepts",
+        "url": "https://www.smashingmagazine.com/2021/08/http3-core-concepts-part1/",
+        "type": "article"
+      },
+      {
+        "title": "What is HTTPS?",
+        "url": "https://www.cloudflare.com/en-gb/learning/ssl/what-is-https/",
+        "type": "article"
+      },
+      {
+        "title": "Why HTTPS Matters",
+        "url": "https://developers.google.com/web/fundamentals/security/encrypt-in-transit/why-https",
+        "type": "article"
+      },
+      {
+        "title": "Enabling HTTPS on Your Servers",
+        "url": "https://web.dev/enable-https/",
+        "type": "article"
+      },
+      {
+        "title": "How HTTPS works (comic)",
+        "url": "https://howhttps.works/",
+        "type": "article"
+      },
+      {
+        "title": "HTTP Crash Course & Exploration",
+        "url": "https://www.youtube.com/watch?v=iYM2zFP3Zn0",
+        "type": "video"
+      }
+    ]
+  },
+  "RAX2xN37taw9cqA3pnORh": {
+    "title": "Data Structures and Algorithms",
+    "description": "As the name indicates, a **Data Structure** is a way of organizing the data in the **memory** so it can be used efficiently. Some common data structures are array, linked list, stack, hashtable, queue, tree, heap, and graph.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Data Structures and Algorithms",
+        "url": "https://www.javatpoint.com/data-structure-tutorial",
+        "type": "article"
+      },
+      {
+        "title": "C# resources",
+        "url": "https://dev.to/adavidoaiei/fundamental-data-structures-and-algorithms-in-c-4ocf",
+        "type": "article"
+      },
+      {
+        "title": "Interview Questions about Data Structures",
+        "url": "https://www.csharpstar.com/csharp-algorithms/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Algorithms",
+        "url": "https://app.daily.dev/tags/algorithms?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "Data Structures Illustrated",
+        "url": "https://www.youtube.com/watch?v=9rhT3P1MDHk&list=PLkZYeFmDuaN2-KUIv-mvbjfKszIGJ4FaY",
+        "type": "video"
+      }
+    ]
+  },
+  "tnKUdsgp6bnFtQTexEmfy": {
+    "title": "Database Fundamentals",
+    "description": "A database is a collection of useful data of one or more related organizations structured in a way to make data an asset to the organization. A database management system is a software designed to assist in maintaining and extracting large collections of data in a timely fashion.\n\nA **Relational database** is a type of database that stores and provides access to data points that are related to one another. Relational databases store data in a series of tables.\n\n**NoSQL databases** offer data storage and retrieval that is modelled differently to \"traditional\" relational databases. NoSQL databases typically focus more on horizontal scaling, eventual consistency, speed and flexibility and is used commonly for big data and real-time streaming applications.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Oracle: What is a Database?",
+        "url": "https://www.oracle.com/database/what-is-database/",
+        "type": "article"
+      },
+      {
+        "title": "Prisma.io: What are Databases?",
+        "url": "https://www.prisma.io/dataguide/intro/what-are-databases",
+        "type": "article"
+      },
+      {
+        "title": "Intro To Relational Databases",
+        "url": "https://www.udacity.com/course/intro-to-relational-databases--ud197",
+        "type": "article"
+      },
+      {
+        "title": "NoSQL Explained",
+        "url": "https://www.mongodb.com/nosql-explained",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Database",
+        "url": "https://app.daily.dev/tags/database?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "What is Relational Database",
+        "url": "https://youtu.be/OqjJjpjDRLc",
+        "type": "video"
+      },
+      {
+        "title": "How do NoSQL Databases work",
+        "url": "https://www.youtube.com/watch?v=0buKQHokLK8",
+        "type": "video"
+      }
+    ]
+  },
+  "aOJMVrTcA_I2y_QHzj7aM": {
+    "title": "SQL Basics",
+    "description": "SQL stands for Structured Query Language. SQL lets you access and manipulate databases SQL became a standard of the American National Standards Institute (ANSI) in 1986, and of the International Organization for Standardization (ISO) in 1987.\n\nAlthough SQL is an ANSI/ISO standard, there are different versions of the SQL language.\n\nHowever, to be compliant with the ANSI standard, they all support at least the major commands (such as SELECT, UPDATE, DELETE, INSERT, WHERE) in a similar manner.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Introduction to SQL",
+        "url": "https://www.w3schools.com/sql/sql_intro.asp",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about SQL",
+        "url": "https://app.daily.dev/tags/sql?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "SQL Tutorial - Full Database Course for Beginners",
+        "url": "https://www.youtube.com/watch?v=HXV3zeQKqGY",
+        "type": "video"
+      }
+    ]
+  },
+  "zlAcgLKxGF_TyrcJIk4X7": {
+    "title": "Database Design Basics",
+    "description": "Database Design is a collection of processes that facilitate the designing, development, implementation and maintenance of enterprise data management systems. Properly designed database are easy to maintain, improves data consistency and are cost effective in terms of disk storage space. The main objectives of database design in DBMS are to produce logical and physical designs models of the proposed database system.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Database design basics",
+        "url": "https://support.microsoft.com/en-us/office/database-design-basics-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Database",
+        "url": "https://app.daily.dev/tags/database?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "Database Design Course",
+        "url": "https://www.youtube.com/watch?v=ztHopE5Wnpc",
+        "type": "video"
+      }
+    ]
+  },
+  "ZiK-c9zNbi5RZkKUi44wP": {
+    "title": "Stored Procedures",
+    "description": "A stored procedure is a pre-compiled collection of SQL statements that can be executed on a database server. Stored procedures are typically used to perform specific tasks, such as retrieving data from a database, inserting or updating data, or performing complex calculations. They are stored on the database server and can be called or executed from a client application or other stored procedures. Stored procedures can improve database performance by reducing the amount of SQL code needed to be executed and allowing developers to reuse common pieces of code. They can also provide security by allowing database administrators to control which users have access to specific stored procedures.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Stored Procedure Tutorial",
+        "url": "https://www.w3schools.com/sql/sql_stored_procedures.asp",
+        "type": "article"
+      },
+      {
+        "title": "Stored Procedure in SQL: Benefits And How to Create It",
+        "url": "https://www.simplilearn.com/tutorials/sql-tutorial/stored-procedure-in-sql",
+        "type": "article"
+      },
+      {
+        "title": "SQL Server stored procedures for beginners",
+        "url": "https://www.sqlshack.com/sql-server-stored-procedures-for-beginners/",
+        "type": "article"
+      }
+    ]
+  },
+  "1-XdtrGPbUoxpu9ZcQlBA": {
+    "title": "Constraints",
+    "description": "Database constraints are rules that are used to limit the data that can be stored in a database table. These constraints can be used to ensure the integrity and accuracy of the data in the table, and they can be used to enforce business rules or other requirements. For example, a constraint might be used to ensure that a column only contains positive numbers, or to ensure that a column always has a unique value. Constraints can be specified at the time a table is created, or they can be added to an existing table. Some common types of constraints include primary keys, foreign keys, and NOT NULL constraints.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "SQL Constraints",
+        "url": "https://www.w3schools.com/sql/sql_constraints.asp",
+        "type": "article"
+      },
+      {
+        "title": "Constraints of SQL",
+        "url": "https://www.educative.io/courses/database-design-fundamentals/m7JnY9Xm6Qp",
+        "type": "article"
+      },
+      {
+        "title": "Constraints in DBMS",
+        "url": "https://beginnersbook.com/2015/04/constraints-in-dbms/",
+        "type": "article"
+      }
+    ]
+  },
+  "2f_CJMnXwPxjMEwm5P_QJ": {
+    "title": "Triggers",
+    "description": "Triggers are special type of stored procedures that are automatically executed in response to specific events that occur within a database. These events can include:\n\n*   Data modification events (INSERT, UPDATE, DELETE) on a specific table or view.\n*   Data definition events (CREATE, ALTER, DROP) on specific database objects such as tables or views.\n*   Logon events (CONNECT, DISCONNECT) that occur when a user connects to or disconnects from the database.\n\nFor more information, visit the following links:",
+    "links": [
+      {
+        "title": "Database Triggers",
+        "url": "https://docs.oracle.com/cd/A57673_01/DOC/server/doc/SCN73/ch15.htm",
+        "type": "article"
+      },
+      {
+        "title": "Database Triggers: Examples & Overview",
+        "url": "https://study.com/academy/lesson/database-triggers-examples-overview.html",
+        "type": "article"
+      },
+      {
+        "title": "What are Triggers in SQL?",
+        "url": "https://www.edureka.co/blog/triggers-in-sql/",
+        "type": "article"
+      },
+      {
+        "title": "What is a SQL Trigger?",
+        "url": "https://www.essentialsql.com/sql-trigger/",
+        "type": "article"
+      }
+    ]
+  },
+  "v2ZTCQQFQPoJNhOVGMG2g": {
+    "title": "ASP.NET Core Basics",
+    "description": "[ASP.NET](http://ASP.NET) Core is a open-source, cross-platform web framework for building modern web applications using .NET. Some of the basics of [ASP.NET](http://ASP.NET) Core are Cross-platform, Open-source, Modular, High performance, MVC pattern, Dependency Injection, Middleware, Razor Pages and Razor Components, EF Core.\n\nFor more information, visit the following resources:",
+    "links": [
+      {
+        "title": "ASP.NET documentation",
+        "url": "https://learn.microsoft.com/en-us/aspnet/core/?view=aspnetcore-7.0",
+        "type": "article"
+      },
+      {
+        "title": "ASP.NET Core Tutorial",
+        "url": "https://www.tutorialspoint.com/asp.net_core/index.htm",
+        "type": "article"
+      },
+      {
+        "title": "Learn ASP.NET Core from Scratch",
+        "url": "https://www.tutorialsteacher.com/core",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about ASP.NET",
+        "url": "https://app.daily.dev/tags/aspnet?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "D3aQw0-pk3ycO-n10HBaA": {
+    "title": "MVC",
+    "description": "MVC is an architectural design pattern used for developing applications, specifically web applications. This pattern separates an application into three main logical components **Model View Controller**. Each architectural component is built to handle specific development aspects of an application.\n\n*   **Model** - Handles all data-related logic. Interacts with Database.\n*   **View** - Handles UI part of the applications (data presentation).\n*   **Controller** - Handles request flow, and acts as an intermediary between view and model.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "MVC Official Documentation",
+        "url": "https://learn.microsoft.com/en-us/aspnet/core/mvc/overview?WT.mc_id=dotnet-35129-website&view=aspnetcore-7.0",
+        "type": "article"
+      },
+      {
+        "title": "ASP.NET MVC Architecture",
+        "url": "https://www.tutorialsteacher.com/mvc/mvc-architecture",
+        "type": "article"
+      },
+      {
+        "title": "MVC Framework - Introduction",
+        "url": "https://www.tutorialspoint.com/mvc_framework/mvc_framework_introduction.htm",
+        "type": "article"
+      }
+    ]
+  },
+  "dZ9fYWMBa1OemTmLOI8_q": {
+    "title": "REST",
+    "description": "REST (Representational State Transfer) is an architectural style for building web services. In the context of .NET, RESTful web services can be created using the [ASP.NET](http://ASP.NET) Web API framework, which allows developers to create HTTP-based services that can be consumed by a wide range of clients, including web browsers and mobile devices. The Web API framework provides a set of tools and libraries for creating RESTful services, including routing, request/response handling, and support for a variety of data formats, such as JSON and XML.\n\nFor more information, visit the following resources:",
+    "links": [
+      {
+        "title": "What is REST Services?",
+        "url": "http://www.codedigest.com/quick-start/16/what-is-rest-services-how-to-create-rest-services-in-aspnet",
+        "type": "article"
+      },
+      {
+        "title": "Restful API In ASP.NET: Introduction of REST & Web API",
+        "url": "https://www.c-sharpcorner.com/UploadFile/4b0136/restful-api-in-Asp-Net-introduction-of-rest-web-api/",
+        "type": "article"
+      },
+      {
+        "title": "What are RESTful APIs",
+        "url": "https://www.pragimtech.com/blog/blazor/what-are-restful-apis/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about REST API",
+        "url": "https://app.daily.dev/tags/rest-api?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "qpVxwuyA2oE06MZLtEdP1": {
+    "title": "Razon Pages",
+    "description": "Razor Pages is a feature of the [ASP.NET](http://ASP.NET) Core framework that allows developers to build web applications using a combination of Razor markup (a markup syntax for defining dynamic HTML) and C# code. Razor Pages is built on top of the [ASP.NET](http://ASP.NET) Core MVC (Model-View-Controller) framework, and provides a simpler, more intuitive way to build web pages and handle user input.\n\nRazor Pages are useful for building simple, self-contained web pages that do not require a complex navigation or layout structure, and are often used for building small to medium-size web applications.\n\nFor more information, visit the following links:",
+    "links": [
+      {
+        "title": "Basics of Razor Pages",
+        "url": "https://www.jetbrains.com/dotnet/guide/tutorials/basics/razor-pages/",
+        "type": "article"
+      },
+      {
+        "title": "Get started with Razor Pages in ASP.NET Core",
+        "url": "https://learn.microsoft.com/en-us/aspnet/core/tutorials/razor-pages/?view=aspnetcore-7.0",
+        "type": "article"
+      },
+      {
+        "title": "What Is Razor Pages?",
+        "url": "https://www.learnrazorpages.com/",
+        "type": "article"
+      }
+    ]
+  },
+  "vePinRjDfSGULKw0LE9K-": {
+    "title": "Razor Components",
+    "description": "Razor Components is a feature of [ASP.NET](http://ASP.NET) Core that allows developers to build reusable, self-contained components that can be used across multiple pages or even multiple applications. Razor Components is built on top of the Razor view engine, which allows developers to define components using a combination of Razor markup and C# code.\n\nRazor Components are useful for building complex, dynamic, and reusable UI elements, such as forms, tables, or dialogs, and can be used to build both small and large-scale web applications.\n\nFor more information, vist the following links:",
+    "links": [
+      {
+        "title": "ASP.NET Core Razor components",
+        "url": "https://learn.microsoft.com/en-us/aspnet/core/blazor/components/?view=aspnetcore-7.0",
+        "type": "article"
+      },
+      {
+        "title": "Core Razor Componets in .NET",
+        "url": "https://www.c-sharpcorner.com/blogs/asp-net-core-razor-componets",
+        "type": "article"
+      },
+      {
+        "title": "What is Core razor components?",
+        "url": "https://www.youtube.com/watch?v=KseDLejhYi0",
+        "type": "video"
+      }
+    ]
+  },
+  "dG--AAcZZdltYCeg6zCz2": {
+    "title": "Middlewares",
+    "description": "Middleware is software that sits between an operating system and application software, and facilitates communication and data exchange between them. In the context of web development, middleware refers to software components that handle requests and responses in a web application. These components are typically executed in a pipeline, with each component performing a specific task, such as authentication, logging, or routing.\n\nIn the [ASP.NET](http://ASP.NET) Core framework, middleware is a key concept that is used to build web applications. Middleware components are added to the application pipeline using the `IApplicationBuilder` interface, and are executed in the order in which they are added. For example, an application might have middleware components for handling authentication, logging, and routing, in that order.\n\nVisit the following links for more resources:",
+    "links": [
+      {
+        "title": "What is Middleware?",
+        "url": "https://www.redhat.com/en/topics/middleware/what-is-middleware",
+        "type": "article"
+      },
+      {
+        "title": "Introduction to Middleware",
+        "url": "https://www.techtarget.com/searchapparchitecture/definition/middleware",
+        "type": "article"
+      },
+      {
+        "title": "What is Middleware in .NET?",
+        "url": "https://www.talend.com/resources/what-is-middleware/",
+        "type": "article"
+      }
+    ]
+  },
+  "U3HXmNq6x2YA3BwZsOTbe": {
+    "title": "Filters and Attributes",
+    "description": "In the [ASP.NET](http://ASP.NET) Core framework, filters and attributes are used to add additional functionality to controllers and action methods, such as authentication, authorization, caching, and exception handling.",
+    "links": []
+  },
+  "EJxliq-HPVp00CVsFc6kf": {
+    "title": "App Settings and Configs",
+    "description": "In the [ASP.NET](http://ASP.NET) Core framework, app settings and configurations refer to the process of storing and managing application-specific settings and configuration data.\n\n*   **App Settings** refers to the key-value pairs of data that an application uses to configure its behavior, such as database connection strings, api keys, or other settings. These settings are typically stored in configuration files, such as `appsettings.json`, `appsettings.development.json`, or `appsettings.production.json`, and can be accessed using the IConfiguration interface.\n    \n*   **Configurations** refer to the process of loading and managing the app settings, including specifying the source of the settings and the format of the configuration files. In [ASP.NET](http://ASP.NET) Core, the `Startup` class is responsible for configuring the application's settings, and typically loads configuration data from various sources, such as JSON files, environment variables, or command-line arguments.\n    \n\nFor more information, visit the following links:",
+    "links": [
+      {
+        "title": "What is Azure App Configuration?",
+        "url": "https://learn.microsoft.com/en-us/azure/azure-app-configuration/overview",
+        "type": "article"
+      },
+      {
+        "title": "What are App Configurations and how do I work with them?",
+        "url": "https://support.procore.com/faq/what-are-app-configurations",
+        "type": "article"
+      },
+      {
+        "title": "Configuration & AppSettings",
+        "url": "https://docs.servicestack.net/appsettings",
+        "type": "article"
+      }
+    ]
+  },
+  "R7Qk5hsEIl9dspQXdaJAJ": {
+    "title": "StyleCop Rules",
+    "description": "StyleCop is a tool used for developers to standardize their code and ensure they all follow the same syntax principles. With StyleCop, one standard can be defined in a `stylecop.json` file and shared across your team so that each member has the same guidelines when formatting your code. Beyond a single project, StyleCop can also be added as an extension, so all of the projects on your IDE follow the same formatting rules, this is especially useful if your organization follows the same rule standards for all projects.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "StyleCop GitHub official page",
+        "url": "https://github.com/StyleCop/StyleCop",
+        "type": "opensource"
+      },
+      {
+        "title": "StyeleCop Analyzers, a more modern version of StyleCop",
+        "url": "https://github.com/DotNetAnalyzers/StyleCopAnalyzers",
+        "type": "opensource"
+      },
+      {
+        "title": "StyleCop: A Detailed Guide to Starting and Using It",
+        "url": "https://blog.submain.com/stylecop-detailed-guide/",
+        "type": "article"
+      },
+      {
+        "title": "The StyleCop setup and Advantages",
+        "url": "https://www.youtube.com/watch?v=dmpOKmz3lPw",
+        "type": "video"
+      }
+    ]
+  },
+  "ipABerBcM9zCte9pYaIse": {
+    "title": "Minimal APIs",
+    "description": "",
+    "links": []
+  },
+  "POQPoN98eqOH2873ZI6Hm": {
+    "title": "Object Relational Mapping",
+    "description": "ORM stands for Object-Relational Mapping, and it is a technique that allows a developer to work with a database using objects. It is a way of abstracting the database so that the developer can think in terms of objects, rather than tables and SQL queries. This can make it easier to write and maintain code, as well as improve the performance of the application.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "ORM (Object Relational Mapping)",
+        "url": "https://www.telerik.com/blogs/dotnet-basics-orm-object-relational-mapping",
+        "type": "article"
+      },
+      {
+        "title": "Understanding Object-Relational Mapping: Pros, Cons",
+        "url": "https://www.altexsoft.com/blog/object-relational-mapping/",
+        "type": "article"
+      }
+    ]
+  },
+  "ET74_7ieahNaGdPT11_NI": {
+    "title": "Entity Framework Core",
+    "description": "Entity Framework Core (EF Core) is an open-source Object-Relational Mapping (ORM) framework for .NET. It is a lightweight, cross-platform version of Entity Framework, the ORM framework that was part of the .NET Framework. EF Core allows developers to work with relational data using domain-specific objects, eliminating the need to write raw SQL statements. Instead, EF Core provides a set of APIs that can be used to interact with a database, providing a simple and efficient way to perform common database operations such as querying, inserting, updating, and deleting data.\n\nFor more information, visit the following links:",
+    "links": [
+      {
+        "title": "Example of Entity Framework Core",
+        "url": "https://learn.microsoft.com/en-us/ef/core/",
+        "type": "article"
+      },
+      {
+        "title": "Entity Framework Core Documentation",
+        "url": "https://learn.microsoft.com/en-us/ef/",
+        "type": "article"
+      },
+      {
+        "title": "What are the Basics of Entity Framework Core?",
+        "url": "https://www.jetbrains.com/dotnet/guide/tutorials/basics/entity-framework-core/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about .NET",
+        "url": "https://app.daily.dev/tags/.net?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "eGVaAz3VhGu3cXBNxTAWd": {
+    "title": "Framework Basics",
+    "description": "An ORM (Object-Relational Mapping) framework is a tool that maps the objects in an application to the database tables, allowing developers to work with the database using familiar, object-oriented concepts.\n\nORM frameworks are tools that map the objects in an application to the database tables, allowing developers to work with the database using familiar, object-oriented concepts such as Entities, Mapping, Context, Queries, Lazy Loading, Change Tracking, and Caching.\n\nFor more resources, visit the following link:",
+    "links": [
+      {
+        "title": "ORM Framework",
+        "url": "https://www.h2kinfosys.com/blog/orm-framework/",
+        "type": "article"
+      },
+      {
+        "title": "What are Frameworks in ORM",
+        "url": "https://www.killerphp.com/articles/what-are-orm-frameworks/",
+        "type": "article"
+      },
+      {
+        "title": "Essentials of ORM Framework",
+        "url": "https://medium.com/@mikependon/the-essentials-of-orm-framework-in-your-software-development-837131efd91b",
+        "type": "article"
+      },
+      {
+        "title": "ORM Frameworks – What is an Object-Relational Mapping Framework",
+        "url": "https://onlinecode.org/what-are-orm-frameworks/",
+        "type": "article"
+      }
+    ]
+  },
+  "ZPeebwJ3OBuywEgLLgQTG": {
+    "title": "Code First + Migrations",
+    "description": "Code First Migrations is a feature of Entity Framework that enables you to change the model classes in your application and then propagate those changes to the database. When you use Code First Migrations, Entity Framework generates the necessary SQL commands to update the database schema to match the model classes.\n\nTo use Code First Migrations, you need to enable it in your Entity Framework application. This can be done by adding a reference to the Entity Framework Migrations NuGet package, and then enabling Migrations in your application.\n\nOnce Migrations is enabled, you can use the Package Manager Console to add a new migration to your application. This will generate a class that contains the necessary SQL commands to update the database schema. You can then use the Update-Database command to apply the migration to the database.",
+    "links": [
+      {
+        "title": "What is a Code First Migration?",
+        "url": "https://www.entityframeworktutorial.net/code-first/what-is-code-first.aspx",
+        "type": "article"
+      },
+      {
+        "title": "Example for Code First Migrations",
+        "url": "https://learn.microsoft.com/en-us/ef/ef6/modeling/code-first/migrations/",
+        "type": "article"
+      },
+      {
+        "title": "Code First Migrations in Entity Framework",
+        "url": "https://www.c-sharpcorner.com/UploadFile/26b237/code-first-migrations-in-entity-framework/",
+        "type": "article"
+      }
+    ]
+  },
+  "9AMotSwdEbB8uOg80SykE": {
+    "title": "Lazy, Eager, Explicit Loading",
+    "description": "Eager Loading\n-------------\n\nEager Loading helps you to load all your needed entities at once; i.e., all your child entities will be loaded at single database call. This can be achieved, using the Include method, which returns the related entities as a part of the query and a large amount of data is loaded at once.\n\nLazy Loading\n------------\n\nIt is the default behavior of an Entity Framework, where a child entity is loaded only when it is accessed for the first time. It simply delays the loading of the related data, until you ask for it.\n\nVisit the following links for more resources:",
+    "links": [
+      {
+        "title": "Eager Loading & Lazy Loading",
+        "url": "https://www.c-sharpcorner.com/article/eager-loading-lazy-loading-and-explicit-loading-in-entity-framework/",
+        "type": "article"
+      },
+      {
+        "title": "Difference between Eager and Lazy Loading",
+        "url": "https://stackoverflow.com/questions/31366236/lazy-loading-vs-eager-loading",
+        "type": "article"
+      },
+      {
+        "title": "Working With Lazy & Eager Loading in Entity Framework",
+        "url": "https://dzone.com/articles/working-with-lazy-loading-and-eager-loading-in-ent",
+        "type": "article"
+      }
+    ]
+  },
+  "wfEOvAkGXkTZGdGX341D4": {
+    "title": "Change Tracker API",
+    "description": "The Change Tracker API is a feature of ORM (Object-Relational Mapping) frameworks, such as Entity Framework Core, that allows developers to track changes to entities and automatically persist them to the database.\n\nThe Change Tracker API is typically exposed through the context class, which is the main class that manages the connection to the database and provides access to the entities.\n\nWhen an entity is retrieved from the database, the Change Tracker API marks it as \"unchanged\". When a property of the entity is modified, the Change Tracker API marks the entity as \"modified\". And when a new entity is added to the context, the Change Tracker API marks it as \"added\". For more resources, visit the following links:",
+    "links": [
+      {
+        "title": "Change Tracking in EF Core",
+        "url": "https://learn.microsoft.com/en-us/ef/core/change-tracking/",
+        "type": "article"
+      },
+      {
+        "title": "Intro to Change Tracking",
+        "url": "https://www.oreilly.com/library/view/programming-entity-framework/9781449331825/ch05.html",
+        "type": "article"
+      },
+      {
+        "title": "ChangeTracker in Entity Framework Core",
+        "url": "https://www.entityframeworktutorial.net/efcore/changetracker-in-ef-core.aspx",
+        "type": "article"
+      }
+    ]
+  },
+  "UkWc41r0bZ1lptjse3As6": {
+    "title": "Dapper",
+    "description": "Dapper is a lightweight object-relational mapper (ORM) for the .NET framework. It is designed to provide fast and simple access to data stored in a database, by mapping the data to objects in the application.\n\nDapper helps you to write efficient and concise code for interacting with databases, without the need for a full-featured ORM like Entity Framework. It provides a set of extension methods for the IDbConnection interface, which you can use to execute SQL queries and map the results to strongly-typed objects.\n\nTo learn more about Dapper, you can visit the following links:",
+    "links": [
+      {
+        "title": "The official Dapper website",
+        "url": "https://github.com/StackExchange/Dapper",
+        "type": "opensource"
+      },
+      {
+        "title": "The Dapper Documentation",
+        "url": "https://dapper-tutorial.net",
+        "type": "article"
+      }
+    ]
+  },
+  "tYDVcnG0oUF3R8DwASvAh": {
+    "title": "RepoDB",
+    "description": "RepoDB is an open-source ORM (Object-Relational Mapping) library for .NET that simplifies the process of working with databases. It is a lightweight, fast, and easy-to-use library that provides a simple and consistent API for performing common database operations such as querying, inserting, updating, and deleting data.\n\nRepoDb is built on top of [ADO.NET](http://ADO.NET), which is the native data access technology in .NET, and provides a higher-level abstraction on top of it. This allows RepoDb to take advantage of the performance and scalability of [ADO.NET](http://ADO.NET) while providing a simpler and more convenient API for developers.\n\nFor more information, visit the following links:",
+    "links": [
+      {
+        "title": "Get Started with RepoDB",
+        "url": "https://repodb.net/",
+        "type": "article"
+      },
+      {
+        "title": "Complete Guide to RepoDB",
+        "url": "https://medium.com/nerd-for-tech/everything-you-need-to-know-about-repodb-23cd4b9939c1",
+        "type": "article"
+      },
+      {
+        "title": "Why Choose RepoDB?",
+        "url": "https://blog.devgenius.io/why-choose-repodb-orm-over-dapper-da87432c7830",
+        "type": "article"
+      }
+    ]
+  },
+  "z24IJndpQYTl1PhiUI2mx": {
+    "title": "NHibernate",
+    "description": "NHibernate is an open-source Object-Relational Mapping (ORM) framework for .NET. It is a powerful and flexible framework that can greatly simplify working with relational data in .NET. NHibernate is similar to other ORM frameworks such as Entity Framework and RepoDb in that it provides a higher-level abstraction on top of the underlying data access technology ([ADO.NET](http://ADO.NET) in this case) and allows developers to work with data using domain-specific objects, eliminating the need to write raw SQL statements.\n\nNHibernate uses the concept of \"mapping files\" which are XML files that define how the classes in the application map to the tables and columns in the database. These mapping files are used to create a conceptual model of the data in the form of classes, and then NHibernate uses this model to generate the SQL statements necessary to interact with the database.\n\nFor more information, visit the following links:",
+    "links": [
+      {
+        "title": "What is Nhibernate?",
+        "url": "https://www.partech.nl/en/publications/2021/08/what-is-nhibernate-and-how-is-it-different-from-entity-framework",
+        "type": "article"
+      },
+      {
+        "title": "NHibernate - ORM",
+        "url": "https://www.tutorialspoint.com/nhibernate/nhibernate_orm.htm",
+        "type": "article"
+      },
+      {
+        "title": "Get Started with NHibernate",
+        "url": "https://nhibernate.info/",
+        "type": "article"
+      }
+    ]
+  },
+  "IejHMMVKwA0sIInla4FjX": {
+    "title": "Dependency Injection",
+    "description": "Dependency injection (DI) is a software design pattern that is used to manage the dependencies of an application. It is a technique that allows developers to write loosely-coupled code, by separating the responsibility of creating and managing objects from the objects themselves.\n\nIn a typical implementation, a DI container is used to manage the dependencies of the application. The container is responsible for creating and managing instances of objects and their dependencies, and providing them to other objects as needed.\n\nThere are different types of dependency injection, such as Constructor injection, Property injection, and Method injection, which can be used depending on the requirement and the design of the application. Visit the following links for more resources:",
+    "links": [
+      {
+        "title": "What is Dependency Injection?",
+        "url": "https://stackoverflow.com/questions/130794/what-is-dependency-injection",
+        "type": "article"
+      },
+      {
+        "title": "Dependency Injection, It's Definition & principles",
+        "url": "https://www.growin.com/blog/what-is-dependency-injection/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Dependency Injection",
+        "url": "https://app.daily.dev/tags/dependency-injection?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "f212ztDU_kb7gO71Nn76L": {
+    "title": "Scrutor",
+    "description": "Scrutor is an open-source library for .NET that extends the functionality of the built-in dependency injection framework in .NET Core. It provides a set of extension methods for the `IServiceCollection` interface, which can be used to register and configure services in a more convenient and flexible way.\n\nOne of the main features of Scrutor is its ability to automatically scan assemblies for services and register them with the dependency injection container, allowing you to avoid having to manually register each service one by one. It also provides a fluent API that makes it easy to configure services, such as specifying the lifetime of a service, adding decorators, and more.\n\nFor more information, visit the following resources:",
+    "links": [
+      {
+        "title": "How to use Scrutor in ASP.Net Core?",
+        "url": "https://www.infoworld.com/article/3321356/how-to-use-scrutor-in-aspnet-core.html",
+        "type": "article"
+      },
+      {
+        "title": "Complete Guide to Scrutor",
+        "url": "https://andrewlock.net/using-scrutor-to-automatically-register-your-services-with-the-asp-net-core-di-container/",
+        "type": "article"
+      }
+    ]
+  },
+  "Tjaczp2E-cCn0qSv89xgo": {
+    "title": "Life Cycles",
+    "description": "In [ASP.NET](http://ASP.NET), dependency injection (DI) lifecycles determine the lifetime of objects that are resolved through the DI container. There are several predefined lifecycle options in the `Microsoft.Extensions.DependencyInjection` library, including:\n\n*   **Transient:** A new instance of the object is created every time it is requested.\n*   **Scoped:** A new instance of the object is created for each request within the same scope.\n*   **Singleton:** A single instance of the object is created and shared across the entire application.\n\nAdditionally, you can also create a custom lifecycle by implementing the `Microsoft.Extensions.DependencyInjection.IServiceScopeFactory` interface\n\nFor more resources, visit the following links:",
+    "links": [
+      {
+        "title": "What are Service Life Cyles in ASP.NET Core?",
+        "url": "https://endjin.com/blog/2022/09/service-lifetimes-in-aspnet-core",
+        "type": "article"
+      },
+      {
+        "title": "Learn Service Lifetimes in .NET Core",
+        "url": "https://henriquesd.medium.com/dependency-injection-and-service-lifetimes-in-net-core-ab9189349420",
+        "type": "article"
+      },
+      {
+        "title": "Complete Guide to Dependency Injection Lifecycles",
+        "url": "https://www.youtube.com/watch?v=wA5bPsv2CLA",
+        "type": "video"
+      }
+    ]
+  },
+  "iM760f8Ys66-VSkMiZfIX": {
+    "title": "DI Containers",
+    "description": "A dependency injection (DI) container is a software component that is responsible for managing the dependencies of an application. It is used to create and manage instances of objects and their dependencies, and is particularly useful for implementing the Dependency Inversion Principle in software development.\n\nA DI container typically consists of two main parts: a configuration API, which is used to register the types and their dependencies, and a resolution API, which is used to retrieve instances of the registered types. The DI container automatically resolves the dependencies of the objects it creates, and manages the lifetime of the objects and their dependencies.\n\nFor more information, visit the following links:",
+    "links": [
+      {
+        "title": "What is DI Container?",
+        "url": "https://www.dotnettricks.com/learn/dependencyinjection/what-is-ioc-container-or-di-container",
+        "type": "article"
+      },
+      {
+        "title": "Getting Started with DI Container",
+        "url": "https://stackoverflow.com/questions/50718586/what-is-a-di-container",
+        "type": "article"
+      },
+      {
+        "title": "How to Use DI Container?",
+        "url": "https://learn.userfrosting.com/services/the-di-container",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Containers",
+        "url": "https://app.daily.dev/tags/containers?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "J9XdYLo7qJiBoL8p3c68P": {
+    "title": "Microsoft.Extensions",
+    "description": "Microsoft.Extensions.DependencyInjection is a dependency injection framework that is part of the Microsoft.Extensions.DependencyInjection NuGet package. It is used to create and manage instances of objects and their dependencies, and is particularly useful for implementing the Dependency Inversion Principle in .NET applications.\n\nThe package provides a simple and consistent API for registering services and resolving dependencies, which can be used to configure and manage the lifetime of objects in an application. It also provides built-in support for various types of service lifetime, such as transient, singleton and scoped.\n\nFor more information, visit the following links:",
+    "links": [
+      {
+        "title": "Guide to Microsoft Extensions Dependency Injection",
+        "url": "https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.dependencyinjection?view=dotnet-plat-ext-7.0",
+        "type": "article"
+      },
+      {
+        "title": "Exploring the Microsoft.Extensions.DependencyInjection",
+        "url": "https://www.codeproject.com/Articles/5339241/Exploring-the-Microsoft-Extensions-DependencyInjec",
+        "type": "article"
+      },
+      {
+        "title": "How to use Microsoft.Extensions.DependencyInjection",
+        "url": "https://stackoverflow.com/questions/53825155/how-can-i-use-microsoft-extensions-dependencyinjection-in-an-net-core-console-a",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Microsoft",
+        "url": "https://app.daily.dev/tags/microsoft?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "gbpSbjF12dBE1Tb3PX8Bz": {
+    "title": "AutoFac",
+    "description": "Autofac is an open-source dependency injection framework for .NET. It is designed to make it easier to manage the dependencies of an application by automatically resolving and managing the lifetime of objects and their dependencies.\n\nAutofac uses a technique called \"component registration\" to define the objects and dependencies of an application. This is done by creating instances of the `ContainerBuilder` class and using its methods to register types, instances and factories. Then, the `Build()` method is called to create an instance of the `IContainer` interface, which can be used to resolve dependencies throughout the application.\n\nVisit the following resources for more information:",
+    "links": [
+      {
+        "title": "Autofac’s Documentation",
+        "url": "https://autofac.readthedocs.io/en/latest/",
+        "type": "article"
+      },
+      {
+        "title": "Getting started with Autofac",
+        "url": "https://autofac.org/",
+        "type": "article"
+      },
+      {
+        "title": "Dependency Injection with Autofac",
+        "url": "https://www.codeproject.com/Articles/25380/Dependency-Injection-with-Autofac",
+        "type": "article"
+      }
+    ]
+  },
+  "M3BW_63MFQyD8NE68dazD": {
+    "title": "Scoped",
+    "description": "Scoped lifetime is a type of dependency injection that creates a new instance of an object for each unique request, but reuses the same instance for the same request. This means that if multiple components within the same request depend on the same service, they will all receive the same instance. However, if another request is made, a new instance of the service will be created for that request.\n\nScoped lifetime is useful when you have services that are specific to a given request, such as a request-scoped database context. This allows you to have a separate and isolated instance of a service for each unique request, which can help to prevent cross-request contamination of data and improve performance.\n\nFor more information, visit the following resources:",
+    "links": [
+      {
+        "title": "Dependency Injection - What is Scope?",
+        "url": "https://javaranch.com/journal/2008/10/dependency-injection-what-is-scope.html",
+        "type": "article"
+      },
+      {
+        "title": "Effective Dependency Injection Scoping",
+        "url": "https://medium.com/android-news/effective-dependency-injection-scoping-4bac813d4491",
+        "type": "article"
+      }
+    ]
+  },
+  "-N0XM0-VtCZ6QMo2YyMD-": {
+    "title": "Transient",
+    "description": "Transient lifetime is a type of dependency injection that creates a new instance of an object each time it is requested. This means that if multiple components within the same request or across different requests depend on the same service, they will each receive a new instance of the service.\n\nTransient lifetime is useful when you have services that are stateless and do not need to maintain any data between requests, such as a service that performs a simple calculation or returns data from a database.\n\nFor more information:",
+    "links": [
+      {
+        "title": "What are Transient Dependencies?",
+        "url": "https://blazor-university.com/dependency-injection/dependency-lifetimes-and-scopes/transient-dependencies/",
+        "type": "article"
+      },
+      {
+        "title": "Dependency Injection Lifetime",
+        "url": "https://www.tektutorialshub.com/asp-net-core/asp-net-core-dependency-injection-lifetime/",
+        "type": "article"
+      },
+      {
+        "title": "Dependency Injection Explained with Transient",
+        "url": "https://www.youtube.com/watch?v=NkTF_6IQPiY",
+        "type": "video"
+      }
+    ]
+  },
+  "y9bDrCjkDbxSIrEEtu_Mi": {
+    "title": "Singleton",
+    "description": "Singleton lifetime is a type of dependency injection that creates a single instance of an object and reuses it throughout the lifetime of the application. This means that if multiple components within the same request or across different requests depend on the same service, they will all receive the same instance of the service.\n\nSingleton lifetime is useful when you have services that need to maintain state or shared data across requests, such as a service that caches data or maintains a connection to a resource.\n\nFor more information:",
+    "links": [
+      {
+        "title": "What are Singleton Dependencies?",
+        "url": "https://blazor-university.com/dependency-injection/dependency-lifetimes-and-scopes/transient-dependencies/",
+        "type": "article"
+      },
+      {
+        "title": "Dependency Injection Lifetime",
+        "url": "https://www.tektutorialshub.com/asp-net-core/asp-net-core-dependency-injection-lifetime/",
+        "type": "article"
+      },
+      {
+        "title": "Dependency Injection Explained with Singleton",
+        "url": "https://www.youtube.com/watch?v=NkTF_6IQPiY",
+        "type": "video"
+      }
+    ]
+  },
+  "7Nth4LOrM_KirhvjDGkgS": {
+    "title": "Caching",
+    "description": "Caching is a technique of storing frequently used data or information in a local memory, for a certain time period. So, next time, when the client requests the same information, instead of retrieving the information from the database, it will give the information from the local memory. The main advantage of caching is that it improves the performance by reducing the processing burden.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Caching in ASP.Net",
+        "url": "https://www.c-sharpcorner.com/UploadFile/2072a9/caching-in-Asp-Net/",
+        "type": "article"
+      },
+      {
+        "title": "Overview of caching in ASP.NET Core",
+        "url": "https://learn.microsoft.com/en-us/aspnet/core/performance/caching/overview?view=aspnetcore-7.0",
+        "type": "article"
+      },
+      {
+        "title": "Intro to Data Caching in ASP.NET",
+        "url": "https://www.tutorialspoint.com/asp.net/asp.net_data_caching.htm",
+        "type": "article"
+      }
+    ]
+  },
+  "8CRsr7UZszjc_fZ-4ZmIx": {
+    "title": "Memory Cache",
+    "description": "Memory caching (often simply referred to as caching) is a technique in which computer applications temporarily store data in a computer’s main memory (i.e., random access memory, or RAM) to enable fast retrievals of that data. The RAM that is used for the temporary storage is known as the cache.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Cache in-memory in ASP.NET Core",
+        "url": "https://learn.microsoft.com/en-us/aspnet/core/performance/caching/memory?view=aspnetcore-7.0",
+        "type": "article"
+      },
+      {
+        "title": "What is Memory Caching?",
+        "url": "https://hazelcast.com/glossary/memory-caching/",
+        "type": "article"
+      },
+      {
+        "title": "Intro to In-Memory Caching in C#",
+        "url": "https://www.youtube.com/watch?v=2jj2wH60QuE",
+        "type": "video"
+      }
+    ]
+  },
+  "FV4GsPjUyAc99DnIwkkCC": {
+    "title": "Entity Framework 2nd Level Cache",
+    "description": "Entity Framework Core(EF Core) is a cross-platform version of the popular Entity Framework data access technology that is lightweight, extendable, and open source. It can be used as an object-relational mapper (O/RM), which can Allow .NET developers to use .NET objects to interact with a database and Removes the requirement for most of the data-access code that is generally required.\n\nHowever, during peak loads, high-transaction .NET Core apps using EF Core have performance and scalability problems in the database tier. This is because, although you can scale the application layer by adding more application servers, you can't scale the database tier by adding more database servers.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Entity Framework 2nd Level Cache",
+        "url": "https://www.gridgain.com/docs/latest/developers-guide/net-specific/net-entity-framework-cache",
+        "type": "article"
+      },
+      {
+        "title": "Caching In Entity Framework",
+        "url": "https://www.c-sharpcorner.com/article/caching-in-entity-framework-ef-core-using-ncache/",
+        "type": "article"
+      },
+      {
+        "title": "What is Entity Framework?",
+        "url": "https://www.youtube.com/watch?v=Z7713GBhi4k",
+        "type": "video"
+      }
+    ]
+  },
+  "SiG0FWWznjDg-2mIWlchy": {
+    "title": "Distributed Cache",
+    "description": "A distributed cache is a cache shared by multiple app servers, typically maintained as an external service to the app servers that access it. A distributed cache can improve the performance and scalability of an [ASP.NET](http://ASP.NET) Core app, especially when the app is hosted by a cloud service or a server farm.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Distributed caching in ASP.NET Core",
+        "url": "https://learn.microsoft.com/en-us/aspnet/core/performance/caching/distributed?view=aspnetcore-7.0",
+        "type": "article"
+      },
+      {
+        "title": "What is a Distributed Cached?",
+        "url": "https://hazelcast.com/glossary/distributed-cache/",
+        "type": "article"
+      },
+      {
+        "title": "Distributed Caching In ASP.NET Core With Redis",
+        "url": "https://www.youtube.com/watch?v=Tt5zIKVMMbs",
+        "type": "video"
+      }
+    ]
+  },
+  "u2pc3ZkL0EumAsbM12D5y": {
+    "title": "Memcached",
+    "description": "Memcached is an open-source, high-performance, distributed memory object caching system which helps in reducing database load. It maintains data as an in-memory key-value store for small chunks of arbitrary data (strings, objects) which can be result of API calls, database reads and so on.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Using Memcached as Distributed Cache in .NET Core",
+        "url": "https://dotnetcorecentral.com/blog/using-memcached-as-distributed-cache-in-net-core/",
+        "type": "article"
+      },
+      {
+        "title": "Intro to Memcached",
+        "url": "https://memcached.org/",
+        "type": "article"
+      },
+      {
+        "title": "Memcached as Distributed Cache in .Net Core Application",
+        "url": "https://www.youtube.com/watch?v=yQ8Kwx9M_Hg",
+        "type": "video"
+      }
+    ]
+  },
+  "Ts0gJ4DdwFp48LGr4YSvM": {
+    "title": "Redis",
+    "description": "Redis is an open source (BSD licensed) which is an in-memory data structure store used as a database, cache, message broker, and streaming engine. Redis provides data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams. Redis has built-in replication, Lua scripting, LRU eviction, transactions, and various levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.\n\nYou can use Redis in many programming languages. It is such a popular and widely used cache that Microsoft Azure also provides its cloud-based version with the name Azure Cache for Redis.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Learn how to build with Redis Stack and .NET",
+        "url": "https://redis.io/docs/stack/get-started/tutorials/stack-dotnet/",
+        "type": "article"
+      },
+      {
+        "title": "Redis Cache In ASP.NET 6.0 Web API",
+        "url": "https://www.c-sharpcorner.com/article/easily-use-redis-cache-in-asp-net-6-0-web-api/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Redis",
+        "url": "https://app.daily.dev/tags/redis?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "ASP.Net Core Distributed Caching - Redis Caching",
+        "url": "https://www.youtube.com/watch?v=4Br-QnBo6Yw",
+        "type": "video"
+      }
+    ]
+  },
+  "Ujzn_dILCA7xoupnz398l": {
+    "title": "Databases",
+    "description": "In an [ASP.NET](http://ASP.NET) application, there are several types of databases that can be used to store and retrieve data. Some of the most commonly used databases include:\n\n*   Relational databases\n*   NoSQL databases\n*   In-memory databases\n*   Embedded databases\n*   Cloud-based databases\n\nEach database type has its own set of features and use cases, and the choice of which database to use will depend on the specific requirements of the application.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "ASP.NET Database Tutorial",
+        "url": "https://www.guru99.com/insert-update-delete-asp-net.html",
+        "type": "article"
+      },
+      {
+        "title": "Introduction to Working with a Database in ASP.NET",
+        "url": "https://learn.microsoft.com/en-us/aspnet/web-pages/overview/data/5-working-with-data",
+        "type": "article"
+      },
+      {
+        "title": "ASP.NET Web Pages - Databases",
+        "url": "https://www.w3schools.com/asp/webpages_database.asp",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Backend Development",
+        "url": "https://app.daily.dev/tags/backend?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "6p5atMYw3b3bXkQuXZsDV": {
+    "title": "Search Engines",
+    "description": "A search engine in an [ASP.NET](http://ASP.NET) application is a tool or module that allows users to search for and retrieve specific information from the application's database or other data sources. Search engines can be used to perform full-text search, faceted search, and geospatial search, among other things.\n\nSearch engines can be integrated into an [ASP.NET](http://ASP.NET) application by using libraries or frameworks that provide a .NET client for interacting with the search engine. Some popular search engines that can be integrated with an [ASP.NET](http://ASP.NET) application include Elasticsearch, Apache Solr, Sphinx, and Microsoft Azure Search.\n\nTo learn more, visit the following resources:",
+    "links": [
+      {
+        "title": "Search Engine Optimization with ASP.NET",
+        "url": "https://learn.microsoft.com/en-us/archive/msdn-magazine/2009/september/search-engine-optimization-with-asp-net-4-0-visual-studio-2010-and-iis7",
+        "type": "article"
+      },
+      {
+        "title": "Creating an ASP.NET Search Engine",
+        "url": "https://www.developerfusion.com/article/4389/create-a-site-search-engine-in-aspnet/",
+        "type": "article"
+      },
+      {
+        "title": "Simple Search Engine in ASP.NET",
+        "url": "https://www.youtube.com/watch?v=KTkubhS-u50",
+        "type": "video"
+      }
+    ]
+  },
+  "mK9OAwjReZoQZr1WSLRKJ": {
+    "title": "Elastic Search",
+    "description": "Elasticsearch is a distributed, open-source search and analytics engine that can be used to index, search, and analyze large volumes of data quickly and in near real-time. It is built on top of the Apache Lucene library and can be used to perform full-text search, faceted search, and geospatial search, among other things.\n\nIn an [ASP.NET](http://ASP.NET) application, Elasticsearch can be integrated as a search engine to provide advanced search functionality to the application. There are several libraries available for integrating Elasticsearch with an [ASP.NET](http://ASP.NET) application, such as Nest and [Elasticsearch.Net](http://Elasticsearch.Net). These libraries provide a .NET client for Elasticsearch, which can be used to interact with the Elasticsearch engine from within an [ASP.NET](http://ASP.NET) application. To learn more, visit the following resources:",
+    "links": [
+      {
+        "title": "Elasticsearch in ASP.NET Core",
+        "url": "https://code-maze.com/elasticsearch-aspnet-core/",
+        "type": "article"
+      },
+      {
+        "title": "An Elasticsearch Tutorial for .NET Developers",
+        "url": "https://www.toptal.com/dot-net/elasticsearch-dot-net-developers",
+        "type": "article"
+      },
+      {
+        "title": "How to integrate ElasticSearch in ASP.NET?",
+        "url": "https://blexin.com/en/blog-en/how-to-integrate-elasticsearch-in-asp-net-core/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about ELK",
+        "url": "https://app.daily.dev/tags/elk?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "2sY_p_8cOOBmZtDHO2Cmy": {
+    "title": "Solr",
+    "description": "Apache Solr is a search engine platform based on the Apache Lucene library. It is a standalone enterprise search server that provides a REST-like API for indexing, searching, and updating documents. Solr can be used to perform full-text search, faceted search, and geospatial search, among other things.\n\nSolr can be useful in [ASP.NET](http://ASP.NET) application to provide advanced search capabilities, such as full-text search, faceted search and geospatial search, which can be useful in e-commerce, content management systems, and logging and monitoring applications. It is known for its scalability, performance and its ability to handle large volumes of data with complex queries.\n\nFor more information, visit the following resources:",
+    "links": [
+      {
+        "title": "Guide to Solr in ASP.NET",
+        "url": "https://www.codeproject.com/Tips/480091/Using-Solr-for-Search-with-NET-Csharp",
+        "type": "article"
+      },
+      {
+        "title": "How to get Started with Solr.NET?",
+        "url": "https://stackoverflow.com/questions/5646615/how-to-get-started-with-solr-net",
+        "type": "article"
+      },
+      {
+        "title": "Integrate Solr Instance With .NET Core",
+        "url": "https://stacksecrets.com/dot-net-core/integrate-solr-instance-with-net-core",
+        "type": "article"
+      }
+    ]
+  },
+  "Ye9WHfwZa-Fc2YDaTCmU1": {
+    "title": "Sphinx",
+    "description": "Sphinx is an open-source full-text search engine that can be used to index, search and analyze large volumes of data quickly and in near real-time. It is designed to handle high-traffic websites and large data sets and can be used for full-text search, faceted search, and geospatial search.\n\nIn an [ASP.NET](http://ASP.NET) application, Sphinx can be integrated as a search engine to provide advanced search functionality to the application. There are several libraries available for integrating Sphinx with an [ASP.NET](http://ASP.NET) application, such as [SphinxQL.NET](http://SphinxQL.NET) and SphinxClient. These libraries provide a .NET client for Sphinx, which can be used to interact with the Sphinx engine from within an [ASP.NET](http://ASP.NET) application.\n\nFor more information, visit the following links:",
+    "links": [
+      {
+        "title": "Overview of Sphinx in ASP.NET",
+        "url": "https://www.sphinxconnector.net/",
+        "type": "article"
+      },
+      {
+        "title": "Intro to Sphinx",
+        "url": "http://sphinxsearch.com/forum/view.html?id=3609",
+        "type": "article"
+      },
+      {
+        "title": "Documentation of Sphinx in ASP.NET",
+        "url": "https://www.ericholscher.com/blog/2016/jul/1/sphinx-and-rtd-for-writers/",
+        "type": "article"
+      }
+    ]
+  },
+  "LrjmJs6_rXUkc2A7fEq24": {
+    "title": "Cloud",
+    "description": "Cloud in the context of [ASP.NET](http://ASP.NET) refers to the use of cloud computing services to host and run [ASP.NET](http://ASP.NET) web applications. Cloud computing is a model of delivering computing resources (such as servers, storage, and applications) over the internet on a pay-per-use basis.\n\nIn the case of [ASP.NET](http://ASP.NET), cloud providers such as Microsoft Azure, Amazon Web Services (AWS), and Google Cloud Platform (GCP) offer services specifically tailored to host and run [ASP.NET](http://ASP.NET) web applications. These services include virtual machines, web roles, and serverless computing, which can be used to deploy and run [ASP.NET](http://ASP.NET) web applications in the cloud.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "Building a .NET Cloud Application",
+        "url": "https://www.c-sharpcorner.com/article/building-the-net-cloud-application/",
+        "type": "article"
+      },
+      {
+        "title": "How to make a .NET Cloud Application?",
+        "url": "https://dotnet.microsoft.com/en-us/apps/cloud",
+        "type": "article"
+      },
+      {
+        "title": "Getting started with Cloud",
+        "url": "https://aws.amazon.com/free/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Cloud",
+        "url": "https://app.daily.dev/tags/cloud?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "KrkV1w9b_Nwm6pe9diDRS": {
+    "title": "Cosmos DB",
+    "description": "For more information, visit the following resources:",
+    "links": [
+      {
+        "title": "What is Azure Cosmos DB?",
+        "url": "https://intellipaat.com/blog/what-is-azure-cosmos-db/",
+        "type": "article"
+      },
+      {
+        "title": "Cosmos DB, Its Features, Benefits, Pricing etc",
+        "url": "https://stackify.com/what-is-azure-cosmos-db/",
+        "type": "article"
+      },
+      {
+        "title": "Getting started with Cosmos DB",
+        "url": "https://acloudguru.com/blog/engineering/azure-cosmos-db-lets-you-focus-on-the-good-stuff",
+        "type": "article"
+      }
+    ]
+  },
+  "1Om9aQDZmnj_DN10ogwDL": {
+    "title": "Dynamo DB",
+    "description": "Amazon DynamoDB is a fully-managed, NoSQL database service provided by Amazon Web Services (AWS) that can be used to store and retrieve large amounts of data. It is a highly-scalable, fast, and flexible NoSQL database service that supports both document and key-value data models.\n\nDynamoDB is designed to handle extremely high levels of read and write throughput, and it automatically scales to accommodate the traffic of an application. It also provides built-in support for data replication, allowing data to be automatically spread across multiple availability zones for increased durability and availability.\n\nFor more information, visit the following links:",
+    "links": [
+      {
+        "title": "Getting started with DynamoDB",
+        "url": "https://aws.amazon.com/dynamodb/",
+        "type": "article"
+      },
+      {
+        "title": "Introduction to DynamoDB",
+        "url": "https://cloudacademy.com/lab/introduction-dynamodb/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about AWS DynamoDB",
+        "url": "https://app.daily.dev/tags/aws-dynamodb?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "FnRxRY3uDZdTve1w-nBfc": {
+    "title": "Relational",
+    "description": "A relational database is a type of database that stores data in a structured format, using tables and relationships between them. It is based on the relational model, which organizes data into one or more tables, with each table consisting of a set of rows and columns.\n\nThe main feature of a relational database is the ability to establish relationships between tables, using a feature called a foreign key. A foreign key is a column or set of columns in one table that is used to link to the primary key of another table. This allows data to be spread across multiple tables, but still be connected and easily accessed through these relationships.\n\nFor more information, visit the following links:",
+    "links": [
+      {
+        "title": "Introduction to Working with Database in ASP.NET",
+        "url": "https://learn.microsoft.com/en-us/aspnet/web-pages/overview/data/5-working-with-data",
+        "type": "article"
+      },
+      {
+        "title": "Implement a Relational Database with ASP.NET",
+        "url": "https://openclassrooms.com/en/courses/5671811-implement-a-relational-database-with-asp-net-core",
+        "type": "article"
+      }
+    ]
+  },
+  "HQHSzsqBGSVYNLQ9o5EI-": {
+    "title": "SQL Server",
+    "description": "MS SQL (or Microsoft SQL Server) is the Microsoft developed relational database management system (RDBMS). MS SQL uses the T-SQL (Transact-SQL) query language to interact with the relational databases. There are many different versions and editions available of MS SQL\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "MS SQL website",
+        "url": "https://www.microsoft.com/en-ca/sql-server/",
+        "type": "article"
+      },
+      {
+        "title": "Tutorials for SQL Server",
+        "url": "https://docs.microsoft.com/en-us/sql/sql-server/tutorials-for-sql-server-2016?view=sql-server-ver15",
+        "type": "article"
+      },
+      {
+        "title": "Getting started with SQL",
+        "url": "https://www.w3schools.com/sql/default.asp",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about SQL",
+        "url": "https://app.daily.dev/tags/sql?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "SQL Server tutorial for beginners",
+        "url": "https://www.youtube.com/watch?v=-EPMOaV7h_Q",
+        "type": "video"
+      }
+    ]
+  },
+  "An9TLvo-I6NtC8wFU3bh4": {
+    "title": "PostgreSQL",
+    "description": "PostgreSQL, often simply \"Postgres\", is an open-source relational database management system (RDBMS) emphasizing extensibility and SQL compliance. It was originally developed at the University of California, Berkeley in the 1980s and is now maintained by the PostgreSQL Global Development Group.\n\nPostgres is known for its robustness and reliability, as well as its support for advanced features such as concurrency control, full-text search, and geospatial data. It is also highly extensible, allowing developers to create custom functions and operators in a variety of programming languages, including C, Python, and JavaScript.\n\nFor more information, visit the following resources:",
+    "links": [
+      {
+        "title": "Postgresql - Open Source Relational Database",
+        "url": "https://www.postgresql.org/",
+        "type": "article"
+      },
+      {
+        "title": "What is Postgresql?",
+        "url": "https://postgresqltutorial.com/postgresql-getting-started/what-is-postgresql/",
+        "type": "article"
+      },
+      {
+        "title": "Introduction, Advantages & Disadvantages of PostgreSQL",
+        "url": "https://www.guru99.com/introduction-postgresql.html",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about PostgreSQL",
+        "url": "https://app.daily.dev/tags/postgresql?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "Gs8XcsTo11MeCsiSGpjkU": {
+    "title": "MariaDB",
+    "description": "MariaDB is an open-source relational database management system (RDBMS) that is a fork of the MySQL database. It is fully compatible with MySQL, but it also includes additional features and improvements. MariaDB is developed and maintained by the MariaDB Corporation and the MariaDB community, and it is widely used as a replacement for MySQL in many web and enterprise applications.\n\nIn an [ASP.NET](http://ASP.NET) application, MariaDB can be used as the underlying database for storing and retrieving data. There are several libraries available for integrating MariaDB with an [ASP.NET](http://ASP.NET) application, such as MariaDB.Data, MySql.Data, and Dapper. These libraries provide a .NET client for MariaDB, which can be used to interact with the MariaDB database from within an [ASP.NET](http://ASP.NET) application.\n\nTo learn more, visit the following resources:",
+    "links": [
+      {
+        "title": "How to use MariaDB in ASP.NET?",
+        "url": "https://blog.georgekosmidis.net/using-mariadb-in-an-aspnet-core-api-with-entity-framework-core.html",
+        "type": "article"
+      },
+      {
+        "title": "Working with MariaDB and .Net",
+        "url": "https://mariadb.com/kb/en/mariadb-and-net/",
+        "type": "article"
+      },
+      {
+        "title": "Building an application with ASP.NET & MariaDB",
+        "url": "https://medium.com/@BMatt92656920/building-a-web-application-with-asp-net-core-mvc-entity-framework-core-mariadb-bootstrap-a2bf0927d20e",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Infrastructure",
+        "url": "https://app.daily.dev/tags/infrastructure?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "WsGwg4qdlu_vBsFEpmBvU": {
+    "title": "MySQL",
+    "description": "MySQL is an open-source relational database management system (RDBMS) that is widely used in web and enterprise applications. It is developed, distributed, and supported by Oracle Corporation. MySQL provides a rich set of features to handle high-performance, high-availability, and high-scalability requirements of modern web applications.\n\nIn an [ASP.NET](http://ASP.NET) application, MySQL can be used as the underlying database for storing and retrieving data. There are several libraries available for integrating MySQL with an [ASP.NET](http://ASP.NET) application, such as MySql.Data, Dapper and EF Core. These libraries provide a .NET client for MySQL, which can be used to interact with the MySQL database from within an [ASP.NET](http://ASP.NET) application.\n\nFor more information, visit the following links:",
+    "links": [
+      {
+        "title": "Getting started with ASP.NET Core and MySQL",
+        "url": "https://dev.mysql.com/blog-archive/getting-started-with-asp-net-core-and-mysql-connectornet/",
+        "type": "article"
+      },
+      {
+        "title": "MySql database connectivity with ASP.Net",
+        "url": "https://www.c-sharpcorner.com/UploadFile/brij_mcn/mysql-database-connectivity-with-Asp-Net/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about MySQL",
+        "url": "https://app.daily.dev/tags/mysql?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "How To Connect MySQL With ASP.NET",
+        "url": "https://www.youtube.com/watch?v=g5rVd1JGbIg",
+        "type": "video"
+      }
+    ]
+  },
+  "WUis4K9vduriYdVkKvM9r": {
+    "title": "NoSQL",
+    "description": "NoSQL (Not Only SQL) is a type of database that does not use the traditional table-based relational model. It is designed to handle large amounts of unstructured or semi-structured data, and it is often used in big data and real-time web applications. NoSQL databases are highly scalable and can handle high-performance needs and large data sets.\n\nThere are several types of NoSQL databases, such as document databases, key-value databases, graph databases, and column-family databases, each with their own unique features and use cases. Some examples of NoSQL databases include MongoDB, Cassandra, RavenDB, CouchDB, and Redis.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "NoSQL in .NET Applications",
+        "url": "https://www.slideshare.net/shijucv/nosql-database-in-net-apps",
+        "type": "article"
+      },
+      {
+        "title": "Open Source NoSQL Database for .NET",
+        "url": "https://www.alachisoft.com/nosdb/",
+        "type": "article"
+      },
+      {
+        "title": "Use NoSQL databases in ASP.NET",
+        "url": "https://learn.microsoft.com/en-us/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/nosql-database-persistence-infrastructure",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about NoSQL",
+        "url": "https://app.daily.dev/tags/nosql?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "-wYRa8qSuKVKo_yOTKV67": {
+    "title": "MongoDB",
+    "description": "MongoDB is a cross-platform, open-source, NoSQL document-oriented database that can be used to store and retrieve large amounts of data. It uses a flexible, JSON-like data structure called BSON (binary JSON) and it is designed to handle large amounts of unstructured data.\n\nIn an [ASP.NET](http://ASP.NET) application, MongoDB can be used as a data store to persist and retrieve application data. There are several libraries available for integrating MongoDB with an [ASP.NET](http://ASP.NET) application, such as MongoDB.Driver and C# MongoDB Driver. These libraries provide a .NET client for MongoDB, which can be used to interact with the MongoDB server from within an [ASP.NET](http://ASP.NET) application.\n\nTo learn more, visit the following resources:",
+    "links": [
+      {
+        "title": "Use MongoDB in Your C# ASP.NET Apps",
+        "url": "https://developer.okta.com/blog/2020/01/02/mongodb-csharp-aspnet-datastore",
+        "type": "article"
+      },
+      {
+        "title": "MongoDB With ASP.NET Core Web API",
+        "url": "https://www.c-sharpcorner.com/article/using-mongodb-with-asp-net-core-web-api/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about MongoDB",
+        "url": "https://app.daily.dev/tags/mongodb?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "U_-Gt5csu_hihl7ybFY-B": {
+    "title": "Cassandra",
+    "description": "Apache Cassandra is a free and open-source, NoSQL, distributed, wide-column store, and high-performance database management system designed to handle large amounts of data across many commodity servers, providing high availability with no single point of failure. It is designed to handle large amounts of data across many commodity servers, providing high availability with no single point of failure.\n\nCassandra is a column-family store and it stores data in a structured format, using tables and columns. It is based on a data model that is similar to that of Google's Bigtable, and it provides a query language that is similar to SQL.\n\nFor more information, visit the following links:",
+    "links": [
+      {
+        "title": "Introduction to Cassandra",
+        "url": "https://www.tutorialspoint.com/cassandra/cassandra_introduction.htm",
+        "type": "article"
+      },
+      {
+        "title": "Overview of Cassandra in ASP.NET",
+        "url": "https://www.spiceworks.com/tech/big-data/articles/what-is-cassandra/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Apache Cassandra",
+        "url": "https://app.daily.dev/tags/apache-cassandra?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "3gcXaOnHL4v5OoStrTWNV": {
+    "title": "LiteDB",
+    "description": "LiteDB is a lightweight, open-source, NoSQL embedded document-oriented database engine for .NET and .NET Core. It uses a file-based storage system, meaning that the entire database is stored in a single file on disk. It uses a similar syntax to MongoDB, but it is designed to be simple and easy to use, and it does not require a separate server or installation.\n\nLiteDB supports data types like string, int, decimal, DateTime, and also supports binary data and serialized objects. It also supports LINQ, transactions, indexes and collections.\n\nFor more information, visit the following links:",
+    "links": [
+      {
+        "title": "Getting started with LiteDB",
+        "url": "https://www.litedb.org/",
+        "type": "article"
+      },
+      {
+        "title": "Overview of LiteDB in ASP.NET",
+        "url": "https://www.litedb.org/docs/",
+        "type": "article"
+      }
+    ]
+  },
+  "vHcwt6ARi5YR3v-eDDjfl": {
+    "title": "CouchDB",
+    "description": "CouchDB is an open-source, NoSQL document database designed for the web. It uses a document-oriented data model, which means that it stores data in semi-structured JSON format, and it is designed to be simple and easy to use. CouchDB provides a built-in web interface, called Futon, which can be used to interact with the database, and it also provides an HTTP API that can be used to interact with the database from an [ASP.NET](http://ASP.NET) application.\n\nIn an [ASP.NET](http://ASP.NET) application, CouchDB can be used as a data store to persist and retrieve application data. There are several libraries available for integrating CouchDB with an [ASP.NET](http://ASP.NET) application, such as Couchbase, which provides a .NET client for CouchDB that can be used to interact with the CouchDB server from within an [ASP.NET](http://ASP.NET) application.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "CouchDB in ASP.NET Core Application",
+        "url": "https://www.c-sharpcorner.com/article/crud-operation-to-couchdb-via-rest-api-in-asp-net-core-application/",
+        "type": "article"
+      },
+      {
+        "title": "Use CouchDB with .NET",
+        "url": "https://stackoverflow.com/questions/1050152/use-couchdb-with-net",
+        "type": "article"
+      }
+    ]
+  },
+  "fQ3w8REYWzQfeJ0nPyq6W": {
+    "title": "Log Frameworks",
+    "description": "In [ASP.NET](http://ASP.NET), log frameworks are libraries that provide a way to log and analyze data in an application. Some popular log frameworks for [ASP.NET](http://ASP.NET) include:\n\n*   Serilog\n*   NLog\n*   Log4Net\n*   ELMAH\n*   Microsoft.Extensions.Logging\n\nThese are some of the most popular log frameworks in [ASP.NET](http://ASP.NET), each of them has its own set of features and use cases, and the choice of which log framework to use will depend on the specific requirements of the application.\n\nVisit the following links to learn more:",
+    "links": [
+      {
+        "title": "Implement logging in ASP.NET",
+        "url": "https://learn.microsoft.com/en-us/training/modules/aspnet-logging/",
+        "type": "article"
+      },
+      {
+        "title": "ASP.NET Core: Logging with log4net",
+        "url": "https://www.linkedin.com/learning/asp-dot-net-core-logging-with-log4net",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Logging",
+        "url": "https://app.daily.dev/tags/logging?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "xL0s4-HfRxNy2ru0jiIWR": {
+    "title": "Serilog",
+    "description": "Serilog is a third-party logging library for [ASP.NET](http://ASP.NET) Core that allows developers to easily create structured and searchable log data. It is built on top of the `Microsoft.Extensions.Logging` framework, which is included in [ASP.NET](http://ASP.NET) Core. Serilog provides features such as automatic logging of request and response data, and the ability to write logs to a variety of destinations, including the console, files, and various logging services. It also supports for filtering and formatting log messages.\n\nFor more resources, visit the following links:",
+    "links": [
+      {
+        "title": "Complete guide to Serilog in ASP.NET",
+        "url": "https://github.com/serilog/serilog-aspnetcore",
+        "type": "opensource"
+      },
+      {
+        "title": "How to Work with Serilog in ASP.NET?",
+        "url": "https://www.codeguru.com/dotnet/serilog-c-sharp/",
+        "type": "article"
+      },
+      {
+        "title": "Advanced Serilog features in ASP.NET",
+        "url": "https://www.infoworld.com/article/3624022/how-to-use-advanced-serilog-features-in-aspnet-core-mvc.html",
+        "type": "article"
+      }
+    ]
+  },
+  "ykF2bB_68AhCOzeQ_QSW1": {
+    "title": "NLog",
+    "description": "NLog is an open-source logging library for .NET applications, including [ASP.NET](http://ASP.NET). It is designed to be easy to use, highly configurable, and extensible, and it provides a number of features that help developers to log and analyze data in their applications.\n\nNLog is a powerful, flexible, and easy-to-use logging library that can be used in [ASP.NET](http://ASP.NET) applications to provide detailed log data. It allows developers to easily configure their logging pipeline, and to write log data to a variety of destinations, making it easier to analyze and troubleshoot issues in the application.\n\nFor more resources, visit the following links:",
+    "links": [
+      {
+        "title": "Logging with NLog in ASP.NET",
+        "url": "https://codewithmukesh.com/blog/logging-with-nlog-in-aspnet-core/",
+        "type": "article"
+      },
+      {
+        "title": "Introduction To NLog With ASP.NET Core",
+        "url": "https://www.c-sharpcorner.com/article/introduction-to-nlog-with-asp-net-core2/",
+        "type": "article"
+      },
+      {
+        "title": "Tutorial of Nlog with ASP.NET",
+        "url": "https://www.youtube.com/watch?v=PnlxRmHg0lU",
+        "type": "video"
+      }
+    ]
+  },
+  "GLkDH0X0uy8_1DIdCzbUD": {
+    "title": "API Clients and Communication",
+    "description": "API clients in [ASP.NET](http://ASP.NET) are software libraries that allow applications to interact with external APIs. They provide a set of methods and classes that make it easy to send requests to an API and process the responses.\n\nAPI clients can be used to access a wide variety of services, such as web services, cloud services, and social media platforms. They can be used to perform tasks such as fetching data, posting updates, and deleting resources.\n\nAPI clients in [ASP.NET](http://ASP.NET) are typically built using the HttpClient class, which is part of the System.Net.Http namespace. This class provides a set of methods for sending HTTP requests and receiving HTTP responses.\n\nVisit the following links to learn more:",
+    "links": [
+      {
+        "title": "How to Call a Web API From a .NET Client",
+        "url": "https://learn.microsoft.com/en-us/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client",
+        "type": "article"
+      },
+      {
+        "title": "Overview of Web API REST Service in ASP.NET",
+        "url": "https://www.c-sharpcorner.com/article/consuming-asp-net-web-api-rest-service-in-asp-net-mvc-using-http-client/",
+        "type": "article"
+      },
+      {
+        "title": "Building an ASP.NET Web API With ASP.NET",
+        "url": "https://www.toptal.com/asp-dot-net/asp-net-web-api-tutorial",
+        "type": "article"
+      }
+    ]
+  },
+  "KJCtxH3mYsZq3hfBZ6cJF": {
+    "title": "REST",
+    "description": "REST (Representational State Transfer) is an architectural style for building web services. It is based on the principles of the HTTP protocol, and it uses the conventions of HTTP to create a standard interface for interacting with web services.\n\nIn [ASP.NET](http://ASP.NET), REST can be used to create web services that expose data in a standardized way. RESTful web services in [ASP.NET](http://ASP.NET) are typically built using the Web API framework, which provides a set of libraries and tools for building RESTful web services.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "What is REST Services in ASP.NET?",
+        "url": "http://www.codedigest.com/quick-start/16/what-is-rest-services-how-to-create-rest-services-in-aspnet",
+        "type": "article"
+      },
+      {
+        "title": "What are RESTful APIs?",
+        "url": "https://www.pragimtech.com/blog/blazor/what-are-restful-apis/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about REST API",
+        "url": "https://app.daily.dev/tags/rest-api?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "Tutorial of Rest and Restful API",
+        "url": "https://www.youtube.com/watch?v=4r1CIUs5s2I",
+        "type": "video"
+      }
+    ]
+  },
+  "w5RnrhsP4p-AdSOLYVAY9": {
+    "title": "Gridlify",
+    "description": "",
+    "links": []
+  },
+  "YojZ5fpzw-5WgoqqkO6wl": {
+    "title": "Odata",
+    "description": "OData (Open Data Protocol) is a web protocol for querying and updating data. It is an open standard for creating and consuming RESTful web services. OData is built on top of the HTTP protocol, and it uses the conventions of REST to expose data through a standard interface.\n\nIn [ASP.NET](http://ASP.NET), OData can be used to create RESTful web services that expose data in a standardized way. OData provides a set of conventions for defining the structure of the data, and it also provides a set of conventions for querying and updating the data.\n\nFor more information, visit the following links:",
+    "links": [
+      {
+        "title": "Create an OData v4 Endpoint Using ASP.NET",
+        "url": "https://learn.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/create-an-odata-v4-endpoint",
+        "type": "article"
+      },
+      {
+        "title": "Example of OData Protocol With ASP.NET Core",
+        "url": "https://www.youtube.com/watch?v=L9HdnNCi0R0",
+        "type": "video"
+      }
+    ]
+  },
+  "BdTQ5ZMNDNZvkAUoCfL5H": {
+    "title": "GraphQL",
+    "description": "GraphQL is a query language for your API that allows clients to define the structure of the data they need, and the server will return only the requested data. It is an alternative to RESTful web services, and it is gaining popularity because of its flexibility and efficiency.\n\nIn [ASP.NET](http://ASP.NET), GraphQL can be used to create web services that expose data in a more flexible and efficient way. There are several libraries available to implement GraphQL in an [ASP.NET](http://ASP.NET) application, such as [GraphQL.NET](http://GraphQL.NET), Hot Chocolate, and others. These libraries provide a set of classes and methods that make it easy to create a GraphQL schema, handle requests, and generate responses.\n\nTo learn more, visit the following resources:",
+    "links": [
+      {
+        "title": "How to implement GraphQL in ASP.Net",
+        "url": "https://blog.christian-schou.dk/how-to-implement-graphql-in-asp-net-core/",
+        "type": "article"
+      },
+      {
+        "title": "Intro to GraphQL",
+        "url": "https://graphql-dotnet.github.io/docs/getting-started/introduction/",
+        "type": "article"
+      },
+      {
+        "title": "Developing API In .NET Core With GraphQL",
+        "url": "https://www.c-sharpcorner.com/article/building-api-in-net-core-with-graphql2/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about GraphQL",
+        "url": "https://app.daily.dev/tags/graphql?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "Efxu9gDodODMTKJbWcXzB": {
+    "title": "GraphQL .NET",
+    "description": "GraphQL is a query language for your API, it allows clients to define the structure of the data they need, and the server will return only the requested data. It is an alternative to RESTful web services, and it is gaining popularity because of its flexibility and efficiency.\n\nIn [ASP.NET](http://ASP.NET), GraphQL can be used to create web services that expose data in a more flexible and efficient way. [GraphQL.NET](http://GraphQL.NET) is a popular open-source library that can be used to create GraphQL services in [ASP.NET](http://ASP.NET). This library provides a set of classes and methods that make it easy to create a GraphQL schema, handle requests, and generate responses. Learn more from the following resources:",
+    "links": [
+      {
+        "title": "Introduction to GraphQL .NET in ASP.NET",
+        "url": "https://graphql-dotnet.github.io/docs/getting-started/introduction/",
+        "type": "article"
+      },
+      {
+        "title": "How to use GraphQL in .NET?",
+        "url": "https://softchris.github.io/pages/dotnet-graphql.html",
+        "type": "article"
+      },
+      {
+        "title": "Building and consuming GraphQL API in ASP.NET",
+        "url": "https://www.red-gate.com/simple-talk/development/dotnet-development/building-and-consuming-graphql-api-in-asp-net-core-5/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about GraphQL",
+        "url": "https://app.daily.dev/tags/graphql?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "XMrQx9JH0eSQJpMzhvy0F": {
+    "title": "HotChocolate",
+    "description": "Hot Chocolate is a GraphQL server implementation for .NET and .NET Core. It is an open-source library that provides a simple and flexible way to build GraphQL APIs in [ASP.NET](http://ASP.NET).\n\nHot Chocolate provides a set of classes and methods that make it easy to create a GraphQL schema, handle requests, and generate responses. It also provides a number of features to help with things such as validation, authorization, caching, and more.\n\nTo learn more, visit the following resources:",
+    "links": [
+      {
+        "title": "Getting started with HotChocolate",
+        "url": "https://learn.microsoft.com/en-us/shows/on-net/getting-started-with-hotchocolate",
+        "type": "article"
+      },
+      {
+        "title": "ASP.NET Core and HotChocolate",
+        "url": "https://chillicream.com/docs/hotchocolate/v12/api-reference/aspnetcore",
+        "type": "article"
+      },
+      {
+        "title": "Intro to HotChocolate",
+        "url": "https://chillicream.com/docs/hotchocolate",
+        "type": "article"
+      }
+    ]
+  },
+  "x3SJlLc19DNJ-PyDOOj_G": {
+    "title": "gRPC",
+    "description": "gRPC is a high-performance, open-source framework for building remote procedure call (RPC) APIs. It uses the Protocol Buffers data serialization format and the HTTP/2 protocol to create highly efficient and scalable APIs. gRPC supports a variety of programming languages, including C# and [ASP.NET](http://ASP.NET).\n\nIn [ASP.NET](http://ASP.NET), gRPC can be used to create high-performance, low-latency APIs for a variety of use cases. gRPC allows for bi-directional streaming of data, which can be useful for real-time applications such as gaming, financial trading, and more.\n\nTo learn more, visit the following resources:",
+    "links": [
+      {
+        "title": "Overview for gRPC on .NET",
+        "url": "https://learn.microsoft.com/en-us/aspnet/core/grpc/?view=aspnetcore-7.0",
+        "type": "article"
+      },
+      {
+        "title": "Getting Started with ASP.NET Core and gRPC",
+        "url": "https://blog.jetbrains.com/dotnet/2021/07/19/getting-started-with-asp-net-core-and-grpc/",
+        "type": "article"
+      },
+      {
+        "title": "Create a gRPC client & server in ASP.NET",
+        "url": "https://learn.microsoft.com/en-us/aspnet/core/tutorials/grpc/grpc-start?view=aspnetcore-7.0&tabs=visual-studio",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about gRPC",
+        "url": "https://app.daily.dev/tags/grpc?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "9Vv3OxafB6BlHhi1ZkeVO": {
+    "title": "Real-Time Communication",
+    "description": "Real-time communication in [ASP.NET](http://ASP.NET) refers to the ability to send and receive data between a client and a server in real-time, typically with low latency. It allows the server to push updates to the client as they happen, instead of the client having to continuously poll the server for updates.\n\nThere are several technologies and libraries available for implementing real-time communication in [ASP.NET](http://ASP.NET), such as WebSockets, SignalR, gRPC, and more.\n\nTo learn more, visit the following resources:",
+    "links": [
+      {
+        "title": "Overview of ASP.NET Core SignalR",
+        "url": "https://learn.microsoft.com/en-us/aspnet/core/signalr/introduction?view=aspnetcore-7.0",
+        "type": "article"
+      },
+      {
+        "title": "Real-time ASP.NET with SignalR",
+        "url": "https://dotnet.microsoft.com/en-us/apps/aspnet/signalr",
+        "type": "article"
+      }
+    ]
+  },
+  "tBl8neu3tJd5GPwGfJbjZ": {
+    "title": "Web Sockets",
+    "description": "WebSockets is a protocol that allows for real-time, bidirectional communication between a client and a server. It is based on the same principle as HTTP, but it uses a different protocol to establish and maintain a connection between the client and the server. Once a connection is established, WebSockets enables the client and server to send messages to each other in real-time.\n\nIn [ASP.NET](http://ASP.NET), WebSockets can be used to create real-time, highly interactive web applications. The [ASP.NET](http://ASP.NET) Core framework provides built-in support for WebSockets through the Microsoft.AspNetCore.WebSockets package. This package provides a set of classes and methods that make it easy to create and manage WebSockets connections.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "WebSockets support in ASP.NET",
+        "url": "https://learn.microsoft.com/en-us/aspnet/core/fundamentals/websockets?view=aspnetcore-7.0",
+        "type": "article"
+      },
+      {
+        "title": "Understanding WebSockets with ASP.NET",
+        "url": "https://sahansera.dev/understanding-websockets-with-aspnetcore-5/",
+        "type": "article"
+      },
+      {
+        "title": "Writing a WebSocket server in ASP.NET",
+        "url": "https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_server",
+        "type": "article"
+      }
+    ]
+  },
+  "8dvd4M0TKNyQR8dEolGNT": {
+    "title": "SignalR Core",
+    "description": "SignalR is a real-time communication library for .NET that allows for the creation of real-time web applications. SignalR Core is the latest version of SignalR, which has been rebuilt from the ground up to be cross-platform and lightweight. It allows for bidirectional communication between a client (such as a web page) and a server, enabling real-time updates, notifications, and other interactions. SignalR Core can be used in a variety of scenarios such as chat applications, gaming, and real-time dashboards. It supports multiple transports like WebSockets, Server-Sent Events and Long polling. It also supports for authentication and authorization.\n\nFor more information, visit the following links:",
+    "links": [
+      {
+        "title": "Overview of ASP.NET Core SignalR",
+        "url": "https://learn.microsoft.com/en-us/aspnet/core/signalr/introduction?view=aspnetcore-8.0",
+        "type": "article"
+      }
+    ]
+  },
+  "9ECykIIvXlDblbFbRVcJS": {
+    "title": "Object Mapping",
+    "description": "Object mapping in [ASP.NET](http://ASP.NET) refers to the process of converting an object of one type to an object of another type. This can be useful in a number of scenarios, such as when working with domain models and data transfer objects (DTOs) in a layered architecture, or when mapping between different versions of an object or different formats such as JSON and XML.\n\nThere are several libraries available for object mapping in [ASP.NET](http://ASP.NET), such as AutoMapper, ExpressMapper, AgileMapper, AgileMapster and Mapster. These libraries provide a convenient and flexible way to map between objects, using a convention-based approach or a fluent API to configure more complex mappings. They also support for a wide range of mapping scenarios, including nested and circular object graphs, collections, and different types of inheritance.\n\nVisit the following links to learn more:",
+    "links": [
+      {
+        "title": "Building a Fast Object-to-Object Mapper in .NET",
+        "url": "https://www.twilio.com/blog/building-blazing-fast-object-mapper-c-sharp-net-core",
+        "type": "article"
+      },
+      {
+        "title": "Overview of Object Mapping in ASP.NET",
+        "url": "https://docs.abp.io/en/abp/latest/Object-To-Object-Mapping",
+        "type": "article"
+      },
+      {
+        "title": "Comparison of Object Mapper Libraries",
+        "url": "https://www.simplilearn.com/tutorials/asp-dot-net-tutorial/automapper-in-c-sharp",
+        "type": "article"
+      }
+    ]
+  },
+  "GPmlueMnuLCUW_t4jvGhc": {
+    "title": "AutoMapper",
+    "description": "AutoMapper is a library for .NET that allows you to easily map between objects of different types. It is particularly useful when working with domain models and data transfer objects (DTOs) in a layered architecture. It can also be used to map between different versions of an object, or to map between objects in different formats, such as JSON and XML.\n\nAutoMapper uses a convention-based approach to mapping, which means that it automatically maps properties with the same name and type from one object to another. It also provides a fluent API for configuring more complex mappings, such as ignoring certain properties, using custom logic to map properties, or mapping properties based on a value in another property.\n\nTo learn more, visit the following resources:",
+    "links": [
+      {
+        "title": "What is Automapper in ASP.NET?",
+        "url": "https://www.simplilearn.com/tutorials/asp-dot-net-tutorial/automapper-in-c-sharp",
+        "type": "article"
+      },
+      {
+        "title": "Getting Started with AutoMapper in ASP.NET",
+        "url": "https://code-maze.com/automapper-net-core/",
+        "type": "article"
+      },
+      {
+        "title": "Examples of AutoMapper in ASP.NET",
+        "url": "https://dotnettutorials.net/lesson/automapper-in-c-sharp/",
+        "type": "article"
+      }
+    ]
+  },
+  "x0OopRTwIvoWgT8qi0CE9": {
+    "title": "Mapperly",
+    "description": "",
+    "links": []
+  },
+  "oMMBzRrHkUymxAR4oqr75": {
+    "title": "Manual Mapping",
+    "description": "",
+    "links": []
+  },
+  "s57tKy1rajlJbKFDVXLqs": {
+    "title": "Task Scheduling",
+    "description": "Task scheduling in [ASP.NET](http://ASP.NET) refers to the process of scheduling and executing background tasks in an application. This can include tasks such as sending emails, processing data, generating reports, or performing maintenance tasks.\n\nIn [ASP.NET](http://ASP.NET), task scheduling can be implemented using a variety of libraries and frameworks such as [Quartz.NET](http://Quartz.NET), Hangfire, Coravel and Microsoft's built-in IHostedService interface. These libraries and frameworks provide a way to schedule tasks to run at specific times or intervals, and also provide APIs for managing and monitoring the progress of scheduled tasks.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "How schedule Tasks in ASP.NET?",
+        "url": "https://beansoftware.com/ASP.NET-Tutorials/Scheduled-Tasks.aspx",
+        "type": "article"
+      },
+      {
+        "title": "Task Scheduling in ASP.NET",
+        "url": "https://www.youtube.com/watch?v=Vg4AOpb7OqA",
+        "type": "video"
+      }
+    ]
+  },
+  "uP1nqbmFmZL_wA2DoqP8C": {
+    "title": "Native Background Service",
+    "description": "A Native Background Service in [ASP.NET](http://ASP.NET) is a type of service that can run in the background on a device, without the need for an active user session. These services are typically used for tasks that need to run continuously, such as sending notifications, polling for updates, or processing data.\n\nIn [ASP.NET](http://ASP.NET), a Native Background Service can be implemented using the IHostedService interface, which is part of the Microsoft.Extensions.Hosting namespace. This interface allows you to create a background service that can run continuously, even when the main application is not running.\n\nVisit the following links to learn more:",
+    "links": [
+      {
+        "title": "Background tasks with hosted services in ASP.NET",
+        "url": "https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-7.0&tabs=visual-studio",
+        "type": "article"
+      },
+      {
+        "title": "BackgroundService in ASP.NET Core",
+        "url": "https://medium.com/@daniel.sagita/backgroundservice-for-a-long-running-work-3debe8f8d25b",
+        "type": "article"
+      },
+      {
+        "title": "Tutorial on Background Tasks in ASP.NET",
+        "url": "https://youtube.com/watch?v=rugxQIH_p3A",
+        "type": "video"
+      }
+    ]
+  },
+  "QiQsx1udyKcPJ-lZjRQVy": {
+    "title": "Hangfire",
+    "description": "Hangfire is an open-source, lightweight library for .NET that allows you to easily perform background processing in your [ASP.NET](http://ASP.NET) application. It provides a simple and elegant way to run background jobs, schedule future tasks, and monitor the progress of your background jobs.\n\nHangfire uses a storage backend, such as SQL Server or Redis, to persist the state of your background jobs. This allows you to easily scale your background processing and to monitor and manage your background jobs, even if your application restarts or crashes.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "Hangfire with ASP.NET Core",
+        "url": "https://code-maze.com/hangfire-with-asp-net-core/",
+        "type": "article"
+      },
+      {
+        "title": "Intro to Hangfire",
+        "url": "https://www.partech.nl/nl/publicaties/2021/05/a-beginners-guide-to-hangfire",
+        "type": "article"
+      },
+      {
+        "title": "How to use Hangfire with ASP.NET",
+        "url": "https://blog.christian-schou.dk/how-to-use-hangfire-with-asp-net-core-5-0-api/",
+        "type": "article"
+      }
+    ]
+  },
+  "zOWlPXIl4XPs_0pA8-yi5": {
+    "title": "Quartz",
+    "description": "Quartz is an open-source, job scheduling library for .NET that can be used in [ASP.NET](http://ASP.NET) applications. It is based on the popular Quartz scheduler for Java, and provides a similar feature set for scheduling and executing background jobs in .NET applications.\n\nWith Quartz, you can schedule jobs to run at specific times or intervals, and you can also set up triggers to start a job based on certain events. Quartz also provides a rich set of options for configuring and managing your jobs, such as pausing, resuming, and canceling jobs, as well as job chaining and priorities.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "Intro to Quartz in ASP.NET",
+        "url": "https://aspnetboilerplate.com/Pages/Documents/Quartz-Integration",
+        "type": "article"
+      },
+      {
+        "title": "How to work with Quartz.Net in ASP.NET",
+        "url": "https://www.infoworld.com/article/3078781/how-to-work-with-quartz-net-in-c.html",
+        "type": "article"
+      }
+    ]
+  },
+  "p3bZnKIyRgLmB764Kkhju": {
+    "title": "Coravel",
+    "description": "Coravel is an open-source, lightweight library for .NET that allows you to easily perform background processing and scheduling in your [ASP.NET](http://ASP.NET) Core application. It provides a simple and elegant way to schedule tasks, run background jobs, and manage queues in your application.\n\nCoravel is inspired by Laravel's task scheduler and it's built on top of the .NET Core built-in Dependency Injection. It uses a fluent API to schedule tasks, allowing you to easily specify the frequency, start time, and end time of the task. It also provides a simple way to queue and process background jobs, allowing you to easily process large amounts of data or perform long-running tasks.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "Documentation of Coravel",
+        "url": "https://docs.coravel.net/",
+        "type": "article"
+      },
+      {
+        "title": "ASP.NET Task Scheduling with Coravel",
+        "url": "https://www.youtube.com/watch?v=vu0fxlWl0wo",
+        "type": "video"
+      },
+      {
+        "title": "How to Run a .Net Console App with Coravel",
+        "url": "https://www.youtube.com/watch?v=KQpw_OYkKq8",
+        "type": "video"
+      }
+    ]
+  },
+  "XofWWhlU_vWCG5oXVMZze": {
+    "title": "Testing",
+    "description": "Testing in [ASP.NET](http://ASP.NET) is the process of evaluating the performance, functionality, and overall correctness of an application developed using the [ASP.NET](http://ASP.NET) framework. There are several types of testing that can be performed on an [ASP.NET](http://ASP.NET) application, including unit testing, integration testing, acceptance testing and E2E testing. Each type of testing has a different focus and is used at a different stage of the development process. Common testing frameworks for [ASP.NET](http://ASP.NET) include MSTest, XUnit, NUnit, Selenium, Playwright, Puppeteer, Cypress, Specflow, Cucumber, and LightBDD.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "A Complete Tutorial on ASP.NET Testing",
+        "url": "https://www.lambdatest.com/blog/aspnet-testing/",
+        "type": "article"
+      },
+      {
+        "title": "Unit test controller logic in ASP.NET",
+        "url": "https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/testing?view=aspnetcore-7.0",
+        "type": "article"
+      },
+      {
+        "title": "Integration tests in ASP.NET Core",
+        "url": "https://learn.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-7.0",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Testing",
+        "url": "https://app.daily.dev/tags/testing?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "AtyL0ij8FeJCBmqG2YvTO": {
+    "title": "Playwright",
+    "description": "Playwright is an open-source library for automating web browsers built by Microsoft, similar to Selenium, it's commonly used for testing web applications. It's built on top of the .NET Core runtime and it provides bindings for C#, it allows developers to write tests for web applications in C# or other .NET languages. Playwright is designed to be fast and reliable and allows developers to run tests in multiple browsers.\n\nTo learn more, visit the following:",
+    "links": [
+      {
+        "title": "Playwright for .NET",
+        "url": "https://github.com/microsoft/playwright-dotnet",
+        "type": "opensource"
+      },
+      {
+        "title": "How to test Apps with Playwright and .NETs",
+        "url": "https://www.twilio.com/blog/test-web-apps-with-playwright-and-csharp-dotnet",
+        "type": "article"
+      },
+      {
+        "title": "End-to-End Tests With ASP.NET and Playwright",
+        "url": "https://khalidabuhakmeh.com/end-to-end-test-with-aspnet-core-xunit-and-playwright",
+        "type": "article"
+      }
+    ]
+  },
+  "UCpoLiQJ4LeniI9x3uGcY": {
+    "title": "Puppeteer",
+    "description": "Puppeteer is an open-source library for automating web browsers, similar to Selenium and Playwright. It's built on top of the Chrome DevTools protocol and it provides a set of APIs that allows developers to interact with web browsers and simulate user interactions, such as clicking buttons, filling out forms, and navigating between pages. It's commonly used for testing web applications, web scraping, and generating screenshots and PDFs of web pages. Puppeteer for .NET is built on top of the .NET Core runtime and it provides bindings for C# and allows developers to write tests for web applications in C# or other .NET languages.\n\nFor more information, visit the following links:",
+    "links": [
+      {
+        "title": "Why use Puppeteer?",
+        "url": "https://www.kiltandcode.com/puppeteer-sharp-crawl-the-web-using-csharp-and-headless-chrome/",
+        "type": "article"
+      },
+      {
+        "title": "Documentations of Puppeteer",
+        "url": "https://www.puppeteersharp.com/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Crawling",
+        "url": "https://app.daily.dev/tags/crawling?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "f2UP2jDnDr7XEFIdAtBhH": {
+    "title": "Cypress",
+    "description": "Cypress is an open-source end-to-end testing framework for web applications, it's built on top of JavaScript and provides a set of APIs that allows developers to automate browser interactions. It's commonly used for testing web applications, as it can be used to automate browser-based tests and assert that the application behaves as expected. Cypress for .NET is not built on top of the .NET Core runtime and it does not provide bindings for C# or any other .NET languages, it's built on top of JavaScript and can be run in the browser.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "Cypress - End To End Testing Tool",
+        "url": "https://www.c-sharpcorner.com/article/getting-started-with-cypress-io/",
+        "type": "article"
+      },
+      {
+        "title": "Overview of Cypress",
+        "url": "https://www.cypress.io/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Cypress",
+        "url": "https://app.daily.dev/tags/cypress?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "Xx5G09n4WWnnydCgxnL0A": {
+    "title": "WebApplicationFactory",
+    "description": "Web Application Factory (WAF) is a built-in feature of the [ASP.NET](http://ASP.NET) Core framework that allows developers to create and configure a web application in a programmatic way. It provides a simple and flexible way to set up a web application for testing, without the need for a web server or a browser. The WAF can be used to create a test server that can be used to run integration tests or end-to-end tests for an [ASP.NET](http://ASP.NET) Core web application, this allows developers to test the web application in a realistic environment, without the need for a physical web server or a browser. The WAF can be configured to use different services, middleware, and settings, depending on the needs of the application, this allows developers to easily set up a web application that is configured specifically for testing. The WAF also allows developers to test the web application against different configurations, such as different databases, different authentication providers, and different hosting environments.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "Integration tests in ASP.NET Core",
+        "url": "https://learn.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-7.0",
+        "type": "article"
+      },
+      {
+        "title": "How to use WebApplicationFactory in .NET",
+        "url": "https://stackoverflow.com/questions/69058176/how-to-use-webapplicationfactory-in-net6-without-speakable-entry-point",
+        "type": "article"
+      },
+      {
+        "title": "Integration Testing ASP.NET Core WebAPI Applications",
+        "url": "https://www.youtube.com/watch?v=xs8gNQjCXw0",
+        "type": "video"
+      }
+    ]
+  },
+  "8eW5BaOjJbnQ7uk4zMOiU": {
+    "title": "Test Containers",
+    "description": "",
+    "links": []
+  },
+  "Ohc0xzI6qX4hOFVNfRj1F": {
+    "title": ".NET Aspire",
+    "description": "",
+    "links": []
+  },
+  "TCswZHviRiu6SIOwUisu8": {
+    "title": "Respawn",
+    "description": "",
+    "links": []
+  },
+  "9WZmjiFowydYrkHQ2xeNm": {
+    "title": "Specflow",
+    "description": "SpecFlow is an open-source tool that allows developers to create automated acceptance tests in a natural language format, such as Gherkin. SpecFlow is commonly used in the context of [ASP.NET](http://ASP.NET) and other .NET technologies, to write acceptance tests for web applications. With SpecFlow, developers can write test scenarios using plain text in the Gherkin syntax, which uses a Given-When-Then format to describe the steps of a test. These scenarios can be written by non-technical stakeholders, such as business analysts or product owners, and can be easily understood by anyone who reads them. SpecFlow then converts these Gherkin scenarios into executable tests, which can be run using a variety of test runners, such as NUnit, xUnit, or MSTest. The tool also provides a set of bindings that allow developers to map the steps in the Gherkin scenarios to code in their application, making it easy to test specific functionality. Additionally, SpecFlow provides a set of advanced features, such as support for parameterized tests, background steps, and hooks, which allows developers to create more complex and powerful tests.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "SpecFlow’s documentation",
+        "url": "https://docs.specflow.org/_/downloads/specflow/en/latest/pdf/",
+        "type": "article"
+      },
+      {
+        "title": "Getting Started with SpecFlow",
+        "url": "https://docs.specflow.org/projects/getting-started/en/latest/index.html",
+        "type": "article"
+      },
+      {
+        "title": "What is SpecFlow?",
+        "url": "https://specflow.org/tools/specflow/",
+        "type": "article"
+      }
+    ]
+  },
+  "aWRv5sU9dksgcpE9RGJb1": {
+    "title": "Light BDD",
+    "description": "LightBDD is an open-source, lightweight, and easy-to-use BDD (Behavior-Driven Development) framework for .NET, which allows developers to write automated acceptance tests in a simple and readable format. LightBDD is commonly used in the context of [ASP.NET](http://ASP.NET) and other .NET technologies, to write acceptance tests for web applications. LightBDD is designed to provide a simple, yet powerful, way to write BDD tests. It allows developers to write tests using a fluent API, which allows them to describe the behavior of their application in a natural language format. The framework also provides a set of extension methods, which can be used to add additional functionality, such as validating the output of a test, logging test results, or integrating with other testing tools. LightBDD also comes with a built-in test runner, which makes it easy to execute tests and view the results. The framework supports a variety of test runners, such as NUnit, xUnit, and MSTest, and can be integrated with other BDD frameworks, such as SpecFlow and Cucumber.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "The Lightweight Behavior Driven Development test framework",
+        "url": "https://github.com/LightBDD/LightBDD",
+        "type": "opensource"
+      },
+      {
+        "title": "Explore top posts about Testing",
+        "url": "https://app.daily.dev/tags/testing?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "Getting started with Behavior Driven Development (BDD) in .NET",
+        "url": "https://www.youtube.com/watch?v=EEeVU0z26u0",
+        "type": "video"
+      },
+      {
+        "title": "Introduction To BDD using SpecFlow in ASP.NET",
+        "url": "https://www.youtube.com/watch?v=8KPrhBqZ-kk",
+        "type": "video"
+      }
+    ]
+  },
+  "R8C6s53RYjkRVma0nCJpy": {
+    "title": "XUnit",
+    "description": "xUnit is a unit testing framework for the .NET framework, it's an open-source testing framework that provides a set of attributes and classes that can be used to create unit tests. In the context of [ASP.NET](http://ASP.NET), xUnit can be used to write unit tests for web applications built using the [ASP.NET](http://ASP.NET) framework. xUnit provides features such as support for data-driven tests, support for parallel test execution, and support for test discovery and execution, it also provides support for test isolation which allows developers to run tests in isolation from each other. xUnit is a popular alternative to other testing frameworks like MSTest and it does not rely on a test runner, instead relies on a console runner that can be run from the command line.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "Unit Testing with xUnit in ASP.NET Core",
+        "url": "https://code-maze.com/aspnetcore-unit-testing-xunit/",
+        "type": "article"
+      },
+      {
+        "title": "Unit testing in .NET Core using and xUnit",
+        "url": "https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-with-dotnet-test",
+        "type": "article"
+      },
+      {
+        "title": "Getting Started With Unit Testing Using ASP.NET And xUnit",
+        "url": "https://www.c-sharpcorner.com/article/getting-started-with-unit-testing-using-c-sharp-and-xunit/",
+        "type": "article"
+      }
+    ]
+  },
+  "qHYBlBCvCGUZGh6gyEI63": {
+    "title": "NUnit",
+    "description": "NUnit is a unit testing framework for the .NET framework, it's an open-source testing framework that provides a set of attributes and classes that can be used to create unit tests. In the context of [ASP.NET](http://ASP.NET), NUnit can be used to write unit tests for web applications built using the [ASP.NET](http://ASP.NET) framework. NUnit provides features such as support for data-driven tests, support for parallel test execution, and support for test discovery and execution, it also provides support for test isolation which allows developers to run tests in isolation from each other. NUnit is a popular alternative to other testing frameworks like MSTest and xUnit and it has a similar syntax as JUnit and it's considered as one of the oldest testing frameworks for .NET.\n\nVisit the following links for more resources:",
+    "links": [
+      {
+        "title": "NUnit With C#",
+        "url": "https://www.c-sharpcorner.com/UploadFile/84c85b/nunit-with-C-Sharp/",
+        "type": "article"
+      },
+      {
+        "title": "Unit testing C# with NUnit and .NET Core",
+        "url": "https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-with-nunit",
+        "type": "article"
+      }
+    ]
+  },
+  "zhn-VLGPfV6FZT2OMl6zf": {
+    "title": "Shouldly",
+    "description": "Shouldly is a .NET library that provides a set of extension methods for writing expressive and readable assertions in unit tests, it's designed to be an alternative to traditional assertion libraries. In the context of [ASP.NET](http://ASP.NET), Shouldly can be used in conjunction with test frameworks such as MSTest, xUnit, and NUnit to write more expressive and readable unit tests for the application. It provides advanced features such as support for collection-specific assertions, support for asynchronous code, and support for custom types, also includes options to customize the error message.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "How to Use Shouldly to Improve Unit Tests in .NET?",
+        "url": "https://code-maze.com/improve-unit-tests-shouldly-dotnet/",
+        "type": "article"
+      },
+      {
+        "title": "Improve Test Asserts with Shouldly",
+        "url": "https://visualstudiomagazine.com/articles/2015/08/01/improve-test-asserts-with-shouldly.aspx?admgarea=ALM",
+        "type": "article"
+      }
+    ]
+  },
+  "iZCxinqlVefBk5-ICqt4v": {
+    "title": "NSubstitute",
+    "description": "NSubstitute is a popular open-source .NET library that allows developers to create mock objects for use in unit testing, it is a powerful and flexible substitute for traditional mocking frameworks such as Moq and Rhino Mocks. In the context of [ASP.NET](http://ASP.NET), NSubstitute can be used to create mock objects for testing web applications built using the [ASP.NET](http://ASP.NET) framework, it provides a simple and intuitive syntax for creating mock objects, setting up mock behavior, and making assertions on calls made to the mock objects. NSubstitute supports a wide range of testing frameworks and test runners, including MSTest, NUnit, and xUnit and it also supports various platforms including .NET Framework, .NET Core, Xamarin and Unity.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "Overview of NSubstitute",
+        "url": "https://github.com/nsubstitute/NSubstitute",
+        "type": "opensource"
+      },
+      {
+        "title": "Getting started NSubstitute",
+        "url": "https://nsubstitute.github.io/help/getting-started/",
+        "type": "article"
+      }
+    ]
+  },
+  "eyOXWb1kL80Wqiwc2WHd_": {
+    "title": "Moq",
+    "description": "Moq is an open-source library for .NET that allows developers to create mock objects for use in unit testing, it is a popular mocking framework that provides a simple and intuitive syntax for creating mock objects and setting up mock behavior. In the context of [ASP.NET](http://ASP.NET), Moq can be used to create mock objects for testing web applications built using the [ASP.NET](http://ASP.NET) framework, it provides a simple and expressive syntax for creating mock objects and setting up mock behavior. Moq supports a wide range of testing frameworks, including MSTest, NUnit, and xUnit and it also supports various platforms including .NET Framework, .NET Core and Xamarin. Moq is lightweight and easy to use, making it a good choice for developers who are new to mocking and unit testing, it also provides a rich set of features, such as support for setting up mock behavior, making assertions on calls made to the mock objects, and more.\n\nVisit the following links to learn more:",
+    "links": [
+      {
+        "title": "What is use of Moq?",
+        "url": "https://stackoverflow.com/questions/678878/what-is-use-of-moq",
+        "type": "article"
+      },
+      {
+        "title": "Moq - Unit Test In .NET Core App",
+        "url": "https://www.c-sharpcorner.com/article/moq-unit-test-net-core-app-using-mock-object/",
+        "type": "article"
+      },
+      {
+        "title": "Getting started with Mocking using Moq in .NET",
+        "url": "https://www.youtube.com/watch?v=9ZvDBSQa_so",
+        "type": "video"
+      }
+    ]
+  },
+  "diRJ_F6kx42Ucs0fxidtZ": {
+    "title": "FakeItEasy",
+    "description": "FakeItEasy is an open-source library for .NET that allows developers to create fake objects for use in unit testing, it is a powerful and easy-to-use mocking framework that provides a simple and intuitive syntax for creating fake objects and setting up fake behavior. In the context of [ASP.NET](http://ASP.NET), FakeItEasy can be used to create fake objects for testing web applications built using the [ASP.NET](http://ASP.NET) framework, it provides a simple and expressive syntax for creating fake objects and setting up fake behavior. FakeItEasy supports a wide range of testing frameworks, including MSTest, NUnit, and xUnit. FakeItEasy is lightweight and easy to use, making it a good choice for developers who are new to mocking and unit testing, it also provides a rich set of features, such as support for setting up fake behavior, making assertions on calls made to the fake objects, and more. It also has a wide range of extension points for customizing the fakes to suit different needs.\n\nVisit the following links to learn more:",
+    "links": [
+      {
+        "title": "Easy mocking in C# code with FakeItEasy library",
+        "url": "https://devislandblog.wordpress.com/2018/05/09/easy-mocking-in-c-code-with-fakeiteasy-library/",
+        "type": "article"
+      },
+      {
+        "title": "FakeItEasy when testing ASP.NET Core controllers",
+        "url": "https://stackoverflow.com/questions/56170818/how-to-fake-an-interface-method-dynamically-with-fakeiteasy-when-testing-asp-net",
+        "type": "article"
+      }
+    ]
+  },
+  "K49M_7gSpfJuZaE6WaHxQ": {
+    "title": "AutoFixture",
+    "description": "",
+    "links": []
+  },
+  "QERTjawqCCCkHfR44Ca0s": {
+    "title": "Bogus",
+    "description": "",
+    "links": []
+  },
+  "37c2eCvRdebztkbc5AjYp": {
+    "title": "Microservices",
+    "description": "Microservices are a software architectural style in which a large application is built as a set of small, independent services that communicate with each other through APIs. These services are typically built using different technologies and run in their own processes, and can be deployed, scaled, and updated independently.\n\nIn [ASP.NET](http://ASP.NET), microservices can be built using the .NET Core framework, which is a cross-platform, open-source version of the .NET framework that can run on Windows, Linux, and macOS. Each microservice can be built as a self-contained, small web application that handles a specific set of functionality, such as user management, product catalog, or order processing.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "Intro to Microservices Using ASP.NET Core",
+        "url": "https://www.c-sharpcorner.com/article/microservice-using-asp-net-core/",
+        "type": "article"
+      },
+      {
+        "title": "Advantages and Disadvantages of Microservices Architecture",
+        "url": "https://www.dotnettricks.com/learn/microservices/architecture-example-advantages",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Microservices",
+        "url": "https://app.daily.dev/tags/microservices?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "sNYYEBMHV_NO_NToP51VY": {
+    "title": "ActiveMQ",
+    "description": "ActiveMQ is an open-source message broker written in Java that implements the Java Message Service (JMS) API. It can be used to send and receive messages between different applications in a loosely coupled, asynchronous manner. ActiveMQ supports a variety of messaging protocols, including JMS, AMQP, STOMP, MQTT, and OpenWire.\n\nIn the context of an [ASP.NET](http://ASP.NET) application, ActiveMQ can be used to send and receive messages to and from other systems. For example, it can be used to send messages from a web application to a background service, or to send messages between different microservices.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "What Is ActiveMQ And How Can You Use It?",
+        "url": "https://www.c-sharpcorner.com/article/what-is-activemq-and-how-can-you-use-it/",
+        "type": "article"
+      },
+      {
+        "title": "Messaging with .NET and ActiveMQ",
+        "url": "https://remark.wordpress.com/articles/messaging-with-net-and-activemq/",
+        "type": "article"
+      },
+      {
+        "title": "Messaging with ActiveMQ and ASP.NET",
+        "url": "https://havret.io/activemq-artemis-net-core",
+        "type": "article"
+      }
+    ]
+  },
+  "L8RkeMYm0WGNeLLcHKF1R": {
+    "title": "Kafka",
+    "description": "Apache Kafka is an open-source, distributed event streaming platform that is used for building real-time data pipelines and streaming applications. It is designed to handle high volumes of data and to support real-time data processing.\n\nKafka is based on a publish-subscribe model, where producers write data to topics, and consumers read data from those topics. Data is stored in topics in a log-based format, which allows for efficient storage and retrieval of data.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "Working with Apache Kafka in ASP.NET",
+        "url": "https://www.codemag.com/Article/2201061/Working-with-Apache-Kafka-in-ASP.NET-6-Core",
+        "type": "article"
+      },
+      {
+        "title": "Kafka and .NET",
+        "url": "https://docs.confluent.io/kafka-clients/dotnet/current/overview.html",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Apache",
+        "url": "https://app.daily.dev/tags/apache?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "KqvBn2_wvYhFdv0dBZMC9": {
+    "title": "RabbitMQ",
+    "description": "RabbitMQ is an open-source message broker software that implements the Advanced Message Queuing Protocol (AMQP). It is written in Erlang and can be used to send and receive messages between different applications in a loosely coupled, asynchronous manner. RabbitMQ supports a variety of messaging patterns, including point-to-point, publish-subscribe, and request-response.\n\nIn the context of an [ASP.NET](http://ASP.NET) application, RabbitMQ can be used to send and receive messages to and from other systems. For example, it can be used to send messages from a web application to a background service, or to send messages between different microservices.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "How to Use RabbitMQ in ASP NET?",
+        "url": "https://www.freecodespot.com/blog/use-rabbitmq-in-asp-net-core/",
+        "type": "article"
+      },
+      {
+        "title": "Introduction of RabbitMQ",
+        "url": "https://www.rabbitmq.com/tutorials/tutorial-one-dotnet.html",
+        "type": "article"
+      },
+      {
+        "title": "ASP.NET and RabbitMQ",
+        "url": "https://referbruv.com/blog/integrating-rabbitmq-with-aspnet-core-quickstart-with-an-example/",
+        "type": "article"
+      }
+    ]
+  },
+  "8d4f7_3VO03vy7YDWwPI9": {
+    "title": "NetMQ",
+    "description": "NetMQ is a lightweight, open-source messaging library for building distributed systems and real-time applications in .NET. It provides an API for sending and receiving messages using a variety of messaging patterns and protocols, including request-response, publish-subscribe, and push-pull.\n\nNetMQ is built on top of ZeroMQ, a high-performance, asynchronous messaging library that provides a minimalistic socket-based API for building distributed systems. NetMQ is designed to be easy to use and to abstract away the complexities of ZeroMQ, making it a good choice for developers who want to add messaging capabilities to their [ASP.NET](http://ASP.NET) applications without having to learn a complex API.\n\nVisit the following links to learn more:",
+    "links": [
+      {
+        "title": "Documentation of NetMQ",
+        "url": "https://netmq.readthedocs.io/en/latest/introduction/",
+        "type": "article"
+      },
+      {
+        "title": "NetMQ and creating a Dynamic Worker in .NET",
+        "url": "https://mikaelkoskinen.net/post/netmq-and-creating-a-dynamic-worker-per-task",
+        "type": "article"
+      }
+    ]
+  },
+  "azuer-service-bus@gBuaVZfqJ0-g21sKohQtx.md": {
+    "title": "Azuer Service Bus",
+    "description": "",
+    "links": []
+  },
+  "SQKIUa_UsJ4cls-Vs9yHU": {
+    "title": "Mass Transit",
+    "description": "MassTransit is an open-source, highly configurable service bus framework for building distributed systems using the .NET framework. It allows developers to easily create message-based, loosely-coupled applications by providing a simple and fluent API for defining message contracts, handling messages, and managing message routing.\n\nIt supports multiple messaging transports such as RabbitMQ, Azure Service Bus, Amazon SQS and others, automatic serialization and deserialization of messages, automatic retries and exception handling for failed message deliveries, and support for advanced messaging patterns like publish-subscribe, request-response, and event-driven architectures.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "Complete guide to MassTransit",
+        "url": "https://github.com/MassTransit/MassTransit",
+        "type": "opensource"
+      },
+      {
+        "title": "Using MassTransit with RabbitMQ in ASP.NET Core",
+        "url": "https://code-maze.com/masstransit-rabbitmq-aspnetcore/",
+        "type": "article"
+      }
+    ]
+  },
+  "vf8W1FLhcb3awx4JBaY5r": {
+    "title": "NServiceBus",
+    "description": "NServiceBus (NSB) is a service bus framework for building distributed systems using the .NET framework. It provides a set of features for building message-based, loosely-coupled applications, including support for message routing, message handling, and message persistence.\n\nNSB supports multiple messaging transports, including MSMQ, RabbitMQ, and Azure Service Bus, and provides support for advanced messaging patterns such as publish-subscribe, request-response, and message-based sagas.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "Using NServiceBus in an ASP.NET",
+        "url": "https://docs.particular.net/samples/web/send-from-aspnetcore-webapi/",
+        "type": "article"
+      },
+      {
+        "title": "Learn NServiceBus from .NET Core",
+        "url": "https://www.codeproject.com/Articles/1224839/Learn-NServiceBus-from-NET-Core-WebAPI",
+        "type": "article"
+      }
+    ]
+  },
+  "X6iSHoHnFFMaGb6YPQFhl": {
+    "title": "EasyNetQ",
+    "description": "EasyNetQ is a simple and easy-to-use .NET client for RabbitMQ, a popular open-source message broker. It provides a simple and fluent API for connecting to RabbitMQ, publishing and consuming messages, and managing message queues.\n\nEasyNetQ supports a wide range of messaging patterns, such as publish-subscribe, request-response, and message-based sagas, and makes it easy to work with RabbitMQ's advanced features, such as message routing, message persistence, and message acknowledgements.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "Overview of EasyNetQ",
+        "url": "https://easynetq.com/",
+        "type": "article"
+      },
+      {
+        "title": "RabbitMQ with EasyNetQ Tutorials",
+        "url": "https://www.youtube.com/watch?v=CqxV_Xn4PlI",
+        "type": "video"
+      }
+    ]
+  },
+  "2k-rGuhYTTAR9XN3aDAnW": {
+    "title": "Ocelot",
+    "description": "Ocelot is an open-source API gateway for [ASP.NET](http://ASP.NET) Core. It is designed to work as a reverse proxy, routing incoming requests to the appropriate service and aggregating the responses to return to the client. Ocelot allows you to define routing rules, handle requests and responses, and perform other common API gateway tasks such as rate limiting, caching, and authentication.\n\nOne of the key features of Ocelot is its flexibility, it can route incoming requests to multiple services, aggregate the responses, and return them as a single response to the client. It also allows you to define dynamic routes, based on the request's content, perform request and response transformations, and handle errors.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "Implement API Gateways with Ocelot",
+        "url": "https://learn.microsoft.com/en-us/dotnet/architecture/microservices/multi-container-microservice-net-applications/implement-api-gateways-with-ocelot",
+        "type": "article"
+      },
+      {
+        "title": "Getting Started with Ocelot",
+        "url": "https://ocelot.readthedocs.io/en/latest/introduction/gettingstarted.html",
+        "type": "article"
+      },
+      {
+        "title": "Building an API Gateway in ASP.NET using Ocelotss",
+        "url": "https://www.youtube.com/watch?v=hlUGZ6Hmv6s",
+        "type": "video"
+      }
+    ]
+  },
+  "2axfolu26P8XwxMxgMaS3": {
+    "title": "YARP",
+    "description": "YARP is a library to help create reverse proxy servers that are high-performance, production-ready, and highly customizable. YARP is built on .NET using the infrastructure from [ASP.NET](http://ASP.NET) and .NET (.NET 6 and newer). The key differentiator for YARP is that it's been designed to be easily customized and tweaked via .NET code to match the specific needs of each deployment scenario. YARP is designed with customizability as a primary scenario rather than requiring you to break out to script or rebuild the library from source.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "Getting Started with YARP",
+        "url": "https://microsoft.github.io/reverse-proxy/articles/getting-started.html",
+        "type": "article"
+      },
+      {
+        "title": "YARP: The .NET Reverse proxy",
+        "url": "https://www.youtube.com/watch?v=1IqQkNcsqWE",
+        "type": "video"
+      }
+    ]
+  },
+  "rmRESzLiZNWdBFXLrwQFJ": {
+    "title": "Docker",
+    "description": "Docker is a platform for developing, shipping, and running applications in containers. A container is a lightweight, standalone, and executable package of software that includes everything needed to run a piece of software, including the code, a runtime, system tools, libraries, and settings.\n\nDocker allows developers to package their applications and dependencies into a container, which can then be easily deployed and run on any host machine with Docker installed. This makes it easy to run the same software on different environments, such as development, staging, and production, without worrying about compatibility issues.s\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "ASP.NET and Docker",
+        "url": "https://www.tatvasoft.com/blog/asp-net-core-and-docker/",
+        "type": "article"
+      },
+      {
+        "title": "Introduction to .NET and Docker",
+        "url": "https://learn.microsoft.com/en-us/dotnet/core/docker/introduction",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Docker",
+        "url": "https://app.daily.dev/tags/docker?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "What is Docker, Why use it?",
+        "url": "https://www.youtube.com/watch?v=vmnvOITMoIg",
+        "type": "video"
+      }
+    ]
+  },
+  "02rtFStTeIm8prNskxaUN": {
+    "title": "Kubernetes",
+    "description": "Kubernetes is an [open source](https://github.com/kubernetes/kubernetes) container management platform, and the dominant product in this space. Using Kubernetes, teams can deploy images across multiple underlying hosts, defining their desired availability, deployment logic, and scaling logic in YAML. Kubernetes evolved from Borg, an internal Google platform used to provision and allocate compute resources (similar to the Autopilot and Aquaman systems of Microsoft Azure).\n\nThe popularity of Kubernetes has made it an increasingly important skill for the DevOps Engineer and has triggered the creation of Platform teams across the industry. These Platform engineering teams often exist with the sole purpose of making Kubernetes approachable and usable for their product development colleagues.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Kubernetes Website",
+        "url": "https://kubernetes.io/",
+        "type": "article"
+      },
+      {
+        "title": "Kubernetes Documentation",
+        "url": "https://kubernetes.io/docs/home/",
+        "type": "article"
+      },
+      {
+        "title": "Primer: How Kubernetes Came to Be, What It Is, and Why You Should Care",
+        "url": "https://thenewstack.io/primer-how-kubernetes-came-to-be-what-it-is-and-why-you-should-care/",
+        "type": "article"
+      },
+      {
+        "title": "Kubernetes: An Overview",
+        "url": "https://thenewstack.io/kubernetes-an-overview/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Kubernetes",
+        "url": "https://app.daily.dev/tags/kubernetes?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "Kubernetes Crash Course for Absolute Beginners",
+        "url": "https://www.youtube.com/watch?v=s_o8dwzRlu4",
+        "type": "video"
+      }
+    ]
+  },
+  "HqhqqiA5X00Xl1RnZgrNJ": {
+    "title": ".NET Aspire",
+    "description": "",
+    "links": []
+  },
+  "XKsLqDDco5OXKURCcWAmv": {
+    "title": "Orleans",
+    "description": "Orleans is an open-source virtual actor model framework for building distributed, high-scale, and low-latency applications in .NET. It is designed to make it easy to build and operate large-scale, distributed systems, such as cloud services, IoT applications, and gaming servers.\n\nOne of the key features of Orleans is its use of the virtual actor model, which is a programming model that allows developers to write concurrent and parallel code in a way that is similar to writing single-threaded code. Orleans provides a set of abstractions for building stateful actors, which are similar to objects in object-oriented programming, that can be distributed across multiple machines. These actors can communicate with each other using message passing, and can be accessed remotely using a transparent proxy\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "Microsoft Orleans",
+        "url": "https://learn.microsoft.com/en-us/dotnet/orleans/overview",
+        "type": "article"
+      },
+      {
+        "title": "Introduction to Orleans",
+        "url": "https://dev.to/willvelida/introduction-to-microsoft-orleans-796",
+        "type": "article"
+      },
+      {
+        "title": "Building real applications with Orleans",
+        "url": "https://www.youtube.com/watch?v=8duFuggnj8o",
+        "type": "video"
+      }
+    ]
+  },
+  "s8evqe2MireS1UhxoXrd1": {
+    "title": "SteelToe",
+    "description": "Steeltoe is an open-source project that provides a set of libraries for building cloud-native applications on the .NET platform. The libraries are designed to work with the .NET Core runtime and provide a set of abstractions for common cloud-native patterns, such as service discovery, configuration management, and circuit breaking. The goal of Steeltoe is to make it easy for developers to take advantage of the cloud-native capabilities of the .NET platform and build resilient and scalable applications.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": ".NET Microservices with Steeltoe",
+        "url": "https://learn.microsoft.com/en-us/shows/on-net/net-microservices-with-steeltoe",
+        "type": "article"
+      },
+      {
+        "title": "Steeltoe Documentation",
+        "url": "https://docs.steeltoe.io/api/v3/welcome/index.html",
+        "type": "article"
+      },
+      {
+        "title": ".NET Microservices with Steeltoe",
+        "url": "https://www.youtube.com/watch?v=QLRi6iPapVg",
+        "type": "video"
+      }
+    ]
+  },
+  "IHY9uL3dzYmf2D2wWgIh-": {
+    "title": "Dapr",
+    "description": "Dapr (Distributed Application Runtime) is an open-source, portable runtime that makes it easy to build microservices-based applications that run on the cloud and edge. It provides a set of building blocks for building microservices, including service discovery, state management, pub-sub messaging, and more. It is designed to be language-agnostic, so it can be used with any programming language, including .NET.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "Get started with Dapr",
+        "url": "https://learn.microsoft.com/en-us/dotnet/architecture/dapr-for-net-developers/getting-started",
+        "type": "article"
+      },
+      {
+        "title": "Building an event-driven .NET Core app with Dapr",
+        "url": "https://medium.com/polarsquad/building-an-event-driven-net-core-app-with-dapr-58cc83ab120b",
+        "type": "article"
+      }
+    ]
+  },
+  "KIFmahcNiSo2NGoLtAyRR": {
+    "title": "CI / CD",
+    "description": "CI/CD (Continuous Integration/Continuous Deployment) is a software development practice that involves automating the process of building, testing, and deploying code changes. It is a popular practice among software development teams, as it helps to ensure that code changes are integrated, tested, and deployed quickly and reliably.\n\nIn the context of [ASP.NET](http://ASP.NET), CI/CD can be used to automate various tasks related to the development, testing, and deployment of [ASP.NET](http://ASP.NET) applications. For example, you can use CI/CD to automatically build, test, and deploy an [ASP.NET](http://ASP.NET) application to a hosting provider, such as Azure or AWS, every time you push code to your source control repository.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "How to reate a CI/CD pipeline for ASP.NET?",
+        "url": "https://www.azuredevopslabs.com/labs/vstsextend/azuredevopsprojectdotnet/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about CI/CD",
+        "url": "https://app.daily.dev/tags/cicd?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "Building a CI/CD Pipeline in Azure DevOps for ASP.NET Core",
+        "url": "https://youtube.com/watch?v=eOQL0nXQlLs",
+        "type": "video"
+      }
+    ]
+  },
+  "0-PLMXGlRyRzTk-EjXMs2": {
+    "title": "GitHub Actions",
+    "description": "GitHub Actions is a powerful and flexible automation platform that enables developers to create custom workflows for their software development lifecycle (SDLC) directly in their GitHub repository. It allows developers to automate various tasks, such as building, testing, and deploying code, directly from their GitHub repository.\n\nIn [ASP.NET](http://ASP.NET), GitHub Actions can be used to automate various tasks related to the development, testing, and deployment of [ASP.NET](http://ASP.NET) applications. For example, you can use GitHub Actions to automatically build, test, and deploy an [ASP.NET](http://ASP.NET) application to a hosting provider, such as Azure or AWS, every time you push code to your GitHub repository.\n\nVisit the following links to learn more:",
+    "links": [
+      {
+        "title": "Intro to GitHub Actions for .NET",
+        "url": "https://devblogs.microsoft.com/dotnet/dotnet-loves-github-actions/",
+        "type": "article"
+      },
+      {
+        "title": "Tutorial: Create a GitHub Action with .NET",
+        "url": "https://learn.microsoft.com/en-us/dotnet/devops/create-dotnet-github-action",
+        "type": "article"
+      },
+      {
+        "title": "Building and testing .NET",
+        "url": "https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about GitHub",
+        "url": "https://app.daily.dev/tags/github?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "_-GQNpsb7KZw76hNNOq3h": {
+    "title": "Azure Pipelines",
+    "description": "Azure Pipelines is a continuous integration and continuous delivery (CI/CD) platform that allows developers to automate the process of building, testing, and deploying code. It is a part of the Azure DevOps suite of tools and can be used to automate the software development process for various languages and platforms, including [ASP.NET](http://ASP.NET).\n\nIn [ASP.NET](http://ASP.NET), Azure Pipelines can be used to automate various tasks related to the development, testing, and deployment of [ASP.NET](http://ASP.NET) applications. For example, you can use Azure Pipelines to automatically build, test, and deploy an [ASP.NET](http://ASP.NET) application to a hosting provider, such as Azure or AWS, every time you push code to your source control repository.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "Deploy ASP.NET Apps with Azure Pipelines",
+        "url": "https://learn.microsoft.com/en-us/training/modules/deploy-aspnet-apps-azure-app-service-pipelines/",
+        "type": "article"
+      },
+      {
+        "title": "Build ASP.NET apps with .NET Framework",
+        "url": "https://learn.microsoft.com/en-us/azure/devops/pipelines/apps/aspnet/build-aspnet-4?view=azure-devops",
+        "type": "article"
+      },
+      {
+        "title": "How to Build, test & deploy .NET Apps",
+        "url": "https://learn.microsoft.com/en-us/azure/devops/pipelines/ecosystems/dotnet-core?view=azure-devops&tabs=dotnetfive",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Azure",
+        "url": "https://app.daily.dev/tags/azure?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "8Y73Ae32eo6_ye7dw5QRQ": {
+    "title": "GitLab CI/CD",
+    "description": "",
+    "links": []
+  },
+  "KyGjXgG6JFo42qOV0wqfB": {
+    "title": "Circle CI",
+    "description": "CircleCI is a cloud-based continuous integration and continuous delivery (CI/CD) platform that allows developers to automate the process of building, testing, and deploying code. It is a popular platform that supports a wide range of languages and frameworks, including [ASP.NET](http://ASP.NET).\n\nIn [ASP.NET](http://ASP.NET), CircleCI can be used to automate various tasks related to the development, testing, and deployment of [ASP.NET](http://ASP.NET) applications. For example, you can use CircleCI to automatically build, test, and deploy an [ASP.NET](http://ASP.NET) application to a hosting provider, such as Azure or AWS, every time you push code to your source control repository.\n\nVisit the following links to learn more:",
+    "links": [
+      {
+        "title": "How to Setup CircleCI for ASP.NET project",
+        "url": "https://discuss.circleci.com/t/setup-circleci-for-asp-net-project/33796s",
+        "type": "article"
+      },
+      {
+        "title": "Building and testing an ASP.NET apps with CircleCI",
+        "url": "https://circleci.com/blog/building-and-testing-an-asp-net-core-application/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about CI/CD",
+        "url": "https://app.daily.dev/tags/cicd?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "C85aJvrzj6rP2Hmfj9uPB": {
+    "title": "Template Engines",
+    "description": "Template engines in [ASP.NET](http://ASP.NET) are libraries that allow developers to embed dynamic data in HTML templates. These engines are used to separate the logic of the application from the presentation of the data, making it easy to change the appearance of the application without having to change the underlying code.\n\nTo learn more, visit the followin link:",
+    "links": [
+      {
+        "title": "Template Engine in ASP.NET",
+        "url": "https://ej2.syncfusion.com/aspnetmvc/documentation/common/template-engine",
+        "type": "article"
+      },
+      {
+        "title": "How to to Create Custom Templates using the .Net Template Engine ",
+        "url": "https://www.infoq.com/articles/dotnet-core-template-engine/",
+        "type": "article"
+      }
+    ]
+  },
+  "nUE2-egUMNFQoPVrVRFPl": {
+    "title": "Razor",
+    "description": "Razor is a markup syntax for embedding server-side code in web pages. It was introduced with [ASP.NET](http://ASP.NET) MVC 3 and later became a part of [ASP.NET](http://ASP.NET) Web Pages. It allows developers to write server-side code using C# or Visual Basic and embed it in HTML markup. Its syntax is designed to be compact and easy to read. It provides a rich set of features for building web applications, such as a component model for building reusable UI, a routing system for navigation, and support for dependency injection, it also allows you to use the same libraries, frameworks, and tools that you're already familiar with from building traditional [ASP.NET](http://ASP.NET) web applications.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "Complete Guide to ASP.NET Razor",
+        "url": "https://w3schools.com/asp/razor_intro.asp",
+        "type": "article"
+      },
+      {
+        "title": "Introduction to ASP.NET Web Programming Using Razor",
+        "url": "https://learn.microsoft.com/en-us/aspnet/web-pages/overview/getting-started/introducing-razor-syntax-c",
+        "type": "article"
+      },
+      {
+        "title": "An Introduction To Razor",
+        "url": "https://khalidabuhakmeh.com/what-is-razor-aspnet",
+        "type": "article"
+      }
+    ]
+  },
+  "dWB5OCvWVYkD30Op_dMwy": {
+    "title": "Scriban",
+    "description": "Scriban is an open-source, lightweight template engine for .NET that is based on the Lua programming language. It is designed to be simple and easy to use, while still providing a powerful set of features for creating and manipulating templates. It provides a simple and easy-to-use API for parsing and rendering templates, and supports a wide range of features such as variables, loops, conditionals, and functions. It also provides a wide range of built-in functions for working with strings, numbers, dates, and other types of data, and also supports advanced features such as scripting and metaprogramming.\n\nVisit the following links to learn more about Scriban:",
+    "links": [
+      {
+        "title": "Guide to Scriban in ASP.NET",
+        "url": "https://github.com/scriban/scriban",
+        "type": "opensource"
+      },
+      {
+        "title": "Introduction to Scriban",
+        "url": "https://www.markvanaalst.com/blog/sxa/sxa-9-3-introducing-scriban/",
+        "type": "article"
+      }
+    ]
+  },
+  "ZaOhWWDgVxrn0hbesJ7xT": {
+    "title": "Fluid",
+    "description": "Fluid is a template engine for .NET that is based on the Fluid template language, it is similar to Liquid, but it's written in C#. It provides a simple and easy-to-use API for parsing and rendering templates, and supports a wide range of features such as variables, loops, conditionals, and functions. It also provides a wide range of built-in functions for working with strings, numbers, dates, and other types of data. It also supports advanced features such as scripting and metaprogramming. It is often used in web applications to separate the logic of the application from the presentation of the data, making it easy to change the appearance of the application without having to change the underlying code.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "Overview of Fluid",
+        "url": "https://github.com/sebastienros/fluid",
+        "type": "opensource"
+      }
+    ]
+  },
+  "1YL7aXluINOO15W3waaiD": {
+    "title": "Frameworks",
+    "description": "",
+    "links": []
+  },
+  "4iD_hDtgJ15IlJGxiO-E8": {
+    "title": "Blazor",
+    "description": "Blazor is a framework for building web applications using C# and .NET that runs in the browser via WebAssembly. It allows developers to write C# code that runs directly in the browser, eliminating the need for JavaScript.\n\nBlazor comes in two flavors:\n\n*   Blazor WebAssembly, a client-side solution that allows you to run C# code directly in the browser using WebAssembly. The app is executed on the client-side and can work offline, it can also interact with JavaScript and access the browser's DOM.\n*   Blazor Server, a server-side solution that allows you to run C# code on the server and update the UI in real-time. The app is executed on the server-side and requires an active connection to the server to function.\n\nTo learn more, visit the following resources:",
+    "links": [
+      {
+        "title": "Guide to ASP.NET Core Blazor",
+        "url": "https://learn.microsoft.com/en-us/aspnet/core/blazor/?view=aspnetcore-7.0",
+        "type": "article"
+      },
+      {
+        "title": "What Is Blazor And How It Works?",
+        "url": "https://www.c-sharpcorner.com/article/what-is-blazor-and-how-does-it-works/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Blazor",
+        "url": "https://app.daily.dev/tags/blazor?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "Tutorial of ASP.NET Core Blazor",
+        "url": "https://www.youtube.com/watch?v=LyO4zj6NRuc",
+        "type": "video"
+      }
+    ]
+  },
+  "olqSPUU3RoxhQ6exfMzeN": {
+    "title": ".NET MAUI",
+    "description": "",
+    "links": []
+  },
+  "Zb4Gugxf7d6MoeEcfngrV": {
+    "title": "Scalar",
+    "description": "",
+    "links": []
+  },
+  "cc0UNQwbDlySue-CvpChR": {
+    "title": "MediatR",
+    "description": "MediatR is an open-source library for .NET that is designed to simplify the process of handling messages and commands in a clean, decoupled manner. It's particularly useful in applications that use the Command-Query Responsibility Segregation (CQRS) pattern and event-driven architecture. It provides a simple and easy-to-use API for handling messages, and supports the concept of pipelines, which allow you to add additional behavior to message handling, such as logging, validation, and exception handling.\n\nFor more information, visit the following links:",
+    "links": [
+      {
+        "title": "Use MediatR in ASP.NET or ASP.NET Core",
+        "url": "https://medium.com/dotnet-hub/use-mediatr-in-asp-net-or-asp-net-core-cqrs-and-mediator-in-dotnet-how-to-use-mediatr-cqrs-aspnetcore-5076e2f2880c",
+        "type": "article"
+      },
+      {
+        "title": "How to implement CQRS using MediatR in an ASP.NET?",
+        "url": "https://christian-schou.dk/blog/how-to-implement-cqrs-with-mediatr-in-asp-net/",
+        "type": "article"
+      }
+    ]
+  },
+  "sa0zXd8lpNs_SFQ2y-PY4": {
+    "title": "FluentValidation",
+    "description": "FluentValidation is an open-source library for .NET that provides a fluent, easy-to-use API for validating domain models. It allows developers to define validation rules using a fluent, chainable syntax. It separates validation rules into separate classes called validators, it supports async validation, custom validation rules, and cascading validation. It makes it easy to read and understand the validation logic, and it returns a ValidationResult object, which contains information about any validation errors that were found.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "Documentations of FluentValidation",
+        "url": "https://docs.fluentvalidation.net/en/latest/",
+        "type": "article"
+      },
+      {
+        "title": "FluentValidation in ASP.NET Core",
+        "url": "https://docs.fluentvalidation.net/en/latest/aspnet.html",
+        "type": "article"
+      },
+      {
+        "title": "Overview of FluentValidation in ASP.NET Core",
+        "url": "https://code-maze.com/fluentvalidation-in-aspnet/",
+        "type": "article"
+      }
+    ]
+  },
+  "gQhiEpvx__70N1WbEHGYJ": {
+    "title": "Polly",
+    "description": "Polly is an open-source library for .NET that provides a simple and flexible API for handling transient faults and other types of errors that occur during the execution of a service. It allows developers to define a set of policies, such as retry, circuit breaker, and timeout, that can be used to handle specific types of errors and improve the resiliency of the service. It provides a fluent API that makes it easy to define and configure policies, supports advanced features such as async and sync execution, fallback policies, and policy wrapping. Additionally, it allows to specify the exception type that is thrown and it would trigger the policy.\n\nTo learn more, visit the following resources:",
+    "links": [
+      {
+        "title": "Using Polly for .NET Resilience",
+        "url": "https://www.telerik.com/blogs/using-polly-for-net-resilience-and-transient-fault-handling-with-net-core",
+        "type": "article"
+      },
+      {
+        "title": "Build Resilient Microservices Using Polly In ASP.NET",
+        "url": "https://procodeguide.com/programming/polly-in-aspnet-core/",
+        "type": "article"
+      }
+    ]
+  },
+  "ipb6proIZKG-_vCOMAiBu": {
+    "title": "Marten",
+    "description": "",
+    "links": []
+  },
+  "EsC1JwFOMOlQVelpmxISh": {
+    "title": "Nuke",
+    "description": "NUKE (Build Automation for .NET) is an open-source build automation tool for .NET projects. It is designed to be simple, flexible, and extensible, making it easy to automate the build, test, and deployment process of your .NET projects.\n\nNUKE allows you to define your build process using a simple, declarative syntax, making it easy to understand and maintain. It provides a set of built-in tasks for common build actions, such as compiling, testing, and publishing, as well as a powerful extensibility model that allows you to add custom tasks and scripts.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "How to Build Automation with NUKE",
+        "url": "https://learn.microsoft.com/en-us/shows/on-net/build-automation-with-nuke",
+        "type": "article"
+      },
+      {
+        "title": "Automate your .NET project builds with NUKE",
+        "url": "https://laurentkempe.com/2022/02/02/automate-your-dotnet-project-builds-with-nuke-a-cross-platform-build-automation-solution/",
+        "type": "article"
+      }
+    ]
+  },
+  "9LEVN-uVEwxJooEiB9ApK": {
+    "title": "Benchmark.NET",
+    "description": "BenchmarkDotNet is an open-source library for .NET that provides a simple and easy-to-use API for benchmarking the performance of code. It allows you to measure the performance of methods, classes, and entire assemblies, and provides a rich set of features for analyzing and comparing the results. It provides a wide range of performance metrics, such as CPU cycles, memory allocation, and garbage collection, and can generate detailed reports that include charts, tables, and source code highlighting. It has support for multithreading and a built-in support for .NET Core.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "Benchmarking .NET Using BenchmarkDotNet",
+        "url": "https://www.codemag.com/Article/2209061/Benchmarking-.NET-6-Applications-Using-BenchmarkDotNet-A-Deep-Dive",
+        "type": "article"
+      },
+      {
+        "title": "Benchmarking ASP.NET Applications with .NET Crank",
+        "url": "https://www.youtube.com/watch?v=2IgfrnG-128",
+        "type": "video"
+      },
+      {
+        "title": "Intro to BenchmarkDotNet",
+        "url": "https://www.youtube.com/watch?v=mmza9x3QxYE",
+        "type": "video"
+      }
+    ]
+  },
+  "T2FsSndxzSuKTFdjoyPi-": {
+    "title": "Distributed Lock",
+    "description": "",
+    "links": []
+  },
+  "236VJJjMvqHfSj-MHSDPV": {
+    "title": "MSTest",
+    "description": "MSTest is a unit testing framework for the .NET framework, it's one of the built-in test frameworks in Visual Studio and it's widely used for unit testing in the .NET ecosystem. In the context of [ASP.NET](http://ASP.NET), MSTest can be used to write unit tests for web applications built using the [ASP.NET](http://ASP.NET) framework. MSTest provides features such as data-driven testing, parallel test execution, and test discovery and execution, it also provides the ability to run tests on multiple frameworks.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": ".NET Core testing with MSTest",
+        "url": "https://www.oreilly.com/library/view/c-and-net/9781788292481/aa08c601-f374-4e31-be8e-8eb69d63bd19.xhtml",
+        "type": "article"
+      },
+      {
+        "title": "Unit testing with MSTest and .NET",
+        "url": "https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-with-mstest",
+        "type": "article"
+      },
+      {
+        "title": "Complete Guide of MSTest for Unit Testing in ASP.NET",
+        "url": "https://sweetcode.io/a-complete-guide-of-mstest-for-unit-testing-in-asp-net/",
+        "type": "article"
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/public/roadmap-content/backend.json b/public/roadmap-content/backend.json
index 521c7ea97..345e5c1ea 100644
--- a/public/roadmap-content/backend.json
+++ b/public/roadmap-content/backend.json
@@ -629,7 +629,7 @@
         "type": "article"
       },
       {
-        "title": "MySQL Full Course for free",
+        "title": "MySQL Complete Course",
         "url": "https://www.youtube.com/watch?v=5OdVJbNCSso",
         "type": "video"
       }
@@ -1690,8 +1690,8 @@
         "type": "article"
       },
       {
-        "title": "Architectural Patterns in a nutshell",
-        "url": "https://towardsdatascience.com/10-common-software-architectural-patterns-in-a-nutshell-a0b47a1e9013",
+        "title": "10 Common Software Architectural Patterns in a nutshell",
+        "url": "https://theiotacademy.medium.com/10-common-software-architectural-patterns-in-a-nutshell-1b1f6cf5036b",
         "type": "article"
       }
     ]
diff --git a/public/roadmap-content/cloudflare.json b/public/roadmap-content/cloudflare.json
new file mode 100644
index 000000000..cc55bb87b
--- /dev/null
+++ b/public/roadmap-content/cloudflare.json
@@ -0,0 +1,1643 @@
+{
+  "PcYnYAAkKMbzoiCnBfjqO": {
+    "title": "JavaScript Fundamentals",
+    "description": "JavaScript is a versatile, high-level programming language primarily used for adding interactivity and dynamic features to websites. It runs in the browser, allowing for client-side scripting that can manipulate HTML and CSS, respond to user events, and interact with web APIs.\n\nJavaScript is a core language for Cloudflare Workers, allowing you to write serverless functions that run on Cloudflare's edge network. You'll use it to intercept and modify HTTP requests and responses, customize website behavior, and build dynamic applications. Understanding JavaScript fundamentals like variables, functions, asynchronous programming (Promises, async/await), and DOM manipulation is crucial for effective Cloudflare Workers development. You can also use TypeScript, which compiles to JavaScript, offering static typing benefits.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Visit Dedicated JavaScript Roadmap",
+        "url": "https://roadmap.sh/javascript",
+        "type": "article"
+      },
+      {
+        "title": "JavaScript · Cloudflare Workers",
+        "url": "https://developers.cloudflare.com/workers/languages/javascript/",
+        "type": "article"
+      },
+      {
+        "title": "JavaScript Fundamentals",
+        "url": "https://developer.mozilla.org/en-US/curriculum/core/javascript-fundamentals/",
+        "type": "article"
+      }
+    ]
+  },
+  "q9oQTt_NqhdWvJfA5XH1V": {
+    "title": "Basic Command-line Knowledge",
+    "description": "Knowing basic command-line commands is a must-have, not when working with Cloudflare but also as a developer. Learn the basics of navigating directories, file management, text editing, package management etc.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Cloudflare Wrangler CLI",
+        "url": "https://developers.cloudflare.com/workers/wrangler/",
+        "type": "article"
+      },
+      {
+        "title": "Command-line Primer for Beginners",
+        "url": "https://lifehacker.com/a-command-line-primer-for-beginners-5633909",
+        "type": "article"
+      },
+      {
+        "title": "Command Line for Beginners",
+        "url": "https://thelinuxcode.com/command-line-for-beginners-how-to-use-the-terminal-like-a-pro/",
+        "type": "article"
+      }
+    ]
+  },
+  "9iSdASlRxyod9YwZ2IUry": {
+    "title": "HTTP and Web Protocols",
+    "description": "Understanding HTTP and web protocols is crucial for leveraging Cloudflare's features. HTTP methods (GET, POST), status codes, headers, and caching mechanisms directly influence how Cloudflare interacts with your application. Cloudflare supports modern protocols like HTTP/2 and HTTP/3, improving performance. Familiarity with TLS/SSL is vital for secure communication, and concepts like CORS (Cross-Origin Resource Sharing) are relevant when handling API requests. Cloudflare's features, like caching rules and page rules, operate based on these protocols.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "What is HTTP?",
+        "url": "https://www.cloudflare.com/en-gb/learning/ddos/glossary/hypertext-transfer-protocol-http/",
+        "type": "article"
+      },
+      {
+        "title": "Overview of HTTP",
+        "url": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview",
+        "type": "article"
+      }
+    ]
+  },
+  "C08pIguX1N45Iw0kh0Fvu": {
+    "title": "Git Basics",
+    "description": "Git is a distributed version control system designed to handle projects of any size with speed and efficiency. Created by Linus Torvalds in 2005, it tracks changes in source code during software development, allowing multiple developers to work together on non-linear development. Git maintains a complete history of all changes, enabling easy rollbacks and comparisons between versions. Its distributed nature means each developer has a full copy of the repository, allowing for offline work and backup. Git’s key features include branching and merging capabilities, staging area for commits, and support for collaborative workflows like pull requests. Its speed, flexibility, and robust branching and merging capabilities have made it the most widely used version control system in software development, particularly for open-source projects and team collaborations.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Visit Dedicated Git & GitHub Roadmap",
+        "url": "https://roadmap.sh/git-github",
+        "type": "article"
+      },
+      {
+        "title": "Git Integration - Cloudflare Pages",
+        "url": "https://developers.cloudflare.com/pages/configuration/git-integration/",
+        "type": "article"
+      },
+      {
+        "title": "Git Documentation",
+        "url": "https://git-scm.com/doc",
+        "type": "article"
+      },
+      {
+        "title": "Git Cheat Sheet",
+        "url": "https://cs.fyi/guide/git-cheatsheet",
+        "type": "article"
+      }
+    ]
+  },
+  "dSBYTGGkol3MAXyg7G7_J": {
+    "title": "Node.js and NPM",
+    "description": "Node.js is an open source, cross-platform runtime environment and library that is used for running web applications outside the client’s browser. It is used for server-side programming, and primarily deployed for non-blocking, event-driven servers, such as traditional web sites and back-end API services, but was originally designed with real-time, push-based architectures in mind. Every browser has its own version of a JS engine, and node.js is built on Google Chrome’s V8 JavaScript engine.\n\nnpm (Node Package Manager) is the standard package manager for Node.js. It is two things: first and foremost, it is an online repository for the publishing of open-source Node.js projects; second, it is a command-line utility for interacting with said repository that aids in package installation, version management, and dependency management.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Visit Dedicated Node.js Roadmap",
+        "url": "https://roadmap.sh/nodejs",
+        "type": "article"
+      },
+      {
+        "title": "Node.js Documentation",
+        "url": "https://nodejs.org/en/",
+        "type": "article"
+      },
+      {
+        "title": "NPM",
+        "url": "https://www.docs.npmjs.com/",
+        "type": "article"
+      },
+      {
+        "title": "An Introduction to NPM",
+        "url": "https://nodejs.org/en/learn/getting-started/an-introduction-to-the-npm-package-manager",
+        "type": "article"
+      }
+    ]
+  },
+  "zR84MFLL6y0dygz9hXXPA": {
+    "title": "TypeScript Fundamentals",
+    "description": "TypeScript is a superset of JavaScript that adds static typing. It enhances code maintainability and reduces errors by catching type-related issues during development. For Cloudflare Workers, TypeScript can improve the development experience. You define types for variables, function parameters, and return values, making code more predictable. TypeScript code compiles to JavaScript before deployment to Cloudflare Workers. Using TypeScript allows for better tooling, autocompletion, and refactoring, leading to more robust and scalable serverless applications.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Visit Dedicated TypeScript Roadmap",
+        "url": "https://roadmap.sh/typescript",
+        "type": "article"
+      },
+      {
+        "title": "TypeScript Documentation",
+        "url": "https://www.typescriptlang.org/docs/",
+        "type": "article"
+      },
+      {
+        "title": "TypeScript Handbook",
+        "url": "https://www.typescriptlang.org/docs/handbook/",
+        "type": "article"
+      }
+    ]
+  },
+  "Isl5anwDvb1MacA-JH4ej": {
+    "title": "Understand Serverless Architecture",
+    "description": "Serverless architecture allows you to run code without managing servers, and Cloudflare Workers is a key implementation of this. With Cloudflare Workers, you deploy JavaScript/TypeScript functions to Cloudflare's edge network, where they execute in response to HTTP requests. Serverless means you don't provision or maintain servers; Cloudflare handles scaling and infrastructure. This model enables faster deployments, pay-per-use pricing, and reduced operational overhead. You focus on code, while Cloudflare handles the underlying infrastructure, making it ideal for building performant and scalable applications.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "What is Serverless Architecture?",
+        "url": "https://cloud.google.com/discover/what-is-serverless-architecture",
+        "type": "article"
+      },
+      {
+        "title": "What is Serverless Computing? - Serverless Computing Explain@",
+        "url": "https://aws.amazon.com/what-is/serverless-computing/",
+        "type": "article"
+      }
+    ]
+  },
+  "TB6vGzDgGZ9yAd9MGR7vw": {
+    "title": "Workers Runtime Environment",
+    "description": "The Workers runtime environment is a lightweight JavaScript execution environment running on Cloudflare's edge network. It's based on V8, the same engine that powers Chrome and Node.js, but optimized for speed and security. Workers have limited access to global variables and APIs compared to a traditional Node.js environment, focusing on handling HTTP requests and responses. It provides APIs for caching, KV storage, and accessing request information, enabling performant and globally distributed serverless functions.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "How Workers Works · Cloudflare",
+        "url": "https://developers.cloudflare.com/workers/reference/how-workers-works/",
+        "type": "article"
+      },
+      {
+        "title": "Introducing workerd: the Open Source Workers Runtime",
+        "url": "https://blog.cloudflare.com/workerd-open-source-workers-runtime/",
+        "type": "article"
+      }
+    ]
+  },
+  "aGWLomYHGkIfn7GFc0_Yl": {
+    "title": "Edge Computing Fundamentals",
+    "description": "Edge computing brings computation closer to the user, minimizing latency. Cloudflare Workers embodies this: your code runs on Cloudflare's global network of servers, near your users. This reduces network hops and improves response times. By executing logic at the edge, you can personalize content, filter requests, and optimize delivery without needing to route traffic back to a central server. Edge computing with Workers enables faster, more responsive applications and enhanced user experiences.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "What Is Edge Computing? - Coursera",
+        "url": "https://www.udemy.com/course/edge-computing/",
+        "type": "course"
+      },
+      {
+        "title": "What is Edge Computing - Cloudflare Docs",
+        "url": "https://www.cloudflare.com/learning/serverless/glossary/what-is-edge-computing/",
+        "type": "article"
+      },
+      {
+        "title": "What is Edge Computing? Is It More Than a Buzzword?",
+        "url": "https://www.howtogeek.com/devops/what-is-edge-computing-is-it-more-than-a-buzzword/",
+        "type": "article"
+      }
+    ]
+  },
+  "HNEXPU6r_T7UYvwLv2wnt": {
+    "title": "Request/Response Handling",
+    "description": "Cloudflare Workers excel at intercepting and modifying HTTP requests and responses. When a request hits Cloudflare, a Worker can inspect the request details (headers, URL, method) and take actions: rewrite the URL, modify headers, or even serve a completely different response. Similarly, Workers can intercept responses from the origin server, modifying the content, adding headers for caching, or even serving a cached version directly. This level of control allows for powerful customization and optimization of web traffic.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Request and Response",
+        "url": "https://developers.cloudflare.com/workers/runtime-apis/request",
+        "type": "article"
+      },
+      {
+        "title": "Fetch API",
+        "url": "https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API",
+        "type": "article"
+      }
+    ]
+  },
+  "_2UnRlbUplHvs5-Stj4O4": {
+    "title": "Fetch API and Runtime APIs",
+    "description": "Within Cloudflare Workers, the Fetch API is your primary tool for making HTTP requests to external services or your origin server. It's similar to the Fetch API in browsers but adapted for the Workers environment. Runtime APIs provide access to Cloudflare-specific features like KV storage (for persistent data), Durable Objects (for stateful applications), and other services. These APIs allow Workers to interact with Cloudflare's infrastructure and build powerful applications that go beyond simple request/response handling.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Fetch API in Workers",
+        "url": "https://developers.cloudflare.com/workers/runtime-apis/fetch",
+        "type": "article"
+      },
+      {
+        "title": "Fetch API",
+        "url": "https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API",
+        "type": "article"
+      }
+    ]
+  },
+  "i6L9FI6fBDXr0XtMrc_uR": {
+    "title": "Workers Lifecycle",
+    "description": "A Cloudflare Worker's lifecycle is short and stateless. Each invocation starts when a request hits the Cloudflare edge. The Worker executes its code to handle the request. Once the response is sent (or an error occurs), the Worker instance terminates. There's no persistent state between requests unless you use services like KV or Durable Objects. This stateless nature ensures scalability and quick response times. Understanding this lifecycle is crucial for designing efficient Workers that can handle a high volume of requests.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Workers RPC - Lifecycle",
+        "url": "https://developers.cloudflare.com/workers/runtime-apis/rpc/lifecycle/",
+        "type": "article"
+      },
+      {
+        "title": "How Workers Works · Cloudflare",
+        "url": "https://developers.cloudflare.com/workers/reference/how-workers-works/",
+        "type": "article"
+      },
+      {
+        "title": "Introducing workerd: the Open Source Workers Runtime",
+        "url": "https://blog.cloudflare.com/workerd-open-source-workers-runtime/",
+        "type": "article"
+      }
+    ]
+  },
+  "WZSi9inWPhqZQvDN-C8BV": {
+    "title": "Service Bindings",
+    "description": "Service Bindings allow Cloudflare Workers to seamlessly integrate with other Cloudflare services. They provide a secure and efficient way for a Worker to access resources like KV storage, Durable Objects, R2 storage, and other Workers. Instead of using API keys or direct network calls, Service Bindings create a direct connection between your Worker and the bound service, simplifying configuration and improving performance. They're essential for building complex applications that leverage the full power of the Cloudflare ecosystem.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Service Bindings - Runtime APIs",
+        "url": "https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings/",
+        "type": "article"
+      },
+      {
+        "title": "Service Bindings · Cloudflare",
+        "url": "https://developers.cloudflare.com/workers/platform/service-bindings/",
+        "type": "article"
+      }
+    ]
+  },
+  "uBjcQ9PJUfwzu5N_2CNjN": {
+    "title": "Caching Strategies",
+    "description": "Cloudflare Workers allow fine-grained control over caching. You can use the Cache API to store and retrieve responses directly within your Worker, bypassing the origin server. Strategies include:\n\n*   **Cache-First:** Serve from cache if available, otherwise fetch from origin.\n*   **Network-First:** Always fetch from origin, caching the response for subsequent requests.\n*   **Stale-While-Revalidate:** Serve from cache immediately, then update the cache in the background.\n\nYou can also manipulate HTTP cache headers (Cache-Control, Expires) to control how Cloudflare's CDN caches content. Effective caching is critical for improving performance and reducing origin server load.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Cache · Cloudflare Workers",
+        "url": "https://developers.cloudflare.com/workers/runtime-apis/cache/",
+        "type": "article"
+      },
+      {
+        "title": "How the Cache Works · Cloudflare Workers ",
+        "url": "https://developers.cloudflare.com/workers/reference/how-the-cache-works/",
+        "type": "article"
+      }
+    ]
+  },
+  "aStbAF4zraqhJ-N3RH4ha": {
+    "title": "Middleware Patterns",
+    "description": "Middleware patterns in Cloudflare Workers allow you to chain functions to process requests or responses in a modular way. Each middleware function performs a specific task (e.g., authentication, logging, header modification) before passing the request/response to the next function in the chain. This promotes code reusability, separation of concerns, and easier maintenance. By composing middleware, you can build complex request processing pipelines.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Middleware · Cloudflare Pages",
+        "url": "https://developers.cloudflare.com/pages/functions/middleware/",
+        "type": "article"
+      },
+      {
+        "title": "A Middleware Architecture for Cloudflare Workers",
+        "url": "https://boxesplusarrows.com/blog/a-middleware-architecture-for-cloudflare-workers/",
+        "type": "article"
+      }
+    ]
+  },
+  "9ef2VPCru8lCmRxxGe-Eo": {
+    "title": "Bindings",
+    "description": "In Cloudflare Workers, Bindings are configurations that connect your Worker to external resources or services. These can include:\n\n*   **KV Namespaces:** Binding to a KV namespace allows the Worker to read and write data.\n*   **Durable Objects:** Bindings specify which Durable Object namespace the Worker can access.\n*   **Service Bindings:** Connecting to other Workers or Cloudflare services like Queues.\n*   **Secrets:** Storing sensitive data (API keys) securely.\n*   **Environment Variables:** Configuring environment-specific settings.\n\nBindings are defined in the `wrangler.toml` file and provide a secure and managed way for your Worker to interact with the outside world.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Bindings (env) · Cloudflare Workers",
+        "url": "https://developers.cloudflare.com/workers/runtime-apis/bindings/",
+        "type": "article"
+      },
+      {
+        "title": "Workers Bindings · Cloudflare Workers AI",
+        "url": "https://developers.cloudflare.com/workers-ai/configuration/bindings/",
+        "type": "article"
+      },
+      {
+        "title": "Configuration - Wrangler · Cloudflare Workers",
+        "url": "https://developers.cloudflare.com/workers/wrangler/configuration/",
+        "type": "article"
+      }
+    ]
+  },
+  "-8MsWNvuqwQCbLpOx_kov": {
+    "title": "Hono",
+    "description": "Hono is a small, simple and ultra-fast web framework built on web standards. It works on any JavaScript runtime: Cloudflare Workers, Fastly Compute, Deno, Bun, Vercel, Netlify, AWS Lambda, Lambda@Edge, and Node.js. Hono is more known for supporting a lot more than the basics.\n\nHono is a simple web application framework similar to the well known javascript framework Express, without a frontend. But it runs on CDN Edges and allows you to construct larger applications when combined with middleware.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Hono JS Examples",
+        "url": "https://github.com/honojs/examples",
+        "type": "opensource"
+      },
+      {
+        "title": "Hono Documentation",
+        "url": "https://hono.dev/docs/",
+        "type": "article"
+      },
+      {
+        "title": "Hono.js: A Small Framework with Big Potential",
+        "url": "https://medium.com/@appvintechnologies/hono-js-a-small-framework-with-big-potential-15a093fc5c07",
+        "type": "article"
+      },
+      {
+        "title": "Quick Start with Hono: Simple Setup Guide",
+        "url": "https://dev.to/koshirok096/quick-start-with-hono-simple-setup-guide-bite-sized-article-lhe",
+        "type": "article"
+      },
+      {
+        "title": "Hono JS Tutorial",
+        "url": "https://www.youtube.com/watch?v=gY-TK33G6kQ",
+        "type": "video"
+      }
+    ]
+  },
+  "15jl6CSCkqnh_eFfysLDM": {
+    "title": "Itty Router",
+    "description": "Itty Router is a lightweight router with the motto \"less is more\" that supports Cloudflare workers and pages. While other libraries may suffer from feature creep/bloat to please a wider audience, Itty Router painfully consider every single byte added to Itty. Our router options range from ~450 bytes to ~970 bytes for a batteries-included version with built-in defaults, error handling, formatting, etc. On top of that, the following concepts aim to keep YOUR code tiny (and readable) as well.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "ITTy Documentation",
+        "url": "https://itty.dev/itty-router/",
+        "type": "article"
+      },
+      {
+        "title": "Getting Started with Itty Router",
+        "url": "https://itty.dev/itty-router/getting-started",
+        "type": "article"
+      }
+    ]
+  },
+  "Tzx93tvoGrc9_fKQqkorN": {
+    "title": "Wrangler",
+    "description": "`Wrangler` is the command-line interface (CLI) for Cloudflare Workers. It simplifies the process of developing, testing, and deploying Workers. With `wrangler`, you can:\n\n*   Create new Worker projects.\n*   Develop Workers locally.\n*   Deploy Workers to Cloudflare.\n*   Manage secrets and environment variables.\n*   Configure bindings to other Cloudflare services.\n\n`Wrangler` streamlines the entire Workers workflow, making it an essential tool for any Cloudflare Workers developer.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Wrangler Documentation",
+        "url": "https://developers.cloudflare.com/workers/wrangler/",
+        "type": "article"
+      },
+      {
+        "title": "Wrangler Commands",
+        "url": "https://developers.cloudflare.com/workers/wrangler/commands//",
+        "type": "article"
+      }
+    ]
+  },
+  "uoaOrypiMkyoikXvTHeVS": {
+    "title": "DevTools Integration",
+    "description": "Cloudflare Workers can be debugged using standard browser DevTools. When running Workers in a local environment (e.g., with Miniflare), you can use Chrome DevTools or similar tools to inspect code, set breakpoints, and step through execution. You can also use `console.log` statements to output information to the DevTools console. This integration makes debugging Workers more intuitive and efficient.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Debugging Cloudflare Workers",
+        "url": "https://developers.cloudflare.com/workers/playground/#devtools",
+        "type": "article"
+      },
+      {
+        "title": "Chrome DevTools",
+        "url": "https://developer.chrome.com/docs/devtools",
+        "type": "article"
+      }
+    ]
+  },
+  "8Y6TIYoWIXrxtmzDVdS0b": {
+    "title": "CI/CD Pipelines",
+    "description": "CI/CD (Continuous Integration/Continuous Deployment) pipelines automate the process of building, testing, and deploying Cloudflare Workers. Common CI/CD platforms like GitHub Actions, GitLab CI, and CircleCI can be used to create pipelines that automatically deploy Workers whenever code changes are pushed to a repository. These pipelines typically involve steps like linting, testing, building, and deploying using `wrangler`. Automating deployments ensures faster releases and reduces the risk of errors.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Automate your workflow - Github Actions",
+        "url": "https://github.com/features/actions",
+        "type": "article"
+      },
+      {
+        "title": "CI/CD Pipelines - Gitlab",
+        "url": "https://docs.gitlab.com/ee/ci/pipelines/",
+        "type": "article"
+      },
+      {
+        "title": "Continuous Integration and Delivery - CircleCI",
+        "url": "https://circleci.com/",
+        "type": "article"
+      },
+      {
+        "title": "Simple, Flexible, Trustworthy CI/CD Tools - Travis CI",
+        "url": "https://www.travis-ci.com/",
+        "type": "article"
+      }
+    ]
+  },
+  "zSwio18XdBfqwSneAx_AP": {
+    "title": "Any Frontend Framework",
+    "description": "Several frontend frameworks can be deployed on Cloudflare Pages or used with Cloudflare Workers. Popular choices include:\n\n*   **React:** Deploy using Create React App or Next.js.\n*   **Vue.js:** Deploy using Vue CLI or Nuxt.js.\n*   **Angular:** Deploy using Angular CLI.\n*   **Svelte:** Deploy using SvelteKit.\n*   **Astro**: Deploy using Astro CLI.\n\nCloudflare Pages offers optimized builds and deployments for these frameworks. For Workers, you can use these frameworks to render content dynamically at the edge.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "React",
+        "url": "https://react.dev/",
+        "type": "article"
+      },
+      {
+        "title": "Vue.js",
+        "url": "https://vuejs.org/",
+        "type": "article"
+      },
+      {
+        "title": "Angular",
+        "url": "https://angular.dev/",
+        "type": "article"
+      },
+      {
+        "title": "Svelte",
+        "url": "https://svelte.dev/",
+        "type": "article"
+      },
+      {
+        "title": "Astro",
+        "url": "https://astro.build/",
+        "type": "article"
+      },
+      {
+        "title": "Framework Guide",
+        "url": "https://developers.cloudflare.com/pages/framework-guides/",
+        "type": "article"
+      }
+    ]
+  },
+  "o4sBgniPmLqwej6TlIPcl": {
+    "title": "Miniflare",
+    "description": "Miniflare is a local simulator for Cloudflare Workers. It mimics the Cloudflare Workers runtime environment on your local machine, allowing you to test your Workers without deploying them to Cloudflare. Miniflare supports features like KV storage, Durable Objects, and Service Bindings, making it a valuable tool for local development and debugging. It speeds up development cycles by providing a fast and reliable local testing environment.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "cloudflare/miniflare",
+        "url": "https://github.com/cloudflare/miniflare",
+        "type": "opensource"
+      },
+      {
+        "title": "Miniflare - Cloudflare Workers",
+        "url": "https://developers.cloudflare.com/workers/testing/miniflare/",
+        "type": "article"
+      }
+    ]
+  },
+  "1dGFfQauOgHP7T4ReMpCU": {
+    "title": "Workers KV",
+    "description": "Workers KV is a data storage that allows you to store and retrieve data globally. With Workers KV, you can build dynamic and performant APIs and websites that support high read volumes with low latency.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Cloudflare Workers KV Documentation",
+        "url": "https://developers.cloudflare.com/kv/",
+        "type": "article"
+      },
+      {
+        "title": "How to Use Cloudflare Workers and KV Storage",
+        "url": "https://www.youtube.com/watch?v=NGk2HxV0Xkg",
+        "type": "article"
+      }
+    ]
+  },
+  "EBTHbXOOZiqrcYJvKhcWV": {
+    "title": "Key-value Operations",
+    "description": "Cloudflare Workers provide a simple API for reading and writing data to a Key-Value store. You can use the `put` method to store data, and the `get` method to retrieve it. The `delete` method allows you to remove data from the store. KV stores are ideal for storing configuration data, user sessions, and other data that needs to be accessed quickly.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Read Key Value Pairs",
+        "url": "https://developers.cloudflare.com/kv/api/read-key-value-pairs/",
+        "type": "article"
+      },
+      {
+        "title": "Cloudflare KV Binding API",
+        "url": "https://developers.cloudflare.com/workers/runtime-apis/kv",
+        "type": "article"
+      },
+      {
+        "title": "Cloudflare Workers KV — Cloudflare Docs",
+        "url": "https://developers.cloudflare.com/workers/runtime-apis/kv/",
+        "type": "article"
+      }
+    ]
+  },
+  "sQlRIYLnZcugATgpogJmw": {
+    "title": "Metadata Handling",
+    "description": "Cloudflare Workers allow you to access metadata about the request, including the request method, URL, headers, and more. You can use this metadata to customize your application's behavior or to implement features like caching, authentication, or rate limiting. Metadata is available in both the `fetch` event and the `scheduled` event. It's a powerful tool for building dynamic and adaptive applications.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Request and Response",
+        "url": "https://developers.cloudflare.com/workers/runtime-apis/request",
+        "type": "article"
+      },
+      {
+        "title": "Scheduled Event Handler",
+        "url": "https://developers.cloudflare.com/workers/runtime-apis/scheduled-event",
+        "type": "article"
+      }
+    ]
+  },
+  "i64-aCpZHygq76fBU6eXD": {
+    "title": "Bulk Operations",
+    "description": "Cloudflare Workers allow you to perform bulk operations on KV stores. You can use the `batch` method to perform multiple operations in a single request. This is useful for tasks like importing data from an external source or updating multiple records at once. Bulk operations are efficient and scalable, allowing you to handle large amounts of data with ease.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Workers KV",
+        "url": "https://blog.cloudflare.com/workers-kv-is-ga/",
+        "type": "article"
+      },
+      {
+        "title": "Workers KV Runtime API",
+        "url": "https://developers.cloudflare.com/workers/runtime-apis/kv",
+        "type": "article"
+      }
+    ]
+  },
+  "OgW-iIrJZ5-sOWKnFpIZd": {
+    "title": "Caching Patterns",
+    "description": "Caching is a critical aspect of building performant and scalable applications. Cloudflare Workers provide several caching patterns that you can use to optimize your application's performance. These patterns include:\n\n*   **Cache-First:** Serve from cache if available, otherwise fetch from origin.\n*   **Network-First:** Always fetch from origin, caching the response for subsequent requests.\n*   **Stale-While-Revalidate:** Serve from cache immediately, then update the cache in the background.\n\nYou can also manipulate HTTP cache headers (Cache-Control, Expires) to control how Cloudflare's CDN caches content. Effective caching is crucial for improving performance and reducing origin server load.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "How the Cache Works · Cloudflare Workers",
+        "url": "https://developers.cloudflare.com/workers/reference/how-the-cache-works/",
+        "type": "article"
+      },
+      {
+        "title": "Caching Strategies",
+        "url": "https://docs.aws.amazon.com/whitepapers/latest/database-caching-strategies-using-redis/caching-patterns.html",
+        "type": "article"
+      },
+      {
+        "title": "Caching Static and Dynamic Content",
+        "url": "https://www.cloudflare.com/learning/cdn/caching-static-and-dynamic-content/",
+        "type": "article"
+      }
+    ]
+  },
+  "gxLUlXGuaY5Q-0xmBgQwz": {
+    "title": "R2 Storage",
+    "description": "Cloudflare R2 Storage is a distributed object storage service that offers fast, reliable, and affordable storage without egress fees. It's designed to compete with services like Amazon S3 and Google Cloud Storage. R2 allows you to store large amounts of unstructured data (images, videos, documents) and access it quickly from anywhere in the world via Cloudflare's global network. Its key advantage is the absence of egress bandwidth charges, making it cost-effective for applications with high data retrieval needs.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Cloudflare R2 | Zero Egress Fee Object Storage",
+        "url": "https://www.cloudflare.com/developer-platform/products/r2/",
+        "type": "article"
+      },
+      {
+        "title": "Cloudflare R2 Documentation",
+        "url": "https://developers.cloudflare.com/r2/",
+        "type": "article"
+      }
+    ]
+  },
+  "K9iW2H6riKwddWmpWJFJw": {
+    "title": "Object Storage",
+    "description": "Cloudflare R2 is object storage that offers fast, reliable, and affordable storage without egress fees. It's designed to work seamlessly with Cloudflare Workers, allowing you to store and retrieve data close to your users. R2 is ideal for storing static assets, user-generated content, and other data that needs to be accessed quickly and frequently. Its lack of egress fees makes it a cost-effective alternative to traditional cloud storage providers.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "What is Object Storage?",
+        "url": "https://www.cloudflare.com/learning/cloud/what-is-object-storage/",
+        "type": "article"
+      },
+      {
+        "title": "Cloudflare R2 | Zero Egress Fee Object Storage",
+        "url": "https://www.cloudflare.com/developer-platform/products/r2/",
+        "type": "article"
+      }
+    ]
+  },
+  "BPahk1qH9Hk11tsE2hw3A": {
+    "title": "Large File Handling",
+    "description": "Handling large files on Cloudflare requires strategies to avoid exceeding size limits and ensure efficient delivery. Techniques include:\n\n*   **Streaming:** Processing files in chunks to reduce memory usage.\n*   **Range Requests:** Serving only the requested portion of a file.\n*   **Cloudflare Stream:** Using Cloudflare's video streaming service for large video files.\n*   **R2 integration:** Storing large files in R2 and serving them via Workers.\n\nThese methods allow you to handle large files effectively while leveraging Cloudflare's global network.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Resumable and Large Files · Cloudflare Stream",
+        "url": "https://developers.cloudflare.com/stream/uploading-videos/resumable-uploads/",
+        "type": "article"
+      },
+      {
+        "title": "Cloudflare R2 Limits",
+        "url": "https://developers.cloudflare.com/r2/platform/limits/",
+        "type": "article"
+      }
+    ]
+  },
+  "3jU5753Uza2aS-gZo7w4k": {
+    "title": "Asset Management",
+    "description": "Cloudflare R2 can be used for efficient asset management. You can store images, videos, and other static assets in R2 and serve them directly through Cloudflare's CDN. This reduces the load on your origin server and improves website performance. R2's integration with Cloudflare Workers allows you to perform on-the-fly image transformations or other asset processing tasks at the edge. Versioning support in R2 helps manage different versions of your assets.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Use R2 as Static Asset Storage with Cloudflare Pages",
+        "url": "https://developers.cloudflare.com/pages/tutorials/use-r2-as-static-asset-storage-for-pages/",
+        "type": "article"
+      },
+      {
+        "title": "Cloudflare R2 | Zero Egress Fee Object Storage",
+        "url": "https://www.cloudflare.com/developer-platform/products/r2/",
+        "type": "article"
+      }
+    ]
+  },
+  "UNE6XK4su5r2jcxhY7hOG": {
+    "title": "Bucket Operations",
+    "description": "In Cloudflare R2, buckets are containers for storing objects. You can perform various bucket operations, including:\n\n*   **Creating Buckets:** Creating new buckets to organize your data.\n*   **Listing Buckets:** Listing all the buckets in your account.\n*   **Deleting Buckets:** Deleting buckets that are no longer needed (must be empty).\n*   **Configuring Bucket Policies:** Setting access control policies for buckets.\n\nThese operations are typically performed using the R2 API, the Cloudflare dashboard, or command-line tools like `wrangler`.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Buckets · Cloudflare R2",
+        "url": "https://developers.cloudflare.com/r2/buckets/",
+        "type": "article"
+      },
+      {
+        "title": "Create New Buckets · Cloudflare R2",
+        "url": "https://developers.cloudflare.com/r2/buckets/create-buckets/",
+        "type": "article"
+      }
+    ]
+  },
+  "YvgmmF9sWfURgijFV7E31": {
+    "title": "Bucket Lifecycle",
+    "description": "The lifecycle of an R2 bucket involves creation, usage (storing and retrieving objects), and eventual deletion. You create a bucket to house your data. Objects are then uploaded, accessed, and managed within the bucket. Cloudflare doesn't have built-in lifecycle rules like some other storage providers, so object expiration typically requires custom logic via Workers. Finally, when the bucket is no longer needed, and after ensuring it's empty, you can delete it.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Buckets · Cloudflare R2",
+        "url": "https://developers.cloudflare.com/r2/buckets/",
+        "type": "article"
+      },
+      {
+        "title": "Bucket Lifecycle · Cloudflare R2",
+        "url": "https://developers.cloudflare.com/api/resources/r2/subresources/buckets/subresources/lifecycle/",
+        "type": "article"
+      }
+    ]
+  },
+  "mKN0Ta3zSk7PCm_uHYKFN": {
+    "title": "D1",
+    "description": "Cloudflare D1 is a serverless SQL database designed to run on Cloudflare's edge network. It allows you to store and query data closer to your users, reducing latency and improving application performance. D1 is based on SQLite and is accessible directly from Cloudflare Workers, making it easy to build dynamic and data-driven applications without managing a traditional database server.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Cloudflare D1 Documentation",
+        "url": "https://developers.cloudflare.com/d1/",
+        "type": "article"
+      },
+      {
+        "title": "Getting Started with D1",
+        "url": "https://developers.cloudflare.com/d1/get-started/",
+        "type": "article"
+      }
+    ]
+  },
+  "PnhP47woPJb_JnLpMMiTw": {
+    "title": "Schema Management",
+    "description": "Managing the structure of your database in Cloudflare D1 involves defining tables, columns, data types, primary keys, foreign keys, and indexes using standard SQL Data Definition Language (DDL) statements. Since D1 is based on SQLite, you'll use SQLite-compatible syntax. Tools like `wrangler` provide commands to execute SQL scripts, allowing you to create and modify your database schema. You'll typically start by designing your schema based on your application's data requirements and then translate that design into SQL DDL statements. Careful consideration should be given to data types to ensure data integrity and efficiency.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Schema Validation · Cloudflare API Shield",
+        "url": "https://developers.cloudflare.com/api-shield/security/schema-validation/",
+        "type": "article"
+      },
+      {
+        "title": "Configure Schema Validation · Cloudflare API Shield",
+        "url": "https://developers.cloudflare.com/api-shield/security/schema-validation/configure/",
+        "type": "article"
+      }
+    ]
+  },
+  "M8rSSVFUHixgWZRfaBPHb": {
+    "title": "Migrations",
+    "description": "As your application evolves, your database schema will likely need to change. Database migrations provide a structured way to apply these changes in a controlled and repeatable manner. In D1, you'll typically write SQL scripts that contain the necessary `ALTER TABLE` statements to modify your schema (e.g., adding new columns, renaming columns, changing data types). You can then use `wrangler` or a similar tool to execute these migration scripts against your D1 database. It's important to version your migration scripts and apply them in the correct order to avoid data inconsistencies or errors. Consider using a migration management tool to track and apply migrations more effectively.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Database Migrations: What are the Types of DB Migrations?",
+        "url": "https://www.prisma.io/dataguide/types/relational/what-are-database-migrations",
+        "type": "article"
+      },
+      {
+        "title": "Database Migrations in the Real World",
+        "url": "https://blog.jetbrains.com/idea/2025/02/database-migrations-in-the-real-world/",
+        "type": "article"
+      }
+    ]
+  },
+  "65xDESm6jbHWkVO4NgHqx": {
+    "title": "Query Optimization",
+    "description": "Optimizing your SQL queries is crucial for achieving good performance with Cloudflare D1, especially as your database grows. D1 leverages SQLite's query optimizer, which automatically attempts to find the most efficient way to execute your queries. However, you can significantly improve performance by following best practices:\n\n*   **Use Indexes:** Indexes are essential for speeding up queries that filter or sort data. Create indexes on columns that are frequently used in `WHERE` clauses, `JOIN` conditions, and `ORDER BY` clauses.\n*   **Avoid Full Table Scans:** Full table scans can be slow, especially on large tables. Ensure your queries are using indexes to narrow down the number of rows that need to be examined.\n*   **Write Efficient SQL:** Use appropriate `JOIN` types, avoid using `SELECT *` (specify the columns you need), and use `WHERE` clauses to filter data as early as possible.\n*   **Analyze Query Performance:** Use SQLite's `EXPLAIN QUERY PLAN` command to analyze how your queries are being executed. This can help you identify potential bottlenecks and areas for improvement.\n*   **Consider Denormalization:** In some cases, denormalizing your database schema (adding redundant data to avoid joins) can improve query performance, but it comes at the cost of increased storage space and potential data inconsistencies. Weigh the trade-offs carefully.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Query Parameters and Cached Responses",
+        "url": "https://developers.cloudflare.com/automatic-platform-optimization/reference/query-parameters/",
+        "type": "article"
+      }
+    ]
+  },
+  "MpWO1sroeF106SEMU1V1a": {
+    "title": "Drizzle",
+    "description": "Drizzle ORM is a TypeScript ORM (Object-Relational Mapper) that can be used with Cloudflare D1 to provide a type-safe and more developer-friendly way to interact with your database. It allows you to define your database schema using TypeScript code and provides a query builder that helps you construct SQL queries in a type-safe manner. Drizzle can simplify database interactions, improve code maintainability, and reduce the risk of SQL injection vulnerabilities. It also supports migrations, making it easier to manage schema changes over time.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Drizzle",
+        "url": "https://orm.drizzle.team/",
+        "type": "article"
+      },
+      {
+        "title": "Drizzle Overview",
+        "url": "https://orm.drizzle.team/docs/overview",
+        "type": "article"
+      }
+    ]
+  },
+  "h3MHLZZwkYqqb5PSfMhpB": {
+    "title": "Prisma",
+    "description": "Prisma is a popular open-source ORM that provides a type-safe database client and migration tools. While not directly compatible with Cloudflare D1 due to its reliance on specific database adapters, Prisma can be used in conjunction with a D1 adapter or a custom data access layer within your Cloudflare Workers. This approach allows you to leverage Prisma's type safety, query builder, and migration features while still using D1 as your database.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Prisma",
+        "url": "https://www.prisma.io/",
+        "type": "article"
+      },
+      {
+        "title": "Prisma Documentation",
+        "url": "https://www.prisma.io/docs",
+        "type": "article"
+      }
+    ]
+  },
+  "zyRgTtlng6idboSgL9YTt": {
+    "title": "Queues",
+    "description": "Cloudflare Queues is a message queuing service that allows you to decouple different parts of your application. It enables you to reliably send and receive messages between Workers or other services. This asynchronous communication is useful for tasks like background processing, handling spikes in traffic, and building resilient applications. Queues ensures messages are delivered, even if the receiving service is temporarily unavailable.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Cloudflare Queues · Cloudflare Queues",
+        "url": "https://developers.cloudflare.com/queues/",
+        "type": "article"
+      },
+      {
+        "title": "How Does Queues Work?",
+        "url": "https://developers.cloudflare.com/queues/reference/how-queues-works/",
+        "type": "article"
+      }
+    ]
+  },
+  "EFA8m0EdhygxcBWzwmbnT": {
+    "title": "Message Processing",
+    "description": "With Cloudflare Queues, message processing involves sending messages to a queue from a producer (usually a Worker) and then consuming those messages from the queue by a consumer (another Worker or service). The consumer processes each message, performing tasks like data transformation, calling APIs, or updating databases. Queues guarantees at-least-once delivery, meaning a message will be delivered to a consumer at least once, even if there are failures. Consumers can acknowledge successful processing to remove messages from the queue.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Cloudflare Queues · Cloudflare Queues",
+        "url": "https://developers.cloudflare.com/queues/",
+        "type": "article"
+      },
+      {
+        "title": "How Does Queues Work?",
+        "url": "https://developers.cloudflare.com/queues/reference/how-queues-works/",
+        "type": "article"
+      },
+      {
+        "title": "Difference Between Stream Processing and Message Processing",
+        "url": "https://stackoverflow.com/questions/41744506/difference-between-stream-processing-and-message-processing",
+        "type": "article"
+      }
+    ]
+  },
+  "qgvDGyLjc6lMmVPjHozFM": {
+    "title": "Background Jobs",
+    "description": "Cloudflare Queues are ideal for handling background jobs. Instead of performing time-consuming tasks directly within a request/response cycle, you can enqueue a message describing the task. A separate Worker, acting as a consumer, then processes these messages in the background. This improves the responsiveness of your application and allows you to handle tasks like image processing, sending emails, or data analysis without blocking user requests.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Cloudflare Queues",
+        "url": "https://developers.cloudflare.com/queues/",
+        "type": "article"
+      },
+      {
+        "title": "Dispatched | Background Jobs for Serverless Applications",
+        "url": "https://dispatched.dev/",
+        "type": "article"
+      }
+    ]
+  },
+  "MInAsLLJtIq6WQDSj5yGH": {
+    "title": "Rate Limiting",
+    "description": "Cloudflare Queues can be used to implement rate limiting. Instead of directly processing every request, you can enqueue them. A consumer Worker then processes messages from the queue at a controlled rate. This prevents your backend systems from being overwhelmed by sudden spikes in traffic. You can adjust the consumer's processing rate to match the capacity of your backend services.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Cloudflare Queues - Queues & Rate Limits",
+        "url": "https://developers.cloudflare.com/queues/tutorials/handle-rate-limits/",
+        "type": "article"
+      },
+      {
+        "title": "Rate Limiting Best Practices - Cloudflare Docs",
+        "url": "https://developers.cloudflare.com/waf/rate-limiting-rules/best-practices/",
+        "type": "article"
+      }
+    ]
+  },
+  "Grl59SjY31Q3sgf9uX-xf": {
+    "title": "Dead Letter Queues",
+    "description": "Dead Letter Queues (DLQs) are an important part of a robust message queuing system. In Cloudflare Queues, a DLQ is a separate queue where messages that cannot be processed successfully after multiple retries are sent. This allows you to isolate problematic messages and prevent them from causing continuous failures. You can then investigate the messages in the DLQ to identify and fix the underlying issues.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "What is DLQ? - Dead-Letter Queue Explained - AWS",
+        "url": "https://aws.amazon.com/what-is/dead-letter-queue/",
+        "type": "article"
+      },
+      {
+        "title": "Dead Letter Queue",
+        "url": "https://en.wikipedia.org/wiki/Dead_letter_queue",
+        "type": "article"
+      }
+    ]
+  },
+  "G-xBbtaniYFRE9Dgs18px": {
+    "title": "Durable Objects",
+    "description": "Cloudflare Durable Objects provide a strongly consistent, single-actor execution environment on Cloudflare's edge network. Unlike Workers, which are stateless, Durable Objects maintain state, enabling you to build applications that require coordination and data consistency across multiple requests and users. They are ideal for building collaborative applications, real-time games, and other stateful services.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Cloudflare Durable Objects - Cloudflare Docs",
+        "url": "https://developers.cloudflare.com/durable-objects/",
+        "type": "article"
+      }
+    ]
+  },
+  "EQjhRlM7zpANNWkypScIl": {
+    "title": "State Management",
+    "description": "Durable Objects excel at state management. Each Durable Object instance has its own persistent storage and can maintain state across multiple requests. You can store data within a Durable Object and access it consistently, regardless of which Cloudflare edge server handles the request. This eliminates the need for external databases or caching layers for managing application state.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "What are Durable Objects? - Cloudflare Documentation",
+        "url": "https://developers.cloudflare.com/durable-objects/what-are-durable-objects/",
+        "type": "article"
+      },
+      {
+        "title": "Durable Object State · Cloudflare Durable Objects",
+        "url": "https://developers.cloudflare.com/durable-objects/api/state/",
+        "type": "article"
+      }
+    ]
+  },
+  "RYm0oBFCxm-S-aCwZ21p6": {
+    "title": "Coordination",
+    "description": "Durable Objects facilitate coordination between different clients or Workers. Because each object has a single, consistent view of its state, it can act as a central point for coordinating actions. Multiple clients can interact with the same Durable Object, and the object can ensure that actions are performed in a consistent and predictable order. This is useful for building collaborative applications where multiple users need to work on the same data.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Durable Objects",
+        "url": "https://www.cloudflare.com/developer-platform/products/durable-objects/",
+        "type": "article"
+      },
+      {
+        "title": "Durable Objects (DO)",
+        "url": "https://www.lambrospetrou.com/articles/durable-objects-cloudflare/",
+        "type": "article"
+      }
+    ]
+  },
+  "36w4Q73XkCwo5Cva0XsF8": {
+    "title": "Persistence",
+    "description": "Durable Objects offer built-in persistence. Data stored within a Durable Object is automatically persisted to Cloudflare's storage infrastructure. You don't need to explicitly save or load data; the Durable Object handles persistence automatically. This simplifies development and ensures that your application's state is durable and reliable, even in the face of server failures.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Access Durable Objects Storage - Cloudflare Docs",
+        "url": "https://developers.cloudflare.com/durable-objects/best-practices/access-durable-objects-storage/",
+        "type": "article"
+      },
+      {
+        "title": "In-memory State in a Durable Object",
+        "url": "https://developers.cloudflare.com/durable-objects/reference/in-memory-state/",
+        "type": "article"
+      }
+    ]
+  },
+  "rxxibrJUo1rQ3XCuUIP59": {
+    "title": "Transactional Operations",
+    "description": "Durable Objects support transactional operations. You can perform multiple operations within a single transaction, ensuring that either all operations succeed or none of them do. This helps maintain data consistency and prevents partial updates. If an error occurs during a transaction, the Durable Object automatically rolls back all changes, leaving the data in a consistent state.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Durable Object Storage · Cloudflare Durable Objects",
+        "url": "https://developers.cloudflare.com/durable-objects/api/storage-api/",
+        "type": "article"
+      },
+      {
+        "title": "Transactional Storage · Cloudflare Durable Objects",
+        "url": "https://developers.cloudflare.com:2096/durable-objects/api/transactional-storage-api/",
+        "type": "article"
+      }
+    ]
+  },
+  "rAl7zXcODiqIpS__3qf1A": {
+    "title": "Workflows",
+    "description": "Cloudflare Workflow allows you to automate tasks and orchestrate different Cloudflare services through a visual, no-code/low-code interface. You can create workflows that trigger based on various events (e.g., HTTP requests, scheduled triggers) and perform actions such as modifying HTTP headers, routing traffic, or integrating with external APIs. It's designed to simplify complex configurations and automate repetitive tasks without requiring extensive coding knowledge.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Cloudflare Workflows Starter",
+        "url": "https://github.com/cloudflare/workflows-starter",
+        "type": "opensource"
+      },
+      {
+        "title": "Cloudflare Workflows · Cloudflare",
+        "url": "https://developers.cloudflare.com/workflows/",
+        "type": "article"
+      }
+    ]
+  },
+  "a0S0_JLwLLNGLUAHrqG4P": {
+    "title": "Workers AI",
+    "description": "Cloudflare Workers AI allows you to run AI inference directly on Cloudflare's global network, close to your users. This eliminates the need to send data to centralized AI servers, reducing latency and improving performance for AI-powered applications. You can use Workers AI to perform tasks like image recognition, natural language processing, and sentiment analysis at the edge.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Workers AI - Cloudflare Docs",
+        "url": "https://developers.cloudflare.com/workers-ai/",
+        "type": "article"
+      },
+      {
+        "title": "Models · Cloudflare Workers AI",
+        "url": "https://developers.cloudflare.com/workers-ai/models/",
+        "type": "article"
+      }
+    ]
+  },
+  "zMwmoCUp9429_aXU-Bz4H": {
+    "title": "Text Generation",
+    "description": "Workers AI allows you to perform text generation tasks directly on Cloudflare's edge network. You can use pre-trained models or fine-tune your own models to generate text for various purposes, such as content creation, chatbot responses, or language translation. Running text generation at the edge reduces latency and improves the responsiveness of your AI-powered applications.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Choose the Right Text Generation Model",
+        "url": "https://developers.cloudflare.com/workers-ai/tutorials/how-to-choose-the-right-text-generation-model/",
+        "type": "article"
+      },
+      {
+        "title": "Prompting · Cloudflare Workers AI",
+        "url": "https://developers.cloudflare.com/workers-ai/guides/prompting/",
+        "type": "article"
+      }
+    ]
+  },
+  "S7laV14zsx31O0Tsj2SRL": {
+    "title": "Image Processing",
+    "description": "Workers AI allows you to run AI models directly within Cloudflare Workers, enabling powerful image processing capabilities at the edge. You can use Workers AI to perform tasks such as:\n\n*   Image recognition\n*   Object detection\n*   Image classification\n*   Image resizing and optimization\n\nThis allows you to build intelligent applications that analyze and manipulate images in real-time, close to the user.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "How to Build an Image Generator using Workers AI",
+        "url": "https://developers.cloudflare.com/workers-ai/tutorials/image-generation-playground/",
+        "type": "article"
+      },
+      {
+        "title": "Get Started with Cloudflare Images",
+        "url": "https://developers.cloudflare.com/images/get-started/",
+        "type": "article"
+      }
+    ]
+  },
+  "HJbJ8OxjJzznYwLlIOSO2": {
+    "title": "Speech Rcognition",
+    "description": "You can use Workers AI to run speech-to-text models directly on Cloudflare's edge network, enabling real-time transcription of audio data. This can be useful for applications like voice search, voice commands, and live captioning.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Whisper - Cloudflare Workers AI",
+        "url": "https://developers.cloudflare.com/workers-ai/models/whisper/",
+        "type": "article"
+      }
+    ]
+  },
+  "QxPoNHsL-Pj_z3aU6qEP4": {
+    "title": "AI Model Integration",
+    "description": "Workers AI provides the ability to run AI models directly on Cloudflare's edge network for recognition tasks. This includes image recognition (identifying objects or scenes in images) and natural language understanding (analyzing text for sentiment, intent, or entities). By performing AI model recognition at the edge, you can reduce latency and improve the responsiveness of AI-powered applications.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Cloudflare + AI",
+        "url": "https://ai.cloudflare.com/",
+        "type": "article"
+      },
+      {
+        "title": "Cloudflare AI Model Integration",
+        "url": "https://developers.cloudflare.com/ai-gateway/integrations/",
+        "type": "article"
+      }
+    ]
+  },
+  "NWGVtH1vxQuO4lly0Omuy": {
+    "title": "Vectorize",
+    "description": "Cloudflare Vectorize is a vector database that lets you store and query high-dimensional vectors, often used in machine learning for tasks like similarity search and recommendation engines. By using Vectorize with Workers AI, you can build applications that perform real-time AI-powered searches and recommendations directly on Cloudflare's edge network.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Introduction to Vectorize - Cloudflare Docs",
+        "url": "https://developers.cloudflare.com/vectorize/get-started/intro/",
+        "type": "article"
+      },
+      {
+        "title": "Cloudflare Vectorize",
+        "url": "https://developers.cloudflare.com/vectorize/",
+        "type": "article"
+      }
+    ]
+  },
+  "UIWaR1ZdjSm0UAS69Kz_5": {
+    "title": "Vector Embeddings",
+    "description": "Cloudflare Vectorize allows you to store and query high-dimensional vectors, often used in machine learning for tasks like similarity search and recommendation engines. By using Vectorize with Workers AI, you can build applications that perform real-time AI-powered searches and recommendations directly on Cloudflare's edge network.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Vector Database - Cloudflare Docs",
+        "url": "https://developers.cloudflare.com/vectorize/reference/what-is-a-vector-database/",
+        "type": "article"
+      },
+      {
+        "title": "Cloudflare Vectorize",
+        "url": "https://developers.cloudflare.com/vectorize/",
+        "type": "article"
+      }
+    ]
+  },
+  "pg3GtykCegK411DYDN8sN": {
+    "title": "Similarity Search",
+    "description": "Cloudflare offers Vectorize, a vector database, which enables similarity search. You can embed data (text, images, audio) as vectors and then use Vectorize to find the most similar vectors based on a query vector. This is used for recommendation systems, content discovery, and other applications where finding similar items is important.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "seemueller-io/hyphalbase",
+        "url": "https://github.com/seemueller-io/hyphalbase",
+        "type": "opensource"
+      },
+      {
+        "title": "Cloudflare Vectorize - Cloudflare",
+        "url": "https://developers.cloudflare.com/vectorize/",
+        "type": "article"
+      }
+    ]
+  },
+  "Ep9_oV_YnkbH1gHM-n3gO": {
+    "title": "AI-powered Search",
+    "description": "You can build AI-powered search using Cloudflare Workers, Workers AI, and Vectorize.\n\n1.  **Embed Data:** Use Workers AI to create vector embeddings of your data (e.g., text, images).\n2.  **Store Embeddings:** Store these embeddings in Vectorize.\n3.  **Search:** When a user searches, embed the search query using Workers AI and then use Vectorize to find the most similar embeddings in your database.\n4.  **Return Results:** Return the corresponding data items as search results.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Cloudflare + AI",
+        "url": "https://ai.cloudflare.com/",
+        "type": "article"
+      },
+      {
+        "title": "Cloudflare Agents",
+        "url": "https://developers.cloudflare.com/agents/",
+        "type": "article"
+      },
+      {
+        "title": "How to use Cloudflare Workers AI for building an AI-powered Search",
+        "url": "https://dev.to/charlestehio/how-to-use-cloudflare-workers-ai-for-building-an-ai-powered-search-bar-51jn",
+        "type": "article"
+      }
+    ]
+  },
+  "LoT3NtpNj9uAgQRV-MD_E": {
+    "title": "Stream",
+    "description": "Cloudflare Stream is a video streaming platform that makes it easy to upload, encode, and deliver videos globally. It handles all the complexities of video streaming, including encoding for different devices and network conditions, providing a reliable and high-quality viewing experience. Stream integrates seamlessly with Cloudflare's CDN, ensuring fast and efficient video delivery to users around the world.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Cloudflare Stream - Cloudflare Documentation",
+        "url": "https://www.cloudflare.com/developer-platform/products/cloudflare-stream/",
+        "type": "article"
+      },
+      {
+        "title": "Cloudflare Stream - Cloudflare Blog",
+        "url": "https://blog.cloudflare.com/tag/cloudflare-stream/",
+        "type": "article"
+      }
+    ]
+  },
+  "zQp7XfDKWJgMf2LexRJhN": {
+    "title": "Video Delivery",
+    "description": "Cloudflare Stream provides a comprehensive solution for video delivery:\n\n*   **Encoding:** Automatically encodes videos for different devices and bandwidths.\n*   **Storage:** Stores your videos securely.\n*   **CDN:** Delivers videos globally via Cloudflare's CDN for fast playback.\n*   **Player:** Provides a customizable video player.\n\nThis simplifies the process of delivering high-quality video experiences.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Delivering Videos with Cloudflare",
+        "url": "https://developers.cloudflare.com/support/more-dashboard-apps/cloudflare-stream/delivering-videos-with-cloudflare/",
+        "type": "article"
+      },
+      {
+        "title": "Stream Delivery - Cloudflare Stream",
+        "url": "https://www.cloudflare.com/application-services/solutions/stream-delivery/",
+        "type": "article"
+      },
+      {
+        "title": "Cloudflare Stream - Cloudflare",
+        "url": "https://www.cloudflare.com/developer-platform/products/cloudflare-stream/",
+        "type": "article"
+      }
+    ]
+  },
+  "RiQSPAV9uRFgwQFJckTFV": {
+    "title": "Live streaming",
+    "description": "Cloudflare Stream supports live streaming. You can use tools like OBS Studio or Wirecast to stream video to Cloudflare, and Stream will handle the encoding, distribution, and playback. This allows you to easily broadcast live events to a global audience.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Cloudflare Stream",
+        "url": "https://www.cloudflare.com/developer-platform/products/cloudflare-stream/",
+        "type": "article"
+      },
+      {
+        "title": "Serverless Live Streaming with Cloudflare Stream",
+        "url": "https://blog.cloudflare.com/stream-live/",
+        "type": "article"
+      }
+    ]
+  },
+  "3B6Z7F0D3Sf8ZBlV3kkGx": {
+    "title": "Video Processing",
+    "description": "Cloudflare offers video processing capabilities through Stream and Workers:\n\n*   **Stream:** Handles encoding, transcoding, and adaptive bitrate streaming automatically.\n*   **Workers:** You can use Workers to intercept video requests and perform custom processing, such as adding watermarks or modifying metadata.\n\nThis allows you to customize your video delivery pipeline.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Cloudflare Stream - Cloudflare",
+        "url": "https://www.cloudflare.com/developer-platform/products/cloudflare-stream/",
+        "type": "article"
+      },
+      {
+        "title": "VOD Platform | Video-on-demand Streaming Software",
+        "url": "https://www.cloudflare.com/developer-platform/solutions/video-on-demand/",
+        "type": "article"
+      }
+    ]
+  },
+  "8bOWuopxHtBWUSFaVT54P": {
+    "title": "Images",
+    "description": "Cloudflare Images provides comprehensive image optimization and delivery services. It automatically resizes, converts, and optimizes images for different devices and browsers, improving website performance and reducing bandwidth usage. You can also use Cloudflare Images to store and serve images directly, eliminating the need for a separate image hosting service.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Images · Cloudflare Docs",
+        "url": "https://developers.cloudflare.com/images/",
+        "type": "article"
+      },
+      {
+        "title": "Get Started with Cloudflare Images",
+        "url": "https://developers.cloudflare.com/images/get-started/",
+        "type": "article"
+      }
+    ]
+  },
+  "vHQdMgaL2EEr2o_eJmOuV": {
+    "title": "Calls",
+    "description": "Cloudflare Calls is a platform for building real-time audio and video applications directly on Cloudflare's edge network. It provides the infrastructure and APIs you need to create interactive experiences like video conferencing, live streaming, and voice chat, with low latency and global reach.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Cloudflare Calls",
+        "url": "https://developers.cloudflare.com/calls/",
+        "type": "article"
+      },
+      {
+        "title": "Introduction · Cloudflare Calls",
+        "url": "https://developers.cloudflare.com/calls/introduction/",
+        "type": "article"
+      }
+    ]
+  },
+  "aKEH4ZxI6J1nwjp_AgH5r": {
+    "title": "Logging and Monitoring",
+    "description": "Effective logging and monitoring are crucial for understanding and debugging Cloudflare Workers. You can use `console.log` for basic logging during development. For production, consider using a dedicated logging service to collect and analyze logs from your Workers. Cloudflare provides metrics like request counts, CPU usage, and error rates that can be monitored in the Cloudflare dashboard. Setting up alerts based on these metrics helps you identify and address issues quickly.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Logging vs Monitoring: What's the Difference?",
+        "url": "https://toxigon.com/logging-vs-monitoring-whats-the-difference",
+        "type": "article"
+      },
+      {
+        "title": "Debugging and Logging · Cloudflare Pages",
+        "url": "https://developers.cloudflare.com/pages/functions/debugging-and-logging/",
+        "type": "article"
+      }
+    ]
+  },
+  "z-1Ye5hcNdr9r6Gwdw7mv": {
+    "title": "Email Workers",
+    "description": "Email Workers allow you to intercept and modify email traffic passing through Cloudflare's email routing service. You can use Email Workers to perform tasks like spam filtering, email authentication, and custom email processing logic, giving you greater control over your email flow.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Email Workers · Cloudflare Email Routing",
+        "url": "https://developers.cloudflare.com/email-routing/email-workers/",
+        "type": "article"
+      },
+      {
+        "title": "Route to Workers, Automate Your Email Processing",
+        "url": "https://blog.cloudflare.com/announcing-route-to-workers/",
+        "type": "article"
+      },
+      {
+        "title": "Implementing an Email Delivery Service with Cloudflare Workers",
+        "url": "https://medium.com/@georgechmr/implementing-an-email-delivery-service-with-cloudflare-workers-c141422109d0",
+        "type": "article"
+      }
+    ]
+  },
+  "-lsYPD6JueIV94RybGH_Y": {
+    "title": "Routing",
+    "description": "In Cloudflare Email Workers, routing refers to directing incoming emails to the appropriate destination or processing logic. Email Workers intercept emails and use defined rules to determine their fate. You can route emails based on sender, recipient, subject, or other criteria. This allows you to forward emails, trigger custom logic, or even discard unwanted messages. Effective routing is critical for managing email flow, implementing custom email workflows, and building applications that react to incoming email.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Email Workers · Cloudflare Email Routing",
+        "url": "https://developers.cloudflare.com/email-routing/email-workers/",
+        "type": "article"
+      }
+    ]
+  },
+  "6bNUqx5f_w5NuDL25BABN": {
+    "title": "Processing",
+    "description": "With Cloudflare Email Workers, processing involves manipulating or analyzing incoming email content. After an email is routed to your worker, you can access and modify various aspects of the email, such as headers, body, and attachments. Processing can include tasks like:\n\n*   **Content Modification:** Altering the email body, adding disclaimers, or translating content.\n*   **Data Extraction:** Parsing information from the email to use in other applications.\n*   **Spam Filtering:** Implementing custom spam detection logic.\n*   **Attachment Handling:** Processing or storing attachments.\n\nEmail Workers provide the flexibility to customize how emails are handled, enabling a wide range of email-based applications and integrations.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Email Workers · Cloudflare Email Routing",
+        "url": "https://developers.cloudflare.com/email-routing/email-workers/",
+        "type": "article"
+      },
+      {
+        "title": "Email Workers Routing - Runtime API",
+        "url": "https://developers.cloudflare.com/email-routing/email-workers/runtime-api/",
+        "type": "article"
+      }
+    ]
+  },
+  "kdIfqTCcOSvV4KDpjr7nu": {
+    "title": "Filtering",
+    "description": "In Cloudflare Email Workers, filtering is the process of selectively acting on emails based on specific criteria. It allows you to define rules that determine which emails your worker will process and how. Filtering can be based on various email attributes, including:\n\n*   **Sender/Recipient:** Matching specific email addresses or domains.\n*   **Subject Line:** Looking for keywords or patterns in the subject.\n*   **Headers:** Examining specific header values.\n*   **Content:** Analyzing the email body for certain keywords.\n\nBy implementing filtering, you can ensure that your worker only processes relevant emails, optimizing performance and preventing unintended actions on unrelated messages.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Email Workers · Cloudflare Email Routing",
+        "url": "https://developers.cloudflare.com/email-routing/email-workers/",
+        "type": "article"
+      },
+      {
+        "title": "Implementing an Email Delivery Service with Cloudflare Workers",
+        "url": "https://medium.com/@georgechmr/implementing-an-email-delivery-service-with-cloudflare-workers-c141422109d0",
+        "type": "article"
+      }
+    ]
+  },
+  "vu8yJsS1WccsdcEVUqwNd": {
+    "title": "AI Gateway",
+    "description": "Cloudflare's AI Gateway acts as a central point for managing and optimizing your AI workloads. It provides features like caching, rate limiting, and observability for AI requests, helping you improve performance, reduce costs, and gain insights into how your AI models are being used.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Cloudflare + AI",
+        "url": "https://ai.cloudflare.com/",
+        "type": "article"
+      },
+      {
+        "title": "Cloudflare AI Gateway",
+        "url": "https://www.cloudflare.com/developer-platform/products/ai-gateway/",
+        "type": "article"
+      }
+    ]
+  },
+  "qkFRW_tJB8_1IYpYskQ5M": {
+    "title": "Browser Rendering",
+    "description": "Cloudflare Browser Rendering allows you to render web pages in a headless browser environment on Cloudflare's edge network. This is useful for tasks like generating PDFs, taking screenshots, or pre-rendering content for SEO purposes. By performing browser rendering at the edge, you can offload processing from your origin server and improve performance for certain types of web applications.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Browser Rendering",
+        "url": "https://developers.cloudflare.com/browser-rendering/",
+        "type": "article"
+      },
+      {
+        "title": "Browser Rendering API - Blog",
+        "url": "https://blog.cloudflare.com/browser-rendering-api-ga-rolling-out-cloudflare-snippets-swr-and-bringing-workers-for-platforms-to-our-paygo-plans/",
+        "type": "article"
+      }
+    ]
+  },
+  "76xovsBrKOnlRBVjsqNq1": {
+    "title": "Security & Performance",
+    "description": "Cloudflare significantly enhances both security and performance through its global network. It provides robust protection against DDoS attacks, bot traffic, and other web threats, while also accelerating website loading times via its CDN and caching mechanisms. By terminating SSL/TLS connections at the edge and optimizing content delivery, Cloudflare ensures a secure and fast experience for users, reducing latency and improving overall website resilience.\n\n**Security:** Cloudflare Email Workers can enhance email security by:\n\n*   **Spam and Phishing Detection:** Implementing custom filters to identify and block malicious emails before they reach the recipient.\n*   **Content Sanitization:** Removing potentially harmful content from emails, such as malicious scripts or links.\n*   **Authentication:** Verifying sender authenticity to prevent spoofing and phishing attacks.\n*   **Data Loss Prevention (DLP):** Preventing sensitive information from being sent via email.\n\n**Performance:** Email Workers impact performance by:\n\n*   **Reduced Latency:** Processing emails closer to the user, minimizing delays.\n*   **Scalability:** Handling large volumes of email traffic without performance degradation.\n*   **Custom Routing:** Efficiently directing emails to the appropriate destination.\n*   **Optimized Processing:** Performing lightweight email processing tasks to avoid bottlenecks.\n\nEffectively leveraging Email Workers for security and performance requires careful planning and implementation of relevant filters, rules, and processing logic.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Application Security & Performance Solutions - Cloudflare",
+        "url": "https://www.cloudflare.com/application-services/solutions/",
+        "type": "article"
+      },
+      {
+        "title": "Cloudflare Security Architecture",
+        "url": "https://developers.cloudflare.com/reference-architecture/architectures/security/",
+        "type": "article"
+      }
+    ]
+  },
+  "8IF7jftushwZrn7JXpC_v": {
+    "title": "Workers Security Model",
+    "description": "Cloudflare Workers operate within a secure, isolated environment. The Workers runtime enforces strict security boundaries, preventing Workers from accessing sensitive data or interfering with other processes. Workers have limited access to the outside world and must explicitly request resources. Cloudflare's global network provides inherent DDoS protection and mitigates common web vulnerabilities. This secure execution environment ensures that Workers can safely process requests without compromising the overall security of the platform.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Security Model · Cloudflare",
+        "url": "https://developers.cloudflare.com/workers/reference/security-model/",
+        "type": "article"
+      },
+      {
+        "title": "Workers RPC — Visibility and Security Model - Cloudflare Docs",
+        "url": "https://developers.cloudflare.com/workers/runtime-apis/rpc/visibility/",
+        "type": "article"
+      }
+    ]
+  },
+  "uNinrB9wm5ahjGXu5fc0g": {
+    "title": "Isolates Architecture",
+    "description": "Cloudflare's isolated architecture for Workers relies on lightweight V8 isolates. Each Worker runs in its own isolate, providing strong isolation from other Workers and the underlying infrastructure. Isolates start quickly and consume minimal resources, enabling rapid scaling. This architecture prevents code from one Worker from impacting others, enhancing security and stability. The isolation ensures that even if a Worker contains vulnerabilities, it cannot compromise the entire Cloudflare network or other customers' applications.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Reference Architectures · Cloudflare Reference Architecture",
+        "url": "https://developers.cloudflare.com/reference-architecture/",
+        "type": "article"
+      },
+      {
+        "title": "Cloudflare Security Architecture",
+        "url": "https://developers.cloudflare.com/reference-architecture/architectures/security/",
+        "type": "article"
+      }
+    ]
+  },
+  "KWix4jeNUKJ07Iu95Mqj_": {
+    "title": "Web Security Headers",
+    "description": "Web security headers are HTTP response headers that enhance website security. Cloudflare allows you to easily configure these headers to protect against common attacks. Key headers include:\n\n*   **Content Security Policy (CSP):** Controls resources the browser can load.\n*   **Strict-Transport-Security (HSTS):** Enforces HTTPS connections.\n*   **X-Frame-Options:** Prevents clickjacking attacks.\n*   **X-XSS-Protection:** Enables XSS filtering in browsers.\n*   **Referrer-Policy:** Controls referrer information sent with requests.\n\nCloudflare simplifies setting these headers, improving website security with minimal effort.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Configure HTTP Headers - Cloudflare",
+        "url": "https://developers.cloudflare.com/fundamentals/reference/http-headers/",
+        "type": "article"
+      },
+      {
+        "title": "Quick Reference to Security Headers",
+        "url": "https://web.dev/articles/security-headers",
+        "type": "article"
+      }
+    ]
+  },
+  "JP5U6c2fZjtkU-Xzwtapx": {
+    "title": "Rate Limiting",
+    "description": "Cloudflare Queues can be used to implement rate limiting. Instead of directly processing every request, you can enqueue them. A consumer Worker then processes messages from the queue at a controlled rate. This prevents your backend systems from being overwhelmed by sudden spikes in traffic. You can adjust the consumer's processing rate to match the capacity of your backend services.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Cloudflare Queues - Queues & Rate Limits",
+        "url": "https://developers.cloudflare.com/queues/tutorials/handle-rate-limits/",
+        "type": "article"
+      },
+      {
+        "title": "Rate Limiting Best Practices - Cloudflare Docs",
+        "url": "https://developers.cloudflare.com/waf/rate-limiting-rules/best-practices/",
+        "type": "article"
+      }
+    ]
+  },
+  "ui3pUfsGMxv4WRzHkgbF0": {
+    "title": "Cache API",
+    "description": "Cloudflare's Cache API allows Workers to programmatically control caching behavior. You can store responses in Cloudflare's global cache and retrieve them later, reducing origin server load and improving performance. The Cache API offers fine-grained control over cache keys, expiration, and other parameters. This enables you to cache dynamic content, personalize responses, and optimize content delivery for specific users or devices. The Cache API is a powerful tool for building highly performant and scalable applications on Cloudflare.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Cloudflare API Cache · Cloudflare",
+        "url": "https://developers.cloudflare.com/api-next/resources/cache//",
+        "type": "article"
+      }
+    ]
+  },
+  "INiqdtppBmCthOEXuHb-V": {
+    "title": "HTML Rewriting",
+    "description": "HTML rewriting with Cloudflare Workers enables you to modify HTML content on the fly. You can use Workers to parse HTML, manipulate elements, and inject new content. Common use cases include:\n\n*   A/B testing: Dynamically changing content for different users.\n*   Personalization: Tailoring the HTML based on user characteristics.\n*   Content injection: Adding analytics scripts or ads.\n*   Security enhancements: Removing potentially harmful code.\n\nHTML rewriting allows you to customize the user experience and optimize your website without modifying the origin server.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "HTMLRewriter · Cloudflare Workers",
+        "url": "https://developers.cloudflare.com/workers/runtime-apis/html-rewriter/",
+        "type": "article"
+      },
+      {
+        "title": "Introducing the HTMLRewriter API to Cloudflare Workers",
+        "url": "https://blog.cloudflare.com/introducing-htmlrewriter/",
+        "type": "article"
+      }
+    ]
+  },
+  "sXBxaQtwJ-luGVXdqVXk1": {
+    "title": "Edge SSL/TLS",
+    "description": "Cloudflare's Edge SSL/TLS terminates SSL/TLS connections at Cloudflare's edge network, close to the user. This reduces latency and improves performance compared to terminating connections at the origin server. Cloudflare offers various SSL/TLS options, including:\n\n*   **Universal SSL:** Free SSL certificates for all Cloudflare users.\n*   **Dedicated SSL:** Custom SSL certificates for specific domains.\n*   **Origin CA:** Free certificates for securing communication between Cloudflare and your origin.\n\nEdge SSL/TLS ensures secure communication between users and your website while optimizing performance.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Get Started with SSL/TLS - Cloudflare Docs",
+        "url": "https://developers.cloudflare.com/ssl/get-started/",
+        "type": "article"
+      },
+      {
+        "title": "Edge Certificates · Cloudflare SSL/TLS",
+        "url": "https://developers.cloudflare.com/ssl/edge-certificates/",
+        "type": "article"
+      }
+    ]
+  },
+  "So-cKAVfbgsw2zzFREu7Q": {
+    "title": "Bot Management",
+    "description": "Cloudflare Bot Management identifies and mitigates malicious bot traffic. It uses machine learning and behavioral analysis to distinguish between human and bot activity. Cloudflare can block, challenge, or allow bot traffic based on its behavior and characteristics. This helps prevent - Credential stuffing, Content scraping, Spam submissions, DDoS attacks. Effective bot management improves website performance, security, and resource utilization.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Cloudflare Bot Management & Protection",
+        "url": "https://www.cloudflare.com/application-services/products/bot-management/",
+        "type": "article"
+      },
+      {
+        "title": "What is Bot Management? | How Bot Managers work?",
+        "url": "https://www.cloudflare.com/learning/bots/what-is-bot-management/",
+        "type": "article"
+      }
+    ]
+  },
+  "wvurOKbemF4Tt2WZcmqDL": {
+    "title": "Integration & Workflows",
+    "description": "Workflows refers to the automated processes you can create to manage and respond to various events or conditions. This often involves chaining together different Cloudflare features and potentially integrating with external services. Workflows enable you to automate tasks such as:\n\n*   Responding to security threats\n*   Optimizing website performance\n*   Managing user access\n*   Enforcing compliance policies\n\nCloudflare's strength lies in its ability to integrate various services and create automated workflows. You can connect Cloudflare with external platforms using webhooks or APIs. Workflows can automate tasks like responding to security events, optimizing performance based on real-time data, or managing user access. By integrating different components, you can build complex and efficient systems that leverage Cloudflare's global network.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "CI/CD · Cloudflare Workers",
+        "url": "https://developers.cloudflare.com/workers/ci-cd/",
+        "type": "article"
+      },
+      {
+        "title": "Cloudflare Workflows",
+        "url": "https://developers.cloudflare.com/workflows/",
+        "type": "article"
+      },
+      {
+        "title": "Workers Builds: Integrated CI/CD built on the Workers platform",
+        "url": "https://blog.cloudflare.com/workers-builds-integrated-ci-cd-built-on-the-workers-platform/",
+        "type": "article"
+      }
+    ]
+  },
+  "SaHqm7T4FFVrsgyfImo66": {
+    "title": "Pages Functions",
+    "description": "Pages Functions, (now part of Cloudflare Functions), allow you to run serverless code directly within your Cloudflare Pages projects. This lets you add dynamic functionality, like form handling or API endpoints, to your otherwise static sites. They're deployed alongside your static assets and execute on Cloudflare's edge network, ensuring low latency and high performance.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Functions · Cloudflare Pages",
+        "url": "https://developers.cloudflare.com/pages/functions/",
+        "type": "article"
+      }
+    ]
+  },
+  "JfpVexcbuWCx_R3EjFmbo": {
+    "title": "Service Bindings",
+    "description": "Service Bindings allow Cloudflare Workers to seamlessly integrate with other Cloudflare services. They provide a secure and efficient way for a Worker to access resources like KV storage, Durable Objects, R2 storage, and other Workers. Instead of using API keys or direct network calls, Service Bindings create a direct connection between your Worker and the bound service, simplifying configuration and improving performance. They're essential for building complex applications that leverage the full power of the Cloudflare ecosystem.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Service Bindings · Cloudflare",
+        "url": "https://developers.cloudflare.com/workers/platform/service-bindings/",
+        "type": "article"
+      }
+    ]
+  },
+  "jYAUIKozuhsNK5LbkeAJ6": {
+    "title": "Inter Worker Communication",
+    "description": "Inter-Worker communication enables different Cloudflare Workers to interact and share data. This can be achieved through:\n\n*   **Durable Objects:** Workers can share persistent data and coordinate state using Durable Objects.\n*   **KV Storage:** Workers can read and write data to a shared KV namespace.\n*   **Webhooks:** One Worker can trigger another by sending a webhook request.\n\nThese methods allow you to build complex applications where different Workers handle specific tasks and collaborate to achieve a common goal.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "How Workers for Platforms works - Cloudflare Docs",
+        "url": "https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/reference/how-workers-for-platforms-works/",
+        "type": "article"
+      },
+      {
+        "title": "Cooperation between Cloudflare Workers",
+        "url": "https://dev.to/chimame/cooperation-between-cloudflare-workers-has-become-amazing-thanks-to-rpc-support-4co9",
+        "type": "article"
+      }
+    ]
+  },
+  "4g5w6IAdzefdlRTxbRbdS": {
+    "title": "External API Integration",
+    "description": "Cloudflare Workers can integrate with external APIs to enrich functionality. You can use fetch() within a Worker to make requests to third-party services. This enables you to:\n\n*   Retrieve data from external sources.\n*   Send data to external systems.\n*   Authenticate with external services using API keys or tokens.\n\nIntegrating with external APIs allows you to build powerful applications that leverage the capabilities of other platforms.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "APIs · Cloudflare Workers",
+        "url": "https://developers.cloudflare.com/workers/configuration/integrations/apis/",
+        "type": "article"
+      },
+      {
+        "title": "External Services · Cloudflare Workers",
+        "url": "https://developers.cloudflare.com/workers/configuration/integrations/external-services/",
+        "type": "article"
+      }
+    ]
+  },
+  "uOUjI6CPrhZIlz6mRCtOW": {
+    "title": "Webhook Handling",
+    "description": "Cloudflare can handle webhooks to trigger actions based on external events. You can configure Cloudflare Workers to receive webhook requests and process the data. This allows you to integrate Cloudflare with other services like GitHub, Slack, or monitoring tools. When an event occurs in the external service, it sends a webhook to your Cloudflare Worker, which can then perform actions such as updating DNS records, purging the cache, or sending notifications.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Configure Webhooks - Cloudflare",
+        "url": "https://developers.cloudflare.com/notifications/get-started/configure-webhooks/",
+        "type": "article"
+      }
+    ]
+  },
+  "Z9Yywlf7rXFBtxTq5B2Y5": {
+    "title": "Event-driven Architectures",
+    "description": "Cloudflare Workers are well-suited for event-driven architectures. You can trigger Workers based on various events, such as:\n\n*   Incoming HTTP requests\n*   Scheduled tasks (using Cron Triggers)\n*   Webhooks from external services\n\nThis allows you to build reactive systems that respond to events in real-time. Workers can process events and trigger other actions, creating a chain reaction that automates complex tasks.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "What Is Event-Driven Architecture? - IBM",
+        "url": "https://www.ibm.com/think/topics/event-driven-architecture",
+        "type": "article"
+      }
+    ]
+  },
+  "gsCRhwwjXuyueaYHSPOVZ": {
+    "title": "Development Tools",
+    "description": "*   **Wrangler:** The command-line interface (CLI) is your primary tool for interacting with Cloudflare Workers. It handles project creation, local testing, deployment, secret management, and more. Wrangler simplifies the entire development lifecycle.\n*   **Miniflare:** This local simulator replicates the Cloudflare Workers environment on your machine. It supports features like KV storage, Durable Objects, and the Cache API, enabling offline development and testing.\n*   **Cloudflare Dashboard:** The web interface provides a visual way to manage your Cloudflare account, configure settings, monitor performance, and view analytics. It's useful for managing DNS, security rules, and other global settings.\n*   **Workers Playground:** A browser-based environment for experimenting with Workers code. It's ideal for quick prototyping and testing small code snippets without setting up a local development environment.\n*   **VS Code Extension:** This extension integrates with Visual Studio Code, providing features like syntax highlighting, code completion, and debugging support for Cloudflare Workers. It enhances the development experience within your preferred IDE.",
+    "links": []
+  },
+  "n0vIbHmUZHrF4WjEhYdb8": {
+    "title": "Wrangler",
+    "description": "Wrangler is the command-line interface (CLI) tool for building, deploying, and managing Cloudflare Workers. It simplifies the development workflow by providing commands for creating new projects, testing Workers locally, deploying code to Cloudflare's edge network, and managing secrets. Wrangler automates many tasks, making it easier to develop and deploy serverless applications on Cloudflare.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Wrangler Documentation",
+        "url": "https://developers.cloudflare.com/workers/wrangler/",
+        "type": "article"
+      },
+      {
+        "title": "Wrangler Commands",
+        "url": "https://developers.cloudflare.com/workers/wrangler/commands//",
+        "type": "article"
+      }
+    ]
+  },
+  "vZHBp4S6WaS5sa5rfUOk-": {
+    "title": "Miniflare",
+    "description": "Miniflare is a simulator for Cloudflare Workers that allows you to test your Workers locally. It mimics the Cloudflare Workers runtime environment, including features like KV storage, Durable Objects, and the Cache API. Miniflare enables rapid iteration and debugging without deploying to Cloudflare's edge network. It's a valuable tool for developing and testing Workers offline or in a controlled environment.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "cloudflare/miniflare",
+        "url": "https://github.com/cloudflare/miniflare",
+        "type": "opensource"
+      },
+      {
+        "title": "Miniflare - Cloudflare Workers",
+        "url": "https://developers.cloudflare.com/workers/testing/miniflare/",
+        "type": "article"
+      }
+    ]
+  },
+  "G6YQZUQh_x8Qxm1oBseLQ": {
+    "title": "DevTools",
+    "description": "While you can't directly use traditional browser DevTools with Cloudflare Workers running on the edge, you can leverage similar debugging principles. Cloudflare offers tools like `wrangler tail` for real-time logging and the ability to inspect request/response headers. Using `console.log` strategically within your Worker code and analyzing the output via `wrangler tail` is the primary way to inspect variables and execution flow, emulating some DevTools functionality.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Chrome DevTools",
+        "url": "https://developer.chrome.com/docs/devtools",
+        "type": "article"
+      },
+      {
+        "title": "Overview | Chrome DevTools | Chrome for Developers",
+        "url": "https://developer.chrome.com/docs/devtools/overview/",
+        "type": "article"
+      },
+      {
+        "title": "Debugging Cloudflare Workers",
+        "url": "https://developers.cloudflare.com/workers/playground/#devtools",
+        "type": "article"
+      }
+    ]
+  },
+  "jyWxaMx7_nojt5HsyAv7K": {
+    "title": "Testing Frameworks",
+    "description": "Testing frameworks are crucial for ensuring Cloudflare Workers function correctly. Popular options include Jest, Mocha, and Chai. These frameworks allow you to write unit tests, integration tests, and end-to-end tests for your Workers. You can simulate Cloudflare's environment and test how your Worker responds to different requests and events. Thorough testing helps identify and fix bugs early in the development process, ensuring the reliability of your Workers.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Testing - Cloudflare Workers Docs",
+        "url": "https://developers.cloudflare.com/workers/testing/",
+        "type": "article"
+      },
+      {
+        "title": "Jest - Delightful JavaScript Testing",
+        "url": "https://jestjs.io/",
+        "type": "article"
+      },
+      {
+        "title": "Vitest - A Fast JavaScript Test Runner",
+        "url": "https://vitest.dev/",
+        "type": "article"
+      }
+    ]
+  },
+  "Cy2T8978yUAPGol-yzxv_": {
+    "title": "Monitoring Tools",
+    "description": "Monitoring tools provide insights into the performance and health of your Cloudflare applications. Cloudflare offers built-in analytics, but you can also integrate with external monitoring services like Datadog, New Relic, or Prometheus. These tools allow you to track metrics such as:\n\n*   Request latency\n*   Error rates\n*   Cache hit ratio\n*   Resource usage\n\nBy monitoring these metrics, you can identify performance bottlenecks, detect security threats, and ensure your applications are running smoothly.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Application Performance Monitoring Tools",
+        "url": "https://www.cloudflare.com/application-services/solutions/app-performance-monitoring/",
+        "type": "article"
+      },
+      {
+        "title": "Network Monitoring Tools",
+        "url": "https://www.cloudflare.com/network-services/solutions/network-monitoring-tools/",
+        "type": "article"
+      }
+    ]
+  },
+  "TmQC7fTL6b9EsBDYibv4g": {
+    "title": "Debugging Techniques",
+    "description": "Debugging Cloudflare Workers involves several techniques:\n\n*   **Console Logging:** Using `console.log()` to output variables and track code execution.\n*   **`wrangler tail`:** Viewing real-time logs from your Worker in the command line.\n*   **Source Maps:** Mapping compiled code back to the original source for easier debugging.\n*   **Try-Catch Blocks:** Handling errors gracefully and logging relevant information.\n*   **Local Testing:** Using `wrangler dev` to test Workers locally before deployment.\n\nThese techniques help identify and resolve issues in your Workers effectively.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Chrome DevTools",
+        "url": "https://developer.chrome.com/docs/devtools",
+        "type": "article"
+      },
+      {
+        "title": "Debugging Cloudflare Workers",
+        "url": "https://developers.cloudflare.com/workers/playground/#devtools",
+        "type": "article"
+      },
+      {
+        "title": "Debugging Cloudflare Workers",
+        "url": "https://blog.cloudflare.com/debugging-cloudflare-workers/",
+        "type": "article"
+      }
+    ]
+  },
+  "8WZpSKBHCeYfTEL9tBNKr": {
+    "title": "Tunnels",
+    "description": "Cloudflare Tunnel creates a secure, outbound-only connection between your origin server and Cloudflare's network, without opening any inbound ports. This protects your origin from direct attacks and simplifies network configuration. You can use Cloudflare Tunnel to securely expose web applications, APIs, and other services to the internet, without compromising security.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Cloudflare Tunnel · Cloudflare Zero Trust",
+        "url": "https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/",
+        "type": "article"
+      },
+      {
+        "title": "Ridiculously easy to use Tunnels - The Cloudflare Blog",
+        "url": "https://blog.cloudflare.com/ridiculously-easy-to-use-tunnels/",
+        "type": "article"
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/public/roadmap-content/computer-science.json b/public/roadmap-content/computer-science.json
index 9f6aeed3a..9ba88efa3 100644
--- a/public/roadmap-content/computer-science.json
+++ b/public/roadmap-content/computer-science.json
@@ -55,12 +55,12 @@
         "type": "article"
       },
       {
-        "title": "Python Website",
+        "title": "Python",
         "url": "https://www.python.org/",
         "type": "article"
       },
       {
-        "title": "Python Getting Started",
+        "title": "Getting Started with Python",
         "url": "https://www.python.org/about/gettingstarted/",
         "type": "article"
       },
@@ -182,6 +182,11 @@
     "title": "Rust",
     "description": "Rust is a modern systems programming language focusing on safety, speed, and concurrency. It accomplishes these goals by being memory safe without using garbage collection.\n\nVisit the following resources to learn more:",
     "links": [
+      {
+        "title": "Visit Dedicated Rust Roadmap",
+        "url": "https://roadmap.sh/rust",
+        "type": "article"
+      },
       {
         "title": "The Rust Programming Language - online book",
         "url": "https://doc.rust-lang.org/book/",
@@ -213,6 +218,11 @@
     "title": "C++",
     "description": "C++ is a powerful general-purpose programming language. It can be used to develop operating systems, browsers, games, and so on. C++ supports different ways of programming like procedural, object-oriented, functional, and so on. This makes C++ powerful as well as flexible.\n\nVisit the following resources to learn more:",
     "links": [
+      {
+        "title": "C++ Roadmap",
+        "url": "https://roadmap.sh/cpp",
+        "type": "article"
+      },
       {
         "title": "Learn C++",
         "url": "https://learncpp.com/",
@@ -238,11 +248,6 @@
         "url": "https://www.w3schools.com/cpp/default.asp",
         "type": "article"
       },
-      {
-        "title": "C++ Roadmap",
-        "url": "https://roadmap.sh/cpp",
-        "type": "article"
-      },
       {
         "title": "Explore top posts about C++ Programming",
         "url": "https://app.daily.dev/tags/c++?ref=roadmapsh",
@@ -326,6 +331,11 @@
         "url": "https://techdevguide.withgoogle.com/paths/data-structures-and-algorithms/",
         "type": "course"
       },
+      {
+        "title": "Visit Dedicated DSA Roadmap",
+        "url": "https://roadmap.sh/datastructures-and-algorithms",
+        "type": "article"
+      },
       {
         "title": "Data Structures and Algorithms",
         "url": "https://www.javatpoint.com/data-structure-tutorial",
@@ -645,6 +655,11 @@
         "title": "Complete Binary Tree - Programiz",
         "url": "https://www.programiz.com/dsa/complete-binary-tree",
         "type": "article"
+      },
+      {
+        "title": "Complete Binary Trees",
+        "url": "https://www.wscubetech.com/resources/dsa/complete-binary-tree",
+        "type": "article"
       }
     ]
   },
@@ -771,8 +786,14 @@
   },
   "HZ1kk0TQ13FLC9t13BZl5": {
     "title": "Adjacency Matrix",
-    "description": "",
-    "links": []
+    "description": "An adjacency matrix is a square matrix used to represent a finite graph. It is used to represent the connections between vertices in a graph. The matrix is filled with 0s and 1s, where a 1 represents a connection between two vertices and a 0 represents no connection.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Adjacency Matrix",
+        "url": "https://en.wikipedia.org/wiki/Adjacency_matrix",
+        "type": "article"
+      }
+    ]
   },
   "rTnKJcPniUtqvfOyC88N0": {
     "title": "Adjacency List",
@@ -1017,8 +1038,14 @@
   },
   "7a6-AnBI-3tAU1dkOvPkx": {
     "title": "Common Algorithms",
-    "description": "Here are some common algorithms that you should know. You can find more information about them in the [Algorithms](https://www.khanacademy.org/computing/computer-science/algorithms) section of the Computer Science course.\n\n*   Sorting\n*   Recursion\n*   Searching\n*   Cache Algorithms\n*   Tree Algorithms\n*   Graph Algorithms\n*   Greedy Algorithms\n*   Backtracking\n*   Substring Search\n*   Suffix Arrays\n*   Dynamic Programming",
-    "links": []
+    "description": "Here are some common algorithms that you should know. You can find more information about them in the Algorithms section of the Computer Science course.\n\n*   Sorting\n*   Recursion\n*   Searching\n*   Cache Algorithms\n*   Tree Algorithms\n*   Graph Algorithms\n*   Greedy Algorithms\n*   Backtracking\n*   Substring Search\n*   Suffix Arrays\n*   Dynamic Programming\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Top Algorithms and Data Structures",
+        "url": "https://towardsdatascience.com/top-algorithms-and-data-structures-you-really-need-to-know-ab9a2a91c7b5",
+        "type": "article"
+      }
+    ]
   },
   "0_qNhprnXU3i8koW3XTdD": {
     "title": "Tail Recursion",
@@ -1143,20 +1170,26 @@
   "XwyqBK9rgP1MMcJrdIzm5": {
     "title": "Linear Search",
     "description": "Linear search is a very simple algorithm that is used to search for a value in an array. It sequentially checks each element of the array until a match is found or until all the elements have been searched.\n\nVisit the following resources to learn more:",
-    "links": []
+    "links": [
+      {
+        "title": "Linear Search",
+        "url": "https://www.programiz.com/dsa/linear-search",
+        "type": "article"
+      }
+    ]
   },
   "4wGBYFZpcdTt97WTbSazx": {
     "title": "Bubble Sort",
     "description": "Bubble sort is a simple sorting algorithm that repeatedly steps through the list, compares adjacent elements and swaps them if they are in the wrong order. The pass through the list is repeated until the list is sorted.\n\nVisit the following resources to learn more:",
     "links": [
       {
-        "title": "Bubble Sort",
-        "url": "https://www.youtube.com/watch?v=P00xJgWzz2c&index=1&list=PL89B61F78B552C1AB",
-        "type": "video"
+        "title": "Bubble Sort Algorithm",
+        "url": "https://www.programiz.com/dsa/bubble-sort",
+        "type": "article"
       },
       {
-        "title": "Analyzing Bubble Sort",
-        "url": "https://www.youtube.com/watch?v=ni_zk257Nqo&index=7&list=PL89B61F78B552C1AB",
+        "title": "Bubble Sort",
+        "url": "https://www.youtube.com/watch?v=P00xJgWzz2c&index=1&list=PL89B61F78B552C1AB",
         "type": "video"
       },
       {
@@ -1375,7 +1408,13 @@
   "Yf5gOIe7oiL19MjEVcpdw": {
     "title": "Depth First Search",
     "description": "Depth first search is a graph traversal algorithm that starts at a root node and explores as far as possible along each branch before backtracking.\n\nVisit the following resources to learn more:",
-    "links": []
+    "links": [
+      {
+        "title": "Depth-first Search",
+        "url": "https://en.wikipedia.org/wiki/Depth-first_search",
+        "type": "article"
+      }
+    ]
   },
   "eY4nK2lPYsrR-a_8y2sao": {
     "title": "Bellman Ford's Algorithm",
@@ -1442,8 +1481,13 @@
   },
   "aBjBHpq_OajgQjxdCobXD": {
     "title": "Finding Hamiltonian Paths",
-    "description": "Hamiltonian paths are paths that visit every node in a graph exactly once. They are named after the famous mathematician [Hamilton](https://en.wikipedia.org/wiki/William_Rowan_Hamilton). Hamiltonian paths are a special case of [Hamiltonian cycles](https://en.wikipedia.org/wiki/Hamiltonian_cycle), which are cycles that visit every node in a graph exactly once.\n\nVisit the following resources to learn more:",
+    "description": "Hamiltonian paths are paths that visit every node in a graph exactly once. They are named after the famous mathematician Hamilton. Hamiltonian paths are a special case of Hamiltonian cycles, which are cycles that visit every node in a graph exactly once.\n\nVisit the following resources to learn more:",
     "links": [
+      {
+        "title": "Hamiltonian Cycles",
+        "url": "https://en.wikipedia.org/wiki/Hamiltonian_cycle",
+        "type": "article"
+      },
       {
         "title": "Hamiltonian Path",
         "url": "https://www.hackerearth.com/practice/algorithms/graphs/hamiltonian-path/tutorial/",
@@ -1967,13 +2011,13 @@
     "description": "Class Diagrams are used to model the static structure of a system. They are used to show the classes, their attributes, operations (or methods), and the relationships between objects.\n\nVisit the following resources to learn more:",
     "links": [
       {
-        "title": "UML Class Diagram Tutorial",
-        "url": "https://www.youtube.com/watch?v=UI6lqHOVHic",
-        "type": "video"
+        "title": "Class Diagrams",
+        "url": "https://www.visual-paradigm.com/guide/uml-unified-modeling-language/uml-class-diagram-tutorial/",
+        "type": "article"
       },
       {
         "title": "UML Class Diagram Tutorial",
-        "url": "https://www.youtube.com/watch?v=3cmzqZzwNDM&list=PLfoY2ARMh0hC2FcJKP5voAKCpk6PZXSd5&index=2",
+        "url": "https://www.youtube.com/watch?v=UI6lqHOVHic",
         "type": "video"
       }
     ]
@@ -2354,26 +2398,6 @@
         "title": "NP Completeness IV",
         "url": "https://www.youtube.com/watch?v=NKLDp3Rch3M&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=18",
         "type": "video"
-      },
-      {
-        "title": "CSE373 2020 - Lecture 23 - NP-Completeness",
-        "url": "https://www.youtube.com/watch?v=ItHp5laE1VE&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=23",
-        "type": "video"
-      },
-      {
-        "title": "CSE373 2020 - Lecture 24 - Satisfiability",
-        "url": "https://www.youtube.com/watch?v=inaFJeCzGxU&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=24",
-        "type": "video"
-      },
-      {
-        "title": "CSE373 2020 - Lecture 25 - More NP-Completeness",
-        "url": "https://www.youtube.com/watch?v=B-bhKxjZLlc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=25",
-        "type": "video"
-      },
-      {
-        "title": "CSE373 2020 - Lecture 26 - NP-Completeness Challenge",
-        "url": "https://www.youtube.com/watch?v=_EzetTkG_Cc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=26",
-        "type": "video"
       }
     ]
   },
@@ -2425,26 +2449,6 @@
         "title": "NP Completeness IV",
         "url": "https://www.youtube.com/watch?v=NKLDp3Rch3M&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=18",
         "type": "video"
-      },
-      {
-        "title": "CSE373 2020 - Lecture 23 - NP-Completeness",
-        "url": "https://www.youtube.com/watch?v=ItHp5laE1VE&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=23",
-        "type": "video"
-      },
-      {
-        "title": "CSE373 2020 - Lecture 24 - Satisfiability",
-        "url": "https://www.youtube.com/watch?v=inaFJeCzGxU&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=24",
-        "type": "video"
-      },
-      {
-        "title": "CSE373 2020 - Lecture 25 - More NP-Completeness",
-        "url": "https://www.youtube.com/watch?v=B-bhKxjZLlc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=25",
-        "type": "video"
-      },
-      {
-        "title": "CSE373 2020 - Lecture 26 - NP-Completeness Challenge",
-        "url": "https://www.youtube.com/watch?v=_EzetTkG_Cc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=26",
-        "type": "video"
       }
     ]
   },
@@ -2496,26 +2500,6 @@
         "title": "NP Completeness IV",
         "url": "https://www.youtube.com/watch?v=NKLDp3Rch3M&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=18",
         "type": "video"
-      },
-      {
-        "title": "CSE373 2020 - Lecture 23 - NP-Completeness",
-        "url": "https://www.youtube.com/watch?v=ItHp5laE1VE&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=23",
-        "type": "video"
-      },
-      {
-        "title": "CSE373 2020 - Lecture 24 - Satisfiability",
-        "url": "https://www.youtube.com/watch?v=inaFJeCzGxU&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=24",
-        "type": "video"
-      },
-      {
-        "title": "CSE373 2020 - Lecture 25 - More NP-Completeness",
-        "url": "https://www.youtube.com/watch?v=B-bhKxjZLlc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=25",
-        "type": "video"
-      },
-      {
-        "title": "CSE373 2020 - Lecture 26 - NP-Completeness Challenge",
-        "url": "https://www.youtube.com/watch?v=_EzetTkG_Cc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=26",
-        "type": "video"
       }
     ]
   },
@@ -2567,26 +2551,6 @@
         "title": "NP Completeness IV",
         "url": "https://www.youtube.com/watch?v=NKLDp3Rch3M&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=18",
         "type": "video"
-      },
-      {
-        "title": "CSE373 2020 - Lecture 23 - NP-Completeness",
-        "url": "https://www.youtube.com/watch?v=ItHp5laE1VE&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=23",
-        "type": "video"
-      },
-      {
-        "title": "CSE373 2020 - Lecture 24 - Satisfiability",
-        "url": "https://www.youtube.com/watch?v=inaFJeCzGxU&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=24",
-        "type": "video"
-      },
-      {
-        "title": "CSE373 2020 - Lecture 25 - More NP-Completeness",
-        "url": "https://www.youtube.com/watch?v=B-bhKxjZLlc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=25",
-        "type": "video"
-      },
-      {
-        "title": "CSE373 2020 - Lecture 26 - NP-Completeness Challenge",
-        "url": "https://www.youtube.com/watch?v=_EzetTkG_Cc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=26",
-        "type": "video"
       }
     ]
   },
@@ -2643,32 +2607,12 @@
         "title": "NP Completeness IV",
         "url": "https://www.youtube.com/watch?v=NKLDp3Rch3M&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=18",
         "type": "video"
-      },
-      {
-        "title": "CSE373 2020 - Lecture 23 - NP-Completeness",
-        "url": "https://www.youtube.com/watch?v=ItHp5laE1VE&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=23",
-        "type": "video"
-      },
-      {
-        "title": "CSE373 2020 - Lecture 24 - Satisfiability",
-        "url": "https://www.youtube.com/watch?v=inaFJeCzGxU&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=24",
-        "type": "video"
-      },
-      {
-        "title": "CSE373 2020 - Lecture 25 - More NP-Completeness",
-        "url": "https://www.youtube.com/watch?v=B-bhKxjZLlc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=25",
-        "type": "video"
-      },
-      {
-        "title": "CSE373 2020 - Lecture 26 - NP-Completeness Challenge",
-        "url": "https://www.youtube.com/watch?v=_EzetTkG_Cc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=26",
-        "type": "video"
       }
     ]
   },
   "0btHNkzWL1w_-pUgU_k2y": {
     "title": "P = NP",
-    "description": "The P = NP problem is one of the most famous problems in computer science. It asks if the problem of determining if a given input belongs to a certain class of problems is as hard as the problem of solving the given input. In other words, it asks if the problem of determining if a given input belongs to a certain class of problems is as hard as the problem of determining if a given input belongs to a certain class of problems. This problem is also known as the Halting Problem.\n\nVisit the following resources to learn more:",
+    "description": "The P = NP problem is one of the most famous problems in computer science. It asks whether a problem that can be solved in polynomial time on a non-deterministic machine (i.e., the problem is in NP) can also be solved in polynomial time on a deterministic machine (i.e., the problem is in P).\n\nIf you can find a polynomial-time solution to an NP-complete problem, then all problems in NP can be solved in polynomial time. This shows that P = NP.\n\nIf you can prove for any single NP-complete problem that it is only solvable in exponential time, then all NP-complete problems are only solvable in exponential time. This shows that P ≠ NP.\n\nSo far, we don't know whether P = NP or P ≠ NP.\n\nVisit the following resources to learn more:",
     "links": [
       {
         "title": "Whats P=NP?, and why is it such a famous question?",
@@ -2941,11 +2885,6 @@
         "url": "https://www.youtube.com/watch?v=svfnVhJOfMc&index=8&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6",
         "type": "video"
       },
-      {
-        "title": "MIT 6.851 - Memory Hierarchy Models",
-        "url": "https://www.youtube.com/watch?v=V3omVLzI0WE&index=7&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf",
-        "type": "video"
-      },
       {
         "title": "B-Trees (playlist) in 26 minutes",
         "url": "https://www.youtube.com/playlist?list=PL9xmBV_5YoZNFPPv98DjTdD9X6UI9KMHz",
@@ -3057,6 +2996,11 @@
     "title": "CDN",
     "description": "A CDN is a network of servers that are distributed geographically. The servers are connected to each other and to the internet. The servers are used to deliver content to users. The content is delivered to the user from the server that is closest to the user. This is done to reduce latency and improve the performance of the content delivery.\n\nVisit the following resources to learn more:",
     "links": [
+      {
+        "title": "What is a CDN?",
+        "url": "https://www.cloudflare.com/learning/cdn/what-is-a-cdn/",
+        "type": "article"
+      },
       {
         "title": "Content Delivery Network (CDN) - System Design",
         "url": "https://dev.to/karanpratapsingh/system-design-the-complete-course-10fo#content-delivery-network-cdn",
@@ -3163,6 +3107,11 @@
     "title": "GraphQL",
     "description": "GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data. GraphQL provides a complete and understandable description of the data in your API, gives clients the power to ask for exactly what they need and nothing more, makes it easier to evolve APIs over time, and enables powerful developer tools.\n\nVisit the following resources to learn more:",
     "links": [
+      {
+        "title": "Visit Dedicated GraphQL Roadmap",
+        "url": "https://roadmap.sh/graphql",
+        "type": "article"
+      },
       {
         "title": "Apollo GraphQL Tutorials",
         "url": "https://www.apollographql.com/tutorials/",
@@ -3227,7 +3176,7 @@
     "description": "Long polling is a technique used to implement server push functionality over HTTP. It is a method of opening a request on the server and keeping it open until an event occurs, at which point the server responds. This is in contrast to a regular HTTP request, where the server responds immediately with whatever data is available at the time.\n\nVisit the following resources to learn more:",
     "links": [
       {
-        "title": "Long polling",
+        "title": "Long Polling",
         "url": "https://javascript.info/long-polling",
         "type": "article"
       },
@@ -3252,7 +3201,18 @@
   "bVjI14VismTHNCyA0mEBP": {
     "title": "Web Sockets",
     "description": "Web sockets are a bidirectional communication protocol between a client and a server. They are used for real-time applications like chat, multiplayer games, and live data updates. Web sockets are also used to establish a connection between a server and a client. This connection is then used to send data in both directions.\n\nVisit the following resources to learn more:",
-    "links": []
+    "links": [
+      {
+        "title": "WebSockets",
+        "url": "https://en.wikipedia.org/wiki/WebSocket",
+        "type": "article"
+      },
+      {
+        "title": "Web Sockets API",
+        "url": "https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API",
+        "type": "article"
+      }
+    ]
   },
   "JckRqZA8C6IqQLPpTCgf4": {
     "title": "SSE",
@@ -3280,12 +3240,12 @@
     "description": "A database is a collection of useful data of one or more related organizations structured in a way to make data an asset to the organization. A database management system is a software designed to assist in maintaining and extracting large collections of data in a timely fashion.\n\nVisit the following resources to learn more:",
     "links": [
       {
-        "title": "Oracle: What is a Database?",
+        "title": "What is a Database?",
         "url": "https://www.oracle.com/database/what-is-database/",
         "type": "article"
       },
       {
-        "title": "Prisma.io: What are Databases?",
+        "title": "What are Databases?",
         "url": "https://www.prisma.io/dataguide/intro/what-are-databases",
         "type": "article"
       },
@@ -3362,22 +3322,51 @@
   "ii1vF74u3yrFNlw_21b3B": {
     "title": "DDL",
     "description": "DDL or Data Definition Language actually consists of the SQL commands that can be used to define the database schema. It simply deals with descriptions of the database schema and is used to create and modify the structure of database objects in the database. DDL is a set of SQL commands used to create, modify, and delete database structures but not data. These commands are normally not used by a general user, who should be accessing the database via an application.\n\nVisit the following resources to learn more:",
-    "links": []
+    "links": [
+      {
+        "title": "DDL",
+        "url": "https://en.wikipedia.org/wiki/Data_definition_language",
+        "type": "article"
+      }
+    ]
   },
   "tcQSH-eAvJUZuePTDjAIb": {
     "title": "DML",
-    "description": "The SQL commands that deals with the manipulation of data present in the database belong to DML or Data Manipulation Language and this includes most of the SQL statements. It is the component of the SQL statement that controls access to data and to the database. Basically, DCL statements are grouped with DML statements.\n\nVisit the following resources to learn more:",
-    "links": []
+    "description": "The SQL commands that manipulate data in the database belong to DML, or Data Manipulation Language, and this includes most of the SQL statements. DCL is the component of the SQL statement that controls access to data and to the database. Basically, DCL statements are grouped with DML statements.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "DML: Data Manipulation Language",
+        "url": "https://satoricyber.com/glossary/dml-data-manipulation-language",
+        "type": "article"
+      },
+      {
+        "title": "Difference Between DDL and DML",
+        "url": "https://appmaster.io/blog/difference-between-ddl-and-dml",
+        "type": "article"
+      }
+    ]
   },
   "05lkb3B86Won7Rkf-8DeD": {
     "title": "DQL",
     "description": "DQL statements are used for performing queries on the data within schema objects. The purpose of the DQL Command is to get some schema relation based on the query passed to it. We can define DQL as follows it is a component of SQL statement that allows getting data from the database and imposing order upon it. It includes the SELECT statement. This command allows getting the data out of the database to perform operations with it. When a SELECT is fired against a table or tables the result is compiled into a further temporary table, which is displayed or perhaps received by the program i.e. a front-end.\n\nVisit the following resources to learn more:",
-    "links": []
+    "links": [
+      {
+        "title": "Data Query Language",
+        "url": "https://en.wikipedia.org/wiki/Data_query_language",
+        "type": "article"
+      }
+    ]
   },
   "4bUmfuP2qgcli8I2Vm9zh": {
     "title": "DCL",
     "description": "DCL includes commands such as GRANT and REVOKE which mainly deal with the rights, permissions, and other controls of the database system.\n\nVisit the following resources to learn more:",
-    "links": []
+    "links": [
+      {
+        "title": "DCL",
+        "url": "https://en.wikipedia.org/wiki/Data_Control_Language",
+        "type": "article"
+      }
+    ]
   },
   "_sm63rZNKoibVndeNgOpW": {
     "title": "Locking",
@@ -3423,7 +3412,7 @@
   },
   "q3nRhTYS5wg9tYnQe2sCF": {
     "title": "BASE",
-    "description": "The rise in popularity of NoSQL databases provided a flexible and fluidity with ease to manipulate data and as a result, a new database model was designed, reflecting these properties. The acronym BASE is slightly more confusing than ACID but however, the words behind it suggest ways in which the BASE model is different and acronym BASE stands for:-\n\n*   **B**asically **A**vailable\n*   **S**oft state\n*   **E**ventual consistency\n\nVisit the following resources to learn more:",
+    "description": "The rise in popularity of NoSQL databases provided a flexible and fluidity with ease to manipulate data and as a result, a new database model was designed, reflecting these properties. The acronym BASE is slightly more confusing than ACID but however, the words behind it suggest ways in which the BASE model is different and acronym BASE stands for:-\n\n*   **B**asically **A**vailable\n*   **S**oft state\n*   **E**ventual consistency",
     "links": []
   },
   "uqfeiQ9K--QkGNwks4kjk": {
@@ -3793,7 +3782,7 @@
     "description": "Public-key cryptography, or asymmetric cryptography, is the field of cryptographic systems that use pairs of related keys. Each key pair consists of a public key and a corresponding private key. Key pairs are generated with cryptographic algorithms based on mathematical problems termed one-way functions.\n\nVisit the following resources to learn more:",
     "links": [
       {
-        "title": "Public-key cryptography - Wikipedia",
+        "title": "Public-key Cryptography",
         "url": "https://en.wikipedia.org/wiki/Public-key_cryptography",
         "type": "article"
       },
@@ -3866,7 +3855,12 @@
         "type": "opensource"
       },
       {
-        "title": "Wikipedia - OWASP",
+        "title": "OWASP",
+        "url": "https://owasp.org/",
+        "type": "article"
+      },
+      {
+        "title": "OWASP - Wiki",
         "url": "https://en.wikipedia.org/wiki/OWASP",
         "type": "article"
       },
@@ -3915,7 +3909,7 @@
   },
   "1eglba39q426Nh0E0qcdj": {
     "title": "How CPU Executes Programs",
-    "description": "Visit the following resources to learn more:",
+    "description": "The CPU executes programs by repeatedly fetching instructions from memory, decoding them to understand the operation, and then executing those operations. This cycle, called the fetch-decode-execute cycle, continues for each instruction in the program, with the CPU using registers for temporary storage and a program counter to keep track of the next instruction. Modern CPUs use techniques like pipelining and caches to speed up this process, enabling them to execute complex programs efficiently.\n\nVisit the following resources to learn more:",
     "links": [
       {
         "title": "Explore top posts about Computing",
@@ -3923,7 +3917,7 @@
         "type": "article"
       },
       {
-        "title": "How CPU executes a program",
+        "title": "How CPU Executes a Program",
         "url": "https://www.youtube.com/watch?v=XM4lGflQFvA",
         "type": "video"
       }
@@ -3931,7 +3925,7 @@
   },
   "GDLKJkKgB-i7n0YcV2NDa": {
     "title": "How Computers Calculate",
-    "description": "Visit the following resources to learn more:",
+    "description": "Computers calculate using the binary system, where all data is represented as 0s and 1s. These binary states correspond to the ON/OFF positions of transistors, which are the building blocks of logic gates (AND, OR, NOT). Numbers, characters, and instructions are broken into binary sequences (bits), and grouped into bytes (8 bits). Arithmetic operations like addition are performed through logic gates, which combine binary values. The CPU executes these calculations by following a fetch-decode-execute cycle. Complex calculations, such as handling decimals, use floating-point representation. Programs written in high-level languages are compiled into machine code for the CPU to execute.\n\nVisit the following resources to learn more:",
     "links": [
       {
         "title": "How computers calculate - ALU",
@@ -3953,8 +3947,13 @@
   },
   "AxiGqbteK7ZSXEUt_zckH": {
     "title": "Instructions and Programs",
-    "description": "Visit the following resources to learn more:",
+    "description": "Instructions are the most basic commands a CPU can understand, directing it to perform specific actions like adding numbers or moving data. A program, on the other hand, is a collection of these instructions, organized in a sequence to accomplish a particular task. Think of instructions as individual words and a program as a complete sentence or story; the CPU executes these instructions one by one, following the program's logic, to achieve the desired outcome.\n\nVisit the following resources to learn more:",
     "links": [
+      {
+        "title": "Instruction and Programs",
+        "url": "https://nerdfighteria.info/v/zltgXvg6r3k/",
+        "type": "article"
+      },
       {
         "title": "Instructions and Programs",
         "url": "https://youtu.be/zltgXvg6r3k",
@@ -3964,8 +3963,13 @@
   },
   "DjTQjMbika4_yTzrBpcmB": {
     "title": "CPU Cache",
-    "description": "Visit the following resources to learn more:",
+    "description": "A CPU cache is a hardware cache used by the central processing unit of a computer to reduce the average cost to access data from the main memory. A cache is a smaller, faster memory, located closer to a processor core, which stores copies of the data from frequently used main memory locations.\n\nVisit the following resources to learn more:",
     "links": [
+      {
+        "title": "What is CPU Cache",
+        "url": "https://www.howtogeek.com/854138/what-is-cpu-cache/",
+        "type": "article"
+      },
       {
         "title": "Explore top posts about Computing",
         "url": "https://app.daily.dev/tags/computing?ref=roadmapsh",
@@ -4059,10 +4063,10 @@
   },
   "xUo5Ox_HTgGyeQMDIkVyK": {
     "title": "Concurrency in Multiple Cores",
-    "description": "Visit the following resources to learn more:",
+    "description": "Concurrency or Parallelism is simultaneous execution of processes on a multiple cores per CPU or multiple CPUs (on a single motherboard). Concurrency is when Parallelism is achieved on a single core/CPU by using scheduling algorithms that divides the CPU's time (time-slice).\n\nVisit the following resources to learn more:",
     "links": [
       {
-        "title": "What is the difference between multicore and concurrent programming?",
+        "title": "Difference between Multi-core and concurrent Programming?",
         "url": "https://stackoverflow.com/questions/5372861/what-is-the-difference-between-multicore-and-concurrent-programming",
         "type": "article"
       },
@@ -4070,35 +4074,19 @@
         "title": "Concurrency in Multicore systems",
         "url": "https://cs.stackexchange.com/questions/140793/concurrency-in-multiple-core",
         "type": "article"
-      }
-    ]
-  },
-  "Ge2nagN86ofa2y-yYR1lv": {
-    "title": "Scheduling Algorithms",
-    "description": "CPU Scheduling is the process of selecting a process from the ready queue and allocating the CPU to it. The selection of a process is based on a particular scheduling algorithm. The scheduling algorithm is chosen depending on the type of system and the requirements of the processes.\n\nHere is the list of some of the most commonly used scheduling algorithms:\n\n*   **First Come First Serve (FCFS):** The process that arrives first is allocated the CPU first. It is a non-preemptive algorithm.\n*   **Shortest Job First (SJF):** The process with the smallest execution time is allocated the CPU first. It is a non-preemptive algorithm.\n*   **Shortest Remaining Time First (SRTF):** The process with the smallest remaining execution time is allocated the CPU first. It is a preemptive algorithm.\n*   **Round Robin (RR):** The process is allocated the CPU for a fixed time slice. The time slice is usually 10 milliseconds. It is a preemptive algorithm.\n*   **Priority Scheduling:** The process with the highest priority is allocated the CPU first. It is a preemptive algorithm.\n*   **Multi-level Queue Scheduling:** The processes are divided into different queues based on their priority. The process with the highest priority is allocated the CPU first. It is a preemptive algorithm.\n*   **Multi-level Feedback Queue Scheduling:** The processes are divided into different queues based on their priority. The process with the highest priority is allocated the CPU first. If a process is preempted, it is moved to the next queue. It is a preemptive algorithm.\n*   **Highest Response Ratio Next(HRRN):** CPU is allotted to the next process which has the highest response ratio and not to the process having less burst time. It is a Non-Preemptive algorithm.\n*   **Lottery Scheduling:** The process is allocated the CPU based on a lottery system. It is a preemptive algorithm.\n\nVisit the following resources to learn more :",
-    "links": [
-      {
-        "title": "CPU Scheduling in Operating Systems - geeksforgeeks",
-        "url": "https://www.geeksforgeeks.org/cpu-scheduling-in-operating-systems/",
-        "type": "article"
       },
       {
-        "title": "Lottery Scheduling for Operating Systems - geeksforgeeks",
-        "url": "https://www.geeksforgeeks.org/lottery-process-scheduling-in-operating-system/",
+        "title": "Mastering Concurrency",
+        "url": "https://www.harrisonclarke.com/blog/mastering-concurrency-a-guide-for-software-engineers",
         "type": "article"
-      },
-      {
-        "title": "Program for Round Robin Scheduling for the same Arrival time - geeksforgeeks",
-        "url": "https://www.geeksforgeeks.org/program-for-round-robin-scheduling-for-the-same-arrival-time/",
-        "type": "article"
-      },
-      {
-        "title": "Introduction to CPU Scheduling",
-        "url": "https://youtu.be/EWkQl0n0w5M?si=Lb-PxN_t-rDfn4JL",
-        "type": "video"
       }
     ]
   },
+  "Ge2nagN86ofa2y-yYR1lv": {
+    "title": "Scheduling Algorithms",
+    "description": "CPU Scheduling is the process of selecting a process from the ready queue and allocating the CPU to it. The selection of a process is based on a particular scheduling algorithm. The scheduling algorithm is chosen depending on the type of system and the requirements of the processes.\n\nHere is the list of some of the most commonly used scheduling algorithms:\n\n*   **First Come First Serve (FCFS):** The process that arrives first is allocated the CPU first. It is a non-preemptive algorithm.\n*   **Shortest Job First (SJF):** The process with the smallest execution time is allocated the CPU first. It is a non-preemptive algorithm.\n*   **Shortest Remaining Time First (SRTF):** The process with the smallest remaining execution time is allocated the CPU first. It is a preemptive algorithm.\n*   **Round Robin (RR):** The process is allocated the CPU for a fixed time slice. The time slice is usually 10 milliseconds. It is a preemptive algorithm.\n*   **Priority Scheduling:** The process with the highest priority is allocated the CPU first. It is a preemptive algorithm.\n*   **Multi-level Queue Scheduling:** The processes are divided into different queues based on their priority. The process with the highest priority is allocated the CPU first. It is a preemptive algorithm.\n*   **Multi-level Feedback Queue Scheduling:** The processes are divided into different queues based on their priority. The process with the highest priority is allocated the CPU first. If a process is preempted, it is moved to the next queue. It is a preemptive algorithm.\n*   **Highest Response Ratio Next(HRRN):** CPU is allotted to the next process which has the highest response ratio and not to the process having less burst time. It is a Non-Preemptive algorithm.\n*   **Lottery Scheduling:** The process is allocated the CPU based on a lottery system. It is a preemptive algorithm.",
+    "links": []
+  },
   "cpQvB0qMDL3-NWret7oeA": {
     "title": "CPU Interrupts",
     "description": "CPU Interrupts are a way for the CPU to communicate with the rest of the computer. They are a way for the CPU to tell the rest of the computer that it needs to do something. For example, if the CPU is running a program and it needs to read from the keyboard, it will send an interrupt to the keyboard to tell it to send the data to the CPU. The CPU will then wait for the keyboard to send the data and then continue running the program.\n\nVisit the following resources to learn more:",
@@ -4109,7 +4097,7 @@
         "type": "article"
       },
       {
-        "title": "Video on Interrupts",
+        "title": "Interrupts",
         "url": "https://youtu.be/iKlAWIKEyuw",
         "type": "video"
       }
@@ -4211,26 +4199,6 @@
         "title": "NP Completeness IV",
         "url": "https://www.youtube.com/watch?v=NKLDp3Rch3M&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=18",
         "type": "video"
-      },
-      {
-        "title": "CSE373 2020 - Lecture 23 - NP-Completeness",
-        "url": "https://www.youtube.com/watch?v=ItHp5laE1VE&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=23",
-        "type": "video"
-      },
-      {
-        "title": "CSE373 2020 - Lecture 24 - Satisfiability",
-        "url": "https://www.youtube.com/watch?v=inaFJeCzGxU&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=24",
-        "type": "video"
-      },
-      {
-        "title": "CSE373 2020 - Lecture 25 - More NP-Completeness",
-        "url": "https://www.youtube.com/watch?v=B-bhKxjZLlc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=25",
-        "type": "video"
-      },
-      {
-        "title": "CSE373 2020 - Lecture 26 - NP-Completeness Challenge",
-        "url": "https://www.youtube.com/watch?v=_EzetTkG_Cc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=26",
-        "type": "video"
       }
     ]
   },
diff --git a/public/roadmap-content/cpp.json b/public/roadmap-content/cpp.json
new file mode 100644
index 000000000..4388d7b53
--- /dev/null
+++ b/public/roadmap-content/cpp.json
@@ -0,0 +1,742 @@
+{
+  "ofwdZm05AUqCIWmfgGHk8": {
+    "title": "Diamond Inheritance",
+    "description": "Diamond inheritance is a specific scenario in multiple inheritance where a class is derived from two or more classes, which in turn, are derived from a common base class. It creates an ambiguity that arises from duplicating the common base class, which leads to an ambiguous behavior while calling the duplicate members.\n\nTo resolve this ambiguity, you can use virtual inheritance. A virtual base class is a class that is shared by multiple classes using `virtual` keyword in C++. This ensures that only one copy of the base class is inherited in the final derived class, and thus, resolves the diamond inheritance problem.\n\n_Example:_\n\n    #include <iostream>\n    \n    class Base {\n    public:\n        void print() {\n            std::cout << \"Base class\" << std::endl;\n        }\n    };\n    \n    class Derived1 : virtual public Base {\n    public:\n        void derived1Print() {\n            std::cout << \"Derived1 class\" << std::endl;\n        }\n    };\n    \n    class Derived2 : virtual public Base {\n    public:\n        void derived2Print() {\n            std::cout << \"Derived2 class\" << std::endl;\n        }\n    };\n    \n    class Derived3 : public Derived1, public Derived2 {\n    public:\n        void derived3Print() {\n            std::cout << \"Derived3 class\" << std::endl;\n        }\n    };\n    \n    int main() {\n        Derived3 d3;\n        d3.print(); // Now, there is no ambiguity in calling the base class function\n        d3.derived1Print();\n        d3.derived2Print();\n        d3.derived3Print();\n    \n        return 0;\n    }\n    \n\nIn the code above, `Derived1` and `Derived2` are derived from the `Base` class using virtual inheritance. So, when we create an object of `Derived3` and call the `print()` function from the `Base` class, there is no ambiguity, and the code executes without any issues.",
+    "links": []
+  },
+  "ZHjU60uzJTezADRhDTESG": {
+    "title": "Forward Declaration",
+    "description": "Forward declaration is a way of declaring a symbol (class, function, or variable) before defining it in the code. It helps the compiler understand the type, size, and existence of the symbol. This declaration is particularly useful when we have cyclic dependencies or to reduce compilation time by avoiding unnecessary header inclusions in the source file.\n\nClass Forward Declaration\n-------------------------\n\nTo use a class type before it is defined, you can declare the class without defining its members, like this:\n\n    class ClassA; // forward declaration\n    \n\nYou can then use pointers or references to the class in your code before defining the class itself:\n\n    void do_something (ClassA& obj);\n    \n    class ClassB {\n    public:\n        void another_function(ClassA& obj);\n    };\n    \n\nHowever, if you try to make an object of `ClassA` or call its member functions without defining the class, you will get a compilation error.\n\nFunction Forward Declaration\n----------------------------\n\nFunctions must be declared before using them, and a forward declaration can be used to declare a function without defining it:\n\n    int add(int a, int b); // forward declaration\n    \n    int main() {\n        int result = add(2, 3);\n        return 0;\n    }\n    \n    int add(int a, int b) {\n        return a + b;\n    }\n    \n\nEnum and Typedef Forward Declaration\n------------------------------------\n\nFor `enum` and `typedef`, it is not possible to forward declare because they don't have separate declaration and definition stages.\n\nKeep in mind that forward declarations should be used cautiously, as they can make the code more difficult to understand.",
+    "links": []
+  },
+  "NvODRFR0DLINB0RlPSsvt": {
+    "title": "Introduction to Language",
+    "description": "C++ is a general-purpose, high-performance programming language. It was developed by Bjarne Stroustrup at Bell Labs starting in 1979. C++ is an extension of the C programming language, adding features such as classes, objects, and exceptions.\n\nBasics of C++ Programming\n-------------------------\n\nHere are some basic components and concepts in C++ programming:\n\nIncluding Libraries\n-------------------\n\nIn C++, we use the `#include` directive to include libraries or header files into our program. For example, to include the standard input/output library, we write:\n\n    #include <iostream>\n    \n\nMain Function\n-------------\n\nThe entry point of a C++ program is the `main` function. Every C++ program must have a `main` function:\n\n    int main() {\n        // Your code goes here\n        return 0;\n    }\n    \n\nInput/Output\n------------\n\nTo perform input and output operations in C++, we can use the built-in objects `std::cin` for input and `std::cout` for output, available in the `iostream` library. Here's an example of reading an integer and printing its value:\n\n    #include <iostream>\n    \n    int main() {\n        int number;\n        std::cout << \"Enter an integer: \";\n        std::cin >> number;\n        std::cout << \"You entered: \" << number << std::endl;\n        return 0;\n    }\n    \n\nVariables and Data Types\n------------------------\n\nC++ has several basic data types for representing integer, floating-point, and character values:\n\n*   `int`: integer values\n*   `float`: single-precision floating-point values\n*   `double`: double-precision floating-point values\n*   `char`: single characters\n*   `bool`: boolean values\n\nVariables must be declared with a data type before they can be used:\n\n    int x;\n    float y;\n    double z;\n    char c;\n    bool b;\n    \n\nControl Structures\n------------------\n\nC++ provides control structures for conditional execution and iteration, such as `if`, `else`, `while`, `for`, and `switch` statements.\n\n### If-Else Statement\n\n    if (condition) {\n        // Code to execute if the condition is true\n    } else {\n        // Code to execute if the condition is false\n    }\n    \n\n### While Loop\n\n    while (condition) {\n        // Code to execute while the condition is true\n    }\n    \n\n### For Loop\n\n    for (initialization; condition; update) {\n        // Code to execute while the condition is true\n    }\n    \n\n### Switch Statement\n\n    switch (variable) {\n        case value1:\n            // Code to execute if variable == value1\n            break;\n        case value2:\n            // Code to execute if variable == value2\n            break;\n        // More cases...\n        default:\n            // Code to execute if variable does not match any case value\n    }\n    \n\nFunctions\n---------\n\nFunctions are reusable blocks of code that can be called with arguments to perform a specific task. Functions are defined with a return type, a name, a parameter list, and a body.\n\n    ReturnType functionName(ParameterType1 parameter1, ParameterType2 parameter2) {\n        // Function body\n        // ...\n        return returnValue;\n    }\n    \n\nFor example, here's a function that adds two integers and returns the result:\n\n    int add(int a, int b) {\n        return a + b;\n    }\n    \n    int main() {\n        int result = add(3, 4);\n        std::cout << \"3 + 4 = \" << result << std::endl;\n        return 0;\n    }\n    \n\nThis basic introduction to C++ should provide you with a good foundation for further learning. Explore more topics such as classes, objects, inheritance, polymorphism, templates, and the Standard Template Library (STL) to deepen your understanding of C++ and start writing more advanced programs.\n\nLearn more from the following resources:",
+    "links": [
+      {
+        "title": "LearnC++",
+        "url": "https://www.learncpp.com/",
+        "type": "article"
+      },
+      {
+        "title": "C++ Full Course by freeCodeCamp",
+        "url": "https://youtu.be/vLnPwxZdW4Y",
+        "type": "video"
+      }
+    ]
+  },
+  "x_28LiDVshqWns_aIBsdx": {
+    "title": "What is C++?",
+    "description": "C++ is a general-purpose programming language created by Bjarne Stroustrup as an extension of the C programming language. It was first introduced in 1985 and provides object-oriented features like classes and inheritance. C++ is widely used in various applications like game development, system programming, embedded systems, and high-performance computing.\n\nC++ is a statically-typed language, meaning that the type of a variable is determined during compilation, and has an extensive library called the C++ Standard Library, which provides a rich set of functions, algorithms, and data structures for various tasks.\n\nC++ builds upon the features of C, and thus, most C programs can be compiled and run with a C++ compiler.\n\nCode Example\n------------\n\nHere's a simple example of a C++ program that demonstrates some essential features of the language:\n\n    #include <iostream>\n    \n    // A simple function to add two numbers\n    int add(int a, int b) {\n        return a + b;\n    }\n    \n    class Calculator {\n    public:\n        // A member function to multiply two numbers\n        int multiply(int a, int b) {\n            return a * b;\n        }\n    };\n    \n    int main() {\n        int x = 5;\n        int y = 3;\n    \n        // Using the standalone function 'add'\n        int sum = add(x, y);\n        std::cout << \"Sum: \" << sum << std::endl;\n    \n        // Using a class and member function\n        Calculator calc;\n        int product = calc.multiply(x, y);\n        std::cout << \"Product: \" << product << std::endl;\n    \n        return 0;\n    }\n    \n\nIn the above program, we define a simple function `add` and a class `Calculator` with a member function `multiply`. The `main` function demonstrates how to use these to perform basic arithmetic.\n\nLearn more from the following resources:",
+    "links": [
+      {
+        "title": "w3schools C++ tutorial",
+        "url": "https://www.w3schools.com/cpp/",
+        "type": "article"
+      },
+      {
+        "title": "Learn C++",
+        "url": "https://www.learncpp.com/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about C++",
+        "url": "https://app.daily.dev/tags/c++?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "C++ Tutorial for Beginners - Full Course",
+        "url": "https://youtu.be/vLnPwxZdW4Y",
+        "type": "video"
+      }
+    ]
+  },
+  "tl6VCQ5IEGDVyFcgj7jDm": {
+    "title": "Why use C++",
+    "description": "C++ is a popular and widely used programming language for various reasons. Here are some of the reasons why you might choose to utilize C++:\n\nPerformance\n-----------\n\nC++ is designed to provide high performance and efficiency. It offers fine-grained control over system resources, making it easier to optimize your software.\n\nPortability\n-----------\n\nC++ is supported on different computer architectures and operating systems, allowing you to write portable code that runs on various platforms without making major modifications.\n\nObject-Oriented Programming\n---------------------------\n\nC++ supports object-oriented programming (OOP) - a paradigm that allows you to design programs using classes and objects, leading to better code organization and reusability.\n\n    class MyClass {\n        public:\n            void myFunction() {\n                // Code here\n            }\n    };\n    \n    int main() {\n        MyClass obj;\n        obj.myFunction();\n    }\n    \n\nSupport for low-level and high-level programming\n------------------------------------------------\n\nC++ allows you to write both low-level code, like memory manipulation, as well as high-level abstractions, like creating classes and using the Standard Template Library (STL).\n\n    #include <iostream>\n    #include <vector>\n    \n    int main() {\n        // Low-level programming\n        int number = 42;\n        int* ptr_number = &number;\n    \n        // High-level programming\n        std::vector<int> myVector = {1, 2, 3};\n        for (const auto &i: myVector) {\n            std::cout << i << std::endl;\n        }\n    }\n    \n\nExtensive Libraries\n-------------------\n\nC++ offers a vast range of libraries and tools, such as the Standard Template Library (STL), Boost, and Qt, among others, that can aid in the development of your projects and make it more efficient.\n\nCombination with C language\n---------------------------\n\nC++ can be combined with C, offering the capabilities of both languages and allowing you to reuse your existing C code. By incorporating C++ features, you can enhance your code and improve its functionality.\n\nActive Community\n----------------\n\nC++ has been around for a long time and has a large, active community of users who contribute to the growth of the language, express new ideas, and engage in discussions that help develop the language further. This makes finding solutions to any problems you experience much easier.\n\nIn summary, C++ offers a great balance of performance, portability, and feature set, making it a versatile and powerful programming language suitable for many applications. With its extensive libraries, active community, and continuous development, C++ is an excellent choice for any software development project.",
+    "links": []
+  },
+  "2Ag0t3LPryTF8khHLRfy-": {
+    "title": "C vs C++",
+    "description": "C and C++ are two popular programming languages with some similarities, but they also have key differences. C++ is an extension of the C programming language, with added features such as object-oriented programming, classes, and exception handling. Although both languages are used for similar tasks, they have their own syntax and semantics, which makes them distinct from each other.\n\nSyntax and Semantics\n--------------------\n\n### C\n\n*   C is a procedural programming language.\n*   Focuses on functions and structured programming.\n*   Does not support objects or classes.\n*   Memory management is manual, using functions like `malloc` and `free`.\n\n    #include <stdio.h>\n    \n    void printHello() {\n        printf(\"Hello, World!\\n\");\n    }\n    \n    int main() {\n        printHello();\n        return 0;\n    }\n    \n\n### C++\n\n*   C++ is both procedural and object-oriented.\n*   Supports both functions and classes.\n*   Incorporates different programming paradigms.\n*   Memory management can be manual (like C) or rely on constructors/destructors and smart pointers.\n\n    #include <iostream>\n    \n    class HelloWorld {\n    public:\n        void printHello() {\n            std::cout << \"Hello, World!\" << std::endl;\n        }\n    };\n    \n    int main() {\n        HelloWorld obj;\n        obj.printHello();\n        return 0;\n    }\n    \n\nCode Reusability and Modularity\n-------------------------------\n\n### C\n\n*   Code reusability is achieved through functions and modular programming.\n*   High cohesion and low coupling are achieved via structured design.\n*   Function libraries can be created and included through headers.\n\n### C++\n\n*   Offers better code reusability with classes, inheritance, and polymorphism.\n*   Code modularity is enhanced through namespaces and well-designed object-oriented hierarchy.\n\nError Handling\n--------------\n\n### C\n\n*   Error handling in C is done primarily through return codes.\n*   Lacks support for exceptions or any built-in error handling mechanism.\n\n### C++\n\n*   Offers exception handling, which can be used to handle errors that may occur during program execution.\n*   Enables catching and handling exceptions with `try`, `catch`, and `throw` keywords, providing more control over error handling.\n\nConclusion\n----------\n\nBoth C and C++ are powerful languages with unique features and capabilities. While C is simpler and focuses on procedural programming, C++ offers the versatility of using different programming paradigms and improved code organization. Understanding the differences between these two languages can help you decide which one is more suitable for your specific needs and programming style.",
+    "links": []
+  },
+  "Zc_TTzmM36yWsu3GvOy9x": {
+    "title": "Setting up your Environment",
+    "description": "Setting up C++ requires a few steps, including installing a compiler, configuring an Integrated Development Environment (IDE), and creating a new C++ project.\n\n1\\. Installing a Compiler\n-------------------------\n\nA compiler is required to convert C++ code into machine language. Some popular C++ compilers include:\n\n*   GCC (GNU Compiler Collection) for Linux and macOS, but can also be used on Windows through MinGW\n*   MSVC (Microsoft Visual C++) for Windows\n\nTo install a compiler, simply follow the instructions provided by the respective websites.\n\n2\\. Configuring an IDE\n----------------------\n\nAn IDE is a software application that provides facilities for programming, such as code editing, debugging, and building. Some popular C++ IDEs include:\n\n*   [@article@Visual Studio](https://visualstudio.microsoft.com/vs/features/cplusplus/) (Windows, macOS)\n*   [@article@Eclipse](https://eclipse.org) (Windows, macOS, Linux)\n*   [@article@Code::Blocks](http://www.codeblocks.org) (Windows, macOS, Linux)\n\nAfter downloading and installing an IDE, you might need to configure it to use the installed compiler. Check the documentation of the respective IDE for instructions on how to do this.\n\n3\\. Creating a New C++ Project\n------------------------------\n\nOnce you have your IDE and compiler set up, you can create a new C++ project and start writing code. In general, follow these steps to create a new C++ project:\n\n*   Open the IDE and create a new project.\n*   Select the project type (C++ Application or Console Application).\n*   Specify the project name and location.\n*   Let the IDE generate the main.cpp and build files (such as Makefile or CMakeLists.txt) for you.\n\nExample: Hello World in C++\n---------------------------\n\nCreate a new file called `main.cpp` within your project and include this code:\n\n    #include <iostream>\n    \n    int main() {\n        std::cout << \"Hello, World!\" << std::endl;\n        return 0;\n    }\n    \n\nThen, follow the IDE's instructions to build and run your program. You should see \"Hello, World!\" displayed in the console.\n\nSummary\n-------\n\nSetting up C++ involves:\n\n*   Installing a compiler (e.g. GCC, MinGW, or MSVC)\n*   Configuring an IDE (e.g. Visual Studio, Eclipse, or Code::Blocks)\n*   Creating a new C++ project and writing code\n\nBy following these steps, you'll be ready to start developing C++ applications!",
+    "links": []
+  },
+  "0J_ltQEJh2g28OE2ZEYJj": {
+    "title": "Installing C++",
+    "description": "Before you can start programming in C++, you will need to have a compiler installed on your system. A compiler is a program that converts the C++ code you write into an executable file that your computer can run. There are several popular C++ compilers to choose from, depending on your operating system and preference.\n\n### Windows\n\nFor Windows, one popular option is to install the [Microsoft Visual Studio IDE](https://visualstudio.microsoft.com/vs/), which includes the Microsoft Visual C++ compiler (MSVC).\n\nAlternatively, you can also install the [MinGW-w64](https://mingw-w64.org/) compiler system, which is a Windows port of the GNU Compiler Collection (GCC). To install MinGW-w64, follow these steps:\n\n*   Download the installer from [here](https://sourceforge.net/projects/mingw-w64/files/).\n*   Run the installer and select your desired architecture, version, and install location.\n*   Add the `bin` folder inside the installation directory to your system's `PATH` environment variable.\n\n### macOS\n\nFor macOS, you can install the Apple LLVM `clang` compiler which is part of the Xcode Command Line Tools. To do this, open a terminal and enter:\n\n    xcode-select --install\n    \n\nThis will prompt a dialog to install the Command Line Tools, which includes the `clang` compiler.\n\n### Linux\n\nOn Linux, you can install the GNU Compiler Collection (GCC) through your distribution's package manager. Here are some examples for popular Linux distributions:\n\n*   Ubuntu, Debian, and derivatives:\n\n    sudo apt-get install g++ build-essential\n    \n\n*   Fedora, CentOS, RHEL, and derivatives:\n\n    sudo dnf install gcc-c++ make\n    \n\n*   Arch Linux and derivatives:\n\n    sudo pacman -S gcc make\n    \n\n### Checking the Installation\n\nTo confirm that the compiler is installed and available on your system, open a terminal/command prompt, and enter the following command:\n\n    g++ --version\n    \n\nYou should see output displaying the version of your installed C++ compiler.\n\nNow you're ready to start writing and compiling your C++ code!",
+    "links": []
+  },
+  "ew0AfyadpXPRO0ZY3Z19k": {
+    "title": "Code Editors / IDEs",
+    "description": "Code editors and IDEs are programs specifically designed for editing, managing and writing source code. They offer a wide range of features that make the development process easier and faster. Here's a brief introduction to some of the most popular code editors and IDEs for C++:\n\n*   **Visual Studio**: Visual Studio is an Integrated Development Environment (IDE) for Windows, developed by Microsoft. It includes its own integrated compiler known as Microsoft Visual C++ (MSVC).\n    \n*   **Visual Studio Code (VSCode)**: Visual Studio Code is a popular, free, open-source, and lightweight code editor developed by Microsoft. It offers an extensive library of extensions that enhance functionality for C++ development.\n    \n*   **Sublime Text**: Sublime Text is a cross-platform text editor that is quite popular among developers due to its speed and minimalist design. It supports C++ with the help of plugins and has a variety of themes and packages available for customization.\n    \n*   **CLion**: CLion is an Integrated Development Environment (IDE) developed by JetBrains specifically for C and C++ developers. It provides advanced features like code completion, refactoring support, debugging, and more. It's worth noting that CLion is a commercial IDE, and there is no community version available; users are required to purchase a license for usage.\n    \n\nThese are just a few examples, and there are many other code editors available, including Atom, Notepad++, and Geany. They all have their features and may suit different developers' needs. Finding the right code editor is often a matter of personal preference and workflow.\n\nTo work with C++ in your chosen code editor, you often need to install some additional tools and add-ons, such as compilers, linters, and debugger support. Make sure to follow the instructions provided in the editor's documentation to set up C++ correctly.\n\nLearn more from the following resources:",
+    "links": [
+      {
+        "title": "Using C++ on Linux in VSCode",
+        "url": "https://code.visualstudio.com/docs/cpp/config-linux",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about General Programming",
+        "url": "https://app.daily.dev/tags/general-programming?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "SEq0D2Zg5WTsIDtd1hW9f": {
+    "title": "Running your First Program",
+    "description": "In this section, we'll discuss the basic structure of a C++ program, walk you through your first program (the \"Hello, World!\" example), and provide additional explanations of its syntax.\n\nHello, World!\n-------------\n\nThe first program that most people learn to write in any programming language is often a simple one that displays the message \"Hello, World!\" on the screen. Here's the classic \"Hello, World!\" program in C++:\n\n    #include <iostream>\n    \n    int main() {\n      std::cout << \"Hello, World!\" << std::endl;\n      return 0;\n    }\n    \n\nLet's break down the different components of this program:\n\nHeader Files & Preprocessor Directives\n--------------------------------------\n\nThe first line of the program `#include <iostream>` is a [preprocessor directive](https://en.cppreference.com/w/cpp/preprocessor) that tells the compiler to include the header file `iostream`. Header files provide function and class declarations that we can use in our C++ programs.\n\n    #include <iostream>\n    \n\n`main()` Function\n-----------------\n\nIn C++, the `main()` function serves as the entry point of your program. The operating system runs your program by calling this `main()` function. It should be defined only once in your program and must return an integer. The keyword `int` is the return type of this function which is an integer. Unlike C in C++ it is mandatory to have `int` as the return type for the `main` function.\n\n    int main() {\n      // Your code goes here.\n    }\n    \n\nOutput to the Console\n---------------------\n\nTo output text to the console, we use the `std::cout` object and the insertion operator `<<`. In the \"Hello, World!\" example, we used the following line to print \"Hello, World!\" to the console:\n\n    std::cout << \"Hello, World!\" << std::endl;\n    \n\n*   `std`: This is the namespace where C++ standard library entities (classes and functions) reside. It stands for \"standard\" and is an abbreviation for the Standard Template Library (STL).\n*   `std::cout`: The standard \"character output\" stream that writes to the console\n*   `\"Hello, World!\"`: The string literal to print\n*   `std::endl`: The \"end line\" manipulator that inserts a newline character and flushes the output buffer\n\nReturn Statement\n----------------\n\nLastly, the `return 0;` statement informs the operating system that the program executed successfully. Returning any other integer value indicates that an error occurred:\n\n    return 0;\n    \n\nNow that you understand the basic components of a C++ program, you can write your first program, compile it, and run it to see the \"Hello, World!\" message displayed on the screen.",
+    "links": []
+  },
+  "kl2JI_Wl47c5r8SYzxvCq": {
+    "title": "Basic Operations",
+    "description": "Basic operations in C++ refer to the fundamental arithmetic, relational, and logical operations that can be performed using C++ programming language, which are essential for any kind of program or calculation in a real-world scenario.\n\nHere's a summary of the basic operations in C++\n\nArithmetic Operations\n---------------------\n\nThese operations are used for performing calculations in C++ and include the following:\n\n*   **Addition (+)**: Adds two numbers.\n\n    int a = 5;\n    int b = 6;\n    int sum = a + b; // sum is 11\n    \n\n*   **Subtraction (-)**: Subtracts one number from the other.\n\n    int a = 10;\n    int b = 6;\n    int diff = a - b; // diff is 4\n    \n\n*   **Multiplication (\\*)**: Multiplies two numbers.\n\n    int a = 3;\n    int b = 4;\n    int product = a * b; // product is 12\n    \n\n*   **Division (/)**: Divides one number by another, yields quotient.\n\n    int a = 12;\n    int b = 4;\n    int quotient = a / b; // quotient is 3\n    \n\n*   **Modulus (%)**: Divides one number by another, yields remainder.\n\n    int a = 15;\n    int b = 4;\n    int remainder = a % b; // remainder is 3\n    \n\nRelational Operators\n--------------------\n\nThese operations compare two values and return a boolean value (true/false) depending on the comparison. The relational operations are:\n\n*   **Equal to (==)**: Returns true if both operands are equal.\n\n    5 == 5 // true\n    3 == 4 // false\n    \n\n*   **Not equal to (!=)**: Returns true if operands are not equal.\n\n    5 != 2 // true\n    1 != 1 // false\n    \n\n*   **Greater than (>)**: Returns true if the first operand is greater than the second.\n\n    5 > 3 // true\n    2 > 3 // false\n    \n\n*   **Less than (<)**: Returns true if the first operand is less than the second.\n\n    3 < 5 // true\n    6 < 5 // false\n    \n\n*   **Greater than or equal to (>=)**: Returns true if the first operand is greater than or equal to the second.\n\n    5 >= 5 // true\n    6 >= 2 // true\n    3 >= 4 // false\n    \n\n*   **Less than or equal to (<=)**: Returns true if the first operand is less than or equal to the second.\n\n    4 <= 4 // true\n    2 <= 3 // true\n    5 <= 4 // false\n    \n\nLogical Operators\n-----------------\n\nLogical operators are used for combining multiple conditions or boolean values.\n\n*   **AND (&&)**: Returns true if both operands are true.\n\n    true && true // true\n    true && false // false\n    \n\n*   **OR (||)**: Returns true if any one of the operands is true.\n\n    true || false // true\n    false || false // false\n    \n\n*   **NOT (!)**: Returns true if the operand is false and vice versa.\n\n    !true // false\n    !false // true",
+    "links": []
+  },
+  "8aOSpZLWwZv_BEYiurhyR": {
+    "title": "Arithmetic Operators",
+    "description": "Arithmetic operators are used to perform mathematical operations with basic variables such as integers and floating-point numbers. Here is a brief summary of the different arithmetic operators in C++:\n\n1\\. Addition Operator (`+`)\n---------------------------\n\nIt adds two numbers together.\n\n    int sum = a + b;\n    \n\n2\\. Subtraction Operator (`-`)\n------------------------------\n\nIt subtracts one number from another.\n\n    int difference = a - b;\n    \n\n3\\. Multiplication Operator (`*`)\n---------------------------------\n\nIt multiplies two numbers together.\n\n    int product = a * b;\n    \n\n4\\. Division Operator (`/`)\n---------------------------\n\nIt divides one number by another. Note that if both operands are integers, it will perform integer division and the result will be an integer.\n\n    int quotient = a / b; // integer division\n    float quotient = float(a) / float(b); // floating-point division\n    \n\n5\\. Modulus Operator (`%`)\n--------------------------\n\nIt calculates the remainder of an integer division.\n\n    int remainder = a % b;\n    \n\n6\\. Increment Operator (`++`)\n-----------------------------\n\nIt increments the value of a variable by 1. There are two ways to use this operator: prefix (`++x`) and postfix (`x++`). Prefix increments the value before returning it, whereas postfix returns the value first and then increments it.\n\n    int x = 5;\n    int y = ++x; // x = 6, y = 6\n    int z = x++; // x = 7, z = 6\n    \n\n7\\. Decrement Operator (`--`)\n-----------------------------\n\nIt decrements the value of a variable by 1. It can also be used in prefix (`--x`) and postfix (`x--`) forms.\n\n    int x = 5;\n    int y = --x; // x = 4, y = 4\n    int z = x--; // x = 3, z = 4\n    \n\nThese are the basic arithmetic operators in C++ that allow you to perform mathematical operations on your variables. Use them in combination with other control structures, such as loops and conditionals, to build more complex programs.",
+    "links": []
+  },
+  "Y9gq8WkDA_XGe68JkY2UZ": {
+    "title": "Logical Operators",
+    "description": "Logical operators are used to perform logical operations on the given expressions, mostly to test the relationship between different variables or values. They return a boolean value i.e., either true (1) or false (0) based on the result of the evaluation.\n\nC++ provides the following logical operators:\n\n*   **AND Operator (&&)** The AND operator checks if both the operands/conditions are true, then the expression is true. If any one of the conditions is false, the whole expression will be false.\n    \n        (expression1 && expression2)\n        \n    \n    Example:\n    \n        int a = 5, b = 10;\n        if (a > 0 && b > 0) {\n            std::cout << \"Both values are positive.\" << std::endl;\n        }\n        \n    \n*   **OR Operator (||)** The OR operator checks if either of the operands/conditions are true, then the expression is true. If both the conditions are false, it will be false.\n    \n        (expression1 || expression2)\n        \n    \n    Example:\n    \n        int a = 5, b = -10;\n        if (a > 0 || b > 0) {\n            std::cout << \"At least one value is positive.\" << std::endl;\n        }\n        \n    \n*   **NOT Operator (!)** The NOT operator reverses the result of the condition/expression it is applied on. If the condition is true, the NOT operator will make it false and vice versa.\n    \n        !(expression)\n        \n    \n    Example:\n    \n        int a = 5;\n        if (!(a < 0)) {\n            std::cout << \"The value is not negative.\" << std::endl;\n        }\n        \n    \n\nUsing these operators, you can create more complex logical expressions, for example:\n\n    int a = 5, b = -10, c = 15;\n    \n    if (a > 0 && (b > 0 || c > 0)) {\n        std::cout << \"At least two values are positive.\" << std::endl;\n    }\n    \n\nThis covers the essential information about logical operators in C++.",
+    "links": []
+  },
+  "zE4iPSq2KsrDSByQ0sGK_": {
+    "title": "Bitwise Operators",
+    "description": "Bitwise operations are operations that directly manipulate the bits of a number. Bitwise operations are useful for various purposes, such as optimizing algorithms, performing certain calculations, and manipulating memory in lower-level programming languages like C and C++.\n\nHere is a quick summary of common bitwise operations in C++:\n\nBitwise AND (`&`)\n-----------------\n\nThe bitwise AND operation (`&`) is a binary operation that takes two numbers, compares them bit by bit, and returns a new number where each bit is set (1) if the corresponding bits in both input numbers are set (1); otherwise, the bit is unset (0).\n\nExample:\n\n    int result = 5 & 3; // result will be 1 (0000 0101 & 0000 0011 = 0000 0001)\n    \n\nBitwise OR (`|`)\n----------------\n\nThe bitwise OR operation (`|`) is a binary operation that takes two numbers, compares them bit by bit, and returns a new number where each bit is set (1) if at least one of the corresponding bits in either input number is set (1); otherwise, the bit is unset (0).\n\nExample:\n\n    int result = 5 | 3; // result will be 7 (0000 0101 | 0000 0011 = 0000 0111)\n    \n\nBitwise XOR (`^`)\n-----------------\n\nThe bitwise XOR (exclusive OR) operation (`^`) is a binary operation that takes two numbers, compares them bit by bit, and returns a new number where each bit is set (1) if the corresponding bits in the input numbers are different; otherwise, the bit is unset (0).\n\nExample:\n\n    int result = 5 ^ 3; // result will be 6 (0000 0101 ^ 0000 0011 = 0000 0110)\n    \n\nBitwise NOT (`~`)\n-----------------\n\nThe bitwise NOT operation (`~`) is a unary operation that takes a single number, and returns a new number where each bit is inverted (1 becomes 0, and 0 becomes 1).\n\nExample:\n\n    int result = ~5; // result will be -6 (1111 1010)\n    \n\nBitwise Left Shift (`<<`)\n-------------------------\n\nThe bitwise left shift operation (`<<`) is a binary operation that takes two numbers, a value and a shift amount, and returns a new number by shifting the bits of the value to the left by the specified shift amount. The vacated bits are filled with zeros.\n\nExample:\n\n    int result = 5 << 1; // result will be 10 (0000 0101 << 1 = 0000 1010)\n    \n\nBitwise Right Shift (`>>`)\n--------------------------\n\nThe bitwise right shift operation (`>>`) is a binary operation that takes two numbers, a value and a shift amount, and returns a new number by shifting the bits of the value to the right by the specified shift amount. The vacated bits are filled with zeros or sign bit depending on the input value being signed or unsigned.\n\nExample:\n\n    int result = 5 >> 1; // result will be 2 (0000 0101 >> 1 = 0000 0010)\n    \n\nThese were the most common bitwise operations in C++. Remember to use them carefully and understand their behavior when applied to specific data types and scenarios.\n\nLearn more from the following resources:",
+    "links": [
+      {
+        "title": "Intro to Binary and Bitwise Operators in C++",
+        "url": "https://youtu.be/KXwRt7og0gI",
+        "type": "video"
+      },
+      {
+        "title": "Bitwise AND (&), OR (|), XOR (^) and NOT (~) in C++",
+        "url": "https://youtu.be/HoQhw6_1NAA",
+        "type": "video"
+      }
+    ]
+  },
+  "s5Gs4yF9TPh-psYmtPzks": {
+    "title": "Control Flow & Statements",
+    "description": "",
+    "links": []
+  },
+  "_IP_e1K9LhNHilYTDh7L5": {
+    "title": "for / while / do while loops",
+    "description": "Loops are an essential concept in programming that allow you to execute a block of code repeatedly until a specific condition is met. In C++, there are three main types of loops: `for`, `while`, and `do-while`.\n\nFor Loop\n--------\n\nA `for` loop is used when you know the number of times you want to traverse through a block of code. It consists of an initialization statement, a condition, and an increment/decrement operation.\n\nHere's the syntax for a `for` loop:\n\n    for (initialization; condition; increment/decrement) {\n        // block of code to execute\n    }\n    \n\nFor example:\n\n    #include <iostream>\n    \n    int main() {\n        for (int i = 0; i < 5; i++) {\n            std::cout << \"Iteration: \" << i << std::endl;\n        }\n        return 0;\n    }\n    \n\nWhile Loop\n----------\n\nA `while` loop runs as long as a specified condition is `true`. The loop checks for the condition before entering the body of the loop.\n\nHere's the syntax for a `while` loop:\n\n    while (condition) {\n        // block of code to execute\n    }\n    \n\nFor example:\n\n    #include <iostream>\n    \n    int main() {\n        int i = 0;\n        while (i < 5) {\n            std::cout << \"Iteration: \" << i << std::endl;\n            i++;\n        }\n        return 0;\n    }\n    \n\nDo-While Loop\n-------------\n\nA `do-while` loop is similar to a `while` loop, with the key difference being that the loop body is executed at least once, even when the condition is `false`.\n\nHere's the syntax for a `do-while` loop:\n\n    do {\n        // block of code to execute\n    } while (condition);\n    \n\nFor example:\n\n    #include <iostream>\n    \n    int main() {\n        int i = 0;\n        do {\n            std::cout << \"Iteration: \" << i << std::endl;\n            i++;\n        } while (i < 5);\n        return 0;\n    }\n    \n\nIn summary, loops are an integral part of C++ programming that allow you to execute a block of code multiple times. The three types of loops in C++ are `for`, `while`, and `do-while`. Each type has its own specific use case and can be chosen depending on the desired behavior.\n\nLearn more from the following resources:",
+    "links": [
+      {
+        "title": "C++ For Loop",
+        "url": "https://www.w3schools.com/cpp/cpp_for_loop.asp",
+        "type": "article"
+      }
+    ]
+  },
+  "bjpFWxiCKGz28E-ukhZBp": {
+    "title": "if else / switch / goto",
+    "description": "",
+    "links": []
+  },
+  "oYi3YOc1GC2Nfp71VOkJt": {
+    "title": "Functions",
+    "description": "A **function** is a group of statements that perform a specific task, organized as a separate unit in a program. Functions help in breaking the code into smaller, manageable, and reusable blocks.\n\nThere are mainly two types of functions in C++:\n\n*   **Standard library functions**: Pre-defined functions available in the C++ standard library, such as `sort()`, `strlen()`, `sqrt()`, and many more. These functions are part of the standard library, so you need to include the appropriate header file to use them.\n    \n*   **User-defined functions**: Functions created by the programmer to perform a specific task. To create a user-defined function, you need to define the function and call it in your code.\n    \n\nDefining a Function\n-------------------\n\nThe general format for defining a function in C++ is:\n\n    return_type function_name(parameter list) {\n        // function body\n    }\n    \n\n*   `return_type`: Data type of the output produced by the function. It can be `void`, indicating that the function doesn't return any value.\n*   `function_name`: Name given to the function, following C++ naming conventions.\n*   `parameter list`: List of input parameters/arguments that are needed to perform the task. It is optional, you can leave it blank when no parameters are needed.\n\nExample\n-------\n\n    #include <iostream>\n    \n    // Function to add two numbers\n    int addNumbers(int a, int b) {\n        int sum = a + b;\n        return sum;\n    }\n    \n    int main() {\n        int num1 = 5, num2 = 10;\n        int result = addNumbers(num1, num2); // Calling the function\n        std::cout << \"The sum is: \" << result << std::endl;\n        return 0;\n    }\n    \n\nIn this example, the function `addNumbers` takes two integer parameters, `a` and `b`, and returns the sum of the numbers. We then call this function from the `main()` function and display the result.\n\nFunction Prototypes\n-------------------\n\nIn some cases, you might want to use a function before actually defining it. To do this, you need to declare a **function prototype** at the beginning of your code.\n\nA function prototype is a declaration of the function without its body, and it informs the compiler about the function's name, return type, and parameters.\n\n    #include <iostream>\n    \n    // Function prototype\n    int multiplyNumbers(int x, int y);\n    \n    int main() {\n        int num1 = 3, num2 = 7;\n        int result = multiplyNumbers(num1, num2); // Calling the function\n        std::cout << \"The product is: \" << result << std::endl;\n        return 0;\n    }\n    \n    // Function definition\n    int multiplyNumbers(int x, int y) {\n        int product = x * y;\n        return product;\n    }\n    \n\nIn this example, we use a function prototype for `multiplyNumbers()` before defining it. This way, we can call the function from the `main()` function even though it hasn't been defined yet in the code.\n\nLearn more from the following resources:",
+    "links": [
+      {
+        "title": "introduction to functions in c++",
+        "url": "https://www.learncpp.com/cpp-tutorial/introduction-to-functions/",
+        "type": "article"
+      }
+    ]
+  },
+  "obZIxRp0eMWdG7gplNIBc": {
+    "title": "Static Polymorphism",
+    "description": "Static polymorphism, also known as compile-time polymorphism, is a type of polymorphism that resolves the types and method calls at compile time rather than at runtime. This is commonly achieved through the use of function overloading and templates in C++.\n\nFunction Overloading\n--------------------\n\nFunction overloading is a way to create multiple functions with the same name but different parameter lists. The compiler determines the correct function to call based on the types and number of arguments used when the function is called.\n\nExample:\n\n    #include <iostream>\n    \n    void print(int i) {\n        std::cout << \"Printing int: \" << i << std::endl;\n    }\n    \n    void print(double d) {\n        std::cout << \"Printing double: \" << d << std::endl;\n    }\n    \n    void print(const char* s) {\n        std::cout << \"Printing string: \" << s << std::endl;\n    }\n    \n    int main() {\n        print(5);          // Calls print(int i)\n        print(3.14);       // Calls print(double d)\n        print(\"Hello\");    // Calls print(const char* s)\n    \n        return 0;\n    }\n    \n\nTemplates\n---------\n\nTemplates are a powerful feature in C++ that allows you to create generic functions or classes. The actual code for specific types is generated at compile time, which avoids the overhead of runtime polymorphism. The use of templates is the main technique to achieve static polymorphism in C++.\n\nExample:\n\n    #include <iostream>\n    \n    // Template function to print any type\n    template<typename T>\n    void print(const T& value) {\n        std::cout << \"Printing value: \" << value << std::endl;\n    }\n    \n    int main() {\n        print(42);           // int\n        print(3.14159);      // double\n        print(\"Hello\");      // const char*\n    \n        return 0;\n    }\n    \n\nIn conclusion, static polymorphism achieves polymorphic behavior during compile time using function overloading and templates, instead of relying on runtime information like dynamic polymorphism does. This can result in more efficient code since method calls are resolved at compile time.",
+    "links": []
+  },
+  "sgfqb22sdN4VRJYkhAVaf": {
+    "title": "Function Overloading",
+    "description": "",
+    "links": []
+  },
+  "llCBeut_uc9IAe2oi4KZ9": {
+    "title": "Operator Overloading",
+    "description": "Operators in C++ are symbols that perform various operations on data, such as arithmetic, comparison, and logical operations. They are used to manipulate and evaluate expressions and variables.\n\nHere is a list of the commonly used operator types in C++:\n\n*   **Arithmetic Operators**: These are used for performing arithmetic operations like addition, subtraction, multiplication, and division.\n    \n    *   `+`: addition\n        \n            int sum = 5 + 3; // sum will be 8\n            \n        \n    *   `-`: subtraction\n        \n            int difference = 5 - 3; // difference will be 2\n            \n        \n    *   `*`: multiplication\n        \n            int product = 5 * 3; // product will be 15\n            \n        \n    *   `/`: division\n        \n            int quotient = 15 / 3; // quotient will be 5\n            \n        \n    *   `%`: modulo (remainder)\n        \n            int remainder = 7 % 3; // remainder will be 1\n            \n        \n*   **Comparison (Relational) Operators**: These are used to compare two values and return true or false based on the comparison.\n    \n    *   `==`: equal to\n        \n            bool isEqual = (5 == 3); // isEqual will be false\n            \n        \n    *   `!=`: not equal to\n        \n            bool isNotEqual = (5 != 3); // isNotEqual will be true\n            \n        \n    *   `<`: less than\n        \n            bool isLess = (5 < 3); // isLess will be false\n            \n        \n    *   `>`: greater than\n        \n            bool isGreater = (5 > 3); // isGreater will be true\n            \n        \n    *   `<=`: less than or equal to\n        \n            bool isLessOrEqual = (5 <= 3); // isLessOrEqual will be false\n            \n        \n    *   `>=`: greater than or equal to\n        \n            bool isGreaterOrEqual = (5 >= 3); // isGreaterOrEqual will be true\n            \n        \n*   **Logical Operators**: These operators are used to perform logical operations such as AND (&&), OR (||), and NOT (!) on boolean values.\n    \n    *   `&&`: logical AND\n        \n            bool result = (true && false); // result will be false\n            \n        \n    *   `||`: logical OR\n        \n            bool result = (true || false); // result will be true\n            \n        \n    *   `!`: logical NOT\n        \n            bool result = !false; // result will be true\n            \n        \n*   **Assignment Operators**: These are used to assign values to variables.\n    \n    *   `=`: simple assignment\n        \n            int x = 5; // x gets the value 5\n            \n        \n    *   `+=`: addition assignment\n        \n            int x = 5;\n            x += 3; // x gets the value 8 (5 + 3)\n            \n        \n    *   `-=`: subtraction assignment\n        \n            int x = 5;\n            x -= 3; // x gets the value 2 (5 - 3)\n            \n        \n    *   `*=`: multiplication assignment\n        \n            int x = 5;\n            x *= 3; // x gets the value 15 (5 * 3)\n            \n        \n    *   `/=`: division assignment\n        \n            int x = 15;\n            x /= 3; // x gets the value 5 (15 / 3)\n            \n        \n    *   `%=`: modulo assignment\n        \n            int x = 7;\n            x %= 3; // x gets the value 1 (7 % 3)\n            \n        \n\nThese are some of the main operator categories in C++. Each operator allows you to perform specific operations, making your code more efficient and concise.",
+    "links": []
+  },
+  "xjiFBVe-VGqCqWfkPVGKf": {
+    "title": "Lambdas",
+    "description": "A lambda function, or simply \"lambda\", is an anonymous (unnamed) function that is defined in place, within your source code, and with a concise syntax. Lambda functions were introduced in C++11 and have since become a widely used feature, especially in combination with the Standard Library algorithms.\n\nSyntax\n------\n\nHere is a basic syntax of a lambda function in C++:\n\n    [capture-list](parameters) -> return_type {\n        // function body\n    };\n    \n\n*   **capture-list**: A list of variables from the surrounding scope that the lambda function can access.\n*   **parameters**: The list of input parameters, just like in a regular function. Optional.\n*   **return\\_type**: The type of the value that the lambda function will return. This part is optional, and the compiler can deduce it in many cases.\n*   **function body**: The code that defines the operation of the lambda function.\n\nUsage Examples\n--------------\n\nHere are a few examples to demonstrate the use of lambda functions in C++:\n\n*   Lambda function with no capture, parameters, or return type.\n\n    auto printHello = []() {\n        std::cout << \"Hello, World!\" << std::endl;\n    };\n    printHello(); // Output: Hello, World!\n    \n\n*   Lambda function with parameters.\n\n    auto add = [](int a, int b) {\n        return a + b;\n    };\n    int result = add(3, 4); // result = 7\n    \n\n*   Lambda function with capture-by-value.\n\n    int multiplier = 3;\n    auto times = [multiplier](int a) {\n        return a * multiplier;\n    };\n    int result = times(5); // result = 15\n    \n\n*   Lambda function with capture-by-reference.\n\n    int expiresInDays = 45;\n    auto updateDays = [&expiresInDays](int newDays) {\n        expiresInDays = newDays;\n    };\n    updateDays(30); // expiresInDays = 30\n    \n\nNote that, when using the capture by reference, any change made to the captured variable _inside_ the lambda function will affect its value in the surrounding scope.\n\nLearn more from the following resources:",
+    "links": [
+      {
+        "title": "Lambda Expressions",
+        "url": "https://en.cppreference.com/w/cpp/language/lambda",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about AWS Lambda",
+        "url": "https://app.daily.dev/tags/aws-lambda?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "Lambdas in C++",
+        "url": "https://youtu.be/MH8mLFqj-n8",
+        "type": "video"
+      }
+    ]
+  },
+  "MwznA4qfpNlv6sqSNjPZi": {
+    "title": "Data Types",
+    "description": "In C++, data types are used to categorize different types of data that a program can process. They are essential for determining the type of value a variable can hold and how much memory space it will occupy. Some basic data types in C++ include integers, floating-point numbers, characters, and booleans.\n\nFundamental Data Types\n----------------------\n\nInteger (int)\n-------------\n\nIntegers are whole numbers that can store both positive and negative values. The size of `int` depends on the system architecture (usually 4 bytes).\n\nExample:\n\n    int num = 42;\n    \n\nThere are variants of `int` that can hold different ranges of numbers:\n\n*   short (`short int`): Smaller range than `int`.\n*   long (`long int`): Larger range than `int`.\n*   long long (`long long int`): Even larger range than `long int`.\n\nFloating-Point (float, double)\n------------------------------\n\nFloating-point types represent real numbers, i.e., numbers with a decimal point. There are two main floating-point types:\n\n*   **float**: Provides single-precision floating-point numbers. It typically occupies 4 bytes of memory.\n\nExample:\n\n    float pi = 3.14f;\n    \n\n*   **double**: Provides double-precision floating-point numbers. It consumes more memory (usually 8 bytes) but has a higher precision than `float`.\n\nExample:\n\n    double pi_high_precision = 3.1415926535;\n    \n\nCharacter (char)\n----------------\n\nCharacters represent a single character, such as a letter, digit, or symbol. They are stored using the ASCII value of the symbol and typically occupy 1 byte of memory.\n\nExample:\n\n    char letter = 'A';\n    \n\nBoolean (bool)\n--------------\n\nBooleans represent logical values: `true` or `false`. They usually occupy 1 byte of memory.\n\nExample:\n\n    bool is_cpp_great = true;\n    \n\nDerived Data Types\n------------------\n\nDerived data types are types that are derived from fundamental data types. Some examples include:\n\nArrays\n------\n\nArrays are used to store multiple values of the same data type in consecutive memory locations.\n\nExample:\n\n    int numbers[5] = {1, 2, 3, 4, 5};\n    \n\nPointers\n--------\n\nPointers are used to store the memory address of a variable.\n\nExample:\n\n    int num = 42;\n    int* pNum = &num;\n    \n\nReferences\n----------\n\nReferences are an alternative way to share memory locations between variables, allowing you to create an alias for another variable.\n\nExample:\n\n    int num = 42;\n    int& numRef = num;\n    \n\nUser-Defined Data Types\n-----------------------\n\nUser-defined data types are types that are defined by the programmer, such as structures, classes, and unions.\n\nStructures (struct)\n-------------------\n\nStructures are used to store different data types under a single variable and accessibility of member variables and methods are public.\n\nExample:\n\n    struct Person {\n        std::string name;\n        int age;\n        float height;\n    };\n    \n    Person p1 = {\"John Doe\", 30, 5.9};\n    \n\nClasses (class)\n---------------\n\nClasses are similar to structures, but the accessibility of the member data and function are governed by access specifiers. By default access to members of a class is private.\n\nExample:\n\n    class Person {\n    public:\n        std::string name;\n        int age;\n    \n        void printInfo() {\n            std::cout << \"Name: \" << name << \", Age: \" << age << std::endl;\n        };\n    };\n    \n    Person p1;\n    p1.name = \"John Doe\";\n    p1.age = 30;\n    \n\nUnions (union)\n--------------\n\nUnions are used to store different data types in the same memory location.\n\nExample:\n\n    union Data {\n        int num;\n        char letter;\n        float decimal;\n    };\n    \n    Data myData;\n    myData.num = 42;",
+    "links": []
+  },
+  "f1djN0GxoeVPr_0cl6vMq": {
+    "title": "Static Typing",
+    "description": "In C++, static typing means that the data type of a variable is determined at compile time, before the program is executed. This means that a variable can only be used with data of a specific type, and the compiler ensures that the operations performed with the variable are compatible with its type. If there is a mismatch , the compiler will adjust the data type of variable to match another provided it's feasible . This process is known as `Type Conversion`. If compiler not able to achieve type conversion , `Invalid Type Conversion` error will be raised during compilation of the code .\n\nC++ is a statically typed language, which means that it uses static typing to determine data types and perform type checking during compile time. This helps with ensuring type safety and can prevent certain types of errors from occurring during the execution of the program.\n\nHere's a simple code example to demonstrate static typing in C++:\n\n    #include <iostream>\n    \n    int main() {\n        int num = 65;        // 'num' is statically typed as an integer\n        double pi = 3.14159; // 'pi' is statically typed as a double\n        char c = 'c';        // 'c' is statically typed as a char\n    \n        c = num;    // This asssigment would convert num's value to ASCII equivalent character\n        num = pi; // This assignment would convert pi's value from double type to int type\n        \n        std::cout << \"The value of num is: \" << num << std::endl;\n        std::cout << \"The value of pi is: \" << pi << std::endl;\n        std::cout << \"The value of c is: \"<< c << std::endl;\n        return 0;\n    }\n    \n\nIn the code above, the variable `num` is statically typed as an `int`, `pi` is statically typed as a `double`, and `c` is statically typed as a `char`. If you attempt to assign the value of `pi` to `num`, the value `3.14159` will be converted to the integer `3` and assigned to `num`. Similarly, when the value of `num` is assigned to `c`, the compiler will convert the value `65` to its corresponding [ASCII](https://www.ascii-code.com) code, which is `A`.\n\nLearn more from the following resources:",
+    "links": [
+      {
+        "title": "Type-Coversion",
+        "url": "https://www.programiz.com/cpp-programming/type-conversion",
+        "type": "article"
+      },
+      {
+        "title": "Static Vs Dynamic",
+        "url": "https://www.techtarget.com/searchapparchitecture/tip/Static-vs-dynamic-typing-The-details-and-differences",
+        "type": "article"
+      }
+    ]
+  },
+  "i0EAFEUB-F0wBJWOtrl1A": {
+    "title": "Dynamic Typing",
+    "description": "C++ is known as a statically-typed language, which means the data types of its variables are determined at compile time. However, C++ also provides concepts to have certain level of _dynamic typing_, which means determining the data types of variables at runtime.\n\nHere is a brief overview of two ways to achieve dynamic typing in C++:\n\n`void*` Pointers\n----------------\n\nA `void*` pointer is a generic pointer that can point to objects of any data type. They can be used to store a reference to any type of object without knowing the specific type of the object.\n\nExample:\n\n    #include <iostream>\n    \n    int main() {\n        int x = 42;\n        float y = 3.14f;\n        std::string z = \"Hello, world!\";\n    \n        void* void_ptr;\n    \n        void_ptr = &x;\n        std::cout << \"int value: \" << *(static_cast<int*>(void_ptr)) << std::endl;\n    \n        void_ptr = &y;\n        std::cout << \"float value: \" << *(static_cast<float*>(void_ptr)) << std::endl;\n    \n        void_ptr = &z;\n        std::cout << \"string value: \" << *(static_cast<std::string*>(void_ptr)) << std::endl;\n    \n        return 0;\n    }\n    \n\n`std::any` (C++17)\n------------------\n\nC++17 introduced the `std::any` class which represents a generalized type-safe container for single values of any type.\n\nExample:\n\n    #include <iostream>\n    #include <any>\n    \n    int main() {\n        std::any any_value;\n    \n        any_value = 42;\n        std::cout << \"int value: \" << std::any_cast<int>(any_value) << std::endl;\n    \n        any_value = 3.14;\n        std::cout << \"double value: \" << std::any_cast<double>(any_value) << std::endl;\n    \n        any_value = std::string(\"Hello, world!\");\n        std::cout << \"string value: \" << std::any_cast<std::string>(any_value) << std::endl;\n    \n        return 0;\n    }\n    \n\nKeep in mind that both `void*` pointers and `std::any` have performance implications due to the additional type checking and casting that take place during runtime. They should be used carefully and only when absolutely necessary.",
+    "links": []
+  },
+  "r0yD1gfn03wTpEBi6zNsu": {
+    "title": "RTTI",
+    "description": "Run-Time Type Identification (RTTI) is a feature in C++ that allows you to obtain the type information of an object during program execution. This can be useful when using dynamic typing, where the type of an object can change at runtime.\n\nThere are two main mechanisms for RTTI in C++:\n\n*   `typeid` operator\n*   `dynamic_cast` operator\n\ntypeid operator\n---------------\n\n`typeid` is an operator that returns a reference to an object of type `std::type_info`, which contains information about the type of the object. The header file `<typeinfo>` should be included to use `typeid`.\n\nHere is an example:\n\n    #include <iostream>\n    #include <typeinfo>\n    \n    class Base { virtual void dummy() {} };\n    class Derived : public Base { /* ... */ };\n    \n    int main() {\n        Base* base_ptr = new Derived;\n    \n        // Using typeid to get the type of the object\n        std::cout << \"Type: \" << typeid(*base_ptr).name() << '\\n';\n    \n        delete base_ptr;\n        return 0;\n    }\n    \n\ndynamic\\_cast operator\n----------------------\n\n`dynamic_cast` is a type-casting operator that performs a runtime type check and safely downcasts a base pointer or reference to a derived pointer or reference. It returns null or throws a bad\\_cast exception (if casting references) when the casting fails.\n\nHere is an example:\n\n    #include <iostream>\n    \n    class Base { virtual void dummy() {} };\n    class Derived1 : public Base { /* ... */ };\n    class Derived2 : public Base { /* ... */ };\n    \n    int main() {\n        Base* base_ptr = new Derived1;\n    \n        // Using dynamic_cast to safely downcast the pointer\n        Derived1* derived1_ptr = dynamic_cast<Derived1*>(base_ptr);\n        if (derived1_ptr) {\n            std::cout << \"Downcast to Derived1 successful\\n\";\n        }\n        else {\n            std::cout << \"Downcast to Derived1 failed\\n\";\n        }\n    \n        Derived2* derived2_ptr = dynamic_cast<Derived2*>(base_ptr);\n        if (derived2_ptr) {\n            std::cout << \"Downcast to Derived2 successful\\n\";\n        }\n        else {\n            std::cout << \"Downcast to Derived2 failed\\n\";\n        }\n    \n        delete base_ptr;\n        return 0;\n    }\n    \n\nPlease note that the use of RTTI can have some performance overhead, as it requires additional compiler-generated information to be stored and processed during runtime.",
+    "links": []
+  },
+  "DWw8NxkLpIpiOSUaZZ1oA": {
+    "title": "Pointers and References",
+    "description": "A pointer is a variable that stores the memory address of another variable (or function). It points to the location of the variable in memory, and it allows you to access or modify the value indirectly. Here's a general format to declare a pointer:\n\n    dataType *pointerName;\n    \n\n**Initializing a pointer:**\n\n    int num = 10;\n    int *ptr = &num;  // Pointer 'ptr' now points to the memory address of 'num'\n    \n\n**Accessing value using a pointer:**\n\n    int value = *ptr; // Value now contains the value of the variable that 'ptr' points to (i.e., 10)\n    \n\n**Function pointer:**\n\n    int add(int a, int b)\n    {\n      return a + b;\n    }\n    \n    int main()\n    {\n      int (*funcptr) (int, int) = add; // Pointer 'funcptr' now points to the functions 'add'\n      funcptr(4, 5); // Return 9\n    }\n    \n\nReferences\n----------\n\nA reference is an alias for an existing variable, meaning it's a different name for the same memory location. Unlike pointers, references cannot be null, and they must be initialized when they are declared. Once a reference is initialized, it cannot be changed to refer to another variable.\n\nHere's a general format to declare a reference:\n\n    dataType &referenceName = existingVariable;\n    \n\n**Example:**\n\n    int num = 10;\n    int &ref = num; // Reference 'ref' is now an alias of 'num'\n    \n\nModifying the value of `ref` will also modify the value of `num` because they share the same memory location.\n\n**Note:** References are generally used when you want to pass a variable by reference in function arguments or when you want to create an alias for a variable without the need for pointer syntax.\n\nLearn more from the following resources:",
+    "links": [
+      {
+        "title": "Function Pointer in C++",
+        "url": "https://www.scaler.com/topics/cpp/function-pointer-cpp/",
+        "type": "article"
+      }
+    ]
+  },
+  "uUzRKa9wGzdUwwmAg3FWr": {
+    "title": "References",
+    "description": "A reference can be considered as a constant pointer (not to be confused with a pointer to a constant value) which always points to (references) the same object. They are declared using the `&` (ampersand) symbol.\n\nDeclaration and Initialization\n------------------------------\n\nTo declare a reference, use the `&` symbol followed by the variable type and the reference's name. Note that you must initialize a reference when you declare it.\n\n    int var = 10;        // Declare an integer variable\n    int& ref = var;      // Declare a reference that \"points to\" var\n    \n\nUsage\n-----\n\nYou can use the reference just like you'd use the original variable. When you change the value of the reference, the value of the original variable also changes, because they both share the same memory location.\n\n    var = 20;            // Sets the value of var to 20\n    std::cout << ref << std::endl; // Outputs 20\n    \n    ref = 30;            // Sets the value of ref to 30\n    std::cout << var << std::endl; // Outputs 30\n    \n\nFunction Parameters\n-------------------\n\nYou can use references as function parameters to create an alias for an argument. This is commonly done when you need to modify the original variable or when passing an object of considerable size to avoid the cost of copying.\n\n    void swap(int& a, int& b) {\n        int temp = a;\n        a = b;\n        b = temp;\n    }\n    \n    int main() {\n       int x = 5, y = 10;\n       std::cout << \"Before Swap: x = \" << x << \" y = \" << y << std::endl; // Outputs 5 10\n       \n       swap(x, y);\n       std::cout << \"After Swap: x = \" << x << \" y = \" << y << std::endl;  // Outputs 10 5\n    }",
+    "links": []
+  },
+  "mSFwsTYvmg-GwG4_DEIEf": {
+    "title": "Memory Model",
+    "description": "The memory model in C++ defines how the program stores and accesses data in computer memory. It consists of different segments, such as the Stack, Heap, Data and Code segments. Each of these segments is used to store different types of data and has specific characteristics.\n\nStack Memory\n------------\n\nStack memory is used for automatic storage duration variables, such as local variables and function call data. Stack memory is managed by the compiler, and it's allocation and deallocation are done automatically. The stack memory is also a LIFO (Last In First Out) data structure, meaning that the most recent data allocated is the first to be deallocated.\n\n    void functionExample() {\n        int x = 10; // x is stored in the stack memory\n    }\n    \n\nHeap Memory\n-----------\n\nHeap memory is used for dynamic storage duration variables, such as objects created using the `new` keyword. The programmer has control over the allocation and deallocation of heap memory using `new` and `delete` operators. Heap memory is a larger pool of memory than the stack, but has a slower access time.\n\n    void functionExample() {\n        int* p = new int; // dynamically allocated int in heap memory\n        *p = 10;\n        // more code\n        delete p; // deallocate memory\n    }\n    \n\nData Segment\n------------\n\nThe Data segment is composed of two parts: the initialized data segment and the uninitialized data segment. The initialized data segment stores global, static, and constant variables with initial values, whereas the uninitialized segment stores uninitialized global and static variables.\n\n    // Initialized data segment\n    int globalVar = 10; // global variables\n    static int staticVar = 10; // static local variables\n    const int constVar = 10; // constant variables with value\n    \n    // Uninitialized data segment\n    int globalVar; // uninitialized global variables\n    \n\nCode Segment\n------------\n\nThe Code segment (also known as the Text segment) stores the executable code (machine code) of the program. It's usually located in a read-only area of memory to prevent accidental modification.\n\n    void functionExample() {\n        // The machine code for this function is stored in the code segment.\n    }\n    \n\nIn summary, understanding the memory model in C++ helps to optimize the usage of memory resources and improves overall program performance.",
+    "links": []
+  },
+  "9aA_-IfQ9WmbPgwic0mFN": {
+    "title": "Lifetime of Objects",
+    "description": "Object lifetime refers to the time during which an object exists, from the moment it is created until it is destroyed. In C++, an object's lifetime can be classified into four categories:\n\n*   **Static Storage Duration**: Objects with static storage duration exist for the entire run of the program. These objects are allocated at the beginning of the program's run and deallocated when the program terminates. Global variables, static data members, and static local variables fall into this category.\n    \n        int global_var;            // Static storage duration\n        class MyClass {\n          static int static_var;   // Static storage duration\n        };\n        void myFunction() {\n          static int local_var;    // Static storage duration\n        }\n        \n    \n*   **Thread Storage Duration**: Objects with thread storage duration exist for the lifetime of the thread they belong to. They are created when a thread starts and destroyed when the thread exits. Thread storage duration can be specified using the `thread_local` keyword.\n    \n        thread_local int my_var;   // Thread storage duration\n        \n    \n*   **Automatic Storage Duration**: Objects with automatic storage duration are created at the point of definition and destroyed when the scope in which they are declared is exited. These objects are also known as \"local\" or \"stack\" objects. Function parameters and local non-static variables fall into this category.\n    \n        void myFunction() {\n          int local_var;           // Automatic storage duration\n        }\n        \n    \n*   **Dynamic Storage Duration**: Objects with dynamic storage duration are created at runtime, using memory allocation functions such as `new` or `malloc`. The lifetime of these objects must be managed manually, as they are not automatically deallocated when the scope is exited. Instead, it is the programmer's responsibility to destroy the objects using the `delete` or `free` functions when they are no longer needed, to avoid memory leaks.\n    \n        int* ptr = new int;        // Dynamic storage duration\n        delete ptr;\n        \n    \n\nUnderstanding object lifetimes is essential for managing memory efficiently in C++ programs and avoiding common issues like memory leaks and undefined behavior.\n\nKeep in mind that a proper understanding of constructors and destructors for classes is also essential when working with objects of varying lifetimes, as they allow you to control the behavior of object creation and destruction.",
+    "links": []
+  },
+  "ulvwm4rRPgkpgaqGgyH5a": {
+    "title": "Smart Pointers",
+    "description": "",
+    "links": []
+  },
+  "vUwSS-uX36OWZouO0wOcy": {
+    "title": "weak_ptr",
+    "description": "",
+    "links": []
+  },
+  "b5jZIZD_U_CPg-_bdndjz": {
+    "title": "shared_ptr",
+    "description": "",
+    "links": []
+  },
+  "k9c5seRkhgm_yHPpiz2X0": {
+    "title": "unique_ptr",
+    "description": "",
+    "links": []
+  },
+  "uEGEmbxegATIrvGfobJb9": {
+    "title": "Raw Pointers",
+    "description": "",
+    "links": []
+  },
+  "Gld0nRs0sM8kRe8XmYolu": {
+    "title": "New/Delete Operators",
+    "description": "",
+    "links": []
+  },
+  "6w0WExQ4lGIGgok6Thq0s": {
+    "title": "Memory Leakage",
+    "description": "",
+    "links": []
+  },
+  "Zw2AOTK5uc9BoKEpY7W1C": {
+    "title": "Structuring Codebase",
+    "description": "Structuring codebase is an essential part of software development that deals with organizing and modularizing your code to make it more maintainable, efficient, and easier to understand. A well-structured codebase enhances collaboration, simplifies adding new features, and makes debugging faster. In C++, there are various techniques to help you structure your codebase effectively.\n\nNamespaces\n----------\n\nNamespaces are one of the tools in C++ to organize your code by providing a named scope for different identifiers you create, like functions, classes, and variables. They help avoid name clashes and make your code more modular.\n\n    namespace MyNamespace {\n        int aFunction() {\n            // function implementation\n        }\n    }\n    // to use the function\n    MyNamespace::aFunction();\n    \n\nInclude Guards\n--------------\n\nInclude guards are a tool for preventing multiple inclusions of a header file in your project. They consist of preprocessor directives that conditionally include the header file only once, even if it's included in multiple places.\n\n    #ifndef MY_HEADER_FILE_H\n    #define MY_HEADER_FILE_H\n    \n    // Your code here\n    \n    #endif // MY_HEADER_FILE_H\n    \n\nHeader and Source Files\n-----------------------\n\nSeparating your implementation and declarations into header (_.h) and source (_.cpp) files is a key aspect of structuring your codebase in C++. Header files usually contain class and function declarations, while source files contain their definitions.\n\n// MyClass.h\n\n    #ifndef MY_CLASS_H\n    #define MY_CLASS_H\n    \n    class MyClass\n    {\n    public:\n        MyClass();\n        int myMethod();\n    };\n     \n    #endif // MY_CLASS_H\n    \n\n// MyClass.cpp\n\n    #include \"MyClass.h\"\n    \n    MyClass::MyClass() {\n        // constructor implementation\n    }\n    \n    int MyClass::myMethod() {\n        // method implementation\n    }\n    \n\nCode Formatting\n---------------\n\nConsistent code formatting and indentation play a crucial role in structuring your codebase, making it easier to read and understand for both you and other developers. A style guide such as the [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) can help you maintain consistent formatting throughout your project.",
+    "links": []
+  },
+  "dKCYmxDNZubCVcR5rf8b-": {
+    "title": "Scope",
+    "description": "**Scope** refers to the visibility and accessibility of variables, functions, classes, and other identifiers in a C++ program. It determines the lifetime and extent of these identifiers. In C++, there are four types of scope:\n\n*   **Global scope:** Identifiers declared outside any function or class have a global scope. They can be accessed from any part of the program (unless hidden by a local identifier with the same name). The lifetime of a global identifier is the entire duration of the program.\n\n    #include <iostream>\n    \n    int globalVar; // This is a global variable\n    \n    int main() {\n        std::cout << \"Global variable: \" << globalVar << std::endl;\n    }\n    \n\n*   **Local scope:** Identifiers declared within a function or a block have a local scope. They can be accessed only within the function or the block they were declared in. Their lifetime is limited to the duration of the function/block execution.\n\n    #include <iostream>\n    \n    void localExample() {\n        int localVar; // This is a local variable\n        localVar = 5;\n        std::cout << \"Local variable: \" << localVar << std::endl;\n    }\n    \n    int main() {\n        localExample();\n        // std::cout << localVar << std::endl; //error: ‘localVar’ was not declared in this scope\n    }\n    \n\n*   **Namespace scope:** A namespace is a named scope that groups related identifiers together. Identifiers declared within a namespace have the namespace scope. They can be accessed using the namespace name and the scope resolution operator `::`.\n\n    #include <iostream>\n    \n    namespace MyNamespace {\n        int namespaceVar = 42;\n    }\n    \n    int main() {\n        std::cout << \"Namespace variable: \" << MyNamespace::namespaceVar << std::endl;\n    }\n    \n\n*   **Class scope:** Identifiers declared within a class have a class scope. They can be accessed using the class name and the scope resolution operator `::` or, for non-static members, an object of the class and the dot `.` or arrow `->` operator.\n\n    #include <iostream>\n    \n    class MyClass {\n    public:\n        static int staticMember;\n        int nonStaticMember;\n    \n        MyClass(int value) : nonStaticMember(value) {}\n    };\n    \n    int MyClass::staticMember = 7;\n    \n    int main() {\n        MyClass obj(10);\n        std::cout << \"Static member: \" << MyClass::staticMember << std::endl;\n        std::cout << \"Non-static member: \" << obj.nonStaticMember << std::endl;\n    }\n    \n\nUnderstanding various types of scope in C++ is essential for effective code structuring and management of resources in a codebase.",
+    "links": []
+  },
+  "iIdC7V8sojwyEqK1xMuHn": {
+    "title": "Namespaces",
+    "description": "In C++, a namespace is a named scope or container that is used to organize and enclose a collection of code elements, such as variables, functions, classes, and other namespaces. They are mainly used to divide and manage the code base, giving developers control over name collisions and the specialization of code.\n\nSyntax\n------\n\nHere's the syntax for declaring a namespace:\n\n    namespace identifier {\n        // code elements\n    }\n    \n\nUsing Namespaces\n----------------\n\nTo access elements within a namespace, you can use the scope resolution operator `::`. Here are some examples:\n\n### Declaring and accessing a namespace\n\n    #include <iostream>\n    \n    namespace animals {\n        std::string dog = \"Bobby\";\n        std::string cat = \"Lilly\";\n    }\n    \n    int main() {\n        std::cout << \"Dog's name: \" << animals::dog << std::endl;\n        std::cout << \"Cat's name: \" << animals::cat << std::endl;\n    \n        return 0;\n    }\n    \n\n### Nesting namespaces\n\nNamespaces can be nested within other namespaces:\n\n    #include <iostream>\n    \n    namespace outer {\n        int x = 10;\n    \n        namespace inner {\n            int y = 20;\n        }\n    }\n    \n    int main() {\n        std::cout << \"Outer x: \" << outer::x << std::endl;\n        std::cout << \"Inner y: \" << outer::inner::y << std::endl;\n    \n        return 0;\n    }\n    \n\n`using` Keyword\n---------------\n\nYou can use the `using` keyword to import namespaced elements into the current scope. However, this might lead to name conflicts if multiple namespaces have elements with the same name.\n\n### Using a single element from a namespace\n\n    #include <iostream>\n    \n    namespace animals {\n        std::string dog = \"Bobby\";\n        std::string cat = \"Lilly\";\n    }\n    \n    int main() {\n        using animals::dog;\n        \n        std::cout << \"Dog's name: \" << dog << std::endl;\n    \n        return 0;\n    }\n    \n\n### Using the entire namespace\n\n    #include <iostream>\n    \n    namespace animals {\n        std::string dog = \"Bobby\";\n        std::string cat = \"Lilly\";\n    }\n    \n    int main() {\n        using namespace animals;\n        \n        std::cout << \"Dog's name: \" << dog << std::endl;\n        std::cout << \"Cat's name: \" << cat << std::endl;\n    \n        return 0;\n    }\n    \n\nIn conclusion, namespaces are a useful mechanism in C++ to organize code, avoid naming conflicts, and manage the visibility of code elements.",
+    "links": []
+  },
+  "CK7yf8Bo7kfbV6x2tZTrh": {
+    "title": "Headers / CPP Files",
+    "description": "Code splitting refers to the process of breaking down a large code base into smaller, more manageable files or modules. This helps improve the organization, maintainability, and readability of the code. In C++, code splitting is generally achieved through the use of separate compilation, header files, and source files.\n\n### Header Files (.h or .hpp)\n\nHeader files, usually with the `.h` or `.hpp` extension, are responsible for declaring classes, functions, and variables that are needed by multiple source files. They act as an interface between different parts of the code, making it easier to manage dependencies and reduce the chances of duplicated code.\n\nExample of a header file:\n\n    // example.h\n    #ifndef EXAMPLE_H\n    #define EXAMPLE_H\n    \n    class Example {\n    public:\n        void printMessage();\n    };\n    \n    #endif\n    \n\n### Source Files (.cpp)\n\nSource files, with the `.cpp` extension, are responsible for implementing the actual functionality defined in the corresponding header files. They include the header files as needed and provide the function and class method definitions.\n\nExample of a source file:\n\n    // example.cpp\n    #include \"example.h\"\n    #include <iostream>\n    \n    void Example::printMessage() {\n        std::cout << \"Hello, code splitting!\" << std::endl;\n    }\n    \n\n### Separate Compilation\n\nC++ allows for separate compilation, which means that each source file can be compiled independently into an object file. These object files can then be linked together to form the final executable. This provides faster build times when making changes to a single source file since only that file needs to be recompiled, and the other object files can be reused.\n\nExample of separate compilation and linking:\n\n    # Compile each source file into an object file\n    g++ -c main.cpp -o main.o\n    g++ -c example.cpp -o example.o\n    \n    # Link object files together to create the executable\n    g++ main.o example.o -o my_program\n    \n\nBy following the code splitting technique, you can better organize your C++ codebase, making it more manageable and maintainable.",
+    "links": []
+  },
+  "CMlWNQwpywNhO9B6Yj6Me": {
+    "title": "Structures and Classes",
+    "description": "Structures and classes are user-defined data types in C++ that allow for the grouping of variables of different data types under a single name. They make it easier to manage and organize complex data by creating objects that have particular attributes and behaviors. The main difference between a structure and a class is their default access specifier: members of a structure are public by default, while members of a class are private.\n\nStructures\n----------\n\nA structure is defined using the `struct` keyword, followed by the structure's name and a set of curly braces `{}` enclosing the members (variables and/or functions) of the structure. The members can be of different data types. To create an object of the structure's type, use the structure name followed by the object name.\n\nHere's an example of defining a structure and creating an object:\n\n    struct Employee {\n        int id;\n        std::string name;\n        float salary;\n    };\n    \n    Employee e1; // create an object of the 'Employee' structure\n    \n\nYou can access the members of a structure using the dot operator `.`:\n\n    e1.id = 1;\n    e1.name = \"John Doe\";\n    e1.salary = 40000;\n    \n\nClasses\n-------\n\nA class is defined using the `class` keyword, followed by the class's name and a set of curly braces `{}` enclosing the members (variables and/or functions) of the class. Like structures, class members can be of different data types. You can create objects of a class using the class name followed by the object name.\n\nHere's an example of a class definition and object creation:\n\n    class Student {\n        int roll_no;\n        std::string name;\n        float marks;\n    \n    public:\n        void set_data(int r, std::string n, float m) {\n            roll_no = r;\n            name = n;\n            marks = m;\n        }\n    \n        void display() {\n            std::cout << \"Roll no: \" << roll_no\n                      << \"\\nName: \" << name\n                      << \"\\nMarks: \" << marks << std::endl;\n        }\n    };\n    \n    Student s1; // create an object of the 'Student' class\n    \n\nSince the data members of a class are private by default, we cannot access them directly using the dot operator from outside the class. Instead, we use public member functions to set or get their values:\n\n    s1.set_data(1, \"Alice\", 95.0);\n    s1.display();\n    \n\nThat's a brief summary of structures and classes in C++. Remember that while they may seem similar, classes provide more control over data encapsulation and can be used to implement more advanced features like inheritance and polymorphism.",
+    "links": []
+  },
+  "7sdEzZCIoarzznwO4XcCv": {
+    "title": "Rule of Zero, Five, Three",
+    "description": "**Rule of Zero, Three, and Five in C++**\n\nThe Rule of Zero, Three, and Five is a set of guidelines for managing object resources in modern C++, related to structures and classes. These rules deal with the default behavior of constructors, destructors, and other special member functions that are necessary for proper resource management.\n\n**Rule of Zero**\n\nThe Rule of Zero states that if a class or structure does not explicitly manage resources, it should not define any of the special member functions, i.e., destructor, copy constructor, copy assignment operator, move constructor, and move assignment operator. The compiler will automatically generate these functions, and the behavior will be correct for managing resources like memory and file handles.\n\n_Example:_\n\n    struct MyResource {\n        std::string name;\n        int value;\n    };\n    \n\nIn this example, MyResource is a simple structure that does not manage any resources, so it does not define any special member functions. The compiler will generate them automatically, and the behavior will be correct.\n\n**Rule of Three**\n\nThe Rule of Three states that a class or structure that manages resources should define the following three special member functions:\n\n*   Destructor\n*   Copy constructor\n*   Copy assignment operator\n\nThese functions are necessary for proper resource management, such as releasing memory or correctly handling deep copies.\n\n_Example:_\n\n    class MyResource {\n    public:\n        // Constructor and destructor\n        MyResource() : data(new int[100]) {} \n        ~MyResource() { delete[] data; } \n    \n        // Copy constructor\n        MyResource(const MyResource& other) : data(new int[100]) {\n            std::copy(other.data, other.data + 100, data);\n        }\n    \n        // Copy assignment operator\n        MyResource& operator=(const MyResource& other) {\n            if (&other == this) { return *this; }\n            std::copy(other.data, other.data + 100, data);\n            return *this;\n        }\n    \n    private:\n        int* data;\n    };\n    \n\nIn this example, MyResource is a class that manages a resource (an array of integers), so it defines the destructor, copy constructor, and copy assignment operator.\n\n**Rule of Five**\n\nThe Rule of Five extends the Rule of Three to include two additional special member functions:\n\n*   Move constructor\n*   Move assignment operator\n\nModern C++ introduces move semantics, which allows for more efficient handling of resources by transferring ownership without necessarily copying all the data.\n\n_Example:_\n\n    class MyResource {\n    public:\n        // Constructors and destructor\n        MyResource() : data(new int[100]) {}\n        ~MyResource() { delete[] data; }\n    \n        // Copy constructor\n        MyResource(const MyResource& other) : data(new int[100]) {\n            std::copy(other.data, other.data + 100, data);\n        }\n    \n        // Copy assignment operator\n        MyResource& operator=(const MyResource& other) {\n            if (&other == this) { return *this; }\n            std::copy(other.data, other.data + 100, data);\n            return *this;\n        }\n    \n        // Move constructor\n        MyResource(MyResource&& other) noexcept : data(other.data) {\n            other.data = nullptr;\n        }\n    \n        // Move assignment operator\n        MyResource& operator=(MyResource&& other) noexcept {\n            if (&other == this) { return *this; }\n            delete[] data;\n            data = other.data;\n            other.data = nullptr;\n            return *this;\n        }\n    \n    private:\n        int* data;\n    };\n    \n\nIn this example, MyResource is a class that manages a resource (an array of integers), so it defines all five special member functions for proper resource management and move semantics.",
+    "links": []
+  },
+  "WjHpueZDK-d3oDNMVZi9w": {
+    "title": "Multiple Inheritance",
+    "description": "Multiple inheritance is a feature in C++ where a class can inherit characteristics (data members and member functions) from more than one parent class. The concept is similar to single inheritance (where a class inherits from a single base class), but in multiple inheritance, a class can have multiple base classes.\n\nWhen a class inherits multiple base classes, it becomes a mixture of their properties and behaviors, and can override or extend them as needed.\n\nSyntax\n------\n\nHere is the syntax to declare a class with multiple inheritance:\n\n    class DerivedClass : access-specifier BaseClass1, access-specifier BaseClass2, ...\n    {\n        // class body\n    };\n    \n\nThe `DerivedClass` will inherit members from both `BaseClass1` and `BaseClass2`. The `access-specifier` (like `public`, `protected`, or `private`) determines the accessibility of the inherited members.\n\nExample\n-------\n\nHere is an example of multiple inheritance in action:\n\n    #include <iostream>\n    \n    // Base class 1\n    class Animal\n    {\n    public:\n        void eat()\n        {\n            std::cout << \"I can eat!\" << std::endl;\n        }\n    };\n    \n    // Base class 2\n    class Mammal\n    {\n    public:\n        void breath()\n        {\n            std::cout << \"I can breathe!\" << std::endl;\n        }\n    };\n    \n    // Derived class inheriting from both Animal and Mammal\n    class Dog : public Animal, public Mammal\n    {\n    public:\n        void bark()\n        {\n            std::cout << \"I can bark! Woof woof!\" << std::endl;\n        }\n    };\n    \n    int main()\n    {\n        Dog myDog;\n    \n        // Calling members from both base classes\n        myDog.eat();\n        myDog.breath();\n        \n        // Calling a member from the derived class\n        myDog.bark();\n    \n        return 0;\n    }\n    \n\nNote\n----\n\nIn some cases, multiple inheritance can lead to complications such as ambiguity and the \"diamond problem\". Ensure that you use multiple inheritance judiciously and maintain well-structured and modular classes to prevent issues.\n\nFor more information on C++ multiple inheritance and related topics, refer to C++ documentation or a comprehensive C++ programming guide.",
+    "links": []
+  },
+  "b3-QYKNcW3LYCNOza3Olf": {
+    "title": "Object Oriented Programming",
+    "description": "Object-oriented programming (OOP) is a programming paradigm that uses objects, which are instances of classes, to perform operations and interact with each other. In C++, you can achieve OOP through the use of classes and objects.\n\nClasses\n-------\n\nA class is a blueprint for creating objects. It defines the structure (data members) and behavior (member functions) for a type of object. Here's an example of a simple class:\n\n    class Dog {\n    public:\n        std::string name;\n        int age;\n    \n        void bark() {\n            std::cout << name << \" barks!\" << std::endl;\n        }\n    };\n    \n\nThis `Dog` class has two data members: `name` and `age`, and one member function `bark`. You can create an object of this class and access its members like this:\n\n    Dog myDog;\n    myDog.name = \"Fido\";\n    myDog.age = 3;\n    myDog.bark(); // Output: Fido barks!\n    \n\nEncapsulation\n-------------\n\nEncapsulation is the concept of bundling data and functions that operate on that data within a single unit, such as a class. It helps to hide the internal implementation details of a class and expose only the necessary information and functionalities. In C++, you can use access specifiers like `public`, `private`, and `protected` to control the visibility and accessibility of class members. For example:\n\n    class Dog {\n    private:\n        std::string name;\n        int age;\n    \n    public:\n        void setName(std::string n) {\n            name = n;\n        }\n    \n        void setAge(int a) {\n            age = a;\n        }\n    \n        void bark() {\n            std::cout << name << \" barks!\" << std::endl;\n        }\n    };\n    \n\nIn this example, we've made the `name` and `age` data members `private` and added public member functions `setName` and `setAge` to modify them. This way, the internal data of the `Dog` class is protected and only accessible through the provided functions.\n\nInheritance\n-----------\n\nInheritance is the concept of deriving new classes from existing ones, which enables code reusability and organization. In C++, inheritance is achieved by using a colon `:` followed by the base class' access specifier and the base class name. For example:\n\n    class Animal {\n    public:\n        void breathe() {\n            std::cout << \"I can breathe\" << std::endl;\n        }\n    };\n    \n    class Dog : public Animal {\n    public:\n        void bark() {\n            std::cout << \"Dog barks!\" << std::endl;\n        }\n    };\n    \n\nIn this example, the `Dog` class inherits from the `Animal` class, so the `Dog` class can access the `breathe` function from the `Animal` class. When you create a `Dog` object, you can use both `breathe` and `bark` functions.\n\n    Dog myDog;\n    myDog.breathe(); // Output: I can breathe\n    myDog.bark(); // Output: Dog barks!\n    \n\nPolymorphism\n------------\n\nPolymorphism allows you to use a single interface to represent different types. In C++, it's mainly achieved using function overloading, virtual functions, and overriding. For example:\n\n    class Animal {\n    public:\n        virtual void makeSound() {\n            std::cout << \"The Animal makes a sound\" << std::endl;\n        }\n    };\n    \n    class Dog : public Animal {\n    public:\n        void makeSound() override {\n            std::cout << \"Dog barks!\" << std::endl;\n        }\n    };\n    \n    class Cat : public Animal {\n    public:\n        void makeSound() override {\n            std::cout << \"Cat meows!\" << std::endl;\n        }\n    };\n    \n\nIn this example, we have an `Animal` base class with a virtual `makeSound` function. We then derive two classes, `Dog` and `Cat`, which override the `makeSound` function. This enables polymorphic behavior, where an `Animal` pointer or reference can be used to access the correct `makeSound` function depending on the derived class type.\n\n    Animal *animals[2] = {new Dog, new Cat};\n    animals[0]->makeSound(); // Output: Dog barks!\n    animals[1]->makeSound(); // Output: Cat meows!\n    \n\nThat's a brief overview of object-oriented programming concepts in C++.",
+    "links": []
+  },
+  "hNBErGNiegLsUJn_vgcOR": {
+    "title": "Virtual Methods",
+    "description": "",
+    "links": []
+  },
+  "s99ImazcwCgAESxZd8ksa": {
+    "title": "Virtual Tables",
+    "description": "",
+    "links": []
+  },
+  "7h1VivjCPDwriL7FirtFv": {
+    "title": "Dynamic Polymorphism",
+    "description": "Dynamic polymorphism is a programming concept in object-oriented languages like C++ where a derived class can override or redefine methods of its base class. This means that a single method call can have different implementations based on the type of object it is called on.\n\nDynamic polymorphism is achieved through **virtual functions**, which are member functions of a base class marked with the `virtual` keyword. When you specify a virtual function in a base class, it can be overridden in any derived class to provide a different implementation.\n\nExample\n-------\n\nHere's an example in C++ demonstrating dynamic polymorphism.\n\n    #include <iostream>\n    \n    // Base class\n    class Shape {\n    public:\n        virtual void draw() {\n            std::cout << \"Drawing a shape\" << std::endl; \n        }\n    };\n    \n    // Derived class 1\n    class Circle : public Shape {\n    public:\n        void draw() override {\n            std::cout << \"Drawing a circle\" << std::endl; \n        }\n    };\n    \n    // Derived class 2\n    class Rectangle : public Shape {\n    public:\n        void draw() override {\n            std::cout << \"Drawing a rectangle\" << std::endl;\n        }\n    };\n    \n    int main() {\n        Shape* shape;\n        Circle circle;\n        Rectangle rectangle;\n    \n        // Storing the address of circle\n        shape = &circle;\n    \n        // Call circle draw function\n        shape->draw();\n    \n        // Storing the address of rectangle\n        shape = &rectangle;\n    \n        // Call rectangle draw function\n        shape->draw();\n    \n        return 0;\n    }\n    \n\nThis code defines a base class `Shape` with a virtual function `draw`. Two derived classes `Circle` and `Rectangle` both override the `draw` function to provide their own implementations. Then in the `main` function, a pointer of type `Shape` is used to call the respective `draw` functions of `Circle` and `Rectangle` objects. The output of this program will be:\n\n    Drawing a circle\n    Drawing a rectangle\n    \n\nAs you can see, using dynamic polymorphism, we can determine at runtime which `draw` method should be called based on the type of object being used.",
+    "links": []
+  },
+  "B2SGBENzUMl0SAjG4j91V": {
+    "title": "Exception Handling",
+    "description": "Exception handling in C++ is a mechanism to handle errors, anomalies, or unexpected events that can occur during the runtime execution of a program. This allows the program to continue running or exit gracefully when encountering errors instead of crashing abruptly.\n\nC++ provides a set of keywords and constructs for implementing exception handling:\n\n*   `try`: Defines a block of code that should be monitored for exceptions.\n*   `catch`: Specifies the type of exception to be caught and the block of code that shall be executed when that exception occurs.\n*   `throw`: Throws an exception that will be caught and handled by the appropriate catch block.\n*   `noexcept`: Specifies a function that doesn't throw exceptions or terminates the program if an exception is thrown within its scope.\n\nExample\n-------\n\nHere's an example demonstrating the basic usage of exception handling:\n\n    #include <iostream>\n    \n    int divide(int a, int b) {\n        if (b == 0) {\n            throw \"Division by zero!\";\n        }\n        return a / b;\n    }\n    \n    int main() {\n        int num1, num2;\n    \n        std::cout << \"Enter two numbers for division: \";\n        std::cin >> num1 >> num2;\n    \n        try {\n            int result = divide(num1, num2);\n            std::cout << \"The result is: \" << result << std::endl;\n        } catch (const char* msg) {\n            std::cerr << \"Error: \" << msg << std::endl;\n        }\n    \n        return 0;\n    }\n    \n\nIn this example, we define a function `divide` that throws an exception if `b` is zero. In the `main` function, we use a `try` block to call `divide` and output the result. If an exception is thrown, it is caught inside the `catch` block, which outputs an error message. This way, we can handle the error gracefully rather than letting the program crash when attempting to divide by zero.\n\nStandard Exceptions\n-------------------\n\nC++ provides a standard set of exception classes under the `<stdexcept>` library which can be used as the exception type for more specific error handling. Some of these classes include:\n\n*   `std::exception`: Base class for all standard exceptions.\n*   `std::logic_error`: Represents errors which can be detected statically by the program.\n*   `std::runtime_error`: Represents errors occurring during the execution of a program.\n\nHere's an example showing how to use standard exceptions:\n\n    #include <iostream>\n    #include <stdexcept>\n    \n    int divide(int a, int b) {\n        if (b == 0) {\n            throw std::runtime_error(\"Division by zero!\");\n        }\n        return a / b;\n    }\n    \n    int main() {\n        int num1, num2;\n    \n        std::cout << \"Enter two numbers for division: \";\n        std::cin >> num1 >> num2;\n    \n        try {\n            int result = divide(num1, num2);\n            std::cout << \"The result is: \" << result << std::endl;\n        } catch (const std::exception& e) {\n            std::cerr << \"Error: \" << e.what() << std::endl;\n        }\n    \n        return 0;\n    }\n    \n\nIn this example, we modified the `divide` function to throw a `std::runtime_error` instead of a simple string. The catch block now catches exceptions derived from `std::exception` and uses the member function `what()` to display the error message.",
+    "links": []
+  },
+  "oWygnpwHq2poXQMTTSCpl": {
+    "title": "Exit Codes",
+    "description": "Exit codes, also known as \"return codes\" or \"status codes\", are numeric values that a program returns to the calling environment (usually the operating system) when it finishes execution. These codes are used to indicate the success or failure of a program's execution.\n\n0 is the standard exit code for a successful execution, while non-zero exit codes typically indicate errors or other exceptional situations. The actual meanings of non-zero exit codes can vary between different applications or systems.\n\nIn C++, you can return an exit code from the `main` function by using the `return` statement, or you can use the `exit()` function, which is part of the C++ Standard Library.\n\nExample: Using return in `main`\n-------------------------------\n\n    #include <iostream>\n    \n    int main() {\n        // Some code here...\n    \n        if (/*some error condition*/) {\n            std::cout << \"An error occurred.\" << std::endl;\n            return 1;\n        }\n    \n        // More code here...\n    \n        if (/*another error condition*/) {\n            std::cout << \"Another error occurred.\" << std::endl;\n            return 2;\n        }\n    \n        return 0; // Successful execution\n    }\n    \n\nExample: Using the `exit()` function\n------------------------------------\n\n    #include <iostream>\n    #include <cstdlib>\n    \n    void some_function() {\n        // Some code here...\n    \n        if (/*some error condition*/) {\n            std::cout << \"An error occurred.\" << std::endl;\n            std::exit(1);\n        }\n    \n        // More code here...\n    }\n    \n    int main() {\n        some_function();\n    \n        // Some other code here...\n    \n        return 0; // Successful execution\n    }\n    \n\nIn both examples above, the program returns exit codes depending on different error conditions encountered during execution. The codes 1 and 2 are used to distinguish between the two error conditions.",
+    "links": []
+  },
+  "NJud5SXBAUZ6Sr78kZ7jx": {
+    "title": "Exceptions",
+    "description": "Exception handling is a method used to tackle runtime errors so that normal flow of the program can be maintained. In C++, this is accomplished using three keywords: `try`, `catch`, and `throw`.\n\ntry { ... }\n-----------\n\nIn the `try` block, you write the code that can possibly generate an exception. If an exception is encountered, the control is passed to the relevant `catch` block to handle the issue.\n\nExample:\n\n    try {\n      // code that might throw an exception\n    }\n    \n\ncatch (...) { ... }\n-------------------\n\nThe `catch` block follows the `try` block and is responsible for handling the exceptions thrown by the `try` block. There can be multiple `catch` blocks to handle different types of exceptions.\n\nExample:\n\n    catch (int e) {\n      // handle exception of type int\n    }\n    catch (char e) {\n      // handle exception of type char\n    }\n    catch (...) {\n      // handle any other exception\n    }\n    \n\nthrow ... ;\n-----------\n\nIn case an error occurs within the `try` block, you can use the `throw` keyword to generate an exception of the specific type. This will then be caught and handled by the corresponding `catch` block.\n\nExample:\n\n    try {\n      int num1 = 10, num2 = 0;\n      if (num2 == 0) {\n        throw \"Division by zero not allowed!\";\n      } else {\n        int result = num1 / num2;\n        std::cout << \"Result: \" << result << std::endl;\n      }\n    }\n    catch (const char* e) {\n      std::cout << \"Error: \" << e << std::endl;\n    }\n    \n\nIn summary, exception handling in C++ is a technique to handle runtime errors while maintaining the normal flow of the program. The `try`, `catch`, and `throw` keywords are used together to create the structure to deal with exceptions as they occur.",
+    "links": []
+  },
+  "y4-P4UNC--rE1vni8HdTn": {
+    "title": "Access Violations",
+    "description": "An access violation is a specific type of error that occurs when a program attempts to access an illegal memory location. In C++, access violations are most commonly caused by:\n\n*   **Dereferencing a null or invalid pointer.**\n*   **Accessing an array out of bounds.**\n*   **Reading or writing to memory freed by the user or the operating system.**\n\nIt is crucial to identify access violations because they can lead to unpredictable behavior, application crashes, or corruption of data.\n\nSome examples of access violations are:\n\nDereferencing null or invalid pointer\n-------------------------------------\n\n    int *p = nullptr;\n    int x = *p;  // Access violation: trying to access null pointer's content\n    \n\nAccessing an array out of bounds\n--------------------------------\n\n    int arr[5] = {1, 2, 3, 4, 5};\n    int y = arr[5];  // Access violation: index out of bounds (valid indices are 0-4)\n    \n\nReading or writing to freed memory\n----------------------------------\n\n    int* p2 = new int[10];\n    delete[] p2;\n    p2[3] = 42;  // Access violation: writing to memory that has been freed\n    \n\n### Debugging Access Violations\n\nTools like _debuggers_, _static analyzers_, and _profilers_ can help identify access violations in your code. For example:\n\n*   **Microsoft Visual Studio**: Use the built-in debugger to identify the line of code responsible for the access violation error.\n    \n*   **Valgrind**: A popular Linux tool that detects memory leaks and access violations in your C++ programs.\n    \n*   **AddressSanitizer**: A runtime memory error detector for C++ that can detect out-of-bounds accesses, memory leaks, and use-after-free errors.",
+    "links": []
+  },
+  "-6fwJQOfsorgHkoQGp4T3": {
+    "title": "Language Concepts",
+    "description": "C++ is a powerful, high-level, object-oriented programming language that offers several key language concepts. These concepts provide the foundation upon which you can build efficient, reliable, and maintainable programs. Here's a brief summary of some important language concepts in C++.\n\nVariables and Data Types\n------------------------\n\nC++ provides various fundamental data types such as `int`, `float`, `double`, `char`, and `bool` to declare and manipulate variables in a program.\n\nExample:\n\n    int age = 25;\n    float height = 1.7f;\n    double salary = 50000.0;\n    char grade = 'A';\n    bool isEmployed = true;\n    \n\nControl Structures\n------------------\n\nControl structures enable you to control the flow of execution of a program. Key control structures in C++ include:\n\n*   Conditional statement: `if`, `else`, and `else if`\n*   Loop constructs: `for`, `while`, and `do-while`\n*   Switch-case construct\n\nExample:\n\n    // If-else statement\n    if (age > 18) {\n        std::cout << \"You are eligible to vote.\";\n    } else {\n        std::cout << \"You are not eligible to vote.\";\n    }\n    \n    // For loop\n    for (int i = 0; i < 5; i++) {\n        std::cout << \"Hello World!\";\n    }\n    \n\nFunctions\n---------\n\nFunctions in C++ allow you to break down a large program into small, manageable, and reusable pieces of code.\n\nExample:\n\n    int add(int a, int b) {\n        return a + b;\n    }\n    \n    int main() {\n        int sum = add(10, 20);\n        std::cout << \"The sum is: \" << sum;\n        return 0;\n    }\n    \n\nArrays and Vectors\n------------------\n\nArrays and Vectors are commonly used data structures to store and manipulate a collection of elements of the same datatype.\n\nExample:\n\n    // Array\n    int marks[] = {90, 80, 95, 85};\n    \n    // Vector\n    std::vector<int> scores = {10, 20, 30, 40};\n    \n\nPointers\n--------\n\nPointers are variables that store memory addresses of other variables. They enable more efficient handling of memory, and are useful for working with dynamic data structures.\n\nExample:\n\n    int num = 10;\n    int* p = &num; // p stores the address of num\n    \n\nStructures and Classes\n----------------------\n\nStructures and Classes are user-defined data types that allow grouping of variables and functions under a single name.\n\nExample:\n\n    // Structure\n    struct Student {\n        std::string name;\n        int age;\n    };\n    \n    // Class\n    class Employee {\n    public:\n        std::string name;\n        int age;\n        void displayInfo() {\n            std::cout << \"Name: \" << name << \"\\nAge: \" << age;\n        }\n    };\n    \n\nInheritance and Polymorphism\n----------------------------\n\nInheritance is a mechanism that allows a class to inherit properties and methods from a base class. Polymorphism enables you to use a base class type to represent derived class objects.\n\nExample:\n\n    class Base {\n    public:\n        void display() {\n            std::cout << \"This is the base class.\";\n        }\n    };\n    \n    class Derived : public Base {\n    public:\n        void display() {\n            std::cout << \"This is the derived class.\";\n        }\n    };\n    \n\nException Handling\n------------------\n\nC++ provides a mechanism to handle exceptions(runtime errors) gracefully using `try`, `catch`, and `throw` constructs.\n\nExample:\n\n    try {\n        // Code that might throw an exception\n        int result = a / b;\n    } catch (const exception &e) {\n        std::cout << \"Caught an exception: \" << e.what();\n    }\n    \n\nThese are some of the key language concepts in C++, which will help you to understand the language better and develop efficient and maintainable applications.",
+    "links": []
+  },
+  "CG01PTVgHtjfKvsJkJLGl": {
+    "title": "auto (Automatic Type Deduction)",
+    "description": "**Auto**\n\n`auto` is a keyword in C++ language introduced in C++11, which is used for automatic type deduction. It automatically deduces the type of a variable from the type of its initializer expression at compile time.\n\nThe `auto` keyword is useful when you are dealing with complex types or when the type of a variable is hard to predict. It can help in writing cleaner and less error-prone code.\n\nHere's a simple example of using `auto` for type deduction:\n\n    #include <iostream>\n    #include <vector>\n    \n    int main() {\n        // Traditional way of declaring a variable:\n        int myInt = 5;\n    \n        // Using auto for type deduction:\n        auto myAutoInt = 5; // Automatically deduces the type as 'int'\n    \n        // Example with more complex types:\n        std::vector<int> myVector = {1, 2, 3, 4, 5};\n    \n        // Without auto, iterating the vector would look like this:\n        for (std::vector<int>::iterator it = myVector.begin(); it != myVector.end(); ++it) {\n            std::cout << *it << std::endl;\n        }\n    \n        // With auto, the iterator declaration becomes simpler:\n        for (auto it = myVector.begin(); it != myVector.end(); ++it) {\n            std::cout << *it << std::endl;\n        }\n    }\n    \n\nKeep in mind that `auto` deduces the type based on the initializer expression, so if you don't provide an initial value, you will get a compile-time error:\n\n    auto myVar; // Error: Cannot deduce the type without initializer\n    \n\nIn C++14, you can also use `auto` with function return types to let the compiler automatically deduce the return type based on the returned expression:\n\n    auto add(int x, int y) {\n        return x + y; // The compiler deduces the return type as 'int'\n    }",
+    "links": []
+  },
+  "PiMhw1oP9-NZEa6I9u4lX": {
+    "title": "Type Casting",
+    "description": "Type casting is the process of converting a value from one data type to another. In C++, there are four different methods of type casting:\n\n*   **C-style casting**: It is the syntax inherited from C, and it is done by simply putting the target data type in parentheses before the value to cast. Example:\n    \n        int a = 10;\n        float b = (float)a;  // C-style cast from int to float\n        \n    \n*   **`static_cast`**: This is the most commonly used method for type casting in C++. It is performed at compile time, and you should use it when you have an explicit conversion between data types. Example:\n    \n        int a = 10;\n        float b = static_cast<float>(a);  // static_cast from int to float\n        \n    \n*   **`dynamic_cast`**: This method is specifically used for safely converting pointers and references between base and derived classes in a class hierarchy. Example:\n    \n        class Base {};\n        class Derived : public Base {};\n        \n        Base* base_ptr = new Derived();\n        Derived* derived_ptr = dynamic_cast<Derived*>(base_ptr);  // dynamic_cast from Base* to Derived*\n        \n    \n*   **`reinterpret_cast`**: This cast changes the type of a pointer, reference, or an integer value. It is also called a bitwise cast because it changes how the compiler interprets the underlying bits. Use `reinterpret_cast` only when you have a deep understanding of what you're doing, as it does not guarantee that the resulting value will be meaningful. Example:\n    \n        int* a = new int(42);\n        long b = reinterpret_cast<long>(a);  // reinterpret_cast from int* to long\n        \n    \n*   **`const_cast`**: This casting method is used to remove the `const` qualifier from a variable. It is generally not recommended, but can be useful in certain situations where you have no control over the constness of a variable. Example:\n    \n        const int a = 10;\n        int* ptr = const_cast<int*>(&a);  // const_cast from const int* to int*\n        *ptr = 20;  // Not recommended, use with caution\n        \n    \n\nRemember to use the right type of casting based on the specific situation and follow good programming practices in order to ensure a safe and efficient code.\n\nLearn more from the following resources:",
+    "links": [
+      {
+        "title": "Casting in C++",
+        "url": "https://youtu.be/pWZS1MtxI-A",
+        "type": "video"
+      }
+    ]
+  },
+  "_XB2Imyf23-6AOeoNLhYQ": {
+    "title": "static_cast",
+    "description": "`static_cast` is one of the casting operators in C++ that allows you to convert between different data types, such as integer and float, or between pointer types. This type of cast performs a compile-time check and gives an error if there is no valid conversion possible between given types. `static_cast` is generally safer than C-style casts since it does not perform an unsafe reinterpretation of data and allows for better type checking.\n\nSyntax\n------\n\nThe syntax for `static_cast` is as follows:\n\n    static_cast<new_type>(expression)\n    \n\nExamples\n--------\n\n*   Converting between basic data types:\n\n    int i = 42;\n    float f = static_cast<float>(i); // Converts integer i to float f\n    \n\n*   Casting pointers of different object types in an inheritance hierarchy:\n\n    class Base { /* ... */ };\n    class Derived : public Base { /* ... */ };\n    \n    Base *bPtr = new Derived;\n    Derived *dPtr = static_cast<Derived *>(bPtr); // Converts Base pointer bPtr to Derived pointer dPtr\n    \n\n*   Converting an integer to an enumeration:\n\n    enum Color { RED, GREEN, BLUE };\n    int value = 1;\n    Color color = static_cast<Color>(value); // Converts integer value to corresponding Color enumeration\n    \n\nKeep in mind that `static_cast` should be used with caution when casting pointers between different object types. If the original type of the pointer does not match the target type, the result of the cast can be incorrect or cause unexpected behavior.",
+    "links": []
+  },
+  "5g22glc97siQOcTkHbwan": {
+    "title": "const_cast",
+    "description": "`const_cast` is a type of casting in C++ that allows you to remove or add constness to a variable. In other words, it enables you to modify a `const` or `volatile` object, or change a pointer or reference to a `const` or `volatile` type. This is useful in certain scenarios when you need to pass a `const` variable as an argument or when a function parameter requires a non-const type, but you want to make sure the variable remains constant throughout the code.\n\nKeep in mind that using `const_cast` to modify a truly `const` variable can lead to undefined behavior, so it is best to use this feature only when absolutely necessary.\n\nExample\n-------\n\nHere's a code example showing how to use `const_cast`:\n\n    #include <cassert>\n    #include <iostream>\n    \n    void modifyVariable(int* ptr) {\n        *ptr = 42;\n    }\n    \n    int main() {\n        const int original_value = 10;\n        int* non_const_value_ptr = const_cast<int*>(&original_value);\n        std::cout << \"Original value: \" << original_value << std::endl;\n    \n        modifyVariable(non_const_value_ptr);\n        std::cout << \"Modified value: \" << *non_const_value_ptr << \", original_value: \" << original_value << std::endl;\n    \n        assert(non_const_value_ptr == &original_value);\n    \n        return 0;\n    }\n    \n    \n\nIn this example, we first create a `const` variable, `original_value`. Then we use `const_cast` to remove the constness of the variable and assign it to a non-const pointer, `non_const_value_ptr`. The `modifyVariable` function takes an `int*` as an argument and modifies the value pointed to by the pointer, which would not have been possible if we passed the original `const int` directly. Finally, we print the `original_value` and the `*non_const_value_ptr`, which shows that the value has been modified using `const_cast`.\n\nPlease note that this example comes with some risks, as it touches undefined behavior. \\*/",
+    "links": []
+  },
+  "4BdFcuQ5KNW94cu2jz-vE": {
+    "title": "dynamic_cast",
+    "description": "`dynamic_cast` is a type of casting operator in C++ that is used specifically for polymorphism. It safely converts pointers and references of a base class to its derived class and checks the validity of the conversion during runtime. If the conversion is not valid (i.e., the object is not of the target type), it returns a null pointer instead of producing undefined behavior. Therefore, `dynamic_cast` can prevent potential crashes and errors when using polymorphism.\n\nHere is a basic example of how `dynamic_cast` can be used:\n\n    #include <iostream>\n    \n    class BaseClass {\n       public:\n        virtual void display() {\n            std::cout << \"BaseClass\" << std::endl;\n        }\n    };\n    \n    class DerivedClass : public BaseClass {\n       public:\n        void display() {\n            std::cout << \"DerivedClass\" << std::endl;\n        }\n    };\n    \n    int main() {\n        BaseClass *basePtr = new DerivedClass();  // Upcasting\n        DerivedClass *derivedPtr;\n    \n        derivedPtr = dynamic_cast<DerivedClass *>(basePtr);  // Downcasting\n        if (derivedPtr) {\n            derivedPtr->display();  // Output: DerivedClass\n        } else {\n            std::cout << \"Invalid type conversion.\";\n        }\n    \n        delete basePtr;\n        return 0;\n    }\n    \n\nIn this example, a pointer to a `DerivedClass` object is assigned to a `BaseClass` pointer (`basePtr`). Then, we attempt to downcast it back to a `DerivedClass` pointer using `dynamic_cast`. If the casting is successful, we can access the `DerivedClass` functionality through the new pointer (`derivedPtr`).",
+    "links": []
+  },
+  "ZMyFDJrpCauGrY5NZkOwg": {
+    "title": "reinterpret_cast",
+    "description": "`reinterpret_cast` is a type of casting in C++ that allows you to change the type of a pointer or an integer without altering the representation of the data. It is generally used when the conversion required is too low-level or not supported by other casting methods, such as `static_cast`.\n\nUsing `reinterpret_cast` should be handled with care, as it can lead to undefined behavior and severe problems if used incorrectly.\n\nHere's an example of usage:\n\n    #include <iostream>\n    \n    int main() {\n        int num = 42;\n        int *num_ptr = &num;\n    \n        // Disguise the integer pointer as a char pointer\n        char *char_ptr = reinterpret_cast<char *>(num_ptr);\n    \n        for (size_t i = 0; i < sizeof(int); ++i) {\n            // Print the individual bytes of the integer as characters\n            std::cout << \"Byte \" << i << \": \" << char_ptr[i] << std::endl;\n        }\n    \n        return 0;\n    }\n    \n\nIn this example, we're using `reinterpret_cast` to change the type of a pointer from `int *` to `char *`, effectively treating the integer as an array of characters and printing each byte.\n\nRemember that when using `reinterpret_cast`, you should be cautious about dereferencing the converted pointers. The behavior can be unpredictable, and it can lead to issues, such as accessing memory regions that are not intended to be accessed. `reinterpret_cast` should be used sparingly and only when a low-level conversion is necessary.",
+    "links": []
+  },
+  "IDOlquv6jlfecwQoBwkGZ": {
+    "title": "Undefined Behavior (UB)",
+    "description": "**Undefined Behavior**\n----------------------\n\nUndefined behavior in C++ refers to a situation where a program's behavior cannot be predicted due to any violation of the language rules. It is a result of various factors like uninitialized variables, using pointers to deallocated memory, out-of-bounds memory access, etc. The C++ standard does not define the behavior in such cases, which means the compiler or the runtime system is free to handle these situations in any way it wants.\n\nSome common examples of Undefined Behavior are:\n\n*   **Uninitialized Variables**: Accessing the value of an uninitialized variable can lead to undefined behavior. The value of an uninitialized variable is arbitrary and depends on what was in the memory location before the variable was declared.\n    \n        int x;\n        int y = x + 5; // Undefined behavior since x is uninitialized\n        \n    \n*   **Out-of-bounds Memory Access**: Accessing memory outside the boundaries of an array or buffer may result in undefined behavior.\n    \n        int arr[5];\n        int val = arr[5]; // Undefined behavior since the valid indices are 0 to 4\n        \n    \n*   **Null Pointer Dereference**: Dereferencing a null pointer may lead to undefined behavior.\n    \n        int *ptr = nullptr;\n        int val = *ptr; // Undefined behavior since ptr is a null pointer\n        \n    \n*   **Division by Zero**: Performing a division operation by zero is undefined behavior in C++.\n    \n        int x = 5;\n        int y = 0;\n        int z = x / y; // Undefined behavior since division by zero is not allowed\n        \n    \n\nIt is crucial to detect and fix the root cause of undefined behavior in your programs since it can lead to unpredictable results, data corruption, and security vulnerabilities. To mitigate undefined behavior, you can utilize tools like static code analyzers, dynamic analysis tools, and compiler options that help detect potential issues.",
+    "links": []
+  },
+  "YSWN7nS8vA9nMldSUrZRT": {
+    "title": "Argument Dependent Lookup (ADL)",
+    "description": "Argument Dependent Lookup (ADL) or Koenig Lookup is a mechanism in C++ that allows the compiler to search for the appropriate function to call based on the types of arguments provided. It is particularly helpful when using overloaded functions or operators in a namespace.\n\nADL allows the compiler to find functions in the same namespace as the arguments, even if the function is not declared at the point of use or within the namespace provided. This is especially useful when working with templates or generic programming.\n\nExample\n-------\n\nConsider the following example using a namespace and overloaded `operator<<()`:\n\n    namespace MyNamespace {\n        class MyClass {\n        public:\n            int value;\n        };\n    \n        std::ostream& operator<<(std::ostream& os, const MyClass& obj) {\n            os << \"MyClass: \" << obj.value;\n            return os;\n        }\n    }\n    \n    int main() {\n        MyNamespace::MyClass obj;\n        obj.value = 42;\n        using std::cout; // Required to use 'cout' without fully qualifying it.\n        cout << obj << std::endl; // ADL is used to find the correct overloaded 'operator<<'.\n    }\n    \n\nIn this example, when you call `cout << obj;` in `main()`, ADL is used to find the correct `operator<<()` in the `MyNamespace` namespace because the argument `obj` is of type `MyNamespace::MyClass`.",
+    "links": []
+  },
+  "Lt7ss59KZw9Jwqj234jm2": {
+    "title": "Name Mangling",
+    "description": "Name mangling, also known as name decoration, is a technique used by compilers to encode additional information about the scope, type, linkage, or other identifying information of an identifier (function names, variable names, etc.) within its name. The primary purpose of name mangling is to support function overloading, which allows multiple functions with the same name but different parameter lists to coexist in a single program.\n\nIn C++, the compiler generates a mangled name for each function and variable based on their scopes and types. The mangled name is usually formed by concatenating the original name, parameter types, and other information, often using a prefix or suffix.\n\nFor example, suppose you have the following function:\n\n    int add(int a, int b)\n    {\n        return a + b;\n    }\n    \n\nThe compiler might generate a mangled name such as `_Z3addii`, which encodes the function name `add` and its two `int` parameters.\n\nThe exact rules for name mangling are implementation and platform dependent. Different compilers may mangle names differently, which can lead to incompatibilities when attempting to link together object files or libraries compiled with different compilers.\n\nSome tools, such as c++filt (included in GCC and Clang), can be used to demangle a mangled name back to the original identifier, which can be useful when debugging or working with symbol tables.\n\n    $ echo \"_Z3addii\" | c++filt\n    add(int, int)\n    \n\nIn general, it is not necessary for you to understand the details of name mangling when writing code in C++, as the compiler handles it automatically. However, it can affect program behavior in some cases, such as when using external libraries or linking object files from different compilers.",
+    "links": []
+  },
+  "zKdlfZTRHwjtmRUGW9z9-": {
+    "title": "Macros",
+    "description": "Macros are preprocessing directives in C++ used by the preprocessor to perform text substitution. They are defined using the `#define` directive, followed by the macro name and the value to be substituted.\n\nMacros can be used to define constants, create function-like macros, or perform conditional compilation.\n\nConstant Macros\n---------------\n\nConstant macros are used to define symbolic constants for use in code. They do not use any memory and are replaced by the preprocessor before the compilation process.\n\nExample:\n\n    #define PI 3.14159\n    \n\nThis macro defines a symbolic constant `PI`. You can use it in your code as if it were a regular variable.\n\n    double circumference = 2 * PI * radius;\n    \n\nFunction-like Macros\n--------------------\n\nFunction-like macros are similar to regular functions. They take a list of arguments and perform text substitution.\n\nExample:\n\n    #define SQUARE(x) ((x) * (x))\n    \n\nThis macro defines a function-like macro `SQUARE` that calculates the square of a number.\n\n    int square_of_five = SQUARE(5); // expands to ((5) * (5))\n    \n\nConditional Compilation\n-----------------------\n\nMacros can be used for conditional compilation using the `#ifdef`, `#ifndef`, `#if`, `#else`, `#elif`, and `#endif` directives.\n\nExample:\n\n    #define DEBUG_MODE\n    \n    #ifdef DEBUG_MODE\n      // Code to be compiled only in debug mode\n    #else\n      // Code to be compiled only if DEBUG_MODE is not defined\n    #endif\n    \n\nThis example demonstrates how you can use macros to control the parts of code that are being compiled, depending on the presence or absence of a macro definition.",
+    "links": []
+  },
+  "DHdNBP7_ixjr6h-dIQ7g6": {
+    "title": "Standard Library + STL",
+    "description": "The C++ Standard Template Library (STL) is a collection of header files that provide several data structures, algorithms, and functions to simplify your C++ coding experience. The primary purpose of the STL is to save time and increase efficiency by providing a ready-to-use set of useful tools. The most commonly used features of the STL can be divided into three main categories: containers, algorithms, and iterators.\n\nContainers\n----------\n\nContainers are the data structures used for data storage and manipulation in C++. They are classified into four types: sequence containers, associative containers, unordered associative containers, and container adaptors.\n\n*   **Sequence Containers**: These are linear data structures that store elements in a sequential manner. Examples include:\n    \n    *   `std::vector`: A dynamic array that grows and shrinks at runtime.\n        \n            std::vector<int> my_vector;\n            \n        \n    *   `std::list`: A doubly linked list.\n        \n            std::list<int> my_list;\n            \n        \n    *   `std::deque`: A double-ended queue allowing insertion and deletion at both ends.\n        \n            std::deque<int> my_deque;\n            \n        \n*   **Associative Containers**: These containers store data in a sorted manner with unique keys. Examples include:\n    \n    *   `std::set`: A collection of unique elements sorted by keys.\n        \n            std::set<int> my_set;\n            \n        \n    *   `std::map`: A collection of key-value pairs sorted by keys.\n        \n            std::map<std::string, int> my_map;\n            \n        \n*   **Unordered Associative Containers**: These containers store data in an unordered manner using hash tables. Examples include:\n    \n    *   `std::unordered_set`: A collection of unique elements in no specific order.\n        \n            std::unordered_set<int> my_unordered_set;\n            \n        \n    *   `std::unordered_map`: A collection of key-value pairs in no specific order.\n        \n            std::unordered_map<std::string, int> my_unordered_map;\n            \n        \n*   **Container Adaptors**: These are containers based on other existing containers. Examples include:\n    \n    *   `std::stack`: A LIFO data structure based on deque or list.\n        \n            std::stack<int> my_stack;\n            \n        \n    *   `std::queue`: A FIFO data structure based on deque or list.\n        \n            std::queue<int> my_queue;\n            \n        \n    *   `std::priority_queue`: A sorted queue based on vector or deque.\n        \n            std::priority_queue<int> my_priority_queue;\n            \n        \n\nAlgorithms\n----------\n\nThe STL provides several generic algorithms that can be used to perform various operations on the data stored in containers. They are divided into five categories: non-modifying sequence algorithms, modifying sequence algorithms, sorting algorithms, sorted range algorithms, and numeric algorithms.\n\nSome examples include `std::find`, `std::replace`, `std::sort`, and `std::binary_search`.\n\nFor example, to sort a vector, you can use the following code:\n\n    std::vector<int> my_vec = {4, 2, 5, 1, 3};\n    std::sort(my_vec.begin(), my_vec.end());\n    \n\nIterators\n---------\n\nIterators are a fundamental concept in the STL, as they provide a unified way to access elements in containers. Iterators can be thought of as an advanced form of pointers.\n\nEach container has its own iterator type, which can be used to traverse elements and modify values. The most common iterator operations are `begin()` and `end()` for getting iterators pointing to the first and one past the last element of a container, respectively.\n\nFor example, to iterate through a vector and print its elements, you can use the following code:\n\n    std::vector<int> my_vec = {1, 2, 3, 4, 5};\n    for (auto it = my_vec.begin(); it != my_vec.end(); ++it) {\n        std::cout << *it << \" \";\n    }\n    \n\nThis is just a brief overview of the C++ Standard Template Library. There are many other features and functions available in the STL, and familiarizing yourself with them is crucial for efficient C++ programming.",
+    "links": []
+  },
+  "Ebu8gzbyyXEeJryeE0SpG": {
+    "title": "Iterators",
+    "description": "Iterators are objects in the C++ Standard Library (`STL`) that help us traverse containers like arrays, lists, and vectors. Essentially, they act as a bridge between container classes and algorithms. Iterators behave similar to pointers but provide a more generalized and abstract way of accessing elements in a container.\n\nThere are different types of iterators which you would encounter depending on their use cases:\n\n*   **Input Iterator**: Used to read elements in a container only once, in a forward direction. They cannot modify elements.\n\nExample:\n\n    std::vector<int> nums = {1, 2, 3, 4};\n    std::istream_iterator<int> input(std::cin);\n    std::copy(input, std::istream_iterator<int>(), std::back_inserter(nums));\n    \n\n*   **Output Iterator**: Used to write elements in a container only once, in a forward direction. They cannot re-write elements.\n\nExample:\n\n    std::vector<int> nums = {1, 2, 3, 4};\n    std::ostream_iterator<int> output(std::cout, \", \");\n    std::copy(nums.begin(), nums.end(), output);\n    \n\n*   **Forward Iterator**: Similar to input iterators but can be used for multiple passes over the elements in a container. They cannot move backward.\n\nExample:\n\n    std::forward_list<int> nums = {1, 2, 3, 4};\n    std::forward_list<int>::iterator itr = nums.begin();\n    while (itr != nums.end()) {\n        std::cout << *itr << \" \";\n        ++itr;\n    }\n    \n\n**Reverse Iterator**: Similar to input iterators but can be used for multiple passes over the elements in a container. They cannot move forward.\n\nExample:\n\n    std::list<int> nums = {1, 2, 3, 4};\n    std::list<int>::reverse_iterator itr = nums.rbegin();\n    while (itr != nums.rend()) {\n        std::cout << *itr << \" \";\n        ++itr;\n    }\n    \n\n*   **Bidirectional Iterator**: These iterators offer the ability to move both forward and backward in a container. List and set containers have bi-directional iterators.\n\nExample:\n\n    std::list<int> nums = {1, 2, 3, 4};\n    std::list<int>::iterator itr;\n    for (itr = nums.begin(); itr != nums.end(); ++itr) {\n        std::cout << *itr << \" \";\n    }\n    for (--itr; itr != nums.begin(); --itr) {\n        std::cout << *itr << \" \";\n    }\n    \n\n*   **Random Access Iterator**: These iterators provide the most flexible ways to access elements in a container. They can move forwards, backwards, jump directly to other elements, and access elements at a given index.\n\nExample:\n\n    std::vector<int> nums = {1, 2, 3, 4};\n    std::vector<int>::iterator itr;\n    for (itr = nums.begin(); itr != nums.end(); ++itr) {\n        std::cout << *itr << \" \";\n    }\n    for (itr -= 1; itr != nums.begin() - 1; --itr) {\n        std::cout << *itr << \" \";\n    }\n    \n\nFor most cases, you would want to start with the `auto` keyword and the appropriate container methods (like `begin()` and `end()`) to work with iterators.\n\nExample:\n\n    std::vector<int> nums = {1, 2, 3, 4};\n    for (auto itr = nums.begin(); itr != nums.end(); ++itr) {\n        std::cout << *itr << \" \";\n    }\n    \n\nWhen working with algorithms, remember that the C++ Standard Library provides various algorithms that already utilize iterators for tasks like searching, sorting, and manipulating elements.",
+    "links": []
+  },
+  "VeVxZ230xkesQsIDig8zQ": {
+    "title": "iostream",
+    "description": "`iostream` is a header in the C++ Standard Library that provides functionality for basic input and output (I/O) operations. The I/O streams facilitate communication between your program and various sources, such as the console, files, or other programs.\n\n`iostream` includes the following classes:\n\n*   `istream`: for input operations from an input source.\n*   `ostream`: for output operations to an output target.\n*   `iostream`: a combination of `istream` and `ostream` for both input and output operations.\n\nThese classes inherit from base classes `ios` and `ios_base`.\n\nAdditionally, `iostream` defines several objects that are instances of these classes and represent the standard input and output streams:\n\n*   `cin`: an `istream` object to read from the standard input, typically corresponding to the keyboard.\n*   `cout`: an `ostream` object to write to the standard output, typically the console.\n*   `cerr`: an `ostream` object to write to the standard error output, typically used for displaying error messages.\n*   `clog`: an `ostream` object, similar to `cerr`, but its output can be buffered.\n\nHere are some code examples on using `iostream` for input and output operations:\n\n    #include <iostream>\n    \n    int main() {\n        int a;\n        std::cout << \"Enter a number: \";\n        std::cin >> a;\n        std::cout << \"You entered: \" << a << std::endl;\n        return 0;\n    }\n    \n\n    #include <iostream>\n    \n    int main() {\n        std::cerr << \"An error occurred.\" << std::endl;\n        std::clog << \"Logging information.\" << std::endl;\n        return 0;\n    }\n    \n\nRemember to include the `iostream` header when using these features:\n\n    #include <iostream>",
+    "links": []
+  },
+  "whyj6Z4RXFsVQYRfYYn7B": {
+    "title": "Algorithms",
+    "description": "The Standard Template Library (STL) in C++ provides a collection of generic algorithms that are designed to work with various container classes. These algorithms are implemented as functions and can be applied to different data structures, such as arrays, vectors, lists, and others. The primary header file for algorithms is `<algorithm>`.\n\nKey Concepts\n------------\n\nSorting\n-------\n\nSorting refers to arranging a sequence of elements in a specific order. The STL provides several sorting algorithms, such as `std::sort`, `std::stable_sort`, and `std::partial_sort`.\n\n### std::sort\n\n`std::sort` is used to sort a range of elements \\[first, last) in non-descending order (by default). You can also use custom comparison functions or lambda expressions to change the sorting order.\n\nExample:\n\n    #include <algorithm>\n    #include <vector>\n    #include <iostream>\n    \n    int main() {\n        std::vector<int> nums = {10, 9, 8, 7, 6, 5};\n        std::sort(nums.begin(), nums.end());\n    \n        for (int num : nums) {\n            std::cout << num << ' ';\n        }\n        // Output: 5 6 7 8 9 10\n    }\n    \n\nSearching\n---------\n\nSearching refers to finding if a particular element is present within a given range of elements. STL provides various searching algorithms, such as `std::find`, `std::binary_search`, and `std::find_if`.\n\n### std::find\n\n`std::find` is used to find the iterator of the first occurrence of a given value within the range \\[first, last).\n\nExample:\n\n    #include <algorithm>\n    #include <vector>\n    #include <iostream>\n    \n    int main() {\n        std::vector<int> nums = {5, 6, 7, 8, 9, 10};\n        auto it = std::find(nums.begin(), nums.end(), 9);\n    \n        if (it != nums.end()) {\n            std::cout << \"Found 9 at position: \" << (it - nums.begin());\n        } else {\n            std::cout << \"9 not found\";\n        }\n        // Output: Found 9 at position: 4\n    }\n    \n\nModifying Sequences\n-------------------\n\nThe STL also provides algorithms for modifying sequences, such as `std::remove`, `std::replace`, and `std::unique`.\n\n### std::remove\n\n`std::remove` is used to remove all instances of a value from a container within the given range \\[first, last). Note that the function does not resize the container after removing elements.\n\nExample:\n\n    #include <algorithm>\n    #include <vector>\n    #include <iostream>\n    \n    int main() {\n        std::vector<int> nums = {5, 6, 7, 6, 8, 6, 9, 6, 10};\n        nums.erase(std::remove(nums.begin(), nums.end(), 6), nums.end());\n    \n        for (int num : nums) {\n            std::cout << num << ' ';\n        }\n        // Output: 5 7 8 9 10\n    }\n    \n\nSummary\n-------\n\nSTL algorithms in C++ provide a set of useful functions for key operations such as sorting, searching, and modifying sequences. The algorithms can be used with a variety of container classes, making them highly versatile and an essential part of C++ programming.",
+    "links": []
+  },
+  "yGvE6eHKlPMBB6rde0llR": {
+    "title": "Date / Time",
+    "description": "In C++, you can work with dates and times using the `chrono` library, which is part of the Standard Library (STL). The `chrono` library provides various data types and functions to represent and manipulate time durations, time points, and clocks.\n\nDuration\n--------\n\nA `duration` represents a span of time, which can be expressed in various units such as seconds, minutes, hours, etc. To create a duration, use the `std::chrono::duration` template class. Common predefined duration types are:\n\n*   `std::chrono::seconds`\n*   `std::chrono::minutes`\n*   `std::chrono::hours`\n\n**Example:**\n\n    #include <iostream>\n    #include <chrono>\n    \n    int main() {\n        std::chrono::seconds sec(5);\n        std::chrono::minutes min(2);\n        std::chrono::hours hr(1);\n        return 0;\n    }\n    \n\nTime Point\n----------\n\nA `time_point` represents a specific point in time. It is usually created using a combination of duration and a clock. In C++, there are three clock types provided by the `chrono` library:\n\n*   `std::chrono::system_clock`: Represents the system-wide real time wall clock.\n*   `std::chrono::steady_clock`: Represents a monotonic clock that is guaranteed to never be adjusted.\n*   `std::chrono::high_resolution_clock`: Represents the clock with the shortest tick period.\n\n**Example:**\n\n    #include <iostream>\n    #include <chrono>\n    \n    int main() {\n        std::chrono::system_clock::time_point tp = std::chrono::system_clock::now();\n        return 0;\n    }\n    \n\nClock\n-----\n\nA clock provides access to the current time. It consists of the following elements:\n\n*   `time_point`: A specific point in time.\n*   `duration`: The time duration between two time points.\n*   `now()`: A static function that returns the current time point.\n\n**Example:**\n\n    #include <iostream>\n    #include <chrono>\n    \n    int main() {\n        // Get the current time_point using system_clock\n        std::chrono::system_clock::time_point now = std::chrono::system_clock::now();\n    \n        // Get the time_point 1 hour from now\n        std::chrono::system_clock::time_point one_hour_from_now = now + std::chrono::hours(1);\n        return 0;\n    }\n    \n\nConverting Time Points to Calendar Time\n---------------------------------------\n\nTo convert a time point to calendar representation, you can use the `std::chrono::system_clock::to_time_t` function.\n\n**Example:**\n\n    #include <iostream>\n    #include <chrono>\n    #include <ctime>\n    \n    int main() {\n        std::chrono::system_clock::time_point now = std::chrono::system_clock::now();\n        std::time_t now_c = std::chrono::system_clock::to_time_t(now);\n        std::cout << \"Current time: \" << std::ctime(&now_c) << std::endl;\n        return 0;\n    }\n    \n\nThis summarizes the basic functionality of working with date and time in C++ using the `chrono` library. You can find more advanced features, such as casting durations and time arithmetic, in the [C++ reference](https://en.cppreference.com/w/cpp/chrono).",
+    "links": []
+  },
+  "OXQUPqxzs1-giAACwl3X1": {
+    "title": "Multithreading",
+    "description": "Multithreading is the concurrent execution of multiple threads within a single process or program. It improves the performance and efficiency of an application by allowing multiple tasks to be executed in parallel.\n\nIn C++, multithreading support is available through the `thread` library introduced in the C++11 standard.\n\nBasic Thread Creation\n---------------------\n\nTo create a new thread, include the `<thread>` header file and create an instance of `std::thread` that takes a function as an argument. The function will be executed in a new thread.\n\n    #include <iostream>\n    #include <thread>\n    \n    void my_function() {\n        std::cout << \"This function is executing in a separate thread\" << std::endl;\n    }\n    \n    int main() {\n        std::thread t(my_function);\n        t.join(); // waits for the thread to complete\n        return 0;\n    }\n    \n\nThread with Arguments\n---------------------\n\nYou can pass arguments to the thread function by providing them as additional arguments to the `std::thread` constructor.\n\n    #include <iostream>\n    #include <thread>\n    \n    void print_sum(int a, int b) {\n        std::cout << \"The sum is: \" << a + b << std::endl;\n    }\n    \n    int main() {\n        std::thread t(print_sum, 3, 5);\n        t.join();\n        return 0;\n    }\n    \n\nMutex and Locks\n---------------\n\nWhen multiple threads access shared resources, there is a possibility of a data race. To avoid this, use mutex and locks to synchronize shared resource access.\n\n    #include <iostream>\n    #include <mutex>\n    #include <thread>\n    \n    std::mutex mtx;\n    \n    void print_block(int n, char c) {\n        {\n            std::unique_lock<std::mutex> locker(mtx);\n            for (int i = 0; i < n; ++i) {\n                std::cout << c;\n            }\n            std::cout << std::endl;\n        }\n    }\n    \n    int main() {\n        std::thread t1(print_block, 50, '*');\n        std::thread t2(print_block, 50, '$');\n    \n        t1.join();\n        t2.join();\n    \n        return 0;\n    }\n    \n\nThis short introduction should help you get started with basic multithreading techniques in C++. There is a lot more to learn, such as thread pools, condition variables, and atomic operations for advanced synchronization and performance tuning.",
+    "links": []
+  },
+  "1pydf-SR0QUfVNuBEyvzc": {
+    "title": "Containers",
+    "description": "C++ Containers are a part of the Standard Template Library (STL) that provide data structures to store and organize data. There are several types of containers, each with its own characteristics and use cases. Here, we discuss some of the commonly used containers:\n\n1\\. Vector\n----------\n\nVectors are dynamic arrays that can resize themselves as needed. They store elements in a contiguous memory location, allowing fast random access using indices.\n\nExample\n-------\n\n    #include <iostream>\n    #include <vector>\n    \n    int main() {\n        std::vector<int> vec = {1, 2, 3, 4, 5};\n    \n        vec.push_back(6); // Add an element to the end\n    \n        std::cout << \"Vector contains:\";\n        for (int x : vec) {\n            std::cout << ' ' << x;\n        }\n        std::cout << std::endl;\n    }\n    \n\n2\\. List\n--------\n\nA list is a doubly-linked list that allows elements to be inserted or removed from any position in constant time. It does not support random access. Lists are better than vectors for scenarios where you need to insert or remove elements in the middle frequently.\n\nExample\n-------\n\n    #include <iostream>\n    #include <list>\n    \n    int main() {\n        std::list<int> lst = {1, 2, 3, 4, 5};\n    \n        lst.push_back(6); // Add an element to the end\n        \n        std::cout << \"List contains:\";\n        for (int x : lst) {\n            std::cout << ' ' << x;\n        }\n        std::cout << std::endl;\n    }\n    \n\n3\\. Map\n-------\n\nA map is an associative container that stores key-value pairs. It supports the retrieval of values based on their keys. The keys are sorted in ascending order by default.\n\nExample\n-------\n\n    #include <iostream>\n    #include <map>\n    \n    int main() {\n        std::map<std::string, int> m;\n    \n        m[\"one\"] = 1;\n        m[\"two\"] = 2;\n    \n        std::cout << \"Map contains:\" << std::endl;\n        for (const auto &pair : m) {\n            std::cout << pair.first << \": \" << pair.second << std::endl;\n        }\n    }\n    \n\n4\\. Unordered\\_map\n------------------\n\nSimilar to a map, an unordered map stores key-value pairs, but it is implemented using a hash table. This means unordered\\_map has faster average-case performance compared to map, since it does not maintain sorted order. However, worst-case performance can be worse than map.\n\nExample\n-------\n\n    #include <iostream>\n    #include <unordered_map>\n    \n    int main() {\n        std::unordered_map<std::string, int> um;\n    \n        um[\"one\"] = 1;\n        um[\"two\"] = 2;\n    \n        std::cout << \"Unordered map contains:\" << std::endl;\n        for (const auto &pair : um) {\n            std::cout << pair.first << \": \" << pair.second << std::endl;\n        }\n    }\n    \n\nThese are just a few examples of C++ containers. There are other container types, such as `set`, `multiset`, `deque`, `stack`, `queue`, and `priority_queue`. Each container has its own use cases and unique characteristics. Learning about these containers and when to use them can greatly improve your efficiency and effectiveness in using C++.",
+    "links": []
+  },
+  "-6AOrbuOE7DJCmxlcgCay": {
+    "title": "Templates",
+    "description": "Templates in C++ are a powerful feature that allows you to write generic code, meaning that you can write a single function or class that can work with different data types. This means you do not need to write separate functions or classes for each data type you want to work with.\n\nTemplate Functions\n------------------\n\nTo create a template function, you use the `template` keyword followed by the type parameters or placeholders enclosed in angle brackets (`< >`). Then, you define your function as you normally would, using the type parameters to specify the generic types.\n\nHere's an example of a simple template function that takes two arguments and returns the larger of the two:\n\n    template <typename T>\n    T max(T a, T b) {\n        return (a > b) ? a : b;\n    }\n    \n\nTo use this function, you can either explicitly specify the type parameter:\n\n    int result = max<int>(10, 20);\n    \n\nOr, you can let the compiler deduce the type for you:\n\n    int result = max(10, 20);\n    \n\nTemplate Classes\n----------------\n\nSimilarly, you can create template classes using the `template` keyword. Here's an example of a simple template class that represents a pair of values:\n\n    template <typename T1, typename T2>\n    class Pair {\n    public:\n        T1 first;\n        T2 second;\n    \n        Pair(T1 first, T2 second) : first(first), second(second) {}\n    };\n    \n\nTo use this class, you need to specify the type parameters when creating an object:\n\n    Pair<int, std::string> pair(1, \"Hello\");\n    \n\nTemplate Specialization\n-----------------------\n\nSometimes, you may need special behavior for a specific data type. In this case, you can use template specialization. For example, you can specialize the `Pair` class for a specific type, like `char`:\n\n    template <>\n    class Pair<char, char> {\n    public:\n        char first;\n        char second;\n    \n        Pair(char first, char second) : first(first), second(second) {\n            // Special behavior for characters (e.g., convert to uppercase)\n            this->first = std::toupper(this->first);\n            this->second = std::toupper(this->second);\n        }\n    };\n    \n\nNow, when you create a `Pair` object with `char` template arguments, the specialized behavior will be used:\n\n    Pair<char, char> charPair('a', 'b');\n    \n\nIn summary, templates in C++ allow you to write generic functions and classes that can work with different data types, reducing code duplication and making your code more flexible and reusable.",
+    "links": []
+  },
+  "w4EIf58KP-Pq-yc0HlGxc": {
+    "title": "Variadic Templates",
+    "description": "Variadic templates are a feature in C++11 that allows you to define a template with a variable number of arguments. This is especially useful when you need to write a function or class that can accept different numbers and types of arguments.\n\nSyntax\n------\n\nThe syntax for variadic templates is very simple. To define a variadic template, use the `...` (ellipsis) notation:\n\n    template <typename... Args>\n    \n\nThis notation represents a parameter pack, which can contain zero or more arguments. You can use this parameter pack as a variable list of template parameters in your template definition.\n\nExamples\n--------\n\n### Summing Multiple Arguments Using Variadic Templates\n\n    #include <iostream>\n    \n    // Base case for recursion\n    template <typename T>\n    T sum(T t) {\n      return t;\n    }\n    \n    // Variadic template\n    template <typename T, typename... Args>\n    T sum(T t, Args... args) {\n      return t + sum(args...);\n    }\n    \n    int main() {\n      int result = sum(1, 2, 3, 4, 5);  // expands to 1 + 2 + 3 + 4 + 5\n      std::cout << \"The sum is: \" << result << std::endl;\n    \n      return 0;\n    }\n    \n\n### Tuple Class Using Variadic Templates\n\n    template <typename... Types>\n    class Tuple;\n    \n    // Base case: empty tuple\n    template <>\n    class Tuple<> {};\n    \n    // Recursive case: Tuple with one or more elements\n    template <typename Head, typename... Tail>\n    class Tuple<Head, Tail...> : public Tuple<Tail...> {\n     public:\n      Tuple(Head head, Tail... tail) : Tuple<Tail...>(tail...), head_(head) {}\n    \n      Head head() const { return head_; }\n    \n     private:\n      Head head_;\n    };\n    \n    int main() {\n      Tuple<int, float, double> tuple(1, 2.0f, 3.0);\n      std::cout << \"First element: \" << tuple.head() << std::endl;\n      return 0;\n    }\n    \n\nPlease note that the examples shown are for educational purposes and might not be the most efficient or production-ready implementations. With C++17 and onward, there are even more concise ways to handle variadic templates, like using fold expressions.",
+    "links": []
+  },
+  "sObOuccY0PDeGG-9GrFDF": {
+    "title": "Template Specialization",
+    "description": "Template specialization is a way to customize or modify the behavior of a template for a specific type or a set of types. This can be useful when you want to optimize the behavior or provide specific implementation for a certain type, without affecting the overall behavior of the template for other types.\n\nThere are two main ways you can specialize a template:\n\n*   **Full specialization:** This occurs when you provide a specific implementation for a specific type or set of types.\n    \n*   **Partial specialization:** This occurs when you provide a more general implementation for a subset of types that match a certain pattern or condition.\n    \n\nFull Template Specialization\n----------------------------\n\nFull specialization is used when you want to create a separate implementation of a template for a specific type. To do this, you need to use keyword `template<>` followed by the function template with the desired specialized type.\n\nHere is an example:\n\n    #include <iostream>\n    \n    template <typename T>\n    void printData(const T& data) {\n        std::cout << \"General template: \" << data << std::endl;\n    }\n    \n    template <>\n    void printData(const char* const & data) {\n        std::cout << \"Specialized template for const char*: \" << data << std::endl;\n    }\n    \n    int main() {\n        int a = 5;\n        const char* str = \"Hello, world!\";\n        printData(a); // General template: 5\n        printData(str); // Specialized template for const char*: Hello, world!\n    }\n    \n\nPartial Template Specialization\n-------------------------------\n\nPartial specialization is used when you want to create a separate implementation of a template for a subset of types that match a certain pattern or condition.\n\nHere is an example of how you can partially specialize a template class:\n\n    #include <iostream>\n    \n    template <typename K, typename V>\n    class MyPair {\n    public:\n        MyPair(K k, V v) : key(k), value(v) {}\n    \n        void print() const {\n            std::cout << \"General template: key = \" << key << \", value = \" << value << std::endl;\n        }\n    \n    private:\n        K key;\n        V value;\n    };\n    \n    template <typename T>\n    class MyPair<T, int> {\n    public:\n        MyPair(T k, int v) : key(k), value(v) {}\n    \n        void print() const {\n            std::cout << \"Partial specialization for int values: key = \" << key\n                      << \", value = \" << value << std::endl;\n        }\n    \n    private:\n        T key;\n        int value;\n    };\n    \n    int main() {\n        MyPair<double, std::string> p1(3.2, \"example\");\n        MyPair<char, int> p2('A', 65);\n        p1.print(); // General template: key = 3.2, value = example\n        p2.print(); // Partial specialization for int values: key = A, value = 65\n    }\n    \n\nIn this example, the `MyPair` template class is partially specialized to provide a different behavior when the second template parameter is of type `int`.",
+    "links": []
+  },
+  "WptReUOwVth3C9-AVmMHF": {
+    "title": "Type Traits",
+    "description": "Type Traits are a set of template classes in C++ that help in getting the information about the type's properties, behavior, or characteristics. They can be found in the `<type_traits>` header file. By using Type Traits, you can adapt your code depending on the properties of a given type, or even enforce specific properties for your type parameters in template code.\n\nSome common type traits are:\n\n*   `std::is_pointer`: Checks if a given type is a pointer type.\n*   `std::is_arithmetic`: Checks if the given type is an arithmetic type.\n*   `std::is_function`: Checks if the given type is a function type.\n*   `std::decay`: Applies decltype rules to the input type ( strips references, cv-qualifiers, etc. ).\n\nUsage\n-----\n\nYou can use type traits like this:\n\n    #include <iostream>\n    #include <type_traits>\n    \n    int main() {\n        int a;\n        int* a_ptr = &a;\n    \n        std::cout << \"Is 'a' a pointer? \" << std::boolalpha << std::is_pointer<decltype(a)>::value << std::endl;\n        std::cout << \"Is 'a_ptr' a pointer? \" << std::boolalpha << std::is_pointer<decltype(a_ptr)>::value << std::endl;\n    \n        return 0;\n    }\n    \n\nComposing Type Traits\n---------------------\n\nSome type traits help you compose other traits or modify them, such as:\n\n*   `std::conditional`: If a given boolean value is true, use type A; otherwise, use type B.\n*   `std::enable_if`: If a given boolean value is true, use type A; otherwise, there is no nested type.\n\n    #include <iostream>\n    #include <type_traits>\n    \n    template <typename T>\n    typename std::enable_if<std::is_arithmetic<T>::value, T>::type find_max(T a, T b) {\n        return a > b ? a : b;\n    }\n    \n    int main() {\n        int max = find_max(10, 20);\n        std::cout << \"Max: \" << max << std::endl;\n    \n        return 0;\n    }\n    \n\nIn this example, the `find_max` template function is only defined when T is an arithmetic type (e.g., int, float, double). This prevents unintended usage of the `find_max` function with non-arithmetic types.\n\nOverall, type traits are a powerful tool to create more generic, extensible, and efficient C++ code, providing a way to query and adapt your code based on type characteristics.",
+    "links": []
+  },
+  "3C5UfejDX-1Z8ZF6C53xD": {
+    "title": "SFINAE",
+    "description": "SFINAE is a principle in C++ template metaprogramming that allows the compiler to select the appropriate function or class when a specific template specialization fails during substitution. The term \"substitution failure\" refers to the process where the compiler tries to substitute template arguments into a function template or class template. If the substitution causes an error, the compiler won't consider that specific specialization as a candidate and will continue searching for a valid one.\n\nThe key idea behind SFINAE is that if a substitution error occurs, it is silently ignored, and the compiler continues to explore other template specializations or overloads. This allows you to write more flexible and generic code, as it enables you to have multiple specializations for different scenarios.\n\nCode Example\n------------\n\nHere's an example that demonstrates SFINAE in action:\n\n    #include <iostream>\n    #include <type_traits>\n    \n    template <typename T, typename = void>\n    struct foo_impl {\n        void operator()(T t) {\n            std::cout << \"Called when T is not arithmetic\" << std::endl;\n        }\n    };\n    \n    template <typename T>\n    struct foo_impl<T, std::enable_if_t<std::is_arithmetic<T>::value>> {\n        void operator()(T t) {\n            std::cout << \"Called when T is arithmetic\" << std::endl;\n        }\n    };\n    \n    template <typename T>\n    void foo(T t) {\n        foo_impl<T>()(t);\n    }\n    \n    int main() {\n        int a = 5;\n        foo(a); // output: Called when T is arithmetic\n    \n        std::string s = \"example\";\n        foo(s); // output: Called when T is not arithmetic\n    }\n    \n\nIn this example, we define two `foo_impl` functions are specialized based on the boolean value of `std::is_arithmetic<T>`. The first one is enabled when `T` is an arithmetic type, while the second one is enabled when `T` is not an arithmetic type. The `foo` function then calls the appropriate `foo_impl` specialization based on the result of the type trait.\n\nWhen calling `foo(a)` with an integer, the first specialization is selected, and when calling `foo(s)` with a string, the second specialization is selected. If there is no valid specialization, the code would fail to compile.",
+    "links": []
+  },
+  "6hTcmJwNnQstbWWzNCfTe": {
+    "title": "Full Template Specialization",
+    "description": "Full template specialization allows you to provide a specific implementation, or behavior, for a template when used with a certain set of type parameters. It is useful when you want to handle special cases or optimize your code for specific types.\n\nSyntax\n------\n\nTo create a full specialization of a template, you need to define the specific type for which the specialization should happen. The syntax looks as follows:\n\n    template <> //Indicates that this is a specialization\n    className<specificType> //The specialized class for the specific type\n    \n\nExample\n-------\n\nConsider the following example to demonstrate full template specialization:\n\n    // Generic template\n    template <typename T>\n    class MyContainer {\n    public:\n        void print() {\n            std::cout << \"Generic container.\" << std::endl;\n        }\n    };\n    \n    // Full template specialization for int\n    template <>\n    class MyContainer<int> {\n    public:\n        void print() {\n            std::cout << \"Container for integers.\" << std::endl;\n        }\n    };\n    \n    int main() {\n        MyContainer<double> d;\n        MyContainer<int> i;\n    \n        d.print(); // Output: Generic container.\n        i.print(); // Output: Container for integers.\n    \n        return 0;\n    }\n    \n\nIn this example, we defined a generic `MyContainer` template class along with a full specialization for `int` type. When we use the container with the `int` type, the specialized implementation's `print` method is called. For other types, the generic template implementation will be used.",
+    "links": []
+  },
+  "1NYJtbdcdOB4-vIrnq4yX": {
+    "title": "Partial Template Specialization",
+    "description": "Partial template specialization is a concept in C++ templates, which allows you to specialize a template for a subset of its possible type arguments. It is particularly useful when you want to provide a customized implementation for a particular group of types without having to define separate specializations for all types in that group.\n\nPartial template specialization is achieved by providing a specialization of a template with a new set of template parameters. This new template will be chosen when the compiler deduces the types that match the partial specialization.\n\nHere is a code example that demonstrates partial template specialization:\n\n    // Primary template\n    template <typename T>\n    struct MyTemplate {\n        static const char* name() {\n            return \"General case\";\n        }\n    };\n    \n    // Partial specialization for pointers\n    template <typename T>\n    struct MyTemplate<T*> {\n        static const char* name() {\n            return \"Partial specialization for pointers\";\n        }\n    };\n    \n    // Full specialization for int\n    template <>\n    struct MyTemplate<int> {\n        static const char* name() {\n            return \"Full specialization for int\";\n        }\n    };\n    \n    int main() {\n        MyTemplate<double> t1; // General case\n        MyTemplate<double*> t2; // Partial specialization for pointers\n        MyTemplate<int> t3; // Full specialization for int\n    \n        std::cout << t1.name() << std::endl;\n        std::cout << t2.name() << std::endl;\n        std::cout << t3.name() << std::endl;\n    \n        return 0;\n    }\n    \n\nIn the example above, we have defined a primary template `MyTemplate` with a single type parameter `T`. We then provide a partial template specialization for pointer types by specifying `MyTemplate<T*>`. This means that the partial specialization will be chosen when the type argument is a pointer type.\n\nLastly, we provide a full specialization for the `int` type by specifying `MyTemplate<int>`. This will be chosen when the type argument is `int`.\n\nWhen running this example, the output will be:\n\n    General case\n    Partial specialization for pointers\n    Full specialization for int\n    \n\nThis demonstrates that the partial specialization works as expected, and is chosen for pointer types, while the full specialization is chosen for the `int` type.",
+    "links": []
+  },
+  "fb3bnfKXjSIjPAk4b95lg": {
+    "title": "Idioms",
+    "description": "C++ idioms are well-established patterns or techniques that are commonly used in C++ programming to achieve a specific outcome. They help make code efficient, maintainable, and less error-prone. Here are some of the common C++ idioms:\n\n1\\. Resource Acquisition is Initialization (RAII)\n-------------------------------------------------\n\nThis idiom ensures that resources are always properly acquired and released by tying their lifetime to the lifetime of an object. When the object gets created, it acquires the resources and when it gets destroyed, it releases them.\n\n    class Resource {\n    public:\n        Resource() { /* Acquire resource */ }\n        ~Resource() { /* Release resource */ }\n    };\n    \n    void function() {\n        Resource r; // Resource is acquired\n        // ...\n    } // Resource is released when r goes out of scope\n    \n\n2\\. Rule of Three\n-----------------\n\nIf a class defines any one of the following, it should define all three: copy constructor, copy assignment operator, and destructor.\n\n    class MyClass {\n    public:\n        MyClass();\n        MyClass(const MyClass& other); // Copy constructor\n        MyClass& operator=(const MyClass& other); // Copy assignment operator\n        ~MyClass(); // Destructor\n    };\n    \n\n3\\. Rule of Five\n----------------\n\nWith C++11, the rule of three was extended to five, covering move constructor and move assignment operator.\n\n    class MyClass {\n    public:\n        MyClass();\n        MyClass(const MyClass& other); // Copy constructor\n        MyClass(MyClass&& other); // Move constructor\n        MyClass& operator=(const MyClass& other); // Copy assignment operator\n        MyClass& operator=(MyClass&& other); // Move assignment operator\n        ~MyClass(); // Destructor\n    };\n    \n\n4\\. PImpl (Pointer to Implementation) Idiom\n-------------------------------------------\n\nThis idiom is used to separate the implementation details of a class from its interface, resulting in faster compile times and the ability to change implementation without affecting clients.\n\n    // header file\n    class MyClass {\n    public:\n        MyClass();\n        ~MyClass();\n        void someMethod();\n    \n    private:\n        class Impl;\n        Impl* pImpl;\n    };\n    \n    // implementation file\n    class MyClass::Impl {\n    public:\n        void someMethod() { /* Implementation */ }\n    };\n    \n    MyClass::MyClass() : pImpl(new Impl()) {}\n    MyClass::~MyClass() { delete pImpl; }\n    void MyClass::someMethod() { pImpl->someMethod(); }\n    \n\n5\\. Non-Virtual Interface (NVI)\n-------------------------------\n\nThis enforces a fixed public interface and allows subclasses to only override specific private or protected virtual methods.\n\n    class Base {\n    public:\n        void publicMethod() {\n            // Common behavior\n            privateMethod(); // Calls overridden implementation\n        }\n    \n    protected:\n        virtual void privateMethod() = 0; // Pure virtual method\n    };\n    \n    class Derived : public Base {\n    protected:\n        virtual void privateMethod() override {\n            // Derived implementation\n        }\n    };\n    \n\nThese are just a few examples of the many idioms in C++ programming. They can provide guidance when designing and implementing your code, but it's essential to understand the underlying concepts to adapt them to different situations.",
+    "links": []
+  },
+  "xjUaIp8gGxkN-cp8emJ2M": {
+    "title": "Non-Copyable / Non-Moveable",
+    "description": "The non-copyable idiom is a C++ design pattern that prevents objects from being copied or assigned. It's usually applied to classes that manage resources, like file handles or network sockets, where copying the object could cause issues like resource leaks or double deletions.\n\nTo make a class non-copyable, you need to delete the copy constructor and the copy assignment operator. This can be done explicitly in the class declaration, making it clear to other programmers that copying is not allowed.\n\nHere's an example of how to apply the non-copyable idiom to a class:\n\n    class NonCopyable {\n    public:\n      NonCopyable() = default;\n      ~NonCopyable() = default;\n    \n      // Delete the copy constructor\n      NonCopyable(const NonCopyable&) = delete;\n    \n      // Delete the copy assignment operator\n      NonCopyable& operator=(const NonCopyable&) = delete;\n    };\n    \n\nTo use the idiom, simply inherit from the `NonCopyable` class:\n\n    class MyClass : private NonCopyable {\n      // MyClass is now non-copyable\n    };\n    \n\nThis ensures that any attempt to copy or assign objects of `MyClass` will result in a compilation error, thus preventing unwanted behavior.",
+    "links": []
+  },
+  "YvmjrZSAOmjhVPo05MJqN": {
+    "title": "Erase-Remove",
+    "description": "The erase-remove idiom is a common C++ technique to efficiently remove elements from a container, particularly from standard sequence containers like `std::vector`, `std::list`, and `std::deque`. It leverages the standard library algorithms `std::remove` (or `std::remove_if`) and the member function `erase()`.\n\nThe idiom consists of two steps:\n\n*   `std::remove` (or `std::remove_if`) moves the elements to be removed towards the end of the container and returns an iterator pointing to the first element to remove.\n*   `container.erase()` removes the elements from the container using the iterator obtained in the previous step.\n\nHere's an example:\n\n    #include <algorithm>\n    #include <vector>\n    #include <iostream>\n    \n    int main() {\n        std::vector<int> numbers = {1, 3, 2, 4, 3, 5, 3};\n        \n        // Remove all occurrences of 3 from the vector.\n        numbers.erase(std::remove(numbers.begin(), numbers.end(), 3), numbers.end());\n    \n        for (int number : numbers) {\n            std::cout << number << \" \";\n        }\n    \n        return 0;\n    }\n    \n\nOutput:\n\n    1 2 4 5\n    \n\nIn this example, we used the `std::remove` algorithm to remove all occurrences of the number 3 from the `std::vector<int> numbers`. After the removal, the vector contains only 1, 2, 4, and 5, as the output shows.",
+    "links": []
+  },
+  "lxAzI42jQdaofzQ5MXebG": {
+    "title": "Copy and Swap",
+    "description": "Copy-swap is a C++ idiom that leverages the copy constructor and swap function to create an assignment operator. It follows a simple, yet powerful paradigm: create a temporary copy of the right-hand side object, and swap its contents with the left-hand side object.\n\nHere's a brief summary:\n\n*   **Copy**: Create a local copy of the right-hand side object. This step leverages the copy constructor, providing exception safety and code reuse.\n*   **Swap**: Swap the contents of the left-hand side object with the temporary copy. This step typically involves swapping internal pointers or resources, without needing to copy the full contents again.\n*   **Destruction**: Destroy the temporary copy. This happens upon the exit of the assignment operator.\n\nHere's a code example for a simple `String` class:\n\n    class String {\n        // ... rest of the class ...\n    \n        String(const String& other);\n        \n        friend void swap(String& first, String& second) {\n            using std::swap; // for arguments-dependent lookup (ADL)\n            swap(first.size_, second.size_);\n            swap(first.buffer_, second.buffer_);\n        }\n    \n        String& operator=(String other) {\n            swap(*this, other);\n            return *this;\n        }\n    };\n    \n\nUsing the copy-swap idiom:\n\n*   The right-hand side object is copied when passed by value to the assignment operator.\n*   The left-hand side object's contents are swapped with the temporary copy.\n*   The temporary copy is destroyed, releasing any resources that were previously held by the left-hand side object.\n\nThis approach simplifies the implementation and provides strong exception safety, while reusing the copy constructor and destructor code.",
+    "links": []
+  },
+  "O2Du5gHHxFxAI2u5uO8wu": {
+    "title": "Copy on Write",
+    "description": "The Copy-Write idiom, sometimes called the Copy-on-Write (CoW) or \"lazy copying\" idiom, is a technique used in programming to minimize the overhead of copying large objects. It helps in reducing the number of actual copy operations by using shared references to objects and only copying the data when it's required for modification.\n\nLet's understand this with a simple example:\n\n    #include <iostream>\n    #include <memory>\n    \n    class MyString {\n    public:\n        MyString(const std::string &str) : data(std::make_shared<std::string>(str)) {}\n    \n        // Use the same shared data for copying.\n        MyString(const MyString &other) : data(other.data) { \n            std::cout << \"Copied using the Copy-Write idiom.\" << std::endl;\n        }\n    \n        // Make a copy only if we want to modify the data.\n        void write(const std::string &str) {\n            // Check if there's more than one reference.\n            if (data.use_count() > 1) {\n                data = std::make_shared<std::string>(*data);\n                std::cout << \"Copy is actually made for writing.\" << std::endl;\n            }\n            *data = str;\n        }\n    \n    private:\n        std::shared_ptr<std::string> data;\n    };\n    \n    int main() {\n        MyString str1(\"Hello\");\n        MyString str2 = str1; // No copy operation, just shared references.\n    \n        str1.write(\"Hello, World!\"); // This is where the actual duplication happens.\n        return 0;\n    }\n    \n\nIn this example, we have a class `MyString` that simulates the Copy-Write idiom. When a `MyString` object is created, it constructs a `shared_ptr` pointing to a string. When a `MyString` object is copied, it does not perform any actual copy operation, but simply increases the reference count of the shared object. Finally, when the `write` function is called, it checks if there's more than one reference to the data and if so, it actually creates a new copy and updates the reference. This way, unnecessary copies can be avoided until they are actually needed for modification.",
+    "links": []
+  },
+  "OmHDlLxCnH8RDdu5vx9fl": {
+    "title": "RAII",
+    "description": "RAII is a popular idiom in C++ that focuses on using the object's life cycle to manage resources. It encourages binding the resource lifetime to the scope of a corresponding object so that it's automatically acquired when an object is created and released when the object is destroyed. This helps in simplifying the code, avoiding leaks and managing resources efficiently.\n\nCode Examples\n-------------\n\nHere's an example of using RAII to manage resources, specifically a dynamically allocated array:\n\n    class ManagedArray {\n    public:\n        ManagedArray(size_t size) : size_(size), data_(new int[size]) {\n        }\n    \n        ~ManagedArray() {\n            delete[] data_;\n        }\n    \n        // Access function\n        int& operator [](size_t i) {\n            return data_[i];\n        }\n    \n    private:\n        size_t size_;\n        int* data_;\n    };\n    \n\nUsages:\n\n    {\n        ManagedArray arr(10);\n        arr[0] = 42;\n    \n        // No need to explicitly free memory, it will be automatically released when arr goes out of scope.\n    }\n    \n\nAnother common use case is managing a mutex lock:\n\n    class Lock {\n    public:\n        Lock(std::mutex& mtx) : mutex_(mtx) {\n            mutex_.lock();\n        }\n    \n        ~Lock() {\n            mutex_.unlock();\n        }\n    \n    private:\n        std::mutex& mutex_;\n    };\n    \n\nUsages:\n\n    std::mutex some_mutex;\n    \n    void protected_function() {\n        Lock lock(some_mutex);\n    \n        // Do some work that must be synchronized\n    \n        // No need to explicitly unlock the mutex, it will be automatically unlocked when lock goes out of scope.\n    }\n    \n\nIn both examples, the constructor acquires the resource (memory for the array and the lock for the mutex), and the destructor takes care of releasing them. This way, the resource management is tied to the object's lifetime, and the resource is correctly released even in case of an exception being thrown.",
+    "links": []
+  },
+  "MEoWt8NKjPLVTeGgYf3cR": {
+    "title": "Pimpl",
+    "description": "Pimpl (Pointer-to-Implementation) idiom, also known as a private class data, compiler firewall, or handle classes, is a technique used in C++ to hide the implementation details of a class by using a forward declaration to a private structure or class, keeping the public interface of the class clean, and reducing compile-time dependencies.\n\nImplementation\n--------------\n\nHere is a simple example illustrating the Pimpl idiom:\n\n**my\\_class.h**\n\n    class MyClass_Impl; // forward declaration\n    \n    class MyClass\n    {\n    public:\n        MyClass();\n        ~MyClass();\n        void some_method();\n    \n    private:\n        MyClass_Impl *pimpl; // pointer to the implementation\n    };\n    \n\n**my\\_class.cpp**\n\n    #include \"my_class.h\"\n    #include <iostream>\n    \n    class MyClass_Impl // the actual implementation\n    {\n    public:\n        void some_method()\n        {\n            std::cout << \"Implementation method called!\" << std::endl;\n        }\n    };\n    \n    MyClass::MyClass() : pimpl(new MyClass_Impl()) {} // constructor\n    \n    MyClass::~MyClass() { delete pimpl; } // destructor\n    \n    void MyClass::some_method()\n    {\n        pimpl->some_method(); // delegation to the implementation\n    }\n    \n\nNow, all the public methods of `MyClass` will delegate the calls to the corresponding methods of `MyClass_Impl`. By doing this, you can hide the details of class implementation, reduce the compile-time dependencies, and ease the maintenance of your code.",
+    "links": []
+  },
+  "ttt-yeIi4BPWrgvW324W7": {
+    "title": "CRTP",
+    "description": "**Curiously Recurring Template Pattern (CRTP)**\n\nThe Curiously Recurring Template Pattern (CRTP) is a C++ idiom that involves a class template being derived from its own specialization. This pattern allows for the creation of static polymorphism, which differs from regular runtime polymorphism that relies on virtual functions and inheritance.\n\nCRTP is usually employed when you want to customize certain behavior in the base class without adding the overhead of a virtual function call. In short, CRTP can be used for achieving compile-time polymorphism without the runtime performance cost.\n\nHere's an example demonstrating CRTP:\n\n    template <typename Derived>\n    class Base {\n    public:\n        void interface() {\n            static_cast<Derived*>(this)->implementation();\n        }\n    \n        void implementation() {\n            std::cout << \"Default implementation in Base\" << std::endl;\n        }\n    };\n    \n    class Derived1 : public Base<Derived1> {\n    public:\n        void implementation() {\n            std::cout << \"Custom implementation in Derived1\" << std::endl;\n        }\n    };\n    \n    class Derived2 : public Base<Derived2> {\n        // No custom implementation, so Base::implementation will be used.\n    };\n    \n    int main() {\n        Derived1 d1;\n        d1.interface();  // Output: \"Custom implementation in Derived1\"\n    \n        Derived2 d2;\n        d2.interface();  // Output: \"Default implementation in Base\"\n    \n        return 0;\n    }\n    \n\nIn this example, the `Base` class is a template that takes a single type parameter. `Derived1` and `Derived2` are derived from their respective specialization of `Base`. CRTP is employed to allow custom implementations of the `implementation()` function in derived classes while providing a default behavior in the `Base` class. The `interface()` function in the `Base` class is a template for the derived class's behavior and calls the corresponding `implementation()` function based on the static type.\n\nThis pattern enables you to override certain behavior in derived classes with additional functionality, all while avoiding the overhead of virtual function calls and, in turn, achieving a higher degree of efficiency at runtime.",
+    "links": []
+  },
+  "vvE1aUsWbF1OFcmMUHbJa": {
+    "title": "Standardds",
+    "description": "C++ standards are a set of rules and guidelines that define the language's features, syntax, and semantics. The International Organization for Standardization (ISO) is responsible for maintaining and updating the C++ standards. The main purpose of the standards is to ensure consistency, efficiency, and maintainability across multiple platforms and compilers.\n\nHere's a brief summary of the different C++ standards released to date:\n\n*   **C++98/C++03**: The first standardized version of C++, which introduced many features like templates, exceptions, and the Standard Template Library (STL). C++03 is a minor update to C++98 with some bug fixes and performance improvements.\n    \n*   **C++11**: A major upgrade to the language, which introduced features such as:\n    \n    *   Lambda expressions:\n    \n        auto sum = [](int a, int b) -> int { return a + b; };\n        \n    \n    *   Range-based for loops:\n    \n        std::vector<int> numbers = {1, 2, 3, 4};\n        for (int num : numbers) {\n            std::cout << num << std::endl;\n        }\n        \n    \n    *   Smart pointers like `std::shared_ptr` and `std::unique_ptr`.\n*   **C++14**: A minor update to C++11, which added features such as:\n    \n    *   Generic lambda expressions:\n    \n        auto generic_sum = [](auto a, auto b) { return a + b; };\n        \n    \n    *   Binary literals:\n    \n        int binary_number = 0b1010;\n        \n    \n*   **C++17**: Another major update that introduced features such as:\n    \n    *   `if` and `switch` with initializers:\n    \n        if (auto it = my_map.find(key); it != my_map.end()) {\n            // use 'it' here\n        }\n        \n    \n    *   Structured bindings:\n    \n        std::map<std::string, int> my_map = {{\"A\", 1}, {\"B\", 2}};\n        for (const auto& [key, value] : my_map) {\n            // use 'key' and 'value' here\n        }\n        \n    \n*   **C++20**: The latest major update to the language, with features such as:\n    \n    *   Concepts:\n    \n        template<typename T>\n        concept Addable = requires(T a, T b) {\n            { a + b } -> std::same_as<T>;\n        };\n        \n    \n    *   Ranges:\n    \n        std::vector<int> numbers = {1, 2, 3, 4};\n        auto doubled = numbers | std::views::transform([](int n) { return n * 2; });\n        \n    \n    *   Coroutines and more.\n\nRemember that to use these language features, you might need to configure your compiler to use the specific C++ standard version. For example, with GCC or Clang, you can use the `-std=c++11`, `-std=c++14`, `-std=c++17`, or `-std=c++20` flags.",
+    "links": []
+  },
+  "T6rCTv9Dxkm-tEA-l9XEv": {
+    "title": "C++ 11 / 14",
+    "description": "**C++11** The C++11 standard, also known as C++0x, was officially released in September 2011. It introduced several new language features and improvements, including:\n\n*   **Auto**: Allows compiler to infer the variable type based on its initializing expression.\n    \n        auto integer = 42; // integer is of int type\n        auto floating = 3.14; // floating is of double type\n        \n    \n*   **Range-Based for Loop**: Provides foreach-like semantics for iterating through a container or array.\n    \n        std::vector<int> numbers {1, 2, 3, 4};\n        for (int number : numbers) {\n            std::cout << number << std::endl;\n        }\n        \n    \n*   **Lambda Functions**: Anonymous functions that allow the creation of function objects more easily.\n    \n        auto add = [](int a, int b) -> int { return a + b; };\n        int sum = add(42, 13); // sum is equal to 55\n        \n    \n*   **nullptr**: A new keyword to represent null pointers, more type-safe than using a literal '0' or \"NULL\".\n    \n        int *ptr = nullptr;\n        \n    \n*   **Thread Support Library**: Provides a standard way to work with threads and synchronize data access across threads.\n    \n        std::thread t([]() { std::cout << \"Hello from another thread\\n\"; });\n        t.join();\n        \n    \n\n**C++14** The C++14 standard was officially released in December 2014 as a small extension over C++11, focusing more on fine-tuning language features and fixing issues. Some of the new features introduced:\n\n*   **Generic Lambdas**: Allows lambda function parameters to be declared with 'auto' type placeholders.\n    \n        auto add = [](auto a, auto b) { return a + b; };\n        auto sum_i = add(42, 13); // Still works with integers\n        auto sum_f = add(3.14, 2.72); // Now works with doubles too\n        \n    \n*   **Binary Literals**: Allow you to input integers as binary literals for better readability.\n    \n        int b = 0b110101; // Decimal value is 53\n        \n    \n*   **decltype(auto)**: Deduces the type of variable to match that of the expression it is initialized with.\n    \n        auto func = [](auto a, auto b) { return a * b; };\n        decltype(auto) result = func(5, 3.14); // decltype(auto) deduces to \"double\"\n        \n    \n*   **Variable Templates**: Allows you to define variables with template parameters.\n    \n        template <typename T>\n        constexpr T pi = T(3.1415926535897932385);\n        float r = pi<float>; // Instantiated as a float\n        double d = pi<double>; // Instantiated as a double",
+    "links": []
+  },
+  "R2-qWGUxsTOeSHRuUzhd2": {
+    "title": "C++ 17",
+    "description": "C++17, also known as C++1z, is the version of the C++ programming language published in December 2017. It builds upon the previous standard, C++14, and adds various new features and enhancements to improve the language's expressiveness, performance, and usability.\n\nKey Features:\n-------------\n\n*   If-init-statement: Introduces a new syntax for writing conditions with scope inside if and switch statements.\n\n    if (auto it = map.find(key); it != map.end())\n    {\n        // Use it\n    }\n    \n\n*   Structured Binding Declarations: Simplify the process of unpacking a tuple, pair, or other aggregate types.\n\n    map<string, int> data;\n    auto [iter, success] = data.emplace(\"example\", 42);\n    \n\n*   Inline variables: Enables `inline` keyword for variables and allows single definition of global and class static variables in header files.\n\n    inline int globalVar = 0;\n    \n\n*   Folds expressions: Introduce fold expressions for variadic templates.\n\n    template <typename... Ts>\n    auto sum(Ts... ts)\n    {\n        return (ts + ...);\n    }\n    \n\n*   constexpr if statement: Allows conditional compilation during compile time.\n\n    template <typename T>\n    auto get_value(T t)\n    {\n        if constexpr (std::is_pointer_v<T>)\n        {\n            return *t;\n        }\n        else\n        {\n            return t;\n        }\n    }\n    \n\n*   Improved lambda expression: Allows lambda to capture a single object without changing its type or constness.\n\n    auto func = [x = std::move(obj)] { /* use x */ };\n    \n\n*   Standard file system library: `std::filesystem` as a standardized way to manipulate paths, directories, and files.\n    \n*   New Standard Library additions: `<string_view>` (non-owning string reference), `<any>` (type-safe discrimination union), `<optional>` (optional value wrapper), `<variant>` (type-safe sum type), and `<memory_resource>` (library for polymorphic allocators).\n    \n*   Parallel Algorithms: Adds support for parallel execution of Standard Library algorithms.\n    \n\nThis is a brief summary of the key features of C++17; it includes more features and library updates. For a complete list, you can refer to the [full list of C++17 features and changes](https://en.cppreference.com/w/cpp/17).",
+    "links": []
+  },
+  "o3no4a5_iMFzEAGs56-BJ": {
+    "title": "C++ 20",
+    "description": "C++20 is the latest standard of the C++ programming language, which brings significant improvements and new features to the language. This version is aimed at facilitating better software development practices and enabling developers to write more efficient, readable, and maintainable code.\n\nHere are some of the key features introduced in C++20:\n\nConcepts\n--------\n\nConcepts are a way to enforce specific requirements on template parameters, allowing you to write more expressive and understandable code. They improve the error messages when using templates and ensure that the template parameters fulfill specific criteria.\n\n    template <typename T>\n    concept Addable = requires (T a, T b) {\n        { a + b } -> std::same_as<T>;\n    };\n    \n    template <Addable T>\n    T add(T a, T b) {\n        return a + b;\n    }\n    \n\nRanges\n------\n\nRanges provide a new way to work with sequences of values, enhancing the power and expressiveness of the Standard Library algorithms. The range-based algorithms make it easier and more convenient to work with sequences.\n\n    #include <algorithm>\n    #include <iostream>\n    #include <ranges>\n    #include <vector>\n    \n    int main() {\n        std::vector<int> numbers = { 1, 2, 3, 4, 5 };\n    \n        auto even_numbers = numbers | std::views::filter([](int n) { return n % 2 == 0; });\n    \n        for (int n : even_numbers) {\n            std::cout << n << ' ';\n        }\n    }\n    \n\nCoroutines\n----------\n\nCoroutines are a new way to write asynchronous and concurrent code with improved readability. They allow functions to be suspended and resumed, enabling you to write more efficient, non-blocking code.\n\n    #include <coroutine>\n    #include <iostream>\n    #include <future>\n    \n    std::future<int> async_value(int value) {\n        co_await std::chrono::seconds(1);\n        co_return value * 2;\n    }\n    \n    int main() {\n        auto result = async_value(42);\n        std::cout << \"Result: \" << result.get() << std::endl;\n    }\n    \n\nThe `constexpr` and `consteval` Keywords\n----------------------------------------\n\nBoth `constexpr` and `consteval` are related to compile-time evaluation. Functions marked with `constexpr` can be executed at compile-time or runtime, while functions marked with `consteval` can only be executed at compile-time.\n\n    constexpr int add(int a, int b) {\n        return a + b;\n    }\n    \n    consteval int square(int x) {\n        return x * x;\n    }\n    \n    int main() {\n        constexpr int result1 = add(3, 4);   // evaluated at compile-time\n        int result2 = add(5, 6);             // evaluated at runtime\n        constexpr int result3 = square(7);   // evaluated at compile-time\n    }\n    \n\nThese are just some of the highlights of the C++20 standard. It also includes many other features and improvements, like structured bindings, improved lambdas, and new standard library components. Overall, C++20 makes it easier for developers to write clean, efficient, and expressive code.",
+    "links": []
+  },
+  "sxbbKtg7kMNbkx7fXhjR9": {
+    "title": "Newest",
+    "description": "C++20 is the newest standard of the C++ programming language, which was officially published in December 2020. It introduces many new features, enhancements, and improvements over the previous standards. Here is a brief summary of some key features in C++20.\n\n*   **Concepts**: Concepts provide a way to specify constraints on template parameters, ensuring that they meet a specific set of requirements. This allows for better compile-time error messages and code readability.\n    \n    Example:\n    \n        template<typename T>\n        concept Printable = requires(T x) {\n            {std::cout << x};\n        };\n        \n        template<Printable T>\n        void print(const T& x) {\n            std::cout << x << '\\n';\n        }\n        \n    \n*   **Ranges**: Ranges build on the iterator concept and provide a more usable and composable framework for dealing with sequences of values. They simplify the way algorithms can be applied to collections of data.\n    \n    Example:\n    \n        #include <iostream>\n        #include <vector>\n        #include <ranges>\n        \n        int main() {\n            std::vector<int> numbers{1, 2, 3, 4, 5};\n            auto even_view = numbers | std::views::filter([](int n) { return n % 2 == 0; });\n        \n            for (int n : even_view) {\n                std::cout << n << ' ';\n            }\n        }\n        \n    \n*   **Coroutines**: Coroutines offer a way to split complex, long-running functions into smaller, more manageable chunks, allowing them to be suspended and resumed at specific points.\n    \n    Example:\n    \n        #include <iostream>\n        #include <coroutine>\n        \n        std::generator<int> generator() {\n            for (int i = 0; i < 5; ++i)\n                co_yield i;\n        }\n        \n        int main() {\n            for (int value : generator())\n                std::cout << value << ' ';\n        }\n        \n    \n*   **Lambdas with template parameters**: C++20 enables using `auto` as a lambda parameter, allowing for generic lambdas with templated parameters.\n    \n    Example:\n    \n        auto sum = [](auto a, auto b) {\n            return a + b;\n        };\n        \n        int res1 = sum(1, 2);           // int\n        double res2 = sum(1.0, 2.0);    // double\n        \n    \n*   **Constexpr enhancements**: `constexpr` support is extended with additional features, such as `constexpr` dynamic allocations, `constexpr` try-catch blocks, and `constexpr` lambdas.\n    \n    Example:\n    \n        struct Point {\n            constexpr Point(int x, int y): x_{x}, y_{y} {}\n            int x_, y_;\n        };\n        \n        constexpr auto create_points() {\n            Point points[3]{};\n        \n            for (int i = 0; i < 3; ++i) {\n                points[i] = Point{i, i * i};\n            }\n        \n            return points;\n        }\n        \n        constexpr auto points = create_points();\n        \n    \n\nThere are many other features in C++20, such as new standard library improvements, `std::format`, improvements to compile-time programming, and more. These are just a few highlights that showcase the versatility and power of the newest standard of C++.",
+    "links": []
+  },
+  "PPg0V5EzGBeJsysg1215V": {
+    "title": "C++ 0x",
+    "description": "`cpp0x` refers to the working name for [C++11](https://en.cppreference.com/w/cpp/11), which was previously known as C++0x before its final release. C++11 is a major revision of the C++ language standard, published in 2011, and brought several new features and improvements to the language.\n\nSome of the notable features in C++11 include:\n\n*   **Auto** keyword for automatic type inference.\n    \n        auto i = 42; // i is an int\n        auto s = \"hello\"; // s is a const char*\n        \n    \n*   **Range-based for loop** for easier iteration over containers.\n    \n        std::vector<int> vec = {1, 2, 3};\n        for (int i : vec) {\n            std::cout << i << std::endl;\n        }\n        \n    \n*   **Lambda functions** for creating anonymous functions.\n    \n        auto add = [](int a, int b) { return a + b; };\n        int result = add(3, 4); // result is 7\n        \n    \n*   **nullptr** for representing null pointer values, instead of using `NULL`.\n    \n        int* p = nullptr;\n        \n    \n*   **Rvalue references and move semantics** to optimize the handling of temporary objects.\n    \n        std::string str1 = \"hello\";\n        std::string str2 = std::move(str1); // move the content of str1 to str2\n        \n    \n*   **Variadic templates** for creating templates that take a variable number of arguments.\n    \n        template <typename... Args>\n        void printArgs(Args... args) {\n            // function body\n        }\n        \n    \n*   **Static assertions** for compile-time assertions.\n    \n        static_assert(sizeof(int) == 4, \"This code requires int to be 4 bytes.\");\n        \n    \n*   **Thread support** for multithreading programming.\n    \n        #include <thread>\n        \n        void my_function() {\n            // thread function body\n        }\n        \n        int main() {\n            std::thread t(my_function);\n            t.join();\n            return 0;\n        }\n        \n    \n\nThese are just a few examples of the many new features introduced in C++11. For a comprehensive list, you can refer to the [C++11 documentation](https://en.cppreference.com/w/cpp/11).",
+    "links": []
+  },
+  "qmHs6_BzND_xpMmls5YUH": {
+    "title": "Debuggers",
+    "description": "Debuggers are essential tools for any C++ programmer, as they help in detecting, diagnosing, and fixing bugs in the code. They serve as an invaluable resource in identifying and understanding potential errors in the program.\n\nTypes of Debuggers\n------------------\n\nThere are several debuggers available for use with C++:\n\n*   **GDB (GNU Debugger):** This is the most widely used C++ debugger in the Linux environment. It can debug many languages, including C and C++.\n    \n    Example usage:\n    \n        g++ -g main.cpp -o main    # compile the code with debug info\n        gdb ./main                 # start gdb session\n        b main                     # set a breakpoint at the start of the main function\n        run                        # run the program\n        next                       # step to the next line\n        \n    \n*   **LLDB:** This is the debugger developed by LLVM. It supports multiple languages and is popular among macOS and iOS developers.\n    \n    Example usage:\n    \n        clang++ -g main.cpp -o main # compile the code with debug info\n        lldb ./main                 # start lldb session\n        breakpoint set --name main  # set a breakpoint at the start of the main function\n        run                         # run the program\n        next                        # step to the next line\n        \n    \n*   **Microsoft Visual Studio Debugger:** This debugger is built into Visual Studio and is typically used in a graphical interface on Windows systems.\n    \n    Example usage:\n    \n        Open your Visual Studio project and go to Debug > Start Debugging. Then use the step over (F10), step into (F11), or continue (F5) commands to navigate through the code.\n        \n    \n*   **Intel Debugger (IDB):** This debugger is part of Intel's parallel development suite and is popular for high-performance applications.\n    \n*   **TotalView Debugger:** Developed by Rogue Wave Software, TotalView Debugger is a commercial debugger designed for parallel, high-performance, and enterprise applications.\n    \n\nEach debugger has its advantages and unique features, so it's essential to choose the one that best suits your needs and works well with your development environment.",
+    "links": []
+  },
+  "VtPb8-AJKzhTB0QbMtoU4": {
+    "title": "Understanding Debugger Messages",
+    "description": "Debugger messages are notifications or alerts provided by a debugger to help you identify problems or errors in your C++ code. These messages can be warnings or error messages and can provide helpful information about the state of your program and specific issues encountered during the debugging process.\n\nTypes of Debugger Messages\n--------------------------\n\n*   **Error Messages:** Notify you about issues in the code that prevent the program from running or compiling correctly. These messages typically include information about the file and the line number where the error is detected, followed by a description of the issue.\n    \n    Example:\n    \n        test.cpp: In function 'int main()':\n        test.cpp:6:5: error: 'cout' was not declared in this scope\n             cout << \"Hello World!\";\n             ^~~~\n        \n    \n*   **Warning Messages:** Inform you about potential issues or risky programming practices that may not necessarily cause errors but could lead to problems later on. Like error messages, warning messages usually include information about the file and line number where the issue is found, along with a description of the problem.\n    \n    Example:\n    \n        test.cpp: In function 'int main()':\n        test.cpp:6:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]\n             if (a < size)\n                      ^\n        \n    \n*   **Informational Messages:** Provide general information about the execution of the program, such as breakpoints, watchpoints, and variable values. These messages can also reveal the current state of the program, including the call stack and the list of active threads.\n    \n    Example (_assuming you are using GDB as debugger_):\n    \n        (gdb) break main\n        Breakpoint 1 at 0x40055f: file test.cpp, line 5.\n        (gdb) run\n        Starting program: /path/to/test\n        Breakpoint 1, main () at test.cpp:5\n        5       int a = 5;\n        \n    \n\nCode Examples\n-------------\n\nTo make use of debugger messages, you need to employ a debugger, such as GDB or Visual Studio Debugger, and include specific flags during the compilation process.\n\nExample using GDB:\n\n    // test.cpp\n    \n    #include <iostream>\n    \n    int main() {\n        int num1 = 10;\n        int num2 = 0;\n        int result = num1 / num2;\n    \n        std::cout << \"Result: \" << result << std::endl;\n    \n        return 0;\n    }\n    \n\n    $ g++ -g -o test test.cpp  // Compile with -g flag to include debugging information\n    $ gdb ./test               // Run the GDB debugger\n    (gdb) run                  // Execute the program inside GDB\n    \n\nAt this point, the debugger will show an error message triggered by the division by zero:\n\n    Program received signal SIGFPE, Arithmetic exception.\n    0x00005555555546fb in main () at test.cpp:7\n    7       int result = num1 / num2;\n    \n\nNow you can make appropriate changes to fix the issue in your C++ code.",
+    "links": []
+  },
+  "sR_FxGZHoMCV9Iv7z2_SX": {
+    "title": "Debugging Symbols",
+    "description": "Debugger symbols are additional information embedded within the compiled program's binary code, that help debuggers in understanding the structure, source code, and variable representations at a particular point in the execution process.\n\nThere are generally two types of debugging symbols:\n\n*   **Internal Debugging Symbols**: These symbols reside within the compiled binary code itself. When using internal debugging symbols, it is essential to note that the size of the binary increases, which may not be desirable for production environments.\n    \n*   **External Debugging Symbols**: The debugging symbols are kept in separate files apart from the binary code, usually with file extensions such as `.pdb` (Program Database) in Windows or `.dSYM` (DWARF Symbol Information) in macOS.\n    \n\nGenerating Debugger Symbols\n---------------------------\n\nTo generate debugger symbols in C++, you need to specify specific options during the compilation process. We will use `g++` compiler as an example.\n\n**Internal Debugging Symbols (g++)**\n\nTo create a debug build with internal debugging symbols, use the `-g` flag:\n\n    g++ -g -o my_program my_program.cpp\n    \n\nThis command compiles `my_program.cpp` into an executable named `my_program` with internal debugging symbols.\n\n**External Debugging Symbols (g++)**\n\nIn case you want to generate a separate file containing debugging symbols, you can use the `-gsplit-dwarf` flag:\n\n    g++ -g -gsplit-dwarf -o my_program my_program.cpp\n    \n\nThis command compiles `my_program.cpp` into an executable named `my_program` and generates a separate file named `my_program.dwo` containing the debugging symbols.\n\nWhen sharing your compiled binary to end-users, you can remove the debugging symbols using the `strip` command:\n\n    strip --strip-debug my_program\n    \n\nThis command removes internal debug symbols, resulting in a smaller binary size while keeping the `.dwo` file for debugging purposes when needed.\n\nRemember that the availability and syntax of these options may vary between different compilers and platforms. Be sure to consult your compiler's documentation to ensure proper usage of the debugging options.",
+    "links": []
+  },
+  "y8VCbGDUco9bzGRfIBD8R": {
+    "title": "WinDBg",
+    "description": "WinDbg is a powerful debugger for Windows applications, which is included in the Microsoft Windows SDK. It provides an extensive set of features to help you analyze and debug complex programs, kernel mode, and user-mode code. With a user-friendly graphical interface, WinDbg can help in analyzing crash dumps, setting breakpoints, and stepping through code execution.\n\nGetting Started\n---------------\n\nTo begin using WinDbg, you first need to install it. You can download the [Windows SDK](https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk/) and install it to get the WinDbg.\n\nLoading Symbols\n---------------\n\nWinDbg relies on symbol files (\\*.pdb) to provide more useful information about a program's internal structures, functions, and variables. To load symbols properly, you may need to configure the symbol path:\n\n    !sym noisy\n    .sympath SRV*C:\\symbols*http://msdl.microsoft.com/download/symbols\n    .reload /f\n    \n\nOpening Executables and Crash Dumps\n-----------------------------------\n\nTo debug an executable using WinDbg, go to `File > Open Executable...`, then locate and open the target program. To analyze a crash dump, use `File > Open Crash Dump...` instead.\n\nBasic Commands\n--------------\n\nSome common commands you might use in WinDbg:\n\n*   `g`: Execute the program until the next breakpoint or exception\n*   `bp <address>`: Set a breakpoint at a given address\n*   `bl`: List all breakpoints\n*   `bd <breakpoint_id>`: Disable a breakpoint\n*   `be <breakpoint_id>`: Enable a breakpoint\n*   `bc <breakpoint_id>`: Clear a breakpoint\n*   `t`: Single-step through instructions (trace)\n*   `p`: Step over instructions (proceed)\n*   `k`: Display call stack\n*   `dd`: Display memory contents in 4-byte units (double words)\n*   `da`: Display memory contents as ASCII strings\n*   `!analyze -v`: Analyze the program state and provide detailed information\n\nExample Usage\n-------------\n\nDebugging a simple program:\n\n*   Open the executable in WinDbg\n*   Set a breakpoint using `bp <address>`\n*   Run the program using `g`\n*   Once the breakpoint is hit, use `t` or `p` to step through the code\n*   Try `k` to view the call stack, or `dd`, `da` to inspect memory\n*   Remove the breakpoint and continue debugging with other commands as needed\n\nRemember that WinDbg has a wealth of commands and functionality, so it's essential to get comfortable with the [documentation](https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugger-download-tools) and explore the wealth of available resources specific to your debugging tasks.",
+    "links": []
+  },
+  "BmWsoL9c_Aag5nVlMsKm2": {
+    "title": "GDB",
+    "description": "GDB, or the GNU Project Debugger, is a powerful command-line debugger used primarily for C, C++, and other languages. It can help you find runtime errors, examine the program's execution state, and manipulate the flow to detect and fix bugs easily.\n\nGetting started with GDB\n------------------------\n\nTo start using GDB, you first need to compile your code with the `-g` flag, which includes debugging information in the executable:\n\n    g++ -g myfile.cpp -o myfile\n    \n\nNow, you can load your compiled program into GDB:\n\n    gdb myfile\n    \n\nBasic GDB Commands\n------------------\n\nHere are some common GDB commands you'll find useful when debugging:\n\n*   `run`: Start your program.\n*   `break [function/line number]`: Set a breakpoint at the specified function or line.\n*   `continue`: Continue the program execution after stopping on a breakpoint.\n*   `next`: Execute the next line of code, stepping over function calls.\n*   `step`: Execute the next line of code, entering function calls.\n*   `print [expression]`: Evaluate an expression in the current context and display its value.\n*   `backtrace`: Show the current call stack.\n*   `frame [frame-number]`: Switch to a different stack frame.\n*   `quit`: Exit GDB.\n\nExample Usage\n-------------\n\nSuppose you have a simple `cpp` file called `example.cpp`:\n\n    #include <iostream>\n    \n    void my_function(int i) {\n      std::cout << \"In my_function with i = \" << i << std::endl;\n    }\n    \n    int main() {\n      for (int i = 0; i < 5; ++i) {\n        my_function(i);\n      }\n      return 0;\n    }\n    \n\nFirst, compile the code with debugging symbols:\n\n    g++ -g example.cpp -o example\n    \n\nStart GDB and load the `example` program:\n\n    gdb example\n    \n\nSet a breakpoint in the `my_function` function and run the program:\n\n    (gdb) break my_function\n    (gdb) run\n    \n\nOnce stopped at the breakpoint, use `next`, `print`, and `continue` to examine the program's state:\n\n    (gdb) next\n    (gdb) print i\n    (gdb) continue\n    \n\nFinally, exit GDB with the `quit` command.\n\nThis was just a brief summary of GDB; you can find more details in the [official GDB manual](https://sourceware.org/gdb/current/onlinedocs/gdb/).",
+    "links": []
+  },
+  "FTMHsUiE8isD_OVZr62Xc": {
+    "title": "Compilers",
+    "description": "A compiler is a computer program that translates source code written in one programming language into a different language, usually machine code or assembly code, that can be executed directly by a computer's processor. In the context of C++, compilers take your written C++ source code and convert it into an executable program.\n\nPopular C++ Compilers\n---------------------\n\nThere are several popular C++ compilers available, here's a short list of some common ones:\n\n*   **GNU Compiler Collection (GCC)**: Developed by the GNU Project, GCC is an open-source compiler that supports multiple programming languages, including C++.\n    \n*   **Clang**: As part of the LLVM project, Clang is another open-source compiler that supports C++ and is known for its fast compilation times and extensive diagnostics.\n    \n*   **Microsoft Visual C++ (MSVC)**: MSVC is a commercial compiler provided by Microsoft as part of Visual Studio, and it's widely used on Windows platforms.\n    \n*   **Intel C++ Compiler (ICC)**: ICC is a commercial compiler provided by Intel and is known for its ability to optimize code for the latest Intel processors.\n    \n\nExample of a Simple C++ Compilation\n-----------------------------------\n\nLet's say you have a simple C++ program saved in a file called `hello.cpp`:\n\n    #include <iostream>\n    \n    int main() {\n      std::cout << \"Hello, World!\" << std::endl;\n      return 0;\n    }\n    \n\nYou can compile this program using the GCC compiler by executing the following command in a command-line/terminal:\n\n    g++ hello.cpp -o hello\n    \n\nThis will generate an executable file called `hello` (or `hello.exe` on Windows) which you can run to see the output \"Hello, World!\".\n\nNote\n----\n\nWhen learning about compilers, it's essential to know that they work closely with the linker and the standard library. The linker takes care of combining compiled object files and libraries into a single executable, while the standard library provides implementations for common functionalities used in your code.",
+    "links": []
+  },
+  "DVckzBUMgk_lWThVkLyAT": {
+    "title": "Compiler Stages",
+    "description": "The process of compilation in C++ can be divided into four primary stages: Preprocessing, Compilation, Assembly, and Linking. Each stage performs a specific task, ultimately converting the source code into an executable program.\n\nPreprocessing\n-------------\n\nThe first stage is the preprocessing of the source code. Preprocessors modify the source code before the actual compilation process. They handle directives that start with a `#` (hash) symbol, like `#include`, `#define`, and `#if`. In this stage, included header files are expanded, macros are replaced, and conditional compilation statements are processed.\n\n**Code Example:**\n\n    #include <iostream>\n    #define PI 3.14\n    \n    int main() {\n        std::cout << \"The value of PI is: \" << PI << std::endl;\n        return 0;\n    }\n    \n\nCompilation\n-----------\n\nThe second stage is the actual compilation of the preprocessed source code. The compiler translates the modified source code into an intermediate representation, usually specific to the target processor architecture. This step also involves performing syntax checking, semantic analysis, and producing error messages for any issues encountered in the source code.\n\n**Code Example:**\n\n    int main() {\n        int a = 10;\n        int b = 20;\n        int sum = a + b;\n        return 0;\n    }\n    \n\nAssembly\n--------\n\nThe third stage is converting the compiler's intermediate representation into assembly language. This stage generates assembly code using mnemonics and syntax that is specific to the target processor architecture. Assemblers then convert this assembly code into object code (machine code).\n\n**Code Example (x86 Assembly):**\n\n    mov eax, 10\n    mov ebx, 20\n    add eax, ebx\n    \n\nLinking\n-------\n\nThe final stage is the linking of the object code with the necessary libraries and other object files. In this stage, the linker merges multiple object files and libraries, resolves external references from other modules or libraries, allocates memory addresses for functions and variables, and generates an executable file that can be run on the target platform.\n\n**Code Example (linking objects and libraries):**\n\n    $ g++ main.o -o main -lm\n    \n\nIn summary, the compilation process in C++ involves four primary stages: preprocessing, compilation, assembly, and linking. Each stage plays a crucial role in transforming the source code into an executable program.",
+    "links": []
+  },
+  "hSG6Aux39X0cXi6ADy2al": {
+    "title": "Compilers and Features",
+    "description": "Different C++ compilers have different features. Some of the most common features of C++ compilers are:\n\n*   **Optimization:** Compilers can optimize the code to improve the performance of the program. For example, they can remove redundant code, inline functions, and perform loop unrolling.\n*   **Debugging:** Compilers can generate debugging information that can be used to debug the program.\n*   **Warnings:** Compilers can generate warnings for suspicious code that may cause errors.\n\nSome of the most popular C++ compilers are:\n\n*   **GNU Compiler Collection (GCC):** GCC is a free and open-source compiler that supports many programming languages, including C++.\n*   **Clang:** Clang is a C++ compiler that is part of the LLVM project. It is designed to be compatible with GCC.\n*   **Microsoft Visual C++:** Microsoft Visual C++ is a C++ compiler that is part of the Microsoft Visual Studio IDE.\n*   **Intel C++ Compiler:** Intel C++ Compiler is a C++ compiler that is part of the Intel Parallel Studio XE suite.\n\nYou should go through the documentation of your compiler to learn more about its features.",
+    "links": []
+  },
+  "jVXFCo6puMxJ_ifn_uwim": {
+    "title": "Build Systems",
+    "description": "A build system is a collection of tools and utilities that automate the process of compiling, linking, and executing source code files in a project. The primary goal of build systems is to manage the complexity of the compilation process and produce a build (executable or binary files) in the end. In C++ (cpp), some common build systems are:\n\n*   **GNU Make**: It is a popular build system that uses `Makefile` to define the build process. It checks the dependencies and timestamps of source files to determine which files need to be compiled and linked.\n    \n    Code example:\n    \n        # Makefile\n        CXX = g++\n        CPPFLAGS = -Wall -std=c++11\n        TARGET = HelloWorld\n        \n        all: $(TARGET)\n        \n        $(TARGET): main.cpp\n            $(CXX) $(CPPFLAGS)main.cpp -o $(TARGET)\n        \n        clean:\n            rm $(TARGET)\n        \n    \n*   **CMake**: It is a cross-platform build system that focuses on defining project dependencies and managing build environments. CMake generates build files (like Makefiles) for different platforms and allows developers to write source code once and then compile it for different target platforms.\n    \n    Code example:\n    \n        # CMakeLists.txt\n        cmake_minimum_required(VERSION 3.10)\n        project(HelloWorld)\n        \n        set(CMAKE_CXX_STANDARD 11)\n        \n        add_executable(HelloWorld main.cpp)\n        \n    \n*   **Autotools**: Also known as GNU Build System, consists of the GNU Autoconf, Automake, and Libtool tools that enable developers to create portable software across different Unix-based systems. For a C++ project, you will need to create `configure.ac`, `Makefile.am` files with specific rules, and then run the following commands in the terminal to build the project:\n    \n        autoreconf --install\n        ./configure\n        make\n        make install\n        \n    \n*   **SCons**: This build system uses Python for build scripts, making it more expressive than GNU Make. It can also build for multiple platforms and configurations simultaneously.\n    \n    Code example:\n    \n        # SConstruct\n        env = Environment()\n        env.Program(target=\"HelloWorld\", source=[\"main.cpp\"])\n        \n    \n*   **Ninja**: A small and focused build system that takes a list of build targets specified in a human-readable text file and builds them as fast as possible.\n    \n    Code example:\n    \n        # build.ninja\n        rule cc\n          command = g++ -c $in -o $out\n        \n        rule link\n          command = g++ $in -o $out\n        \n        build main.o: cc main.cpp\n        build HelloWorld: link main.o\n          default HelloWorld\n        \n    \n\nThese are some of the popular build systems in C++, each with their own syntax and capabilities. While Make is widely used, CMake is a cross-platform build system that generates build files for other build systems like Make or Ninja. Autotools is suitable for creating portable software, SCons leverages Python for its build scripts, and Ninja focuses on fast build times.",
+    "links": []
+  },
+  "ysnXvSHGBMMozBJyXpHl5": {
+    "title": "CMAKE",
+    "description": "CMake is a powerful cross-platform build system that generates build files, Makefiles, or workspaces for various platforms and compilers. Unlike the others build systems, CMake does not actually build the project, it only generates the files needed by build tools. CMake is widely used, particularly in C++ projects, for its ease of use and flexibility.\n\nCMakeLists.txt\n--------------\n\nCMake uses a file called `CMakeLists.txt` to define settings, source files, libraries, and other configurations. A typical `CMakeLists.txt` for a simple project would look like:\n\n    cmake_minimum_required(VERSION 3.0)\n    \n    project(MyProject)\n    \n    set(SRC_DIR \"${CMAKE_CURRENT_LIST_DIR}/src\")\n    set(SOURCES \"${SRC_DIR}/main.cpp\" \"${SRC_DIR}/file1.cpp\" \"${SRC_DIR}/file2.cpp\")\n    \n    add_executable(${PROJECT_NAME} ${SOURCES})\n    \n    target_include_directories(${PROJECT_NAME} PRIVATE \"${CMAKE_CURRENT_LIST_DIR}/include\")\n    \n    set_target_properties(${PROJECT_NAME} PROPERTIES\n        CXX_STANDARD 14\n        CXX_STANDARD_REQUIRED ON\n        CXX_EXTENSIONS OFF\n    )\n    \n\nBuilding with CMake\n-------------------\n\nHere is an example of a simple build process using CMake:\n\n*   Create a new directory for the build.\n\n    mkdir build\n    cd build\n    \n\n*   Generate build files using CMake.\n\n    cmake ..\n    \n\nIn this example, `..` indicates the parent directory where `CMakeLists.txt` is located. The build files will be generated in the `build` directory.\n\n*   Build the project using the generated build files.\n\n    make\n    \n\nOr, on Windows with Visual Studio, you may use:\n\n    msbuild MyProject.sln\n    \n\nCMake makes it easy to manage large projects, define custom build configurations, and work with many different compilers and operating systems. Making it a widely chosen tool for managing build systems in C++ projects.",
+    "links": []
+  },
+  "t6rZLH7l8JQm99ax_fEJ9": {
+    "title": "Makefile",
+    "description": "A Makefile is a configuration file used by the `make` utility to automate the process of compiling and linking code in a C++ project. It consists of a set of rules and dependencies that help in building the target executable or library from source code files.\n\nMakefiles help developers save time, reduce errors, and ensure consistency in the build process. They achieve this by specifying the dependencies between different source files, and providing commands that generate output files (such as object files and executables) from input files (such as source code and headers).\n\nStructure of a Makefile\n-----------------------\n\nA typical Makefile has the following structure:\n\n*   **Variables**: Define variables to store commonly used values, such as compiler flags, directories, or target names.\n*   **Rules**: Define how to generate output files from input files using a set of commands. Each rule has a _target_, a set of _prerequisites_, and a _recipe_.\n*   **Phony targets**: Targets that do not represent actual files in the project but serve as a way to group related rules and invoke them using a single command.\n\nExample\n-------\n\nConsider a basic C++ project with the following directory structure:\n\n    project/\n    |-- include/\n    |   |-- header.h\n    |-- src/\n    |   |-- main.cpp\n    |-- Makefile\n    \n\nA simple Makefile for this project could be as follows:\n\n    # Variables\n    CXX = g++\n    CXXFLAGS = -Wall -Iinclude\n    SRC = src/main.cpp\n    OBJ = main.o\n    EXE = my_program\n    \n    # Rules\n    $(EXE): $(OBJ)\n    \t$(CXX) $(CXXFLAGS) -o $(EXE) $(OBJ)\n    \n    $(OBJ): $(SRC)\n    \t$(CXX) $(CXXFLAGS) -c $(SRC)\n    \n    # Phony targets\n    .PHONY: clean\n    clean:\n    \trm -f $(OBJ) $(EXE)\n    \n\nWith this Makefile, you can simply run `make` in the terminal to build the project, and `make clean` to remove the output files. The Makefile specifies the dependencies between the source code, object files, and the final executable, as well as the commands to compile and link them.\n\nSummary\n-------\n\nMakefiles provide a powerful way to automate building C++ projects using the `make` utility. They describe the dependencies and commands required to generate output files from source code, saving time and ensuring consistency in the build process.",
+    "links": []
+  },
+  "HkUCD5A_M9bJxJRElkK0x": {
+    "title": "Ninja",
+    "description": "Ninja is a small build system with a focus on speed. It is designed to handle large projects by generating build files that implement the minimal amount of work necessary to build the code. This results in faster build times, especially for large codebases. Ninja is often used in conjunction with other build systems like CMake, which can generate Ninja build files for you.\n\nNinja build files are typically named `build.ninja` and contain rules, build statements, and variable declarations. Here's a simple example of a Ninja build file for a C++ project:\n\n    # Variable declarations\n    cxx = g++\n    cflags = -Wall -Wextra -std=c++17\n    \n    # Rule for compiling the C++ files\n    rule cxx_compile\n      command = $cxx $cflags -c $in -o $out\n    \n    # Build statements for the source files\n    build main.o: cxx_compile main.cpp\n    build foo.o: cxx_compile foo.cpp\n    \n    # Rule for linking the object files\n    rule link\n      command = $cxx $in -o $out\n    \n    # Build statement for the final executable\n    build my_program: link main.o foo.o\n    \n\nTo build the project using this `build.ninja` file, simply run `ninja` in the terminal:\n\n    $ ninja\n    \n\nThis will build the `my_program` executable by first compiling the `main.cpp` and `foo.cpp` files into object files, and then linking them together.",
+    "links": []
+  },
+  "h29eJG1hWHa7vMhSqtfV2": {
+    "title": "Package Managers",
+    "description": "Package managers are tools that automate the process of installing, upgrading, and managing software (libraries, frameworks, and other dependencies) for a programming language, such as C++.\n\nSome popular package managers used in the C++ ecosystem include:\n\n*   **Conan**\n*   **vcpkg**\n*   **C++ Archive Network (cppan)**\n\nConan\n-----\n\n[Conan](https://conan.io/) is an open-source, decentralized, cross-platform package manager for C and C++ developers. It simplifies managing dependencies and reusing code, which benefits multi-platform development projects.\n\nFor example, installing a library using Conan:\n\n    conan install poco/1.9.4@\n    \n\nvcpkg\n-----\n\n[vcpkg](https://github.com/microsoft/vcpkg) is a cross-platform package manager created by Microsoft. It is an open-source library management system for C++ developers to build and manage their projects.\n\nFor example, installing a package using vcpkg:\n\n    ./vcpkg install boost:x64-windows\n    \n\nC++ Archive Network (cppan)\n---------------------------\n\n[cppan](https://cppan.org/) is a package manager and software repository for C++ developers, simplifying the process of managing and distributing C++ libraries and tools. It's now part of [build2](https://build2.org/), a build toolchain that provides a package manager.\n\nAn example of a `cppan.yml` file:\n\n    #\n    # cppan.yml\n    #\n    \n    project:\n      api_version: 1\n    \n      depend:\n        - pvt.cppan.demo.sqlite3\n        - pvt.cppan.demo.xz_utils.lzma\n    \n\nWith these package managers, you can streamline your development process and easily manage dependencies in your C++ projects. In addition, you can easily reuse the code in your projects to improve code quality and accelerate development.",
+    "links": []
+  },
+  "PKG5pACLfRS2ogfzBX47_": {
+    "title": "vcpkg",
+    "description": "`vcpkg` is a cross-platform, open-source package manager for C and C++ libraries. Developed by Microsoft, it simplifies the process of acquiring and building open-source libraries for your projects. `vcpkg` supports various platforms including Windows, Linux, and macOS, enabling you to easily manage and integrate external libraries into your projects.\n\nInstallation\n------------\n\nTo install `vcpkg`, follow these steps:\n\n*   Clone the repository:\n    \n        git clone https://github.com/Microsoft/vcpkg.git\n        \n    \n*   Change to the `vcpkg` directory and run the bootstrap script:\n    \n    *   On Windows:\n        \n            .\\bootstrap-vcpkg.bat\n            \n        \n    *   On Linux/macOS:\n        \n            ./bootstrap-vcpkg.sh\n            \n        \n*   (Optional) Add the `vcpkg` executable to your `PATH` environment variable for easy access.\n    \n\nBasic usage\n-----------\n\nHere are some basic examples of using `vcpkg`:\n\n*   Search for a package:\n    \n        vcpkg search <package_name>\n        \n    \n*   Install a package:\n    \n        vcpkg install <package_name>\n        \n    \n*   Remove a package:\n    \n        vcpkg remove <package_name>\n        \n    \n*   List installed packages:\n    \n        vcpkg list\n        \n    \n*   Integrate `vcpkg` with Visual Studio (Windows only):\n    \n        vcpkg integrate install\n        \n    \n\nFor additional documentation and advanced usage, you can refer to the [official GitHub repository](https://github.com/microsoft/vcpkg).",
+    "links": []
+  },
+  "g0s0F4mLV16eNvMBflN2e": {
+    "title": "NuGet",
+    "description": "[NuGet](https://www.nuget.org/) is a Microsoft-supported package manager for the .NET framework, mainly used in C# and other .NET languages, but also supports C++ projects with `PackageReference`. It allows you to easily add, update, and manage dependencies in your projects.\n\n### Installation\n\nYou can use NuGet either as a command-line tool or integrated in your preferred IDE like Visual Studio or Visual Studio Code. If you're using Visual Studio, it comes pre-installed. For other editors, you may need to download the command-line tool `nuget.exe`.\n\n### Usage\n\nYou can use NuGet to manage your C++ dependencies using the PackageReference format in vcxproj files:\n\n*   Tools > NuGet Package Manager > Manage NuGet Packages for Solution…\n*   Package source should be set to \"[nuget.org](http://nuget.org)\"\n*   Select the Projects tab\n*   Use the search box to find packages\n\nFor example, to install a package called \"PackageName\" for all configurations:\n\n    <Project>\n      <ItemGroup>\n        <PackageReference Include=\"PackageName\" Version=\"1.0.0\" />\n      </ItemGroup>\n      ...\n    </Project>\n    \n\n### NuGet Command-Line\n\nYou can also use the command-line tool `nuget.exe` for more advanced scenarios or for specific needs.\n\nHere's an example of installing a package using the command line:\n\n    nuget install PackageName\n    \n\nAnd updating a package:\n\n    nuget update PackageName\n    \n\nFor more information and detailed examples on using NuGet in your projects, please refer to the [official documentation](https://docs.microsoft.com/en-us/nuget/guides/native-packages).",
+    "links": []
+  },
+  "ky_UqizToTZHC_b77qFi2": {
+    "title": "Conan",
+    "description": "[Conan](https://conan.io/) is a popular package manager for C and C++ languages and is designed to be cross-platform, extensible, and easy to use. It allows developers to declare, manage, and fetch dependencies while automating the build process. Conan supports various build systems, such as CMake, Visual Studio, MSBuild, and more.\n\nInstallation\n------------\n\nTo install Conan, you can use pip, the Python package manager:\n\n    pip install conan\n    \n\nBasic Usage\n-----------\n\n*   Create a `conanfile.txt` file in your project root directory, specifying dependencies you need for your project:\n\n    [requires]\n    boost/1.75.0\n    \n    [generators]\n    cmake\n    \n\n*   Run the `conan install` command to fetch and build required dependencies:\n\n    mkdir build && cd build\n    conan install ..\n    \n\n*   Now build your project using your build system, for example CMake:\n\n    cmake .. -DCMAKE_BUILD_TYPE=Release\n    cmake --build .\n    \n\nCreating Packages\n-----------------\n\nTo create a package in Conan, you need to write a `conanfile.py` file with package information and build instructions.\n\nHere's an example:\n\n    from conans import ConanFile, CMake\n    \n    class MyLibraryConan(ConanFile):\n        name = \"MyLibrary\"\n        version = \"0.1\"\n        license = \"MIT\"\n        url = \"https://github.com/username/mylibrary\"\n        description = \"A simple example library\"\n        settings = \"os\", \"compiler\", \"build_type\", \"arch\"\n        generators = \"cmake\"\n    \n        def build(self):\n            cmake = CMake(self)\n            cmake.configure(source_folder=\"src\")\n            cmake.build()\n    \n        def package(self):\n            self.copy(\"*.hpp\", dst=\"include\", src=\"src/include\")\n            self.copy(\"*.lib\", dst=\"lib\", keep_path=False)\n            self.copy(\"*.dll\", dst=\"bin\", keep_path=False)\n            self.copy(\"*.so\", dst=\"lib\", keep_path=False)\n            self.copy(\"*.a\", dst=\"lib\", keep_path=False)\n    \n        def package_info(self):\n            self.cpp_info.libs = [\"MyLibrary\"]\n    \n\nWith that setup, you can create a package by running:\n\n    conan create . username/channel\n    \n\nThis will compile the package and store it in your Conan cache. You can now use this package as a dependency in other projects.",
+    "links": []
+  },
+  "3ehBc2sKVlPj7dn4RVZCH": {
+    "title": "Spack",
+    "description": "[Spack](https://spack.io/) is a flexible package manager designed to support multiple versions, configurations, platforms, and compilers. It is particularly useful in High Performance Computing (HPC) environments and for those who require fine control over their software stack. Spack is a popular choice in scientific computing due to its support for various platforms such as Linux, macOS, and many supercomputers. It is designed to automatically search for and install dependencies, making it easy to build complex software.\n\nKey Features\n------------\n\n*   **Multi-Version Support**: Spack allows for the installation of multiple versions of packages, enabling users to work with different configurations depending on their needs.\n*   **Compiler Support**: Spack supports multiple compilers, including GCC, Clang, Intel, PGI, and others, allowing users to choose the best toolchain for their application.\n*   **Platform Support**: Spack can run on Linux, macOS, and various supercomputers, and it can even target multiple architectures within a single package.\n*   **Dependencies**: Spack takes care of dependencies, providing automatic installation and management of required packages.\n\nBasic Usage\n-----------\n\n*   To install Spack, clone its Git repository and set up your environment:\n    \n        git clone https://github.com/spack/spack.git\n        cd spack\n        . share/spack/setup-env.sh\n        \n    \n*   Install a package using Spack:\n    \n        spack install <package-name>\n        \n    \n    For example, to install `hdf5`:\n    \n        spack install hdf5\n        \n    \n*   Load a package in your environment:\n    \n        spack load <package-name>\n        \n    \n    For example, to load `hdf5`:\n    \n        spack load hdf5\n        \n    \n*   List installed packages:\n    \n        spack find\n        \n    \n*   Uninstall a package:\n    \n        spack uninstall <package-name>\n        \n    \n\nFor more advanced usage, like installing specific versions or using different compilers, consult the [Spack documentation](https://spack.readthedocs.io/).",
+    "links": []
+  },
+  "4kkX5g_-plX9zVqr0ZoiR": {
+    "title": "Working with Libraries",
+    "description": "When working with C++, you may need to use external libraries to assist in various tasks. Libraries are precompiled pieces of code that can be reused in your program to perform a specific task or provide a certain functionality. In C++, libraries can be either static libraries (.lib) or dynamic libraries (.dll in Windows, .so in Unix/Linux).\n\n**1\\. Static Libraries**\n\nStatic libraries are incorporated into your program during compile time. They are linked with your code, creating a larger executable file, but it does not require any external files during runtime.\n\nTo create a static library, you'll need to compile your source files into object files, then bundle them into an archive. You can use the following commands:\n\n    g++ -c sourcefile.cpp -o objectfile.o\n    ar rcs libmystaticlibrary.a objectfile.o\n    \n\nTo use a static library, you need to include the header files in your source code and then link the library during the compilation process:\n\n    g++ main.cpp -o myprogram -L/path/to/your/library/ -lmystaticlibrary\n    \n\nReplace `/path/to/your/library/` with the path where your `libmystaticlibrary.a` file is located.\n\n**2\\. Dynamic Libraries**\n\nDynamic libraries are loaded during runtime, which means that your executable file only contains references to these libraries. The libraries need to be available on the system where your program is running.\n\nTo create a dynamic library, you'll need to compile your source files into object files, then create a shared library:\n\n    g++ -c -fPIC sourcefile.cpp -o objectfile.o\n    g++ -shared -o libmydynamiclibrary.so objectfile.o\n    \n\nTo use a dynamic library, include the library's header files in your source code and then link the library during the compilation process:\n\n    g++ main.cpp -o myprogram -L/path/to/your/library/ -lmydynamiclibrary\n    \n\nReplace `/path/to/your/library/` with the path where your `libmydynamiclibrary.so` file is located.\n\n**NOTE:** When using dynamic libraries, make sure the library is in the system's search path for shared libraries. You may need to update the `LD_LIBRARY_PATH` environment variable on Unix/Linux systems or the `PATH` variable on Windows.\n\nIn conclusion, using libraries in C++ involves creating or obtaining a library (static or dynamic), including the library's header files in your source code, and linking the library during the compilation process. Be aware of the differences between static and dynamic libraries, and choose the right approach to suit your needs.",
+    "links": []
+  },
+  "5mNqH_AEiLxUmgurNW1Fq": {
+    "title": "Library Inclusion",
+    "description": "In C++ programming, inclusion refers to incorporating external libraries, header files, or other code files into your program. This process allows developers to access pre-built functions, classes, and variable declarations that can be used in their own code. There are two types of inclusion in C++:\n\n*   Header Inclusion\n*   Source Inclusion\n\n### Header Inclusion\n\nHeader inclusion involves including header files using the preprocessor directive `#include`. Header files are typically used to provide function prototypes, class declarations, and constant definitions that can be shared across multiple source files. There are two ways to include header files in your program:\n\n*   Angle brackets `<>`: Used for including standard library headers, like `iostream`, `vector`, or `algorithm`.\n\nExample:\n\n    #include <iostream>\n    #include <vector>\n    \n\n*   Double quotes `\"\"`: Used for including user-defined headers or headers provided by third-party libraries.\n\nExample:\n\n    #include \"myHeader.h\"\n    #include \"thirdPartyLibrary.h\"\n    \n\n### Source Inclusion\n\nSource inclusion refers to including the content of a source file directly in another source file. This approach is generally not recommended as it can lead to multiple definitions and increased compile times but it can occasionally be useful for certain tasks (e.g., templates or simple small programs). To include a source file, you can use the `#include` directive with double quotes, just like with header files:\n\nExample:\n\n    #include \"mySourceFile.cpp\"\n    \n\nRemember, using source inclusion for large projects or in situations where it's not necessary can lead to unexpected issues and should be avoided.",
+    "links": []
+  },
+  "sLVs95EOeHZldoKY0L_dH": {
+    "title": "Licensing",
+    "description": "Licensing is a crucial aspect of working with libraries in C++ because it determines the rights and limitations on how you can use, modify, and distribute a given library. There are various types of licenses applied to open-source libraries. Below is a brief overview of three common licenses:\n\nMIT License\n-----------\n\nThe MIT License is a permissive license that allows users to do whatever they want with the software code. They only need to include the original copyright, license notice, and a disclaimer of warranty in their copies.\n\nExample: Including the MIT License into your project can be done by simply adding the license file and a notice at the top of your source code files like:\n\n    /* Copyright (C) [year] [author]\n     * SPDX-License-Identifier:    MIT\n     */\n    \n\nGNU General Public License (GPL)\n--------------------------------\n\nThe GPL is a copyleft license that grants users the rights to use, study, share, and modify the software code. However, any changes made to the code or any software that uses GPL licensed code must also be distributed under the GPL license.\n\nExample: To include a GPL license in your project, include a `COPYING` file with the full text of the license and place a notice in your source code files like:\n\n    /* Copyright (C) [year] [author]\n     * SPDX-License-Identifier:    GPL-3.0-or-later\n     */\n    \n\nApache License 2.0\n------------------\n\nThe Apache License is a permissive license similar to the MIT license and allows users to do virtually anything with the software code. The primary difference is that it requires that any changes to the code are documented, and it provides specific terms for patent protection.\n\nExample: To include the Apache License in your project, add a `LICENSE` file with the full text of the license. Add a notice to your source code files like:\n\n    /* Copyright (C) [year] [author]\n     * SPDX-License-Identifier:    Apache-2.0\n     */\n    \n\nPlease note that these are brief summaries of the licenses, and there are many other licenses available for use in software projects. When using third-party libraries, it is crucial to understand and adhere to the terms of their respective licenses to avoid legal complications.",
+    "links": []
+  },
+  "1d7h5P1Q0RVHryKPVogQy": {
+    "title": "Boost",
+    "description": "",
+    "links": []
+  },
+  "Eq3TKSFJ2F2mrTHAaU2J4": {
+    "title": "OpenCV",
+    "description": "",
+    "links": []
+  },
+  "nOkniNXfXwPPlOEJHJoGl": {
+    "title": "POCO",
+    "description": "",
+    "links": []
+  },
+  "jpMCIWQko7p3ndezYHL4D": {
+    "title": "protobuf",
+    "description": "",
+    "links": []
+  },
+  "621J9W4xCofumNZGo4TZT": {
+    "title": "gRPC",
+    "description": "",
+    "links": []
+  },
+  "j_eNHhs0J08Dt7HVbo4Q2": {
+    "title": "Tensorflow",
+    "description": "",
+    "links": []
+  },
+  "tEkvlJPAkD5fji-MMODL7": {
+    "title": "pybind11",
+    "description": "",
+    "links": []
+  },
+  "q64qFxoCrR38RPsN2lC8x": {
+    "title": "spdlog",
+    "description": "",
+    "links": []
+  },
+  "GGZJaYpRENaqloJzt0VtY": {
+    "title": "opencl",
+    "description": "",
+    "links": []
+  },
+  "1CqQgmHDeo1HlPdpUJS7H": {
+    "title": "fmt",
+    "description": "",
+    "links": []
+  },
+  "et-dXKPYuyVW6eV2K3CM8": {
+    "title": "ranges_v3",
+    "description": "",
+    "links": []
+  },
+  "MrAM-viRaF8DSxB6sVdD9": {
+    "title": "gtest / gmock",
+    "description": "",
+    "links": []
+  },
+  "gAZ9Dqgj1_UkaLzVgzx1t": {
+    "title": "Qt",
+    "description": "",
+    "links": []
+  },
+  "s13jQuaC6gw0Lab3Cbyy6": {
+    "title": "Catch2",
+    "description": "",
+    "links": []
+  },
+  "O0lVEMTAV1pq9sYCKQvh_": {
+    "title": "Orbit Profiler",
+    "description": "",
+    "links": []
+  },
+  "88pr5aN7cctZfDVVo-2ns": {
+    "title": "PyTorch C++",
+    "description": "",
+    "links": []
+  }
+}
\ No newline at end of file
diff --git a/public/roadmap-content/cyber-security.json b/public/roadmap-content/cyber-security.json
index 2b39a4099..a4f20fe88 100644
--- a/public/roadmap-content/cyber-security.json
+++ b/public/roadmap-content/cyber-security.json
@@ -521,11 +521,6 @@
     "title": "Operating Systems",
     "description": "**Operating systems (OS)** are software that manage computer hardware and provide a platform for applications to run. They handle essential functions such as managing memory, processing tasks, controlling input and output devices, and facilitating file management. Key examples include **Windows**, **macOS**, **Linux**, and **Unix**. Each operating system offers different features and interfaces, tailored to specific user needs or system requirements, from desktop computing to server management and embedded systems.\n\nLearn more from the following resources:",
     "links": [
-      {
-        "title": "What is an operating system?",
-        "url": "https://www.geeksforgeeks.org/what-is-an-operating-system/",
-        "type": "article"
-      },
       {
         "title": "What is an operating system as fast as possible",
         "url": "https://www.youtube.com/watch?v=pVzRTmdd9j0",
@@ -708,11 +703,6 @@
         "title": "What are Network Protocols?",
         "url": "https://www.solarwinds.com/resources/it-glossary/network-protocols",
         "type": "article"
-      },
-      {
-        "title": "Types of Network Topology",
-        "url": "https://www.geeksforgeeks.org/types-of-network-topology/",
-        "type": "article"
       }
     ]
   },
@@ -853,11 +843,6 @@
     "title": "loopback",
     "description": "**Loopback** refers to a special network interface used to send traffic back to the same device for testing and diagnostic purposes. The loopback address for IPv4 is `127.0.0.1`, while for IPv6 it is `::1`. When a device sends a request to the loopback address, the network data does not leave the local machine; instead, it is processed internally, allowing developers to test applications or network services without requiring external network access. Loopback is commonly used to simulate network traffic, check local services, or debug issues locally.\n\nLearn more from the following resources:",
     "links": [
-      {
-        "title": "What is a loopback address?",
-        "url": "https://www.geeksforgeeks.org/what-is-a-loopback-address/",
-        "type": "article"
-      },
       {
         "title": "Understanding the loopback address and loopback interfaces",
         "url": "https://study-ccna.com/loopback-interface-loopback-address/",
@@ -1256,11 +1241,6 @@
     "title": "Star",
     "description": "A star network topology is a configuration where all devices (nodes) are connected directly to a central hub or switch. In this arrangement, each node has a dedicated point-to-point link to the central device, forming a star-like structure. This topology offers advantages such as easy installation and reconfiguration, centralized management, and fault isolation. If one connection fails, it doesn't affect others. However, the central hub is a single point of failure for the entire network. Star topologies are commonly used in local area networks (LANs) due to their reliability, scalability, and ease of maintenance, making them a popular choice in both small office and large enterprise environments.\n\nLearn more from the following resources:",
     "links": [
-      {
-        "title": "Advantages and Disadvantages of Star Topology",
-        "url": "https://www.geeksforgeeks.org/advantages-and-disadvantages-of-star-topology/",
-        "type": "article"
-      },
       {
         "title": "Star Topology",
         "url": "https://www.youtube.com/watch?v=EQ3rW22-Py0",
@@ -1698,11 +1678,6 @@
     "title": "Protocol Analyzers",
     "description": "**Protocol analyzers**, also known as network analyzers or packet sniffers, are tools used to capture, inspect, and analyze network traffic. They help diagnose network issues, troubleshoot performance problems, and ensure security by providing detailed insights into the data packets transmitted across a network. Protocol analyzers decode and display various network protocols, such as TCP/IP, HTTP, and DNS, allowing users to understand communication patterns, detect anomalies, and identify potential vulnerabilities. Popular examples include Wireshark and tcpdump.\n\nLearn more from the following resources:",
     "links": [
-      {
-        "title": "What is a protocol analyzer?",
-        "url": "https://www.geeksforgeeks.org/what-is-protocol-analyzer/",
-        "type": "article"
-      },
       {
         "title": "Protocol Analyzers",
         "url": "https://www.youtube.com/watch?v=hTMhlB-o0Ow",
@@ -1733,14 +1708,8 @@
   },
   "xFuWk7M-Vctk_xb7bHbWs": {
     "title": "route",
-    "description": "The `route` command is a network utility used to view and manipulate the IP routing table on Unix-like and Windows systems. It allows users to display the current routes that data packets take, as well as add, modify, or delete routes for network traffic. This command is often used in network troubleshooting and configuration to control how data flows between different networks and subnets. By specifying routes manually, administrators can define specific paths for network traffic, bypassing default routes and optimizing performance or security.\n\nLearn more from the following resources:",
-    "links": [
-      {
-        "title": "How to check the routing table in Linux",
-        "url": "https://www.geeksforgeeks.org/route-command-in-linux-with-examples/",
-        "type": "article"
-      }
-    ]
+    "description": "The `route` command is a network utility used to view and manipulate the IP routing table on Unix-like and Windows systems. It allows users to display the current routes that data packets take, as well as add, modify, or delete routes for network traffic. This command is often used in network troubleshooting and configuration to control how data flows between different networks and subnets. By specifying routes manually, administrators can define specific paths for network traffic, bypassing default routes and optimizing performance or security.",
+    "links": []
   },
   "y8GaUNpaCT1Ai88wPOk6d": {
     "title": "tcpdump",
@@ -2308,11 +2277,6 @@
     "title": "Understand Handshakes",
     "description": "In networking and cybersecurity, a handshake is a process of establishing a secure connection between two parties before data exchange begins. It typically involves a series of predefined messages exchanged to verify identities, agree on communication parameters, and sometimes establish encryption keys. The most common example is the TCP three-way handshake used to initiate a connection. In cryptographic protocols like TLS/SSL, handshakes are more complex, involving certificate verification and key exchange. Handshakes are crucial for ensuring secure, authenticated communications, preventing unauthorized access, and setting up the parameters for efficient data transfer in various network protocols and security systems.\n\nLearn more from the following resources:",
     "links": [
-      {
-        "title": "TCP 3-Way Handshake Process",
-        "url": "https://www.geeksforgeeks.org/tcp-3-way-handshake-process/",
-        "type": "article"
-      },
       {
         "title": "TLS Handshake Explained",
         "url": "https://www.youtube.com/watch?v=86cQJ0MMses",
@@ -3110,14 +3074,8 @@
   },
   "W7bcydXdwlubXF2PHKOuq": {
     "title": "Port Blocking",
-    "description": "Port blocking is an essential practice in hardening the security of your network and devices. It involves restricting, filtering, or entirely denying access to specific network ports to minimize exposure to potential cyber threats. By limiting access to certain ports, you can effectively safeguard your systems against unauthorized access and reduce the likelihood of security breaches.\n\nLearn more from the following resources:",
-    "links": [
-      {
-        "title": "What is port blocking with LAN?",
-        "url": "https://www.geeksforgeeks.org/what-is-port-blocking-within-lan/",
-        "type": "article"
-      }
-    ]
+    "description": "Port blocking is an essential practice in hardening the security of your network and devices. It involves restricting, filtering, or entirely denying access to specific network ports to minimize exposure to potential cyber threats. By limiting access to certain ports, you can effectively safeguard your systems against unauthorized access and reduce the likelihood of security breaches.",
+    "links": []
   },
   "FxuMJmDoDkIsPFp2iocFg": {
     "title": "Group Policy",
diff --git a/public/roadmap-content/data-analyst.json b/public/roadmap-content/data-analyst.json
index b9763e2ae..38cf20ee6 100644
--- a/public/roadmap-content/data-analyst.json
+++ b/public/roadmap-content/data-analyst.json
@@ -6,18 +6,19 @@
   },
   "yCnn-NfSxIybUQ2iTuUGq": {
     "title": "What is Data Analytics",
-    "description": "Data Analytics is a core component of a Data Analyst's role. The field involves extracting meaningful insights from raw data to drive decision-making processes. It includes a wide range of techniques and disciplines ranging from the simple data compilation to advanced algorithms and statistical analysis. As a data analyst, you are expected to understand and interpret complex digital data, such as the usage statistics of a website, the sales figures of a company, or client engagement over social media, etc. This knowledge enables data analysts to support businesses in identifying trends, making informed decisions, predicting potential outcomes - hence playing a crucial role in shaping business strategies.",
-    "links": []
+    "description": "Data Analytics is a core component of a Data Analyst's role. The field involves extracting meaningful insights from raw data to drive decision-making processes. It includes a wide range of techniques and disciplines ranging from the simple data compilation to advanced algorithms and statistical analysis. As a data analyst, you are expected to understand and interpret complex digital data, such as the usage statistics of a website, the sales figures of a company, or client engagement over social media, etc. This knowledge enables data analysts to support businesses in identifying trends, making informed decisions, predicting potential outcomes - hence playing a crucial role in shaping business strategies.\n\nLearn more from the following resources:",
+    "links": [
+      {
+        "title": "Introduction to Data Analytics",
+        "url": "https://www.coursera.org/learn/introduction-to-data-analytics",
+        "type": "course"
+      }
+    ]
   },
   "Lsapbmg-eMIYJAHpV97nO": {
     "title": "Types of Data Analytics",
-    "description": "Data Analytics has proven to be a critical part of decision-making in modern business ventures. It is responsible for discovering, interpreting, and transforming data into valuable information. Different types of data analytics look at past, present, or predictive views of business operations.\n\nData Analysts, as ambassadors of this domain, employ these types, to answer various questions:\n\n*   Descriptive Analytics _(what happened in the past?)_\n*   Diagnostic Analytics _(why did it happened in the past?)_\n*   Predictive Analytics _(what will happen in the future?)_\n*   Prescriptive Analytics _(how can we make it happen?)_\n\nUnderstanding these types gives data analysts the power to transform raw datasets into strategic insights.\n\nVisit the following resources to learn more:",
+    "description": "Data Analytics has proven to be a critical part of decision-making in modern business ventures. It is responsible for discovering, interpreting, and transforming data into valuable information. Different types of data analytics look at past, present, or predictive views of business operations.\n\nData Analysts, as ambassadors of this domain, employ these types, to answer various questions:\n\n*   Descriptive Analytics _(what happened in the past?)_\n*   Diagnostic Analytics _(why did it happened in the past?)_\n*   Predictive Analytics _(what will happen in the future?)_\n*   Prescriptive Analytics _(how can we make it happen?)_\n\nVisit the following resources to learn more:",
     "links": [
-      {
-        "title": "Data Analytics and its type",
-        "url": "https://www.geeksforgeeks.org/data-analytics-and-its-type/",
-        "type": "article"
-      },
       {
         "title": "The 4 Types of Data Analysis: Ultimate Guide",
         "url": "https://careerfoundry.com/en/blog/data-analytics/different-types-of-data-analysis/",
@@ -72,12 +73,12 @@
     "description": "Predictive analysis is a crucial type of data analytics that any competent data analyst should comprehend. It refers to the practice of extracting information from existing data sets in order to determine patterns and forecast future outcomes and trends. Data analysts apply statistical algorithms, machine learning techniques, and artificial intelligence to the data to anticipate future results. Predictive analysis enables organizations to be proactive, forward-thinking, and strategic by providing them valuable insights on future occurrences. It's a powerful tool that gives companies a significant competitive edge by enabling risk management, opportunity identification, and strategic decision-making.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "What is predictive analytics? - Google",
+        "title": "What is Predictive Analytics? - Google",
         "url": "https://cloud.google.com/learn/what-is-predictive-analytics",
         "type": "article"
       },
       {
-        "title": "What is predictive analytics?",
+        "title": "What is Predictive Analytics?",
         "url": "https://www.youtube.com/watch?v=cVibCHRSxB0",
         "type": "video"
       }
@@ -125,7 +126,7 @@
     "description": "The Cleanup of Data is a critical component of a Data Analyst's role. It involves the process of inspecting, cleaning, transforming, and modeling data to discover useful information, inform conclusions, and support decision making. This process is crucial for Data Analysts to generate accurate and significant insights from data, ultimately resulting in better and more informed business decisions. A solid understanding of data cleanup procedures and techniques is a fundamental skill for any Data Analyst. Hence, it is necessary to hold a high emphasis on maintaining data quality by managing data integrity, accuracy, and consistency during the data cleanup process.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "Top 10 ways to clean your data",
+        "title": "Top 10 Ways to Clean Your Data",
         "url": "https://support.microsoft.com/en-gb/office/top-ten-ways-to-clean-your-data-2844b620-677c-47a7-ac3e-c2e157d1db19",
         "type": "article"
       },
@@ -157,7 +158,7 @@
     "description": "The visualization of data is an essential skill in the toolkit of every data analyst. This practice is about transforming complex raw data into a graphical format that allows for an easier understanding of large data sets, trends, outliers, and important patterns. Whether pie charts, line graphs, bar graphs, or heat maps, data visualization techniques not only streamline data analysis, but also facilitate a more effective communication of the findings to others. This key concept underscores the importance of presenting data in a digestible and visually appealing manner to drive data-informed decision making in an organization.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "Data visualization beginner's guide",
+        "title": "Data Visualization Beginner's Guide",
         "url": "https://www.tableau.com/en-gb/learn/articles/data-visualization",
         "type": "article"
       },
@@ -223,7 +224,7 @@
   },
   "yBlJrNo9eO470dLp6OaQZ": {
     "title": "DATEDIF",
-    "description": "The `DATEDIF` function is an incredibly valuable tool for a Data Analyst in Excel or Google Sheets, by providing the ability to calculate the difference between two dates. This function takes in three parameters: start date, end date and the type of difference required (measured in years, months, days, etc.). In Data Analysis, particularly when dealing with time-series data or when you need to uncover trends over specific periods, the `DATEDIF` function is a necessary asset. Recognizing its functionality will enable a data analyst to manipulate or shape data progressively and efficiently.\n\n*   `DATEDIF` is technically still supported, but wont show as an option. For additional information, see Excel \"Help\" page.\n\nLearn more from the following resources:",
+    "description": "The `DATEDIF` function is an incredibly valuable tool for a Data Analyst in Excel or Google Sheets, by providing the ability to calculate the difference between two dates. This function takes in three parameters: start date, end date and the type of difference required (measured in years, months, days, etc.). In Data Analysis, particularly when dealing with time-series data or when you need to uncover trends over specific periods, the `DATEDIF` function is a necessary asset. Recognizing its functionality will enable a data analyst to manipulate or shape data progressively and efficiently.\n\n`DATEDIF` is technically still supported, but wont show as an option. For additional information, see Excel \"Help\" page.\n\nLearn more from the following resources:",
     "links": [
       {
         "title": "DATEDIF function",
@@ -259,7 +260,7 @@
     "links": [
       {
         "title": "Replace Function",
-        "url": "https://support.microsoft.com/en-us/office/replace-function-6acf209b-01b7-4078-b4b8-e0a4ef67d181",
+        "url": "https://support.microsoft.com/en-us/office/replace-function-8d799074-2425-4a8a-84bc-82472868878a",
         "type": "article"
       },
       {
@@ -407,17 +408,17 @@
     "description": "Data Analysts recurrently find the need to summarize, investigate, and analyze their data to make meaningful and insightful decisions. One of the most powerful tools to accomplish this in Microsoft Excel is the Pivot Table. Pivot Tables allow analysts to organize and summarize large quantities of data in a concise, tabular format. The strength of pivot tables comes from their ability to manipulate data dynamically, leading to quicker analysis and richer insights. Understanding and employing Pivot Tables efficiently is a fundamental skill for any data analyst, as it directly impacts their ability to derive significant information from raw datasets.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "Create a pivot table",
+        "title": "Create a Pivot Table",
         "url": "https://support.microsoft.com/en-gb/office/create-a-pivottable-to-analyze-worksheet-data-a9a84538-bfe9-40a9-a8e9-f99134456576",
         "type": "article"
       },
       {
-        "title": "Pivot tables in excel",
+        "title": "Pivot Tables in Excel",
         "url": "https://www.excel-easy.com/data-analysis/pivot-tables.html",
         "type": "article"
       },
       {
-        "title": "How to create a pivot table in excel",
+        "title": "How to Create a Pivot Table in Excel",
         "url": "https://www.youtube.com/watch?v=PdJzy956wo4",
         "type": "video"
       }
@@ -452,15 +453,31 @@
   },
   "M1QtGTLyygIjePoCfvjve": {
     "title": "Data Manipulation Libraries",
-    "description": "Data manipulation libraries are essential tools in data science and analytics, enabling efficient handling, transformation, and analysis of large datasets. Python, a popular language for data science, offers several powerful libraries for this purpose. Pandas is a highly versatile library that provides data structures like DataFrames, which allow for easy manipulation and analysis of tabular data. NumPy, another fundamental library, offers support for large, multi-dimensional arrays and matrices, along with a collection of mathematical functions to operate on these arrays. Together, Pandas and NumPy form the backbone of data manipulation in Python, facilitating tasks such as data cleaning, merging, reshaping, and statistical analysis, thus streamlining the data preparation process for machine learning and other data-driven applications.",
-    "links": []
+    "description": "Data manipulation libraries are essential tools in data science and analytics, enabling efficient handling, transformation, and analysis of large datasets. Python, a popular language for data science, offers several powerful libraries for this purpose. Pandas is a highly versatile library that provides data structures like DataFrames, which allow for easy manipulation and analysis of tabular data. NumPy, another fundamental library, offers support for large, multi-dimensional arrays and matrices, along with a collection of mathematical functions to operate on these arrays. Together, Pandas and NumPy form the backbone of data manipulation in Python, facilitating tasks such as data cleaning, merging, reshaping, and statistical analysis, thus streamlining the data preparation process for machine learning and other data-driven applications.\n\nLearn more from the following resources:",
+    "links": [
+      {
+        "title": "Pandas",
+        "url": "https://pandas.pydata.org/",
+        "type": "article"
+      },
+      {
+        "title": "NumPy",
+        "url": "https://numpy.org/",
+        "type": "article"
+      },
+      {
+        "title": "Top Python Libraries for Data Science",
+        "url": "https://www.simplilearn.com/top-python-libraries-for-data-science-article",
+        "type": "article"
+      }
+    ]
   },
   "8OXmF2Gn6TYJotBRvDjqA": {
     "title": "Pandas",
     "description": "Pandas is a widely acknowledged and highly useful data manipulation library in the world of data analysis. Known for its robust features like data cleaning, wrangling and analysis, pandas has become one of the go-to tools for data analysts. Built on NumPy, it provides high-performance, easy-to-use data structures and data analysis tools. In essence, its flexibility and versatility make it a critical part of the data analyst's toolkit, as it holds the capability to cater to virtually every data manipulation task.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "Pandas Website",
+        "title": "Pandas",
         "url": "https://pandas.pydata.org/",
         "type": "article"
       },
@@ -473,7 +490,7 @@
   },
   "l1SnPc4EMqGdaIAhIQfrT": {
     "title": "Data Visualisation Libraries",
-    "description": "Data visualization libraries are crucial in data science for transforming complex datasets into clear and interpretable visual representations, facilitating better understanding and communication of data insights. In Python, several libraries are widely used for this purpose. Matplotlib is a foundational library that offers comprehensive tools for creating static, animated, and interactive plots. Seaborn, built on top of Matplotlib, provides a high-level interface for drawing attractive and informative statistical graphics with minimal code. Plotly is another powerful library that allows for the creation of interactive and dynamic visualizations, which can be easily embedded in web applications. Additionally, libraries like Bokeh and Altair offer capabilities for creating interactive plots and dashboards, enhancing exploratory data analysis and the presentation of data findings. Together, these libraries enable data scientists to effectively visualize trends, patterns, and outliers in their data, making the analysis more accessible and actionable.",
+    "description": "Data visualization libraries are crucial in data science for transforming complex datasets into clear and interpretable visual representations, facilitating better understanding and communication of data insights. In Python, several libraries are widely used for this purpose. Matplotlib is a foundational library that offers comprehensive tools for creating static, animated, and interactive plots. Seaborn, built on top of Matplotlib, provides a high-level interface for drawing attractive and informative statistical graphics with minimal code. Plotly is another powerful library that allows for the creation of interactive and dynamic visualizations, which can be easily embedded in web applications. Additionally, libraries like Bokeh and Altair offer capabilities for creating interactive plots and dashboards, enhancing exploratory data analysis and the presentation of data findings. Together, these libraries enable data scientists to effectively visualize trends, patterns, and outliers in their data, making the analysis more accessible and actionable.\n\nLearn more from the following resources:",
     "links": []
   },
   "uGkXxdMXUMY-3fQFS1jK8": {
@@ -481,7 +498,7 @@
     "description": "Matplotlib is a paramount data visualization library used extensively by data analysts for generating a wide array of plots and graphs. Through Matplotlib, data analysts can convey results clearly and effectively, driving insights from complex data sets. It offers a hierarchical environment which is very natural for a data scientist to work with. Providing an object-oriented API, it allows for extensive customization and integration into larger applications. From histograms, bar charts, scatter plots to 3D graphs, the versatility of Matplotlib assists data analysts in the better comprehension and compelling representation of data.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "Matplotlib Website",
+        "title": "Matplotlib",
         "url": "https://matplotlib.org/",
         "type": "article"
       },
@@ -497,7 +514,7 @@
     "description": "Dplyr is a powerful and popular toolkit for data manipulation in R. As a data analyst, this library provides integral functions to manipulate, clean, and process data efficiently. It has been designed to be easy and intuitive, ensuring a robust and consistent syntax. Dplyr ensures data reliability and fast processing, essential for analysts dealing with large datasets. With a strong focus on efficiency, dplyr functions like select, filter, arrange, mutate, summarise, and group\\_by optimise data analysis operations, making data manipulation a smoother and hassle-free procedure for data analysts.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "dplyr website",
+        "title": "dplyr",
         "url": "https://dplyr.tidyverse.org/",
         "type": "article"
       },
@@ -513,7 +530,7 @@
     "description": "When it comes to data visualization in R programming, ggplot2 stands tall as one of the primary tools for data analysts. This data visualization library, which forms part of the tidyverse suite of packages, facilitates the creation of complex and sophisticated visual narratives. With its grammar of graphics philosophy, ggplot2 enables analysts to build graphs and charts layer by layer, thereby offering detailed control over graphical features and design. Its versatility in creating tailored and aesthetically pleasing graphics is a vital asset for any data analyst tackling exploratory data analysis, reporting, or dashboard building.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "ggplot2 website",
+        "title": "ggplot2",
         "url": "https://ggplot2.tidyverse.org/",
         "type": "article"
       },
@@ -526,21 +543,27 @@
   },
   "_sjXCLHHTbZromJYn6fnu": {
     "title": "Data Collection",
-    "description": "In the context of the Data Analyst role, data collection is a foundational process that entails gathering relevant data from various sources. This data can be quantitative or qualitative and may be sourced from databases, online platforms, customer feedback, among others. The gathered information is then cleaned, processed, and interpreted to extract meaningful insights. A data analyst performs this whole process carefully, as the quality of data is paramount to ensuring accurate analysis, which in turn informs business decisions and strategies. This highlights the importance of an excellent understanding, proper tools, and precise techniques when it comes to data collection in data analysis.",
-    "links": []
+    "description": "Data collection is a foundational process that entails gathering relevant data from various sources. This data can be quantitative or qualitative and may be sourced from databases, online platforms, customer feedback, among others. The gathered information is then cleaned, processed, and interpreted to extract meaningful insights. A data analyst performs this whole process carefully, as the quality of data is paramount to ensuring accurate analysis, which in turn informs business decisions and strategies. This highlights the importance of an excellent understanding, proper tools, and precise techniques when it comes to data collection in data analysis.\n\nLearn more from the following resources:",
+    "links": [
+      {
+        "title": "Data Collection",
+        "url": "https://en.wikipedia.org/wiki/Data_collection",
+        "type": "article"
+      }
+    ]
   },
   "tYPeLCxbqvMFlTkCGjdHg": {
     "title": "Databases",
     "description": "Behind every strong data analyst, there's not just a rich assortment of data, but a set of robust databases that enable effective data collection. Databases are a fundamental aspect of data collection in a world where the capability to manage, organize, and evaluate large volumes of data is critical. As a data analyst, the understanding and use of databases is instrumental in capturing the necessary data for conducting qualitative and quantitative analysis, forecasting trends and making data-driven decisions. Thorough knowledge of databases, therefore, can be considered a key component of a data analyst's arsenal. These databases can vary from relational databases like SQL to NoSQL databases like MongoDB, each serving a unique role in the data collection process.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "PostgreSQL Roadmap",
-        "url": "https://roadmap.sh/postgresql-dba",
+        "title": "Visit Dedicated SQL Roadmap",
+        "url": "https://roadmap.sh/sql",
         "type": "article"
       },
       {
-        "title": "MongoDB Roadmap",
-        "url": "https://roadmap.sh/mongodb",
+        "title": "Visit Dedicated PostgreSQL Roadmap",
+        "url": "https://roadmap.sh/postgresql-dba",
         "type": "article"
       }
     ]
@@ -571,7 +594,7 @@
         "type": "article"
       },
       {
-        "title": "A beginners guide to APIs",
+        "title": "A Beginner's Guide to APIs",
         "url": "https://www.postman.com/what-is-an-api/",
         "type": "article"
       }
@@ -582,12 +605,12 @@
     "description": "Web scraping plays a significant role in collecting unique datasets for data analysis. In the realm of a data analyst's tasks, web scraping refers to the method of extracting information from websites and converting it into a structured usable format like a CSV, Excel spreadsheet, or even into databases. This technique allows data analysts to gather large sets of data from the internet, which otherwise could be time-consuming if done manually. The capability of web scraping and parsing data effectively can give data analysts a competitive edge in their data analysis process, from unlocking in-depth, insightful information to making data-driven decisions.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "What is web scraping what is it used for?",
+        "title": "What is Web Scraping & What is it used for?",
         "url": "https://www.parsehub.com/blog/what-is-web-scraping/",
         "type": "article"
       },
       {
-        "title": "What is web scraping?",
+        "title": "What is Web Scraping?",
         "url": "https://www.youtube.com/watch?v=dlj_QL-ENJM",
         "type": "video"
       }
@@ -595,8 +618,14 @@
   },
   "E6cpb6kvluJM8OGuDcFBT": {
     "title": "Data Cleanup",
-    "description": "Data cleaning, which is often referred as data cleansing or data scrubbing, is one of the most important and initial steps in the data analysis process. As a data analyst, the bulk of your work often revolves around understanding, cleaning, and standardizing raw data before analysis. Data cleaning involves identifying, correcting or removing any errors or inconsistencies in datasets in order to improve their quality. The process is crucial because it directly determines the accuracy of the insights you generate - garbage in, garbage out. Even the most sophisticated models and visualizations would not be of much use if they're based on dirty data. Therefore, mastering data cleaning techniques is essential for any data analyst.",
-    "links": []
+    "description": "Data cleaning, which is often referred as data cleansing or data scrubbing, is one of the most important and initial steps in the data analysis process. As a data analyst, the bulk of your work often revolves around understanding, cleaning, and standardizing raw data before analysis. Data cleaning involves identifying, correcting or removing any errors or inconsistencies in datasets in order to improve their quality. The process is crucial because it directly determines the accuracy of the insights you generate - garbage in, garbage out. Even the most sophisticated models and visualizations would not be of much use if they're based on dirty data. Therefore, mastering data cleaning techniques is essential for any data analyst.\n\nLearn more from the following resources:",
+    "links": [
+      {
+        "title": "Data Cleaning",
+        "url": "https://www.tableau.com/learn/articles/what-is-data-cleaning#:~:text=tools%20and%20software-,What%20is%20data%20cleaning%3F,to%20be%20duplicated%20or%20mislabeled.",
+        "type": "article"
+      }
+    ]
   },
   "X9WmfHOks82BIAzs6abqO": {
     "title": "Handling Missing Data",
@@ -636,14 +665,14 @@
     "links": [
       {
         "title": "Outliers",
-        "url": "%5Bhttps://www.mathsisfun.com/data/outliers.html",
+        "url": "https://www.mathsisfun.com/data/outliers.html",
         "type": "article"
       }
     ]
   },
   "t_BRtEharsrOZxoyX0OzV": {
     "title": "Data Transformation",
-    "description": "Data Transformation, also known as Data Wrangling, is an essential part of a Data Analyst's role. This process involves the conversion of data from a raw format into another format to make it more appropriate and valuable for a variety of downstream purposes such as analytics. Data Analysts transform data to make the data more suitable for analysis, ensure accuracy, and to improve data quality. The right transformation techniques can give the data a structure, multiply its value, and enhance the accuracy of the analytics performed by serving meaningful results.",
+    "description": "Data Transformation, also known as Data Wrangling, is an essential part of a Data Analyst's role. This process involves the conversion of data from a raw format into another format to make it more appropriate and valuable for a variety of downstream purposes such as analytics. Data Analysts transform data to make the data more suitable for analysis, ensure accuracy, and to improve data quality. The right transformation techniques can give the data a structure, multiply its value, and enhance the accuracy of the analytics performed by serving meaningful results.\n\nLearn more from the following resources:",
     "links": [
       {
         "title": "What is data transformation?",
@@ -662,7 +691,7 @@
     "description": "In the realms of data analysis, data cleaning is a crucial preliminary process, this is where `pandas` - a popular python library - shines. Primarily used for data manipulation and analysis, pandas adopts a flexible and powerful data structure (DataFrames and Series) that greatly simplifies the process of cleaning raw, messy datasets. Data analysts often work with large volumes of data, some of which may contain missing or inconsistent data that can negatively impact the results of their analysis. By utilizing pandas, data analysts can quickly identify, manage and fill these missing values, drop unnecessary columns, rename column headings, filter specific data, apply functions for more complex data transformations and much more. Thus, making pandas an invaluable tool for effective data cleaning in data analysis.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "Pandas Website",
+        "title": "Pandas",
         "url": "https://pandas.pydata.org/",
         "type": "article"
       },
@@ -678,7 +707,7 @@
     "description": "Data cleaning plays a crucial role in the data analysis pipeline, where it rectifies and enhances the quality of data to increase the efficiency and authenticity of the analytical process. The `dplyr` package, an integral part of the `tidyverse` suite in R, has become a staple in the toolkit of data analysts dealing with data cleaning. `dplyr` offers a coherent set of verbs that significantly simplifies the process of manipulating data structures, such as dataframes and databases. This involves selecting, sorting, filtering, creating or modifying variables, and aggregating records, among other operations. Incorporating `dplyr` into the data cleaning phase enables data analysts to perform operations more effectively, improve code readability, and handle large and complex data with ease.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "dplyr website",
+        "title": "dplyr",
         "url": "https://dplyr.tidyverse.org/",
         "type": "article"
       },
@@ -790,7 +819,7 @@
     "description": "When focusing on data analysis, understanding key statistical concepts is crucial. Amongst these, central tendency is a foundational element. Central Tendency refers to the measure that determines the center of a distribution. The average is a commonly used statistical tool by which data analysts discern trends and patterns. As one of the most recognized forms of central tendency, figuring out the \"average\" involves summing all values in a data set and dividing by the number of values. This provides analysts with a 'typical' value, around which the remaining data tends to cluster, facilitating better decision-making based on existing data.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "How to calculate the average",
+        "title": "How to Calculate the Average",
         "url": "https://support.microsoft.com/en-gb/office/calculate-the-average-of-a-group-of-numbers-e158ef61-421c-4839-8290-34d7b1e68283#:~:text=Average%20This%20is%20the%20arithmetic,by%206%2C%20which%20is%205.",
         "type": "article"
       },
@@ -806,7 +835,7 @@
     "description": "The concept of Range refers to the spread of a dataset, primarily in the realm of statistics and data analysis. This measure is crucial for a data analyst as it provides an understanding of the variability amongst the numbers within a dataset. Specifically in a role such as Data Analyst, understanding the range and dispersion aids in making more precise analyses and predictions. Understanding the dispersion within a range can highlight anomalies, identify standard norms, and form the foundation for statistical conclusions like the standard deviation, variance, and interquartile range. It allows for the comprehension of the reliability and stability of particular datasets, which can help guide strategic decisions in many industries. Therefore, range is a key concept that every data analyst must master.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "How to find the range of a data set",
+        "title": "How to Find the Range of a Data Set",
         "url": "https://www.scribbr.co.uk/stats/range-statistics/",
         "type": "article"
       }
@@ -817,12 +846,12 @@
     "description": "Data analysts heavily rely on statistical concepts to analyze and interpret data, and one such fundamental concept is variance. Variance, an essential measure of dispersion, quantifies the spread of data, providing insight into the level of variability within the dataset. Understanding variance is crucial for data analysts as the reliability of many statistical models depends on the assumption of constant variance across observations. In other words, it helps analysts determine how much data points diverge from the expected value or mean, which can be pivotal in identifying outliers, understanding data distribution, and driving decision-making processes. However, variance can't be interpreted in the original units of measurement due to its squared nature, which is why it is often used in conjunction with its square root, the standard deviation.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "What is variance?",
+        "title": "What is Variance?",
         "url": "https://www.investopedia.com/terms/v/variance.asp",
         "type": "article"
       },
       {
-        "title": "How to calculate variance",
+        "title": "How to Calculate Variance",
         "url": "https://www.scribbr.co.uk/stats/variance-meaning/",
         "type": "article"
       }
@@ -892,7 +921,7 @@
     "description": "Tableau is a powerful data visualization tool utilized extensively by data analysts worldwide. Its primary role is to transform raw, unprocessed data into an understandable format without any technical skills or coding. Data analysts use Tableau to create data visualizations, reports, and dashboards that help businesses make more informed, data-driven decisions. They also use it to perform tasks like trend analysis, pattern identification, and forecasts, all within a user-friendly interface. Moreover, Tableau's data visualization capabilities make it easier for stakeholders to understand complex data and act on insights quickly.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "Tableau Website",
+        "title": "Tableau",
         "url": "https://www.tableau.com/en-gb",
         "type": "article"
       },
@@ -908,7 +937,7 @@
     "description": "PowerBI, an interactive data visualization and business analytics tool developed by Microsoft, plays a crucial role in the field of a data analyst's work. It helps data analysts to convert raw data into meaningful insights through it's easy-to-use dashboards and reports function. This tool provides a unified view of business data, allowing analysts to track and visualize key performance metrics and make better-informed business decisions. With PowerBI, data analysts also have the ability to manipulate and produce visualizations of large data sets that can be shared across an organization, making complex statistical information more digestible.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "Power BI Website",
+        "title": "Power BI",
         "url": "https://www.microsoft.com/en-us/power-platform/products/power-bi",
         "type": "article"
       },
@@ -924,7 +953,7 @@
     "description": "For a Data Analyst, understanding data and being able to represent it in a visually insightful form is a crucial part of effective decision-making in any organization. Matplotlib, a plotting library for the Python programming language, is an extremely useful tool for this purpose. It presents a versatile framework for generating line plots, scatter plots, histogram, bar charts and much more in a very straightforward manner. This library also allows for comprehensive customizations, offering a high level of control over the look and feel of the graphics it produces, which ultimately enhances the quality of data interpretation and communication.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "Matplotlib Website",
+        "title": "Matplotlib",
         "url": "https://matplotlib.org/",
         "type": "article"
       },
@@ -940,7 +969,7 @@
     "description": "Seaborn is a robust, comprehensive Python library focused on the creation of informative and attractive statistical graphics. As a data analyst, seaborn plays an essential role in elaborating complex visual stories with the data. It aids in understanding the data by providing an interface for drawing attractive and informative statistical graphics. Seaborn is built on top of Python's core visualization library Matplotlib, and is integrated with data structures from Pandas. This makes seaborn an integral tool for data visualization in the data analyst's toolkit, making the exploration and understanding of data easier and more intuitive.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "Seaborn Website",
+        "title": "Seaborn",
         "url": "https://seaborn.pydata.org/",
         "type": "article"
       },
@@ -972,12 +1001,12 @@
     "description": "As a vital tool in the data analyst's arsenal, bar charts are essential for analyzing and interpreting complex data. Bar charts, otherwise known as bar graphs, are frequently used graphical displays for dealing with categorical data groups or discrete variables. With their stark visual contrast and definitive measurements, they provide a simple yet effective means of identifying trends, understanding data distribution, and making data-driven decisions. By analyzing the lengths or heights of different bars, data analysts can effectively compare categories or variables against each other and derive meaningful insights effectively. Simplicity, readability, and easy interpretation are key features that make bar charts a favorite in the world of data analytics.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "A complete guide to bar charts",
+        "title": "A Complete Guide to Bar Charts",
         "url": "https://www.atlassian.com/data/charts/bar-chart-complete-guide",
         "type": "article"
       },
       {
-        "title": "What is a bar chart?",
+        "title": "What is a Bar Chart?",
         "url": "https://www.youtube.com/watch?v=WTVdncVCvKo",
         "type": "video"
       }
@@ -1004,7 +1033,7 @@
     "description": "A scatter plot, a crucial aspect of data visualization, is a mathematical diagram using Cartesian coordinates to represent values from two different variables. As a data analyst, understanding and interpreting scatter plots can be instrumental in identifying correlations and trends within a dataset, drawing meaningful insights, and showcasing these findings in a clear, visual manner. In addition, scatter plots are paramount in predictive analytics as they reveal patterns which can be used to predict future occurrences.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "Mastering scatter plots",
+        "title": "Mastering Scatter Plots",
         "url": "https://www.atlassian.com/data/charts/what-is-a-scatter-plot",
         "type": "article"
       },
@@ -1052,7 +1081,7 @@
     "description": "A stacked chart is an essential tool for a data analyst in the field of data visualization. This type of chart presents quantitative data in a visually appealing manner and allows users to easily compare different categories while still being able to compare the total sizes. These charts are highly effective when trying to measure part-to-whole relationships, displaying accumulated totals over time or when presenting data with multiple variables. Data analysts often use stacked charts to detect patterns, trends and anomalies which can aid in strategic decision making.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "What is a stacked chart?",
+        "title": "What is a Stacked Chart?",
         "url": "https://www.spotfire.com/glossary/what-is-a-stacked-chart",
         "type": "article"
       },
@@ -1068,12 +1097,12 @@
     "description": "Heatmaps are a crucial component of data visualization that Data Analysts regularly employ in their analyses. As one of many possible graphical representations of data, heatmaps show the correlation or scale of variation between two or more variables in a dataset, making them extremely useful for pattern recognition and outlier detection. Individual values within a matrix are represented in a heatmap as colors, with differing intensities indicating the degree or strength of an occurrence. In short, a Data Analyst would use a heatmap to decode complex multivariate data and turn it into an easily understandable visual that aids in decision making.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "A complete guide to heatmaps",
+        "title": "A Complete Guide to Heatmaps",
         "url": "https://www.hotjar.com/heatmaps/",
         "type": "article"
       },
       {
-        "title": "What is a heatmap?",
+        "title": "What is a Heatmap?",
         "url": "https://www.atlassian.com/data/charts/heatmap-complete-guide",
         "type": "article"
       }
@@ -1084,12 +1113,12 @@
     "description": "As a data analyst, understanding and efficiently using various forms of data visualization is crucial. Among these, Pie Charts represent a significant tool. Essentially, pie charts are circular statistical graphics divided into slices to illustrate numerical proportions. Each slice of the pie corresponds to a particular category. The pie chart's beauty lies in its simplicity and visual appeal, making it an effective way to convey relative proportions or percentages at a glance. For a data analyst, it's particularly useful when you want to show a simple distribution of categorical data. Like any tool, though, it's important to use pie charts wisely—ideally, when your data set has fewer than seven categories, and the proportions between categories are distinct.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "A complete guide to pie charts",
+        "title": "A Complete Guide to Pie Charts",
         "url": "https://www.atlassian.com/data/charts/pie-chart-complete-guide",
         "type": "article"
       },
       {
-        "title": "What is a a pie chart",
+        "title": "What is a Pie Chart",
         "url": "https://www.youtube.com/watch?v=GjJdZaQrItg",
         "type": "video"
       }
@@ -1097,13 +1126,30 @@
   },
   "2g19zjEASJw2ve57hxpr0": {
     "title": "Data Visualisation",
-    "description": "Data Visualization is a fundamental fragment of the responsibilities of a data analyst. It involves the presentation of data in a graphical or pictorial format which allows decision-makers to see analytics visually. This practice can help them comprehend difficult concepts or establish new patterns. With interactive visualization, data analysts can take the data analysis process to a whole new level — drill down into charts and graphs for more detail, and interactively changing what data is presented or how it’s processed. Thereby it forms a crucial link in the chain of converting raw data to actionable insights which is one of the primary roles of a Data Analyst.",
-    "links": []
+    "description": "Data Visualization is a fundamental fragment of the responsibilities of a data analyst. It involves the presentation of data in a graphical or pictorial format which allows decision-makers to see analytics visually. This practice can help them comprehend difficult concepts or establish new patterns. With interactive visualization, data analysts can take the data analysis process to a whole new level — drill down into charts and graphs for more detail, and interactively changing what data is presented or how it’s processed. Thereby it forms a crucial link in the chain of converting raw data to actionable insights which is one of the primary roles of a Data Analyst.\n\nLearn more from the following resources:",
+    "links": [
+      {
+        "title": "What is Data Visualization?",
+        "url": "https://www.ibm.com/think/topics/data-visualization",
+        "type": "article"
+      }
+    ]
   },
   "TeewVruErSsD4VLXcaDxp": {
     "title": "Statistical Analysis",
     "description": "Statistical analysis is a core component of a data analyst's toolkit. As professionals dealing with vast amount of structured and unstructured data, data analysts often turn to statistical methods to extract insights and make informed decisions. The role of statistical analysis in data analytics involves gathering, reviewing, and interpreting data for various applications, enabling businesses to understand their performance, trends, and growth potential. Data analysts use a range of statistical techniques from modeling, machine learning, and data mining, to convey vital information that supports strategic company actions.\n\nLearn more from the following resources:",
-    "links": []
+    "links": [
+      {
+        "title": "Understanding Statistical Analysis",
+        "url": "https://www.simplilearn.com/what-is-statistical-analysis-article",
+        "type": "article"
+      },
+      {
+        "title": "Statistical Analysis",
+        "url": "https://www.youtube.com/watch?v=XjMBZE1DuBY",
+        "type": "video"
+      }
+    ]
   },
   "Xygwu0m5TeYT6S_8FKKXh": {
     "title": "Hypothesis Testing",
@@ -1155,7 +1201,7 @@
   },
   "mCUW07rx74_dUNi7OGVlj": {
     "title": "Visualizing Distributions",
-    "description": "Visualising Distributions, from a data analyst's perspective, plays a key role in understanding the overall distribution and identifying patterns within data. It aids in summarising, structuring, and plotting structured data graphically to provide essential insights. This includes using different chart types like bar graphs, histograms, and scatter plots for interval data, and pie or bar graphs for categorical data. Ultimately, the aim is to provide a straightforward and effective manner to comprehend the data's characteristics and underlying structure. A data analyst uses these visualisation techniques to make initial conclusions, detect anomalies, and decide on further analysis paths.\n\nLearn more from the following resources:",
+    "description": "Visualising Distributions, from a data analyst's perspective, plays a key role in understanding the overall distribution and identifying patterns within data. It aids in summarizing, structuring, and plotting structured data graphically to provide essential insights. This includes using different chart types like bar graphs, histograms, and scatter plots for interval data, and pie or bar graphs for categorical data. Ultimately, the aim is to provide a straightforward and effective manner to comprehend the data's characteristics and underlying structure. A data analyst uses these visualisation techniques to make initial conclusions, detect anomalies, and decide on further analysis paths.\n\nLearn more from the following resources:",
     "links": [
       {
         "title": "Data Visualizations that Capture Distributions",
@@ -1195,12 +1241,12 @@
     "description": "Unsupervised learning, as a fundamental aspect of Machine Learning, holds great implications in the realm of data analytics. It is an approach where a model learns to identify patterns and relationships within a dataset that isn't labelled or classified. It is especially useful for a Data Analyst as it can assist in recognizing unforeseen trends, providing new insights or preparing data for other machine learning tasks. This ability to infer without direct supervision allows a vast potential for latent structure discovery and new knowledge derivation from raw data.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "What is unsupervised learning?",
+        "title": "What is Unsupervised Learning?",
         "url": "https://cloud.google.com/discover/what-is-unsupervised-learning",
         "type": "article"
       },
       {
-        "title": "Introduction to unsupervised learning",
+        "title": "Introduction to Unsupervised Learning",
         "url": "https://www.datacamp.com/blog/introduction-to-unsupervised-learning",
         "type": "article"
       }
@@ -1211,7 +1257,7 @@
     "description": "Supervised machine learning forms an integral part of the toolset for a Data Analyst. With a direct focus on building predictive models from labeled datasets, it involves training an algorithm based on these known inputs and outputs, helping Data Analysts establish correlations and make reliable predictions. Fortifying a Data Analyst's role, supervised machine learning enables the accurate interpretation of complex data, enhancing decision-making processes.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "What is supervised learning?",
+        "title": "What is Supervised Learning?",
         "url": "https://cloud.google.com/discover/what-is-supervised-learning",
         "type": "article"
       },
@@ -1275,12 +1321,12 @@
     "description": "As a data analyst, it's crucial to understand various model evaluation techniques. These techniques involve different methods to measure the performance or accuracy of machine learning models. For instance, using confusion matrix, precision, recall, F1 score, ROC curves or Root Mean Squared Error (RMSE) among others. Knowing how to apply these techniques effectively not only helps in selecting the best model for a specific problem but also guides in tuning the performance of the models for optimal results. Understanding these model evaluation techniques also allows data analysts to interpret evaluation results and determine the effectiveness and applicability of a model.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "What is model evaluation",
+        "title": "What is Model Evaluation",
         "url": "https://domino.ai/data-science-dictionary/model-evaluation",
         "type": "article"
       },
       {
-        "title": "Model evaluation metrics",
+        "title": "Model Evaluation Metrics",
         "url": "https://www.markovml.com/blog/model-evaluation-metrics",
         "type": "article"
       }
@@ -1288,8 +1334,14 @@
   },
   "_aUQZWUhFRvNu0MZ8CPit": {
     "title": "Big Data Technologies",
-    "description": "In the modern digitized world, Big Data refers to extremely large datasets that are challenging to manage and analyze using traditional data processing applications. These datasets often come from numerous different sources and are not only voluminous but also diverse in nature, including structured and unstructured data. The role of a data analyst in the context of big data is crucial. Data analysts are responsible for inspecting, cleaning, transforming, and modeling big data to discover useful information, conclude and support decision-making. They leverage their analytical skills and various big data tools and technologies to extract insights that can benefit the organization and drive strategic business initiatives.",
-    "links": []
+    "description": "In the modern digitized world, Big Data refers to extremely large datasets that are challenging to manage and analyze using traditional data processing applications. These datasets often come from numerous different sources and are not only voluminous but also diverse in nature, including structured and unstructured data. The role of a data analyst in the context of big data is crucial. Data analysts are responsible for inspecting, cleaning, transforming, and modeling big data to discover useful information, conclude and support decision-making. They leverage their analytical skills and various big data tools and technologies to extract insights that can benefit the organization and drive strategic business initiatives.\n\nLearn more from the following resources:",
+    "links": [
+      {
+        "title": "Big Data Analytics",
+        "url": "https://www.ibm.com/think/topics/big-data-analytics",
+        "type": "article"
+      }
+    ]
   },
   "m1IfG2sEedUxMXrv_B8GW": {
     "title": "Big Data Concepts",
@@ -1360,7 +1412,7 @@
     "description": "Hadoop is a critical element in the realm of data processing frameworks, offering an effective solution for storing, managing, and analyzing massive amounts of data. Unraveling meaningful insights from a large deluge of data is a challenging pursuit faced by many data analysts. Regular data processing tools fail to handle large-scale data, paving the way for advanced frameworks like Hadoop. This open-source platform by Apache Software Foundation excels at storing and processing vast data across clusters of computers. Notably, Hadoop comprises two key modules - the Hadoop Distributed File System (HDFS) for storage and MapReduce for processing. Hadoop’s ability to handle both structured and unstructured data further broadens its capacity. For any data analyst, a thorough understanding of Hadoop can unlock powerful ways to manage data effectively and construct meaningful analytics.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "Apache Hadoop Website",
+        "title": "Apache Hadoop",
         "url": "https://hadoop.apache.org/",
         "type": "article"
       },
@@ -1381,7 +1433,7 @@
         "type": "opensource"
       },
       {
-        "title": "Apache Spark Website",
+        "title": "Apache Spark",
         "url": "https://spark.apache.org/",
         "type": "article"
       }
@@ -1421,15 +1473,21 @@
   },
   "SiYUdtYMDImRPmV2_XPkH": {
     "title": "Deep Learning (Optional)",
-    "description": "Deep learning, a subset of machine learning technique, is increasingly becoming a critical tool for data analysts. Deep learning algorithms utilize multiple layers of neural networks to understand and interpret intricate structures in large data, a skill that is integral to the daily functions of a data analyst. With the ability to learn from unstructured or unlabeled data, deep learning opens a whole new range of possibilities for data analysts in terms of data processing, prediction, and categorization. It has applications in a variety of industries from healthcare to finance to e-commerce and beyond. A deeper understanding of deep learning methodologies can augment a data analyst's capability to evaluate and interpret complex datasets and provide valuable insights for decision making.",
-    "links": []
+    "description": "Deep learning, a subset of machine learning technique, is increasingly becoming a critical tool for data analysts. Deep learning algorithms utilize multiple layers of neural networks to understand and interpret intricate structures in large data, a skill that is integral to the daily functions of a data analyst. With the ability to learn from unstructured or unlabeled data, deep learning opens a whole new range of possibilities for data analysts in terms of data processing, prediction, and categorization. It has applications in a variety of industries from healthcare to finance to e-commerce and beyond. A deeper understanding of deep learning methodologies can augment a data analyst's capability to evaluate and interpret complex datasets and provide valuable insights for decision making.\n\nLearn more from the following resources:",
+    "links": [
+      {
+        "title": "Deep Learning for Data Analysis",
+        "url": "https://www.ibm.com/think/topics/deep-learning",
+        "type": "article"
+      }
+    ]
   },
   "gGHsKcS92StK5FolzmVvm": {
     "title": "Neural Networks",
     "description": "Neural Networks play a pivotal role in the landscape of deep learning, offering a plethora of benefits and applications for data analysts. They are computational models that emulate the way human brain processes information, enabling machines to make intelligent decisions. As a data analyst, understanding and utilizing neural networks can greatly enhance decision-making process as it allows to quickly and effectively analyze large datasets, recognize patterns, and forecast future trends. In deep learning, these networks are used for creating advanced models that can tackle complex tasks such as image recognition, natural language processing, and speech recognition, to name but a few. Therefore, an in-depth knowledge of neural networks is a significant asset for any aspiring or professional data analyst.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "What is a neural network?",
+        "title": "What is a Neural Network?",
         "url": "https://aws.amazon.com/what-is/neural-network/",
         "type": "article"
       },
@@ -1461,12 +1519,12 @@
     "description": "Recurrent Neural Networks(RNNs) are a type of Artificial Neural Networks(ANNs) which introduces us to the realm of Deep Learning, an aspect that has been significantly contributing to the evolution of Data Analysis. RNNs are specifically designed to recognize patterns in sequences of data, such as text, genomes, handwriting, or the spoken word. This inherent feature of RNNs makes them extremely useful and versatile for a data analyst.\n\nA data analyst leveraging RNNs can effectively charter the intrinsic complexity of data sequences, classify them, and make accurate predictions. With the fundamental understanding of deep learning, data analysts can unlock the full potential of RNNs in delivering insightful data analysis that goes beyond traditional statistical methods. Modern research and applications of RNNs extend to multiple domains including natural language processing, speech recognition, and even in the financial sphere for stock price prediction making this a key tool in a data analyst’s arsenal.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "What is a recurrent neural network (RNN)?",
+        "title": "What is a Recurrent Neural Network (RNN)?",
         "url": "https://www.ibm.com/topics/recurrent-neural-networks",
         "type": "article"
       },
       {
-        "title": "Recurrent Neural Networks cheatsheet",
+        "title": "Recurrent Neural Networks Cheat-sheet",
         "url": "https://stanford.edu/~shervine/teaching/cs-230/cheatsheet-recurrent-neural-networks",
         "type": "article"
       }
@@ -1477,10 +1535,15 @@
     "description": "TensorFlow, developed by Google Brain Team, has become a crucial tool in the realm of data analytics, particularly within the field of deep learning. It's an open-source platform for machine learning, offering a comprehensive and flexible ecosystem of tools, libraries, and community resources. As a data analyst, understanding and implementing TensorFlow for deep learning models allows us to identify complex patterns and make insightful predictions which standard analysis could miss. It's in-demand skill that enhances our ability to generate accurate insights from colossal and complicated structured or unstructured data sets.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "Tensorflow Website",
+        "title": "Tensorflow",
         "url": "https://www.tensorflow.org/",
         "type": "article"
       },
+      {
+        "title": "Tensorflow Documentation",
+        "url": "https://www.tensorflow.org/learn",
+        "type": "article"
+      },
       {
         "title": "Tensorflow in 100 seconds",
         "url": "https://www.youtube.com/watch?v=i8NETqtGHms",
@@ -1493,10 +1556,15 @@
     "description": "PyTorch, an open-source machine learning library, has gained considerable popularity among data analysts due to its simplicity and high performance in tasks such as natural language processing and artificial intelligence. Specifically, in the domain of deep learning, PyTorch stands out due to its dynamic computational graph, allowing for a highly intuitive and flexible platform for building complex models. For data analysts, mastering PyTorch can open up a broad range of opportunities for data model development, data processing, and integration of machine learning algorithms.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "PyTorch Website",
+        "title": "PyTorch",
         "url": "https://pytorch.org/",
         "type": "article"
       },
+      {
+        "title": "PyTorch Documentation",
+        "url": "https://pytorch.org/docs/stable/index.html",
+        "type": "article"
+      },
       {
         "title": "PyTorch in 100 seconds",
         "url": "https://www.youtube.com/watch?v=ORMx45xqWkA",
@@ -1509,7 +1577,7 @@
     "description": "Image Recognition has become a significant domain because of its diverse applications, including facial recognition, object detection, character recognition, and much more. As a Data Analyst, understanding Image Recognition under Deep Learning becomes crucial. The data analyst's role in this context involves deciphering complex patterns and extracting valuable information from image data. This area of machine learning combines knowledge of data analysis, image processing, and deep neural networks to provide accurate results, contributing significantly to the progression of fields like autonomous vehicles, medical imaging, surveillance, among others. Therefore, proficiency in this field paves the way for proficient data analysis, leading to innovative solutions and improved decision-making.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "What is image recognition?",
+        "title": "What is Image Recognition?",
         "url": "https://www.techtarget.com/searchenterpriseai/definition/image-recognition",
         "type": "article"
       },
@@ -1541,12 +1609,12 @@
     "description": "As a business enterprise expands, so does its data. For data analysts, the surge in information means they need efficient and scalable data storage solutions to manage vast volumes of structured and unstructured data, collectively referred to as Big Data. Big Data storage solutions are critical in preserving the integrity of data while also providing quick and easy access to the data when needed. These solutions use software and hardware components to securely store massive amounts of information across numerous servers, allowing data analysts to perform robust data extraction, data processing and complex data analyses. There are several options, from the traditional Relational Database Management Systems (RDBMS) to the more recent NoSQL databases, Hadoop ecosystems, and Cloud storage solutions, each offering unique capabilities and benefits to cater for different big data needs.\n\nLearn more from the following resources:",
     "links": [
       {
-        "title": "SQL Roadmap",
+        "title": "Visit Dedicated SQL Roadmap",
         "url": "https://roadmap.sh/sql",
         "type": "article"
       },
       {
-        "title": "PostgreSQL Roadmap",
+        "title": "Visit Dedicated PostgreSQL Roadmap",
         "url": "https://roadmap.sh/postgresql-dba",
         "type": "article"
       }
diff --git a/public/roadmap-content/devops.json b/public/roadmap-content/devops.json
index d59463e0c..9fbc98d9c 100644
--- a/public/roadmap-content/devops.json
+++ b/public/roadmap-content/devops.json
@@ -3026,14 +3026,14 @@
     "title": "Envoy",
     "description": "Originally created at Lyft, Envoy is a high-performance data plane designed for service mesh architectures. Lyft open sourced it and donated it to the CNCF, where it is now one of the CNCF’s graduated open source projects. Envoy is a self contained process that is designed to run alongside every application server. All of the Envoys form a transparent communication mesh in which each application sends and receives messages to and from localhost and is unaware of the network topology.\n\nVisit the following resources to learn more:",
     "links": [
-      {
-        "title": "Envoy Website",
-        "url": "https://www.envoyproxy.io/",
-        "type": "article"
-      },
       {
         "title": "envoyproxy/envoy",
         "url": "https://github.com/envoyproxy/envoy",
+        "type": "opensource"
+      },
+      {
+        "title": "Envoy",
+        "url": "https://www.envoyproxy.io/",
         "type": "article"
       },
       {
diff --git a/public/roadmap-content/engineering-manager.json b/public/roadmap-content/engineering-manager.json
index c34785671..f60ab2be4 100644
--- a/public/roadmap-content/engineering-manager.json
+++ b/public/roadmap-content/engineering-manager.json
@@ -162,8 +162,14 @@
   },
   "7PBmYoSmIgZT21a2Ip3_S": {
     "title": "Trust / Influence Building",
-    "description": "Building trust and influence is crucial for any Engineering Manager. This involves establishing a solid reputation, delivering on promises and being an active listener to your team's ideas and issues. It's a manager's job to ensure there's an open, honest environment that promotes trust. Balancing delegation and taking charge, especially in difficult situations, is key to building influence.\n\nOne challenge in this area is building trust between team members of varying experiences and skills. Managers must not only show the team they're competent, but also that they value everyone's inputs. They can achieve this by promoting inclusivity and praising team contributions regularly.\n\nBeing patient, communicate clearly, and showing empathy are critical skills that can help an Engineering Manager in trust and influence building. By embodying these traits, managers can build a stronger, united, and more effective engineering team.",
-    "links": []
+    "description": "Building trust and influence is crucial for any Engineering Manager. This involves establishing a solid reputation, delivering on promises and being an active listener to your team's ideas and issues. It's a manager's job to ensure there's an open, honest environment that promotes trust. Balancing delegation and taking charge, especially in difficult situations, is key to building influence.\n\nOne challenge in this area is building trust between team members of varying experiences and skills. Managers must not only show the team they're competent, but also that they value everyone's inputs. They can achieve this by promoting inclusivity and praising team contributions regularly.\n\nBeing patient, communicate clearly, and showing empathy are critical skills that can help an Engineering Manager in trust and influence building. By embodying these traits, managers can build a stronger, united, and more effective engineering team.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Understanding The Trust Equation",
+        "url": "https://trustedadvisor.com/why-trust-matters/understanding-trust/understanding-the-trust-equation",
+        "type": "article"
+      }
+    ]
   },
   "b3qoH_LuW-Gz4N8WdGnZs": {
     "title": "One-on-One Meetings",
diff --git a/public/roadmap-content/frontend.json b/public/roadmap-content/frontend.json
index 737802cfe..ebe35d587 100644
--- a/public/roadmap-content/frontend.json
+++ b/public/roadmap-content/frontend.json
@@ -170,6 +170,11 @@
     "title": "HTML",
     "description": "HTML (Hypertext Markup Language) is the standard markup language used to create web pages and web applications. It provides a structure for content on the World Wide Web, using a system of elements and attributes to define the layout and content of a document. HTML elements are represented by tags, which browsers interpret to render the visual and auditory elements of a web page. The language has evolved through several versions, with HTML5 being the current standard, introducing semantic elements, improved multimedia support, and enhanced form controls. HTML works in conjunction with CSS for styling and JavaScript for interactivity, forming the foundation of modern web development.\n\nVisit the following resources to learn more:",
     "links": [
+      {
+        "title": "Responsive Web Design Certification - Co-Learn HTML & CSS with guided projects",
+        "url": "https://www.freecodecamp.org/learn/2022/responsive-web-design/",
+        "type": "course"
+      },
       {
         "title": "W3Schools: Learn HTML",
         "url": "https://www.w3schools.com/html/html_intro.asp",
@@ -321,6 +326,11 @@
         "url": "https://www.youtube.com/watch?v=G3e-cpL7ofc",
         "type": "course"
       },
+      {
+        "title": "Responsive Web Design Certification - Co-Learn HTML & CSS with guided projects",
+        "url": "https://www.freecodecamp.org/learn/2022/responsive-web-design/",
+        "type": "course"
+      },
       {
         "title": "Web.dev by Google — Learn CSS",
         "url": "https://web.dev/learn/css/",
@@ -1607,11 +1617,6 @@
         "url": "https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP",
         "type": "article"
       },
-      {
-        "title": "Google Devs Content Security Policy (CSP)",
-        "url": "https://developers.google.com/web/fundamentals/security/csp",
-        "type": "article"
-      },
       {
         "title": "Web.dev - Content Security Policy (CSP)",
         "url": "https://web.dev/csp/",
diff --git a/public/roadmap-content/full-stack.json b/public/roadmap-content/full-stack.json
index c4bc35723..bdef38e30 100644
--- a/public/roadmap-content/full-stack.json
+++ b/public/roadmap-content/full-stack.json
@@ -504,7 +504,7 @@
   },
   "cUOfvOlQ_0Uu1VX3i67kJ": {
     "title": "Basic AWS Services",
-    "description": "AWS has several services but you don't need to know all of them. Some common ones that you can start with are EC2, VPN, S3, Route 53, and SES.\n\nHere are some of the resources to get you started:",
+    "description": "AWS has several services but you don't need to know all of them. Some common ones that you can start with are EC2, VPC, S3, Route 53, and SES.\n\nHere are some of the resources to get you started:",
     "links": [
       {
         "title": "Up and Running with AWS VPC",
diff --git a/public/roadmap-content/game-developer.json b/public/roadmap-content/game-developer.json
index 32d0bcc23..8cdd68588 100644
--- a/public/roadmap-content/game-developer.json
+++ b/public/roadmap-content/game-developer.json
@@ -364,8 +364,13 @@
     "description": "Joints in game development primarily refer to the connections between two objects, often used in the context of physics simulations and character animations. These might simulate the physics of real-world joints like hinges or springs. Developers can control various characteristics of joints such as their constraints, forces, and reactions. The different types come with various properties suitable for specific needs. For example, Fixed joints keep objects together, Hinge joints allow rotation around an axis, and Spring joints apply a force to keep objects apart.\n\nVisit the following resources to learn more:",
     "links": [
       {
-        "title": "Game Character Rigging Fundamentals",
-        "url": "https://learn.unity.com/project/game-character-rigging-fundamentals",
+        "title": "Introduction to joints",
+        "url": "https://docs.unity3d.com/Manual/Joints.html",
+        "type": "article"
+      },
+      {
+        "title": "Character Rigging for Video Games",
+        "url": "https://game-ace.com/blog/character-rigging-for-video-games/",
         "type": "article"
       },
       {
@@ -599,16 +604,16 @@
   },
   "vWLKYK2KUzV1fO-vQunzW": {
     "title": "EPA",
-    "description": "The **EPA**, also known as the _Environmental Protection Agency_, is not typically related to game development or the concept of intersection within this context. However, in game development, EPA might refer to an 'Event-driven Process chain Architecture' or some other game-specific acronym. In this domain, different terminologies and acronyms are often used to express complex architectures, designs, or functionalities. If you have encountered EPA in a game development context, it might be best to refer to the specific documentation or guide where it was described for a better understanding. Understanding the context is key to untangle the meaning of such abbreviations.\n\nVisit the following resources to learn more:",
+    "description": "The **EPA** (Expanding Polytope Algorithm) is an iterative algorithm used for calculating the penetration depth between two shapes in collision detection. It is commonly used in physics engines and robotics. The algorithm takes the resulting simplex from a previously applied GJK algorithm, iteratively expanding the polytope towards the Minkowski Difference boundary until it finds the closest point to the origin. The vector from that point to the origin is the penetration vector and its magnitude is equal to the penetration depth between the two shapes.\n\nVisit the following resources to learn more:",
     "links": [
       {
-        "title": "Environmental Sustainability in Game Development",
-        "url": "https://polydin.com/environmental-sustainability-in-game-development/",
+        "title": "EPA: Collision response algorithm for 2D/3D - winter.dev",
+        "url": "https://winter.dev/articles/epa-algorithm",
         "type": "article"
       },
       {
-        "title": "Gaming Sustainability - Microsoft Game Dev",
-        "url": "https://learn.microsoft.com/en-us/gaming/sustainability/sustainability-overview",
+        "title": "EPA (Expanding Polytope Algorithm) - dyn4j",
+        "url": "https://dyn4j.org/2010/05/epa-expanding-polytope-algorithm/",
         "type": "article"
       }
     ]
@@ -744,7 +749,7 @@
   },
   "7OffO2mBmfBKqPBTZ9ngI": {
     "title": "Godot",
-    "description": "Godot is an open-source, multi-platform game engine that is known for being feature-rich and user-friendly. It is developed by hundreds of contributors from around the world and supports the creation of both 2D and 3D games. Godot uses its own scripting language, GDScript, which is similar to Python, but it also supports C# and visual scripting. It is equipped with a unique scene system and comes with a multitude of tools that can expedite the development process. Godot's design philosophy centers around flexibility, extensibility, and ease of use, providing a handy tool for both beginners and pros in game development.\n\nVisit the following resources to learn more:",
+    "description": "Godot is an open-source, multi-platform game engine that is known for being feature-rich and user-friendly. It is developed by hundreds of contributors from around the world and supports the creation of both 2D and 3D games. Godot uses its own scripting language, GDScript, which is similar to Python, but it also supports C#. It is equipped with a unique scene system and comes with a multitude of tools that can expedite the development process. Godot's design philosophy centers around flexibility, extensibility, and ease of use, providing a handy tool for both beginners and pros in game development.\n\nVisit the following resources to learn more:",
     "links": [
       {
         "title": "godotengine/godot",
@@ -763,7 +768,17 @@
       },
       {
         "title": "Godot in 100 Seconds",
-        "url": "https://m.youtube.com/watch?v=QKgTZWbwD1U",
+        "url": "https://www.youtube.com/watch?v=QKgTZWbwD1U",
+        "type": "video"
+      },
+      {
+        "title": "Tutorial - How to make a Video Game in Godot",
+        "url": "https://www.youtube.com/watch?v=LOhfqjmasi0",
+        "type": "video"
+      },
+      {
+        "title": "Tutorial - How to make 3D Games in Godot",
+        "url": "https://www.youtube.com/watch?v=ke5KpqcoiIU",
         "type": "video"
       }
     ]
@@ -882,8 +897,8 @@
     "description": "**C** and **C++ (commonly known as CPP)** are two of the most foundational high-level programming languages in computer science. **C** was developed in the 1970s and it is a procedural language, meaning it follows a step-by-step approach. Its fundamental principles include structured programming and lexical variable scope.\n\nOn the other hand, **C++** follows the paradigm of both procedural and object-oriented programming. It was developed as an extension to C to add the concept of \"classes\" - a core feature of object-oriented programming. C++ enhances C by introducing new features like function overloading, exception handling, and templates.\n\nVisit the following resources to learn more:",
     "links": [
       {
-        "title": "The C Programming Language",
-        "url": "https://www.iso.org/standard/74528.html",
+        "title": "C Programming Language",
+        "url": "https://en.wikipedia.org/wiki/C_%28programming_language%29",
         "type": "article"
       },
       {
@@ -971,11 +986,6 @@
     "title": "Computer Graphics",
     "description": "Computer Graphics is a subfield of computer science that studies methods for digitally synthesizing and manipulating visual content. It involves creating and manipulating visual content using specialized computer software and hardware. This field is primarily used in the creation of digital and video games, CGI in films, and also in visual effects for commercials. The field is divided into two major categories: **Raster graphics** and **Vector graphics**. Raster graphics, also known as bitmap, involve the representation of images through a dot matrix data structure, while Vector graphics involve the use of polygons to represent images in computer graphics. Both of these methods have their unique usage scenarios. Other concepts integral to the study of computer graphics include rendering (including both real-time rendering and offline rendering), animation, and 3D modeling. Generally, computer graphics skills are essential for game developers and animation experts.\n\nVisit the following resources to learn more:",
     "links": [
-      {
-        "title": "What is Computer Graphics?",
-        "url": "https://www.geeksforgeeks.org/introduction-to-computer-graphics/",
-        "type": "article"
-      },
       {
         "title": "Introduction to Computer Graphics",
         "url": "https://open.umn.edu/opentextbooks/textbooks/420",
@@ -1881,11 +1891,6 @@
         "title": "MCTS Algorithm",
         "url": "https://en.wikipedia.org/wiki/Monte_Carlo_tree_search/",
         "type": "article"
-      },
-      {
-        "title": "Monte Carlo Tree Search",
-        "url": "https://www.geeksforgeeks.org/ml-monte-carlo-tree-search-mcts/",
-        "type": "article"
       }
     ]
   },
@@ -1983,11 +1988,6 @@
     "title": "Artificial Neural Network",
     "description": "Artificial Neural Networks (ANN) are a branch of machine learning that draw inspiration from biological neural networks. ANNs are capable of 'learning' from observational data, thereby enhancing game development in numerous ways. They consist of interconnected layers of nodes, or artificial neurons, that process information through their interconnected network. Each node's connection has numerical weight that gets adjusted during learning, which helps in optimizing problem solving. ANNs are utilized in various aspects of game development, such as improving AI behavior, procedural content generation, and game testing. They can also be used for image recognition tasks, such as identifying objects or actions in a game environment.\n\nVisit the following resources to learn more:",
     "links": [
-      {
-        "title": "Artificial Neural Networks (ANN)",
-        "url": "https://www.geeksforgeeks.org/artificial-neural-networks-and-its-applications/",
-        "type": "article"
-      },
       {
         "title": "What is ANN?",
         "url": "https://www.coursera.org/articles/artificial-neural-network",
diff --git a/public/roadmap-content/git-github.json b/public/roadmap-content/git-github.json
index eed5fb996..781db51d7 100644
--- a/public/roadmap-content/git-github.json
+++ b/public/roadmap-content/git-github.json
@@ -670,11 +670,6 @@
         "url": "https://docs.github.com/en/organizations/managing-user-access-to-your-organizations-repositories/managing-outside-collaborators/adding-outside-collaborators-to-repositories-in-your-organization",
         "type": "article"
       },
-      {
-        "title": "What are github collaborators",
-        "url": "https://www.geeksforgeeks.org/what-are-github-collaborators/",
-        "type": "article"
-      },
       {
         "title": "How to Add Collaborators to Your GitHub Repository",
         "url": "https://www.blinkops.com/blog/how-to-add-collaborators-to-your-github-repository",
@@ -1440,7 +1435,7 @@
   },
   "uxqJzQFRcALqatNRIWR0w": {
     "title": "Unstaged Changes",
-    "description": "For changes that are not yet staged with `git add`, such as untracked new files or modified existing ones, use `git diff --unified`. This command compares your working directory against the latest committed version of each file. It's a useful tool for reviewing any local modifications before deciding whether to stage them for future commits.",
+    "description": "For changes that are not yet staged with `git add`, such as untracked new files or modified existing ones , use `git diff`. This command compares your working directory (your current changes) against the staging area (changes already staged with `git add`). It’s a useful tool for reviewing local modifications before deciding whether to stage them for future commits.\n\nThe `--unified` option (or -U) controls the number of context lines shown in the diff output. By default, Git shows 3 lines of context around each change. For example, `git diff --unified=5` will display 5 lines of context around each change, making it easier to understand the surrounding code or content.",
     "links": [
       {
         "title": "What are unstaged changes in GitHub?",
diff --git a/public/roadmap-content/java.json b/public/roadmap-content/java.json
new file mode 100644
index 000000000..9f7469de7
--- /dev/null
+++ b/public/roadmap-content/java.json
@@ -0,0 +1,1591 @@
+{
+  "2TGq1y2QthnxxN-FfToSe": {
+    "title": "Learn the Basics",
+    "description": "Java is a programming language and computing platform first released by Sun Microsystems in 1995. Java is a general-purpose, class-based, object-oriented programming language designed for having lesser implementation dependencies. It is a computing platform for application development. Java is fast, secure, and reliable. Therefore, it is widely used for developing Java applications in laptops, data centers, game consoles, scientific supercomputers, cell phones, etc.\n\nLearn about the fundamentals of Java such as basic syntax, data types, variables, conditionals, functions, data structures, packages, etc.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Introduction to Java by Hyperskill (JetBrains Academy)",
+        "url": "https://hyperskill.org/tracks/8",
+        "type": "course"
+      },
+      {
+        "title": "Java Basics - W3Schools",
+        "url": "https://www.w3schools.com/java/",
+        "type": "article"
+      },
+      {
+        "title": "Head First Java",
+        "url": "https://www.amazon.co.uk/Head-First-Java-3rd-Brain-Friendly/dp/1491910771",
+        "type": "article"
+      },
+      {
+        "title": "Thinking in Java",
+        "url": "https://www.amazon.co.uk/Thinking-Java-Eckel-Bruce-February/dp/B00IBON6C6",
+        "type": "article"
+      },
+      {
+        "title": "Effective Java",
+        "url": "https://www.amazon.com/Effective-Java-Joshua-Bloch/dp/0134685997",
+        "type": "article"
+      },
+      {
+        "title": "Java: A Beginners Guide",
+        "url": "https://www.amazon.co.uk/Java-Beginners-Guide-Herbert-Schildt/dp/1260463559",
+        "type": "article"
+      },
+      {
+        "title": "Java: The Complete Reference",
+        "url": "https://www.amazon.co.uk/gp/product/B09JL8BMK7/ref=dbs_a_def_rwt_bibl_vppi_i2",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Java",
+        "url": "https://app.daily.dev/tags/java?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "Java Tutorial for Beginners",
+        "url": "https://youtu.be/eIrMbAQSU34",
+        "type": "video"
+      },
+      {
+        "title": "Java + DSA + Interview Preparation Course (For beginners)",
+        "url": "https://youtube.com/playlist?list=PL9gnSGHSqcnr_DxHsP7AW9ftq0AtAyYqJ",
+        "type": "video"
+      }
+    ]
+  },
+  "OlbQNB6YXZjO1J7D0lZU1": {
+    "title": "Basic Syntax",
+    "description": "Understanding the basics is the key to a solid foundation. In this section, learn the basic terminologies, naming conventions, reserved keywords, expressions, statements, data structures, OOP, packages, etc.\n\n*   To print output use --> System.out.println();\n*   To take input from user --> Scanner or BufferedReader class can be used\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Language Basics",
+        "url": "https://dev.java/learn/language-basics",
+        "type": "article"
+      },
+      {
+        "title": "Java - Basic Syntax",
+        "url": "https://www.youtube.com/watch?v=81piDKqPxjQ",
+        "type": "video"
+      },
+      {
+        "title": "Java Tutorial for Beginners",
+        "url": "https://www.youtube.com/watch?v=RRubcjpTkks",
+        "type": "video"
+      }
+    ]
+  },
+  "5g9mmi01WeZ4aDqNzwx_V": {
+    "title": "Data Types",
+    "description": "Variable in Java is a data container that stores the data values during Java program execution. Every variable is assigned a data type, which designates the type and quantity of values it can hold. Variable is a memory location name of the data. The Java variables have mainly three types: Local, Instance and Static.\n\nData Types are divided into two group -\n\n*   Primitive - byte,short,int,long,float,double,boolean and char\n*   Non-Primitive - String, Arrays, Classes, Enums and Records\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Data Types",
+        "url": "https://jenkov.com/tutorials/java/variables.html",
+        "type": "article"
+      },
+      {
+        "title": "What are Data Types & Variables?",
+        "url": "https://jenkov.com/tutorials/java/data-types.html",
+        "type": "article"
+      },
+      {
+        "title": "Java Variables",
+        "url": "https://www.javatpoint.com/java-variables",
+        "type": "article"
+      }
+    ]
+  },
+  "sG_3ZQIE1-FQXQkk-OduQ": {
+    "title": "Conditionals",
+    "description": "Java has the following conditional statements:\n\n*   Use `if` to specify a block of code to be executed, if a specified condition is true\n*   Use `else` to specify a block of code to be executed if the same condition is false\n*   Use `else if` to specify a new condition to test; if the first condition is false\n*   Use `switch` to specify many alternative blocks of code to be executed\n*   Use `?,:` operator to specify one line condition\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "What are Conditional statements?",
+        "url": "https://www.educative.io/answers/what-are-conditional-statements-in-programming",
+        "type": "article"
+      },
+      {
+        "title": "Conditionals in Java",
+        "url": "https://www.javatpoint.com/java-if-else",
+        "type": "article"
+      },
+      {
+        "title": "Conditionals and Loops in Java",
+        "url": "https://youtu.be/ldYLYRNaucM",
+        "type": "video"
+      },
+      {
+        "title": "Switch Statements + Nested Case in Java",
+        "url": "https://youtu.be/mA23x39DjbI",
+        "type": "video"
+      }
+    ]
+  },
+  "5khApwg1FZ-0qorsLyH-F": {
+    "title": "Arrays ",
+    "description": "Arrays are fundamental data structures used to store a collection of elements of the same data type in contiguous memory locations. They provide a way to organize and access multiple values using a single variable name and an index. Each element in an array can be accessed directly using its index, starting from 0.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Arrays",
+        "url": "https://jenkov.com/tutorials/java/arrays.html",
+        "type": "article"
+      },
+      {
+        "title": "Java Arrays Tutorial",
+        "url": "https://www.youtube.com/watch?v=ei_4Nt7XWOw",
+        "type": "video"
+      }
+    ]
+  },
+  "JHUhVEjWFXTn6-wKcKevg": {
+    "title": "Loops",
+    "description": "In Java and other programming languages, loops are used to iterate a part of the program several times. There are four types of loops in Java, `for`, `forEach`, `while`, and `do...while`.\n\n*   Syntax of `for` loop is `for(initialization;condition;increment/decrement){}`\n*   Syntax of `forEach` loop is `for(data_type variable:array_name){}`\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "What are loops in Java?",
+        "url": "https://www.javatpoint.com/java-for-loop",
+        "type": "article"
+      },
+      {
+        "title": "Loops in Java.",
+        "url": "https://www.programiz.com/java-programming/for-loop",
+        "type": "article"
+      }
+    ]
+  },
+  "VBNcAO0STaZJ1iV9A7utv": {
+    "title": "Variables and Scopes",
+    "description": "Variables are like containers that hold data in a program. Each variable has a name, a type (like integer, text, or boolean), and a value. The scope of a variable determines where in your code you can access and use that variable. Understanding scope is crucial to avoid naming conflicts and ensure data is accessed correctly within different parts of your program.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Variables",
+        "url": "https://jenkov.com/tutorials/java/variables.html",
+        "type": "article"
+      },
+      {
+        "title": "Java Variable Scope",
+        "url": "https://www.baeldung.com/java-variable-scope",
+        "type": "article"
+      }
+    ]
+  },
+  "yNDbk6r5wFqBi25xmIRF_": {
+    "title": "Type Casting",
+    "description": "Type casting is the process of converting a variable from one data type to another. This is often necessary when you need to perform operations between variables of different types, or when you need to store a value of one type in a variable of another type. In Java, type casting can be either implicit (automatic) or explicit (requiring a cast operator).\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Type Casting in Java: Everything You Need to Know",
+        "url": "https://www.simplilearn.com/tutorials/java-tutorial/type-casting-in-java",
+        "type": "article"
+      },
+      {
+        "title": "Java Type Casting (With Examples)",
+        "url": "https://www.programiz.com/java-programming/typecasting",
+        "type": "article"
+      }
+    ]
+  },
+  "aEaBobzFWv0mJHGAbgxKY": {
+    "title": "Strings and Methods",
+    "description": "Strings are sequences of characters, like words or sentences, used to represent text in programming. Methods are actions you can perform on these strings, such as finding their length, changing their case (uppercase or lowercase), or extracting parts of them. These methods allow you to manipulate and work with text data effectively.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Strings",
+        "url": "https://jenkov.com/tutorials/java/strings.html",
+        "type": "article"
+      }
+    ]
+  },
+  "ziD_XwzJSFQP_3iLjq9pA": {
+    "title": "Math Operations",
+    "description": "Math operations involve performing calculations using numbers. These operations include addition, subtraction, multiplication, division, and modulus (finding the remainder). They are fundamental building blocks for solving numerical problems and manipulating data in programming.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Math",
+        "url": "https://jenkov.com/tutorials/java/math-operators-and-math-class.html",
+        "type": "article"
+      }
+    ]
+  },
+  "QgWalJLIb6Fw0HhN1wb02": {
+    "title": "Lifecycle of a Program",
+    "description": "In Java, the program lifecycle consists of several distinct phases that work together to execute code. The process begins with developers writing Java source code in `.java` files using an IDE or text editor. This code is then compiled by the Java compiler (javac) into bytecode stored in `.class` files, with syntax and type checking performed during compilation. When the program runs, the Java Virtual Machine (JVM) loads these compiled class files into memory through a process involving loading of binary data, linking for verification and preparation, and initialization of class elements. The JVM then verifies the bytecode's security compliance, performs Just-In-Time (JIT) compilation to translate bytecode into native machine code for better performance, and executes the program instructions while managing system resources. Throughout execution, the JVM handles garbage collection by reclaiming memory from unused objects, and finally releases all resources upon program termination. This architecture enables Java's \"write once, run anywhere\" capability since the bytecode can execute on any device with a compatible JVM.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Life Cycle of a Java Program",
+        "url": "https://www.startertutorials.com/corejava/life-cycle-java-program.html",
+        "type": "article"
+      },
+      {
+        "title": "How the JVM Executes Java Code",
+        "url": "https://www.cesarsotovalero.net/blog/how-the-jvm-executes-java-code.html",
+        "type": "article"
+      }
+    ]
+  },
+  "LenPrQwxFsE1UVbXO_dE7": {
+    "title": "Classes and Objects",
+    "description": "Classes are blueprints for creating objects, which are instances of those classes. A class defines the characteristics (attributes) and behaviors (methods) that objects of that class will possess. Think of a class as a template and an object as a specific instance created from that template.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Class and Objects",
+        "url": "https://www.programiz.com/java-programming/class-objects",
+        "type": "article"
+      },
+      {
+        "title": "Java Classes and Objects",
+        "url": "https://www.youtube.com/watch?v=IUqKuGNasdM",
+        "type": "article"
+      }
+    ]
+  },
+  "xTwJYcA6ldgaw3yGmbDEd": {
+    "title": "Attributes and Methods",
+    "description": "Attributes are variables that hold data about an object, defining its state or characteristics. Methods are functions that define the behavior of an object, allowing it to perform actions or operations. Together, attributes and methods encapsulate the data and behavior of an object within a class.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Classes",
+        "url": "https://jenkov.com/tutorials/java/classes.html",
+        "type": "article"
+      },
+      {
+        "title": "Java Methods",
+        "url": "https://jenkov.com/tutorials/java/methods.html",
+        "type": "article"
+      },
+      {
+        "title": "Java Properties",
+        "url": "https://jenkov.com/tutorials/java-collections/properties.html",
+        "type": "article"
+      }
+    ]
+  },
+  "KYndNwfQcwRCf3zCXOwd_": {
+    "title": "Access Specifiers",
+    "description": "Access specifiers (or access modifiers) in Java are keywords that control the visibility or accessibility of classes, methods, constructors, and other members. They determine from where these members can be accessed. Java provides four access specifiers: `private`, `default` (no keyword), `protected`, and `public`, each offering a different level of access control.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Access Modifiers",
+        "url": "https://jenkov.com/tutorials/java/access-modifiers.html",
+        "type": "article"
+      }
+    ]
+  },
+  "ZcNxO6qIXIg7RaWYnZj2e": {
+    "title": "Static Keyword",
+    "description": "The `static` keyword in Java is used to create members (variables and methods) that belong to the class itself, rather than to any specific instance of the class. This means there's only one copy of a static variable shared by all objects of that class, and you can access static members directly using the class name without needing to create an object. Static methods can only access static variables and call other static methods.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Static Keyword Explained With Examples",
+        "url": "https://www.freecodecamp.org/news/java-static-keyword-explained/",
+        "type": "article"
+      },
+      {
+        "title": "Static and Non-static Fields in Java",
+        "url": "https://jenkov.com/tutorials/java/fields.html#static-and-non-static-fields",
+        "type": "article"
+      },
+      {
+        "title": "Guide to the Java 'static' Keyword",
+        "url": "https://www.baeldung.com/java-static",
+        "type": "article"
+      }
+    ]
+  },
+  "zDBW20W2XMCtNTG3emJ_A": {
+    "title": "Nested Classes",
+    "description": "Nested classes are classes defined inside another class. The class that contains the inner class is known as the outer class. Nested classes can access members of the outer class, even if they are declared private. They are a way to logically group classes that are only used in one place, increasing encapsulation and maintainability.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Nested Classes",
+        "url": "https://jenkov.com/tutorials/java/nested-classes.html",
+        "type": "article"
+      },
+      {
+        "title": "Guide to Nested Classes in Java",
+        "url": "https://www.baeldung.com/java-nested-classes",
+        "type": "article"
+      }
+    ]
+  },
+  "DZ4BX4NYeCQbjGSj56lng": {
+    "title": "Basics of OOP",
+    "description": "Object-Oriented Programming (OOP) is a programming paradigm centered around \"objects,\" which contain data in the form of fields (attributes) and code in the form of procedures (methods). OOP focuses on creating reusable code by grouping related data and behavior into objects, allowing for modularity, abstraction, inheritance, and polymorphism. These concepts help in organizing and structuring code in a way that mirrors real-world entities and their interactions.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Classes and Objects",
+        "url": "https://jenkov.com/tutorials/java/classes.html",
+        "type": "article"
+      }
+    ]
+  },
+  "Ax2ouIZgN1DpPzKDy4fwp": {
+    "title": "Method Chaining",
+    "description": "Method chaining is a programming technique where multiple method calls are made sequentially on the same object, one after another, in a single statement. Each method in the chain returns an object, allowing the next method to be called on that returned object. This approach enhances code readability and conciseness by reducing the need for temporary variables and intermediate steps.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Method Chaining - Java Explained",
+        "url": "https://bito.ai/resources/java-method-chaining-java-explained",
+        "type": "article"
+      },
+      {
+        "title": "How to achieve method chaining in Java",
+        "url": "https://stackoverflow.com/questions/21180269/how-to-achieve-method-chaining-in-java",
+        "type": "article"
+      }
+    ]
+  },
+  "ey1f8IsdAlDv1O3E_tNog": {
+    "title": "Enums",
+    "description": "Enums, short for enumerations, are a special data type in Java that represent a group of named constants. They allow you to define a type that can only take on a specific set of predefined values. This makes your code more readable and less prone to errors by restricting the possible values a variable can hold.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Enums",
+        "url": "https://jenkov.com/tutorials/java/enums.html",
+        "type": "article"
+      },
+      {
+        "title": "Java Enums",
+        "url": "https://www.programiz.com/java-programming/enums",
+        "type": "article"
+      }
+    ]
+  },
+  "Ajuc_rHObqMQBXLqRIuxh": {
+    "title": "Final Keyword",
+    "description": "The `final` keyword in Java is a non-access modifier used to apply restrictions on a variable, method, or class. When applied to a variable, it makes the variable's value constant after initialization. When applied to a method, it prevents the method from being overridden in a subclass. When applied to a class, it prevents the class from being subclassed (inherited).\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Final Keyword",
+        "url": "https://www.baeldung.com/java-final",
+        "type": "article"
+      },
+      {
+        "title": "How does the final keyword in Java work? I can still modify an object",
+        "url": "https://stackoverflow.com/questions/15655012/how-does-the-final-keyword-in-java-work-i-can-still-modify-an-object",
+        "type": "article"
+      }
+    ]
+  },
+  "3qowgj1pas1X7oRric9eU": {
+    "title": "Object Lifecycle",
+    "description": "The object lifecycle refers to the series of stages an object goes through from its creation (allocation of memory) to its destruction (reclaiming of memory). These stages typically include object creation, initialization, usage, and eventual garbage collection when the object is no longer needed. Understanding this lifecycle is crucial for efficient memory management and preventing resource leaks.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Object Life Cycle in Java",
+        "url": "https://www.tpointtech.com/object-life-cycle-in-java",
+        "type": "article"
+      }
+    ]
+  },
+  "qdA6bK9ZkP8p0_NH_wMuj": {
+    "title": "Abstraction",
+    "description": "The abstract keyword in Java is used to declare a class or a method that cannot be instantiated directly or must be implemented by subclasses, respectively. It is a key part of Java's abstraction mechanism, allowing developers to define abstract classes and methods that provide a blueprint for other classes.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Abstract Classes",
+        "url": "https://jenkov.com/tutorials/java/abstract-classes.html",
+        "type": "article"
+      },
+      {
+        "title": "Java Interfaces vs. Abstract Classes",
+        "url": "https://jenkov.com/tutorials/java/interfaces-vs-abstract-classes.html",
+        "type": "article"
+      }
+    ]
+  },
+  "PXpPEmCEBUKRjwP3B5LzJ": {
+    "title": "Inheritance",
+    "description": "Inheritance is a fundamental concept in object-oriented programming where a new class (called a subclass or derived class) acquires properties and behaviors from an existing class (called a superclass or base class). This allows for code reuse and the creation of hierarchical relationships between classes, promoting a more organized and maintainable codebase. The subclass can extend the superclass by adding new attributes and methods or overriding existing ones.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Inheritance",
+        "url": "https://jenkov.com/tutorials/java/inheritance.html",
+        "type": "article"
+      },
+      {
+        "title": "Inheritance in Java with Example",
+        "url": "https://www.digitalocean.com/community/tutorials/inheritance-java-example",
+        "type": "article"
+      }
+    ]
+  },
+  "y-i56f1P_mMdvyBr7J4XE": {
+    "title": "Method Overloading / Overriding",
+    "description": "Method overloading allows you to define multiple methods in the same class with the same name but different parameters (different number, types, or order of parameters). Method overriding, on the other hand, occurs when a subclass provides a specific implementation for a method that is already defined in its superclass. The method signature (name and parameters) must be the same in both the superclass and the subclass for overriding to occur.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Overriding vs Overloading in Java",
+        "url": "https://www.digitalocean.com/community/tutorials/overriding-vs-overloading-in-java",
+        "type": "article"
+      },
+      {
+        "title": "Java Inheritance Tutorial",
+        "url": "https://jenkov.com/tutorials/java/inheritance.html",
+        "type": "article"
+      }
+    ]
+  },
+  "Kjdj862xnz8fqDYE3HKhC": {
+    "title": "Static vs Dynamic Binding",
+    "description": "Static binding, also known as early binding, happens at compile time. The compiler knows exactly which method will be called based on the type of the variable. Dynamic binding, or late binding, occurs at runtime. The specific method to be called is determined based on the actual object type, not the variable type, allowing for more flexibility and polymorphism.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Static and Dynamic Binding in Java",
+        "url": "https://www.baeldung.com/java-static-dynamic-binding",
+        "type": "article"
+      },
+      {
+        "title": "Static and Dynamic Binding in Java with Examples",
+        "url": "https://beginnersbook.com/2013/04/java-static-dynamic-binding/",
+        "type": "article"
+      }
+    ]
+  },
+  "6wTRN2PYC6zM_Txkekx53": {
+    "title": "Interfaces",
+    "description": "An interface in Java is a blueprint of a class. It specifies a set of methods that a class must implement if it claims to implement the interface. Think of it as a contract: any class that \"signs\" the contract (implements the interface) agrees to provide specific behaviors (methods). Interfaces can also contain constants (static final variables). They help achieve abstraction and multiple inheritance in Java.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Interfaces in Java",
+        "url": "https://jenkov.com/tutorials/java/interfaces.html",
+        "type": "article"
+      },
+      {
+        "title": "A Guide to Java Interfaces",
+        "url": "https://www.baeldung.com/java-interfaces",
+        "type": "article"
+      }
+    ]
+  },
+  "iH9wSsOK4a77pS7U0Yu5z": {
+    "title": "Encapsulation",
+    "description": "Encapsulation is a fundamental concept in object-oriented programming where data and the methods that operate on that data are bundled together as a single unit. This unit, often a class, hides the internal state of the object from the outside world and only exposes a controlled interface for interacting with it. This protects the data from accidental modification and allows for easier maintenance and modification of the code.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java - Encapsulation",
+        "url": "https://www.tutorialspoint.com/java/java_encapsulation.htm",
+        "type": "article"
+      }
+    ]
+  },
+  "VqLV7kolfRFnvOuJAvzlg": {
+    "title": "Record",
+    "description": "A record is a special type of class in Java that is designed to hold immutable data. It automatically generates methods like `equals()`, `hashCode()`, and `toString()` based on the components declared in its header, reducing boilerplate code. Records are useful for creating data transfer objects (DTOs) or simple data aggregates where the primary purpose is to store and access data.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Records",
+        "url": "https://jenkov.com/tutorials/java/record.html",
+        "type": "article"
+      },
+      {
+        "title": "Java Records",
+        "url": "https://www.youtube.com/watch?v=xs7DiEIHW0U",
+        "type": "video"
+      }
+    ]
+  },
+  "60POZOjwHSdKYL6rfkyEy": {
+    "title": "Packages",
+    "description": "A package is a namespace that mainly contains classes and interfaces. For instance, the standard class `ArrayList` is in the package `java.util`. For this class, `java.util.ArrayList` is called its fully qualified name because this syntax has no ambiguity. Classes in different packages can have the same name. For example, you have the two classes `java.util.Date` and `java.sql.Date`, which are different. If no package is declared in a class, its package is the default package.\n\nTo create package use this command -> javac -d directory javafilename\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Packages in Java",
+        "url": "https://docs.oracle.com/javase/8/docs/api/java/lang/Package.html",
+        "type": "article"
+      },
+      {
+        "title": "Java Package",
+        "url": "https://www.javatpoint.com/package",
+        "type": "article"
+      }
+    ]
+  },
+  "dg_UpaO8TzIN7w_QZ1n-6": {
+    "title": "Initializer Block",
+    "description": "An initializer block in Java is a block of code, enclosed in curly braces `{}` , that is executed when an instance of a class is created. It's used to initialize instance variables or perform setup tasks before the constructor is called. There are two types: instance initializer blocks, which run every time a new object is created, and static initializer blocks, which run only once when the class is first loaded.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Static and Instance Initializer Blocks in Java",
+        "url": "https://www.baeldung.com/java-static-instance-initializer-blocks",
+        "type": "article"
+      },
+      {
+        "title": "All About Java Instance Initializer Blocks",
+        "url": "https://blogs.oracle.com/javamagazine/post/java-instance-initializer-block",
+        "type": "article"
+      },
+      {
+        "title": "What is an initialization block?",
+        "url": "https://stackoverflow.com/questions/3987428/what-is-an-initialization-block",
+        "type": "article"
+      }
+    ]
+  },
+  "3r0Er9XZHovIZz3gNyj4A": {
+    "title": "Pass by Value / Pass by Reference",
+    "description": "Pass by value and pass by reference are two different ways of passing arguments to a function or method. In pass by value, a copy of the variable's value is passed to the function, so any changes made to the parameter inside the function do not affect the original variable. In pass by reference, a direct reference to the variable is passed, meaning that changes made to the parameter inside the function will directly affect the original variable.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java is Pass-by-Value, Not Pass-by-Reference",
+        "url": "https://www.baeldung.com/java-pass-by-value-or-pass-by-reference",
+        "type": "article"
+      },
+      {
+        "title": "Is Java \"pass-by-reference\" or \"pass-by-value\"?",
+        "url": "https://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value",
+        "type": "article"
+      }
+    ]
+  },
+  "c--y6GcKj9am0CBdu_Hnt": {
+    "title": "Annotations",
+    "description": "Annotations are a form of metadata that provide data about a program. They are used to provide supplemental information about the code, but they are not a part of the program itself. Annotations can be used by the compiler to detect errors or suppress warnings, and they can also be used at runtime to modify the behavior of the program.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Annotations Tutorial",
+        "url": "https://jenkov.com/tutorials/java/annotations.html",
+        "type": "article"
+      }
+    ]
+  },
+  "00_q6I95eO-PUUrKpPFY8": {
+    "title": "Lambda Expressions",
+    "description": "Lambda expressions are essentially short blocks of code that you can pass around to be executed. They allow you to treat functionality as a method argument, or code as data. Think of them as anonymous methods – methods without a name – that can be written directly in the place where they are needed, making your code more concise and readable, especially when dealing with functional interfaces.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Lambda Expressions",
+        "url": "https://jenkov.com/tutorials/java/lambda-expressions.html",
+        "type": "article"
+      }
+    ]
+  },
+  "kdxy8Zssnc5lJjdmjUyMc": {
+    "title": "Modules",
+    "description": "Modules in Java are a way to organize code into reusable and independent units. They provide a higher level of abstraction than packages, allowing you to control which parts of your code are exposed to other modules and which are kept private. This enhances encapsulation, improves security, and simplifies dependency management by explicitly declaring dependencies between modules.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Modules",
+        "url": "https://jenkov.com/tutorials/java/modules.html",
+        "type": "article"
+      },
+      {
+        "title": "A Guide to Java 9 Modularity",
+        "url": "https://www.baeldung.com/java-modularity",
+        "type": "article"
+      }
+    ]
+  },
+  "a-EQiBUlSgdZba1mW36op": {
+    "title": "Array vs ArrayList",
+    "description": "Arrays and ArrayLists are both ways to store collections of elements in Java. An array is a fixed-size, ordered sequence of elements of the same data type. Once you declare its size, you cannot change it. An ArrayList, on the other hand, is a dynamic, resizable array implementation. It can grow or shrink as needed, allowing you to add or remove elements without worrying about the initial size.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Arrays",
+        "url": "https://jenkov.com/tutorials/java/arrays.html",
+        "type": "article"
+      },
+      {
+        "title": "Java ArrayLists",
+        "url": "https://jenkov.com/tutorials/java-collections/list.html",
+        "type": "article"
+      }
+    ]
+  },
+  "XjkNd5WJ9yxW48dwHQNkZ": {
+    "title": "Set",
+    "description": "A Set is a data structure that stores a collection of unique elements. This means that no duplicate values are allowed within a Set. Sets provide efficient ways to check for membership (if an element exists in the set) and perform operations like union, intersection, and difference.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Set",
+        "url": "https://jenkov.com/tutorials/java-collections/set.html",
+        "type": "article"
+      },
+      {
+        "title": "Java Set Interface and Implementation",
+        "url": "https://www.digitalocean.com/community/tutorials/java-set",
+        "type": "article"
+      }
+    ]
+  },
+  "eKtdDtiJygKQ4PuEylFQY": {
+    "title": "Map",
+    "description": "A Map is a data structure that stores data in key-value pairs. Each key is unique, and it maps to a specific value. Think of it like a dictionary where you use a word (the key) to look up its definition (the value). Maps allow you to efficiently retrieve, add, or remove values based on their associated keys.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Generic Map in Java",
+        "url": "https://jenkov.com/tutorials/java-generics/generic-map.html",
+        "type": "article"
+      },
+      {
+        "title": "Java Map",
+        "url": "https://jenkov.com/tutorials/java-collections/map.html",
+        "type": "article"
+      },
+      {
+        "title": "Java ConcurrentMap",
+        "url": "https://jenkov.com/tutorials/java-util-concurrent/concurrentmap.html",
+        "type": "article"
+      },
+      {
+        "title": "Java SortedMap",
+        "url": "https://jenkov.com/tutorials/java-collections/sortedmap.html",
+        "type": "article"
+      }
+    ]
+  },
+  "ThoWhXb4vUvNfE70_wMfa": {
+    "title": "Queue",
+    "description": "A queue is a fundamental data structure that follows the First-In, First-Out (FIFO) principle. Think of it like a line at a store: the first person to join the line is the first person to be served. Elements are added to the rear (enqueue) and removed from the front (dequeue) of the queue.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Queue",
+        "url": "https://jenkov.com/tutorials/java-collections/queue.html",
+        "type": "article"
+      }
+    ]
+  },
+  "DzfE_9WLAp-BrG3C1-MwU": {
+    "title": "Stack",
+    "description": "A stack is a fundamental data structure that follows the Last-In, First-Out (LIFO) principle. Imagine a stack of plates; you can only add or remove plates from the top. This means the last element added to the stack is the first one to be removed. Stacks are used to manage function calls, evaluate expressions, and implement undo/redo functionality.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Stack Tutorial",
+        "url": "https://jenkov.com/tutorials/java-collections/stack.html",
+        "type": "article"
+      },
+      {
+        "title": "Guide to Java Stack",
+        "url": "https://www.baeldung.com/java-stack",
+        "type": "article"
+      }
+    ]
+  },
+  "DWO2-EPIUeKK5aQGiTuKc": {
+    "title": "Dequeue",
+    "description": "A Dequeue (pronounced \"dee-queue\") is a double-ended queue, a data structure that allows you to add and remove elements from both the front (head) and the back (tail) of the queue. Unlike a regular queue (FIFO - First-In, First-Out), a dequeue provides flexibility for both FIFO and LIFO (Last-In, First-Out) operations. This makes it useful for implementing various algorithms and data management tasks where elements need to be accessed or modified from either end.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Deque Tutorial",
+        "url": "https://jenkov.com/tutorials/java-collections/deque.html",
+        "type": "article"
+      },
+      {
+        "title": "Java Deque",
+        "url": "https://www.programiz.com/java-programming/deque",
+        "type": "article"
+      }
+    ]
+  },
+  "-17LFO72I8RKjJRMXct9k": {
+    "title": "Iterator",
+    "description": "An Iterator is an object that enables you to traverse through a collection (like a List or Set) one element at a time. It provides a standard way to access elements sequentially without needing to know the underlying structure of the collection. You can use methods like `hasNext()` to check if there's a next element and `next()` to retrieve it.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Iterator Tutorial",
+        "url": "https://jenkov.com/tutorials/java-collections/iterator.html",
+        "type": "article"
+      },
+      {
+        "title": "Java Iterable Tutorial",
+        "url": "https://jenkov.com/tutorials/java-collections/iterable.html",
+        "type": "article"
+      }
+    ]
+  },
+  "eL4pc6SaNiKP48PzN7mNe": {
+    "title": "Generic Collections",
+    "description": "Java Generic methods and generic classes enable programmers to specify, with a single method declaration, a set of related methods, or with a single class declaration, a set of related types, respectively.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java - Generics",
+        "url": "https://www.tutorialspoint.com/java/java_generics.htm",
+        "type": "article"
+      },
+      {
+        "title": "Generics in Java",
+        "url": "https://www.javatpoint.com/generics-in-java",
+        "type": "article"
+      },
+      {
+        "title": "Generics in Java",
+        "url": "https://www.youtube.com/watch?v=XMvznsY02Mk",
+        "type": "video"
+      }
+    ]
+  },
+  "l9fxK8K9fcUqR7hs5TkWU": {
+    "title": "Optionals",
+    "description": "Optionals are a container object that may or may not contain a non-null value. They are primarily used to represent the absence of a value, avoiding the need to return null, which can lead to NullPointerExceptions. Optionals provide methods to explicitly check if a value is present and to handle cases where a value is absent in a more controlled and readable manner.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Guide To Optionals",
+        "url": "https://www.baeldung.com/java-optional",
+        "type": "article"
+      },
+      {
+        "title": "Java Optional",
+        "url": "https://dzone.com/articles/optional-in-java",
+        "type": "article"
+      }
+    ]
+  },
+  "g9P3548F38tYGjevBc42w": {
+    "title": "Exception Handling",
+    "description": "Exception Handling in Java is one of the effective means to handle the runtime errors so that the regular flow of the application can be preserved. Java Exception Handling is a mechanism to handle runtime errors such as ClassNotFoundException, IOException, SQLException, RemoteException, etc.\n\nThere are three types of exceptions -\n\n1.  Checked Exception - exceptions checked at compile time. Example - IOException\n2.  Unchecked Exception - exceptions checked at run time. Example - NullPointerException\n3.  Error - It is irrecoverable. Example - OutOfMemoryError\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Exception Handling in Java",
+        "url": "https://www.javatpoint.com/exception-handling-in-java",
+        "type": "article"
+      },
+      {
+        "title": "Understanding Java Exceptions",
+        "url": "https://www.youtube.com/watch?v=W-N2ltgU-X4",
+        "type": "video"
+      }
+    ]
+  },
+  "_W84u4UXMSY0zvy6RJvFi": {
+    "title": "Web Frameworks",
+    "description": "Frameworks are tools with pre-written code, that act as a template or skeleton, which can be reused to create an application by simply filling with your code as needed which enables developers to program their application with no overhead of creating each line of code again and again from scratch.",
+    "links": []
+  },
+  "xoryfi4SpJlkz-PV05ql6": {
+    "title": "Spring (Spring Boot)",
+    "description": "Spring Boot is an open source, microservice-based Java web framework. The Spring Boot framework creates a fully production-ready environment that is completely configurable using its prebuilt code within its codebase. The microservice architecture provides developers with a fully enclosed application, including embedded application servers.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Visit Dedicated Spring Boot Roadmap",
+        "url": "https://roadmap.sh/spring-boot",
+        "type": "article"
+      },
+      {
+        "title": "Spring Boot",
+        "url": "https://spring.io/projects/spring-boot/",
+        "type": "article"
+      },
+      {
+        "title": "What is Spring Boot?",
+        "url": "https://www.ibm.com/cloud/learn/java-spring-boot",
+        "type": "article"
+      },
+      {
+        "title": "Spring Boot Tutorial",
+        "url": "https://www.javaguides.net/2021/07/spring-boot-tutorial-for-beginners.html",
+        "type": "article"
+      },
+      {
+        "title": "Learn Spring Boot",
+        "url": "https://www.baeldung.com/spring-boot",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Spring Framework",
+        "url": "https://app.daily.dev/tags/spring?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "Spring Boot Tutorial",
+        "url": "https://youtu.be/vtPkZShrvXQ",
+        "type": "video"
+      },
+      {
+        "title": "Spring Boot for Beginners",
+        "url": "https://youtu.be/UfOxcrxhC0s",
+        "type": "video"
+      }
+    ]
+  },
+  "kN-mXxqUPNJNsJGQ0U_7J": {
+    "title": "Play Framework",
+    "description": "Play Framework is a high-productivity web application framework that allows the model-view-controller pattern. It is written in Scala but can also be used for other programming languages that are compiled and run on the JVM. e.g.Java.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Play Framework Website",
+        "url": "https://www.playframework.com/",
+        "type": "article"
+      },
+      {
+        "title": "What is Play Framework?",
+        "url": "https://en.wikipedia.org/wiki/Play_Framework",
+        "type": "article"
+      },
+      {
+        "title": "Intro to Play Framework",
+        "url": "https://www.baeldung.com/java-intro-to-the-play-framework",
+        "type": "article"
+      },
+      {
+        "title": "Introduction to Play Framework",
+        "url": "https://youtu.be/bLrmnjPQsZc",
+        "type": "video"
+      }
+    ]
+  },
+  "w-kcKPh8U0P_jtT90_1Xy": {
+    "title": "Quarkus",
+    "description": "Quarkus is a Kubernetes Native Java stack tailored for OpenJDK HotSpot and GraalVM, crafted from the best of breed Java libraries and standards. It is a full-stack, Kubernetes-native Java framework made for Java virtual machines (JVMs) and native compilation, optimizing Java specifically for containers and enabling it to become an effective platform for serverless, cloud, and Kubernetes environments.",
+    "links": [
+      {
+        "title": "Official Website",
+        "url": "https://quarkus.io/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Quarkus",
+        "url": "https://app.daily.dev/tags/quarkus?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "81N1cZLue_Ii0uD5CV6kZ": {
+    "title": "Build Tools",
+    "description": "A build tool is a program or command-line utility that automates the process of compiling, assembling, and deploying software.\n\nBuild tools are not only limited to compiling code; they can also help with package management, dependency handling, and continuous integration systems.",
+    "links": []
+  },
+  "VdL_fAHxmRbuF0J627beA": {
+    "title": "Maven",
+    "description": "Maven is an open-source build tool, used primarily for Java projects.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Getting started",
+        "url": "https://maven.apache.org/guides/getting-started/",
+        "type": "article"
+      },
+      {
+        "title": "Building Spring Projects with Maven",
+        "url": "https://www.baeldung.com/spring-with-maven",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Maven",
+        "url": "https://app.daily.dev/tags/maven?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "rmDIm5dqtdlNfPhvpqS7-": {
+    "title": "Gradle",
+    "description": "Gradle is an open-source build automation tool that helps software engineers to test, build, and release high-performance software products. In addition, Gradle also supports multi-language development. Currently, the supported languages for Gradle include Java, Kotlin, Groovy, Scala, C/C++, and JavaScript.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Gradle",
+        "url": "https://gradle.org/",
+        "type": "article"
+      },
+      {
+        "title": "Gradle",
+        "url": "https://www.javatpoint.com/gradle",
+        "type": "article"
+      },
+      {
+        "title": "Building Spring Boot Projects with Gradle",
+        "url": "https://www.baeldung.com/spring-boot-gradle-plugin",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Gradle",
+        "url": "https://app.daily.dev/tags/gradle?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "Gradle Tutorial",
+        "url": "https://youtu.be/kONQCIAcWeI",
+        "type": "video"
+      },
+      {
+        "title": "Working with Gradle",
+        "url": "https://youtu.be/6V6G3RyxEMk",
+        "type": "video"
+      }
+    ]
+  },
+  "6FMj9tMAQPii_1kLtHJLk": {
+    "title": "Bazel",
+    "description": "Bazel is an open-source build and test tool similar to Make, Maven, and Gradle. It uses a human-readable, high-level build language. Bazel supports projects in multiple languages and builds outputs for multiple platforms. It's designed for fast, reliable, and reproducible builds, making it suitable for large codebases and complex projects.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Getting started with Bazel",
+        "url": "https://bazel.build/start",
+        "type": "article"
+      },
+      {
+        "title": "Build Java Projects with Bazel",
+        "url": "https://earthly.dev/blog/build-java-projects-with-bazel/",
+        "type": "article"
+      },
+      {
+        "title": "Introduction to the Bazel Build Tool",
+        "url": "https://www.baeldung.com/bazel-build-tool",
+        "type": "article"
+      }
+    ]
+  },
+  "zItXmuluDtl6HkTYQ7qMh": {
+    "title": "Dependency Injection",
+    "description": "Dependency Injection (DI) is a design pattern where objects receive their dependencies from external sources rather than creating them themselves. This means a class doesn't have to worry about how to obtain the objects it needs to function; instead, those objects are \"injected\" into the class, usually through its constructor, setter methods, or interface. This promotes loose coupling and makes code more testable and maintainable.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Dependency Injection Tutorial",
+        "url": "https://jenkov.com/tutorials/dependency-injection/index.html",
+        "type": "article"
+      },
+      {
+        "title": "Java Dependency Injection Design Pattern Example Tutorial",
+        "url": "https://www.digitalocean.com/community/tutorials/java-dependency-injection-design-pattern-example-tutorial",
+        "type": "article"
+      }
+    ]
+  },
+  "M0ybgK1JCycXhZ1dEpCFo": {
+    "title": "I/O Operations",
+    "description": "I/O Operations, short for Input/Output Operations, deal with how a program interacts with the outside world. This involves reading data from sources like files, network connections, or the keyboard, and writing data to destinations such as files, the console, or network sockets. Essentially, it's the mechanism by which a program receives information and sends results.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java IO Tutorial",
+        "url": "https://jenkov.com/tutorials/java-io/index.html",
+        "type": "article"
+      }
+    ]
+  },
+  "NowpzyPVFcX082j5YS5i8": {
+    "title": "File Operations",
+    "description": "Learn how to work with files i.e., reading, writing and deleting, files and folders, etc. Also, learn how to make API calls, parse the incoming response, and so on.\n\n*   `FileWriter` - this class is useful to create a file by writing characters into it\n*   `FileReader` - this class is useful to read data in form of characters from file\n*   `Files.lines(Paths.get(\"file.txt\")))` - processing the files as a stream. Since Java 8\n*   `Files.readString / Files.writeString` - reads the whole file and puts it into a string - since Java 11\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "How To Work With Files In Java",
+        "url": "https://www.marcobehler.com/guides/java-files",
+        "type": "article"
+      },
+      {
+        "title": "Java File Class",
+        "url": "https://www.javatpoint.com/java-file-class",
+        "type": "article"
+      },
+      {
+        "title": "(old) Java HttpURLConnection Example - Java HTTP Request GET, POST",
+        "url": "https://www.digitalocean.com/community/tutorials/java-httpurlconnection-example-java-http-request-get-post",
+        "type": "article"
+      },
+      {
+        "title": "New Java HttpClient",
+        "url": "https://www.baeldung.com/java-9-http-client",
+        "type": "article"
+      },
+      {
+        "title": "5 ways to make HTTP requests in Java",
+        "url": "https://www.twilio.com/blog/5-ways-to-make-http-requests-in-java",
+        "type": "article"
+      },
+      {
+        "title": "Read a file line by line in Java",
+        "url": "https://mkyong.com/java8/java-8-stream-read-a-file-line-by-line/",
+        "type": "article"
+      },
+      {
+        "title": "Various ways to read a file to String in Java",
+        "url": "https://howtodoinjava.com/java/io/java-read-file-to-string-examples/",
+        "type": "article"
+      }
+    ]
+  },
+  "shqS9-hg__mkOtnnl_I4l": {
+    "title": "Concurrency",
+    "description": "Concurrency is the ability of a program to execute multiple tasks seemingly simultaneously. This doesn't necessarily mean they are running at the exact same instant, but rather that their execution overlaps in time. This can be achieved through techniques like multithreading, where a single program is divided into multiple threads that can run concurrently, or through asynchronous programming, where tasks can be started and then the program can continue executing other tasks without waiting for the first task to complete.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Concurrency and Multithreading Tutorial",
+        "url": "https://jenkov.com/tutorials/java-concurrency/index.html",
+        "type": "article"
+      },
+      {
+        "title": "Java Concurrency in Practice",
+        "url": "https://www.baeldung.com/java-concurrency",
+        "type": "article"
+      }
+    ]
+  },
+  "u_YysD7Bpnq-xkFX5yJGz": {
+    "title": "Threads",
+    "description": "A thread in Java is the direction or path that is taken while a program is being executed. Generally, all the programs have at least one thread, known as the main thread, that is provided by the JVM or Java Virtual Machine at the starting of the program’s execution.\n\nWriting correct multi-threaded application is complex and it's an advanced topic. Things like ParallelStreams, thread-safe Collections and ExecutorService can be helpful.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Threads in Java",
+        "url": "https://jenkov.com/tutorials/java-concurrency/index.html",
+        "type": "article"
+      },
+      {
+        "title": "Java Threads Tutorial",
+        "url": "https://www.youtube.com/watch?v=TCd8QIS-2KI",
+        "type": "video"
+      }
+    ]
+  },
+  "vJSq1GJLIMQ6IIB8CMK8g": {
+    "title": "Virtual Threads",
+    "description": "Virtual Threads are lightweight threads managed by the Java Virtual Machine (JVM). Unlike traditional operating system threads, which are relatively expensive to create and manage, virtual threads are designed to be extremely lightweight, allowing for the creation of millions of them. They are intended to improve the scalability and concurrency of Java applications by making it easier to write code that can handle a large number of concurrent operations without the overhead associated with traditional threads.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java 21 Virtual Threads: Dude, Where's My Lock?",
+        "url": "https://netflixtechblog.com/java-21-virtual-threads-dude-wheres-my-lock-3052540e231d",
+        "type": "article"
+      },
+      {
+        "title": "Virtual Thread vs Thread in Java",
+        "url": "https://www.baeldung.com/java-virtual-thread-vs-thread",
+        "type": "article"
+      },
+      {
+        "title": "The Ultimate Guide to Java Virtual Threads",
+        "url": "https://rockthejvm.com/articles/the-ultimate-guide-to-java-virtual-threads",
+        "type": "article"
+      }
+    ]
+  },
+  "wEc7pSVU5G2c6Zqmtb_1k": {
+    "title": "Java Memory Model",
+    "description": "The Java Memory Model (JMM) defines how threads in Java interact with memory. It specifies how and when different threads can see writes to shared variables, addressing issues like data visibility and race conditions in concurrent programs. The JMM ensures that multithreaded Java programs behave predictably across different hardware architectures by establishing rules for memory synchronization and ordering.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Memory Model",
+        "url": "https://jenkov.com/tutorials/java-concurrency/java-memory-model.html",
+        "type": "article"
+      }
+    ]
+  },
+  "U4Wx3MH3LgJLa0n9Ne0Br": {
+    "title": "volatile keyword",
+    "description": "The `volatile` keyword in Java is a modifier that can be applied to instance variables. It ensures that all threads see the most up-to-date value of a variable. Without `volatile`, each thread might cache its own copy of the variable, leading to inconsistencies when multiple threads access and modify it concurrently. Using `volatile` forces the thread to read the variable's value directly from main memory, and write changes directly back to main memory, bypassing the thread's local cache.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Volatile Keyword",
+        "url": "https://jenkov.com/tutorials/java-concurrency/volatile.html",
+        "type": "article"
+      },
+      {
+        "title": "Guide to the Volatile Keyword in Java",
+        "url": "https://www.baeldung.com/java-volatile",
+        "type": "article"
+      }
+    ]
+  },
+  "_wV2VQq6MIY1rVHjK8pfu": {
+    "title": "Cryptography",
+    "description": "Cryptography is the practice and study of techniques for secure communication in the presence of adversaries. It involves converting readable data (plaintext) into an unreadable format (ciphertext) through encryption, and then converting the ciphertext back into plaintext through decryption. Cryptography uses algorithms and keys to ensure confidentiality, integrity, authentication, and non-repudiation of information.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Cryptography Tutorial",
+        "url": "https://jenkov.com/tutorials/java-cryptography/index.html",
+        "type": "article"
+      }
+    ]
+  },
+  "9h20XVRli7TDq0QIJwX2U": {
+    "title": "Date and Time",
+    "description": "Date and Time is a very important concept in programming. Java provides a rich set of classes to work with Date and Time.\n\nLearn how to work with Date and Time in Java.",
+    "links": [
+      {
+        "title": "Date and Time API in Java",
+        "url": "https://chamalwr.medium.com/datetime-api-in-java-2aef5df1c39b",
+        "type": "article"
+      },
+      {
+        "title": "Introduction to Date and Time in Java",
+        "url": "https://www.baeldung.com/java-8-date-time-intro",
+        "type": "article"
+      },
+      {
+        "title": "Java SE 8 Date and Time",
+        "url": "https://www.oracle.com/technical-resources/articles/java/jf14-date-time.html",
+        "type": "article"
+      }
+    ]
+  },
+  "1Mk_zXxCCcUoX-gFxtlnf": {
+    "title": "Functional Composition",
+    "description": "Functional composition is the process of combining two or more functions to produce a new function. The resulting function applies each function in order, passing the output of one function as the input to the next. This allows you to build complex operations by chaining together simpler, reusable functions.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Functional Composition in Java",
+        "url": "https://jenkov.com/tutorials/java-functional-programming/functional-composition.html",
+        "type": "article"
+      },
+      {
+        "title": "Java Functional Programming",
+        "url": "https://www.baeldung.com/java-functional-programming",
+        "type": "article"
+      }
+    ]
+  },
+  "dz6bCmB4dgA7VVZ448cN6": {
+    "title": "High Order Functions",
+    "description": "High Order Functions are functions that can either accept other functions as arguments or return functions as their results. This capability allows for more flexible and reusable code by enabling you to abstract over operations. Essentially, you can pass behavior as data, making your code more dynamic and adaptable to different situations.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java High Order Functions",
+        "url": "https://jenkov.com/tutorials/java-functional-programming/higher-order-functions.html",
+        "type": "article"
+      }
+    ]
+  },
+  "SityDdjhhNZ9CO3Tg0VI9": {
+    "title": "Functional Interfaces",
+    "description": "Functional interfaces are interfaces that contain only one abstract method. They can have multiple default or static methods, but only one method that needs to be implemented. These interfaces can be used with lambda expressions and method references, allowing for concise and readable code when dealing with single-method operations.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Functional Interfaces",
+        "url": "https://jenkov.com/tutorials/java-functional-programming/functional-interfaces.html",
+        "type": "article"
+      },
+      {
+        "title": "Java Functional Interfaces",
+        "url": "https://www.baeldung.com/java-8-functional-interfaces",
+        "type": "article"
+      }
+    ]
+  },
+  "WHxAwfdKHQSOg0TLX05EG": {
+    "title": "Stream API",
+    "description": "Java provides a new additional package in Java 8 called java.util.stream. This package consists of classes, interfaces and enum to allows functional-style operations on the elements. You can use stream by importing java.util.stream package.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java 8 Stream",
+        "url": "https://www.javatpoint.com/java-8-stream",
+        "type": "article"
+      },
+      {
+        "title": "The Java 8 Stream API Tutorial",
+        "url": "https://www.baeldung.com/java-8-streams",
+        "type": "article"
+      },
+      {
+        "title": "Streams API Tutorial in Java 8+",
+        "url": "https://www.youtube.com/watch?v=VNovNwHr9jY",
+        "type": "video"
+      },
+      {
+        "title": "Java 8 Streams Tutorial",
+        "url": "https://www.youtube.com/watch?v=t1-YZ6bF-g0",
+        "type": "video"
+      }
+    ]
+  },
+  "JeMG0gU8IVRBZgczjXmPi": {
+    "title": "Networking",
+    "description": "*   Java Networking is a concept of connecting two or more computing devices together so that we can share resources.\n*   Java socket programming provides facility to share data between different computing devices.\n*   A socket is one endpoint of a two-way communication link between two programs running on the network. A socket is bound to a port number so that the TCP layer can identify the application that data is destined to be sent to.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Sockets",
+        "url": "https://docs.oracle.com/javase/tutorial/networking/sockets/index.html",
+        "type": "article"
+      },
+      {
+        "title": "Java Networking",
+        "url": "https://www.tutorialspoint.com/java/java_networking.htm",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Networking",
+        "url": "https://app.daily.dev/tags/networking?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "What is Socket Programming?",
+        "url": "https://youtu.be/BqBKEXLqdvI",
+        "type": "video"
+      }
+    ]
+  },
+  "C7rB3jkshHFN7TkHRJPlz": {
+    "title": "Regular Expressions",
+    "description": "Regular expressions, often shortened to \"regex,\" are sequences of characters that define a search pattern. These patterns are used to match character combinations in strings. They can be used to search, edit, or manipulate text and data. Regular expressions provide a powerful and flexible way to work with text-based data.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Java Regular Expressions Tutorial",
+        "url": "https://jenkov.com/tutorials/java-regex/index.html",
+        "type": "article"
+      }
+    ]
+  },
+  "fV-gW51jhna2__Ln2HIIh": {
+    "title": "Database Access",
+    "description": "A programming method to map objects in Java to relational entities in a database. In other words, converting data between relational databases and object-oriented programming languages. Some popular ORM tools/frameworks in Java are:\n\n*   Spring Data JPA\n*   Hibernate\n*   Ebean\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "ORM tutorial",
+        "url": "https://www.altexsoft.com/blog/object-relational-mapping/",
+        "type": "article"
+      },
+      {
+        "title": "Java Databases: An Overview of Libraries & APIs",
+        "url": "https://www.marcobehler.com/guides/java-databases",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Java",
+        "url": "https://app.daily.dev/tags/java?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "WzWOxBUKKg6LeuBmVesc2": {
+    "title": "Spring Data JPA",
+    "description": "Spring Data JPA aims to significantly improve the implementation of data access layers by reducing the effort to the amount that's actually needed. As a developer you write your repository interfaces, including custom finder methods, and Spring will provide the implementation automatically.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Spring Data JPA",
+        "url": "https://spring.io/projects/spring-data-jpa",
+        "type": "article"
+      },
+      {
+        "title": "Introduction to Spring Data JPA",
+        "url": "https://www.baeldung.com/the-persistence-layer-with-spring-data-jpa",
+        "type": "article"
+      },
+      {
+        "title": "Spring Data JPA Tutorial",
+        "url": "https://www.javatpoint.com/spring-and-jpa-integration",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Spring Framework",
+        "url": "https://app.daily.dev/tags/spring?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "Spring Data JPA Tutorial",
+        "url": "https://youtu.be/XszpXoII9Sg",
+        "type": "video"
+      },
+      {
+        "title": "Spring Boot Tutorial - Spring Data JPA",
+        "url": "https://youtu.be/8SGI_XS5OPw",
+        "type": "video"
+      }
+    ]
+  },
+  "UEiDzzodyEu5O1xFAFDly": {
+    "title": "Hibernate",
+    "description": "Hibernate is an open source object-relational mapping tool that provides a framework to map object-oriented domain models to relational databases for web applications. Hibernate implements the specifications of JPA. Performance is key so Hibernate supports first-level and second-level caching\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Hibernate",
+        "url": "https://hibernate.org/",
+        "type": "article"
+      },
+      {
+        "title": "Hibernate Tutorial",
+        "url": "https://www.javatpoint.com/hibernate-tutorial",
+        "type": "article"
+      },
+      {
+        "title": "Second-level caching explained",
+        "url": "https://hazelcast.com/glossary/hibernate-second-level-cache/",
+        "type": "article"
+      }
+    ]
+  },
+  "X2rJ3BY1ytFKsbJqJETFu": {
+    "title": "EBean",
+    "description": "Ebean is an object-relational mapping tool written in Java. It supports the standard JPA annotations for declaring entities. However, it provides a much simpler API for persisting. In fact, one of the points worth mentioning about the Ebean architecture is that it is sessionless, meaning it does not fully manage entities.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Ebean",
+        "url": "https://ebean.io/",
+        "type": "article"
+      },
+      {
+        "title": "Ebean Documentation",
+        "url": "https://ebean.io/docs/",
+        "type": "article"
+      },
+      {
+        "title": "Guide to Ebean",
+        "url": "https://www.baeldung.com/ebean-orm",
+        "type": "article"
+      }
+    ]
+  },
+  "d9F5Wt8onY125DLuzNULg": {
+    "title": "Logging Frameworks",
+    "description": "Logging is an important feature that helps developers to trace out the errors. It provides the ability to capture the log file. Logging provides the complete tracing information of the application and also records the critical failure if any occur in an application. There are three components of Logging: Logger, Logging handlers or Appenders and Layouts or logging formatters.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Introduction to Java Logging",
+        "url": "https://www.baeldung.com/java-logging-intro",
+        "type": "article"
+      },
+      {
+        "title": "Java Logger",
+        "url": "https://www.javatpoint.com/java-logger",
+        "type": "article"
+      },
+      {
+        "title": "Java Logging Frameworks",
+        "url": "https://en.wikipedia.org/wiki/Java_logging_framework",
+        "type": "article"
+      },
+      {
+        "title": "How to Do Logging In Java",
+        "url": "https://www.marcobehler.com/guides/java-logging",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Java",
+        "url": "https://app.daily.dev/tags/java?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "okC1uMdyfIJAhX_R9Npsw": {
+    "title": "Logback",
+    "description": "Logback is one of the most widely used logging frameworks in the Java Community. It's a replacement for its predecessor, Log4j. Logback offers a faster implementation, provides more options for configuration, and more flexibility in archiving old log files.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Official Website",
+        "url": "https://logback.qos.ch/manual/configuration.html",
+        "type": "article"
+      }
+    ]
+  },
+  "sFaNj_1MviaTc6UIfjXl6": {
+    "title": "Log4j2",
+    "description": "Apache Log4j is a Java-based logging utility. Log4j Java library's role is to log information that helps applications run smoothly, determine what's happening, and help with the debugging process when errors occur. Logging libraries typically write down messages to the log file or a database.\n\nLog4j2 is the updated version of the popular and influential log4j library, used extensively throughout the Java ecosystem for so many years. Version 2. x keeps all the logging features of its predecessor and builds on that foundation with some significant improvements, especially in the area of performance.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Official Website",
+        "url": "https://logging.apache.org/log4j/2.x/manual/configuration.html",
+        "type": "article"
+      },
+      {
+        "title": "Log4j explained: Everything you need to know",
+        "url": "https://www.techtarget.com/whatis/feature/Log4j-explained-Everything-you-need-to-know",
+        "type": "article"
+      }
+    ]
+  },
+  "LGlZHKqyQ-aWtHnhklhgn": {
+    "title": "SLF4J",
+    "description": "The SLF4J or the Simple Logging Facade for Java is an abstraction layer for various Java logging frameworks, like Log4j 2 or Logback. This allows for plugging different logging frameworks at deployment time without the need for code changes.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Official Website",
+        "url": "https://www.slf4j.org/",
+        "type": "article"
+      }
+    ]
+  },
+  "Fn7aAaGbwYsAp4xLuuFud": {
+    "title": "TinyLog",
+    "description": "Tinylog is a lightweight open-source logging framework for Java and Android, optimized for ease of use.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Official Website",
+        "url": "https://tinylog.org/v1/",
+        "type": "article"
+      },
+      {
+        "title": "TinyLog v2",
+        "url": "https://tinylog.org/v2/",
+        "type": "article"
+      }
+    ]
+  },
+  "LgpsnXV0CTvTspjnsd0Rd": {
+    "title": "Testing",
+    "description": "A key to building software that meets requirements without defects is testing. Software testing helps developers know they are building the right software. When tests are run as part of the development process (often with continuous integration tools), they build confidence and prevent regressions in the code.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "What is Software Testing?",
+        "url": "https://www.guru99.com/software-testing-introduction-importance.html",
+        "type": "article"
+      },
+      {
+        "title": "Testing Pyramid",
+        "url": "https://www.browserstack.com/guide/testing-pyramid-for-test-automation",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Java",
+        "url": "https://app.daily.dev/tags/java?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "9UbRG752qxJdUwmqEAjN3": {
+    "title": "JDBC",
+    "description": "JDBC is an API(Application programming interface) used in java programming to interact with databases. The classes and interfaces of JDBC allow the application to send requests made by users to the specified database.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "IBM: What is JDBC",
+        "url": "https://www.ibm.com/docs/en/informix-servers/12.10?topic=started-what-is-jdbc",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Java",
+        "url": "https://app.daily.dev/tags/java?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "hY1-sEpTmpaj1PregdkFf": {
+    "title": "JUnit",
+    "description": "JUnit is a testing framework for Java.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "JUnit",
+        "url": "https://junit.org/junit5",
+        "type": "article"
+      },
+      {
+        "title": "JUnit Documentation",
+        "url": "https://junit.org/junit5/docs/current/user-guide/",
+        "type": "article"
+      },
+      {
+        "title": "JUnit tutorial",
+        "url": "https://www.guru99.com/junit-tutorial.html",
+        "type": "article"
+      },
+      {
+        "title": "Basic JUnit tutorial",
+        "url": "https://www.baeldung.com/junit-5",
+        "type": "article"
+      },
+      {
+        "title": "Testing with JUnit crash course",
+        "url": "https://www.youtube.com/watch?v=flpmSXVTqBI",
+        "type": "video"
+      }
+    ]
+  },
+  "XU2C8bF9ICej8LS7ZGTTv": {
+    "title": "TestNG",
+    "description": "TestNG is a testing framework inspired from JUnit and NUnit but introducing some new functionalities that make it more powerful and easier to use.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Testng",
+        "url": "https://testng.org",
+        "type": "article"
+      },
+      {
+        "title": "Testng Documentation",
+        "url": "https://testng.org/doc/documentation-main.html",
+        "type": "article"
+      },
+      {
+        "title": "Testng tutorial",
+        "url": "https://www.guru99.com/all-about-testng-and-selenium.html",
+        "type": "article"
+      }
+    ]
+  },
+  "gB4XUR9nCdF1-dOEwGcHi": {
+    "title": "REST Assured",
+    "description": "Testing and validating REST services in Java is harder than in dynamic languages such as Ruby and Groovy. REST Assured brings the simplicity of using these languages into the Java domain.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Rest-assured Documentation",
+        "url": "https://github.com/rest-assured/rest-assured/wiki",
+        "type": "opensource"
+      },
+      {
+        "title": "Rest-assured",
+        "url": "https://rest-assured.io/",
+        "type": "article"
+      },
+      {
+        "title": "A Guide to REST-assured",
+        "url": "https://www.baeldung.com/rest-assured-tutorial",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about REST API",
+        "url": "https://app.daily.dev/tags/rest-api?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "U2BqOY49HaII6mKQB3SVt": {
+    "title": "JMeter",
+    "description": "Apache JMeter is an Apache project that can be used as a load testing tool for analyzing and measuring the performance of a variety of services, with a focus on web applications.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Apache JMeter Website",
+        "url": "https://jmeter.apache.org/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Testing",
+        "url": "https://app.daily.dev/tags/testing?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "UFDy19TNkykRsKv4vRsVJ": {
+    "title": "Cucubmber-JVM",
+    "description": "Cucumber is a testing tool that supports Behavior Driven Development (BDD). It offers a way to write tests that anybody can understand, regardless of their technical knowledge.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Cucumber",
+        "url": "https://cucumber.io/",
+        "type": "article"
+      },
+      {
+        "title": "Cucumber Documentation",
+        "url": "https://cucumber.io/docs/cucumber/",
+        "type": "article"
+      },
+      {
+        "title": "Cucumber-JVM for Java",
+        "url": "https://automationpanda.com/2017/10/24/cucumber-jvm-for-java/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about JVM",
+        "url": "https://app.daily.dev/tags/jvm?ref=roadmapsh",
+        "type": "article"
+      },
+      {
+        "title": "Cucumber-JVM 5 with Enhanced Cucumber Expression",
+        "url": "https://www.youtube.com/watch?v=jCzpxvAJoZM",
+        "type": "video"
+      }
+    ]
+  },
+  "mLM1HJf6_pxrUDOmb45ew": {
+    "title": "Mocking > Mockito",
+    "description": "Mocking removes external dependencies from a unit test to create a sense of an entire controlled environment. The traditional method of mocks involves mocking all other classes that interact with the class we want to test. The common targets for mocking are:\n\n*   Database connections\n*   Web services\n*   Slow Classes\n*   Classes with side effects\n*   Classes with non-deterministic behavior\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Mockito - Mocking Framework for Java",
+        "url": "https://site.mockito.org/",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Testing",
+        "url": "https://app.daily.dev/tags/testing?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
+  },
+  "OrkJa48HIDmrLOgCBpimA": {
+    "title": "Javalin",
+    "description": "Javalin is a lightweight web framework for Java and Kotlin that's designed to be simple, intuitive, and fun to use. It allows developers to quickly build web applications and APIs with minimal boilerplate code. Javalin focuses on providing a straightforward approach to routing, request handling, and response generation, making it a good choice for projects where speed of development and ease of understanding are important.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "Javalin Website",
+        "url": "https://javalin.io/",
+        "type": "article"
+      },
+      {
+        "title": "Creating a REST API with Javalin",
+        "url": "https://www.baeldung.com/javalin-rest-microservices",
+        "type": "article"
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/public/roadmap-content/javascript.json b/public/roadmap-content/javascript.json
index 0a0ae537b..b7a64c96d 100644
--- a/public/roadmap-content/javascript.json
+++ b/public/roadmap-content/javascript.json
@@ -334,11 +334,6 @@
         "title": "JavaScript Scope",
         "url": "https://www.w3schools.com/js/js_scope.asp",
         "type": "article"
-      },
-      {
-        "title": "Block Scoping in JavaScript",
-        "url": "https://www.geeksforgeeks.org/javascript-es2015-block-scoping",
-        "type": "article"
       }
     ]
   },
diff --git a/public/roadmap-content/nodejs.json b/public/roadmap-content/nodejs.json
index 3fc73fbe9..edcef423c 100644
--- a/public/roadmap-content/nodejs.json
+++ b/public/roadmap-content/nodejs.json
@@ -342,6 +342,11 @@
         "url": "https://docs.npmjs.com/updating-packages-downloaded-from-the-registry",
         "type": "article"
       },
+      {
+        "title": "How to Update Npm Packages Safely With Npm Check Updates",
+        "url": "https://chrispennington.blog/blog/how-to-update-npm-packages-safely-with-npm-check-updates/",
+        "type": "article"
+      },
       {
         "title": "How to Update All NPM Dependencies At Once",
         "url": "https://www.youtube.com/watch?v=Ghdfdq17JAY",
@@ -1023,16 +1028,16 @@
   },
   "XteNExIZN3_g95_dPCopY": {
     "title": "Exitting / Exit Codes",
-    "description": "`Exiting` is a way of terminating a Node.js process by using node.js process module.\n\nVisit the following resources to learn more:",
+    "description": "Exiting is a way of terminating a Node.js process by using node.js process module.\n\nVisit the following resources to learn more:",
     "links": [
       {
-        "title": "Node.js Docs on exit",
-        "url": "https://nodejs.org/docs/latest/api/process.html",
+        "title": "Exit Documentation",
+        "url": "https://nodejs.org/api/process.html#event-exit",
         "type": "article"
       },
       {
         "title": "How to Exit a Process in Node.js",
-        "url": "https://www.knowledgehut.com/blog/web-development/node-js-process-exit",
+        "url": "https://betterstack.com/community/questions/how-to-exit-in-node-js/",
         "type": "article"
       }
     ]
diff --git a/public/roadmap-content/php.json b/public/roadmap-content/php.json
index 6e4442e8a..583c18466 100644
--- a/public/roadmap-content/php.json
+++ b/public/roadmap-content/php.json
@@ -319,8 +319,13 @@
     "description": "The Null Safe Operator is a handy feature in PHP which deals with an issue that often pops up when working with objects: trying to access properties or methods on an object that might be null. Instead of a fatal error, the PHP Null Safe Operator (indicated by ?->) allows null values to be returned safely, making your code more robust. Here's a quick example, consider $session?->user?->name. If $session or user is null, PHP will stop further execution and simply return null. This makes PHP more resilient when processing unpredictable data.\n\nVisit the following resources to learn more:",
     "links": [
       {
-        "title": "Null Safe Operator",
-        "url": "https://www.php.net/manual/en/language.oop5.nullsafe.php",
+        "title": "The Basics - Manual",
+        "url": "https://www.php.net/manual/en/language.oop5.basic.php",
+        "type": "article"
+      },
+      {
+        "title": "PHP RFC: Nullsafe operator",
+        "url": "https://wiki.php.net/rfc/nullsafe_operator",
         "type": "article"
       }
     ]
@@ -393,7 +398,7 @@
   },
   "RkNjYva8o_jXp9suz5YdG": {
     "title": "Named Arguments",
-    "description": "Named arguments in PHP, introduced with PHP 8.0, allow you to specify the values of required parameters by their names, instead of their position in the function call, thus making your code more readable, reducing mistakes, and allowing for unimportant arguments to be skipped. Here's an array\\_fill() function using named arguments:\n\n    <?php\n    $a = array_fill(start_index: 0, num: 100, value: 50);\n    \n\nIn this code snippet, the parameters are passed by their names ('start\\_index', 'num', 'value'), not by their order in the function definition.\n\nVisit the following resources to learn more:",
+    "description": "Named arguments in PHP, introduced with PHP 8.0, allow you to specify the values of required parameters by their names, instead of their position in the function call, thus making your code more readable, reducing mistakes, and allowing for unimportant arguments to be skipped. Here's an array\\_fill() function using named arguments:\n\n    <?php\n    $a = array_fill(start_index: 0, count: 100, value: 50);\n    \n\nIn this code snippet, the parameters are passed by their names ('start\\_index', 'count', 'value'), not by their order in the function definition.\n\nVisit the following resources to learn more:",
     "links": [
       {
         "title": "Named Arguments",
@@ -712,14 +717,8 @@
   },
   "J9yIXZTtwbFzH2u4dI1ep": {
     "title": "CSRF Protection",
-    "description": "Cross-Site Request Forgery (CSRF) Protection in PHP is a method where a website can defend itself against unwanted actions performed on behalf of the users without their consent. It's a critical aspect of security as it safeguards users against potential harmful activities. Here's an example: if users are logged into a website and get tricked into clicking a deceitful link, CSRF attacks could be triggered. To protect your PHP applications from such attacks, you can generate a unique token for every session and include it as a hidden field for all form submissions. Afterwards, you need to verify this token on the server side before performing any action.\n\n    <?php\n    // Generate CSRF token\n    if(empty($_SESSION['csrf'])) {\n        $_SESSION['csrf'] = bin2hex(random_bytes(32));\n    }\n    \n    // Verify CSRF token\n    if(isset($_POST['csrf']) && $_POST['csrf'] === $_SESSION['csrf']) {\n        // valid CSRF token, perform action\n    }\n    ?>\n    \n\nVisit the following resources to learn more:",
-    "links": [
-      {
-        "title": "Security Guide",
-        "url": "https://php.net/manual/en/security.csrf.php",
-        "type": "article"
-      }
-    ]
+    "description": "Cross-Site Request Forgery (CSRF) Protection in PHP is a method where a website can defend itself against unwanted actions performed on behalf of the users without their consent. It's a critical aspect of security as it safeguards users against potential harmful activities. Here's an example: if users are logged into a website and get tricked into clicking a deceitful link, CSRF attacks could be triggered. To protect your PHP applications from such attacks, you can generate a unique token for every session and include it as a hidden field for all form submissions. Afterwards, you need to verify this token on the server side before performing any action.\n\n    <?php\n    // Generate CSRF token\n    if(empty($_SESSION['csrf'])) {\n        $_SESSION['csrf'] = bin2hex(random_bytes(32));\n    }\n    \n    // Verify CSRF token\n    if(isset($_POST['csrf']) && $_POST['csrf'] === $_SESSION['csrf']) {\n        // valid CSRF token, perform action\n    }\n    ?>\n    \n\nVisit the following resources to learn more:\n\n*   \\[@article@PHP Tutorial CSRF\\] ([https://www.phptutorial.net/php-tutorial/php-csrf/](https://www.phptutorial.net/php-tutorial/php-csrf/))",
+    "links": []
   },
   "JbWFfJiCRrXDhnuIx_lqx": {
     "title": "Password Hashing",
@@ -1021,12 +1020,12 @@
     "description": "Symfony is a set of PHP components and a framework for web projects. It aims to speed up the creation and maintenance of web applications and replace the recurring coding tasks. Symfony uses Composer, a PHP dependency manager, to manage its components. Below is an example of creating a new Symfony project:\n\n    composer create-project symfony/website-skeleton myproject\n    \n\nThis will download and install a new Symfony project in the 'myproject' directory. Symfony's components are reusable PHP libraries that will help you complete tasks, like routing, templating, or even creating form handling.\n\nVisit the following resources to learn more:",
     "links": [
       {
-        "title": "Symphony",
+        "title": "Symfony",
         "url": "https://symfony.com/",
         "type": "article"
       },
       {
-        "title": "Symphony Documentation",
+        "title": "Symfony Documentation",
         "url": "https://symfony.com/doc/current/index.html",
         "type": "article"
       }
diff --git a/public/roadmap-content/postgresql-dba.json b/public/roadmap-content/postgresql-dba.json
index 4279d8fa1..f2ec3337a 100644
--- a/public/roadmap-content/postgresql-dba.json
+++ b/public/roadmap-content/postgresql-dba.json
@@ -251,11 +251,6 @@
         "title": "What is the Relational Model?",
         "url": "https://www.postgresql.org/docs/7.1/relmodel-oper.html",
         "type": "article"
-      },
-      {
-        "title": "The Relational Model",
-        "url": "https://www.geeksforgeeks.org/relational-model-in-dbms/",
-        "type": "article"
       }
     ]
   },
@@ -583,7 +578,7 @@
     "links": [
       {
         "title": "pg_ctlcluster",
-        "url": "https://www.postgresql.org/docs/current/pgctlcluster.html",
+        "url": "https://manpages.ubuntu.com/manpages/focal/man1/pg_ctlcluster.1.html",
         "type": "article"
       }
     ]
@@ -1075,7 +1070,7 @@
     ]
   },
   "S20aJB-VuSpXYyd0-0S8c": {
-    "title": "Object Priviliges",
+    "title": "Object Privileges",
     "description": "Object privileges in PostgreSQL are the permissions given to different user roles to access or modify database objects like tables, views, sequences, and functions. Ensuring proper object privileges is crucial for maintaining a secure and well-functioning database.\n\nLearn more from the following resources:",
     "links": [
       {
@@ -1117,7 +1112,7 @@
     ]
   },
   "t18XjeHP4uRyERdqhHpl5": {
-    "title": "Default Priviliges",
+    "title": "Default Privileges",
     "description": "PostgreSQL allows you to define object privileges for various types of database objects. These privileges determine if a user can access and manipulate objects like tables, views, sequences, or functions. In this section, we will focus on understanding default privileges in PostgreSQL.\n\nLearn more from the following resources:",
     "links": [
       {
diff --git a/public/roadmap-content/product-manager.json b/public/roadmap-content/product-manager.json
index ec1400c4b..bcb577b8b 100644
--- a/public/roadmap-content/product-manager.json
+++ b/public/roadmap-content/product-manager.json
@@ -399,8 +399,19 @@
   },
   "gS3ofDrqDRKbecIskIyGi": {
     "title": "Product Roadmap",
-    "description": "The product roadmap is a strategic document that provides a detailed overview of the product's direction and vision. It outlines the product's plans, both tactical and strategic - including the specific steps necessary to achieve the company's goals and vision. As a Product Manager, you are expected to guide the creation of the product roadmap, communicating the product’s evolution to the team, stakeholders, and customers. This tool serves as an essential reference point helping to align all stakeholders with the key priorities and vision of the product, and acts as a guide for decisions around product development.",
-    "links": []
+    "description": "The product roadmap is a strategic document that provides a detailed overview of the product's direction and vision. It outlines the product's plans, both tactical and strategic - including the specific steps necessary to achieve the company's goals and vision. As a Product Manager, you are expected to guide the creation of the product roadmap, communicating the product’s evolution to the team, stakeholders, and customers. This tool serves as an essential reference point helping to align all stakeholders with the key priorities and vision of the product, and acts as a guide for decisions around product development.\n\nLearn more from the following resources:",
+    "links": [
+      {
+        "title": "What is a Product Roadmap? - Product Plan",
+        "url": "https://www.productplan.com/learn/what-is-a-product-roadmap/",
+        "type": "article"
+      },
+      {
+        "title": "What is a Product Roadmap? - Vibhor Chandel",
+        "url": "https://www.youtube.com/watch?v=BJR70jnpHog&ab_channel=VibhorChandel",
+        "type": "video"
+      }
+    ]
   },
   "eiqV86PWizZPWsyqoBU5k": {
     "title": "Creating a Roadmap",
diff --git a/public/roadmap-content/python.json b/public/roadmap-content/python.json
index 95cad4db4..34f2f3a28 100644
--- a/public/roadmap-content/python.json
+++ b/public/roadmap-content/python.json
@@ -179,6 +179,21 @@
         "title": "Tuples Documentation",
         "url": "https://docs.python.org/3/tutorial/datastructures.html#tuples-and-sequences",
         "type": "article"
+      },
+      {
+        "title": "When and How to Use Tuples",
+        "url": "https://thenewstack.io/python-for-beginners-when-and-how-to-use-tuples/",
+        "type": "article"
+      },
+      {
+        "title": "Python's tuple Data Type: A Deep Dive With Examples",
+        "url": "https://realpython.com/python-tuple/#getting-started-with-pythons-tuple-data-type",
+        "type": "article"
+      },
+      {
+        "title": "why are Tuples even a thing?",
+        "url": "https://www.youtube.com/watch?v=fR_D_KIAYrE",
+        "type": "video"
       }
     ]
   },
@@ -205,7 +220,7 @@
   },
   "bc9CL_HMT-R6nXO1eR-gP": {
     "title": "Dictionaries",
-    "description": "In Python, a dictionary is a built-in data type that allows you to store key-value pairs. Each key in the dictionary is unique, and each key is associated with a value. Dictionaries are unordered collections, meaning the order of items is not guaranteed.\n\nLearn more from the following resources:",
+    "description": "In Python, a dictionary is a built-in data type that allows you to store key-value pairs. Each key in the dictionary is unique, and each key is associated with a value. Starting from Python 3.7, dictionaries maintain the order of items as they were added.\n\nLearn more from the following resources:",
     "links": [
       {
         "title": "Dictionaries in Python",
@@ -216,6 +231,11 @@
         "title": "W3 Schools - Dictionaries",
         "url": "https://www.w3schools.com/python/python_dictionaries.asp",
         "type": "article"
+      },
+      {
+        "title": "Dictionaries in Python",
+        "url": "https://realpython.com/python-dicts/",
+        "type": "article"
       }
     ]
   },
@@ -223,11 +243,6 @@
     "title": "Loops",
     "description": "Loops are used to execute a block of code repeatedly.\n\nVisit the following resources to learn more:",
     "links": [
-      {
-        "title": "Loops in Python",
-        "url": "https://www.geeksforgeeks.org/loops-in-python/",
-        "type": "article"
-      },
       {
         "title": "Python \"while\" Loops (Indefinite Iteration)",
         "url": "https://realpython.com/python-while-loop/",
@@ -533,6 +548,11 @@
         "title": "Modules in Python",
         "url": "https://www.programiz.com/python-programming/modules",
         "type": "article"
+      },
+      {
+        "title": "Python Modules and Packages",
+        "url": "https://realpython.com/python-modules-packages/",
+        "type": "article"
       }
     ]
   },
@@ -596,6 +616,11 @@
         "title": "Python Iterators",
         "url": "https://www.programiz.com/python-programming/iterator",
         "type": "article"
+      },
+      {
+        "title": "Iterators and Iterables in Python",
+        "url": "https://realpython.com/python-iterators-iterables/",
+        "type": "article"
       }
     ]
   },
@@ -622,7 +647,7 @@
   },
   "P_Di-XPSDITmU3xKQew8G": {
     "title": "Object Oriented Programming",
-    "description": "In Python, object-oriented Programming (OOPs) is a programming paradigm that uses objects and classes in programming. It aims to implement real-world entities like inheritance, polymorphisms, encapsulation, etc. in the programming. The main concept of OOPs is to bind the data and the functions that work on that together as a single unit so that no other part of the code can access this data.\n\nVisit the following resources to learn more:",
+    "description": "In Python, object-oriented Programming (OOPs) is a programming paradigm that uses objects and classes in programming. It aims to implement real-world entities like inheritance, polymorphism, encapsulation, etc., in programming. The main concept of OOPs is to bind the data and the functions that work on that together as a single unit so that no other part of the code can access this data.\n\nVisit the following resources to learn more:",
     "links": [
       {
         "title": "Object Oriented Programming in Python",
@@ -685,7 +710,7 @@
   },
   "zAS4YiEJ6VPsyABrkIG8i": {
     "title": "Methods, Dunder",
-    "description": "A method in python is somewhat similar to a function, except it is associated with object/classes. Methods in python are very similar to functions except for two major differences.\n\n*   The method is implicitly used for an object for which it is called.\n*   The method is accessible to data that is contained within the class.\n\nDunder or magic methods in Python are the methods having two prefix and suffix underscores in the method name. Dunder here means “Double Under (Underscores)”. These are commonly used for operator overloading. Few examples for magic methods are: **`__init__`**, **`__add__`**, **`__len__`**, **`__repr__`** etc.\n\nVisit the following resources to learn more:",
+    "description": "A method in python is somewhat similar to a function, except it is associated with object/classes. Methods in python are very similar to functions except for two major differences.\n\n*   The method is implicitly used for an object for which it is called.\n*   The method is accessible to data that is contained within the class.\n\nDunder or magic methods in Python are the methods that have two prefix and suffix underscores in the method name. Dunder here means “Double Under (Underscores)”. These are commonly used for operator overloading. Few examples for magic methods are: **`__init__`**, **`__add__`**, **`__len__`**, **`__repr__`** etc.\n\nVisit the following resources to learn more:",
     "links": [
       {
         "title": "Method vs Function in Python",
@@ -1284,7 +1309,7 @@
     "description": "An extremely fast Python linter and code formatter, written in Rust.",
     "links": [
       {
-        "title": "ruff documentation",
+        "title": "Ruff documentation",
         "url": "https://docs.astral.sh/ruff/",
         "type": "article"
       }
diff --git a/public/roadmap-content/qa.json b/public/roadmap-content/qa.json
index 5e4f84a56..8d36c273b 100644
--- a/public/roadmap-content/qa.json
+++ b/public/roadmap-content/qa.json
@@ -554,7 +554,7 @@
     "links": [
       {
         "title": "Regression Testing",
-        "url": "https://www.javatpoint.com/regression-testing",
+        "url": "https://www.tpointtech.com/regression-testing",
         "type": "article"
       },
       {
diff --git a/public/roadmap-content/redis.json b/public/roadmap-content/redis.json
index 362b3460a..712484e01 100644
--- a/public/roadmap-content/redis.json
+++ b/public/roadmap-content/redis.json
@@ -534,7 +534,7 @@
     "links": [
       {
         "title": "RPOP Documentation",
-        "url": "https://redis.io/docs/latest/commands/rpush/",
+        "url": "https://redis.io/docs/latest/commands/rpop/",
         "type": "article"
       }
     ]
@@ -732,11 +732,6 @@
         "title": "Redis Lists",
         "url": "https://redis.io/docs/latest/develop/data-types/lists/",
         "type": "article"
-      },
-      {
-        "title": "Complete Guide to Redis Lists",
-        "url": "https://www.geeksforgeeks.org/complete-guide-to-redis-lists/",
-        "type": "article"
       }
     ]
   },
@@ -954,8 +949,19 @@
   },
   "jrgaoDnt_RxTu79hk4hCD": {
     "title": "Atomicity in Redis",
-    "description": "Atomicity in Redis refers to the property that ensures a set of operations is executed as a single, indivisible unit. This means that either all the operations are executed successfully or none of them are. Atomicity is crucial in Redis to maintain consistency, especially when multiple operations need to be performed together.\n\nLearn more from the following resources:\n\n*   [@official@Atomicity with Lua](https://redis.io/learn/develop/java/spring/rate-limiting/fixed-window/reactive-lua) -[@article@Atomicity in Redis operations](https://lucaspin.medium.com/atomicity-in-redis-operations-a1d7bc9f4a90)",
-    "links": []
+    "description": "Atomicity in Redis refers to the property that ensures a set of operations is executed as a single, indivisible unit. This means that either all the operations are executed successfully or none of them are. Atomicity is crucial in Redis to maintain consistency, especially when multiple operations need to be performed together.\n\nLearn more from the following resources:",
+    "links": [
+      {
+        "title": "Atomicity with Lua",
+        "url": "https://redis.io/learn/develop/java/spring/rate-limiting/fixed-window/reactive-lua",
+        "type": "article"
+      },
+      {
+        "title": "Atomicity in Redis operations",
+        "url": "https://lucaspin.medium.com/atomicity-in-redis-operations-a1d7bc9f4a90",
+        "type": "article"
+      }
+    ]
   },
   "LHlwjN3WHYUBUafzzwsWQ": {
     "title": "Pipelining",
@@ -965,11 +971,6 @@
         "title": "Redis Pipelining",
         "url": "https://redis.io/docs/latest/develop/use/pipelining/",
         "type": "article"
-      },
-      {
-        "title": "Complete Guide to Redis Pipelining",
-        "url": "https://www.geeksforgeeks.org/complete-guide-to-redis-pipelining/",
-        "type": "article"
       }
     ]
   },
diff --git a/public/roadmap-content/server-side-game-developer.json b/public/roadmap-content/server-side-game-developer.json
index a777f830f..c1a64b3c8 100644
--- a/public/roadmap-content/server-side-game-developer.json
+++ b/public/roadmap-content/server-side-game-developer.json
@@ -257,7 +257,18 @@
   "E4H3hniIW6hKpH3Qr--N5": {
     "title": "C/C++",
     "description": "\"C\" and \"C++\", often written as \"C/CPP\", are two significantly prominent and similar programming languages widely used in server-side game development. \"C\" is a procedural language, which means that it follows a step-by-step procedure to solve a problem, while \"C++\" is both a procedural and object-oriented programming (OOP) language. This dual nature of \"C++\" allows it to handle more complex interrelated data and functions efficiently, which is a beneficial feature in game development. Moreover, \"C++\" is an extension of \"C\", meaning that any legal \"C\" program is also a valid \"C++\" program. Both languages offer a high degree of control over system resources and memory, making them an excellent choice for building fast and efficient server-side applications, such as multiplayer game servers.",
-    "links": []
+    "links": [
+      {
+        "title": "C Programming Language",
+        "url": "https://en.wikipedia.org/wiki/C_%28programming_language%29",
+        "type": "article"
+      },
+      {
+        "title": "C++ Programming Language",
+        "url": "https://en.wikipedia.org/wiki/C%2B%2B",
+        "type": "article"
+      }
+    ]
   },
   "DuyUc9a-47Uz03yr4aeyg": {
     "title": "C#",
diff --git a/public/roadmap-content/software-architect.json b/public/roadmap-content/software-architect.json
index e4d1a6892..6e6870688 100644
--- a/public/roadmap-content/software-architect.json
+++ b/public/roadmap-content/software-architect.json
@@ -38,14 +38,8 @@
   },
   "2sR4KULvAUUoOtopvsEBs": {
     "title": "Levels of Architecture",
-    "description": "Architecture can be done on several “levels” of abstractions. The level influences the importance of necessary skills. As there are many categorizations possible my favorite segmentation includes these 3 levels:\n\n*   **Application Level:** The lowest level of architecture. Focus on one single application. Very detailed, low level design. Communication is usually within one development team.\n*   **Solution Level:** The mid-level of architecture. Focus on one or more applications which fulfill a business need (business solution). Some high, but mainly low-level design. Communication is between multiple development teams.\n*   **Enterprise Level:** The highest level of architecture. Focus on multiple solutions. High level, abstract design, which needs to be detailed out by solution or application architects. Communication is across the organization.\n\nVisit the following resources to learn more:",
-    "links": [
-      {
-        "title": "Software Engineering Architecture",
-        "url": "https://www.geeksforgeeks.org/software-engineering-architectural-design/",
-        "type": "article"
-      }
-    ]
+    "description": "Architecture can be done on several “levels” of abstractions. The level influences the importance of necessary skills. As there are many categorizations possible my favorite segmentation includes these 3 levels:\n\n*   **Application Level:** The lowest level of architecture. Focus on one single application. Very detailed, low level design. Communication is usually within one development team.\n*   **Solution Level:** The mid-level of architecture. Focus on one or more applications which fulfill a business need (business solution). Some high, but mainly low-level design. Communication is between multiple development teams.\n*   **Enterprise Level:** The highest level of architecture. Focus on multiple solutions. High level, abstract design, which needs to be detailed out by solution or application architects. Communication is across the organization.",
+    "links": []
   },
   "Lqe47l4j-C4OwkbkwPYry": {
     "title": "Application Architecture",
@@ -103,14 +97,8 @@
   },
   "lBtlDFPEQvQ_xtLtehU0S": {
     "title": "Important Skills to Learn",
-    "description": "To support the laid-out activities specific skills are required. From my experience, read books and discussions we can boil this down to these ten skills every software architect should have:\n\n*   Design\n*   Decide\n*   Simplify\n*   Code\n*   Document\n*   Communicate\n*   Estimate\n*   Balance\n*   Consult\n*   Market\n\nVisit the following resources to learn more:",
-    "links": [
-      {
-        "title": "Software Architect Skills",
-        "url": "https://www.geeksforgeeks.org/software-architects-skills/",
-        "type": "article"
-      }
-    ]
+    "description": "To support the laid-out activities specific skills are required. From my experience, read books and discussions we can boil this down to these ten skills every software architect should have:\n\n*   Design\n*   Decide\n*   Simplify\n*   Code\n*   Document\n*   Communicate\n*   Estimate\n*   Balance\n*   Consult\n*   Market",
+    "links": []
   },
   "fBd2m8tMJmhuNSaakrpg4": {
     "title": "Design & Architecture",
@@ -496,7 +484,7 @@
   },
   "_U0VoTkqM1d6NR13p5azS": {
     "title": "Patterns & Design Principles",
-    "description": "",
+    "description": "In the realm of software architecture, patterns and design principles are foundational tools that enable architects to create robust, scalable, and maintainable systems. They offer proven solutions to common problems and guide decision-making throughout the software development lifecycle. Understanding these concepts is essential for anyone following a software architect roadmap, as they bridge the gap between high-level architecture and practical implementation.",
     "links": []
   },
   "AMDLJ_Bup-AY1chl_taV3": {
@@ -854,14 +842,8 @@
   },
   "SuMhTyaBS9vwASxAt39DH": {
     "title": "Tools",
-    "description": "Architect tools are software tools that help architects to design, document, and manage software architectures. These tools can be used to create architecture diagrams, generate code, and automate the software development process.\n\nVisit the following resources to learn more:",
-    "links": [
-      {
-        "title": "Top 10 Software Architecture Tools in 2024",
-        "url": "https://www.geeksforgeeks.org/software-architecture-tools/",
-        "type": "article"
-      }
-    ]
+    "description": "Architect tools are software tools that help architects to design, document, and manage software architectures. These tools can be used to create architecture diagrams, generate code, and automate the software development process.",
+    "links": []
   },
   "OaLmlfkZid7hKqJ9G8oNV": {
     "title": "Architecture",
@@ -1856,11 +1838,6 @@
         "url": "https://www.fortinet.com/resources/cyberglossary/tcp-ip#:~:text=The%20TCP%2FIP%20model%20defines,exchanged%20and%20organized%20over%20networks.",
         "type": "article"
       },
-      {
-        "title": "TCP/IP Model",
-        "url": "https://www.geeksforgeeks.org/tcp-ip-model/",
-        "type": "article"
-      },
       {
         "title": "What is TCP/IP and How Does it Work?",
         "url": "https://www.techtarget.com/searchnetworking/definition/TCP-IP",
diff --git a/public/roadmap-content/system-design.json b/public/roadmap-content/system-design.json
index 4bd5d6fd3..029903e5c 100644
--- a/public/roadmap-content/system-design.json
+++ b/public/roadmap-content/system-design.json
@@ -557,11 +557,11 @@
   },
   "fY8zgbB13wxZ1CFtMSdZZ": {
     "title": "SQL Tuning",
-    "description": "SQL tuning is a broad topic and many books have been written as reference. It's important to benchmark and profile to simulate and uncover bottlenecks.\n\n*   Benchmark - Simulate high-load situations with tools such as ab.\n*   Profile - Enable tools such as the slow query log to help track performance issues.\n\nBenchmarking and profiling might point you to the following optimizations.\n\nTo learn more, visit the following links:",
+    "description": "SQL tuning is the attempt to diagnose and repair SQL statements that fail to meet a performance standard. It is a broad topic and many books have been written as reference. It's important to benchmark and profile to simulate and uncover bottlenecks.\n\n*   Benchmark - Simulate high-load situations with tools such as ab.\n*   Profile - Enable tools such as the slow query log to help track performance issues.\n\nBenchmarking and profiling might point you to the following optimizations.\n\nTo learn more, visit the following links:",
     "links": [
       {
-        "title": "Optimizing MySQL Queries",
-        "url": "https://aiddroid.com/10-tips-optimizing-mysql-queries-dont-suck/",
+        "title": "Introduction to SQL Tuning - Oracle",
+        "url": "https://docs.oracle.com/en/database/oracle/oracle-database/23/tgsql/introduction-to-sql-tuning.html#GUID-B653E5F3-F078-4BBC-9516-B892960046A2",
         "type": "article"
       },
       {
@@ -1326,16 +1326,10 @@
       }
     ]
   },
-  "LncTxPg-wx8loy55r5NmV": {
+  "queu-based-load-leveling@LncTxPg-wx8loy55r5NmV.md": {
     "title": "Queu-based Load Leveling",
-    "description": "Use a queue that acts as a buffer between a task and a service it invokes in order to smooth intermittent heavy loads that can cause the service to fail or the task to time out. This can help to minimize the impact of peaks in demand on availability and responsiveness for both the task and the service.\n\nLearn more from the following links:",
-    "links": [
-      {
-        "title": "Queue-Based Load Leveling pattern",
-        "url": "https://learn.microsoft.com/en-us/azure/architecture/patterns/queue-based-load-leveling",
-        "type": "article"
-      }
-    ]
+    "description": "",
+    "links": []
   },
   "2ryzJhRDTo98gGgn9mAxR": {
     "title": "Publisher/Subscriber",
@@ -1665,10 +1659,21 @@
       }
     ]
   },
-  "backends-for-frontend@n4It-lr7FFtSY83DcGydX.md": {
+  "n4It-lr7FFtSY83DcGydX": {
     "title": "Backends for Frontend",
-    "description": "",
-    "links": []
+    "description": "Create separate backend services to be consumed by specific frontend applications or interfaces. This pattern is useful when you want to avoid customizing a single backend for multiple interfaces. This pattern was first described by Sam Newman.\n\nTo learn more, visit the following links:",
+    "links": [
+      {
+        "title": "Backends for Frontends pattern",
+        "url": "https://learn.microsoft.com/en-us/azure/architecture/patterns/backends-for-frontends",
+        "type": "article"
+      },
+      {
+        "title": "Explore top posts about Frontend Development",
+        "url": "https://app.daily.dev/tags/frontend?ref=roadmapsh",
+        "type": "article"
+      }
+    ]
   },
   "4hi7LvjLcv8eR6m-uk8XQ": {
     "title": "Anti-Corruption Layer",
diff --git a/public/roadmap-content/typescript.json b/public/roadmap-content/typescript.json
index 326ae0eca..e5b922a67 100644
--- a/public/roadmap-content/typescript.json
+++ b/public/roadmap-content/typescript.json
@@ -652,14 +652,8 @@
   },
   "lvtTSHH9yBTCiLng8btnI": {
     "title": "Hybrid Types",
-    "description": "In TypeScript, a hybrid type is a type that combines multiple types into a single type. The resulting type is considered a union of those types. This allows you to specify that a value can have multiple types, rather than just one.\n\nFor example, you can create a hybrid type that can accept either a string or a number:\n\n    type StringOrNumber = string | number;\n    \n\nYou can also use hybrid types to create more complex types that can represent a combination of several different types of values. For example:\n\n    type Education = {\n      degree: string;\n      school: string;\n      year: number;\n    };\n    \n    type User = {\n      name: string;\n      age: number;\n      email: string;\n      education: Education;\n    };\n    \n\nLearn more from the following links:",
-    "links": [
-      {
-        "title": "Geeksforgeeks.org - Hybrid Types",
-        "url": "https://www.geeksforgeeks.org/what-are-hybrid-types-in-typescript/#:~:text=Hybrid%20types%20are%20a%20combination,properties%20like%20a%20regular%20object.",
-        "type": "article"
-      }
-    ]
+    "description": "In TypeScript, a hybrid type is a type that combines multiple types into a single type. The resulting type is considered a union of those types. This allows you to specify that a value can have multiple types, rather than just one.\n\nFor example, you can create a hybrid type that can accept either a string or a number:\n\n    type StringOrNumber = string | number;\n    \n\nYou can also use hybrid types to create more complex types that can represent a combination of several different types of values. For example:\n\n    type Education = {\n      degree: string;\n      school: string;\n      year: number;\n    };\n    \n    type User = {\n      name: string;\n      age: number;\n      email: string;\n      education: Education;\n    };",
+    "links": []
   },
   "ib0jfZzukYOZ42AdJqt_W": {
     "title": "Classes",
@@ -800,11 +794,6 @@
         "title": "TypeScript Utility Types Guide",
         "url": "https://camchenry.com/blog/typescript-utility-types",
         "type": "article"
-      },
-      {
-        "title": "TypeScript Utility Types: Key Concepts And Best Practices",
-        "url": "https://marketsplash.com/tutorials/typescript/typescript-utility-types/",
-        "type": "article"
       }
     ]
   },
diff --git a/public/roadmap-content/ux-design.json b/public/roadmap-content/ux-design.json
index c762a26bc..676bfe9b3 100644
--- a/public/roadmap-content/ux-design.json
+++ b/public/roadmap-content/ux-design.json
@@ -387,8 +387,14 @@
   },
   "90_M5qABC1vZ1nsXVyqFJ": {
     "title": "Good Layout Rules",
-    "description": "In the world of UX design, a good layout is crucial to ensure your prototype is intuitive and user-friendly. By following these good layout rules, you can ensure your designs are efficient, attractive, and easy to navigate for users.\n\nConsistency\n-----------\n\nBeing consistent with your design is vital in creating an easy-to-navigate interface. Utilize the same color schemes, typography, and other design elements consistently throughout your prototype to make it visually cohesive and user-friendly.\n\nAlignment and Spacing\n---------------------\n\nEnsure all the elements on your prototype are aligned and spaced properly. This helps create a well-structured and clean look, while also making it easy for users to navigate and understand your design.\n\nVisual Hierarchy\n----------------\n\nEstablish clear visual hierarchy by using size, color, contrast, and white space effectively. This helps users identify important elements on the screen quickly and understand the flow of your design easily.\n\nGrouping of Elements\n--------------------\n\nGroup related elements together, such as navigation menus or form input fields. This helps users recognize the purpose and function of each section more quickly and intuitively.\n\nBalance and Proportion\n----------------------\n\nCreate a balanced and proportional look by distributing elements on the screen evenly. This can be achieved through the use of grids or other layout techniques that help maintain a sense of harmony and order in your design.\n\nAccessibility\n-------------\n\nEnsure your design is accessible to all users by considering factors such as text size, contrast, and color combinations. Aim to create an inclusive prototype that caters to people of different abilities and preferences.\n\nResponsiveness and Flexibility\n------------------------------\n\nMake sure your prototype can adapt to different screen sizes and devices, ensuring a seamless user experience across various platforms. This is particularly important when designing for web and mobile applications.\n\nIterating and Testing\n---------------------\n\nAs you develop your design, continually test and iterate on your layout based on user feedback and data. This process will help refine your design and ensure it meets the needs and expectations of your users.\n\nBy incorporating these good layout rules into your prototyping process, you'll be well on your way to creating a user-friendly and effective design that meets the goals and objectives of your project.",
-    "links": []
+    "description": "In the world of UX design, a good layout is crucial to ensure your prototype is intuitive and user-friendly. By following these good layout rules, you can ensure your designs are efficient, attractive, and easy to navigate for users.\n\nConsistency\n-----------\n\nBeing consistent with your design is vital in creating an easy-to-navigate interface. Utilize the same color schemes, typography, and other design elements consistently throughout your prototype to make it visually cohesive and user-friendly.\n\nAlignment and Spacing\n---------------------\n\nEnsure all the elements on your prototype are aligned and spaced properly. This helps create a well-structured and clean look, while also making it easy for users to navigate and understand your design.\n\nVisual Hierarchy\n----------------\n\nEstablish clear visual hierarchy by using size, color, contrast, and white space effectively. This helps users identify important elements on the screen quickly and understand the flow of your design easily.\n\nGrouping of Elements\n--------------------\n\nGroup related elements together, such as navigation menus or form input fields. This helps users recognize the purpose and function of each section more quickly and intuitively.\n\nBalance and Proportion\n----------------------\n\nCreate a balanced and proportional look by distributing elements on the screen evenly. This can be achieved through the use of grids or other layout techniques that help maintain a sense of harmony and order in your design.\n\nAccessibility\n-------------\n\nEnsure your design is accessible to all users by considering factors such as text size, contrast, and color combinations. Aim to create an inclusive prototype that caters to people of different abilities and preferences.\n\nResponsiveness and Flexibility\n------------------------------\n\nMake sure your prototype can adapt to different screen sizes and devices, ensuring a seamless user experience across various platforms. This is particularly important when designing for web and mobile applications.\n\nIterating and Testing\n---------------------\n\nAs you develop your design, continually test and iterate on your layout based on user feedback and data. This process will help refine your design and ensure it meets the needs and expectations of your users.\n\nBy incorporating these good layout rules into your prototyping process, you'll be well on your way to creating a user-friendly and effective design that meets the goals and objectives of your project.\n\nVisit the following resources to learn more:",
+    "links": [
+      {
+        "title": "User Interface Design Guidelines: 10 Rules of Thumb",
+        "url": "https://www.interaction-design.org/literature/article/user-interface-design-guidelines-10-rules-of-thumb",
+        "type": "article"
+      }
+    ]
   },
   "t46s6Piyd8MoJYzdDTsjr": {
     "title": "Figma",
diff --git a/public/roadmap-content/vue.json b/public/roadmap-content/vue.json
index 9cfe4bb56..a2892fefd 100644
--- a/public/roadmap-content/vue.json
+++ b/public/roadmap-content/vue.json
@@ -234,6 +234,11 @@
     "title": "Global Properties",
     "description": "Global properties allows you to add properties or methods that can be accessed throughout your application. This is particularly useful for sharing functionality or data across components without the need to pass props explicitly.\n\nVisit the following resources to learn more:",
     "links": [
+      {
+        "title": "Application API - globalProperties",
+        "url": "https://vuejs.org/api/application.html#app-config-globalproperties",
+        "type": "article"
+      },
       {
         "title": "Vue.js Global Properties",
         "url": "https://blog.logrocket.com/vue-js-globalproperties/",
@@ -374,6 +379,11 @@
     "title": "v-on",
     "description": "The v-on directive is placed on an element to attach an event listener. To attach an event listener with v-on we need to provide the event type, and any modifier, and a method or expression that should run when that event occurs.\n\nVisit the following resources to learn more:",
     "links": [
+      {
+        "title": "v-on Documentation",
+        "url": "https://vuejs.org/api/built-in-directives.html#v-on",
+        "type": "article"
+      },
       {
         "title": "v-on Directive",
         "url": "https://www.w3schools.com/vue/ref_v-on.php",
@@ -539,7 +549,7 @@
     "links": [
       {
         "title": "Modifiers",
-        "url": "https://v2.vuejs.org/v2/guide/components-custom-events.html",
+        "url": "https://vuejs.org/guide/essentials/forms.html#modifiers",
         "type": "article"
       }
     ]
@@ -563,11 +573,6 @@
         "title": "Binding Events",
         "url": "https://vuejs.org/guide/essentials/event-handling",
         "type": "article"
-      },
-      {
-        "title": "Vue.js Event Handling",
-        "url": "https://www.geeksforgeeks.org/vue-js-event-handling/",
-        "type": "article"
       }
     ]
   },
@@ -575,9 +580,14 @@
     "title": "Inline / Method Handlers",
     "description": "In Vue.js, **inline handlers** are defined directly in the template using expressions, making them suitable for simple tasks. For example, you might use an inline handler to increment a counter. **Method handlers**, on the other hand, are defined in the `methods` option and are better for more complex logic or when reusing functionality across multiple components. They improve code readability and maintainability.\n\nVisit the following resources to learn more:",
     "links": [
+      {
+        "title": "Inline Handlers",
+        "url": "https://vuejs.org/guide/essentials/event-handling#inline-handlers",
+        "type": "article"
+      },
       {
         "title": "Method Handlers",
-        "url": "https://v1.vuejs.org/guide/events.html",
+        "url": "https://vuejs.org/guide/essentials/event-handling#method-handlers",
         "type": "article"
       }
     ]
@@ -586,6 +596,11 @@
     "title": "Event Modifiers",
     "description": "In Vue.js, event modifiers are special postfixes that you can add to event handlers to control the behavior of events more easily. They help simplify common tasks such as stopping propagation, preventing default actions, and ensuring that the event is triggered only under certain conditions.\n\nVisit the following resources to learn more:",
     "links": [
+      {
+        "title": "Event Modifiers",
+        "url": "https://vuejs.org/guide/essentials/event-handling#event-modifiers",
+        "type": "article"
+      },
       {
         "title": "Event Modifiers in Vue.js",
         "url": "https://www.freecodecamp.org/news/how-event-handling-works-in-vue-3-guide-for-devs/",
@@ -598,8 +613,8 @@
     "description": "Input bindings are a way to bind user input to a component's data. This allows the component to react to user input and update its state accordingly. Input bindings are typically used with form elements such as text inputs, checkboxes, and select dropdowns.\n\nVisit the following resources to learn more:",
     "links": [
       {
-        "title": "Input Bindings",
-        "url": "https://vuejs.org/guide/essentials/forms",
+        "title": "Key Modifiers",
+        "url": "https://vuejs.org/guide/essentials/event-handling#key-modifiers",
         "type": "article"
       }
     ]
@@ -608,6 +623,11 @@
     "title": "Mouse Button Modifiers",
     "description": "Mouse button modifiers are a type of modifier that can be used with event handlers to specify which mouse button or buttons should trigger the event. These modifiers allow you to customize the behavior of event handlers, such as v-on:click, to respond to specific mouse button clicks.\n\nVisit the following resources to learn more:",
     "links": [
+      {
+        "title": "Mouse Button Modifiers",
+        "url": "https://vuejs.org/guide/essentials/event-handling#mouse-button-modifiers",
+        "type": "article"
+      },
       {
         "title": "Button Modifiers",
         "url": "https://medium.com/evolve-you/vue-3-keyboard-and-mouse-a4866d7d0e8",
diff --git a/public/roadmaps/cloudflare.png b/public/roadmaps/cloudflare.png
new file mode 100644
index 000000000..a84e712ab
Binary files /dev/null and b/public/roadmaps/cloudflare.png differ
diff --git a/public/roadmaps/cpp.png b/public/roadmaps/cpp.png
index fdfd14db5..af9c04bdf 100644
Binary files a/public/roadmaps/cpp.png and b/public/roadmaps/cpp.png differ
diff --git a/public/roadmaps/java.png b/public/roadmaps/java.png
index e33a49925..8144dc5d4 100644
Binary files a/public/roadmaps/java.png and b/public/roadmaps/java.png differ
diff --git a/readme.md b/readme.md
index 6eabe5c94..279027115 100644
--- a/readme.md
+++ b/readme.md
@@ -43,6 +43,7 @@ Here is the list of available roadmaps with more being actively worked upon.
 - [AI and Data Scientist Roadmap](https://roadmap.sh/ai-data-scientist)
 - [AI Engineer Roadmap](https://roadmap.sh/ai-engineer)
 - [AWS Roadmap](https://roadmap.sh/aws)
+- [Cloudflare Roadmap](https://roadmap.sh/cloudflare)
 - [Linux Roadmap](https://roadmap.sh/linux)
 - [Terraform Roadmap](https://roadmap.sh/terraform)
 - [Data Analyst Roadmap](https://roadmap.sh/data-analyst)
diff --git a/scripts/gemini-roadmap-content.ts b/scripts/gemini-roadmap-content.ts
new file mode 100644
index 000000000..13884982b
--- /dev/null
+++ b/scripts/gemini-roadmap-content.ts
@@ -0,0 +1,181 @@
+import fs from 'node:fs/promises';
+import path from 'node:path';
+import { fileURLToPath } from 'node:url';
+import type { Edge, Node } from 'reactflow';
+import matter from 'gray-matter';
+import type { RoadmapFrontmatter } from '../src/lib/roadmap';
+import { slugify } from '../src/lib/slugger';
+import { runPromisesInBatchSequentially } from '../src/lib/promise';
+
+import { createGoogleGenerativeAI } from '@ai-sdk/google';
+import { generateText } from 'ai';
+
+// ERROR: `__dirname` is not defined in ES module scope
+// https://iamwebwiz.medium.com/how-to-fix-dirname-is-not-defined-in-es-module-scope-34d94a86694d
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+
+// Usage: tsx ./scripts/editor-roadmap-content.ts <roadmapId>
+const GEMINI_API_KEY = process.env.GEMINI_API_KEY;
+console.log('GEMINI_API_KEY:', GEMINI_API_KEY);
+const ROADMAP_CONTENT_DIR = path.join(__dirname, '../src/data/roadmaps');
+const roadmapId = process.argv[2];
+
+const google = createGoogleGenerativeAI({
+  apiKey: process.env.GEMINI_API_KEY,
+});
+
+const allowedRoadmapIds = await fs.readdir(ROADMAP_CONTENT_DIR);
+if (!roadmapId) {
+  console.error('Roadmap Id is required');
+  process.exit(1);
+}
+
+if (!allowedRoadmapIds.includes(roadmapId)) {
+  console.error(`Invalid roadmap key ${roadmapId}`);
+  console.error(`Allowed keys are ${allowedRoadmapIds.join(', ')}`);
+  process.exit(1);
+}
+
+const roadmapFrontmatterDir = path.join(
+  ROADMAP_CONTENT_DIR,
+  roadmapId,
+  `${roadmapId}.md`,
+);
+const roadmapFrontmatterRaw = await fs.readFile(roadmapFrontmatterDir, 'utf-8');
+const { data } = matter(roadmapFrontmatterRaw);
+
+const roadmapFrontmatter = data as RoadmapFrontmatter;
+if (!roadmapFrontmatter) {
+  console.error('Invalid roadmap frontmatter');
+  process.exit(1);
+}
+
+if (roadmapFrontmatter.renderer !== 'editor') {
+  console.error('Only Editor Rendered Roadmaps are allowed');
+  process.exit(1);
+}
+
+const roadmapDir = path.join(
+  ROADMAP_CONTENT_DIR,
+  roadmapId,
+  `${roadmapId}.json`,
+);
+const roadmapContent = await fs.readFile(roadmapDir, 'utf-8');
+let { nodes, edges } = JSON.parse(roadmapContent) as {
+  nodes: Node[];
+  edges: Edge[];
+};
+const enrichedNodes = nodes
+  .filter(
+    (node) =>
+      node?.type &&
+      ['topic', 'subtopic'].includes(node.type) &&
+      node.data?.label,
+  )
+  .map((node) => {
+    // Because we only need the parent id and title for subtopics
+    if (node.type !== 'subtopic') {
+      return node;
+    }
+
+    const parentNodeId =
+      edges.find((edge) => edge.target === node.id)?.source || '';
+    const parentNode = nodes.find((n) => n.id === parentNodeId);
+
+    return {
+      ...node,
+      parentId: parentNodeId,
+      parentTitle: parentNode?.data?.label || '',
+    };
+  }) as (Node & { parentId?: string; parentTitle?: string })[];
+
+const roadmapContentDir = path.join(ROADMAP_CONTENT_DIR, roadmapId, 'content');
+const stats = await fs.stat(roadmapContentDir).catch(() => null);
+if (!stats || !stats.isDirectory()) {
+  await fs.mkdir(roadmapContentDir, { recursive: true });
+}
+
+function writeTopicContent(
+  roadmapTitle: string,
+  childTopic: string,
+  parentTopic?: string,
+) {
+  const updatedTitle = roadmapTitle.replace('Roadmap', '').trim().replace('Developer', '');
+  let prompt = `I will give you a topic and you need to write a brief introduction for that in "${roadmapTitle}". Your format should be as follows and be in strictly markdown format:
+
+# (Put a heading for the topic without adding parent "Subtopic in Topic" or "Topic in Roadmap" or "Subtopic under XYZ" etc.)
+
+(Briefly explain the topic in one paragraph using simple english. Don't start with explaining how important the topic is with regard to "${roadmapTitle}". Don't say something along the lines of "XYZ plays a crucial role in ${roadmapTitle}". Don't include anything saying "In the context of ${roadmapTitle}". Instead, start with a simple explanation of the topic itself. For example, if the topic is "React", you can start with "React is a JavaScript library for building user interfaces."".)
+`;
+
+  if (!parentTopic) {
+    prompt += `First topic is: ${childTopic}`;
+  } else {
+    prompt += `First topic is: "${parentTopic} > ${childTopic}"`;
+  }
+
+  return new Promise((resolve, reject) => {
+    generateText({
+      model: google('gemini-2.0-flash'),
+      prompt: prompt,
+      providerOptions: {
+      }
+    })
+      .then((response) => {
+        const article = response.text;
+
+        resolve(article);
+      })
+      .catch((err) => {
+        reject(err);
+      });
+  });
+}
+
+async function writeNodeContent(node: Node & { parentTitle?: string }) {
+  const nodeDirPattern = `${slugify(node.data.label)}@${node.id}.md`;
+  if (!roadmapContentFiles.includes(nodeDirPattern)) {
+    console.log(`Missing file for: ${nodeDirPattern}`);
+    return;
+  }
+
+  const nodeDir = path.join(roadmapContentDir, nodeDirPattern);
+  const nodeContent = await fs.readFile(nodeDir, 'utf-8');
+  const isFileEmpty = !nodeContent.replace(`# ${node.data.label}`, '').trim();
+  if (!isFileEmpty) {
+    console.log(`❌ Ignoring ${nodeDirPattern}. Not empty.`);
+    return;
+  }
+
+  const topic = node.data.label;
+  const parentTopic = node.parentTitle;
+
+  console.log(`⏳ Generating content for ${topic}...`);
+  let newContentFile = '';
+  if (GEMINI_API_KEY) {
+    newContentFile = (await writeTopicContent(
+      roadmapFrontmatter.title,
+      topic,
+      parentTopic,
+    )) as string;
+  } else {
+    newContentFile = `# ${topic}`;
+  }
+
+  await fs.writeFile(nodeDir, newContentFile, 'utf-8');
+  console.log(`✅ Content generated for ${topic}`);
+}
+
+let roadmapContentFiles = await fs.readdir(roadmapContentDir, {
+  recursive: true,
+});
+
+if (!GEMINI_API_KEY) {
+  console.log('----------------------------------------');
+  console.log('GEMINI_API_KEY not found. Skipping gemini api calls...');
+  console.log('----------------------------------------');
+}
+const promises = enrichedNodes.map((node) => () => writeNodeContent(node));
+await runPromisesInBatchSequentially(promises, 20);
+console.log('✅ All content generated');
diff --git a/src/api/ai-roadmap.ts b/src/api/ai-roadmap.ts
index 944b120ed..9a4227f71 100644
--- a/src/api/ai-roadmap.ts
+++ b/src/api/ai-roadmap.ts
@@ -18,3 +18,16 @@ export function aiRoadmapApi(context: APIContext) {
     },
   };
 }
+
+export interface AICourseDocument {
+  _id: string;
+  userId: string;
+  title: string;
+  slug?: string;
+  keyword: string;
+  difficulty: string;
+  data: string;
+  viewCount: number;
+  createdAt: Date;
+  updatedAt: Date;
+}
\ No newline at end of file
diff --git a/src/components/AccountSidebar.astro b/src/components/AccountSidebar.astro
index 9b609304e..bf1029f17 100644
--- a/src/components/AccountSidebar.astro
+++ b/src/components/AccountSidebar.astro
@@ -27,7 +27,7 @@ const sidebarLinks = [
     href: '/account/update-profile',
     title: 'Profile',
     id: 'profile',
-    isNew: true,
+    isNew: false,
     icon: {
       glyph: 'user',
       classes: 'h-4 w-4',
@@ -56,7 +56,7 @@ const sidebarLinks = [
   },
   {
     href: '/account/road-card',
-    title: 'Card',
+    title: 'Road Card',
     id: 'road-card',
     isNew: false,
     icon: {
@@ -64,6 +64,16 @@ const sidebarLinks = [
       classes: 'h-4 w-4',
     },
   },
+  {
+    href: '/account/billing',
+    title: 'Billing',
+    id: 'billing',
+    isNew: true,
+    icon: {
+      glyph: 'credit-card',
+      classes: 'h-4 w-4',
+    },
+  },
   {
     href: '/account/settings',
     title: 'Settings',
@@ -97,7 +107,7 @@ const sidebarLinks = [
         }`}
       >
         <AstroIcon icon={'users'} class={`h-4 w-4 mr-2`} />
-         Teams
+        Teams
       </a>
     </li>
     {
diff --git a/src/components/Activity/ProjectProgress.tsx b/src/components/Activity/ProjectProgress.tsx
index 6ac20de28..3e91c25f3 100644
--- a/src/components/Activity/ProjectProgress.tsx
+++ b/src/components/Activity/ProjectProgress.tsx
@@ -1,5 +1,4 @@
 import { getUser } from '../../lib/jwt';
-import { getPercentage } from '../../helper/number';
 import { ProjectProgressActions } from './ProjectProgressActions';
 import { cn } from '../../lib/classname';
 import type { ProjectStatusDocument } from '../Projects/ListProjectSolutions';
diff --git a/src/components/Activity/ResourceProgress.tsx b/src/components/Activity/ResourceProgress.tsx
index 28c88ec9f..00b38aba3 100644
--- a/src/components/Activity/ResourceProgress.tsx
+++ b/src/components/Activity/ResourceProgress.tsx
@@ -1,7 +1,7 @@
 import { getUser } from '../../lib/jwt';
-import { getPercentage } from '../../helper/number';
 import { ResourceProgressActions } from './ResourceProgressActions';
 import { cn } from '../../lib/classname';
+import { getPercentage } from '../../lib/number';
 
 type ResourceProgressType = {
   resourceType: 'roadmap' | 'best-practice';
diff --git a/src/components/AdvertiseForm.tsx b/src/components/AdvertiseForm.tsx
index 7cd6faa0a..36d132296 100644
--- a/src/components/AdvertiseForm.tsx
+++ b/src/components/AdvertiseForm.tsx
@@ -86,9 +86,6 @@ export function AdvertiseForm() {
 
     pageProgressMessage.set('Please wait');
 
-    // Placeholder function to send data
-    console.log('Form data:', formData);
-
     const { response, error } = await httpPost(
       `${import.meta.env.PUBLIC_API_URL}/v1-advertise`,
       formData,
diff --git a/src/components/Analytics/Clarity.astro b/src/components/Analytics/Clarity.astro
new file mode 100644
index 000000000..14d9247e3
--- /dev/null
+++ b/src/components/Analytics/Clarity.astro
@@ -0,0 +1,14 @@
+<script type='text/javascript'>
+  (function (c, l, a, r, i, t, y) {
+    c[a] =
+      c[a] ||
+      function () {
+        (c[a].q = c[a].q || []).push(arguments);
+      };
+    t = l.createElement(r);
+    t.async = 1;
+    t.src = 'https://www.clarity.ms/tag/' + i;
+    y = l.getElementsByTagName(r)[0];
+    y.parentNode.insertBefore(t, y);
+  })(window, document, 'clarity', 'script', 'qcw723i36o');
+</script>
diff --git a/src/components/Analytics/GoogleAd.astro b/src/components/Analytics/GoogleAd.astro
new file mode 100644
index 000000000..38c67af92
--- /dev/null
+++ b/src/components/Analytics/GoogleAd.astro
@@ -0,0 +1,114 @@
+---
+const page = Astro.url;
+---
+
+<script async src='https://securepubads.g.doubleclick.net/tag/js/gpt.js'
+></script>
+<script async>
+  const ignoredPages = [
+    'login',
+    'signup',
+    'roadmaps',
+    'best-practices',
+    'guides',
+    'videos',
+    'roadmaps',
+    'community',
+    'start-here',
+    'ai',
+    'ai-tutor',
+    'teams',
+    'about',
+    'account',
+    'projects',
+    'questions',
+    'guides',
+    'advertise',
+  ];
+
+  function sanitizeSettingValue(value) {
+    return (
+      String(value)
+        .trim()
+        // Remove characters forbidden at https://support.google.com/admanager/answer/10020177.
+        .replace(/'|\\|'|=|!|#|\*|~|;|\^|\(|\)|<|>|\[|\]|,|&/g, '')
+        // Extra spaces aren't forbidden, but rarely desired.
+        .replace(/\s+/, ' ')
+        // The + sign is also forbidden, but is being replaced with 'and' instead.
+        .replace('+', 'and')
+        // Maximum length of 40 for values.
+        .substring(0, 40)
+    );
+  }
+
+  const page = window.location.pathname;
+  const pageParts = page.split('/').filter(Boolean);
+
+  const isRoadmapPage =
+    pageParts.length === 1 && !ignoredPages.includes(pageParts[0]);
+  const isBestPracticesPage =
+    pageParts.length === 2 && pageParts[0] === 'best-practices';
+
+  let adSettings = {};
+  if (isRoadmapPage) {
+    adSettings = {
+      post_id: sanitizeSettingValue(pageParts[0]),
+      page_type: 'roadmap',
+      category: ['roadmap', sanitizeSettingValue(pageParts[0])],
+    };
+  } else if (isBestPracticesPage) {
+    adSettings = {
+      post_id: sanitizeSettingValue(pageParts[1]),
+      page_type: 'best-practice',
+      category: ['best-practice', sanitizeSettingValue(pageParts[1])],
+    };
+  }
+
+  // @ts-nocheck
+  window.googletag = window.googletag || { cmd: [] };
+  googletag.cmd.push(function () {
+    // Always use non-personalized ads
+    googletag.pubads().setPrivacySettings({
+      restrictDataProcessing: true,
+      nonPersonalizedAds: true,
+    });
+
+    // Define ad slot and enable services
+    googletag
+      .defineSlot(
+        '/22873384501/roadmap',
+        ['fluid'],
+        'div-gpt-ad-1742391132948-0',
+      )
+      .addService(googletag.pubads());
+
+    // Set targeting for all ad slots on the page.
+    for (let key in adSettings) {
+      if (adSettings.hasOwnProperty(key)) {
+        googletag.pubads().setTargeting(key, adSettings[key]);
+      }
+    }
+
+    googletag.pubads().enableSingleRequest();
+    googletag.enableServices();
+
+    googletag.pubads().addEventListener('slotRenderEnded', function (e) {
+      if (!e.isEmpty) {
+        return;
+      }
+
+      const slotId = e.slot.getSlotElementId();
+      if (!slotId) {
+        return;
+      }
+
+      // If empty, hide the ad slot after a small delay.
+      setTimeout(() => {
+        const adContainer = document.getElementById(slotId);
+        if (adContainer) {
+          adContainer.style.display = 'none';
+        }
+      }, 1800);
+    });
+  });
+</script>
diff --git a/src/components/Analytics/GoogleAdSlot.astro b/src/components/Analytics/GoogleAdSlot.astro
new file mode 100644
index 000000000..4556c571d
--- /dev/null
+++ b/src/components/Analytics/GoogleAdSlot.astro
@@ -0,0 +1,59 @@
+<div
+  id='div-gpt-ad-1742391132948-0'
+  class='gam-slot fixed bottom-4 right-4 z-50 h-[160px] w-[350px] cursor-pointer max-md:bottom-0 max-md:right-0 max-md:h-[106px] max-md:w-full'
+>
+  <script>
+    // @ts-nocheck
+    googletag.cmd.push(function () {
+      if (!googletag.pubads) {
+        console.log('googletag.pubads not found');
+        return;
+      }
+
+      // Configure all ad slots on the page to be expanded by default, but
+      // collapse slots that are unable to be filled with an ad.
+      googletag.pubads().collapseEmptyDivs();
+
+      // Set non-personalized ads
+      googletag.pubads().setPrivacySettings({
+        restrictDataProcessing: true,
+        nonPersonalizedAds: true,
+      });
+      googletag.display('div-gpt-ad-1742391132948-0');
+    });
+  </script>
+</div>
+
+<script>
+  const nativeAds: Window[] = [];
+
+  function sendSize(iframe: Window) {
+    const breakpoint = window.innerWidth < 768 ? 'sm' : 'lg';
+
+    iframe.postMessage(`breakpoint:${breakpoint}`, '*');
+  }
+
+  window.addEventListener(
+    'resize',
+    () => {
+      nativeAds.forEach((ad) => {
+        sendSize(ad);
+      });
+    },
+    {
+      passive: true,
+    },
+  );
+
+  window.addEventListener('message', function (e: MessageEvent<any>) {
+    if (e.data === 'initdfp') {
+      nativeAds.push(e.source as Window);
+      sendSize(e.source as Window);
+    } else if (e.data === 'close-ad') {
+      const ad = document.getElementById('div-gpt-ad-1742391132948-0');
+      if (ad) {
+        ad.remove();
+      }
+    }
+  });
+</script>
diff --git a/src/components/Analytics/RedditPixel.astro b/src/components/Analytics/RedditPixel.astro
new file mode 100644
index 000000000..a07ad33ca
--- /dev/null
+++ b/src/components/Analytics/RedditPixel.astro
@@ -0,0 +1,19 @@
+<script>
+  // @ts-nocheck
+  !(function (w, d) {
+    if (!w.rdt) {
+      var p = (w.rdt = function () {
+        p.sendEvent
+          ? p.sendEvent.apply(p, arguments)
+          : p.callQueue.push(arguments);
+      });
+      p.callQueue = [];
+      var t = d.createElement('script');
+      (t.src = 'https://www.redditstatic.com/ads/pixel.js'), (t.async = !0);
+      var s = d.getElementsByTagName('script')[0];
+      s.parentNode.insertBefore(t, s);
+    }
+  })(window, document);
+  rdt('init', 'a2_ghq8846qpphp');
+  rdt('track', 'PageVisit');
+</script>
diff --git a/src/components/Analytics/analytics.ts b/src/components/Analytics/analytics.ts
index 520eca8df..e283e4c56 100644
--- a/src/components/Analytics/analytics.ts
+++ b/src/components/Analytics/analytics.ts
@@ -6,6 +6,7 @@ declare global {
       category: string;
       label?: string;
       value?: string;
+      callback?: () => void;
     }) => void;
   }
 }
@@ -17,7 +18,7 @@ declare global {
  * @returns void
  */
 window.fireEvent = (props) => {
-  const { action, category, label, value } = props;
+  const { action, category, label, value, callback } = props;
   if (!window.gtag) {
     console.warn('Missing GTAG - Analytics disabled');
     return;
@@ -25,11 +26,16 @@ window.fireEvent = (props) => {
 
   if (import.meta.env.DEV) {
     console.log('Analytics event fired', props);
+    callback?.();
+    return;
   }
 
   window.gtag('event', action, {
     event_category: category,
     event_label: label,
     value: value,
+    ...(callback ? { event_callback: callback } : {}),
   });
 };
+
+export {};
diff --git a/src/components/AstroIcon.astro b/src/components/AstroIcon.astro
index 6448ffff1..eca2b065b 100644
--- a/src/components/AstroIcon.astro
+++ b/src/components/AstroIcon.astro
@@ -1,6 +1,5 @@
 ---
 import { parse } from 'node-html-parser';
-import type { Attributes } from 'node-html-parser/dist/nodes/html';
 
 export interface Props {
   icon: string;
@@ -15,7 +14,6 @@ async function getSVG(name: string) {
     eager: true,
   });
 
-
   if (!(filepath in files)) {
     throw new Error(`${filepath} not found`);
   }
diff --git a/src/components/AuthenticationFlow/CourseLoginPopup.tsx b/src/components/AuthenticationFlow/CourseLoginPopup.tsx
new file mode 100644
index 000000000..cc344ac82
--- /dev/null
+++ b/src/components/AuthenticationFlow/CourseLoginPopup.tsx
@@ -0,0 +1,143 @@
+import { useEffect, useState } from 'react';
+import { Modal } from '../Modal';
+import { GitHubButton } from './GitHubButton';
+import { GoogleButton } from './GoogleButton';
+import { LinkedInButton } from './LinkedInButton';
+import { EmailLoginForm } from './EmailLoginForm';
+import { EmailSignupForm } from './EmailSignupForm';
+
+type CourseLoginPopupProps = {
+  onClose: () => void;
+  checkoutAfterLogin?: boolean;
+};
+
+export const CHECKOUT_AFTER_LOGIN_KEY = 'checkoutAfterLogin';
+
+export function CourseLoginPopup(props: CourseLoginPopupProps) {
+  const { onClose: parentOnClose, checkoutAfterLogin = true } = props;
+
+  const [isDisabled, setIsDisabled] = useState(false);
+  const [isUsingEmail, setIsUsingEmail] = useState(false);
+
+  const [emailNature, setEmailNature] = useState<'login' | 'signup' | null>(
+    null,
+  );
+
+  function onClose() {
+    // if user didn't login and closed the popup, we remove the checkoutAfterLogin flag
+    // so that login from other buttons on course page will trigger purchase
+    localStorage.removeItem(CHECKOUT_AFTER_LOGIN_KEY);
+    parentOnClose();
+  }
+
+  useEffect(() => {
+    localStorage.setItem(
+      CHECKOUT_AFTER_LOGIN_KEY,
+      checkoutAfterLogin ? '1' : '0',
+    );
+  }, [checkoutAfterLogin]);
+
+  if (emailNature) {
+    const emailHeader = (
+      <div className="mb-7 text-center">
+        <p className="mb-3.5 pt-2 text-2xl font-semibold leading-5 text-slate-900">
+          {emailNature === 'login'
+            ? 'Login to your account'
+            : 'Create an account'}
+        </p>
+        <p className="mt-2 text-sm leading-4 text-slate-600">
+          Fill in the details below to continue
+        </p>
+      </div>
+    );
+
+    return (
+      <Modal onClose={onClose} bodyClassName="p-5 h-auto">
+        {emailHeader}
+        {emailNature === 'login' && (
+          <EmailLoginForm
+            isDisabled={isDisabled}
+            setIsDisabled={setIsDisabled}
+          />
+        )}
+        {emailNature === 'signup' && (
+          <EmailSignupForm
+            isDisabled={isDisabled}
+            setIsDisabled={setIsDisabled}
+          />
+        )}
+
+        <button
+          className="mt-2 w-full rounded-md border border-gray-400 py-2 text-center text-sm text-gray-600 hover:bg-gray-100"
+          onClick={() => setEmailNature(null)}
+        >
+          Back to Options
+        </button>
+      </Modal>
+    );
+  }
+
+  return (
+    <Modal onClose={onClose} bodyClassName="p-5 h-auto">
+      <div className="mb-7 text-center">
+        <p className="mb-3.5 pt-2 text-2xl font-semibold leading-5 text-slate-900">
+          Create or login to your account
+        </p>
+        <p className="mt-2 text-sm leading-4 text-slate-600">
+          Login or sign up for an account to start learning
+        </p>
+      </div>
+
+      <div className="flex w-full flex-col gap-2">
+        <GitHubButton
+          className="rounded-md border-gray-400 hover:bg-gray-100"
+          isDisabled={isDisabled}
+          setIsDisabled={setIsDisabled}
+        />
+        <GoogleButton
+          className="rounded-md border-gray-400 hover:bg-gray-100"
+          isDisabled={isDisabled}
+          setIsDisabled={setIsDisabled}
+        />
+        <LinkedInButton
+          className="rounded-md border-gray-400 hover:bg-gray-100"
+          isDisabled={isDisabled}
+          setIsDisabled={setIsDisabled}
+        />
+      </div>
+
+      <div className="flex w-full items-center gap-4 py-6 text-sm text-gray-600">
+        <div className="h-px w-full bg-gray-200" />
+        OR
+        <div className="h-px w-full bg-gray-200" />
+      </div>
+
+      <div className="flex flex-row gap-2">
+        {!isUsingEmail && (
+          <button
+            className="flex-grow rounded-md border border-gray-400 px-4 py-2 text-sm text-gray-600 hover:bg-gray-100"
+            onClick={() => setIsUsingEmail(true)}
+          >
+            Use your email address
+          </button>
+        )}
+        {isUsingEmail && (
+          <>
+            <button
+              className="flex-grow rounded-md border border-gray-400 px-4 py-2 text-sm text-gray-600 hover:bg-gray-100"
+              onClick={() => setEmailNature('login')}
+            >
+              Already have an account
+            </button>
+            <button
+              className="flex-grow rounded-md border border-gray-400 px-4 py-2 text-sm text-gray-600 hover:bg-gray-100"
+              onClick={() => setEmailNature('signup')}
+            >
+              Create an account
+            </button>
+          </>
+        )}
+      </div>
+    </Modal>
+  );
+}
diff --git a/src/components/AuthenticationFlow/EmailLoginForm.tsx b/src/components/AuthenticationFlow/EmailLoginForm.tsx
index ca99e837b..dd3c3c124 100644
--- a/src/components/AuthenticationFlow/EmailLoginForm.tsx
+++ b/src/components/AuthenticationFlow/EmailLoginForm.tsx
@@ -2,7 +2,7 @@ import Cookies from 'js-cookie';
 import type { FormEvent } from 'react';
 import { useId, useState } from 'react';
 import { httpPost } from '../../lib/http';
-import { TOKEN_COOKIE_NAME, setAuthToken } from '../../lib/jwt';
+import { FIRST_LOGIN_PARAM, setAuthToken } from '../../lib/jwt';
 
 type EmailLoginFormProps = {
   isDisabled?: boolean;
@@ -24,19 +24,22 @@ export function EmailLoginForm(props: EmailLoginFormProps) {
     setIsDisabled?.(true);
     setError('');
 
-    const { response, error } = await httpPost<{ token: string }>(
-      `${import.meta.env.PUBLIC_API_URL}/v1-login`,
-      {
-        email,
-        password,
-      },
-    );
+    const { response, error } = await httpPost<{
+      token: string;
+      isNewUser: boolean;
+    }>(`${import.meta.env.PUBLIC_API_URL}/v1-login`, {
+      email,
+      password,
+    });
 
     // Log the user in and reload the page
     if (response?.token) {
       setAuthToken(response.token);
-      window.location.reload();
 
+      const currentLocation = window.location.href;
+      const url = new URL(currentLocation, window.location.origin);
+      url.searchParams.set(FIRST_LOGIN_PARAM, response?.isNewUser ? '1' : '0');
+      window.location.href = url.toString();
       return;
     }
 
diff --git a/src/components/AuthenticationFlow/GitHubButton.tsx b/src/components/AuthenticationFlow/GitHubButton.tsx
index b0001699a..adba8132f 100644
--- a/src/components/AuthenticationFlow/GitHubButton.tsx
+++ b/src/components/AuthenticationFlow/GitHubButton.tsx
@@ -1,21 +1,27 @@
 import { useEffect, useState } from 'react';
 import { GitHubIcon } from '../ReactIcons/GitHubIcon.tsx';
-import Cookies from 'js-cookie';
-import { TOKEN_COOKIE_NAME, setAuthToken } from '../../lib/jwt';
+import {
+  FIRST_LOGIN_PARAM,
+  COURSE_PURCHASE_PARAM,
+  setAuthToken,
+} from '../../lib/jwt';
+import { cn } from '../../lib/classname.ts';
 import { httpGet } from '../../lib/http';
 import { Spinner } from '../ReactIcons/Spinner.tsx';
+import { CHECKOUT_AFTER_LOGIN_KEY } from './CourseLoginPopup.tsx';
 import { triggerUtmRegistration } from '../../lib/browser.ts';
 
 type GitHubButtonProps = {
   isDisabled?: boolean;
   setIsDisabled?: (isDisabled: boolean) => void;
+  className?: string;
 };
 
 const GITHUB_REDIRECT_AT = 'githubRedirectAt';
 const GITHUB_LAST_PAGE = 'githubLastPage';
 
 export function GitHubButton(props: GitHubButtonProps) {
-  const { isDisabled, setIsDisabled } = props;
+  const { isDisabled, setIsDisabled, className } = props;
 
   const [isLoading, setIsLoading] = useState(false);
   const [error, setError] = useState('');
@@ -32,7 +38,7 @@ export function GitHubButton(props: GitHubButtonProps) {
 
     setIsLoading(true);
     setIsDisabled?.(true);
-    httpGet<{ token: string }>(
+    httpGet<{ token: string; isNewUser: boolean }>(
       `${import.meta.env.PUBLIC_API_URL}/v1-github-callback${
         window.location.search
       }`,
@@ -49,7 +55,7 @@ export function GitHubButton(props: GitHubButtonProps) {
 
         triggerUtmRegistration();
 
-        let redirectUrl = '/';
+        let redirectUrl = new URL('/', window.location.origin);
         const gitHubRedirectAt = localStorage.getItem(GITHUB_REDIRECT_AT);
         const lastPageBeforeGithub = localStorage.getItem(GITHUB_LAST_PAGE);
 
@@ -61,20 +67,37 @@ export function GitHubButton(props: GitHubButtonProps) {
           const timeSinceRedirect = now - socialRedirectAtTime;
 
           if (timeSinceRedirect < 30 * 1000) {
-            redirectUrl = lastPageBeforeGithub;
+            redirectUrl = new URL(lastPageBeforeGithub, window.location.origin);
           }
         }
 
         const authRedirectUrl = localStorage.getItem('authRedirect');
         if (authRedirectUrl) {
           localStorage.removeItem('authRedirect');
-          redirectUrl = authRedirectUrl;
+          redirectUrl = new URL(authRedirectUrl, window.location.origin);
         }
 
         localStorage.removeItem(GITHUB_REDIRECT_AT);
         localStorage.removeItem(GITHUB_LAST_PAGE);
         setAuthToken(response.token);
-        window.location.href = redirectUrl;
+
+        redirectUrl.searchParams.set(
+          FIRST_LOGIN_PARAM,
+          response?.isNewUser ? '1' : '0',
+        );
+
+        const shouldTriggerPurchase =
+          localStorage.getItem(CHECKOUT_AFTER_LOGIN_KEY) !== '0';
+
+        if (
+          redirectUrl.pathname.includes('/courses/sql') &&
+          shouldTriggerPurchase
+        ) {
+          redirectUrl.searchParams.set(COURSE_PURCHASE_PARAM, '1');
+          localStorage.removeItem(CHECKOUT_AFTER_LOGIN_KEY);
+        }
+
+        window.location.href = redirectUrl.toString();
       })
       .catch((err) => {
         setError('Something went wrong. Please try again later.');
@@ -120,7 +143,10 @@ export function GitHubButton(props: GitHubButtonProps) {
   return (
     <>
       <button
-        className="inline-flex h-10 w-full items-center justify-center gap-2 rounded border border-slate-300 bg-white p-2 text-sm font-medium text-black outline-none focus:ring-2 focus:ring-[#333] focus:ring-offset-1 disabled:cursor-not-allowed disabled:opacity-60"
+        className={cn(
+          'inline-flex h-10 w-full items-center justify-center gap-2 rounded border border-slate-300 bg-white p-2 text-sm font-medium text-black outline-none hover:border-gray-400 hover:bg-gray-50 focus:ring-2 focus:ring-[#333] focus:ring-offset-1 disabled:cursor-not-allowed disabled:opacity-60',
+          className,
+        )}
         disabled={isLoading || isDisabled}
         onClick={handleClick}
       >
diff --git a/src/components/AuthenticationFlow/GoogleButton.tsx b/src/components/AuthenticationFlow/GoogleButton.tsx
index 950c2237d..8655f68dd 100644
--- a/src/components/AuthenticationFlow/GoogleButton.tsx
+++ b/src/components/AuthenticationFlow/GoogleButton.tsx
@@ -1,24 +1,32 @@
 import { useEffect, useState } from 'react';
 import Cookies from 'js-cookie';
-import { TOKEN_COOKIE_NAME, setAuthToken } from '../../lib/jwt';
+import {
+  FIRST_LOGIN_PARAM,
+  TOKEN_COOKIE_NAME,
+  setAuthToken,
+} from '../../lib/jwt';
 import { httpGet } from '../../lib/http';
-import { Spinner } from '../ReactIcons/Spinner.tsx';
+import { COURSE_PURCHASE_PARAM } from '../../lib/jwt';
 import { GoogleIcon } from '../ReactIcons/GoogleIcon.tsx';
+import { Spinner } from '../ReactIcons/Spinner.tsx';
+import { CHECKOUT_AFTER_LOGIN_KEY } from './CourseLoginPopup.tsx';
 import {
   getStoredUtmParams,
   triggerUtmRegistration,
 } from '../../lib/browser.ts';
+import { cn } from '../../lib/classname.ts';
 
 type GoogleButtonProps = {
   isDisabled?: boolean;
   setIsDisabled?: (isDisabled: boolean) => void;
+  className?: string;
 };
 
 const GOOGLE_REDIRECT_AT = 'googleRedirectAt';
 const GOOGLE_LAST_PAGE = 'googleLastPage';
 
 export function GoogleButton(props: GoogleButtonProps) {
-  const { isDisabled, setIsDisabled } = props;
+  const { isDisabled, setIsDisabled, className } = props;
 
   const [isLoading, setIsLoading] = useState(false);
   const [error, setError] = useState('');
@@ -35,14 +43,12 @@ export function GoogleButton(props: GoogleButtonProps) {
 
     setIsLoading(true);
     setIsDisabled?.(true);
-    httpGet<{ token: string }>(
+    httpGet<{ token: string; isNewUser: boolean }>(
       `${import.meta.env.PUBLIC_API_URL}/v1-google-callback${
         window.location.search
       }`,
     )
       .then(({ response, error }) => {
-        const utmParams = getStoredUtmParams();
-
         if (!response?.token) {
           setError(error?.message || 'Something went wrong.');
           setIsLoading(false);
@@ -53,7 +59,7 @@ export function GoogleButton(props: GoogleButtonProps) {
 
         triggerUtmRegistration();
 
-        let redirectUrl = '/';
+        let redirectUrl = new URL('/', window.location.origin);
         const googleRedirectAt = localStorage.getItem(GOOGLE_REDIRECT_AT);
         const lastPageBeforeGoogle = localStorage.getItem(GOOGLE_LAST_PAGE);
 
@@ -65,20 +71,37 @@ export function GoogleButton(props: GoogleButtonProps) {
           const timeSinceRedirect = now - socialRedirectAtTime;
 
           if (timeSinceRedirect < 30 * 1000) {
-            redirectUrl = lastPageBeforeGoogle;
+            redirectUrl = new URL(lastPageBeforeGoogle, window.location.origin);
           }
         }
 
         const authRedirectUrl = localStorage.getItem('authRedirect');
         if (authRedirectUrl) {
           localStorage.removeItem('authRedirect');
-          redirectUrl = authRedirectUrl;
+          redirectUrl = new URL(authRedirectUrl, window.location.origin);
+        }
+
+        redirectUrl.searchParams.set(
+          FIRST_LOGIN_PARAM,
+          response?.isNewUser ? '1' : '0',
+        );
+
+        const shouldTriggerPurchase =
+          localStorage.getItem(CHECKOUT_AFTER_LOGIN_KEY) !== '0';
+        if (
+          redirectUrl.pathname.includes('/courses/sql') &&
+          shouldTriggerPurchase
+        ) {
+          redirectUrl.searchParams.set(COURSE_PURCHASE_PARAM, '1');
+
+          localStorage.removeItem(CHECKOUT_AFTER_LOGIN_KEY);
         }
 
         localStorage.removeItem(GOOGLE_REDIRECT_AT);
         localStorage.removeItem(GOOGLE_LAST_PAGE);
         setAuthToken(response.token);
-        window.location.href = redirectUrl;
+
+        window.location.href = redirectUrl.toString();
       })
       .catch((err) => {
         setError('Something went wrong. Please try again later.');
@@ -130,7 +153,10 @@ export function GoogleButton(props: GoogleButtonProps) {
   return (
     <>
       <button
-        className="inline-flex h-10 w-full items-center justify-center gap-2 rounded border border-slate-300 bg-white p-2 text-sm font-medium text-black outline-none focus:ring-2 focus:ring-[#333] focus:ring-offset-1 disabled:cursor-not-allowed disabled:opacity-60"
+        className={cn(
+          'inline-flex h-10 w-full items-center justify-center gap-2 rounded border border-slate-300 bg-white p-2 text-sm font-medium text-black outline-none hover:border-gray-400 hover:bg-gray-50 focus:ring-2 focus:ring-[#333] focus:ring-offset-1 disabled:cursor-not-allowed disabled:opacity-60',
+          className,
+        )}
         disabled={isLoading || isDisabled}
         onClick={handleClick}
       >
diff --git a/src/components/AuthenticationFlow/LinkedInButton.tsx b/src/components/AuthenticationFlow/LinkedInButton.tsx
index 81924a068..6447f3e7d 100644
--- a/src/components/AuthenticationFlow/LinkedInButton.tsx
+++ b/src/components/AuthenticationFlow/LinkedInButton.tsx
@@ -1,21 +1,29 @@
 import { useEffect, useState } from 'react';
 import Cookies from 'js-cookie';
-import { TOKEN_COOKIE_NAME, setAuthToken } from '../../lib/jwt';
+import {
+  FIRST_LOGIN_PARAM,
+  COURSE_PURCHASE_PARAM,
+  TOKEN_COOKIE_NAME,
+  setAuthToken,
+} from '../../lib/jwt';
+import { cn } from '../../lib/classname.ts';
 import { httpGet } from '../../lib/http';
-import { Spinner } from '../ReactIcons/Spinner.tsx';
 import { LinkedInIcon } from '../ReactIcons/LinkedInIcon.tsx';
+import { Spinner } from '../ReactIcons/Spinner.tsx';
+import { CHECKOUT_AFTER_LOGIN_KEY } from './CourseLoginPopup.tsx';
 import { triggerUtmRegistration } from '../../lib/browser.ts';
 
 type LinkedInButtonProps = {
   isDisabled?: boolean;
   setIsDisabled?: (isDisabled: boolean) => void;
+  className?: string;
 };
 
 const LINKEDIN_REDIRECT_AT = 'linkedInRedirectAt';
 const LINKEDIN_LAST_PAGE = 'linkedInLastPage';
 
 export function LinkedInButton(props: LinkedInButtonProps) {
-  const { isDisabled, setIsDisabled } = props;
+  const { isDisabled, setIsDisabled, className } = props;
 
   const [isLoading, setIsLoading] = useState(false);
   const [error, setError] = useState('');
@@ -32,7 +40,7 @@ export function LinkedInButton(props: LinkedInButtonProps) {
 
     setIsLoading(true);
     setIsDisabled?.(true);
-    httpGet<{ token: string }>(
+    httpGet<{ token: string; isNewUser: boolean }>(
       `${import.meta.env.PUBLIC_API_URL}/v1-linkedin-callback${
         window.location.search
       }`,
@@ -48,7 +56,7 @@ export function LinkedInButton(props: LinkedInButtonProps) {
 
         triggerUtmRegistration();
 
-        let redirectUrl = '/';
+        let redirectUrl = new URL('/', window.location.origin);
         const linkedInRedirectAt = localStorage.getItem(LINKEDIN_REDIRECT_AT);
         const lastPageBeforeLinkedIn = localStorage.getItem(LINKEDIN_LAST_PAGE);
 
@@ -60,20 +68,39 @@ export function LinkedInButton(props: LinkedInButtonProps) {
           const timeSinceRedirect = now - socialRedirectAtTime;
 
           if (timeSinceRedirect < 30 * 1000) {
-            redirectUrl = lastPageBeforeLinkedIn;
+            redirectUrl = new URL(
+              lastPageBeforeLinkedIn,
+              window.location.origin,
+            );
           }
         }
 
         const authRedirectUrl = localStorage.getItem('authRedirect');
         if (authRedirectUrl) {
           localStorage.removeItem('authRedirect');
-          redirectUrl = authRedirectUrl;
+          redirectUrl = new URL(authRedirectUrl, window.location.origin);
+        }
+
+        redirectUrl.searchParams.set(
+          FIRST_LOGIN_PARAM,
+          response?.isNewUser ? '1' : '0',
+        );
+
+        const shouldTriggerPurchase =
+          localStorage.getItem(CHECKOUT_AFTER_LOGIN_KEY) !== '0';
+        if (
+          redirectUrl.pathname.includes('/courses/sql') &&
+          shouldTriggerPurchase
+        ) {
+          redirectUrl.searchParams.set(COURSE_PURCHASE_PARAM, '1');
+          localStorage.removeItem(CHECKOUT_AFTER_LOGIN_KEY);
         }
 
         localStorage.removeItem(LINKEDIN_REDIRECT_AT);
         localStorage.removeItem(LINKEDIN_LAST_PAGE);
         setAuthToken(response.token);
-        window.location.href = redirectUrl;
+
+        window.location.href = redirectUrl.toString();
       })
       .catch((err) => {
         setError('Something went wrong. Please try again later.');
@@ -125,14 +152,17 @@ export function LinkedInButton(props: LinkedInButtonProps) {
   return (
     <>
       <button
-        className="inline-flex h-10 w-full items-center justify-center gap-2 rounded border border-slate-300 bg-white p-2 text-sm font-medium text-black outline-none focus:ring-2 focus:ring-[#333] focus:ring-offset-1 disabled:cursor-not-allowed disabled:opacity-60"
+        className={cn(
+          'inline-flex h-10 w-full items-center justify-center gap-2 rounded border border-slate-300 bg-white p-2 text-sm font-medium text-black outline-none hover:border-gray-400 focus:ring-2 focus:ring-[#333] focus:ring-offset-1 disabled:cursor-not-allowed disabled:opacity-60',
+          className,
+        )}
         disabled={isLoading || isDisabled}
         onClick={handleClick}
       >
         {isLoading ? (
           <Spinner className={'h-[18px] w-[18px]'} isDualRing={false} />
         ) : (
-          <LinkedInIcon className={'h-[18px] w-[18px]'} />
+          <LinkedInIcon className={'h-[18px] w-[18px] text-blue-700'} />
         )}
         Continue with LinkedIn
       </button>
diff --git a/src/components/AuthenticationFlow/LoginPopup.astro b/src/components/AuthenticationFlow/LoginPopup.astro
index 8340ef3b4..04e19360e 100644
--- a/src/components/AuthenticationFlow/LoginPopup.astro
+++ b/src/components/AuthenticationFlow/LoginPopup.astro
@@ -7,7 +7,7 @@ import { AuthenticationForm } from './AuthenticationForm';
 <Popup id='login-popup' title='' subtitle=''>
   <div class='mb-7 text-center'>
     <p class='mb-3 text-2xl font-semibold leading-5 text-slate-900'>
-      Login to your account
+      Login or Signup
     </p>
     <p class='mt-2 text-sm leading-4 text-slate-600'>
       You must be logged in to perform this action.
diff --git a/src/components/AuthenticationFlow/TriggerVerifyAccount.tsx b/src/components/AuthenticationFlow/TriggerVerifyAccount.tsx
index 0978e38d1..b97fb99e5 100644
--- a/src/components/AuthenticationFlow/TriggerVerifyAccount.tsx
+++ b/src/components/AuthenticationFlow/TriggerVerifyAccount.tsx
@@ -1,7 +1,11 @@
 import { useEffect, useState } from 'react';
 import Cookies from 'js-cookie';
 import { httpPost } from '../../lib/http';
-import { TOKEN_COOKIE_NAME, setAuthToken } from '../../lib/jwt';
+import {
+  FIRST_LOGIN_PARAM,
+  TOKEN_COOKIE_NAME,
+  setAuthToken,
+} from '../../lib/jwt';
 import { Spinner } from '../ReactIcons/Spinner';
 import { ErrorIcon2 } from '../ReactIcons/ErrorIcon2';
 import { triggerUtmRegistration } from '../../lib/browser.ts';
@@ -13,7 +17,7 @@ export function TriggerVerifyAccount() {
   const triggerVerify = (code: string) => {
     setIsLoading(true);
 
-    httpPost<{ token: string }>(
+    httpPost<{ token: string; isNewUser: boolean }>(
       `${import.meta.env.PUBLIC_API_URL}/v1-verify-account`,
       {
         code,
@@ -30,7 +34,13 @@ export function TriggerVerifyAccount() {
         triggerUtmRegistration();
 
         setAuthToken(response.token);
-        window.location.href = '/';
+
+        const url = new URL('/', window.location.origin);
+        url.searchParams.set(
+          FIRST_LOGIN_PARAM,
+          response?.isNewUser ? '1' : '0',
+        );
+        window.location.href = url.toString();
       })
       .catch((err) => {
         setIsLoading(false);
diff --git a/src/components/Billing/BillingPage.tsx b/src/components/Billing/BillingPage.tsx
new file mode 100644
index 000000000..92748a844
--- /dev/null
+++ b/src/components/Billing/BillingPage.tsx
@@ -0,0 +1,226 @@
+import { useEffect, useState } from 'react';
+import { pageProgressMessage } from '../../stores/page';
+import { useToast } from '../../hooks/use-toast';
+import { useMutation, useQuery } from '@tanstack/react-query';
+import {
+  billingDetailsOptions,
+  USER_SUBSCRIPTION_PLAN_PRICES,
+} from '../../queries/billing';
+import { queryClient } from '../../stores/query-client';
+import { httpPost } from '../../lib/query-http';
+import { UpgradeAccountModal } from './UpgradeAccountModal';
+import { getUrlParams } from '../../lib/browser';
+import { VerifyUpgrade } from './VerifyUpgrade';
+import { EmptyBillingScreen } from './EmptyBillingScreen';
+import {
+  Calendar,
+  RefreshCw,
+  Loader2,
+  CreditCard,
+  ArrowRightLeft,
+  CircleX,
+} from 'lucide-react';
+import { BillingWarning } from './BillingWarning';
+
+export type CreateCustomerPortalBody = {};
+
+export type CreateCustomerPortalResponse = {
+  url: string;
+};
+
+export function BillingPage() {
+  const toast = useToast();
+
+  const [showUpgradeModal, setShowUpgradeModal] = useState(false);
+  const [showVerifyUpgradeModal, setShowVerifyUpgradeModal] = useState(false);
+
+  const { data: billingDetails, isPending: isLoadingBillingDetails } = useQuery(
+    billingDetailsOptions(),
+    queryClient,
+  );
+
+  const isCanceled =
+    billingDetails?.status === 'canceled' || billingDetails?.cancelAtPeriodEnd;
+  const isPastDue = billingDetails?.status === 'past_due';
+
+  const {
+    mutate: createCustomerPortal,
+    isSuccess: isCreatingCustomerPortalSuccess,
+    isPending: isCreatingCustomerPortal,
+  } = useMutation(
+    {
+      mutationFn: (body: CreateCustomerPortalBody) => {
+        return httpPost<CreateCustomerPortalResponse>(
+          '/v1-create-customer-portal',
+          body,
+        );
+      },
+      onSuccess: (data) => {
+        window.location.href = data.url;
+      },
+      onError: (error) => {
+        console.error(error);
+        toast.error(error?.message || 'Failed to Create Customer Portal');
+      },
+    },
+    queryClient,
+  );
+
+  useEffect(() => {
+    if (isLoadingBillingDetails) {
+      return;
+    }
+
+    pageProgressMessage.set('');
+    const shouldVerifyUpgrade = getUrlParams()?.s === '1';
+    if (shouldVerifyUpgrade) {
+      setShowVerifyUpgradeModal(true);
+    }
+  }, [isLoadingBillingDetails]);
+
+  if (isLoadingBillingDetails || !billingDetails) {
+    return null;
+  }
+
+  const selectedPlanDetails = USER_SUBSCRIPTION_PLAN_PRICES.find(
+    (plan) => plan.priceId === billingDetails?.priceId,
+  );
+  const priceDetails = selectedPlanDetails;
+
+  const formattedNextBillDate = new Date(
+    billingDetails?.currentPeriodEnd || '',
+  ).toLocaleDateString('en-US', {
+    year: 'numeric',
+    month: 'long',
+    day: 'numeric',
+  });
+
+  return (
+    <>
+      {showUpgradeModal && (
+        <UpgradeAccountModal
+          onClose={() => {
+            setShowUpgradeModal(false);
+          }}
+          success="/account/billing?s=1"
+          cancel="/account/billing"
+        />
+      )}
+
+      {showVerifyUpgradeModal && <VerifyUpgrade />}
+
+      {billingDetails?.status === 'none' && !isLoadingBillingDetails && (
+        <EmptyBillingScreen onUpgrade={() => setShowUpgradeModal(true)} />
+      )}
+
+      {billingDetails?.status !== 'none' &&
+        !isLoadingBillingDetails &&
+        priceDetails && (
+          <div className="mt-1">
+            {isCanceled && (
+              <BillingWarning
+                icon={CircleX}
+                message="Your subscription has been canceled."
+                buttonText="Reactivate?"
+                onButtonClick={() => {
+                  createCustomerPortal({});
+                }}
+                isLoading={
+                  isCreatingCustomerPortal || isCreatingCustomerPortalSuccess
+                }
+              />
+            )}
+            {isPastDue && (
+              <BillingWarning
+                message="We were not able to charge your card."
+                buttonText="Update payment information."
+                onButtonClick={() => {
+                  createCustomerPortal({});
+                }}
+                isLoading={
+                  isCreatingCustomerPortal || isCreatingCustomerPortalSuccess
+                }
+              />
+            )}
+
+            <h2 className="mb-2 text-xl font-semibold text-black">
+              Current Subscription
+            </h2>
+
+            <p className="text-sm text-gray-500">
+              Thank you for being a pro member. Your plan details are below.
+            </p>
+
+            <div className="mt-8 flex flex-col gap-6 sm:flex-row sm:items-center sm:justify-between">
+              <div className="flex items-center gap-4">
+                <div className="flex h-12 w-12 items-center justify-center rounded-full bg-gray-100">
+                  <RefreshCw className="size-5 text-gray-600" />
+                </div>
+                <div>
+                  <span className="text-xs uppercase tracking-wider text-gray-400">
+                    Payment
+                  </span>
+                  <h3 className="flex items-baseline text-lg font-semibold text-black">
+                    ${priceDetails.amount}
+                    <span className="ml-1 text-sm font-normal text-gray-500">
+                      / {priceDetails.interval}
+                    </span>
+                  </h3>
+                </div>
+              </div>
+            </div>
+
+            <div className="mt-6 border-t border-gray-100 pt-6">
+              <div className="flex items-start gap-4">
+                <div className="flex h-12 w-12 items-center justify-center rounded-full bg-gray-100">
+                  <Calendar className="size-5 text-gray-600" />
+                </div>
+                <div>
+                  <span className="text-xs uppercase tracking-wider text-gray-400">
+                    {billingDetails?.cancelAtPeriodEnd
+                      ? 'Expires On'
+                      : 'Renews On'}
+                  </span>
+                  <h3 className="text-lg font-semibold text-black">
+                    {formattedNextBillDate}
+                  </h3>
+                </div>
+              </div>
+
+              <div className="mt-8 flex gap-3 max-sm:flex-col">
+                {!isCanceled && (
+                  <button
+                    className="inline-flex items-center justify-center rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 shadow-sm transition-colors hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-black focus:ring-offset-2 max-sm:flex-grow"
+                    onClick={() => {
+                      setShowUpgradeModal(true);
+                    }}
+                  >
+                    <ArrowRightLeft className="mr-2 h-4 w-4" />
+                    Switch Plan
+                  </button>
+                )}
+
+                <button
+                  className="inline-flex items-center justify-center rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 shadow-sm transition-colors hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-black focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"
+                  onClick={() => {
+                    createCustomerPortal({});
+                  }}
+                  disabled={
+                    isCreatingCustomerPortal || isCreatingCustomerPortalSuccess
+                  }
+                >
+                  {isCreatingCustomerPortal ||
+                  isCreatingCustomerPortalSuccess ? (
+                    <Loader2 className="mr-2 h-4 w-4 animate-spin" />
+                  ) : (
+                    <CreditCard className="mr-2 h-4 w-4" />
+                  )}
+                  Manage Subscription
+                </button>
+              </div>
+            </div>
+          </div>
+        )}
+    </>
+  );
+}
diff --git a/src/components/Billing/BillingWarning.tsx b/src/components/Billing/BillingWarning.tsx
new file mode 100644
index 000000000..f71cce994
--- /dev/null
+++ b/src/components/Billing/BillingWarning.tsx
@@ -0,0 +1,39 @@
+import { AlertTriangle, type LucideIcon } from 'lucide-react';
+
+export type BillingWarningProps = {
+  icon?: LucideIcon;
+  message: string;
+  onButtonClick?: () => void;
+  buttonText?: string;
+  isLoading?: boolean;
+};
+
+export function BillingWarning(props: BillingWarningProps) {
+  const {
+    message,
+    onButtonClick,
+    buttonText,
+    isLoading,
+    icon: Icon = AlertTriangle,
+  } = props;
+
+  return (
+    <div className="mb-6 flex items-center gap-2 rounded-lg border border-red-300 bg-red-50 p-4 text-sm text-red-600">
+      <Icon className="h-5 w-5" />
+      <span>
+        {message}
+        {buttonText && (
+          <button
+            disabled={isLoading}
+            onClick={() => {
+              onButtonClick?.();
+            }}
+            className="font-semibold underline underline-offset-4 disabled:cursor-not-allowed disabled:opacity-50 ml-0.5"
+          >
+            {buttonText}
+          </button>
+        )}
+      </span>
+    </div>
+  );
+}
diff --git a/src/components/Billing/CheckSubscriptionVerification.tsx b/src/components/Billing/CheckSubscriptionVerification.tsx
new file mode 100644
index 000000000..b5266546e
--- /dev/null
+++ b/src/components/Billing/CheckSubscriptionVerification.tsx
@@ -0,0 +1,22 @@
+import { useEffect, useState } from 'react';
+import { getUrlParams } from '../../lib/browser';
+import { VerifyUpgrade } from "./VerifyUpgrade";
+
+export function CheckSubscriptionVerification() {
+  const [shouldVerifyUpgrade, setShouldVerifyUpgrade] = useState(false);
+
+  useEffect(() => {
+    const params = getUrlParams();
+    if (params.s !== '1') {
+      return;
+    }
+
+    setShouldVerifyUpgrade(true);
+  }, []);
+
+  if (!shouldVerifyUpgrade) {
+    return null;
+  }
+
+  return <VerifyUpgrade />;
+}
diff --git a/src/components/Billing/EmptyBillingScreen.tsx b/src/components/Billing/EmptyBillingScreen.tsx
new file mode 100644
index 000000000..991a4cb9d
--- /dev/null
+++ b/src/components/Billing/EmptyBillingScreen.tsx
@@ -0,0 +1,68 @@
+import {
+  CreditCard,
+  Ellipsis,
+  HeartHandshake,
+  MessageCircleIcon,
+  SparklesIcon,
+  Zap,
+} from 'lucide-react';
+
+type EmptyBillingScreenProps = {
+  onUpgrade: () => void;
+};
+
+const perks = [
+  {
+    icon: Zap,
+    text: 'Unlimited AI course generations',
+  },
+  {
+    icon: MessageCircleIcon,
+    text: 'Unlimited AI Chat feature usage',
+  },
+  {
+    icon: SparklesIcon,
+    text: 'Early access to new features',
+  },
+  {
+    icon: HeartHandshake,
+    text: 'Support the development of platform',
+  },
+  {
+    icon: Ellipsis,
+    text: 'more perks coming soon!',
+  },
+];
+
+export function EmptyBillingScreen(props: EmptyBillingScreenProps) {
+  const { onUpgrade } = props;
+
+  return (
+    <div className="mt-12 flex h-full w-full flex-col items-center">
+      <CreditCard className="mb-3 h-12 w-12 text-gray-300" />
+      <h3 className="mb-3 text-xl font-semibold text-black">
+        No Active Subscription
+      </h3>
+
+      <p className="text-balance text-gray-700">
+        Unlock pro benefits by upgrading to a subscription
+      </p>
+
+      <div className="my-8 flex flex-col gap-2">
+        {perks.map((perk) => (
+          <p className="textsm flex items-center text-gray-600" key={perk.text}>
+            <perk.icon className="mr-2 h-4 w-4 text-gray-500" />
+            {perk.text}
+          </p>
+        ))}
+      </div>
+
+      <button
+        onClick={onUpgrade}
+        className="inline-flex items-center justify-center rounded-lg bg-black px-6 py-2.5 text-sm font-medium text-white transition-colors hover:opacity-80 focus:outline-none focus:ring-2 focus:ring-black focus:ring-offset-2"
+      >
+        Upgrade Account
+      </button>
+    </div>
+  );
+}
diff --git a/src/components/Billing/UpdatePlanConfirmation.tsx b/src/components/Billing/UpdatePlanConfirmation.tsx
new file mode 100644
index 000000000..78cc041de
--- /dev/null
+++ b/src/components/Billing/UpdatePlanConfirmation.tsx
@@ -0,0 +1,96 @@
+import { useMutation } from '@tanstack/react-query';
+import type { USER_SUBSCRIPTION_PLAN_PRICES } from '../../queries/billing';
+import { Modal } from '../Modal';
+import { queryClient } from '../../stores/query-client';
+import { useToast } from '../../hooks/use-toast';
+import { VerifyUpgrade } from './VerifyUpgrade';
+import { Loader2Icon } from 'lucide-react';
+import { httpPost } from '../../lib/query-http';
+
+type UpdatePlanBody = {
+  priceId: string;
+};
+
+type UpdatePlanResponse = {
+  status: 'ok';
+};
+
+type UpdatePlanConfirmationProps = {
+  planDetails: (typeof USER_SUBSCRIPTION_PLAN_PRICES)[number];
+  onClose: () => void;
+  onCancel: () => void;
+};
+
+export function UpdatePlanConfirmation(props: UpdatePlanConfirmationProps) {
+  const { planDetails, onClose, onCancel } = props;
+
+  const toast = useToast();
+  const {
+    mutate: updatePlan,
+    isPending,
+    status,
+  } = useMutation(
+    {
+      mutationFn: (body: UpdatePlanBody) => {
+        return httpPost<UpdatePlanResponse>(
+          '/v1-update-subscription-plan',
+          body,
+        );
+      },
+      onError: (error) => {
+        console.error(error);
+        toast.error(error?.message || 'Failed to Create Customer Portal');
+      },
+    },
+    queryClient,
+  );
+
+  if (!planDetails) {
+    return null;
+  }
+
+  const selectedPrice = planDetails;
+  if (status === 'success') {
+    return <VerifyUpgrade newPriceId={selectedPrice.priceId} />;
+  }
+
+  return (
+    <Modal
+      onClose={isPending ? () => {} : onClose}
+      bodyClassName="rounded-xl bg-white p-6"
+    >
+      <h3 className="text-xl font-bold text-black">Subscription Update</h3>
+      <p className="mt-2 text-balance text-gray-600">
+        Your plan will be updated to the{' '}
+        <b className="text-black">{planDetails.interval}</b> plan, and will
+        be charged{' '}
+        <b className="text-black">
+          ${selectedPrice.amount}/{selectedPrice.interval}
+        </b>
+        .
+      </p>
+
+      <div className="mt-6 grid grid-cols-2 gap-3">
+        <button
+          className="rounded-md border border-gray-200 py-2 text-sm font-semibold hover:bg-gray-50 transition-colors disabled:opacity-50"
+          onClick={onCancel}
+          disabled={isPending}
+        >
+          Cancel
+        </button>
+        <button
+          className="flex items-center justify-center rounded-md bg-purple-600 py-2 text-sm font-semibold text-white hover:bg-purple-500 transition-colors disabled:opacity-50"
+          disabled={isPending}
+          onClick={() => {
+            updatePlan({ priceId: selectedPrice.priceId });
+          }}
+        >
+          {isPending && (
+            <Loader2Icon className="size-4 animate-spin stroke-[2.5] mr-2" />
+          )}
+          {!isPending && 'Confirm'}
+        </button>
+      </div>
+    </Modal>
+  );
+}
diff --git a/src/components/Billing/UpgradeAccountModal.tsx b/src/components/Billing/UpgradeAccountModal.tsx
new file mode 100644
index 000000000..6a52a4e04
--- /dev/null
+++ b/src/components/Billing/UpgradeAccountModal.tsx
@@ -0,0 +1,306 @@
+import {
+  Loader2,
+  Zap,
+  Infinity,
+  MessageSquare,
+  Sparkles,
+  Heart,
+} from 'lucide-react';
+import type { LucideIcon } from 'lucide-react';
+import { useEffect, useState } from 'react';
+import { getUser } from '../../lib/jwt';
+import { useMutation, useQuery } from '@tanstack/react-query';
+import { Modal } from '../Modal';
+import {
+  billingDetailsOptions,
+  USER_SUBSCRIPTION_PLAN_PRICES,
+  type AllowedSubscriptionInterval,
+} from '../../queries/billing';
+import { cn } from '../../lib/classname';
+import { queryClient } from '../../stores/query-client';
+import { httpPost } from '../../lib/query-http';
+import { useToast } from '../../hooks/use-toast';
+import { UpdatePlanConfirmation } from './UpdatePlanConfirmation';
+
+// Define the perk type
+type Perk = {
+  icon: LucideIcon;
+  title: string;
+  description: string;
+};
+
+// Define the perks array
+const PREMIUM_PERKS: Perk[] = [
+  {
+    icon: Zap,
+    title: 'Unlimited AI Course Generations',
+    description: 'Generate as many custom courses as you need',
+  },
+  {
+    icon: Infinity,
+    title: 'No Daily Limits on course features',
+    description: 'Use all features without restrictions',
+  },
+  {
+    icon: MessageSquare,
+    title: 'Unlimited Course Follow-ups',
+    description: 'Ask as many questions as you need',
+  },
+  {
+    icon: Sparkles,
+    title: 'Early Access to Features',
+    description: 'Be the first to try new tools and features',
+  },
+  {
+    icon: Heart,
+    title: 'Support Development',
+    description: 'Help us continue building roadmap.sh',
+  },
+];
+
+type CreateSubscriptionCheckoutSessionBody = {
+  priceId: string;
+  success?: string;
+  cancel?: string;
+};
+
+type CreateSubscriptionCheckoutSessionResponse = {
+  checkoutUrl: string;
+};
+
+type UpgradeAccountModalProps = {
+  onClose: () => void;
+
+  success?: string;
+  cancel?: string;
+};
+
+export function UpgradeAccountModal(props: UpgradeAccountModalProps) {
+  const { onClose, success, cancel } = props;
+
+  const [selectedPlan, setSelectedPlan] =
+    useState<AllowedSubscriptionInterval>('month');
+  const [isUpdatingPlan, setIsUpdatingPlan] = useState(false);
+
+  const user = getUser();
+
+  const {
+    data: userBillingDetails,
+    isLoading,
+    error: billingError,
+  } = useQuery(billingDetailsOptions(), queryClient);
+
+  const toast = useToast();
+
+  const {
+    mutate: createCheckoutSession,
+    isPending: isCreatingCheckoutSession,
+  } = useMutation(
+    {
+      mutationFn: (body: CreateSubscriptionCheckoutSessionBody) => {
+        return httpPost<CreateSubscriptionCheckoutSessionResponse>(
+          '/v1-create-subscription-checkout-session',
+          body,
+        );
+      },
+      onSuccess: (data) => {
+        window.location.href = data.checkoutUrl;
+      },
+      onError: (error) => {
+        console.error(error);
+        toast.error(error?.message || 'Failed to create checkout session');
+      },
+    },
+    queryClient,
+  );
+
+  const selectedPlanDetails = USER_SUBSCRIPTION_PLAN_PRICES.find(
+    (plan) => plan.interval === selectedPlan,
+  );
+  const currentPlanPriceId = userBillingDetails?.priceId;
+  const currentPlan = USER_SUBSCRIPTION_PLAN_PRICES.find(
+    (plan) => plan.priceId === currentPlanPriceId,
+  );
+
+  useEffect(() => {
+    if (!currentPlan) {
+      return;
+    }
+
+    setSelectedPlan(currentPlan.interval);
+  }, [currentPlan]);
+
+  if (!user) {
+    return null;
+  }
+
+  const loader = isLoading ? (
+    <div className="absolute inset-0 flex h-[540px] w-full items-center justify-center bg-white">
+      <Loader2 className="h-6 w-6 animate-spin stroke-[3px] text-green-600" />
+    </div>
+  ) : null;
+
+  const error = billingError;
+  const errorContent = error ? (
+    <div className="flex h-full w-full flex-col">
+      <p className="text-center text-red-400">
+        {error?.message ||
+          'An error occurred while loading the billing details.'}
+      </p>
+    </div>
+  ) : null;
+
+  const calculateYearlyPrice = (monthlyPrice: number) => {
+    return (monthlyPrice * 12).toFixed(2);
+  };
+
+  if (isUpdatingPlan && selectedPlanDetails) {
+    return (
+      <UpdatePlanConfirmation
+        planDetails={selectedPlanDetails}
+        onClose={() => setIsUpdatingPlan(false)}
+        onCancel={() => setIsUpdatingPlan(false)}
+      />
+    );
+  }
+
+  return (
+    <Modal
+      onClose={onClose}
+      bodyClassName="p-4 sm:p-6 bg-white"
+      wrapperClassName="h-auto rounded-xl max-w-3xl w-full min-h-[540px] mx-2 sm:mx-4"
+      overlayClassName="items-start md:items-center"
+    >
+      <div onClick={(e) => e.stopPropagation()}>
+        {errorContent}
+
+        {loader}
+        {!isLoading && !error && (
+          <div className="flex flex-col">
+            <div className="mb-6 text-left sm:mb-8">
+              <h2 className="text-xl font-bold text-black sm:text-2xl">
+                Unlock Premium Features
+              </h2>
+              <p className="mt-1 text-sm text-gray-600 sm:mt-2 sm:text-base">
+                Supercharge your learning experience with premium benefits
+              </p>
+            </div>
+
+            <div className="mb-6 grid grid-cols-1 gap-4 sm:mb-8 sm:gap-6 md:grid-cols-2">
+              {USER_SUBSCRIPTION_PLAN_PRICES.map((plan) => {
+                const isCurrentPlanSelected =
+                  currentPlan?.priceId === plan.priceId;
+                const isYearly = plan.interval === 'year';
+
+                return (
+                  <div
+                    key={plan.interval}
+                    className={cn(
+                      'flex flex-col space-y-3 rounded-lg bg-white p-4 sm:space-y-4 sm:p-6',
+                      isYearly
+                        ? 'border-2 border-yellow-400'
+                        : 'border border-gray-200',
+                    )}
+                  >
+                    <div className="flex items-start justify-between">
+                      <div>
+                        <h4 className="text-sm font-semibold text-black sm:text-base">
+                          {isYearly ? 'Yearly Payment' : 'Monthly Payment'}
+                        </h4>
+                        {isYearly && (
+                          <span className="text-xs font-medium text-green-500 sm:text-sm">
+                            (2 months free)
+                          </span>
+                        )}
+                      </div>
+                      {isYearly && (
+                        <span className="rounded-full bg-yellow-400 px-1.5 py-0.5 text-xs font-semibold text-black sm:px-2 sm:py-1">
+                          Most Popular
+                        </span>
+                      )}
+                    </div>
+                    <div className="flex items-baseline">
+                      {isYearly && (
+                        <p className="mr-2 text-xs text-gray-400 line-through sm:text-sm">
+                          $
+                          {calculateYearlyPrice(
+                            USER_SUBSCRIPTION_PLAN_PRICES[0].amount,
+                          )}
+                        </p>
+                      )}
+                      <p className="text-2xl font-bold text-black sm:text-3xl">
+                        ${plan.amount}{' '}
+                        <span className="text-xs font-normal text-gray-500 sm:text-sm">
+                          / {isYearly ? 'year' : 'month'}
+                        </span>
+                      </p>
+                    </div>
+
+                    <div className="flex-grow"></div>
+
+                    <div>
+                      <button
+                        className={cn(
+                          'flex min-h-9 w-full items-center justify-center rounded-md py-2 text-sm font-medium transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-yellow-400 disabled:cursor-not-allowed disabled:opacity-60 sm:min-h-11 sm:py-2.5 sm:text-base',
+                          'bg-yellow-400 text-black hover:bg-yellow-500',
+                        )}
+                        disabled={
+                          isCurrentPlanSelected || isCreatingCheckoutSession
+                        }
+                        onClick={() => {
+                          setSelectedPlan(plan.interval);
+                          if (!currentPlanPriceId) {
+                            const currentUrlPath = window.location.pathname;
+                            createCheckoutSession({
+                              priceId: plan.priceId,
+                              success: success || `${currentUrlPath}?s=1`,
+                              cancel: cancel || `${currentUrlPath}?s=0`,
+                            });
+                            return;
+                          }
+                          setIsUpdatingPlan(true);
+                        }}
+                        data-1p-ignore=""
+                        data-form-type="other"
+                        data-lpignore="true"
+                      >
+                        {isCreatingCheckoutSession &&
+                        selectedPlan === plan.interval ? (
+                          <Loader2 className="h-3.5 w-3.5 animate-spin sm:h-4 sm:w-4" />
+                        ) : isCurrentPlanSelected ? (
+                          'Current Plan'
+                        ) : (
+                          'Select Plan'
+                        )}
+                      </button>
+                    </div>
+                  </div>
+                );
+              })}
+            </div>
+
+            {/* Benefits Section */}
+            <div className="grid grid-cols-1 gap-3 sm:gap-4 md:grid-cols-2">
+              {PREMIUM_PERKS.map((perk, index) => {
+                const Icon = perk.icon;
+                return (
+                  <div key={index} className="flex items-start space-x-2 sm:space-x-3">
+                    <Icon className="mt-0.5 h-4 w-4 text-yellow-500 sm:h-5 sm:w-5" />
+                    <div>
+                      <h4 className="text-sm font-medium text-black sm:text-base">
+                        {perk.title}
+                      </h4>
+                      <p className="text-xs text-gray-600 sm:text-sm">
+                        {perk.description}
+                      </p>
+                    </div>
+                  </div>
+                );
+              })}
+            </div>
+          </div>
+        )}
+      </div>
+    </Modal>
+  );
+}
diff --git a/src/components/Billing/VerifyUpgrade.tsx b/src/components/Billing/VerifyUpgrade.tsx
new file mode 100644
index 000000000..f59105fd0
--- /dev/null
+++ b/src/components/Billing/VerifyUpgrade.tsx
@@ -0,0 +1,76 @@
+import { useEffect } from 'react';
+import { Loader2, CheckCircle } from 'lucide-react';
+import { useQuery } from '@tanstack/react-query';
+import { billingDetailsOptions } from '../../queries/billing';
+import { queryClient } from '../../stores/query-client';
+import { Modal } from '../Modal';
+import { deleteUrlParam } from '../../lib/browser';
+
+type VerifyUpgradeProps = {
+  newPriceId?: string;
+};
+
+export function VerifyUpgrade(props: VerifyUpgradeProps) {
+  const { newPriceId } = props;
+
+  const { data: userBillingDetails } = useQuery(
+    {
+      ...billingDetailsOptions(),
+      refetchInterval: 1000,
+    },
+    queryClient,
+  );
+
+  useEffect(() => {
+    if (!userBillingDetails) {
+      return;
+    }
+
+    if (
+      userBillingDetails.status === 'active' &&
+      (newPriceId ? userBillingDetails.priceId === newPriceId : true)
+    ) {
+      deleteUrlParam('s');
+      window.location.reload();
+    }
+  }, [userBillingDetails]);
+
+  return (
+    <Modal
+      // it's an unique modal, so we don't need to close it
+      // user can close it by refreshing the page
+      onClose={() => {}}
+      bodyClassName="rounded-xl bg-white p-6"
+    >
+      <div className="mb-4 flex flex-col items-center text-center">
+        <CheckCircle className="mb-3 h-12 w-12 text-green-600" />
+        <h3 className="text-xl font-bold text-black">Subscription Activated</h3>
+      </div>
+
+      <p className="mt-2 text-balance text-center text-gray-600">
+        Your subscription has been activated successfully.
+      </p>
+
+      <p className="mt-4 text-balance text-center text-gray-600">
+        It might take a minute for the changes to reflect. We will{' '}
+        <b className="text-black">reload</b> the page for you.
+      </p>
+
+      <div className="my-6 flex animate-pulse items-center justify-center gap-2">
+        <Loader2 className="size-4 animate-spin stroke-[2.5px] text-green-600" />
+        <span className="text-gray-600">Please wait...</span>
+      </div>
+
+      <p className="text-center text-sm text-gray-500">
+        If it takes longer than expected, please email us at{' '}
+        <a
+          href="mailto:info@roadmap.sh"
+          className="text-blue-600 underline underline-offset-2 hover:text-blue-700"
+        >
+          info@roadmap.sh
+        </a>
+        .
+      </p>
+    </Modal>
+  );
+}
diff --git a/src/components/ChangelogBanner.astro b/src/components/ChangelogBanner.astro
index c6a8d25a8..cea4317c4 100644
--- a/src/components/ChangelogBanner.astro
+++ b/src/components/ChangelogBanner.astro
@@ -1,7 +1,7 @@
 ---
 import { getAllChangelogs } from '../lib/changelog';
 import { DateTime } from 'luxon';
-
+import AstroIcon from './AstroIcon.astro';
 const allChangelogs = await getAllChangelogs();
 const top10Changelogs = allChangelogs.slice(0, 10);
 ---
@@ -12,16 +12,18 @@ const top10Changelogs = allChangelogs.slice(0, 10);
       <img
         src='/images/gifs/rocket.gif'
         alt='Rocket'
-        class='mr-2 hidden sm:inline h-12 w-12'
+        class='mr-2 hidden h-12 w-12 sm:inline'
       />
       Actively Maintained
     </p>
-    <p class='mt-1 mb-2 sm:my-2 text-sm leading-relaxed text-gray-600 sm:my-5 sm:text-lg'>
+    <p
+      class='mb-2 mt-1 text-sm leading-relaxed text-gray-600 sm:my-2 sm:my-5 sm:text-lg'
+    >
       We are always improving our content, adding new resources and adding
       features to enhance your learning experience.
     </p>
 
-    <div class='relative mt-2 sm:mt-8 text-left'>
+    <div class='relative mt-2 text-left sm:mt-8'>
       <div
         class='absolute inset-y-0 left-[120px] hidden w-px -translate-x-[0.5px] translate-x-[5.75px] bg-gray-300 sm:block'
       >
@@ -36,13 +38,13 @@ const top10Changelogs = allChangelogs.slice(0, 10);
               <li class='relative'>
                 <a
                   href={`/changelog#${changelog.id}`}
-                  class='flex flex-col sm:flex-row items-start sm:items-center'
+                  class='flex flex-col items-start sm:flex-row sm:items-center'
                 >
-                  <span class='sm:w-[120px] flex-shrink-0 pr-0 sm:pr-4 text-right text-sm tracking-wide text-gray-400'>
+                  <span class='flex-shrink-0 pr-0 text-right text-sm tracking-wide text-gray-400 sm:w-[120px] sm:pr-4'>
                     {formattedDate}
                   </span>
-                  <span class='h-3 w-3 flex-shrink-0 rounded-full bg-gray-300 hidden sm:block' />
-                  <span class='text-balance sm:pl-8 text-base font-medium text-gray-900'>
+                  <span class='hidden h-3 w-3 flex-shrink-0 rounded-full bg-gray-300 sm:block' />
+                  <span class='text-balance text-base font-medium text-gray-900 sm:pl-8'>
                     {changelog.frontmatter.title}
                   </span>
                 </a>
@@ -52,13 +54,23 @@ const top10Changelogs = allChangelogs.slice(0, 10);
         }
       </ul>
     </div>
-    <div class='mt-2 sm:mt-8 text-left sm:text-center'>
+    <div
+      class='mt-2 flex flex-col gap-2 sm:flex-row sm:mt-8 sm:items-center sm:justify-center'
+    >
       <a
         href='/changelog'
-        class='inline-block text-sm sm:text-base rounded-lg sm:rounded-full bg-gray-800 px-4 sm:px-6 py-2 text-white transition-colors hover:bg-gray-700'
+        class='inline-block rounded-lg border border-black bg-black px-4 py-2 text-sm text-white transition-colors hover:bg-gray-700 sm:rounded-full sm:px-6 sm:text-base'
       >
         View Full Changelog
       </a>
+      <button
+        data-guest-required
+        data-popup='login-popup'
+        class='flex flex-row items-center gap-2 rounded-lg border border-black bg-white px-4 py-2 text-sm text-black transition-all hover:bg-black hover:text-white sm:rounded-full sm:pl-4 sm:pr-5 sm:text-base'
+      >
+        <AstroIcon icon='bell' class='h-5 w-5' />
+        Subscribe for Notifications
+      </button>
     </div>
   </div>
 </div>
diff --git a/src/components/CreateTeam/RoadmapSelector.tsx b/src/components/CreateTeam/RoadmapSelector.tsx
index 66096042f..0b0023f0c 100644
--- a/src/components/CreateTeam/RoadmapSelector.tsx
+++ b/src/components/CreateTeam/RoadmapSelector.tsx
@@ -11,6 +11,7 @@ import type {
 } from '../CustomRoadmap/CreateRoadmap/CreateRoadmapModal';
 import { CreateRoadmapModal } from '../CustomRoadmap/CreateRoadmap/CreateRoadmapModal';
 import { useToast } from '../../hooks/use-toast';
+import { ContentConfirmationModal } from './ContentConfirmationModal';
 
 export type TeamResourceConfig = {
   isCustomResource: boolean;
@@ -44,6 +45,7 @@ export function RoadmapSelector(props: RoadmapSelectorProps) {
   const [isCreatingRoadmap, setIsCreatingRoadmap] = useState<boolean>(false);
 
   const [error, setError] = useState<string>('');
+  const [confirmationContentId, setConfirmationContentId] = useState<string>();
 
   async function loadAllRoadmaps() {
     const { error, response } = await httpGet<PageType[]>(`/pages.json`);
@@ -101,7 +103,7 @@ export function RoadmapSelector(props: RoadmapSelectorProps) {
     });
   }
 
-  async function addTeamResource(roadmapId: string) {
+  async function addTeamResource(roadmapId: string, shouldCopyContent = false) {
     if (!teamId) {
       return;
     }
@@ -118,6 +120,7 @@ export function RoadmapSelector(props: RoadmapSelectorProps) {
         resourceType: 'roadmap',
         removed: [],
         renderer: renderer || 'balsamiq',
+        shouldCopyContent,
       },
     );
 
@@ -148,8 +151,24 @@ export function RoadmapSelector(props: RoadmapSelectorProps) {
     });
   }
 
+  const confirmationContentIdModal = confirmationContentId && (
+    <ContentConfirmationModal
+      onClose={() => {
+        setConfirmationContentId('');
+      }}
+      onClick={(shouldCopy) => {
+        addTeamResource(confirmationContentId, shouldCopy).finally(() => {
+          pageProgressMessage.set('');
+          setConfirmationContentId('');
+        });
+      }}
+    />
+  );
+
   return (
     <div>
+      {confirmationContentIdModal}
+
       {changingRoadmapId && (
         <UpdateTeamResourceModal
           onClose={() => setChangingRoadmapId('')}
@@ -170,9 +189,20 @@ export function RoadmapSelector(props: RoadmapSelectorProps) {
           allRoadmaps={allRoadmaps.filter((r) => r.renderer === 'editor')}
           teamId={teamId}
           onRoadmapAdd={(roadmapId) => {
-            addTeamResource(roadmapId).finally(() => {
-              pageProgressMessage.set('');
-            });
+            const isEditorRoadmap = allRoadmaps.find(
+              (r) => r.id === roadmapId && r.renderer === 'editor',
+            );
+
+            if (!isEditorRoadmap) {
+              addTeamResource(roadmapId).finally(() => {
+                pageProgressMessage.set('');
+              });
+
+              return;
+            }
+
+            setShowSelectRoadmapModal(false);
+            setConfirmationContentId(roadmapId);
           }}
           onRoadmapRemove={(roadmapId) => {
             onRemove(roadmapId).finally(() => {});
diff --git a/src/components/Dashboard/DashboardCustomProgressCard.tsx b/src/components/Dashboard/DashboardCustomProgressCard.tsx
index 9464d5a73..9262614bc 100644
--- a/src/components/Dashboard/DashboardCustomProgressCard.tsx
+++ b/src/components/Dashboard/DashboardCustomProgressCard.tsx
@@ -1,5 +1,5 @@
-import { getPercentage } from '../../helper/number';
 import { getRelativeTimeString } from '../../lib/date';
+import { getPercentage } from '../../lib/number';
 import type { UserProgress } from '../TeamProgress/TeamProgressPage';
 
 type DashboardCustomProgressCardProps = {
diff --git a/src/components/Dashboard/DashboardPage.tsx b/src/components/Dashboard/DashboardPage.tsx
index b7d832983..90d0aab82 100644
--- a/src/components/Dashboard/DashboardPage.tsx
+++ b/src/components/Dashboard/DashboardPage.tsx
@@ -1,20 +1,27 @@
+import { useStore } from '@nanostores/react';
 import { useEffect, useState } from 'react';
-import { httpGet } from '../../lib/http';
+import { cn } from '../../../editor/utils/classname';
+import { useParams } from '../../hooks/use-params';
 import { useToast } from '../../hooks/use-toast';
-import { useStore } from '@nanostores/react';
+import { httpGet } from '../../lib/http';
+import { getUser } from '../../lib/jwt';
 import { $teamList } from '../../stores/team';
 import type { TeamListResponse } from '../TeamDropdown/TeamDropdown';
-import { DashboardTab } from './DashboardTab';
+import { DashboardTabButton } from './DashboardTabButton';
 import { PersonalDashboard, type BuiltInRoadmap } from './PersonalDashboard';
 import { TeamDashboard } from './TeamDashboard';
-import { getUser } from '../../lib/jwt';
-import { useParams } from '../../hooks/use-params';
+import type { QuestionGroupType } from '../../lib/question-group';
+import type { GuideFileType } from '../../lib/guide';
+import type { VideoFileType } from '../../lib/video';
 
 type DashboardPageProps = {
   builtInRoleRoadmaps?: BuiltInRoadmap[];
   builtInSkillRoadmaps?: BuiltInRoadmap[];
   builtInBestPractices?: BuiltInRoadmap[];
   isTeamPage?: boolean;
+  questionGroups?: QuestionGroupType[];
+  guides?: GuideFileType[];
+  videos?: VideoFileType[];
 };
 
 export function DashboardPage(props: DashboardPageProps) {
@@ -23,6 +30,9 @@ export function DashboardPage(props: DashboardPageProps) {
     builtInBestPractices,
     builtInSkillRoadmaps,
     isTeamPage = false,
+    questionGroups,
+    guides,
+    videos,
   } = props;
 
   const currentUser = getUser();
@@ -66,78 +76,79 @@ export function DashboardPage(props: DashboardPageProps) {
       : '/images/default-avatar.png';
 
   return (
-    <div className="min-h-screen bg-gray-50 pb-20 pt-8">
-      <div className="container">
-        <div className="mb-6 flex flex-wrap items-center gap-1.5 sm:mb-8">
-          <DashboardTab
-            label="Personal"
-            isActive={!selectedTeamId && !isTeamPage}
-            href="/dashboard"
-            avatar={userAvatar}
-          />
-
-          {isLoading && (
-            <>
-              <DashboardTabSkeleton />
-              <DashboardTabSkeleton />
-            </>
-          )}
-
-          {!isLoading && (
-            <>
-              {teamList.map((team) => {
-                const { avatar } = team;
-                const avatarUrl = avatar
-                  ? `${import.meta.env.PUBLIC_AVATAR_BASE_URL}/${avatar}`
-                  : '/images/default-avatar.png';
-                return (
-                  <DashboardTab
-                    key={team._id}
-                    label={team.name}
-                    isActive={team._id === selectedTeamId}
-                    {...(team.status === 'invited'
-                      ? {
-                          href: `/respond-invite?i=${team.memberId}`,
-                        }
-                      : {
-                          href: `/team?t=${team._id}`,
-                        })}
-                    avatar={avatarUrl}
-                  />
-                );
-              })}
-              <DashboardTab
-                label="+ Create Team"
-                isActive={false}
-                href="/team/new"
-                className="border border-dashed border-gray-300 bg-transparent px-3 text-[13px] text-sm text-gray-500 hover:border-gray-600 hover:text-black"
-              />
-            </>
-          )}
+    <>
+      <div
+        className={cn('bg-slate-900', {
+          'striped-loader-slate': isLoading,
+        })}
+      >
+        <div className="bg-slate-800/30 py-5 min-h-[70px]">
+          <div className="container flex flex-wrap items-center gap-1.5">
+            {!isLoading && (
+              <>
+                <DashboardTabButton
+                  label="Personal"
+                  isActive={!selectedTeamId && !isTeamPage}
+                  href="/dashboard"
+                  avatar={userAvatar}
+                />
+                {teamList.map((team) => {
+                  const { avatar } = team;
+                  const avatarUrl = avatar
+                    ? `${import.meta.env.PUBLIC_AVATAR_BASE_URL}/${avatar}`
+                    : '/images/default-avatar.png';
+                  return (
+                    <DashboardTabButton
+                      key={team._id}
+                      label={team.name}
+                      isActive={team._id === selectedTeamId}
+                      {...(team.status === 'invited'
+                        ? {
+                            href: `/respond-invite?i=${team.memberId}`,
+                          }
+                        : {
+                            href: `/team?t=${team._id}`,
+                          })}
+                      avatar={avatarUrl}
+                    />
+                  );
+                })}
+                <DashboardTabButton
+                  label="+ Create Team"
+                  isActive={false}
+                  href="/team/new"
+                  className="border border-dashed border-slate-700 bg-transparent px-3 text-[13px] text-sm text-gray-500 hover:border-solid hover:border-slate-700 hover:text-gray-400"
+                />
+              </>
+            )}
+          </div>
         </div>
+      </div>
 
+      <div className="">
         {!selectedTeamId && !isTeamPage && (
-          <PersonalDashboard
-            builtInRoleRoadmaps={builtInRoleRoadmaps}
-            builtInSkillRoadmaps={builtInSkillRoadmaps}
-            builtInBestPractices={builtInBestPractices}
-          />
+          <div className="bg-slate-900">
+            <PersonalDashboard
+              builtInRoleRoadmaps={builtInRoleRoadmaps}
+              builtInSkillRoadmaps={builtInSkillRoadmaps}
+              builtInBestPractices={builtInBestPractices}
+              questionGroups={questionGroups}
+              guides={guides}
+              videos={videos}
+            />
+          </div>
         )}
 
         {(selectedTeamId || isTeamPage) && (
-          <TeamDashboard
-            builtInRoleRoadmaps={builtInRoleRoadmaps!}
-            builtInSkillRoadmaps={builtInSkillRoadmaps!}
-            teamId={selectedTeamId!}
-          />
+          <div className="container">
+            <TeamDashboard
+              builtInRoleRoadmaps={builtInRoleRoadmaps!}
+              builtInSkillRoadmaps={builtInSkillRoadmaps!}
+              teamId={selectedTeamId!}
+            />
+          </div>
         )}
       </div>
-    </div>
-  );
-}
-
-function DashboardTabSkeleton() {
-  return (
-    <div className="h-[30px] w-[114px] animate-pulse rounded-md border bg-white"></div>
+    </>
   );
 }
diff --git a/src/components/Dashboard/DashboardProgressCard.tsx b/src/components/Dashboard/DashboardProgressCard.tsx
index d243051b0..467cffb6c 100644
--- a/src/components/Dashboard/DashboardProgressCard.tsx
+++ b/src/components/Dashboard/DashboardProgressCard.tsx
@@ -1,6 +1,5 @@
-import { getPercentage } from '../../helper/number';
+import { getPercentage } from '../../lib/number';
 import type { UserProgress } from '../TeamProgress/TeamProgressPage';
-import { ArrowUpRight, ExternalLink } from 'lucide-react';
 
 type DashboardProgressCardProps = {
   progress: UserProgress;
diff --git a/src/components/Dashboard/DashboardTab.tsx b/src/components/Dashboard/DashboardTabButton.tsx
similarity index 66%
rename from src/components/Dashboard/DashboardTab.tsx
rename to src/components/Dashboard/DashboardTabButton.tsx
index c6b345599..2daa41c84 100644
--- a/src/components/Dashboard/DashboardTab.tsx
+++ b/src/components/Dashboard/DashboardTabButton.tsx
@@ -11,7 +11,7 @@ type DashboardTabProps = {
   icon?: ReactNode;
 };
 
-export function DashboardTab(props: DashboardTabProps) {
+export function DashboardTabButton(props: DashboardTabProps) {
   const { isActive, onClick, label, className, href, avatar, icon } = props;
 
   const Slot = href ? 'a' : 'button';
@@ -20,8 +20,10 @@ export function DashboardTab(props: DashboardTabProps) {
     <Slot
       onClick={onClick}
       className={cn(
-        'flex h-[30px] shrink-0 items-center gap-1 rounded-md border bg-white p-1.5 px-2 text-sm leading-none text-gray-600',
-        isActive ? 'border-gray-500 bg-gray-200 text-gray-900' : '',
+        'flex h-[30px] shrink-0 items-center gap-1 rounded-md border border-slate-700 bg-slate-800 p-1.5 pl-2 pr-3 text-sm leading-none text-gray-400 transition-colors hover:bg-slate-700',
+        isActive
+          ? 'border-slate-200 bg-slate-200 text-gray-900 hover:bg-slate-200'
+          : '',
         className,
       )}
       {...(href ? { href } : {})}
@@ -30,7 +32,7 @@ export function DashboardTab(props: DashboardTabProps) {
         <img
           src={avatar}
           alt="avatar"
-          className="h-4 w-4 mr-0.5 rounded-full object-cover"
+          className="mr-0.5 h-4 w-4 rounded-full object-cover"
         />
       )}
       {icon}
diff --git a/src/components/Dashboard/PersonalDashboard.tsx b/src/components/Dashboard/PersonalDashboard.tsx
index eb23d7c98..72c3387fb 100644
--- a/src/components/Dashboard/PersonalDashboard.tsx
+++ b/src/components/Dashboard/PersonalDashboard.tsx
@@ -1,23 +1,47 @@
-import { type JSXElementConstructor, useEffect, useState } from 'react';
-import { httpGet } from '../../lib/http';
-import type { UserProgress } from '../TeamProgress/TeamProgressPage';
-import type { ProjectStatusDocument } from '../Projects/ListProjectSolutions';
-import type { PageType } from '../CommandMenu/CommandMenu';
-import { useToast } from '../../hooks/use-toast';
-import { getCurrentPeriod } from '../../lib/date';
-import { ListDashboardCustomProgress } from './ListDashboardCustomProgress';
-import { RecommendedRoadmaps } from './RecommendedRoadmaps';
-import { ProgressStack } from './ProgressStack';
 import { useStore } from '@nanostores/react';
-import { $accountStreak, type StreakResponse } from '../../stores/streak';
-import { CheckEmoji } from '../ReactIcons/CheckEmoji.tsx';
-import { ConstructionEmoji } from '../ReactIcons/ConstructionEmoji.tsx';
-import { BookEmoji } from '../ReactIcons/BookEmoji.tsx';
-import { DashboardAiRoadmaps } from './DashboardAiRoadmaps.tsx';
+import {
+  ChartColumn,
+  CheckSquare,
+  FolderGit2,
+  SquarePen,
+  Zap,
+  type LucideIcon
+} from 'lucide-react';
+import { useEffect, useState } from 'react';
 import type { AllowedProfileVisibility } from '../../api/user.ts';
-import { PencilIcon, type LucideIcon } from 'lucide-react';
+import { useToast } from '../../hooks/use-toast';
 import { cn } from '../../lib/classname.ts';
+import type { GuideFileType } from '../../lib/guide';
+import { httpGet } from '../../lib/http';
+import type { QuestionGroupType } from '../../lib/question-group';
 import type { AllowedRoadmapRenderer } from '../../lib/roadmap.ts';
+import type { VideoFileType } from '../../lib/video';
+import { $accountStreak, type StreakResponse } from '../../stores/streak';
+import type { PageType } from '../CommandMenu/CommandMenu';
+import { FeaturedGuideList } from '../FeaturedGuides/FeaturedGuideList';
+import { FeaturedVideoList } from '../FeaturedVideos/FeaturedVideoList';
+import {
+  FavoriteRoadmaps,
+  type AIRoadmapType,
+} from '../HeroSection/FavoriteRoadmaps.tsx';
+import { HeroRoadmap } from '../HeroSection/HeroRoadmap.tsx';
+import type { ProjectStatusDocument } from '../Projects/ListProjectSolutions';
+import type { UserProgress } from '../TeamProgress/TeamProgressPage';
+
+const projectGroups =  [
+  {
+    title: 'Frontend',
+    id: 'frontend',
+  },
+  {
+    title: 'Backend',
+    id: 'backend',
+  },
+  {
+    title: 'DevOps',
+    id: 'devops',
+  },
+];
 
 type UserDashboardResponse = {
   name: string;
@@ -28,11 +52,7 @@ type UserDashboardResponse = {
   profileVisibility: AllowedProfileVisibility;
   progresses: UserProgress[];
   projects: ProjectStatusDocument[];
-  aiRoadmaps: {
-    id: string;
-    title: string;
-    slug: string;
-  }[];
+  aiRoadmaps: AIRoadmapType[];
   topicDoneToday: number;
 };
 
@@ -42,6 +62,7 @@ export type BuiltInRoadmap = {
   title: string;
   description: string;
   isFavorite?: boolean;
+  isNew?: boolean;
   relatedRoadmapIds?: string[];
   renderer?: AllowedRoadmapRenderer;
   metadata?: Record<string, any>;
@@ -51,16 +72,162 @@ type PersonalDashboardProps = {
   builtInRoleRoadmaps?: BuiltInRoadmap[];
   builtInSkillRoadmaps?: BuiltInRoadmap[];
   builtInBestPractices?: BuiltInRoadmap[];
+  questionGroups?: QuestionGroupType[];
+  guides?: GuideFileType[];
+  videos?: VideoFileType[];
+};
+
+type DashboardStatItemProps = {
+  icon: LucideIcon;
+  iconClassName: string;
+  value: number;
+  label: string;
+  isLoading: boolean;
+};
+
+function DashboardStatItem(props: DashboardStatItemProps) {
+  const { icon: Icon, iconClassName, value, label, isLoading } = props;
+
+  return (
+    <div
+      className={cn(
+        'flex items-center gap-1.5 rounded-lg bg-slate-800/50 py-2 pl-3 pr-3',
+        {
+          'striped-loader-slate striped-loader-slate-fast text-transparent':
+            isLoading,
+        },
+      )}
+    >
+      <Icon
+        size={16}
+        className={cn(iconClassName, { 'text-transparent': isLoading })}
+      />
+      <span>
+        <span className="tabular-nums">{value}</span> {label}
+      </span>
+    </div>
+  );
+}
+
+type ProfileButtonProps = {
+  isLoading: boolean;
+  name?: string;
+  username?: string;
+  avatar?: string;
+};
+
+function PersonalProfileButton(props: ProfileButtonProps) {
+  const { isLoading, name, username, avatar } = props;
+
+  if (isLoading || !username) {
+    return (
+      <a
+        href="/account/update-profile"
+        className={cn(
+          'flex items-center gap-2 rounded-lg bg-slate-800/50 py-2 pl-3 pr-3 font-medium outline-slate-700 hover:bg-slate-800 hover:outline-slate-400',
+          {
+            'striped-loader-slate striped-loader-slate-fast text-transparent':
+              isLoading,
+            'bg-blue-500/10 text-blue-500 hover:bg-blue-500/20': !isLoading,
+          },
+        )}
+      >
+        <CheckSquare className="h-4 w-4" strokeWidth={2.5} />
+        Set up your profile
+      </a>
+    );
+  }
+
+  return (
+    <div className="flex gap-1.5">
+      <a
+        href={`/u/${username}`}
+        className="flex items-center gap-2 rounded-lg bg-slate-800/50 py-2 pl-3 pr-3 text-slate-300 transition-colors hover:bg-slate-800/70"
+      >
+        <img
+          src={avatar}
+          alt={name || 'Profile'}
+          className="h-5 w-5 rounded-full ring-1 ring-slate-700"
+        />
+        <span className="font-medium">Visit Profile</span>
+      </a>
+      <a
+        href="/account/update-profile"
+        className="flex items-center gap-2 rounded-lg bg-slate-800/50 py-2 pl-3 pr-3 text-slate-400 transition-colors hover:bg-slate-800/70 hover:text-slate-300"
+        title="Edit Profile"
+      >
+        <SquarePen className="h-4 w-4" />
+      </a>
+    </div>
+  );
+}
+
+type DashboardStatsProps = {
+  profile: ProfileButtonProps;
+  accountStreak?: StreakResponse;
+  topicsDoneToday?: number;
+  finishedProjectsCount?: number;
+  isLoading: boolean;
 };
 
+function DashboardStats(props: DashboardStatsProps) {
+  const {
+    accountStreak,
+    topicsDoneToday = 0,
+    finishedProjectsCount = 0,
+    isLoading,
+    profile,
+  } = props;
+
+  return (
+    <div className="container mb-3 flex flex-col gap-4 pb-2 pt-6 text-sm text-slate-400 sm:flex-row sm:items-center sm:justify-between">
+      <div className="flex w-full flex-col gap-4 sm:flex-row sm:items-center sm:justify-between">
+        <PersonalProfileButton
+          isLoading={isLoading}
+          name={profile.name}
+          username={profile.username}
+          avatar={profile.avatar}
+        />
+        <div className="hidden flex-wrap items-center gap-2 md:flex">
+          <DashboardStatItem
+            icon={Zap}
+            iconClassName="text-yellow-500"
+            value={accountStreak?.count || 0}
+            label="day streak"
+            isLoading={isLoading}
+          />
+          <DashboardStatItem
+            icon={ChartColumn}
+            iconClassName="text-green-500"
+            value={topicsDoneToday}
+            label="learnt today"
+            isLoading={isLoading}
+          />
+          <DashboardStatItem
+            icon={FolderGit2}
+            iconClassName="text-blue-500"
+            value={finishedProjectsCount}
+            label="projects finished"
+            isLoading={isLoading}
+          />
+        </div>
+      </div>
+    </div>
+  );
+}
+
 export function PersonalDashboard(props: PersonalDashboardProps) {
   const {
     builtInRoleRoadmaps = [],
     builtInBestPractices = [],
     builtInSkillRoadmaps = [],
+    questionGroups = [],
+    guides = [],
+    videos = [],
   } = props;
 
   const toast = useToast();
+
   const [isLoading, setIsLoading] = useState(true);
   const [personalDashboardDetails, setPersonalDashboardDetails] =
     useState<UserDashboardResponse>();
@@ -138,7 +305,9 @@ export function PersonalDashboard(props: PersonalDashboardProps) {
     return () => window.removeEventListener('refresh-favorites', loadProgress);
   }, []);
 
-  const learningRoadmapsToShow = (personalDashboardDetails?.progresses || [])
+  const learningRoadmapsToShow: UserProgress[] = (
+    personalDashboardDetails?.progresses || []
+  )
     .filter((progress) => !progress.isCustomResource)
     .sort((a, b) => {
       const updatedAtA = new Date(a.updatedAt);
@@ -156,7 +325,10 @@ export function PersonalDashboard(props: PersonalDashboardProps) {
     });
 
   const aiGeneratedRoadmaps = personalDashboardDetails?.aiRoadmaps || [];
-  const customRoadmaps = (personalDashboardDetails?.progresses || [])
+
+  const customRoadmaps: UserProgress[] = (
+    personalDashboardDetails?.progresses || []
+  )
     .filter((progress) => progress.isCustomResource)
     .sort((a, b) => {
       const updatedAtA = new Date(a.updatedAt);
@@ -169,43 +341,6 @@ export function PersonalDashboard(props: PersonalDashboardProps) {
     ? `${import.meta.env.PUBLIC_AVATAR_BASE_URL}/${avatar}`
     : '/images/default-avatar.png';
 
-  const allRoadmapsAndBestPractices = [
-    ...builtInRoleRoadmaps,
-    ...builtInSkillRoadmaps,
-    ...builtInBestPractices,
-  ];
-
-  const relatedRoadmapIds = allRoadmapsAndBestPractices
-    // take the ones that user is learning
-    .filter((roadmap) =>
-      learningRoadmapsToShow?.some(
-        (learningRoadmap) => learningRoadmap.resourceId === roadmap.id,
-      ),
-    )
-    .flatMap((roadmap) => roadmap.relatedRoadmapIds)
-    // remove the ones that user is already learning or has bookmarked
-    .filter(
-      (roadmapId) =>
-        !learningRoadmapsToShow.some((lr) => lr.resourceId === roadmapId),
-    );
-
-  const recommendedRoadmapIds = new Set(
-    relatedRoadmapIds.length === 0
-      ? [
-          'frontend',
-          'backend',
-          'devops',
-          'ai-data-scientist',
-          'full-stack',
-          'api-design',
-        ]
-      : relatedRoadmapIds,
-  );
-
-  const recommendedRoadmaps = allRoadmapsAndBestPractices.filter((roadmap) =>
-    recommendedRoadmapIds.has(roadmap.id),
-  );
-
   const enrichedProjects = personalDashboardDetails?.projects
     .map((project) => {
       const projectDetail = projectDetails.find(
@@ -232,165 +367,200 @@ export function PersonalDashboard(props: PersonalDashboardProps) {
   const { username } = personalDashboardDetails || {};
 
   return (
-    <section>
-      {isLoading ? (
-        <div className="h-7 w-1/4 animate-pulse rounded-lg bg-gray-200"></div>
-      ) : (
-        <div className="flex flex-col items-start justify-between gap-1 sm:flex-row sm:items-center">
-          <h2 className="text-lg font-medium">
-            Hi {name}, good {getCurrentPeriod()}!
-          </h2>
-          <a
-            href="/home"
-            className="rounded-full bg-gray-200 px-2.5 py-1 text-xs font-medium text-gray-700 hover:bg-gray-300 hover:text-black"
-          >
-            Visit Homepage
-          </a>
-        </div>
-      )}
-
-      <div className="mt-4 grid grid-cols-1 gap-2 sm:grid-cols-2 md:grid-cols-4">
-        {isLoading ? (
-          <>
-            <DashboardCardSkeleton />
-            <DashboardCardSkeleton />
-            <DashboardCardSkeleton />
-            <DashboardCardSkeleton />
-          </>
-        ) : (
-          <>
-            <DashboardCard
-              imgUrl={avatarLink}
-              title={name!}
-              description={
-                username ? 'View your profile' : 'Setup your profile'
-              }
-              href={username ? `/u/${username}` : '/account/update-profile'}
-              {...(username && {
-                externalLinkIcon: PencilIcon,
-                externalLinkHref: '/account/update-profile',
-                externalLinkText: 'Edit',
-              })}
-              className={
-                !username
-                  ? 'border-dashed border-gray-500 bg-gray-100 hover:border-gray-500 hover:bg-gray-200'
-                  : ''
-              }
-            />
-
-            <DashboardCard
-              icon={BookEmoji}
-              title="Visit Roadmaps"
-              description="Learn new skills"
-              href="/roadmaps"
-            />
-
-            <DashboardCard
-              icon={ConstructionEmoji}
-              title="Build Projects"
-              description="Practice what you learn"
-              href="/projects"
-            />
-            <DashboardCard
-              icon={CheckEmoji}
-              title="Best Practices"
-              description="Do things the right way"
-              href="/best-practices"
-            />
-          </>
-        )}
-      </div>
-
-      <ProgressStack
-        progresses={learningRoadmapsToShow}
-        projects={enrichedProjects || []}
+    <div>
+      <DashboardStats
+        profile={{
+          name,
+          username,
+          avatar: avatarLink,
+          isLoading,
+        }}
         isLoading={isLoading}
         accountStreak={accountStreak}
-        topicDoneToday={personalDashboardDetails?.topicDoneToday || 0}
-      />
-
-      <ListDashboardCustomProgress
-        progresses={customRoadmaps}
-        isLoading={isLoading}
-      />
-
-      <DashboardAiRoadmaps
-        roadmaps={aiGeneratedRoadmaps}
-        isLoading={isLoading}
+        topicsDoneToday={personalDashboardDetails?.topicDoneToday}
+        finishedProjectsCount={
+          enrichedProjects?.filter((p) => p.submittedAt && p.repositoryUrl)
+            .length
+        }
       />
 
-      <RecommendedRoadmaps
-        roadmaps={recommendedRoadmaps}
+      <FavoriteRoadmaps
+        progress={learningRoadmapsToShow}
+        customRoadmaps={customRoadmaps}
+        aiRoadmaps={aiGeneratedRoadmaps}
+        projects={enrichedProjects || []}
         isLoading={isLoading}
       />
-    </section>
-  );
-}
 
-type DashboardCardProps = {
-  icon?: JSXElementConstructor<any>;
-  imgUrl?: string;
-  title: string;
-  description: string;
-  href: string;
-  externalLinkIcon?: LucideIcon;
-  externalLinkText?: string;
-  externalLinkHref?: string;
-  className?: string;
-};
+      <div className="bg-gradient-to-b from-slate-900 to-black pb-12">
+        <div className="relative mt-6 border-t border-t-[#1e293c] pt-12">
+          <div className="container">
+            <h2
+              id="role-based-roadmaps"
+              className="text-md font-regular absolute -top-[17px] left-4 flex rounded-lg border border-[#1e293c] bg-slate-900 px-3 py-1 text-slate-400 sm:left-1/2 sm:-translate-x-1/2"
+            >
+              Role Based Roadmaps
+            </h2>
+
+            <div className="grid grid-cols-1 gap-3 px-2 sm:grid-cols-2 sm:px-0 lg:grid-cols-3">
+              {builtInRoleRoadmaps.map((roadmap) => {
+                const roadmapProgress = learningRoadmapsToShow.find(
+                  (lr) => lr.resourceId === roadmap.id,
+                );
+
+                const percentageDone =
+                  (((roadmapProgress?.skipped || 0) +
+                    (roadmapProgress?.done || 0)) /
+                    (roadmapProgress?.total || 1)) *
+                  100;
+
+                return (
+                  <HeroRoadmap
+                    key={roadmap.id}
+                    resourceId={roadmap.id}
+                    resourceType="roadmap"
+                    resourceTitle={roadmap.title}
+                    isFavorite={roadmap.isFavorite}
+                    percentageDone={percentageDone}
+                    isNew={roadmap.isNew}
+                    url={`/${roadmap.id}`}
+                  />
+                );
+              })}
+            </div>
+          </div>
+        </div>
 
-function DashboardCard(props: DashboardCardProps) {
-  const {
-    icon: Icon,
-    imgUrl,
-    title,
-    description,
-    href,
-    externalLinkHref,
-    externalLinkIcon: ExternalLinkIcon,
-    externalLinkText,
-    className,
-  } = props;
+        <div className="relative mt-12 border-t border-t-[#1e293c] pt-12">
+          <div className="container">
+            <h2 className="text-md font-regular absolute -top-[17px] left-4 flex rounded-lg border border-[#1e293c] bg-slate-900 px-3 py-1 text-slate-400 sm:left-1/2 sm:-translate-x-1/2">
+              Skill Based Roadmaps
+            </h2>
+
+            <div className="grid grid-cols-1 gap-3 px-2 sm:grid-cols-2 sm:px-0 lg:grid-cols-3">
+              {builtInSkillRoadmaps.map((roadmap) => {
+                const roadmapProgress = learningRoadmapsToShow.find(
+                  (lr) => lr.resourceId === roadmap.id,
+                );
+
+                const percentageDone =
+                  (((roadmapProgress?.skipped || 0) +
+                    (roadmapProgress?.done || 0)) /
+                    (roadmapProgress?.total || 1)) *
+                  100;
+
+                return (
+                  <HeroRoadmap
+                    key={roadmap.id}
+                    resourceId={roadmap.id}
+                    resourceType="roadmap"
+                    resourceTitle={roadmap.title}
+                    isFavorite={roadmap.isFavorite}
+                    percentageDone={percentageDone}
+                    isNew={roadmap.isNew}
+                    url={`/${roadmap.id}`}
+                  />
+                );
+              })}
+            </div>
+          </div>
+        </div>
 
-  return (
-    <div className={cn('relative overflow-hidden', className)}>
-      <a
-        href={href}
-        className="flex flex-col rounded-lg border border-gray-300 bg-white hover:border-gray-400 hover:bg-gray-50"
-      >
-        {Icon && (
-          <div className="px-4 pb-3 pt-4">
-            <Icon className="size-6" />
+        <div className="relative mt-12 border-t border-t-[#1e293c] pt-12">
+          <div className="container">
+            <h2 className="text-md font-regular absolute -top-[17px] left-4 flex rounded-lg border border-[#1e293c] bg-slate-900 px-3 py-1 text-slate-400 sm:left-1/2 sm:-translate-x-1/2">
+              Project Ideas
+            </h2>
+
+            <div className="grid grid-cols-1 gap-3 px-2 sm:grid-cols-2 sm:px-0 lg:grid-cols-3">
+              {projectGroups.map((projectGroup) => {
+                return (
+                  <HeroRoadmap
+                    percentageDone={0}
+                    key={projectGroup.id}
+                    resourceId={projectGroup.id}
+                    resourceType="roadmap"
+                    resourceTitle={projectGroup.title}
+                    url={`/${projectGroup.id}/projects`}
+                    allowFavorite={false}
+                  />
+                );
+              })}
+            </div>
           </div>
-        )}
+        </div>
 
-        {imgUrl && (
-          <div className="px-4 pb-1.5 pt-3.5">
-            <img src={imgUrl} alt={title} className="size-8 rounded-full" />
+        <div className="relative mt-12 border-t border-t-[#1e293c] pt-12">
+          <div className="container">
+            <h2 className="text-md font-regular absolute -top-[17px] left-4 flex rounded-lg border border-[#1e293c] bg-slate-900 px-3 py-1 text-slate-400 sm:left-1/2 sm:-translate-x-1/2">
+              Best Practices
+            </h2>
+
+            <div className="grid grid-cols-1 gap-3 px-2 sm:grid-cols-2 sm:px-0 lg:grid-cols-3">
+              {builtInBestPractices.map((roadmap) => {
+                const roadmapProgress = learningRoadmapsToShow.find(
+                  (lr) => lr.resourceId === roadmap.id,
+                );
+
+                const percentageDone =
+                  (((roadmapProgress?.skipped || 0) +
+                    (roadmapProgress?.done || 0)) /
+                    (roadmapProgress?.total || 1)) *
+                  100;
+
+                return (
+                  <HeroRoadmap
+                    key={roadmap.id}
+                    resourceId={roadmap.id}
+                    resourceType="best-practice"
+                    resourceTitle={roadmap.title}
+                    isFavorite={roadmap.isFavorite}
+                    percentageDone={percentageDone}
+                    isNew={roadmap.isNew}
+                    url={`/best-practices/${roadmap.id}`}
+                  />
+                );
+              })}
+            </div>
           </div>
-        )}
+        </div>
 
-        <div className="flex grow flex-col justify-center gap-0.5 p-4">
-          <h3 className="truncate font-medium text-black">{title}</h3>
-          <p className="text-xs text-black">{description}</p>
+        <div className="relative mt-12 border-t border-t-[#1e293c] pt-12">
+          <div className="container">
+            <h2 className="text-md font-regular absolute -top-[17px] left-4 flex rounded-lg border border-[#1e293c] bg-slate-900 px-3 py-1 text-slate-400 sm:left-1/2 sm:-translate-x-1/2">
+              Questions
+            </h2>
+
+            <div className="grid grid-cols-1 gap-3 px-2 sm:grid-cols-2 sm:px-0 lg:grid-cols-3">
+              {questionGroups.map((questionGroup) => {
+                return (
+                  <HeroRoadmap
+                    percentageDone={0}
+                    key={questionGroup.id}
+                    resourceId={questionGroup.id}
+                    resourceType="roadmap"
+                    resourceTitle={questionGroup.frontmatter.briefTitle}
+                    url={`/questions/${questionGroup.id}`}
+                    allowFavorite={false}
+                    isNew={questionGroup.frontmatter.isNew}
+                  />
+                );
+              })}
+            </div>
+          </div>
         </div>
-      </a>
+      </div>
 
-      {externalLinkHref && (
-        <a
-          href={externalLinkHref}
-          className="absolute right-1 top-1 flex items-center gap-1.5 rounded-md bg-gray-200 p-1 px-2 text-xs text-gray-600 hover:bg-gray-300 hover:text-black"
-        >
-          {ExternalLinkIcon && <ExternalLinkIcon className="size-3" />}
-          {externalLinkText}
-        </a>
-      )}
+      <div className="grid grid-cols-1 gap-5 bg-gray-50 px-4 py-5 sm:gap-16 sm:px-0 sm:py-16">
+        <FeaturedGuideList
+          heading="Guides"
+          guides={guides}
+          questions={questionGroups
+            .filter((questionGroup) => questionGroup.frontmatter.authorId)
+            .slice(0, 7)}
+        />
+        <FeaturedVideoList heading="Videos" videos={videos} />
+      </div>
     </div>
   );
 }
-
-function DashboardCardSkeleton() {
-  return (
-    <div className="h-[128px] animate-pulse rounded-lg border border-gray-300 bg-white"></div>
-  );
-}
diff --git a/src/components/FeatureAnnouncement.tsx b/src/components/FeatureAnnouncement.tsx
index 107886a69..de39adc7b 100644
--- a/src/components/FeatureAnnouncement.tsx
+++ b/src/components/FeatureAnnouncement.tsx
@@ -6,80 +6,24 @@ import { isMobileScreen } from '../lib/is-mobile.ts';
 type FeatureAnnouncementProps = {};
 
 export function FeatureAnnouncement(props: FeatureAnnouncementProps) {
-  const [isPlaying, setIsPlaying] = useState(false);
-
-  const videoModal = (
-    <Modal
-      onClose={() => setIsPlaying(false)}
-      bodyClassName={'h-auto overflow-hidden'}
-      wrapperClassName={'md:max-w-3xl lg:max-w-4xl xl:max-w-5xl'}
-    >
-      <div className="text-balance bg-gradient-to-r from-gray-100 px-4 py-2 text-left text-sm md:py-3 lg:text-base">
-        <span
-          className="relative -top-px mr-1.5 rounded bg-blue-300 px-1.5 py-0.5 text-xs font-semibold uppercase text-gray-800"
-          style={{ lineHeight: '1.5' }}
-        >
-          New
-        </span>
-        Projects are live on the{' '}
-        <a
-          href={'/projects'}
-          className="font-medium text-blue-500 underline underline-offset-2"
-        >
-          several of our roadmaps
-        </a>
-        <span className={'hidden md:inline'}>
-          {' '}
-          and are coming soon on the others
-        </span>
-        <PartyPopper className="relative -top-[3px] ml-2 inline-block h-5 w-5 text-blue-500 md:ml-1 md:h-6 md:w-6" />
-      </div>
-      <div
-        className="iframe-container"
-        style={{
-          position: 'relative',
-          paddingBottom: '56.25%',
-          height: 0,
-          overflow: 'hidden',
-        }}
-      >
-        {/*https://www.youtube.com/embed/?playsinline=1&disablekb=1&&iv_load_policy=3&cc_load_policy=0&controls=0&rel=0&autoplay=1&mute=1&origin=https%3A%2F%2Fytch.xyz&widgetid=1*/}
-        <iframe
-          src="https://www.youtube.com/embed/9lS3slfJ0x0?start=31&autoplay=1&disablekb=1&rel=0&cc_load_policy=0&rel=0&autoplay=1&origin=https%3A%2F%2Froadmap.sh&widgetid=1&showinfo=0"
-          allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
-          allowFullScreen
-          style={{
-            position: 'absolute',
-            top: 0,
-            left: 0,
-            width: '100%',
-            height: '100%',
-          }}
-        />
-      </div>
-    </Modal>
-  );
-
+  return null;
   return (
     <>
-      {isPlaying && videoModal}
-      <button
+      <a
         className="rounded-md border border-dashed border-purple-600 px-3 py-1.5 text-purple-400 transition-colors hover:border-purple-400 hover:text-purple-200"
-        onClick={() => {
-          setIsPlaying(true);
-        }}
+        href="/courses/sql"
       >
         <span className="relative sm:-top-[1px] mr-1 text-xs font-semibold uppercase text-white">
-          <PlayCircle className="inline-block h-4 w-4 relative -top-[2px] mr-1" />
-          Watch
+          <PartyPopper className="inline-block h-4 w-4 relative -top-[2px] mr-1" />
+          Courses
         </span>{' '}
         <span className={'hidden sm:inline'}>
-          Practice your skills with projects
+          Our first paid course about SQL is now live!
         </span>
         <span className={'inline text-sm sm:hidden'}>
-          Build projects to skill up
+          Our SQL course is now live!
         </span>
-      </button>
+      </a>
     </>
   );
 }
diff --git a/src/components/FeaturedGuides.astro b/src/components/FeaturedGuides.astro
deleted file mode 100644
index 4f0fe733e..000000000
--- a/src/components/FeaturedGuides.astro
+++ /dev/null
@@ -1,47 +0,0 @@
----
-import type { GuideFileType } from '../lib/guide';
-import GuideListItem from './GuideListItem.astro';
-import { QuestionGroupType } from '../lib/question-group';
-
-export interface Props {
-  heading: string;
-  guides: GuideFileType[];
-  questions: QuestionGroupType[];
-}
-
-const { heading, guides, questions = [] } = Astro.props;
-
-const sortedGuides: (QuestionGroupType | GuideFileType)[] = [
-  ...guides,
-  ...questions,
-].sort((a, b) => {
-  const aDate = new Date(a.frontmatter.date);
-  const bDate = new Date(b.frontmatter.date);
-
-  return bDate.getTime() - aDate.getTime();
-});
----
-
-<div class='container'>
-  <h2 class='block text-2xl font-bold sm:text-3xl'>{heading}</h2>
-
-  <div class='mt-3 sm:my-5'>
-    {sortedGuides.map((guide) => <GuideListItem guide={guide} />)}
-  </div>
-
-  <a
-    href='/guides'
-    class='hidden rounded-full bg-gradient-to-r from-slate-600 to-black px-3 py-2 text-xs font-medium text-white transition-colors hover:from-blue-600 hover:to-blue-800 sm:inline'
-  >
-    View All Guides &rarr;
-  </a>
-
-  <div class='mt-3 block sm:hidden'>
-    <a
-      href='/guides'
-      class='font-regular block rounded-md border border-black p-2 text-center text-sm text-black hover:bg-black hover:text-gray-50'
-    >
-      View All Guides &nbsp;&rarr;
-    </a>
-  </div>
-</div>
diff --git a/src/components/FeaturedGuides/FeaturedGuideList.tsx b/src/components/FeaturedGuides/FeaturedGuideList.tsx
new file mode 100644
index 000000000..15427f2d9
--- /dev/null
+++ b/src/components/FeaturedGuides/FeaturedGuideList.tsx
@@ -0,0 +1,51 @@
+import type { GuideFileType } from '../../lib/guide';
+import type { QuestionGroupType } from '../../lib/question-group';
+import { GuideListItem } from './GuideListItem';
+
+export interface FeaturedGuidesProps {
+  heading: string;
+  guides: GuideFileType[];
+  questions: QuestionGroupType[];
+}
+
+export function FeaturedGuideList(props: FeaturedGuidesProps) {
+  const { heading, guides, questions = [] } = props;
+
+  const sortedGuides: (QuestionGroupType | GuideFileType)[] = [
+    ...guides,
+    ...questions,
+  ].sort((a, b) => {
+    const aDate = new Date(a.frontmatter.date as string);
+    const bDate = new Date(b.frontmatter.date as string);
+
+    return bDate.getTime() - aDate.getTime();
+  });
+
+  return (
+    <div className="container">
+      <h2 className="block text-2xl font-bold sm:text-3xl">{heading}</h2>
+
+      <div className="mt-3 sm:my-5">
+        {sortedGuides.map((guide) => (
+          <GuideListItem key={guide.id} guide={guide} />
+        ))}
+      </div>
+
+      <a
+        href="/guides"
+        className="hidden rounded-full bg-gradient-to-r from-slate-600 to-black px-3 py-2 text-xs font-medium text-white transition-colors hover:from-blue-600 hover:to-blue-800 sm:inline"
+      >
+        View All Guides &rarr;
+      </a>
+
+      <div className="mt-3 block sm:hidden">
+        <a
+          href="/guides"
+          className="font-regular block rounded-md border border-black p-2 text-center text-sm text-black hover:bg-black hover:text-gray-50"
+        >
+          View All Guides &nbsp;&rarr;
+        </a>
+      </div>
+    </div>
+  );
+} 
\ No newline at end of file
diff --git a/src/components/FeaturedGuides/GuideListItem.tsx b/src/components/FeaturedGuides/GuideListItem.tsx
new file mode 100644
index 000000000..70cafebce
--- /dev/null
+++ b/src/components/FeaturedGuides/GuideListItem.tsx
@@ -0,0 +1,57 @@
+import type { GuideFileType, GuideFrontmatter } from '../../lib/guide';
+import { type QuestionGroupType } from '../../lib/question-group';
+
+export interface GuideListItemProps {
+  guide: GuideFileType | QuestionGroupType;
+}
+
+function isQuestionGroupType(
+  guide: GuideFileType | QuestionGroupType,
+): guide is QuestionGroupType {
+  return (guide as QuestionGroupType).questions !== undefined;
+}
+
+export function GuideListItem(props: GuideListItemProps) {
+  const { guide } = props;
+  const { frontmatter, id } = guide;
+
+  let pageUrl = '';
+  let guideType = '';
+
+  if (isQuestionGroupType(guide)) {
+    pageUrl = `/questions/${id}`;
+    guideType = 'Questions';
+  } else {
+    const excludedBySlug = (frontmatter as GuideFrontmatter).excludedBySlug;
+    pageUrl = excludedBySlug ? excludedBySlug : `/guides/${id}`;
+    guideType = (frontmatter as GuideFrontmatter).type;
+  }
+
+  return (
+    <a
+      className="text-md group block flex items-center justify-between border-b py-2 text-gray-600 no-underline hover:text-blue-600"
+      href={pageUrl}
+    >
+      <span className="text-sm transition-transform group-hover:translate-x-2 md:text-base">
+        {frontmatter.title}
+
+        {frontmatter.isNew && (
+          <span className="ml-2.5 rounded-sm bg-green-300 px-1.5 py-0.5 text-xs font-medium uppercase text-green-900">
+            New
+            <span className="hidden sm:inline">
+              &nbsp;&middot;&nbsp;
+              {new Date(frontmatter.date || '').toLocaleString('default', {
+                month: 'long',
+              })}
+            </span>
+          </span>
+        )}
+      </span>
+      <span className="hidden text-xs capitalize text-gray-500 sm:block">
+        {guideType}
+      </span>
+
+      <span className="block text-xs text-gray-400 sm:hidden"> &raquo;</span>
+    </a>
+  );
+}
diff --git a/src/components/FeaturedVideos.astro b/src/components/FeaturedVideos.astro
deleted file mode 100644
index dbd70b792..000000000
--- a/src/components/FeaturedVideos.astro
+++ /dev/null
@@ -1,35 +0,0 @@
----
-import type { VideoFileType } from '../lib/video';
-import VideoListItem from './VideoListItem.astro';
-
-export interface Props {
-  heading: string;
-  videos: VideoFileType[];
-}
-
-const { heading, videos } = Astro.props;
----
-
-<div class='container'>
-  <h2 class='text-2xl sm:text-3xl font-bold block'>{heading}</h2>
-
-  <div class='mt-3 sm:my-5'>
-    {videos.map((video) => <VideoListItem video={video} />)}
-  </div>
-
-  <a
-    href='/videos'
-    class='hidden sm:inline transition-colors py-2 px-3 text-xs font-medium rounded-full bg-gradient-to-r from-slate-600 to-black hover:from-blue-600 hover:to-blue-800 text-white'
-  >
-    View All Videos &rarr;
-  </a>
-
-  <div class='block sm:hidden mt-3'>
-    <a
-      href='/videos'
-      class='text-sm font-regular block p-2 border border-black text-black rounded-md text-center hover:bg-black hover:text-gray-50'
-    >
-      View All Videos &nbsp;&rarr;
-    </a>
-  </div>
-</div>
\ No newline at end of file
diff --git a/src/components/FeaturedVideos/FeaturedVideoList.tsx b/src/components/FeaturedVideos/FeaturedVideoList.tsx
new file mode 100644
index 000000000..4001c8241
--- /dev/null
+++ b/src/components/FeaturedVideos/FeaturedVideoList.tsx
@@ -0,0 +1,39 @@
+import type { VideoFileType } from '../../lib/video';
+import { VideoListItem } from './VideoListItem';
+
+export interface FeaturedVideoListProps {
+  heading: string;
+  videos: VideoFileType[];
+}
+
+export function FeaturedVideoList(props: FeaturedVideoListProps) {
+  const { heading, videos } = props;
+
+  return (
+    <div className="container">
+      <h2 className="block text-2xl font-bold sm:text-3xl">{heading}</h2>
+
+      <div className="mt-3 sm:my-5">
+        {videos.map((video) => (
+          <VideoListItem key={video.id} video={video} />
+        ))}
+      </div>
+
+      <a
+        href="/videos"
+        className="hidden rounded-full bg-gradient-to-r from-slate-600 to-black px-3 py-2 text-xs font-medium text-white transition-colors hover:from-blue-600 hover:to-blue-800 sm:inline"
+      >
+        View All Videos &rarr;
+      </a>
+
+      <div className="mt-3 block sm:hidden">
+        <a
+          href="/videos"
+          className="font-regular block rounded-md border border-black p-2 text-center text-sm text-black hover:bg-black hover:text-gray-50"
+        >
+          View All Videos &nbsp;&rarr;
+        </a>
+      </div>
+    </div>
+  );
+}
diff --git a/src/components/FeaturedVideos/VideoListItem.tsx b/src/components/FeaturedVideos/VideoListItem.tsx
new file mode 100644
index 000000000..31aa4bd67
--- /dev/null
+++ b/src/components/FeaturedVideos/VideoListItem.tsx
@@ -0,0 +1,38 @@
+import type { VideoFileType } from '../../lib/video';
+
+export interface VideoListItemProps {
+  video: VideoFileType;
+}
+
+export function VideoListItem(props: VideoListItemProps) {
+  const { video } = props;
+  const { frontmatter, id } = video;
+
+  return (
+    <a
+      className="block no-underline py-2 group text-md items-center text-gray-600 hover:text-blue-600 flex justify-between border-b"
+      href={`/videos/${id}`}
+    >
+      <span className="group-hover:translate-x-2 transition-transform">
+        {frontmatter.title}
+
+        {frontmatter.isNew && (
+          <span className="bg-green-300 text-green-900 text-xs font-medium px-1.5 py-0.5 rounded-sm uppercase ml-1.5">
+            New
+            <span className="hidden sm:inline">
+              &middot;
+              {new Date(frontmatter.date).toLocaleString('default', {
+                month: 'long',
+              })}
+            </span>
+          </span>
+        )}
+      </span>
+      <span className="capitalize text-gray-500 text-xs hidden sm:block">
+        {frontmatter.duration}
+      </span>
+
+      <span className="text-gray-400 text-xs block sm:hidden"> &raquo;</span>
+    </a>
+  );
+} 
\ No newline at end of file
diff --git a/src/components/GenerateCourse/AICourse.tsx b/src/components/GenerateCourse/AICourse.tsx
new file mode 100644
index 000000000..3443d7da6
--- /dev/null
+++ b/src/components/GenerateCourse/AICourse.tsx
@@ -0,0 +1,172 @@
+import { SearchIcon, WandIcon } from 'lucide-react';
+import { useEffect, useState } from 'react';
+import { cn } from '../../lib/classname';
+import { isLoggedIn } from '../../lib/jwt';
+import { showLoginPopup } from '../../lib/popup';
+import { UserCoursesList } from './UserCoursesList';
+import { FineTuneCourse } from './FineTuneCourse';
+import {
+  clearFineTuneData,
+  getCourseFineTuneData,
+  getLastSessionId,
+  storeFineTuneData,
+} from '../../lib/ai';
+
+export const difficultyLevels = [
+  'beginner',
+  'intermediate',
+  'advanced',
+] as const;
+export type DifficultyLevel = (typeof difficultyLevels)[number];
+
+type AICourseProps = {};
+
+export function AICourse(props: AICourseProps) {
+  const [keyword, setKeyword] = useState('');
+  const [difficulty, setDifficulty] = useState<DifficultyLevel>('beginner');
+
+  const [hasFineTuneData, setHasFineTuneData] = useState(false);
+  const [about, setAbout] = useState('');
+  const [goal, setGoal] = useState('');
+  const [customInstructions, setCustomInstructions] = useState('');
+
+  useEffect(() => {
+    const lastSessionId = getLastSessionId();
+    if (!lastSessionId) {
+      return;
+    }
+
+    const fineTuneData = getCourseFineTuneData(lastSessionId);
+    if (!fineTuneData) {
+      return;
+    }
+
+    setAbout(fineTuneData.about);
+    setGoal(fineTuneData.goal);
+    setCustomInstructions(fineTuneData.customInstructions);
+  }, []);
+
+  const handleKeyDown = (e: React.KeyboardEvent) => {
+    if (e.key === 'Enter' && keyword.trim()) {
+      onSubmit();
+    }
+  };
+
+  function onSubmit() {
+    if (!isLoggedIn()) {
+      showLoginPopup();
+      return;
+    }
+
+    let sessionId = '';
+    if (hasFineTuneData) {
+      clearFineTuneData();
+      sessionId = storeFineTuneData({
+        about,
+        goal,
+        customInstructions,
+      });
+    }
+
+    window.location.href = `/ai-tutor/search?term=${encodeURIComponent(keyword)}&difficulty=${difficulty}&id=${sessionId}`;
+  }
+
+  return (
+    <section className="flex flex-grow flex-col bg-gray-100">
+      <div className="container mx-auto flex max-w-3xl flex-col py-24 max-sm:py-4">
+        <h1 className="mb-2.5 text-center text-4xl font-bold max-sm:mb-2 max-sm:text-left max-sm:text-xl">
+          Learn anything with AI
+        </h1>
+        <p className="mb-6 text-center text-lg text-gray-600 max-sm:hidden max-sm:text-left max-sm:text-sm">
+          Enter a topic below to generate a personalized course for it
+        </p>
+
+        <div className="rounded-lg border border-gray-200 bg-white p-6 max-sm:p-4">
+          <form
+            className="flex flex-col gap-5"
+            onSubmit={(e) => {
+              e.preventDefault();
+              onSubmit();
+            }}
+          >
+            <div className="flex flex-col">
+              <label
+                htmlFor="keyword"
+                className="mb-2.5 text-sm font-medium text-gray-700"
+              >
+                Course Topic
+              </label>
+              <div className="relative">
+                <div className="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400">
+                  <SearchIcon size={18} />
+                </div>
+                <input
+                  id="keyword"
+                  type="text"
+                  value={keyword}
+                  onChange={(e) => setKeyword(e.target.value)}
+                  onKeyDown={handleKeyDown}
+                  placeholder="e.g., Algebra, JavaScript, Photography"
+                  className="w-full rounded-md border border-gray-300 bg-white p-3 pl-10 text-gray-900 focus:outline-none focus:ring-1 focus:ring-gray-500 max-sm:placeholder:text-base"
+                  maxLength={50}
+                />
+              </div>
+            </div>
+
+            <div className="flex flex-col">
+              <label className="mb-2.5 text-sm font-medium text-gray-700">
+                Difficulty Level
+              </label>
+              <div className="flex gap-2 max-sm:flex-col max-sm:gap-1">
+                {difficultyLevels.map((level) => (
+                  <button
+                    key={level}
+                    type="button"
+                    onClick={() => setDifficulty(level)}
+                    className={cn(
+                      'rounded-md border px-4 py-2 capitalize max-sm:text-sm',
+                      difficulty === level
+                        ? 'border-gray-800 bg-gray-800 text-white'
+                        : 'border-gray-200 bg-gray-100 text-gray-700 hover:bg-gray-200',
+                    )}
+                  >
+                    {level}
+                  </button>
+                ))}
+              </div>
+            </div>
+
+            <FineTuneCourse
+              hasFineTuneData={hasFineTuneData}
+              setHasFineTuneData={setHasFineTuneData}
+              about={about}
+              goal={goal}
+              customInstructions={customInstructions}
+              setAbout={setAbout}
+              setGoal={setGoal}
+              setCustomInstructions={setCustomInstructions}
+            />
+
+            <button
+              type="submit"
+              disabled={!keyword.trim()}
+              className={cn(
+                'mt-2 flex items-center justify-center rounded-md px-4 py-2 font-medium text-white transition-colors max-sm:text-sm',
+                !keyword.trim()
+                  ? 'cursor-not-allowed bg-gray-400'
+                  : 'bg-black hover:bg-gray-800',
+              )}
+            >
+              <WandIcon size={18} className="mr-2" />
+              Generate Course
+            </button>
+          </form>
+        </div>
+
+        <div className="mt-8 min-h-[200px]">
+          <UserCoursesList />
+        </div>
+      </div>
+    </section>
+  );
+}
diff --git a/src/components/GenerateCourse/AICourseActions.tsx b/src/components/GenerateCourse/AICourseActions.tsx
new file mode 100644
index 000000000..a33b219fc
--- /dev/null
+++ b/src/components/GenerateCourse/AICourseActions.tsx
@@ -0,0 +1,116 @@
+import { MoreVertical, Play, Trash2 } from 'lucide-react';
+import { useRef, useState } from 'react';
+import { useOutsideClick } from '../../hooks/use-outside-click';
+import { useKeydown } from '../../hooks/use-keydown';
+import { useToast } from '../../hooks/use-toast';
+import { useMutation } from '@tanstack/react-query';
+import { queryClient } from '../../stores/query-client';
+import { httpDelete } from '../../lib/query-http';
+
+type AICourseActionsType = {
+  courseSlug: string;
+  onDeleted?: () => void;
+};
+
+export function AICourseActions(props: AICourseActionsType) {
+  const { courseSlug, onDeleted } = props;
+
+  const toast = useToast();
+  const dropdownRef = useRef<HTMLDivElement>(null);
+
+  const [isOpen, setIsOpen] = useState(false);
+  const [isConfirming, setIsConfirming] = useState(false);
+
+  const { mutate: deleteCourse, isPending: isDeleting } = useMutation(
+    {
+      mutationFn: async () => {
+        return httpDelete(`/v1-delete-ai-course/${courseSlug}`);
+      },
+      onSuccess: () => {
+        toast.success('Course deleted');
+        queryClient.invalidateQueries({
+          predicate: (query) => query.queryKey?.[0] === 'user-ai-courses',
+        });
+        onDeleted?.();
+      },
+      onError: (error) => {
+        toast.error(error?.message || 'Failed to delete course');
+      },
+    },
+    queryClient,
+  );
+
+  useOutsideClick(dropdownRef, () => {
+    setIsOpen(false);
+  });
+
+  useKeydown('Escape', () => {
+    setIsOpen(false);
+  });
+
+  return (
+    <div className="relative h-full" ref={dropdownRef}>
+      <button
+        className="h-full text-gray-400 hover:text-gray-700"
+        onClick={(e) => {
+          e.stopPropagation();
+          setIsOpen(!isOpen);
+        }}
+      >
+        <MoreVertical size={16} />
+      </button>
+
+      {isOpen && (
+        <div className="absolute right-0 top-8 z-10 w-48 overflow-hidden rounded-md border border-gray-200 bg-white shadow-lg">
+          <a
+            href={`/ai-tutor/${courseSlug}`}
+            className="flex w-full items-center gap-1.5 p-2 text-sm font-medium text-gray-500 hover:bg-gray-100 hover:text-black disabled:cursor-not-allowed disabled:opacity-70"
+          >
+            <Play className="h-3.5 w-3.5" />
+            Start Course
+          </a>
+          {!isConfirming && (
+            <button
+              className="flex w-full items-center gap-1.5 p-2 text-sm font-medium text-gray-500 hover:bg-gray-100 hover:text-black disabled:cursor-not-allowed disabled:opacity-70"
+              onClick={() => setIsConfirming(true)}
+              disabled={isDeleting}
+            >
+              {!isDeleting ? (
+                <>
+                  <Trash2 className="h-3.5 w-3.5" />
+                  Delete Course
+                </>
+              ) : (
+                'Deleting...'
+              )}
+            </button>
+          )}
+
+          {isConfirming && (
+            <span className="flex w-full items-center justify-between gap-1.5 p-2 text-sm font-medium text-gray-500 hover:bg-gray-100 hover:text-black disabled:cursor-not-allowed disabled:opacity-70">
+              Are you sure?
+              <div className="flex items-center gap-2">
+                <button
+                  onClick={() => {
+                    setIsConfirming(false);
+                    deleteCourse();
+                  }}
+                  disabled={isDeleting}
+                  className="text-red-500 underline hover:text-red-800"
+                >
+                  Yes
+                </button>
+                <button
+                  onClick={() => setIsConfirming(false)}
+                  className="text-red-500 underline hover:text-red-800"
+                >
+                  No
+                </button>
+              </div>
+            </span>
+          )}
+        </div>
+      )}
+    </div>
+  );
+}
diff --git a/src/components/GenerateCourse/AICourseCard.tsx b/src/components/GenerateCourse/AICourseCard.tsx
new file mode 100644
index 000000000..5528232c9
--- /dev/null
+++ b/src/components/GenerateCourse/AICourseCard.tsx
@@ -0,0 +1,82 @@
+import type { AICourseWithLessonCount } from '../../queries/ai-course';
+import type { DifficultyLevel } from './AICourse';
+import { BookOpen } from 'lucide-react';
+import { AICourseActions } from './AICourseActions';
+
+type AICourseCardProps = {
+  course: AICourseWithLessonCount;
+};
+
+export function AICourseCard(props: AICourseCardProps) {
+  const { course } = props;
+
+  // Format date if available
+  const formattedDate = course.createdAt
+    ? new Date(course.createdAt).toLocaleDateString('en-US', {
+        month: 'short',
+        day: 'numeric',
+      })
+    : null;
+
+  // Map difficulty to color
+  const difficultyColor =
+    {
+      beginner: 'text-green-700',
+      intermediate: 'text-blue-700',
+      advanced: 'text-purple-700',
+    }[course.difficulty as DifficultyLevel] || 'text-gray-700';
+
+  // Calculate progress percentage
+  const totalTopics = course.lessonCount || 0;
+  const completedTopics = course.done?.length || 0;
+  const progressPercentage =
+    totalTopics > 0 ? Math.round((completedTopics / totalTopics) * 100) : 0;
+
+  return (
+    <div className="relative">
+      <a
+        href={`/ai-tutor/${course.slug}`}
+        className="hover:border-gray-3 00 group relative flex w-full flex-col overflow-hidden rounded-lg border border-gray-200 bg-white p-4 text-left transition-all hover:bg-gray-50"
+      >
+        <div className="flex items-center justify-between">
+          <span
+            className={`rounded-full text-xs font-medium capitalize opacity-80 ${difficultyColor}`}
+          >
+            {course.difficulty}
+          </span>
+        </div>
+
+        <h3 className="my-2 text-base font-semibold text-gray-900">
+          {course.title}
+        </h3>
+
+        <div className="mt-auto flex items-center justify-between pt-2">
+          <div className="flex items-center text-xs text-gray-600">
+            <BookOpen className="mr-1 h-3.5 w-3.5" />
+            <span>{totalTopics} lessons</span>
+          </div>
+
+          {totalTopics > 0 && (
+            <div className="flex items-center">
+              <div className="mr-2 h-1.5 w-16 overflow-hidden rounded-full bg-gray-200">
+                <div
+                  className="h-full rounded-full bg-blue-600"
+                  style={{ width: `${progressPercentage}%` }}
+                />
+              </div>
+              <span className="text-xs font-medium text-gray-700">
+                {progressPercentage}%
+              </span>
+            </div>
+          )}
+        </div>
+      </a>
+
+      {course.slug && (
+        <div className="absolute right-2 top-2">
+          <AICourseActions courseSlug={course.slug} />
+        </div>
+      )}
+    </div>
+  );
+}
diff --git a/src/components/GenerateCourse/AICourseContent.tsx b/src/components/GenerateCourse/AICourseContent.tsx
new file mode 100644
index 000000000..a2ada7ad9
--- /dev/null
+++ b/src/components/GenerateCourse/AICourseContent.tsx
@@ -0,0 +1,533 @@
+import {
+  BookOpenCheck,
+  ChevronLeft,
+  CircleAlert,
+  CircleOff,
+  Loader2,
+  Menu,
+  Play,
+  X,
+} from 'lucide-react';
+import { useState } from 'react';
+import { type AiCourse } from '../../lib/ai';
+import { cn } from '../../lib/classname';
+import { slugify } from '../../lib/slugger';
+import { useIsPaidUser } from '../../queries/billing';
+import { UpgradeAccountModal } from '../Billing/UpgradeAccountModal';
+import { CheckIcon } from '../ReactIcons/CheckIcon';
+import { ErrorIcon } from '../ReactIcons/ErrorIcon';
+import { AICourseLesson } from './AICourseLesson';
+import { AICourseLimit } from './AICourseLimit';
+import { AICourseSidebarModuleList } from './AICourseSidebarModuleList';
+import { AILimitsPopup } from './AILimitsPopup';
+import { RegenerateOutline } from './RegenerateOutline';
+
+type AICourseContentProps = {
+  courseSlug?: string;
+  course: AiCourse;
+  isLoading: boolean;
+  error?: string;
+  onRegenerateOutline: (prompt?: string) => void;
+};
+
+export function AICourseContent(props: AICourseContentProps) {
+  const { course, courseSlug, isLoading, error, onRegenerateOutline } = props;
+
+  const [showUpgradeModal, setShowUpgradeModal] = useState(false);
+  const [showAILimitsPopup, setShowAILimitsPopup] = useState(false);
+
+  const [activeModuleIndex, setActiveModuleIndex] = useState(0);
+  const [activeLessonIndex, setActiveLessonIndex] = useState(0);
+  const [sidebarOpen, setSidebarOpen] = useState(false);
+  const [viewMode, setViewMode] = useState<'module' | 'outline'>('outline');
+
+  const { isPaidUser } = useIsPaidUser();
+
+  const aiCourseProgress = course.done || [];
+
+  const [expandedModules, setExpandedModules] = useState<
+    Record<number, boolean>
+  >({});
+
+  const goToNextModule = () => {
+    if (activeModuleIndex >= course.modules.length) {
+      return;
+    }
+
+    const nextModuleIndex = activeModuleIndex + 1;
+    setActiveModuleIndex(nextModuleIndex);
+    setActiveLessonIndex(0);
+
+    setExpandedModules((prev) => {
+      const newState: Record<number, boolean> = {};
+      course.modules.forEach((_, idx) => {
+        newState[idx] = false;
+      });
+
+      newState[nextModuleIndex] = true;
+      return newState;
+    });
+  };
+
+  const goToNextLesson = () => {
+    const currentModule = course.modules[activeModuleIndex];
+    if (currentModule && activeLessonIndex < currentModule.lessons.length - 1) {
+      setActiveLessonIndex(activeLessonIndex + 1);
+    } else {
+      goToNextModule();
+    }
+  };
+
+  const goToPrevLesson = () => {
+    if (activeLessonIndex > 0) {
+      setActiveLessonIndex(activeLessonIndex - 1);
+      return;
+    }
+
+    const prevModule = course.modules[activeModuleIndex - 1];
+    if (!prevModule) {
+      return;
+    }
+
+    const prevModuleIndex = activeModuleIndex - 1;
+    setActiveModuleIndex(prevModuleIndex);
+    setActiveLessonIndex(prevModule.lessons.length - 1);
+
+    // Expand the previous module in the sidebar
+    setExpandedModules((prev) => {
+      const newState: Record<number, boolean> = {};
+      // Set all modules to collapsed
+      course.modules.forEach((_, idx) => {
+        newState[idx] = false;
+      });
+      // Expand only the previous module
+      newState[prevModuleIndex] = true;
+      return newState;
+    });
+  };
+
+  const currentModule = course.modules[activeModuleIndex];
+  const currentLesson = currentModule?.lessons[activeLessonIndex];
+  const totalModules = course.modules.length;
+  const totalLessons = currentModule?.lessons.length || 0;
+
+  const totalCourseLessons = course.modules.reduce(
+    (total, module) => total + module.lessons.length,
+    0,
+  );
+
+  const totalDoneLessons = (course?.done || []).length;
+  const finishedPercentage = Math.round(
+    (totalDoneLessons / totalCourseLessons) * 100,
+  );
+
+  const modals = (
+    <>
+      {showUpgradeModal && (
+        <UpgradeAccountModal onClose={() => setShowUpgradeModal(false)} />
+      )}
+
+      {showAILimitsPopup && (
+        <AILimitsPopup
+          onClose={() => setShowAILimitsPopup(false)}
+          onUpgrade={() => {
+            setShowAILimitsPopup(false);
+            setShowUpgradeModal(true);
+          }}
+        />
+      )}
+    </>
+  );
+
+  if (error && !isLoading) {
+    const isLimitReached = error.includes('limit');
+    const isNotFound = error.includes('not exist');
+
+    let icon = <ErrorIcon additionalClasses="mb-4 size-16" />;
+    let title = 'Error occurred';
+    let message = error;
+
+    if (isLimitReached) {
+      icon = <CircleAlert className="mb-4 size-16 text-yellow-500" />;
+      title = 'Limit Reached';
+      message =
+        'You have reached the daily AI usage limit. Please upgrade your account to continue.';
+    } else if (isNotFound) {
+      icon = <CircleOff className="mb-4 size-16 text-gray-300" />;
+      title = 'Course Not Found';
+      message =
+        'The course you are looking for does not exist. Why not create your own course?';
+    }
+
+    const showUpgradeButton = isLimitReached && !isPaidUser;
+
+    return (
+      <>
+        {modals}
+        <div className="flex h-screen flex-col items-center justify-center px-4 text-center">
+          {icon}
+          <h1 className="mb-2 text-2xl font-bold">{title}</h1>
+          <p className="max-w-sm text-balance text-gray-500">{message}</p>
+
+          {showUpgradeButton && (
+            <div className="my-5">
+              <button
+                onClick={() => setShowUpgradeModal(true)}
+                className="rounded-md bg-yellow-400 px-6 py-2 text-sm font-medium text-black hover:bg-yellow-500"
+              >
+                Upgrade to remove Limits
+              </button>
+
+              <p className="mt-5 text-sm text-black">
+                <a
+                  href="/ai-tutor"
+                  className="font-medium underline underline-offset-2"
+                >
+                  Back to AI Tutor
+                </a>
+              </p>
+            </div>
+          )}
+
+          {(isNotFound || !showUpgradeButton) && (
+            <div className="my-5">
+              <a
+                href="/ai-tutor"
+                className="rounded-md bg-black px-6 py-2 text-sm font-medium text-white hover:bg-opacity-80"
+              >
+                Create a course with AI
+              </a>
+            </div>
+          )}
+        </div>
+      </>
+    );
+  }
+
+  const isViewingLesson = viewMode === 'module';
+
+  return (
+    <section className="flex h-screen flex-grow flex-col overflow-hidden bg-gray-50">
+      {modals}
+
+      <div className="border-b border-gray-200 bg-gray-100">
+        <div className="flex items-center justify-between px-4 py-2">
+          <a
+            href="/ai-tutor"
+            onClick={(e) => {
+              if (isViewingLesson) {
+                e.preventDefault();
+                setViewMode('outline');
+              }
+            }}
+            className="flex flex-row items-center gap-1.5 text-sm font-medium text-gray-700 hover:text-gray-900"
+            aria-label="Back to generator"
+          >
+            <ChevronLeft className="size-4" strokeWidth={2.5} />
+            Back {isViewingLesson ? 'to Outline' : 'to AI Tutor'}
+          </a>
+          <div className="flex items-center gap-2">
+            <div className="flex flex-row lg:hidden">
+              <AICourseLimit
+                onUpgrade={() => setShowUpgradeModal(true)}
+                onShowLimits={() => setShowAILimitsPopup(true)}
+              />
+            </div>
+
+            <button
+              onClick={() => setSidebarOpen(!sidebarOpen)}
+              className="flex items-center justify-center text-gray-400 shadow-sm transition-colors hover:bg-gray-50 hover:text-gray-900 lg:hidden"
+            >
+              {sidebarOpen ? (
+                <X size={17} strokeWidth={3} />
+              ) : (
+                <Menu size={17} strokeWidth={3} />
+              )}
+            </button>
+          </div>
+        </div>
+      </div>
+      <header className="flex items-center justify-between border-b border-gray-200 bg-white px-6 max-lg:py-4 lg:h-[80px]">
+        <div className="flex items-center">
+          <div className="flex flex-col">
+            <h1 className="text-balance text-xl font-bold !leading-tight text-gray-900 max-lg:mb-0.5 max-lg:text-lg">
+              {course.title || 'Loading Course...'}
+            </h1>
+            <div className="mt-1 flex flex-row items-center gap-2 text-sm text-gray-600 max-lg:text-xs">
+              <span className="font-medium">{totalModules} modules</span>
+              <span className="text-gray-400">•</span>
+              <span className="font-medium">{totalCourseLessons} lessons</span>
+              {viewMode === 'module' && (
+                <span className="flex flex-row items-center gap-1 lg:hidden">
+                  <span className="text-gray-400">•</span>
+                  <button
+                    className="underline underline-offset-2"
+                    onClick={() => {
+                      setExpandedModules({});
+                      setViewMode('outline');
+                    }}
+                  >
+                    View outline
+                  </button>
+                </span>
+              )}
+              {finishedPercentage > 0 && (
+                <>
+                  <span className="text-gray-400">•</span>
+                  <span className="font-medium text-green-600">
+                    {finishedPercentage}% complete
+                  </span>
+                </>
+              )}
+            </div>
+          </div>
+        </div>
+        <div className="flex gap-2">
+          <div className="hidden gap-2 lg:flex">
+            <AICourseLimit
+              onUpgrade={() => setShowUpgradeModal(true)}
+              onShowLimits={() => setShowAILimitsPopup(true)}
+            />
+          </div>
+
+          {viewMode === 'module' && (
+            <button
+              onClick={() => {
+                setExpandedModules({});
+                setViewMode('outline');
+              }}
+              className="flex flex-shrink-0 items-center rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 shadow-sm transition-colors hover:bg-gray-50 hover:text-gray-900 max-lg:hidden"
+            >
+              <BookOpenCheck size={18} className="mr-2" />
+              View Course Outline
+            </button>
+          )}
+        </div>
+      </header>
+
+      <div className="flex flex-1 overflow-hidden">
+        <aside
+          className={cn(
+            'fixed inset-y-0 left-0 z-20 w-80 transform overflow-y-auto border-r border-gray-200 bg-white transition-transform duration-200 ease-in-out lg:relative lg:mt-0 lg:translate-x-0',
+            sidebarOpen ? 'translate-x-0' : '-translate-x-full',
+          )}
+        >
+          <div
+            className={cn(
+              'relative flex min-h-[40px] items-center justify-between border-b border-gray-200 px-3',
+              isLoading && 'striped-loader bg-gray-50',
+            )}
+          >
+            {!isLoading && (
+              <div className="flex w-full items-center justify-between text-xs text-black">
+                <span>
+                  <span className="relative z-10 rounded-full bg-yellow-400 px-1.5 py-0.5">
+                    {finishedPercentage}%
+                  </span>{' '}
+                  <span className="relative z-10">Completed</span>
+                </span>
+                <span
+                  style={{
+                    width: `${finishedPercentage}%`,
+                  }}
+                  className={cn(
+                    'absolute bottom-0 left-0 top-0',
+                    'bg-gray-200/50',
+                  )}
+                ></span>
+
+                {viewMode !== 'outline' && (
+                  <button
+                    onClick={() => {
+                      setExpandedModules({});
+                      setViewMode('outline');
+                    }}
+                    className="flex items-center gap-1 rounded-md bg-gray-200 px-2.5 py-1.5 text-xs transition-colors hover:bg-gray-300"
+                  >
+                    <BookOpenCheck size={14} />
+                    View Outline
+                  </button>
+                )}
+
+                {viewMode === 'outline' && (
+                  <button
+                    onClick={() => {
+                      setExpandedModules({
+                        ...expandedModules,
+                        0: true,
+                      });
+                      setActiveModuleIndex(0);
+                      setActiveLessonIndex(0);
+                      setViewMode('module');
+                    }}
+                    className="flex items-center gap-1 rounded-md bg-gray-200 px-2.5 py-1.5 text-xs transition-colors hover:bg-gray-300"
+                  >
+                    <Play size={14} />
+                    Start Course
+                  </button>
+                )}
+              </div>
+            )}
+
+            <button
+              onClick={() => setSidebarOpen(false)}
+              className="rounded-md p-1 hover:bg-gray-100 lg:hidden"
+            >
+              <X size={18} />
+            </button>
+          </div>
+
+          <AICourseSidebarModuleList
+            course={course}
+            courseSlug={courseSlug}
+            activeModuleIndex={
+              viewMode === 'module' ? activeModuleIndex : undefined
+            }
+            setActiveModuleIndex={setActiveModuleIndex}
+            activeLessonIndex={
+              viewMode === 'module' ? activeLessonIndex : undefined
+            }
+            setActiveLessonIndex={setActiveLessonIndex}
+            setSidebarOpen={setSidebarOpen}
+            viewMode={viewMode}
+            setViewMode={setViewMode}
+            expandedModules={expandedModules}
+            setExpandedModules={setExpandedModules}
+            isLoading={isLoading}
+          />
+        </aside>
+
+        <main
+          className={cn(
+            'flex-1 overflow-y-auto p-6 transition-all duration-200 ease-in-out max-lg:p-3',
+            sidebarOpen ? 'lg:ml-0' : '',
+          )}
+        >
+          {viewMode === 'module' && (
+            <AICourseLesson
+              courseSlug={courseSlug!}
+              progress={aiCourseProgress}
+              activeModuleIndex={activeModuleIndex}
+              totalModules={totalModules}
+              currentModuleTitle={currentModule?.title || ''}
+              activeLessonIndex={activeLessonIndex}
+              totalLessons={totalLessons}
+              currentLessonTitle={currentLesson || ''}
+              onGoToPrevLesson={goToPrevLesson}
+              onGoToNextLesson={goToNextLesson}
+              key={`${courseSlug}-${activeModuleIndex}-${activeLessonIndex}`}
+              onUpgrade={() => setShowUpgradeModal(true)}
+            />
+          )}
+
+          {viewMode === 'outline' && (
+            <div className="mx-auto rounded-xl border border-gray-200 bg-white shadow-sm lg:max-w-3xl">
+              <div
+                className={cn(
+                  'relative mb-1 flex items-start justify-between border-b border-gray-100 p-6 max-lg:hidden',
+                  isLoading && 'striped-loader',
+                )}
+              >
+                <div>
+                  <h2 className="mb-1 text-balance text-2xl font-bold max-lg:text-lg max-lg:leading-tight">
+                    {course.title || 'Loading course ..'}
+                  </h2>
+                  <p className="text-sm capitalize text-gray-500">
+                    {course.title ? course.difficulty : 'Please wait ..'}
+                  </p>
+                </div>
+
+                {!isLoading && (
+                  <RegenerateOutline
+                    onRegenerateOutline={onRegenerateOutline}
+                  />
+                )}
+              </div>
+              {course.title ? (
+                <div className="flex flex-col p-6 max-lg:mt-0.5 max-lg:p-4">
+                  {course.modules.map((courseModule, moduleIdx) => {
+                    return (
+                      <div
+                        key={moduleIdx}
+                        className="mb-5 pb-4 last:border-0 last:pb-0 max-lg:mb-2"
+                      >
+                        <h2 className="mb-4 text-xl font-bold text-gray-800 max-lg:mb-2 max-lg:text-lg max-lg:leading-tight">
+                          {courseModule.title}
+                        </h2>
+                        <div className="divide-y divide-gray-100">
+                          {courseModule.lessons.map((lesson, lessonIdx) => {
+                            const key = `${slugify(String(moduleIdx))}-${slugify(String(lessonIdx))}`;
+                            const isCompleted = aiCourseProgress.includes(key);
+
+                            return (
+                              <div
+                                key={key}
+                                className="flex cursor-pointer items-center gap-2 px-2 py-2.5 transition-colors hover:bg-gray-100 max-lg:px-0 max-lg:py-1.5"
+                                onClick={() => {
+                                  setActiveModuleIndex(moduleIdx);
+                                  setActiveLessonIndex(lessonIdx);
+                                  setExpandedModules((prev) => {
+                                    const newState: Record<number, boolean> =
+                                      {};
+                                    course.modules.forEach((_, idx) => {
+                                      newState[idx] = false;
+                                    });
+                                    newState[moduleIdx] = true;
+                                    return newState;
+                                  });
+
+                                  setSidebarOpen(false);
+                                  setViewMode('module');
+                                }}
+                              >
+                                {!isCompleted && (
+                                  <span
+                                    className={cn(
+                                      'flex size-6 flex-shrink-0 items-center justify-center rounded-full bg-gray-200 text-sm font-medium text-gray-800 max-lg:size-5 max-lg:text-xs',
+                                    )}
+                                  >
+                                    {lessonIdx + 1}
+                                  </span>
+                                )}
+
+                                {isCompleted && (
+                                  <CheckIcon additionalClasses="size-6 flex-shrink-0 text-green-500" />
+                                )}
+
+                                <p className="flex-1 truncate text-base text-gray-800 max-lg:text-sm">
+                                  {lesson.replace(/^Lesson\s*?\d+[\.:]\s*/, '')}
+                                </p>
+                                <span className="text-sm font-medium text-gray-700 max-lg:hidden">
+                                  {isCompleted ? 'View' : 'Start'} →
+                                </span>
+                              </div>
+                            );
+                          })}
+                        </div>
+                      </div>
+                    );
+                  })}
+                </div>
+              ) : (
+                <div className="flex h-64 items-center justify-center">
+                  <Loader2 size={36} className="animate-spin text-gray-300" />
+                </div>
+              )}
+            </div>
+          )}
+
+          <div className="mb-10 mt-5 mx-auto text-center text-sm text-gray-400">
+            AI can make mistakes, check imporant info.
+          </div>
+        </main>
+      </div>
+
+      {sidebarOpen && (
+        <div
+          className="fixed inset-0 z-10 bg-gray-900 bg-opacity-50 lg:hidden"
+          onClick={() => setSidebarOpen(false)}
+        ></div>
+      )}
+    </section>
+  );
+}
diff --git a/src/components/GenerateCourse/AICourseFollowUp.css b/src/components/GenerateCourse/AICourseFollowUp.css
new file mode 100644
index 000000000..a6b8a9bac
--- /dev/null
+++ b/src/components/GenerateCourse/AICourseFollowUp.css
@@ -0,0 +1,131 @@
+.prose ul li > code,
+.prose ol li > code,
+p code,
+a > code,
+strong > code,
+em > code,
+h1 > code,
+h2 > code,
+h3 > code {
+  background: #ebebeb !important;
+  color: currentColor !important;
+  font-size: 14px;
+  font-weight: normal !important;
+}
+
+.course-ai-content.course-content.prose ul li > code,
+.course-ai-content.course-content.prose ol li > code,
+.course-ai-content.course-content.prose p code,
+.course-ai-content.course-content.prose a > code,
+.course-ai-content.course-content.prose strong > code,
+.course-ai-content.course-content.prose em > code,
+.course-ai-content.course-content.prose h1 > code,
+.course-ai-content.course-content.prose h2 > code,
+.course-ai-content.course-content.prose h3 > code,
+.course-notes-content.prose ul li > code,
+.course-notes-content.prose ol li > code,
+.course-notes-content.prose p code,
+.course-notes-content.prose a > code,
+.course-notes-content.prose strong > code,
+.course-notes-content.prose em > code,
+.course-notes-content.prose h1 > code,
+.course-notes-content.prose h2 > code,
+.course-notes-content.prose h3 > code {
+  font-size: 12px !important;
+}
+
+.course-ai-content pre {
+  -ms-overflow-style: none;
+  scrollbar-width: none;
+}
+
+.course-ai-content pre::-webkit-scrollbar {
+  display: none;
+}
+
+.course-ai-content pre,
+.course-notes-content pre {
+  overflow: scroll;
+  font-size: 15px;
+  margin: 10px 0;
+}
+
+.prose ul li > code:before,
+p > code:before,
+.prose ul li > code:after,
+.prose ol li > code:before,
+p > code:before,
+.prose ol li > code:after,
+.course-content h1 > code:after,
+.course-content h1 > code:before,
+.course-content h2 > code:after,
+.course-content h2 > code:before,
+.course-content h3 > code:after,
+.course-content h3 > code:before,
+.course-content h4 > code:after,
+.course-content h4 > code:before,
+p > code:after,
+a > code:after,
+a > code:before {
+  content: '' !important;
+}
+
+.course-content.prose ul li > code,
+.course-content.prose ol li > code,
+.course-content p code,
+.course-content a > code,
+.course-content strong > code,
+.course-content em > code,
+.course-content h1 > code,
+.course-content h2 > code,
+.course-content h3 > code,
+.course-content table code {
+  background: #f4f4f5 !important;
+  border: 1px solid #282a36 !important;
+  color: #282a36 !important;
+  padding: 2px 4px;
+  border-radius: 5px;
+  font-size: 16px !important;
+  white-space: pre;
+  font-weight: normal;
+}
+
+.course-content blockquote {
+  font-style: normal;
+}
+
+.course-content.prose blockquote h1,
+.course-content.prose blockquote h2,
+.course-content.prose blockquote h3,
+.course-content.prose blockquote h4 {
+  font-style: normal;
+  margin-bottom: 8px;
+}
+
+.course-content.prose ul li > code:before,
+.course-content p > code:before,
+.course-content.prose ul li > code:after,
+.course-content p > code:after,
+.course-content h2 > code:after,
+.course-content h2 > code:before,
+.course-content table code:before,
+.course-content table code:after,
+.course-content a > code:after,
+.course-content a > code:before,
+.course-content h2 code:after,
+.course-content h2 code:before,
+.course-content h2 code:after,
+.course-content h2 code:before {
+  content: '' !important;
+}
+
+.course-content table {
+  border-collapse: collapse;
+  border: 1px solid black;
+  border-radius: 5px;
+}
+
+.course-content table td,
+.course-content table th {
+  padding: 5px 10px;
+}
diff --git a/src/components/GenerateCourse/AICourseFollowUp.tsx b/src/components/GenerateCourse/AICourseFollowUp.tsx
new file mode 100644
index 000000000..917d1d6f9
--- /dev/null
+++ b/src/components/GenerateCourse/AICourseFollowUp.tsx
@@ -0,0 +1,74 @@
+import { ArrowRightIcon, BotIcon } from 'lucide-react';
+import { useState } from 'react';
+import {
+  AICourseFollowUpPopover,
+  type AIChatHistoryType,
+} from './AICourseFollowUpPopover';
+import { UpgradeAccountModal } from '../Billing/UpgradeAccountModal';
+
+type AICourseFollowUpProps = {
+  courseSlug: string;
+  moduleTitle: string;
+  lessonTitle: string;
+};
+
+export function AICourseFollowUp(props: AICourseFollowUpProps) {
+  const { courseSlug, moduleTitle, lessonTitle } = props;
+
+  const [isOpen, setIsOpen] = useState(false);
+  const [showUpgradeModal, setShowUpgradeModal] = useState(false);
+
+  const [courseAIChatHistory, setCourseAIChatHistory] = useState<
+    AIChatHistoryType[]
+  >([
+    {
+      role: 'assistant',
+      content:
+        'Hey, I am your AI instructor. Here are some examples of what you can ask me about 🤖',
+      isDefault: true,
+    },
+  ]);
+
+  return (
+    <div className="relative">
+      <button
+        className="mt-4 flex w-full items-center gap-2 rounded-lg border border-yellow-300 bg-yellow-100 p-4 hover:bg-yellow-200 max-lg:mt-3 max-lg:text-sm"
+        onClick={() => setIsOpen(true)}
+      >
+        <BotIcon className="h-4 w-4" />
+        <span>Ask AI some follow up questions</span>
+
+        <ArrowRightIcon className="ml-auto h-4 w-4 max-sm:hidden" />
+      </button>
+
+      {showUpgradeModal && (
+        <UpgradeAccountModal onClose={() => setShowUpgradeModal(false)} />
+      )}
+
+      {isOpen && (
+        <AICourseFollowUpPopover
+          courseSlug={courseSlug}
+          moduleTitle={moduleTitle}
+          lessonTitle={lessonTitle}
+          courseAIChatHistory={courseAIChatHistory}
+          setCourseAIChatHistory={setCourseAIChatHistory}
+          onUpgradeClick={() => {
+            setIsOpen(false);
+            setShowUpgradeModal(true);
+          }}
+          onOutsideClick={() => {
+            if (!isOpen) {
+              return;
+            }
+
+            setIsOpen(false);
+          }}
+        />
+      )}
+
+      {isOpen && (
+        <div className="pointer-events-none fixed inset-0 z-50 bg-black/50" />
+      )}
+    </div>
+  );
+}
diff --git a/src/components/GenerateCourse/AICourseFollowUpPopover.tsx b/src/components/GenerateCourse/AICourseFollowUpPopover.tsx
new file mode 100644
index 000000000..de116546b
--- /dev/null
+++ b/src/components/GenerateCourse/AICourseFollowUpPopover.tsx
@@ -0,0 +1,390 @@
+import { useQuery } from '@tanstack/react-query';
+import {
+  BookOpen,
+  Bot,
+  Code,
+  Globe, Hammer,
+  HelpCircle,
+  LockIcon,
+  Send,
+} from 'lucide-react';
+import { useEffect, useMemo, useRef, useState, type FormEvent } from 'react';
+import { flushSync } from 'react-dom';
+import TextareaAutosize from 'react-textarea-autosize';
+import { useOutsideClick } from '../../hooks/use-outside-click';
+import { useToast } from '../../hooks/use-toast';
+import { readStream } from '../../lib/ai';
+import { cn } from '../../lib/classname';
+import { isLoggedIn, removeAuthToken } from '../../lib/jwt';
+import {
+  markdownToHtml,
+  markdownToHtmlWithHighlighting,
+} from '../../lib/markdown';
+import { getAiCourseLimitOptions } from '../../queries/ai-course';
+import { queryClient } from '../../stores/query-client';
+
+export type AllowedAIChatRole = 'user' | 'assistant';
+export type AIChatHistoryType = {
+  role: AllowedAIChatRole;
+  content: string;
+  isDefault?: boolean;
+  html?: string;
+};
+
+type AICourseFollowUpPopoverProps = {
+  courseSlug: string;
+  moduleTitle: string;
+  lessonTitle: string;
+
+  courseAIChatHistory: AIChatHistoryType[];
+  setCourseAIChatHistory: (value: AIChatHistoryType[]) => void;
+
+  onOutsideClick?: () => void;
+  onUpgradeClick: () => void;
+};
+
+export function AICourseFollowUpPopover(props: AICourseFollowUpPopoverProps) {
+  const {
+    courseSlug,
+    moduleTitle,
+    lessonTitle,
+    onOutsideClick,
+    onUpgradeClick,
+
+    courseAIChatHistory,
+    setCourseAIChatHistory,
+  } = props;
+
+  const toast = useToast();
+  const containerRef = useRef<HTMLDivElement | null>(null);
+  const scrollareaRef = useRef<HTMLDivElement | null>(null);
+
+  const [isStreamingMessage, setIsStreamingMessage] = useState(false);
+  const [message, setMessage] = useState('');
+  const [streamedMessage, setStreamedMessage] = useState('');
+
+  useOutsideClick(containerRef, onOutsideClick);
+
+  const { data: tokenUsage, isLoading } = useQuery(
+    getAiCourseLimitOptions(),
+    queryClient,
+  );
+
+  const isLimitExceeded = (tokenUsage?.used || 0) >= (tokenUsage?.limit || 0);
+
+  const handleChatSubmit = (e: FormEvent<HTMLFormElement>) => {
+    e.preventDefault();
+
+    const trimmedMessage = message.trim();
+    if (
+      !trimmedMessage ||
+      isStreamingMessage ||
+      !isLoggedIn() ||
+      isLimitExceeded ||
+      isLoading
+    ) {
+      return;
+    }
+
+    const newMessages: AIChatHistoryType[] = [
+      ...courseAIChatHistory,
+      {
+        role: 'user',
+        content: trimmedMessage,
+      },
+    ];
+
+    flushSync(() => {
+      setCourseAIChatHistory(newMessages);
+      setMessage('');
+    });
+
+    scrollToBottom();
+    completeCourseAIChat(newMessages);
+  };
+
+  const scrollToBottom = () => {
+    scrollareaRef.current?.scrollTo({
+      top: scrollareaRef.current.scrollHeight,
+      behavior: 'smooth',
+    });
+  };
+
+  const completeCourseAIChat = async (messages: AIChatHistoryType[]) => {
+    setIsStreamingMessage(true);
+
+    const response = await fetch(
+      `${import.meta.env.PUBLIC_API_URL}/v1-follow-up-ai-course/${courseSlug}`,
+      {
+        method: 'POST',
+        headers: {
+          'Content-Type': 'application/json',
+        },
+        credentials: 'include',
+        body: JSON.stringify({
+          moduleTitle,
+          lessonTitle,
+          messages: messages.slice(-10),
+        }),
+      },
+    );
+
+    if (!response.ok) {
+      const data = await response.json();
+
+      toast.error(data?.message || 'Something went wrong');
+      setCourseAIChatHistory([...messages].slice(0, messages.length - 1));
+      setIsStreamingMessage(false);
+
+      if (data.status === 401) {
+        removeAuthToken();
+        window.location.reload();
+      }
+    }
+
+    const reader = response.body?.getReader();
+
+    if (!reader) {
+      setIsStreamingMessage(false);
+      toast.error('Something went wrong');
+      return;
+    }
+
+    await readStream(reader, {
+      onStream: async (content) => {
+        flushSync(() => {
+          setStreamedMessage(content);
+        });
+
+        scrollToBottom();
+      },
+      onStreamEnd: async (content) => {
+        const newMessages: AIChatHistoryType[] = [
+          ...messages,
+          {
+            role: 'assistant',
+            content,
+            html: await markdownToHtmlWithHighlighting(content),
+          },
+        ];
+
+        flushSync(() => {
+          setStreamedMessage('');
+          setIsStreamingMessage(false);
+          setCourseAIChatHistory(newMessages);
+        });
+
+        queryClient.invalidateQueries(getAiCourseLimitOptions());
+        scrollToBottom();
+      },
+    });
+
+    setIsStreamingMessage(false);
+  };
+
+  useEffect(() => {
+    scrollToBottom();
+  }, []);
+
+  return (
+    <div
+      className="absolute bottom-0 left-0 z-[99] flex h-[500px] w-full flex-col overflow-hidden rounded-lg border border-gray-200 bg-white shadow"
+      ref={containerRef}
+    >
+      <div className="flex items-center justify-between gap-2 border-b border-gray-200 px-4 py-2 text-sm">
+        <h4 className="text-base font-medium">Course AI</h4>
+      </div>
+
+      <div
+        className="scrollbar-thumb-gray-300 scrollbar-track-transparent scrollbar-thin relative grow overflow-y-auto"
+        ref={scrollareaRef}
+      >
+        <div className="absolute inset-0 flex flex-col">
+          <div className="flex grow flex-col justify-end">
+            <div className="flex flex-col justify-end gap-2 px-3 py-2">
+              {courseAIChatHistory.map((chat, index) => {
+                return (
+                  <>
+                    <AIChatCard
+                      key={`chat-${index}`}
+                      role={chat.role}
+                      content={chat.content}
+                      html={chat.html}
+                    />
+
+                    {chat.isDefault && (
+                      <div className="mb-1 mt-0.5">
+                        <div className="grid grid-cols-2 gap-2">
+                          {capabilities.map((capability, index) => (
+                            <CapabilityCard
+                              key={`capability-${index}`}
+                              {...capability}
+                            />
+                          ))}
+                        </div>
+                      </div>
+                    )}
+                  </>
+                );
+              })}
+
+              {isStreamingMessage && !streamedMessage && (
+                <AIChatCard role="assistant" content="Thinking..." />
+              )}
+
+              {streamedMessage && (
+                <AIChatCard role="assistant" content={streamedMessage} />
+              )}
+            </div>
+          </div>
+        </div>
+      </div>
+
+      <form
+        className="relative flex items-start border-t border-gray-200 text-sm"
+        onSubmit={handleChatSubmit}
+      >
+        {isLimitExceeded && (
+          <div className="absolute inset-0 flex items-center justify-center gap-2 bg-black text-white">
+            <LockIcon className="size-4 cursor-not-allowed" strokeWidth={2.5} />
+            <p className="cursor-not-allowed">Limit reached for today</p>
+            <button
+              onClick={() => {
+                onUpgradeClick();
+              }}
+              className="rounded-md bg-white px-2 py-1 text-xs font-medium text-black hover:bg-gray-300"
+            >
+              Upgrade for more
+            </button>
+          </div>
+        )}
+        <TextareaAutosize
+          className="h-full min-h-[41px] grow resize-none bg-transparent px-4 py-2 focus:outline-none"
+          placeholder="Ask AI anything about the lesson..."
+          value={message}
+          onChange={(e) => setMessage(e.target.value)}
+          autoFocus={true}
+          onKeyDown={(e) => {
+            if (e.key === 'Enter' && !e.shiftKey) {
+              handleChatSubmit(e as unknown as FormEvent<HTMLFormElement>);
+            }
+          }}
+        />
+        <button
+          type="submit"
+          disabled={isStreamingMessage || isLimitExceeded}
+          className="flex aspect-square size-[41px] items-center justify-center text-zinc-500 hover:text-black"
+        >
+          <Send className="size-4 stroke-[2.5]" />
+        </button>
+      </form>
+    </div>
+  );
+}
+
+type AIChatCardProps = {
+  role: AllowedAIChatRole;
+  content: string;
+  html?: string;
+};
+
+function AIChatCard(props: AIChatCardProps) {
+  const { role, content, html: defaultHtml } = props;
+
+  const html = useMemo(() => {
+    if (defaultHtml) {
+      return defaultHtml;
+    }
+
+    return markdownToHtml(content, false);
+  }, [content, defaultHtml]);
+
+  return (
+    <div
+      className={cn(
+        'flex flex-col rounded-lg',
+        role === 'user' ? 'bg-gray-300/30' : 'bg-yellow-500/30',
+      )}
+    >
+      <div className="flex items-start gap-2.5 p-3">
+        <div
+          className={cn(
+            'flex size-6 shrink-0 items-center justify-center rounded-full',
+            role === 'user'
+              ? 'bg-gray-200 text-black'
+              : 'bg-yellow-400 text-black',
+          )}
+        >
+          <Bot className="size-4 stroke-[2.5]" />
+        </div>
+        <div
+          className="course-content course-ai-content prose prose-sm mt-0.5 max-w-full overflow-hidden text-sm"
+          dangerouslySetInnerHTML={{ __html: html }}
+        />
+      </div>
+    </div>
+  );
+}
+
+type CapabilityCardProps = {
+  icon: React.ReactNode;
+  title: string;
+  description: string;
+  className?: string;
+};
+
+function CapabilityCard({
+  icon,
+  title,
+  description,
+  className,
+}: CapabilityCardProps) {
+  return (
+    <div
+      className={cn(
+        'flex flex-col gap-2 rounded-lg bg-yellow-500/10 p-3',
+        className,
+      )}
+    >
+      <div className="flex items-center gap-2">
+        {icon}
+        <span className="text-[13px] font-medium leading-none text-black">
+          {title}
+        </span>
+      </div>
+      <p className="text-[12px] leading-normal text-gray-600">{description}</p>
+    </div>
+  );
+}
+
+const capabilities = [
+  {
+    icon: (
+      <HelpCircle
+        className="size-4 shrink-0 text-yellow-600"
+        strokeWidth={2.5}
+      />
+    ),
+    title: 'Clarify Concepts',
+    description: "If you don't understand a concept, ask me to clarify it",
+  },
+  {
+    icon: (
+      <BookOpen className="size-4 shrink-0 text-yellow-600" strokeWidth={2.5} />
+    ),
+    title: 'More Details',
+    description: 'Get deeper insights about topics covered in the lesson',
+  },
+  {
+    icon: (
+      <Hammer className="size-4 shrink-0 text-yellow-600" strokeWidth={2.5} />
+    ),
+    title: 'Real-world Examples',
+    description: 'Ask for real-world examples to understand better',
+  },
+  {
+    icon: <Bot className="size-4 shrink-0 text-yellow-600" strokeWidth={2.5} />,
+    title: 'Best Practices',
+    description: 'Learn about best practices and common pitfalls',
+  },
+] as const;
diff --git a/src/components/GenerateCourse/AICourseLesson.tsx b/src/components/GenerateCourse/AICourseLesson.tsx
new file mode 100644
index 000000000..c213aac01
--- /dev/null
+++ b/src/components/GenerateCourse/AICourseLesson.tsx
@@ -0,0 +1,387 @@
+import { useMutation } from '@tanstack/react-query';
+import {
+  CheckIcon,
+  ChevronLeft,
+  ChevronRight,
+  Loader2Icon,
+  LockIcon,
+  XIcon,
+} from 'lucide-react';
+import { useEffect, useMemo, useState } from 'react';
+import type { AICourseDocument } from '../../api/ai-roadmap';
+import { readStream } from '../../lib/ai';
+import { cn } from '../../lib/classname';
+import { isLoggedIn, removeAuthToken } from '../../lib/jwt';
+import {
+  markdownToHtml,
+  markdownToHtmlWithHighlighting,
+} from '../../lib/markdown';
+import { httpPatch } from '../../lib/query-http';
+import { slugify } from '../../lib/slugger';
+import {
+  getAiCourseLimitOptions,
+  getAiCourseOptions,
+} from '../../queries/ai-course';
+import { useIsPaidUser } from '../../queries/billing';
+import { queryClient } from '../../stores/query-client';
+import { AICourseFollowUp } from './AICourseFollowUp';
+import './AICourseFollowUp.css';
+import { RegenerateLesson } from './RegenerateLesson';
+
+type AICourseLessonProps = {
+  courseSlug: string;
+  progress: string[];
+
+  activeModuleIndex: number;
+  totalModules: number;
+  currentModuleTitle: string;
+  activeLessonIndex: number;
+  totalLessons: number;
+  currentLessonTitle: string;
+
+  onGoToPrevLesson: () => void;
+  onGoToNextLesson: () => void;
+
+  onUpgrade: () => void;
+};
+
+export function AICourseLesson(props: AICourseLessonProps) {
+  const {
+    courseSlug,
+    progress = [],
+
+    activeModuleIndex,
+    totalModules,
+    currentModuleTitle,
+    activeLessonIndex,
+    totalLessons,
+    currentLessonTitle,
+
+    onGoToPrevLesson,
+    onGoToNextLesson,
+
+    onUpgrade,
+  } = props;
+
+  const [isLoading, setIsLoading] = useState(true);
+  const [isGenerating, setIsGenerating] = useState(false);
+  const [error, setError] = useState('');
+
+  const [lessonHtml, setLessonHtml] = useState('');
+
+  const lessonId = `${slugify(String(activeModuleIndex))}-${slugify(String(activeLessonIndex))}`;
+  const isLessonDone = progress?.includes(lessonId);
+
+  const { isPaidUser } = useIsPaidUser();
+
+  const abortController = useMemo(
+    () => new AbortController(),
+    [activeModuleIndex, activeLessonIndex],
+  );
+
+  const generateAiCourseContent = async (
+    isForce?: boolean,
+    customPrompt?: string,
+  ) => {
+    setIsLoading(true);
+    setError('');
+    setLessonHtml('');
+
+    if (!isLoggedIn()) {
+      setIsLoading(false);
+      setError('Please login to generate course content');
+      return;
+    }
+
+    if (!currentModuleTitle || !currentLessonTitle) {
+      setIsLoading(false);
+      setError('Invalid module title or lesson title');
+      return;
+    }
+
+    const response = await fetch(
+      `${import.meta.env.PUBLIC_API_URL}/v1-generate-ai-course-lesson/${courseSlug}`,
+      {
+        method: 'POST',
+        headers: {
+          'Content-Type': 'application/json',
+        },
+        signal: abortController.signal,
+        credentials: 'include',
+        body: JSON.stringify({
+          moduleIndex: activeModuleIndex,
+          lessonIndex: activeLessonIndex,
+          isForce,
+          customPrompt,
+        }),
+      },
+    );
+
+    if (!response.ok) {
+      const data = await response.json();
+
+      setError(data?.message || 'Something went wrong');
+      setIsLoading(false);
+
+      // Logout user if token is invalid
+      if (data.status === 401) {
+        removeAuthToken();
+        window.location.reload();
+      }
+      return;
+    }
+
+    if (!response.body) {
+      setIsLoading(false);
+      setError('No response body received');
+      return;
+    }
+
+    try {
+      const reader = response.body.getReader();
+      setIsLoading(false);
+      setIsGenerating(true);
+      await readStream(reader, {
+        onStream: async (result) => {
+          if (abortController.signal.aborted) {
+            return;
+          }
+
+          setLessonHtml(markdownToHtml(result, false));
+        },
+        onStreamEnd: async (result) => {
+          if (abortController.signal.aborted) {
+            return;
+          }
+
+          setLessonHtml(await markdownToHtmlWithHighlighting(result));
+          queryClient.invalidateQueries(getAiCourseLimitOptions());
+          setIsGenerating(false);
+        },
+      });
+    } catch (e) {
+      setError(e instanceof Error ? e.message : 'Something went wrong');
+      setIsLoading(false);
+    }
+  };
+
+  const { mutate: toggleDone, isPending: isTogglingDone } = useMutation(
+    {
+      mutationFn: () => {
+        return httpPatch<AICourseDocument>(
+          `/v1-toggle-done-ai-lesson/${courseSlug}`,
+          {
+            moduleIndex: activeModuleIndex,
+            lessonIndex: activeLessonIndex,
+          },
+        );
+      },
+      onSuccess: (data) => {
+        queryClient.setQueryData(
+          getAiCourseOptions({ aiCourseSlug: courseSlug }).queryKey,
+          data,
+        );
+      },
+    },
+    queryClient,
+  );
+
+  useEffect(() => {
+    generateAiCourseContent();
+  }, [currentModuleTitle, currentLessonTitle]);
+
+  useEffect(() => {
+    return () => {
+      abortController.abort();
+    };
+  }, [abortController]);
+
+  const cantGoForward =
+    (activeModuleIndex === totalModules - 1 &&
+      activeLessonIndex === totalLessons - 1) ||
+    isGenerating ||
+    isLoading;
+
+  const cantGoBack =
+    (activeModuleIndex === 0 && activeLessonIndex === 0) || isGenerating || isLoading;
+
+  return (
+    <div className="mx-auto max-w-4xl">
+      <div className="relative rounded-lg border border-gray-200 bg-white p-6 shadow-sm max-lg:px-4 max-lg:pb-4 max-lg:pt-3">
+        {(isGenerating || isLoading) && (
+          <div className="absolute right-3 top-3 flex items-center justify-center">
+            <Loader2Icon
+              size={18}
+              strokeWidth={3}
+              className="animate-spin text-gray-400/70"
+            />
+          </div>
+        )}
+
+        <div className="mb-4 flex items-center justify-between">
+          <div className="text-sm text-gray-500">
+            Lesson {activeLessonIndex + 1} of {totalLessons}
+          </div>
+
+          {!isGenerating && !isLoading && (
+            <div className="absolute right-3 top-3 flex items-center justify-between gap-2">
+              <RegenerateLesson
+                onRegenerateLesson={(prompt) => {
+                  generateAiCourseContent(true, prompt);
+                }}
+              />
+              <button
+                disabled={isLoading || isTogglingDone}
+                className={cn(
+                  'flex items-center gap-1.5 rounded-full bg-black py-1 pl-2 pr-3 text-sm text-white hover:bg-gray-800 disabled:opacity-50 max-lg:text-xs',
+                  isLessonDone
+                    ? 'bg-red-500 hover:bg-red-600'
+                    : 'bg-green-500 hover:bg-green-600',
+                )}
+                onClick={() => toggleDone()}
+              >
+                {isTogglingDone ? (
+                  <>
+                    <Loader2Icon
+                      size={16}
+                      strokeWidth={3}
+                      className="animate-spin text-white"
+                    />
+                    Please wait ...
+                  </>
+                ) : (
+                  <>
+                    {isLessonDone ? (
+                      <>
+                        <XIcon size={16} />
+                        Mark as Undone
+                      </>
+                    ) : (
+                      <>
+                        <CheckIcon size={16} />
+                        Mark as Done
+                      </>
+                    )}
+                  </>
+                )}
+              </button>
+            </div>
+          )}
+        </div>
+
+        <h1 className="mb-6 text-balance text-3xl font-semibold max-lg:mb-3 max-lg:text-xl">
+          {currentLessonTitle?.replace(/^Lesson\s*?\d+[\.:]\s*/, '')}
+        </h1>
+
+        {!error && isLoggedIn() && (
+          <div
+            className="course-content prose prose-lg mt-8 max-w-full text-black prose-headings:mb-3 prose-headings:mt-8 prose-blockquote:font-normal prose-pre:rounded-2xl prose-pre:text-lg prose-li:my-1 prose-thead:border-zinc-800 prose-tr:border-zinc-800 max-lg:mt-4 max-lg:text-base max-lg:prose-h2:mt-3 max-lg:prose-h2:text-lg max-lg:prose-h3:text-base max-lg:prose-pre:px-3 max-lg:prose-pre:text-sm"
+            dangerouslySetInnerHTML={{ __html: lessonHtml }}
+          />
+        )}
+
+        {error && isLoggedIn() && (
+          <div className="mt-8 flex min-h-[300px] items-center justify-center rounded-xl bg-red-50/80">
+            {error.includes('reached the limit') ? (
+              <div className="flex max-w-sm flex-col items-center text-center">
+                <h2 className="text-xl font-semibold text-red-600">
+                  Limit reached
+                </h2>
+                <p className="my-3 text-red-600">
+                  You have reached the AI usage limit for today.
+                  {!isPaidUser && <>Please upgrade your account to continue.</>}
+                  {isPaidUser && <>Please wait until tomorrow to continue.</>}
+                </p>
+
+                {!isPaidUser && (
+                  <button
+                    onClick={() => {
+                      onUpgrade();
+                    }}
+                    className="rounded-full bg-red-600 px-4 py-1 text-white hover:bg-red-700"
+                  >
+                    Upgrade Account
+                  </button>
+                )}
+              </div>
+            ) : (
+              <p className="text-red-600">{error}</p>
+            )}
+          </div>
+        )}
+
+        {!isLoggedIn() && (
+          <div className="mt-8 flex min-h-[152px] flex-col items-center justify-center gap-3 rounded-lg border border-gray-200 p-8">
+            <LockIcon className="size-7 stroke-[2] text-gray-400/90" />
+            <p className="text-sm text-gray-500">
+              Please login to generate course content
+            </p>
+          </div>
+        )}
+
+        <div className="mt-8 flex items-center justify-between">
+          <button
+            onClick={onGoToPrevLesson}
+            disabled={cantGoBack}
+            className={cn(
+              'flex items-center rounded-full px-4 py-2 disabled:opacity-50 max-lg:px-3 max-lg:py-1.5 max-lg:text-sm',
+              cantGoBack
+                ? 'cursor-not-allowed text-gray-400'
+                : 'bg-gray-100 text-gray-700 hover:bg-gray-200',
+            )}
+          >
+            <ChevronLeft size={16} className="mr-2" />
+            Previous <span className="hidden lg:inline">&nbsp;Lesson</span>
+          </button>
+
+          <div>
+            <button
+              onClick={() => {
+                if (!isLessonDone) {
+                  toggleDone(undefined, {
+                    onSuccess: () => {
+                      onGoToNextLesson();
+                    },
+                  });
+                } else {
+                  onGoToNextLesson();
+                }
+              }}
+              disabled={cantGoForward || isTogglingDone}
+              className={cn(
+                'flex items-center rounded-full px-4 py-2 disabled:opacity-50 max-lg:px-3 max-lg:py-1.5 max-lg:text-sm',
+                cantGoForward
+                  ? 'cursor-not-allowed text-gray-400'
+                  : 'bg-gray-800 text-white hover:bg-gray-700',
+              )}
+            >
+              {isTogglingDone ? (
+                <>
+                  <Loader2Icon
+                    size={16}
+                    strokeWidth={3}
+                    className="animate-spin text-white"
+                  />
+                  Please wait ...
+                </>
+              ) : (
+                <>
+                  Next <span className="hidden lg:inline">&nbsp;Lesson</span>
+                  <ChevronRight size={16} className="ml-2" />
+                </>
+              )}
+            </button>
+          </div>
+        </div>
+      </div>
+
+      {!isGenerating && !isLoading && (
+        <AICourseFollowUp
+          courseSlug={courseSlug}
+          moduleTitle={currentModuleTitle}
+          lessonTitle={currentLessonTitle}
+        />
+      )}
+    </div>
+  );
+}
diff --git a/src/components/GenerateCourse/AICourseLimit.tsx b/src/components/GenerateCourse/AICourseLimit.tsx
new file mode 100644
index 000000000..efba35c2b
--- /dev/null
+++ b/src/components/GenerateCourse/AICourseLimit.tsx
@@ -0,0 +1,81 @@
+import { useQuery } from '@tanstack/react-query';
+import { Gift, Info } from 'lucide-react';
+import { getPercentage } from '../../lib/number';
+import { getAiCourseLimitOptions } from '../../queries/ai-course';
+import { billingDetailsOptions } from '../../queries/billing';
+import { queryClient } from '../../stores/query-client';
+
+type AICourseLimitProps = {
+  onUpgrade: () => void;
+  onShowLimits: () => void;
+};
+
+export function AICourseLimit(props: AICourseLimitProps) {
+  const { onUpgrade, onShowLimits } = props;
+
+  const { data: limits, isLoading } = useQuery(
+    getAiCourseLimitOptions(),
+    queryClient,
+  );
+
+  const { data: userBillingDetails, isLoading: isBillingDetailsLoading } =
+    useQuery(billingDetailsOptions(), queryClient);
+
+  if (isLoading || !limits || isBillingDetailsLoading || !userBillingDetails) {
+    return (
+      <div className="hidden h-[38px] w-[208.09px] animate-pulse rounded-lg border border-gray-200 bg-gray-200 lg:block"></div>
+    );
+  }
+
+  const { used, limit } = limits;
+
+  const totalPercentage = getPercentage(used, limit);
+
+  // has consumed 85% of the limit
+  const isNearLimit = used >= limit * 0.85;
+  const isPaidUser = userBillingDetails.status === 'active';
+
+  return (
+    <>
+      {!isPaidUser ||
+        (isNearLimit && (
+          <button
+            className="mr-1 flex items-center gap-1 text-sm font-medium underline underline-offset-2 lg:hidden"
+            onClick={() => onShowLimits()}
+          >
+            <Info className="size-4" />
+            {totalPercentage}% limit used
+          </button>
+        ))}
+
+      {(!isPaidUser || isNearLimit) && (
+        <button
+          onClick={() => {
+            onShowLimits();
+          }}
+          className="relative hidden h-full min-h-[38px] cursor-pointer items-center overflow-hidden rounded-lg border border-gray-300 px-3 py-1.5 text-sm hover:bg-gray-50 lg:flex"
+        >
+          <span className="relative z-10">
+            {totalPercentage}% of the daily limit used
+          </span>
+          <div
+            className="absolute inset-0 h-full bg-gray-200/80"
+            style={{
+              width: `${totalPercentage}%`,
+            }}
+          ></div>
+        </button>
+      )}
+
+      {!isPaidUser && (
+        <button
+          className="hidden items-center justify-center gap-1 rounded-md bg-yellow-400 px-4 py-1 text-sm font-medium underline-offset-2 hover:bg-yellow-500 lg:flex"
+          onClick={() => onUpgrade()}
+        >
+          <Gift className="size-4" />
+          Upgrade
+        </button>
+      )}
+    </>
+  );
+}
diff --git a/src/components/GenerateCourse/AICourseSearch.tsx b/src/components/GenerateCourse/AICourseSearch.tsx
new file mode 100644
index 000000000..bd0f68a76
--- /dev/null
+++ b/src/components/GenerateCourse/AICourseSearch.tsx
@@ -0,0 +1,46 @@
+import { SearchIcon } from 'lucide-react';
+import { useEffect, useState } from 'react';
+import { useDebounceValue } from '../../hooks/use-debounce';
+
+type AICourseSearchProps = {
+  value: string;
+  onChange: (value: string) => void;
+};
+
+export function AICourseSearch(props: AICourseSearchProps) {
+  const { value: defaultValue, onChange } = props;
+
+  const [searchTerm, setSearchTerm] = useState(defaultValue);
+  const debouncedSearchTerm = useDebounceValue(searchTerm, 500);
+
+  useEffect(() => {
+    setSearchTerm(defaultValue);
+  }, [defaultValue]);
+
+  useEffect(() => {
+    if (debouncedSearchTerm && debouncedSearchTerm.length < 3) {
+      return;
+    }
+
+    if (debouncedSearchTerm === defaultValue) {
+      return;
+    }
+
+    onChange(debouncedSearchTerm);
+  }, [debouncedSearchTerm]);
+
+  return (
+    <div className="relative w-64 max-sm:hidden">
+      <div className="pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3">
+        <SearchIcon className="h-4 w-4 text-gray-400" />
+      </div>
+      <input
+        type="text"
+        className="block w-full rounded-md border border-gray-200 bg-white py-1.5 pl-10 pr-3 leading-5 placeholder-gray-500 focus:border-gray-300 focus:outline-none focus:ring-blue-500 disabled:opacity-70 sm:text-sm"
+        placeholder="Search your courses..."
+        value={searchTerm}
+        onChange={(e) => setSearchTerm(e.target.value)}
+      />
+    </div>
+  );
+}
diff --git a/src/components/GenerateCourse/AICourseSidebarModuleList.tsx b/src/components/GenerateCourse/AICourseSidebarModuleList.tsx
new file mode 100644
index 000000000..5158f91b8
--- /dev/null
+++ b/src/components/GenerateCourse/AICourseSidebarModuleList.tsx
@@ -0,0 +1,204 @@
+import { type Dispatch, type SetStateAction } from 'react';
+import type { AiCourse } from '../../lib/ai';
+import { Check, ChevronDownIcon, ChevronRightIcon } from 'lucide-react';
+import { cn } from '../../lib/classname';
+import { slugify } from '../../lib/slugger';
+import { CheckIcon } from '../ReactIcons/CheckIcon';
+import { CircularProgress } from './CircularProgress';
+
+type AICourseModuleListProps = {
+  course: AiCourse;
+  courseSlug?: string;
+  activeModuleIndex: number | undefined;
+  setActiveModuleIndex: (index: number) => void;
+  activeLessonIndex: number | undefined;
+  setActiveLessonIndex: (index: number) => void;
+
+  setSidebarOpen: (open: boolean) => void;
+
+  viewMode: 'module' | 'outline';
+  setViewMode: (mode: 'module' | 'outline') => void;
+
+  expandedModules: Record<number, boolean>;
+  setExpandedModules: Dispatch<SetStateAction<Record<number, boolean>>>;
+
+  isLoading: boolean;
+};
+
+export function AICourseSidebarModuleList(props: AICourseModuleListProps) {
+  const {
+    course,
+    courseSlug,
+    activeModuleIndex,
+    setActiveModuleIndex,
+    activeLessonIndex,
+    setActiveLessonIndex,
+    setSidebarOpen,
+    setViewMode,
+    expandedModules,
+    setExpandedModules,
+
+    isLoading,
+  } = props;
+
+  const aiCourseProgress = course.done || [];
+
+  const toggleModule = (index: number) => {
+    setExpandedModules((prev) => {
+      // If this module is already expanded, collapse it
+      if (prev[index]) {
+        return {
+          ...prev,
+          [index]: false,
+        };
+      }
+
+      // Otherwise, collapse all modules and expand only this one
+      const newState: Record<number, boolean> = {};
+      // Set all modules to collapsed
+      course.modules.forEach((_, idx) => {
+        newState[idx] = false;
+      });
+      // Expand only the clicked module
+      newState[index] = true;
+      return newState;
+    });
+  };
+
+  const done = aiCourseProgress || [];
+
+  return (
+    <nav className="bg-gray-100">
+      {course.modules.map((courseModule, moduleIdx) => {
+        const totalLessons = courseModule.lessons.length;
+        const completedLessons = courseModule.lessons.filter(
+          (lesson, lessonIdx) => {
+            const key = `${slugify(String(moduleIdx))}-${slugify(String(lessonIdx))}`;
+            return done.includes(key);
+          },
+        ).length;
+
+        const percentage = Math.round((completedLessons / totalLessons) * 100);
+        const isActive = expandedModules[moduleIdx];
+        const isModuleCompleted = completedLessons === totalLessons;
+
+        return (
+          <div key={moduleIdx} className="rounded-md">
+            <button
+              onClick={() => toggleModule(moduleIdx)}
+              className={cn(
+                'relative z-10 flex w-full cursor-pointer flex-row items-center gap-2 border-b border-b-gray-200 bg-white px-2 py-3 text-base text-gray-600 hover:bg-gray-100',
+                activeModuleIndex === moduleIdx
+                  ? 'text-gray-900'
+                  : 'text-gray-700',
+                moduleIdx === 0 && 'pt-4',
+              )}
+            >
+              <div className="flex min-w-0 flex-1 items-center gap-2">
+                <div className="flex-shrink-0">
+                  <CircularProgress
+                    percentage={percentage}
+                    isVisible={!isModuleCompleted}
+                    isActive={isActive}
+                    isLoading={isLoading}
+                  >
+                    <span
+                      className={cn(
+                        'flex size-[21px] flex-shrink-0 items-center justify-center rounded-full bg-gray-400/70 text-xs font-semibold text-white',
+                        {
+                          'bg-black': isActive,
+                          'bg-green-600': isModuleCompleted,
+                        },
+                      )}
+                    >
+                      {!isModuleCompleted && moduleIdx + 1}
+                      {isModuleCompleted && (
+                        <Check className="size-3 stroke-[3] text-white" />
+                      )}
+                    </span>
+                  </CircularProgress>
+                </div>
+                <span className="flex flex-1 items-center break-words text-left text-sm leading-relaxed">
+                  {courseModule.title?.replace(/^Module\s*?\d+[\.:]\s*/, '')}
+                </span>
+              </div>
+              <div className="ml-auto self-center">
+                {expandedModules[moduleIdx] ? (
+                  <ChevronDownIcon size={16} className="flex-shrink-0" />
+                ) : (
+                  <ChevronRightIcon size={16} className="flex-shrink-0" />
+                )}
+              </div>
+            </button>
+
+            {/* Lessons */}
+            {expandedModules[moduleIdx] && (
+              <div className="flex flex-col border-b border-b-gray-200 bg-gray-100">
+                {courseModule.lessons.map((lesson, lessonIdx) => {
+                  const key = `${slugify(String(moduleIdx))}-${slugify(String(lessonIdx))}`;
+                  const isCompleted = done.includes(key);
+
+                  return (
+                    <button
+                      key={key}
+                      onClick={() => {
+                        setActiveModuleIndex(moduleIdx);
+                        setActiveLessonIndex(lessonIdx);
+                        setExpandedModules((prev) => {
+                          const newState: Record<number, boolean> = {};
+                          course.modules.forEach((_, idx) => {
+                            newState[idx] = false;
+                          });
+                          newState[moduleIdx] = true;
+                          return newState;
+                        });
+                        setSidebarOpen(false);
+                        setViewMode('module');
+                      }}
+                      className={cn(
+                        'flex w-full cursor-pointer items-center gap-2.5 py-3 pl-3.5 pr-2 text-left text-sm leading-normal',
+                        activeModuleIndex === moduleIdx &&
+                          activeLessonIndex === lessonIdx
+                          ? 'bg-gray-200 text-black'
+                          : 'text-gray-600 hover:bg-gray-200/70',
+                      )}
+                    >
+                      {isCompleted ? (
+                        <CheckIcon
+                          additionalClasses={cn(
+                            'size-[18px] relative bg-white rounded-full top-[2px] flex-shrink-0 text-green-600',
+                            {
+                              'text-black':
+                                activeModuleIndex === moduleIdx &&
+                                activeLessonIndex === lessonIdx,
+                            },
+                          )}
+                        />
+                      ) : (
+                        <span
+                          className={cn(
+                            'flex size-[18px] flex-shrink-0 items-center justify-center rounded-full bg-gray-400/70 text-xs font-semibold text-white',
+                            {
+                              'bg-black':
+                                activeModuleIndex === moduleIdx &&
+                                activeLessonIndex === lessonIdx,
+                            },
+                          )}
+                        >
+                          {lessonIdx + 1}
+                        </span>
+                      )}
+                      <span className="break-words">
+                        {lesson?.replace(/^Lesson\s*?\d+[\.:]\s*/, '')}
+                      </span>
+                    </button>
+                  );
+                })}
+              </div>
+            )}
+          </div>
+        );
+      })}
+    </nav>
+  );
+}
diff --git a/src/components/GenerateCourse/AILimitsPopup.tsx b/src/components/GenerateCourse/AILimitsPopup.tsx
new file mode 100644
index 000000000..79244940c
--- /dev/null
+++ b/src/components/GenerateCourse/AILimitsPopup.tsx
@@ -0,0 +1,103 @@
+import { Gift } from 'lucide-react';
+import { Modal } from '../Modal';
+import { formatCommaNumber } from '../../lib/number';
+import { billingDetailsOptions } from '../../queries/billing';
+import { queryClient } from '../../stores/query-client';
+import { useQuery } from '@tanstack/react-query';
+import { getAiCourseLimitOptions } from '../../queries/ai-course';
+
+type AILimitsPopupProps = {
+  onClose: () => void;
+  onUpgrade: () => void;
+};
+
+export function AILimitsPopup(props: AILimitsPopupProps) {
+  const { onClose, onUpgrade } = props;
+
+  const { data: limits, isLoading } = useQuery(
+    getAiCourseLimitOptions(),
+    queryClient,
+  );
+
+  const { used, limit } = limits ?? { used: 0, limit: 0 };
+
+  const { data: userBillingDetails, isLoading: isBillingDetailsLoading } =
+    useQuery(billingDetailsOptions(), queryClient);
+
+  const isPaidUser = userBillingDetails?.status === 'active';
+
+  return (
+    <Modal
+      onClose={onClose}
+      wrapperClassName="rounded-xl max-w-xl w-full h-auto"
+      bodyClassName="p-6"
+      overlayClassName="items-start md:items-center"
+    >
+      <h2 className="mb-8 text-center text-xl font-semibold">
+        Daily AI Limits
+      </h2>
+
+      {/* Usage Progress Bar */}
+      <div className="mb-6">
+        <div className="mb-2 flex justify-between">
+          <span className="text-sm font-medium">
+            Usage: {formatCommaNumber(used)}&nbsp;/&nbsp;
+            {formatCommaNumber(limit)} tokens
+          </span>
+          <span className="text-sm font-medium">
+            {Math.round((used / limit) * 100)}%
+          </span>
+        </div>
+        <div className="h-2.5 w-full rounded-full bg-gray-200">
+          <div
+            className="h-2.5 rounded-full bg-yellow-500"
+            style={{ width: `${Math.min(100, (used / limit) * 100)}%` }}
+          ></div>
+        </div>
+      </div>
+
+      {/* Usage Stats */}
+      <div className="rounded-lg bg-gray-50 p-4">
+        <div className="grid grid-cols-2 gap-4">
+          <div>
+            <p className="text-sm text-gray-500">Used Today</p>
+            <p className="text-2xl font-bold">{formatCommaNumber(used)}</p>
+          </div>
+          <div>
+            <p className="text-sm text-gray-500">Daily Limit</p>
+            <p className="text-2xl font-bold">{formatCommaNumber(limit)}</p>
+          </div>
+        </div>
+      </div>
+
+      {/* Explanation */}
+      <div className="mt-2">
+        <div className="space-y-3 text-gray-600">
+          <p className="text-sm">
+            Limit resets every 24 hours.{' '}
+            {!isPaidUser && 'Consider upgrading for more tokens.'}
+          </p>
+        </div>
+      </div>
+
+      {/* Action Button */}
+      <div className="mt-auto flex flex-col gap-2 pt-4">
+        {!isPaidUser && (
+          <button
+            onClick={onUpgrade}
+            className="flex w-full items-center justify-center gap-2 rounded-lg bg-yellow-400 px-4 py-2.5 text-sm font-medium text-black transition-colors hover:bg-yellow-500"
+          >
+            <Gift className="size-4" />
+            Upgrade to Unlimited
+          </button>
+        )}
+        <button
+          onClick={onClose}
+          className="w-full rounded-lg bg-gray-200 px-4 py-2.5 text-sm text-gray-600 transition-colors hover:bg-gray-300"
+        >
+          Close
+        </button>
+      </div>
+    </Modal>
+  );
+}
diff --git a/src/components/GenerateCourse/CircularProgress.tsx b/src/components/GenerateCourse/CircularProgress.tsx
new file mode 100644
index 000000000..67b6386e9
--- /dev/null
+++ b/src/components/GenerateCourse/CircularProgress.tsx
@@ -0,0 +1,57 @@
+import { cn } from '../../lib/classname';
+
+export function ChapterNumberSkeleton() {
+  return (
+    <div className="h-[28px] w-[28px] animate-pulse rounded-full bg-gray-200" />
+  );
+}
+
+type CircularProgressProps = {
+  percentage: number;
+  children: React.ReactNode;
+  isVisible?: boolean;
+  isActive?: boolean;
+  isLoading?: boolean;
+};
+
+export function CircularProgress(props: CircularProgressProps) {
+  const {
+    percentage,
+    children,
+    isVisible = true,
+    isActive = false,
+    isLoading = false,
+  } = props;
+
+  const circumference = 2 * Math.PI * 13;
+  const strokeDasharray = `${circumference}`;
+  const strokeDashoffset = circumference - (percentage / 100) * circumference;
+
+  return (
+    <div className="relative flex h-[28px] w-[28px] flex-shrink-0 items-center justify-center">
+      {isVisible && !isLoading && (
+        <svg className="absolute h-full w-full -rotate-90">
+          <circle
+            cx="14"
+            cy="14"
+            r="13"
+            stroke="currentColor"
+            strokeWidth="1.75"
+            fill="none"
+            className={cn('text-gray-400/70', {
+              'text-black': isActive,
+            })}
+            style={{
+              strokeDasharray,
+              strokeDashoffset,
+              transition: 'stroke-dashoffset 0.3s ease',
+            }}
+          />
+        </svg>
+      )}
+
+      {!isLoading && children}
+      {isLoading && <ChapterNumberSkeleton />}
+    </div>
+  );
+}
diff --git a/src/components/GenerateCourse/FineTuneCourse.tsx b/src/components/GenerateCourse/FineTuneCourse.tsx
new file mode 100644
index 000000000..bc023ec14
--- /dev/null
+++ b/src/components/GenerateCourse/FineTuneCourse.tsx
@@ -0,0 +1,103 @@
+import { useState } from 'react';
+import { cn } from '../../lib/classname';
+
+type QuestionProps = {
+  label: string;
+  placeholder: string;
+  autoFocus?: boolean;
+  value: string;
+  onChange: (value: string) => void;
+};
+
+function Question(props: QuestionProps) {
+  const { label, placeholder, value, onChange, autoFocus = false } = props;
+
+  return (
+    <div className="flex flex-col">
+      <label className="border-y bg-gray-100 px-4 py-2.5 text-sm font-medium text-gray-700">
+        {label}
+      </label>
+      <textarea
+        placeholder={placeholder}
+        className="min-h-[80px] w-full resize-none px-4 py-3 text-gray-700 placeholder:text-gray-400 focus:outline-none"
+        value={value}
+        onChange={(e) => onChange(e.target.value)}
+        autoFocus={autoFocus}
+      />
+    </div>
+  );
+}
+
+type FineTuneCourseProps = {
+  hasFineTuneData: boolean;
+  about: string;
+  goal: string;
+  customInstructions: string;
+
+  setHasFineTuneData: (hasMetadata: boolean) => void;
+  setAbout: (about: string) => void;
+  setGoal: (goal: string) => void;
+  setCustomInstructions: (customInstructions: string) => void;
+};
+
+export function FineTuneCourse(props: FineTuneCourseProps) {
+  const {
+    about,
+    goal,
+    customInstructions,
+    hasFineTuneData,
+    setAbout,
+    setGoal,
+    setCustomInstructions,
+    setHasFineTuneData,
+  } = props;
+
+  return (
+    <div className="flex flex-col overflow-hidden rounded-lg border border-gray-200 transition-all">
+      <label
+        className={cn(
+          'group flex cursor-pointer select-none flex-row items-center gap-2.5 px-4 py-3 text-left text-gray-500 transition-colors hover:bg-gray-100 focus:outline-none',
+          hasFineTuneData && 'bg-gray-100',
+        )}
+      >
+        <input
+          id="fine-tune-checkbox"
+          type="checkbox"
+          className="h-4 w-4 group-hover:fill-current"
+          checked={hasFineTuneData}
+          onChange={() => {
+            setHasFineTuneData(!hasFineTuneData);
+          }}
+        />
+        Tell us more to tailor the course (optional){' '}
+        <span className="ml-auto rounded-md bg-gray-400 px-2 py-0.5 text-xs text-white">
+          recommended
+        </span>
+      </label>
+
+      {hasFineTuneData && (
+        <div className="mt-0 flex flex-col">
+          <Question
+            label="Tell us about your self"
+            placeholder="e.g. I am a frontend developer and have good knowledge of HTML, CSS, and JavaScript."
+            value={about}
+            onChange={setAbout}
+            autoFocus={true}
+          />
+          <Question
+            label="What is your goal with this course?"
+            placeholder="e.g. I want to be able to build Node.js APIs with Express.js and MongoDB."
+            value={goal}
+            onChange={setGoal}
+          />
+          <Question
+            label="Custom Instructions (Optional)"
+            placeholder="Give additional instructions to the AI as if you were giving them to a friend."
+            value={customInstructions}
+            onChange={setCustomInstructions}
+          />
+        </div>
+      )}
+    </div>
+  );
+}
diff --git a/src/components/GenerateCourse/GenerateAICourse.tsx b/src/components/GenerateCourse/GenerateAICourse.tsx
new file mode 100644
index 000000000..95ea38935
--- /dev/null
+++ b/src/components/GenerateCourse/GenerateAICourse.tsx
@@ -0,0 +1,166 @@
+import { useEffect, useState } from 'react';
+import { getUrlParams } from '../../lib/browser';
+import { isLoggedIn } from '../../lib/jwt';
+import { getCourseFineTuneData, type AiCourse } from '../../lib/ai';
+import { AICourseContent } from './AICourseContent';
+import { generateCourse } from '../../helper/generate-ai-course';
+import { useQuery } from '@tanstack/react-query';
+import { getAiCourseOptions } from '../../queries/ai-course';
+import { queryClient } from '../../stores/query-client';
+
+type GenerateAICourseProps = {};
+
+export function GenerateAICourse(props: GenerateAICourseProps) {
+  const [term, setTerm] = useState('');
+  const [difficulty, setDifficulty] = useState('');
+  const [sessionId, setSessionId] = useState('');
+  const [goal, setGoal] = useState('');
+  const [about, setAbout] = useState('');
+  const [customInstructions, setCustomInstructions] = useState('');
+
+  const [isLoading, setIsLoading] = useState(true);
+  const [error, setError] = useState('');
+
+  const [courseId, setCourseId] = useState('');
+  const [courseSlug, setCourseSlug] = useState('');
+  const [course, setCourse] = useState<AiCourse>({
+    title: '',
+    modules: [],
+    difficulty: '',
+    done: [],
+  });
+
+  // Once the course is generated, we fetch the course from the database
+  // so that we get the up-to-date course data and also so that we
+  // can reload the changes (e.g. progress) etc using queryClient.setQueryData
+  const { data: aiCourse } = useQuery(
+    getAiCourseOptions({ aiCourseSlug: courseSlug }),
+    queryClient,
+  );
+
+  useEffect(() => {
+    if (aiCourse) {
+      setCourse(aiCourse);
+    }
+  }, [aiCourse]);
+
+  useEffect(() => {
+    if (term || difficulty) {
+      return;
+    }
+
+    const params = getUrlParams();
+    const paramsTerm = params?.term;
+    const paramsDifficulty = params?.difficulty;
+    if (!paramsTerm || !paramsDifficulty) {
+      return;
+    }
+
+    setTerm(paramsTerm);
+    setDifficulty(paramsDifficulty);
+
+    const sessionId = params?.id;
+    setSessionId(sessionId);
+
+    let paramsGoal = '';
+    let paramsAbout = '';
+    let paramsCustomInstructions = '';
+
+    if (sessionId) {
+      const fineTuneData = getCourseFineTuneData(sessionId);
+      if (fineTuneData) {
+        paramsGoal = fineTuneData.goal;
+        paramsAbout = fineTuneData.about;
+        paramsCustomInstructions = fineTuneData.customInstructions;
+
+        setGoal(paramsGoal);
+        setAbout(paramsAbout);
+        setCustomInstructions(paramsCustomInstructions);
+      }
+    }
+
+    handleGenerateCourse({
+      term: paramsTerm,
+      difficulty: paramsDifficulty,
+      instructions: paramsCustomInstructions,
+      goal: paramsGoal,
+      about: paramsAbout,
+    });
+  }, [term, difficulty]);
+
+  const handleGenerateCourse = async (options: {
+    term: string;
+    difficulty: string;
+    instructions?: string;
+    goal?: string;
+    about?: string;
+    isForce?: boolean;
+    prompt?: string;
+  }) => {
+    const { term, difficulty, isForce, prompt, instructions, goal, about } =
+      options;
+
+    if (!isLoggedIn()) {
+      window.location.href = '/ai-tutor';
+      return;
+    }
+
+    await generateCourse({
+      term,
+      difficulty,
+      slug: courseSlug,
+      onCourseIdChange: setCourseId,
+      onCourseSlugChange: setCourseSlug,
+      onCourseChange: setCourse,
+      onLoadingChange: setIsLoading,
+      onError: setError,
+      instructions,
+      goal,
+      about,
+      isForce,
+      prompt,
+    });
+  };
+
+  useEffect(() => {
+    const handlePopState = (e: PopStateEvent) => {
+      const { courseId, courseSlug, term, difficulty } = e.state || {};
+      if (!courseId || !courseSlug) {
+        window.location.reload();
+        return;
+      }
+
+      setCourseId(courseId);
+      setCourseSlug(courseSlug);
+      setTerm(term);
+      setDifficulty(difficulty);
+
+      setIsLoading(true);
+      handleGenerateCourse({ term, difficulty }).finally(() => {
+        setIsLoading(false);
+      });
+    };
+
+    window.addEventListener('popstate', handlePopState);
+    return () => {
+      window.removeEventListener('popstate', handlePopState);
+    };
+  }, []);
+
+  return (
+    <AICourseContent
+      courseSlug={courseSlug}
+      course={course}
+      isLoading={isLoading}
+      error={error}
+      onRegenerateOutline={(prompt) => {
+        handleGenerateCourse({
+          term,
+          difficulty,
+          isForce: true,
+          prompt,
+        });
+      }}
+    />
+  );
+}
diff --git a/src/components/GenerateCourse/GetAICourse.tsx b/src/components/GenerateCourse/GetAICourse.tsx
new file mode 100644
index 000000000..2ce9ee67a
--- /dev/null
+++ b/src/components/GenerateCourse/GetAICourse.tsx
@@ -0,0 +1,107 @@
+import { useQuery } from '@tanstack/react-query';
+import { getAiCourseOptions } from '../../queries/ai-course';
+import { queryClient } from '../../stores/query-client';
+import { useEffect, useState } from 'react';
+import { AICourseContent } from './AICourseContent';
+import { isLoggedIn } from '../../lib/jwt';
+import { generateCourse } from '../../helper/generate-ai-course';
+
+type GetAICourseProps = {
+  courseSlug: string;
+};
+
+export function GetAICourse(props: GetAICourseProps) {
+  const { courseSlug } = props;
+
+  const [isLoading, setIsLoading] = useState(true);
+  const [isRegenerating, setIsRegenerating] = useState(false);
+
+  const [error, setError] = useState('');
+  const { data: aiCourse, error: queryError } = useQuery(
+    {
+      ...getAiCourseOptions({ aiCourseSlug: courseSlug }),
+      enabled: !!courseSlug && !!isLoggedIn(),
+    },
+    queryClient,
+  );
+
+  useEffect(() => {
+    if (!isLoggedIn()) {
+      window.location.href = '/ai-tutor';
+    }
+  }, [isLoggedIn]);
+
+  useEffect(() => {
+    if (!aiCourse) {
+      return;
+    }
+
+    setIsLoading(false);
+  }, [aiCourse]);
+
+  useEffect(() => {
+    if (!queryError) {
+      return;
+    }
+
+    setIsLoading(false);
+    setError(queryError.message);
+  }, [queryError]);
+
+  const handleRegenerateCourse = async (prompt?: string) => {
+    if (!aiCourse) {
+      return;
+    }
+
+    queryClient.setQueryData(
+      getAiCourseOptions({ aiCourseSlug: courseSlug }).queryKey,
+      {
+        ...aiCourse,
+        title: '',
+        difficulty: '',
+        modules: [],
+      },
+    );
+
+    await generateCourse({
+      term: aiCourse.keyword,
+      difficulty: aiCourse.difficulty,
+      slug: courseSlug,
+      prompt,
+      onCourseChange: (course, rawData) => {
+        queryClient.setQueryData(
+          getAiCourseOptions({ aiCourseSlug: courseSlug }).queryKey,
+          {
+            ...aiCourse,
+            title: course.title,
+            difficulty: course.difficulty,
+            modules: course.modules,
+          },
+        );
+      },
+      onLoadingChange: (isNewLoading) => {
+        setIsRegenerating(isNewLoading);
+        if (!isNewLoading) {
+          // TODO: Update progress
+        }
+      },
+      onError: setError,
+      isForce: true,
+    });
+  };
+
+  return (
+    <AICourseContent
+      course={{
+        title: aiCourse?.title || '',
+        modules: aiCourse?.modules || [],
+        difficulty: aiCourse?.difficulty || 'Easy',
+        done: aiCourse?.done || [],
+      }}
+      isLoading={isLoading || isRegenerating}
+      courseSlug={courseSlug}
+      error={error}
+      onRegenerateOutline={handleRegenerateCourse}
+    />
+  );
+}
diff --git a/src/components/GenerateCourse/ModifyCoursePrompt.tsx b/src/components/GenerateCourse/ModifyCoursePrompt.tsx
new file mode 100644
index 000000000..35583635d
--- /dev/null
+++ b/src/components/GenerateCourse/ModifyCoursePrompt.tsx
@@ -0,0 +1,69 @@
+import { useState } from 'react';
+import { Modal } from '../Modal';
+
+export type ModifyCoursePromptProps = {
+  onClose: () => void;
+  onSubmit: (prompt: string) => void;
+};
+
+export function ModifyCoursePrompt(props: ModifyCoursePromptProps) {
+  const { onClose, onSubmit } = props;
+
+  const [prompt, setPrompt] = useState('');
+
+  const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
+    e.preventDefault();
+    onSubmit(prompt);
+  };
+
+  return (
+    <Modal
+      onClose={onClose}
+      wrapperClassName="rounded-xl max-w-xl w-full h-auto"
+      bodyClassName="p-6"
+      overlayClassName="items-start md:items-center"
+    >
+      <div className="flex flex-col gap-4">
+        <div>
+          <h2 className="mb-2 text-left text-xl font-semibold">
+            Give AI more context
+          </h2>
+          <p className="text-sm text-gray-500">
+            Pass additional information to the AI to generate a course outline.
+          </p>
+        </div>
+        <form className="flex flex-col gap-2" onSubmit={handleSubmit}>
+          <textarea
+            id="prompt"
+            autoFocus
+            rows={3}
+            value={prompt}
+            onChange={(e) => setPrompt(e.target.value)}
+            className="w-full rounded-md border border-gray-200 p-2 placeholder:text-sm focus:outline-black"
+            placeholder="e.g. make sure to add a section on React hooks"
+          />
+
+          <p className="text-sm text-gray-500">
+            Complete the sentence: "I want AI to..."
+          </p>
+
+          <div className="flex justify-end gap-2">
+            <button
+              className="rounded-md bg-gray-200 px-4 py-2.5 text-sm text-black hover:opacity-80"
+              onClick={onClose}
+            >
+              Cancel
+            </button>
+            <button
+              type="submit"
+              disabled={!prompt.trim()}
+              className="rounded-md bg-black px-4 py-2.5 text-sm text-white hover:opacity-80 disabled:opacity-50"
+            >
+              Modify Prompt
+            </button>
+          </div>
+        </form>
+      </div>
+    </Modal>
+  );
+}
diff --git a/src/components/GenerateCourse/RegenerateLesson.tsx b/src/components/GenerateCourse/RegenerateLesson.tsx
new file mode 100644
index 000000000..1323aa551
--- /dev/null
+++ b/src/components/GenerateCourse/RegenerateLesson.tsx
@@ -0,0 +1,88 @@
+import { PenSquare, RefreshCcw } from 'lucide-react';
+import { useRef, useState } from 'react';
+import { useOutsideClick } from '../../hooks/use-outside-click';
+import { cn } from '../../lib/classname';
+import { UpgradeAccountModal } from '../Billing/UpgradeAccountModal';
+import { ModifyCoursePrompt } from './ModifyCoursePrompt';
+
+type RegenerateLessonProps = {
+  onRegenerateLesson: (prompt?: string) => void;
+};
+
+export function RegenerateLesson(props: RegenerateLessonProps) {
+  const { onRegenerateLesson } = props;
+
+  const [isDropdownVisible, setIsDropdownVisible] = useState(false);
+  const [showUpgradeModal, setShowUpgradeModal] = useState(false);
+  const [showPromptModal, setShowPromptModal] = useState(false);
+
+  const ref = useRef<HTMLDivElement>(null);
+
+  useOutsideClick(ref, () => setIsDropdownVisible(false));
+
+  return (
+    <>
+      {showUpgradeModal && (
+        <UpgradeAccountModal
+          onClose={() => {
+            setShowUpgradeModal(false);
+          }}
+        />
+      )}
+
+      {showPromptModal && (
+        <ModifyCoursePrompt
+          title="Give AI more context"
+          description="Pass additional information to the AI to generate a lesson."
+          onClose={() => setShowPromptModal(false)}
+          onSubmit={(prompt) => {
+            setShowPromptModal(false);
+            onRegenerateLesson(prompt);
+          }}
+        />
+      )}
+
+      <div className="relative mr-2 flex items-center" ref={ref}>
+        <button
+          className={cn('rounded-full p-1 text-gray-400 hover:text-black', {
+            'text-black': isDropdownVisible,
+          })}
+          onClick={() => setIsDropdownVisible(!isDropdownVisible)}
+        >
+          <PenSquare className="text-current" size={16} strokeWidth={2.5} />
+        </button>
+        {isDropdownVisible && (
+          <div className="absolute right-0 top-full min-w-[170px] overflow-hidden rounded-md border border-gray-200 bg-white">
+            <button
+              onClick={() => {
+                onRegenerateLesson();
+              }}
+              className="flex w-full items-center gap-2.5 px-3 py-2 text-left text-sm text-gray-600 hover:bg-gray-100"
+            >
+              <RefreshCcw
+                size={16}
+                className="text-gray-400"
+                strokeWidth={2.5}
+              />
+              Regenerate
+            </button>
+            <button
+              onClick={() => {
+                setIsDropdownVisible(false);
+                setShowPromptModal(true);
+              }}
+              className="flex w-full items-center gap-2.5 px-3 py-2 text-left text-sm text-gray-600 hover:bg-gray-100"
+            >
+              <PenSquare
+                size={16}
+                className="text-gray-400"
+                strokeWidth={2.5}
+              />
+              Modify Prompt
+            </button>
+          </div>
+        )}
+      </div>
+    </>
+  );
+}
diff --git a/src/components/GenerateCourse/RegenerateOutline.tsx b/src/components/GenerateCourse/RegenerateOutline.tsx
new file mode 100644
index 000000000..aa2a3ef20
--- /dev/null
+++ b/src/components/GenerateCourse/RegenerateOutline.tsx
@@ -0,0 +1,86 @@
+import { PenSquare, RefreshCcw } from 'lucide-react';
+import { useRef, useState } from 'react';
+import { useOutsideClick } from '../../hooks/use-outside-click';
+import { cn } from '../../lib/classname';
+import { UpgradeAccountModal } from '../Billing/UpgradeAccountModal';
+import { ModifyCoursePrompt } from './ModifyCoursePrompt';
+
+type RegenerateOutlineProps = {
+  onRegenerateOutline: (prompt?: string) => void;
+};
+
+export function RegenerateOutline(props: RegenerateOutlineProps) {
+  const { onRegenerateOutline } = props;
+
+  const [isDropdownVisible, setIsDropdownVisible] = useState(false);
+  const [showUpgradeModal, setShowUpgradeModal] = useState(false);
+  const [showPromptModal, setShowPromptModal] = useState(false);
+
+  const ref = useRef<HTMLDivElement>(null);
+
+  useOutsideClick(ref, () => setIsDropdownVisible(false));
+
+  return (
+    <>
+      {showUpgradeModal && (
+        <UpgradeAccountModal
+          onClose={() => {
+            setShowUpgradeModal(false);
+          }}
+        />
+      )}
+
+      {showPromptModal && (
+        <ModifyCoursePrompt
+          onClose={() => setShowPromptModal(false)}
+          onSubmit={(prompt) => {
+            setShowPromptModal(false);
+            onRegenerateOutline(prompt);
+          }}
+        />
+      )}
+
+      <div className="absolute right-3 top-3" ref={ref}>
+        <button
+          className={cn('text-gray-400 hover:text-black', {
+            'text-black': isDropdownVisible,
+          })}
+          onClick={() => setIsDropdownVisible(!isDropdownVisible)}
+        >
+          <PenSquare className="text-current" size={16} strokeWidth={2.5} />
+        </button>
+        {isDropdownVisible && (
+          <div className="absolute right-0 top-full min-w-[170px] overflow-hidden rounded-md border border-gray-200 bg-white">
+            <button
+              onClick={() => {
+                onRegenerateOutline();
+              }}
+              className="flex w-full items-center gap-2.5 px-3 py-2 text-left text-sm text-gray-600 hover:bg-gray-100"
+            >
+              <RefreshCcw
+                size={16}
+                className="text-gray-400"
+                strokeWidth={2.5}
+              />
+              Regenerate
+            </button>
+            <button
+              onClick={() => {
+                setIsDropdownVisible(false);
+                setShowPromptModal(true);
+              }}
+              className="flex w-full items-center gap-2.5 px-3 py-2 text-left text-sm text-gray-600 hover:bg-gray-100"
+            >
+              <PenSquare
+                size={16}
+                className="text-gray-400"
+                strokeWidth={2.5}
+              />
+              Modify Prompt
+            </button>
+          </div>
+        )}
+      </div>
+    </>
+  );
+}
diff --git a/src/components/GenerateCourse/UserCoursesList.tsx b/src/components/GenerateCourse/UserCoursesList.tsx
new file mode 100644
index 000000000..798de8d5f
--- /dev/null
+++ b/src/components/GenerateCourse/UserCoursesList.tsx
@@ -0,0 +1,195 @@
+import { useQuery } from '@tanstack/react-query';
+import {
+  getAiCourseLimitOptions,
+  listUserAiCoursesOptions,
+  type ListUserAiCoursesQuery,
+} from '../../queries/ai-course';
+import { queryClient } from '../../stores/query-client';
+import { AICourseCard } from './AICourseCard';
+import { useEffect, useState } from 'react';
+import { Gift, Loader2, User2 } from 'lucide-react';
+import { isLoggedIn } from '../../lib/jwt';
+import { showLoginPopup } from '../../lib/popup';
+import { cn } from '../../lib/classname';
+import { useIsPaidUser } from '../../queries/billing';
+import { UpgradeAccountModal } from '../Billing/UpgradeAccountModal';
+import { getUrlParams, setUrlParams, deleteUrlParam } from '../../lib/browser';
+import { AICourseSearch } from './AICourseSearch';
+import { Pagination } from '../Pagination/Pagination';
+
+type UserCoursesListProps = {};
+
+export function UserCoursesList(props: UserCoursesListProps) {
+  const [isInitialLoading, setIsInitialLoading] = useState(true);
+  const [showUpgradePopup, setShowUpgradePopup] = useState(false);
+
+  const [pageState, setPageState] = useState<ListUserAiCoursesQuery>({
+    perPage: '10',
+    currPage: '1',
+    query: '',
+  });
+
+  const { data: limits, isLoading: isLimitsLoading } = useQuery(
+    getAiCourseLimitOptions(),
+    queryClient,
+  );
+
+  const { used, limit } = limits ?? { used: 0, limit: 0 };
+  const { isPaidUser, isLoading: isPaidUserLoading } = useIsPaidUser();
+
+  const { data: userAiCourses, isFetching: isUserAiCoursesLoading } = useQuery(
+    listUserAiCoursesOptions(pageState),
+    queryClient,
+  );
+
+  useEffect(() => {
+    setIsInitialLoading(false);
+  }, [userAiCourses]);
+
+  const courses = userAiCourses?.data ?? [];
+  const isAuthenticated = isLoggedIn();
+  const limitUsedPercentage = Math.round((used / limit) * 100);
+
+  useEffect(() => {
+    const queryParams = getUrlParams();
+
+    setPageState({
+      ...pageState,
+      currPage: queryParams?.p || '1',
+      query: queryParams?.q || '',
+    });
+  }, []);
+
+  useEffect(() => {
+    if (pageState?.currPage !== '1' || pageState?.query !== '') {
+      setUrlParams({
+        p: pageState?.currPage || '1',
+        q: pageState?.query || '',
+      });
+    } else {
+      deleteUrlParam('p');
+      deleteUrlParam('q');
+    }
+  }, [pageState]);
+
+  return (
+    <>
+      {showUpgradePopup && (
+        <UpgradeAccountModal onClose={() => setShowUpgradePopup(false)} />
+      )}
+      <div className="mb-3 flex min-h-[35px] items-center justify-between max-sm:mb-1">
+        <div className="flex items-center gap-2">
+          <h2 className="text-lg font-semibold">
+            <span className="max-md:hidden">Your </span>Courses
+          </h2>
+        </div>
+
+        <div className="flex items-center gap-2">
+          {used > 0 && limit > 0 && !isPaidUserLoading && (
+            <div
+              className={cn(
+                'pointer-events-none flex items-center gap-2 opacity-0 transition-opacity',
+                {
+                  'pointer-events-auto opacity-100': !isPaidUser,
+                },
+              )}
+            >
+              <p className="flex items-center text-sm text-yellow-600">
+                <span className="max-md:hidden">
+                  {limitUsedPercentage}% of daily limit used{' '}
+                </span>
+                <span className="inline md:hidden">
+                  {limitUsedPercentage}% used
+                </span>
+                <button
+                  onClick={() => {
+                    setShowUpgradePopup(true);
+                  }}
+                  className="ml-1.5 flex items-center gap-1 rounded-full bg-yellow-600 py-0.5 pl-1.5 pr-2 text-xs text-white"
+                >
+                  <Gift className="size-4" />
+                  Upgrade
+                </button>
+              </p>
+            </div>
+          )}
+
+          <AICourseSearch
+            value={pageState?.query || ''}
+            onChange={(value) => {
+              setPageState({
+                ...pageState,
+                query: value,
+                currPage: '1',
+              });
+            }}
+          />
+        </div>
+      </div>
+
+      {!isInitialLoading && !isUserAiCoursesLoading && !isAuthenticated && (
+        <div className="flex min-h-[152px] flex-col items-center justify-center rounded-lg border border-gray-200 bg-white px-6 py-4">
+          <User2 className="mb-2 size-8 text-gray-300" />
+          <p className="max-w-sm text-balance text-center text-gray-500">
+            <button
+              onClick={() => {
+                showLoginPopup();
+              }}
+              className="font-medium text-black underline underline-offset-2 hover:opacity-80"
+            >
+              Sign up (free and takes 2s) or login
+            </button>{' '}
+            to generate and save courses.
+          </p>
+        </div>
+      )}
+
+      {!isUserAiCoursesLoading && !isInitialLoading && courses.length === 0 && isAuthenticated && (
+        <div className="flex min-h-[152px] items-center justify-center rounded-lg border border-gray-200 bg-white py-4">
+          <p className="text-sm text-gray-600">
+            You haven't generated any courses yet.
+          </p>
+        </div>
+      )}
+
+      {(isUserAiCoursesLoading || isInitialLoading) && (
+        <div className="flex min-h-[152px] items-center justify-center gap-2 rounded-lg border border-gray-200 bg-white py-4">
+          <Loader2
+            className="size-4 animate-spin text-gray-400"
+            strokeWidth={2.5}
+          />
+          <p className="text-sm font-medium text-gray-600">Loading...</p>
+        </div>
+      )}
+
+      {!isUserAiCoursesLoading && courses && courses.length > 0 && (
+        <div className="flex flex-col gap-2">
+          {courses.map((course) => (
+            <AICourseCard key={course._id} course={course} />
+          ))}
+
+          <Pagination
+            totalCount={userAiCourses?.totalCount || 0}
+            totalPages={userAiCourses?.totalPages || 0}
+            currPage={Number(userAiCourses?.currPage || 1)}
+            perPage={Number(userAiCourses?.perPage || 10)}
+            onPageChange={(page) => {
+              setPageState({ ...pageState, currPage: String(page) });
+            }}
+            className="rounded-lg border border-gray-200 bg-white p-4"
+          />
+        </div>
+      )}
+
+      {!isUserAiCoursesLoading &&
+        (userAiCourses?.data?.length || 0 > 0) &&
+        courses.length === 0 && (
+          <div className="flex min-h-[114px] items-center justify-center rounded-lg border border-gray-200 bg-white py-4">
+            <p className="text-sm text-gray-600">
+              No courses match your search.
+            </p>
+          </div>
+        )}
+    </>
+  );
+}
diff --git a/src/components/GenerateRoadmap/AITermSuggestionInput.tsx b/src/components/GenerateRoadmap/AITermSuggestionInput.tsx
index 1d183534a..bb388f05f 100644
--- a/src/components/GenerateRoadmap/AITermSuggestionInput.tsx
+++ b/src/components/GenerateRoadmap/AITermSuggestionInput.tsx
@@ -128,32 +128,32 @@ export function AITermSuggestionInput(props: AITermSuggestionInputProps) {
     return allRoadmaps;
   };
 
-  useEffect(() => {
-    if (debouncedSearchValue.length === 0 || isFirstRender.current) {
-      setSearchResults([]);
-      return;
-    }
+  // useEffect(() => {
+  //   if (debouncedSearchValue.length === 0 || isFirstRender.current) {
+  //     setSearchResults([]);
+  //     return;
+  //   }
 
-    setIsActive(true);
-    setIsLoading(true);
-    loadTopAIRoadmapTerm()
-      .then((results) => {
-        const normalizedSearchText = debouncedSearchValue.trim().toLowerCase();
-        const matchingOfficialRoadmaps = officialRoadmaps.filter((roadmap) => {
-          return (
-            roadmap.title.toLowerCase().indexOf(normalizedSearchText) !== -1
-          );
-        });
+  //   setIsActive(true);
+  //   setIsLoading(true);
+  //   loadTopAIRoadmapTerm()
+  //     .then((results) => {
+  //       const normalizedSearchText = debouncedSearchValue.trim().toLowerCase();
+  //       const matchingOfficialRoadmaps = officialRoadmaps.filter((roadmap) => {
+  //         return (
+  //           roadmap.title.toLowerCase().indexOf(normalizedSearchText) !== -1
+  //         );
+  //       });
 
-        setSearchResults(
-          [...matchingOfficialRoadmaps, ...results]?.slice(0, 5) || [],
-        );
-        setActiveCounter(0);
-      })
-      .finally(() => {
-        setIsLoading(false);
-      });
-  }, [debouncedSearchValue]);
+  //       setSearchResults(
+  //         [...matchingOfficialRoadmaps, ...results]?.slice(0, 5) || [],
+  //       );
+  //       setActiveCounter(0);
+  //     })
+  //     .finally(() => {
+  //       setIsLoading(false);
+  //     });
+  // }, [debouncedSearchValue]);
 
   useEffect(() => {
     if (isFirstRender.current) {
diff --git a/src/components/GenerateRoadmap/GenerateRoadmap.tsx b/src/components/GenerateRoadmap/GenerateRoadmap.tsx
index ccb2cf16f..945fc2a35 100644
--- a/src/components/GenerateRoadmap/GenerateRoadmap.tsx
+++ b/src/components/GenerateRoadmap/GenerateRoadmap.tsx
@@ -11,7 +11,6 @@ import { useToast } from '../../hooks/use-toast';
 import { generateAIRoadmapFromText } from '../../../editor/utils/roadmap-generator';
 import { renderFlowJSON } from '../../../editor/renderer/renderer';
 import { replaceChildren } from '../../lib/dom';
-import { readAIRoadmapStream } from '../../helper/read-stream';
 import {
   getOpenAIKey,
   isLoggedIn,
@@ -31,7 +30,7 @@ import { showLoginPopup } from '../../lib/popup.ts';
 import { cn } from '../../lib/classname.ts';
 import { RoadmapTopicDetail } from './RoadmapTopicDetail.tsx';
 import { AIRoadmapAlert } from './AIRoadmapAlert.tsx';
-import { IS_KEY_ONLY_ROADMAP_GENERATION } from '../../lib/ai.ts';
+import { IS_KEY_ONLY_ROADMAP_GENERATION, readAIRoadmapStream } from '../../lib/ai.ts';
 import { AITermSuggestionInput } from './AITermSuggestionInput.tsx';
 import { IncreaseRoadmapLimit } from './IncreaseRoadmapLimit.tsx';
 import { AuthenticationForm } from '../AuthenticationFlow/AuthenticationForm.tsx';
diff --git a/src/components/GenerateRoadmap/RoadmapTopicDetail.tsx b/src/components/GenerateRoadmap/RoadmapTopicDetail.tsx
index 560d9e940..33938800a 100644
--- a/src/components/GenerateRoadmap/RoadmapTopicDetail.tsx
+++ b/src/components/GenerateRoadmap/RoadmapTopicDetail.tsx
@@ -3,13 +3,13 @@ import { useEffect, useMemo, useRef, useState } from 'react';
 import { useKeydown } from '../../hooks/use-keydown';
 import { useOutsideClick } from '../../hooks/use-outside-click';
 import { markdownToHtml } from '../../lib/markdown';
-import { Ban, Cog, Contact, FileText, User, UserRound, X } from 'lucide-react';
+import { Ban, Cog, Contact, FileText, X } from 'lucide-react';
 import { Spinner } from '../ReactIcons/Spinner';
 import type { RoadmapNodeDetails } from './GenerateRoadmap';
 import { getOpenAIKey, isLoggedIn, removeAuthToken } from '../../lib/jwt';
-import { readAIRoadmapContentStream } from '../../helper/read-stream';
 import { cn } from '../../lib/classname';
 import { showLoginPopup } from '../../lib/popup';
+import { readAIRoadmapContentStream } from '../../lib/ai';
 
 type RoadmapTopicDetailProps = RoadmapNodeDetails & {
   onClose?: () => void;
diff --git a/src/components/Guide/RelatedGuides.tsx b/src/components/Guide/RelatedGuides.tsx
index fe565dfcc..08f313e8f 100644
--- a/src/components/Guide/RelatedGuides.tsx
+++ b/src/components/Guide/RelatedGuides.tsx
@@ -1,6 +1,6 @@
+import { ChevronDown } from 'lucide-react';
 import { useState } from 'react';
 import { cn } from '../../lib/classname';
-import { ChevronDown } from 'lucide-react';
 
 type RelatedGuidesProps = {
   relatedTitle?: string;
@@ -27,7 +27,7 @@ export function RelatedGuides(props: RelatedGuidesProps) {
     <div className={cn('relative min-w-[250px] pt-0 lg:px-5 lg:pt-10')}>
       <h4 className="text-lg font-medium max-lg:hidden">{relatedTitle}</h4>
       <button
-        className="flex border-b w-full items-center justify-between gap-2 bg-gray-300 px-3 py-2 text-sm font-medium lg:hidden"
+        className="flex w-full items-center justify-between gap-2 border-b bg-gray-300 px-3 py-2 text-sm font-medium lg:hidden"
         onClick={() => setIsOpen(!isOpen)}
       >
         {relatedTitle}
diff --git a/src/components/GuideListItem.astro b/src/components/GuideListItem.astro
deleted file mode 100644
index a862ad354..000000000
--- a/src/components/GuideListItem.astro
+++ /dev/null
@@ -1,61 +0,0 @@
----
-import type { GuideFileType, GuideFrontmatter } from '../lib/guide';
-import { type QuestionGroupType } from '../lib/question-group';
-
-export interface Props {
-  guide: GuideFileType | QuestionGroupType;
-}
-
-function isQuestionGroupType(
-  guide: GuideFileType | QuestionGroupType,
-): guide is QuestionGroupType {
-  return (guide as QuestionGroupType).questions !== undefined;
-}
-
-const { guide } = Astro.props;
-const { frontmatter, id } = guide;
-
-let pageUrl = '';
-let guideType = '';
-
-if (isQuestionGroupType(guide)) {
-  pageUrl = `/questions/${id}`;
-  guideType = 'Questions';
-} else {
-  const excludedBySlug = (frontmatter as GuideFrontmatter).excludedBySlug;
-  pageUrl = excludedBySlug ? excludedBySlug : `/guides/${id}`;
-  guideType = (frontmatter as GuideFrontmatter).type;
-}
----
-
-<a
-  class:list={[
-    'text-md group block flex items-center justify-between border-b py-2 text-gray-600 no-underline hover:text-blue-600',
-  ]}
-  href={pageUrl}
->
-  <span
-    class='text-sm transition-transform group-hover:translate-x-2 md:text-base'
-  >
-    {frontmatter.title}
-
-    {
-      frontmatter.isNew && (
-        <span class='ml-1.5 rounded-sm bg-green-300 px-1.5 py-0.5 text-xs font-medium uppercase text-green-900'>
-          New
-          <span class='hidden sm:inline'>
-            &middot;
-            {new Date(frontmatter.date || '').toLocaleString('default', {
-              month: 'long',
-            })}
-          </span>
-        </span>
-      )
-    }
-  </span>
-  <span class='hidden text-xs capitalize text-gray-500 sm:block'>
-    {guideType}
-  </span>
-
-  <span class='block text-xs text-gray-400 sm:hidden'> &raquo;</span>
-</a>
diff --git a/src/components/HeroSection/FavoriteRoadmaps.tsx b/src/components/HeroSection/FavoriteRoadmaps.tsx
index a639be626..e8e48aec0 100644
--- a/src/components/HeroSection/FavoriteRoadmaps.tsx
+++ b/src/components/HeroSection/FavoriteRoadmaps.tsx
@@ -1,164 +1,229 @@
-import { useEffect, useState } from 'react';
-import { EmptyProgress } from './EmptyProgress';
-import { httpGet } from '../../lib/http';
-import { HeroRoadmaps, type HeroTeamRoadmaps } from './HeroRoadmaps';
-import { isLoggedIn } from '../../lib/jwt';
-import type { AllowedMemberRoles } from '../ShareOptions/ShareTeamMemberList.tsx';
-
-export type UserProgressResponse = {
-  resourceId: string;
-  resourceType: 'roadmap' | 'best-practice';
-  resourceTitle: string;
-  isFavorite: boolean;
-  done: number;
-  learning: number;
-  skipped: number;
-  total: number;
-  updatedAt: Date;
-  isCustomResource: boolean;
-  roadmapSlug?: string;
-  team?: {
-    name: string;
-    id: string;
-    role: AllowedMemberRoles;
-  };
-}[];
-
-function renderProgress(progressList: UserProgressResponse) {
-  progressList.forEach((progress) => {
-    const href =
-      progress.resourceType === 'best-practice'
-        ? `/best-practices/${progress.resourceId}`
-        : `/${progress.resourceId}`;
-    const element = document.querySelector(`a[href="${href}"]`);
-    if (!element) {
-      return;
-    }
-
-    window.dispatchEvent(
-      new CustomEvent('mark-favorite', {
-        detail: {
-          resourceId: progress.resourceId,
-          resourceType: progress.resourceType,
-          isFavorite: progress.isFavorite,
-        },
-      }),
-    );
-
-    const totalDone = progress.done + progress.skipped;
-    const percentageDone = (totalDone / progress.total) * 100;
-
-    const progressBar: HTMLElement | null =
-      element.querySelector('[data-progress]');
-    if (progressBar) {
-      progressBar.style.width = `${percentageDone}%`;
-    }
-  });
-}
-
-type ProgressResponse = UserProgressResponse;
-
-export function FavoriteRoadmaps() {
-  const isAuthenticated = isLoggedIn();
-  if (!isAuthenticated) {
-    return null;
-  }
-
-  const [isPreparing, setIsPreparing] = useState(true);
-  const [isLoading, setIsLoading] = useState(true);
-  const [progress, setProgress] = useState<ProgressResponse>([]);
-  const [containerOpacity, setContainerOpacity] = useState(0);
-
-  function showProgressContainer() {
-    const heroEl = document.getElementById('hero-text')!;
-    if (!heroEl) {
-      return;
-    }
-
-    heroEl.classList.add('opacity-0');
-    setTimeout(() => {
-      heroEl.parentElement?.removeChild(heroEl);
-      setIsPreparing(false);
-
-      setTimeout(() => {
-        setContainerOpacity(100);
-      }, 50);
-    }, 0);
-  }
-
-  async function loadProgress() {
-    setIsLoading(true);
-
-    const { response: progressList, error } = await httpGet<ProgressResponse>(
-      `${import.meta.env.PUBLIC_API_URL}/v1-get-hero-roadmaps`,
-    );
-
-    if (error || !progressList) {
-      return;
-    }
-
-    setProgress(progressList);
-    setIsLoading(false);
-    showProgressContainer();
-
-    // render progress on featured items
-    renderProgress(progressList);
-  }
-
-  useEffect(() => {
-    loadProgress().finally(() => {
-      setIsLoading(false);
-    });
-  }, []);
-
-  useEffect(() => {
-    window.addEventListener('refresh-favorites', loadProgress);
-    return () => window.removeEventListener('refresh-favorites', loadProgress);
-  }, []);
-
-  if (isPreparing) {
-    return null;
-  }
-
-  const hasProgress = progress?.length > 0;
-  const customRoadmaps = progress?.filter(
-    (p) => p.isCustomResource && !p.team?.name,
+import {
+  FolderKanban,
+  MapIcon,
+  Plus,
+  Sparkle,
+  Eye,
+  EyeOff,
+  Square,
+  SquareCheckBig,
+} from 'lucide-react';
+import { useState } from 'react';
+import type { ProjectStatusDocument } from '../Projects/ListProjectSolutions.tsx';
+import { CheckIcon } from '../ReactIcons/CheckIcon.tsx';
+import type { UserProgress } from '../TeamProgress/TeamProgressPage.tsx';
+import { HeroProject } from './HeroProject';
+import { HeroRoadmap } from './HeroRoadmap';
+import { CreateRoadmapButton } from '../CustomRoadmap/CreateRoadmap/CreateRoadmapButton.tsx';
+import { HeroItemsGroup } from './HeroItemsGroup';
+import { CreateRoadmapModal } from '../CustomRoadmap/CreateRoadmap/CreateRoadmapModal.tsx';
+
+export type AIRoadmapType = {
+  id: string;
+  title: string;
+  slug: string;
+};
+
+type FavoriteRoadmapsProps = {
+  progress: UserProgress[];
+  projects: (ProjectStatusDocument & {
+    title: string;
+  })[];
+  customRoadmaps: UserProgress[];
+  aiRoadmaps: AIRoadmapType[];
+  isLoading: boolean;
+};
+
+export function FavoriteRoadmaps(props: FavoriteRoadmapsProps) {
+  const { progress, isLoading, customRoadmaps, aiRoadmaps, projects } = props;
+  const [showCompleted, setShowCompleted] = useState(false);
+  const [isCreatingCustomRoadmap, setIsCreatingCustomRoadmap] = useState(false);
+
+  const completedProjects = projects.filter(
+    (project) => project.submittedAt && project.repositoryUrl,
+  );
+  const inProgressProjects = projects.filter(
+    (project) => !project.submittedAt || !project.repositoryUrl,
   );
-  const defaultRoadmaps = progress?.filter((p) => !p.isCustomResource);
-  const teamRoadmaps: HeroTeamRoadmaps = progress
-    ?.filter((p) => p.isCustomResource && p.team?.name)
-    .reduce((acc: HeroTeamRoadmaps, curr) => {
-      const currTeam = curr.team!;
-      if (!acc[currTeam.name]) {
-        acc[currTeam.name] = [];
-      }
-
-      acc[currTeam.name].push(curr);
 
-      return acc;
-    }, {});
+  const projectsToShow = [
+    ...inProgressProjects,
+    ...(showCompleted ? completedProjects : []),
+  ];
 
   return (
-    <div
-      className={`transition-opacity duration-500  opacity-${containerOpacity}`}
-    >
-      <div
-        className={`flex min-h-[192px] bg-gradient-to-b sm:min-h-[280px] ${
-          hasProgress && `border-t border-t-[#1e293c]`
-        }`}
+    <div className="flex flex-col">
+      {isCreatingCustomRoadmap && (
+        <CreateRoadmapModal
+          onClose={() => {
+            setIsCreatingCustomRoadmap(false);
+          }}
+        />
+      )}
+
+      <HeroItemsGroup
+        icon={<CheckIcon additionalClasses="mr-1.5 h-[14px] w-[14px]" />}
+        isLoading={isLoading}
+        title="Your progress and bookmarks"
+        isEmpty={!isLoading && progress.length === 0}
+        emptyTitle={
+          <>
+            No bookmarks found
+            <a
+              href="#role-based-roadmaps"
+              className="ml-1.5 inline-flex items-center gap-1 font-medium text-blue-500 underline-offset-2 hover:underline"
+            >
+              <SquareCheckBig className="size-3.5" strokeWidth={2.5} />
+              Bookmark a roadmap
+            </a>
+          </>
+        }
+      >
+        {progress.map((resource) => (
+          <HeroRoadmap
+            key={`${resource.resourceType}-${resource.resourceId}`}
+            resourceId={resource.resourceId}
+            resourceType={resource.resourceType}
+            resourceTitle={resource.resourceTitle}
+            isFavorite={resource.isFavorite}
+            percentageDone={
+              ((resource.skipped + resource.done) / resource.total) * 100
+            }
+            url={
+              resource.resourceType === 'roadmap'
+                ? `/${resource.resourceId}`
+                : `/best-practices/${resource.resourceId}`
+            }
+          />
+        ))}
+      </HeroItemsGroup>
+
+      <HeroItemsGroup
+        icon={<MapIcon className="mr-1.5 h-[14px] w-[14px]" />}
+        isLoading={isLoading}
+        title="Your custom roadmaps"
+        isEmpty={!isLoading && customRoadmaps.length === 0}
+        emptyTitle={
+          <>
+            No custom roadmaps found
+            <button
+              onClick={() => {
+                setIsCreatingCustomRoadmap(true);
+              }}
+              className="ml-1.5 inline-flex items-center gap-1 font-medium text-blue-500 underline-offset-2 hover:underline"
+            >
+              <SquareCheckBig className="size-3.5" strokeWidth={2.5} />
+              Create custom roadmap
+            </button>
+          </>
+        }
+      >
+        {customRoadmaps.map((customRoadmap) => (
+          <HeroRoadmap
+            key={customRoadmap.resourceId}
+            resourceId={customRoadmap.resourceId}
+            resourceType={'roadmap'}
+            resourceTitle={customRoadmap.resourceTitle}
+            percentageDone={
+              ((customRoadmap.skipped + customRoadmap.done) /
+                customRoadmap.total) *
+              100
+            }
+            url={`/r/${customRoadmap?.roadmapSlug}`}
+            allowFavorite={false}
+          />
+        ))}
+        <CreateRoadmapButton />
+      </HeroItemsGroup>
+
+      <HeroItemsGroup
+        icon={<Sparkle className="mr-1.5 h-[14px] w-[14px]" />}
+        isLoading={isLoading}
+        title="Your AI roadmaps"
+        isEmpty={!isLoading && aiRoadmaps.length === 0}
+        emptyTitle={
+          <>
+            No AI roadmaps found
+            <a
+              href="/ai"
+              className="ml-1.5 inline-flex items-center gap-1 font-medium text-blue-500 underline-offset-2 hover:underline"
+            >
+              <SquareCheckBig className="size-3.5" strokeWidth={2.5} />
+              Generate AI roadmap
+            </a>
+          </>
+        }
+      >
+        {aiRoadmaps.map((aiRoadmap) => (
+          <HeroRoadmap
+            key={aiRoadmap.id}
+            resourceId={aiRoadmap.id}
+            resourceType={'roadmap'}
+            resourceTitle={aiRoadmap.title}
+            url={`/ai/${aiRoadmap.slug}`}
+            percentageDone={0}
+            allowFavorite={false}
+            isTrackable={false}
+          />
+        ))}
+
+        <a
+          href="/ai"
+          className={
+            'flex h-full w-full items-center justify-center gap-1 overflow-hidden rounded-md border border-dashed border-gray-800 p-3 text-sm text-gray-400 hover:border-gray-600 hover:bg-gray-900 hover:text-gray-300'
+          }
+        >
+          <Plus size={16} />
+          Generate New
+        </a>
+      </HeroItemsGroup>
+
+      <HeroItemsGroup
+        icon={<FolderKanban className="mr-1.5 h-[14px] w-[14px]" />}
+        isLoading={isLoading}
+        title="Your active projects"
+        isEmpty={!isLoading && projectsToShow.length === 0}
+        emptyTitle={
+          <>
+            No active projects found
+            <a
+              href="/projects"
+              className="ml-1.5 inline-flex items-center gap-1 font-medium text-blue-500 underline-offset-2 hover:underline"
+            >
+              <SquareCheckBig className="size-3.5" strokeWidth={2.5} />
+              Start a new project
+            </a>
+          </>
+        }
+        rightContent={
+          completedProjects.length > 0 && (
+            <button
+              onClick={() => setShowCompleted(!showCompleted)}
+              className="hidden items-center gap-2 rounded-md text-xs text-slate-400 hover:text-slate-300 sm:flex"
+            >
+              {showCompleted ? (
+                <EyeOff className="h-3.5 w-3.5" />
+              ) : (
+                <Eye className="h-3.5 w-3.5" />
+              )}
+              {completedProjects.length} Completed
+            </button>
+          )
+        }
+        className="border-b-0"
       >
-        <div className="container min-h-full">
-          {!isLoading && progress?.length == 0 && <EmptyProgress />}
-          {hasProgress && (
-            <HeroRoadmaps
-              teamRoadmaps={teamRoadmaps}
-              customRoadmaps={customRoadmaps}
-              progress={defaultRoadmaps}
-              isLoading={isLoading}
-            />
-          )}
-        </div>
-      </div>
+        {projectsToShow.map((project) => (
+          <HeroProject key={project._id} project={project} />
+        ))}
+
+        <a
+          href="/projects"
+          className="flex min-h-[80px] items-center justify-center gap-2 rounded-md border border-dashed border-slate-800 p-4 text-sm text-slate-400 hover:border-slate-600 hover:bg-slate-900/50 hover:text-slate-300"
+        >
+          <Plus size={16} />
+          Start a new project
+        </a>
+      </HeroItemsGroup>
     </div>
   );
 }
diff --git a/src/components/HeroSection/HeroItemsGroup.tsx b/src/components/HeroSection/HeroItemsGroup.tsx
new file mode 100644
index 000000000..40fe39b49
--- /dev/null
+++ b/src/components/HeroSection/HeroItemsGroup.tsx
@@ -0,0 +1,76 @@
+import { useEffect, useState, type ReactNode } from 'react';
+import { cn } from '../../lib/classname';
+import { HeroTitle } from './HeroTitle';
+
+type HeroItemsGroupProps = {
+  icon: any;
+  isLoading?: boolean;
+  isEmpty?: boolean;
+  emptyTitle?: ReactNode;
+  title: string | ReactNode;
+  rightContent?: ReactNode;
+  children?: ReactNode;
+  className?: string;
+};
+
+export function HeroItemsGroup(props: HeroItemsGroupProps) {
+  const {
+    icon,
+    isLoading = false,
+    isEmpty = false,
+    emptyTitle,
+    title,
+    rightContent,
+    children,
+    className,
+  } = props;
+
+  const storageKey = `hero-group-${title}-collapsed`;
+  const [isCollapsed, setIsCollapsed] = useState(true);
+
+  function isCollapsedByStorage() {
+    const stored = localStorage.getItem(storageKey);
+
+    return stored === 'true';
+  }
+
+  useEffect(() => {
+    setIsCollapsed(isCollapsedByStorage());
+  }, [isLoading]);
+
+  const isLoadingOrCollapsedOrEmpty = isLoading || isCollapsed || isEmpty;
+
+  return (
+    <div
+      className={cn(
+        'border-b border-gray-800/50',
+        {
+          'py-4': !isLoadingOrCollapsedOrEmpty,
+          'py-4 ': isLoadingOrCollapsedOrEmpty,
+        },
+        className,
+      )}
+    >
+      <div className="container">
+        <HeroTitle
+          icon={icon}
+          isLoading={isLoading}
+          isEmpty={isEmpty}
+          emptyTitle={emptyTitle}
+          title={title}
+          rightContent={rightContent}
+          isCollapsed={isCollapsed}
+          onToggleCollapse={() => {
+            setIsCollapsed(!isCollapsed);
+            localStorage.setItem(storageKey, (!isCollapsed).toString());
+          }}
+        />
+        {!isLoadingOrCollapsedOrEmpty && (
+          <div className="mt-4 grid grid-cols-1 gap-2.5 sm:grid-cols-2 md:grid-cols-3">
+            {children}
+          </div>
+        )}
+      </div>
+    </div>
+  );
+}
diff --git a/src/components/HeroSection/HeroProject.tsx b/src/components/HeroSection/HeroProject.tsx
new file mode 100644
index 000000000..c86f08076
--- /dev/null
+++ b/src/components/HeroSection/HeroProject.tsx
@@ -0,0 +1,52 @@
+import { ThumbsUp } from 'lucide-react';
+import { cn } from '../../lib/classname.ts';
+import { getRelativeTimeString } from '../../lib/date';
+import type { ProjectStatusDocument } from '../Projects/ListProjectSolutions.tsx';
+
+type HeroProjectProps = {
+  project: ProjectStatusDocument & {
+    title: string;
+  };
+};
+
+export function HeroProject({ project }: HeroProjectProps) {
+  return (
+    <a
+      href={`/projects/${project.projectId}`}
+      className="group relative flex flex-col justify-between gap-2 rounded-md border border-slate-800 bg-slate-900 p-3.5 hover:border-slate-600"
+    >
+      <div className="relative z-10 flex items-start justify-between gap-2">
+        <h3 className="truncate font-medium text-slate-300 group-hover:text-slate-100">
+          {project.title}
+        </h3>
+        <span
+          className={cn(
+            'absolute -right-2 -top-2 flex flex-shrink-0 items-center gap-1 rounded-full text-xs uppercase tracking-wide',
+            {
+              'text-green-600/50': project.submittedAt && project.repositoryUrl,
+              'text-yellow-600': !project.submittedAt || !project.repositoryUrl,
+            },
+          )}
+        >
+          {project.submittedAt && project.repositoryUrl ? 'Done' : ''}
+        </span>
+      </div>
+      <div className="relative z-10 flex items-center gap-2 text-xs text-slate-400">
+        {project.submittedAt && project.repositoryUrl && (
+          <span className="flex items-center gap-1">
+            <ThumbsUp className="h-3 w-3" />
+            {project.upvotes}
+          </span>
+        )}
+        {project.startedAt && (
+          <span>Started {getRelativeTimeString(project.startedAt)}</span>
+        )}
+      </div>
+
+      <div className="absolute inset-0 rounded-md bg-gradient-to-br from-slate-800/50 via-transparent to-transparent" />
+      {project.submittedAt && project.repositoryUrl && (
+        <div className="absolute inset-0 rounded-md bg-gradient-to-br from-green-950/20 via-transparent to-transparent" />
+      )}
+    </a>
+  );
+} 
\ No newline at end of file
diff --git a/src/components/HeroSection/HeroRoadmap.tsx b/src/components/HeroSection/HeroRoadmap.tsx
new file mode 100644
index 000000000..c8f15ad2e
--- /dev/null
+++ b/src/components/HeroSection/HeroRoadmap.tsx
@@ -0,0 +1,74 @@
+import { cn } from '../../lib/classname.ts';
+import type { ResourceType } from '../../lib/resource-progress.ts';
+import { MarkFavorite } from '../FeaturedItems/MarkFavorite.tsx';
+
+type ProgressRoadmapProps = {
+  url: string;
+  percentageDone: number;
+  allowFavorite?: boolean;
+
+  resourceId: string;
+  resourceType: ResourceType;
+  resourceTitle: string;
+  isFavorite?: boolean;
+
+  isTrackable?: boolean;
+  isNew?: boolean;
+};
+
+export function HeroRoadmap(props: ProgressRoadmapProps) {
+  const {
+    url,
+    percentageDone,
+    resourceType,
+    resourceId,
+    resourceTitle,
+    isFavorite,
+    allowFavorite = true,
+    isTrackable = true,
+    isNew = false,
+  } = props;
+
+  return (
+    <a
+      href={url}
+      className={cn(
+        'relative flex flex-col overflow-hidden rounded-md border p-3 text-sm text-slate-400 hover:text-slate-300',
+        {
+          'border-slate-800 bg-slate-900 hover:border-slate-600': isTrackable,
+          'border-slate-700/50 bg-slate-800/50 hover:border-slate-600/70':
+            !isTrackable,
+        },
+      )}
+    >
+      <span title={resourceTitle} className="relative z-20 truncate">
+        {resourceTitle}
+      </span>
+
+      {isTrackable && (
+        <span
+          className="absolute bottom-0 left-0 top-0 z-10 bg-[#172a3a]"
+          style={{ width: `${percentageDone}%` }}
+        ></span>
+      )}
+
+      {allowFavorite && (
+        <MarkFavorite
+          resourceId={resourceId}
+          resourceType={resourceType}
+          favorite={isFavorite}
+        />
+      )}
+
+      {isNew && (
+        <span className="absolute bottom-1.5 right-2 flex items-center rounded-br rounded-tl text-xs font-medium text-purple-300">
+          <span className="mr-1.5 flex h-2 w-2">
+            <span className="absolute inline-flex h-2 w-2 animate-ping rounded-full bg-purple-400 opacity-75" />
+            <span className="relative inline-flex h-2 w-2 rounded-full bg-purple-500" />
+          </span>
+          New
+        </span>
+      )}
+    </a>
+  );
+} 
\ No newline at end of file
diff --git a/src/components/HeroSection/HeroRoadmaps.tsx b/src/components/HeroSection/HeroRoadmaps.tsx
deleted file mode 100644
index 7633f0ab7..000000000
--- a/src/components/HeroSection/HeroRoadmaps.tsx
+++ /dev/null
@@ -1,264 +0,0 @@
-import type { UserProgressResponse } from './FavoriteRoadmaps';
-import { CheckIcon } from '../ReactIcons/CheckIcon';
-import { MarkFavorite } from '../FeaturedItems/MarkFavorite';
-import { Spinner } from '../ReactIcons/Spinner';
-import type { ResourceType } from '../../lib/resource-progress';
-import { MapIcon, Users2 } from 'lucide-react';
-import { CreateRoadmapButton } from '../CustomRoadmap/CreateRoadmap/CreateRoadmapButton';
-import { CreateRoadmapModal } from '../CustomRoadmap/CreateRoadmap/CreateRoadmapModal';
-import { type ReactNode, useState } from 'react';
-import { FeatureAnnouncement } from '../FeatureAnnouncement.tsx';
-
-type ProgressRoadmapProps = {
-  url: string;
-  percentageDone: number;
-  allowFavorite?: boolean;
-
-  resourceId: string;
-  resourceType: ResourceType;
-  resourceTitle: string;
-  isFavorite?: boolean;
-};
-function HeroRoadmap(props: ProgressRoadmapProps) {
-  const {
-    url,
-    percentageDone,
-    resourceType,
-    resourceId,
-    resourceTitle,
-    isFavorite,
-    allowFavorite = true,
-  } = props;
-
-  return (
-    <a
-      href={url}
-      className="relative flex flex-col overflow-hidden rounded-md border border-slate-800 bg-slate-900 p-3 text-sm text-slate-400 hover:border-slate-600 hover:text-slate-300"
-    >
-      <span className="relative z-20">{resourceTitle}</span>
-
-      <span
-        className="absolute bottom-0 left-0 top-0 z-10 bg-[#172a3a]"
-        style={{ width: `${percentageDone}%` }}
-      ></span>
-
-      {allowFavorite && (
-        <MarkFavorite
-          resourceId={resourceId}
-          resourceType={resourceType}
-          favorite={isFavorite}
-        />
-      )}
-    </a>
-  );
-}
-
-type ProgressTitleProps = {
-  icon: any;
-  isLoading?: boolean;
-  title: string | ReactNode;
-};
-
-export function HeroTitle(props: ProgressTitleProps) {
-  const { isLoading = false, title, icon } = props;
-
-  return (
-    <p className="mb-4 flex items-center text-sm text-gray-400">
-      {!isLoading && icon}
-      {isLoading && (
-        <span className="mr-1.5">
-          <Spinner />
-        </span>
-      )}
-      {title}
-    </p>
-  );
-}
-export type HeroTeamRoadmaps = Record<string, UserProgressResponse>;
-
-type ProgressListProps = {
-  progress: UserProgressResponse;
-  customRoadmaps: UserProgressResponse;
-  teamRoadmaps?: HeroTeamRoadmaps;
-  isLoading?: boolean;
-};
-
-export function HeroRoadmaps(props: ProgressListProps) {
-  const {
-    teamRoadmaps = {},
-    progress,
-    isLoading = false,
-    customRoadmaps,
-  } = props;
-
-  const [isCreatingRoadmap, setIsCreatingRoadmap] = useState(false);
-  const [creatingRoadmapTeamId, setCreatingRoadmapTeamId] = useState<string>();
-
-  return (
-    <div className="relative pb-12 pt-4 sm:pt-7">
-      <p className="mb-7 mt-2 text-sm">
-        <FeatureAnnouncement />
-      </p>
-      {isCreatingRoadmap && (
-        <CreateRoadmapModal
-          teamId={creatingRoadmapTeamId}
-          onClose={() => {
-            setIsCreatingRoadmap(false);
-            setCreatingRoadmapTeamId(undefined);
-          }}
-        />
-      )}
-      {
-        <HeroTitle
-          icon={
-            (<CheckIcon additionalClasses="mr-1.5 h-[14px] w-[14px]" />) as any
-          }
-          isLoading={isLoading}
-          title="Your progress and favorite roadmaps."
-        />
-      }
-
-      <div className="grid grid-cols-1 gap-2 sm:grid-cols-2 md:grid-cols-3">
-        {progress.map((resource) => (
-          <HeroRoadmap
-            key={`${resource.resourceType}-${resource.resourceId}`}
-            resourceId={resource.resourceId}
-            resourceType={resource.resourceType}
-            resourceTitle={resource.resourceTitle}
-            isFavorite={resource.isFavorite}
-            percentageDone={
-              ((resource.skipped + resource.done) / resource.total) * 100
-            }
-            url={
-              resource.resourceType === 'roadmap'
-                ? `/${resource.resourceId}`
-                : `/best-practices/${resource.resourceId}`
-            }
-          />
-        ))}
-      </div>
-
-      <div className="mt-5">
-        {
-          <HeroTitle
-            icon={<MapIcon className="mr-1.5 h-[14px] w-[14px]" />}
-            title="Your custom roadmaps"
-          />
-        }
-
-        {customRoadmaps.length === 0 && (
-          <p className="rounded-md border border-dashed border-gray-800 p-2 text-sm text-gray-600">
-            You haven't created any custom roadmaps yet.{' '}
-            <button
-              className="text-gray-500 underline underline-offset-2 hover:text-gray-400"
-              onClick={() => setIsCreatingRoadmap(true)}
-            >
-              Create one!
-            </button>
-          </p>
-        )}
-
-        {customRoadmaps.length > 0 && (
-          <div className="grid grid-cols-1 gap-2 sm:grid-cols-2 md:grid-cols-3">
-            {customRoadmaps.map((customRoadmap) => {
-              return (
-                <HeroRoadmap
-                  key={customRoadmap.resourceId}
-                  resourceId={customRoadmap.resourceId}
-                  resourceType={'roadmap'}
-                  resourceTitle={customRoadmap.resourceTitle}
-                  percentageDone={
-                    ((customRoadmap.skipped + customRoadmap.done) /
-                      customRoadmap.total) *
-                    100
-                  }
-                  url={`/r/${customRoadmap?.roadmapSlug}`}
-                  allowFavorite={false}
-                />
-              );
-            })}
-
-            <CreateRoadmapButton />
-          </div>
-        )}
-      </div>
-
-      {Object.keys(teamRoadmaps).map((teamName) => {
-        const currentTeam: UserProgressResponse[0]['team'] =
-          teamRoadmaps?.[teamName]?.[0]?.team;
-        const roadmapsList = teamRoadmaps[teamName].filter(
-          (roadmap) => !!roadmap.resourceTitle,
-        );
-        const canManageTeam = ['admin', 'manager'].includes(currentTeam?.role!);
-
-        return (
-          <div className="mt-5" key={teamName}>
-            {
-              <HeroTitle
-                icon={<Users2 className="mr-1.5 h-[14px] w-[14px]" />}
-                title={
-                  <>
-                    Team{' '}
-                    <a
-                      className="mx-1 font-medium underline underline-offset-2 transition-colors hover:text-gray-300"
-                      href={`/team/activity?t=${currentTeam?.id}`}
-                    >
-                      {teamName}
-                    </a>
-                    Roadmaps
-                  </>
-                }
-              />
-            }
-
-            {roadmapsList.length === 0 && (
-              <p className="rounded-md border border-dashed border-gray-800 p-2 text-sm text-gray-600">
-                Team does not have any roadmaps yet.{' '}
-                {canManageTeam && (
-                  <button
-                    className="text-gray-500 underline underline-offset-2 hover:text-gray-400"
-                    onClick={() => {
-                      setCreatingRoadmapTeamId(currentTeam?.id);
-                      setIsCreatingRoadmap(true);
-                    }}
-                  >
-                    Create one!
-                  </button>
-                )}
-              </p>
-            )}
-
-            {roadmapsList.length > 0 && (
-              <div className="grid grid-cols-1 gap-2 sm:grid-cols-2 md:grid-cols-3">
-                {roadmapsList.map((customRoadmap) => {
-                  return (
-                    <HeroRoadmap
-                      key={customRoadmap.resourceId}
-                      resourceId={customRoadmap.resourceId}
-                      resourceType={'roadmap'}
-                      resourceTitle={customRoadmap.resourceTitle}
-                      percentageDone={
-                        ((customRoadmap.skipped + customRoadmap.done) /
-                          customRoadmap.total) *
-                        100
-                      }
-                      url={`/r/${customRoadmap?.roadmapSlug}`}
-                      allowFavorite={false}
-                    />
-                  );
-                })}
-
-                {canManageTeam && (
-                  <CreateRoadmapButton
-                    teamId={currentTeam?.id}
-                    text="Create Team Roadmap"
-                  />
-                )}
-              </div>
-            )}
-          </div>
-        );
-      })}
-    </div>
-  );
-}
diff --git a/src/components/HeroSection/HeroTitle.tsx b/src/components/HeroSection/HeroTitle.tsx
new file mode 100644
index 000000000..7488e14fa
--- /dev/null
+++ b/src/components/HeroSection/HeroTitle.tsx
@@ -0,0 +1,74 @@
+import type { ReactNode } from 'react';
+import { Spinner } from '../ReactIcons/Spinner.tsx';
+import { ChevronsDownUp, ChevronsUpDown } from 'lucide-react';
+import { cn } from '../../lib/classname.ts';
+
+type HeroTitleProps = {
+  icon: any;
+  isLoading?: boolean;
+  title: string | ReactNode;
+  rightContent?: ReactNode;
+  isCollapsed?: boolean;
+  onToggleCollapse?: () => void;
+  isEmpty?: boolean;
+  emptyTitle?: ReactNode;
+};
+
+export function HeroTitle(props: HeroTitleProps) {
+  const {
+    isLoading = false,
+    title,
+    icon,
+    rightContent,
+    isCollapsed = false,
+    onToggleCollapse,
+    isEmpty = false,
+    emptyTitle,
+  } = props;
+
+  return (
+    <div className="flex items-center justify-between">
+      <div className="flex items-center gap-3">
+        <p
+          onClick={onToggleCollapse}
+          className="flex items-center cursor-default gap-0.5 text-sm text-gray-400"
+        >
+          {!isLoading && icon}
+          {isLoading && (
+            <span className="mr-1.5">
+              <Spinner />
+            </span>
+          )}
+          {!isEmpty ? title : emptyTitle || title}
+        </p>
+      </div>
+      <div className="flex items-center gap-2">
+        {!isCollapsed && rightContent}
+
+        {!isLoading && !isEmpty && (
+          <button
+            onClick={onToggleCollapse}
+            className={cn(
+              'ml-2 inline-flex items-center gap-1 rounded-md bg-slate-800 py-0.5 pl-1 pr-1.5 text-xs uppercase tracking-wider text-slate-400 hover:bg-slate-700',
+              {
+                'bg-slate-800 text-slate-500 hover:bg-slate-800 hover:text-slate-400':
+                  !isCollapsed,
+              },
+            )}
+          >
+            {isCollapsed && (
+              <>
+                <ChevronsUpDown className="h-3.5 w-3.5" /> Expand
+              </>
+            )}
+            {!isCollapsed && (
+              <>
+                <ChevronsDownUp className="h-3.5 w-3.5" /> Collapse
+              </>
+            )}
+          </button>
+        )}
+      </div>
+    </div>
+  );
+}
diff --git a/src/components/MarkdownFile.astro b/src/components/MarkdownFile.astro
index b12c5cd1a..69108f658 100644
--- a/src/components/MarkdownFile.astro
+++ b/src/components/MarkdownFile.astro
@@ -8,7 +8,7 @@ const { class: className } = Astro.props;
 
 <div
   class:list={[
-    'container prose prose-xl prose-h2:mb-3 prose-h2:mt-10 prose-h2:scroll-mt-5 prose-h2:text-balance prose-h2:text-3xl prose-h3:mt-2 prose-h3:scroll-mt-5 prose-h3:text-balance prose-h4:text-balance prose-h5:text-balance prose-h5:font-medium prose-blockquote:font-normal prose-code:bg-transparent prose-img:mt-1 prose-h2:sm:scroll-mt-10 prose-h3:sm:scroll-mt-10',
+    'container prose prose-xl prose-h2:mb-3 prose-h2:mt-10 prose-h2:scroll-mt-5 prose-h2:text-balance prose-h2:text-3xl prose-h3:mt-2 prose-h4:text-2xl prose-h3:scroll-mt-5 prose-h3:text-balance prose-h4:text-balance prose-h5:text-balance prose-h5:font-medium prose-blockquote:font-normal prose-code:bg-transparent prose-img:mt-1 prose-h2:sm:scroll-mt-10 prose-h3:sm:scroll-mt-10',
     className,
   ]}
 >
diff --git a/src/components/Navigation/Navigation.astro b/src/components/Navigation/Navigation.astro
index 4e4c567fa..bebe897f9 100644
--- a/src/components/Navigation/Navigation.astro
+++ b/src/components/Navigation/Navigation.astro
@@ -1,13 +1,14 @@
 ---
-import { Menu } from 'lucide-react';
+import { AccountStreak } from '../AccountStreak/AccountStreak';
 import Icon from '../AstroIcon.astro';
 import { NavigationDropdown } from '../NavigationDropdown';
-import { AccountDropdown } from './AccountDropdown';
-import NewIndicator from './NewIndicator.astro';
-import { AccountStreak } from '../AccountStreak/AccountStreak';
 import { RoadmapDropdownMenu } from '../RoadmapDropdownMenu/RoadmapDropdownMenu';
+import { AccountDropdown } from './AccountDropdown';
+import { CourseAnnouncement } from '../SQLCourse/CourseAnnouncement';
 ---
 
+<CourseAnnouncement client:load />
+
 <div class='bg-slate-900 py-5 text-white sm:py-8'>
   <nav class='container flex items-center justify-between'>
     <div class='flex items-center gap-5'>
@@ -20,20 +21,10 @@ import { RoadmapDropdownMenu } from '../RoadmapDropdownMenu/RoadmapDropdownMenu'
       </a>
 
       <a
-        href='/teams'
-        class='group relative inline text-blue-300 hover:text-white sm:hidden'
+        href='/ai-tutor'
+        class='group relative inline text-gray-400 hover:text-white sm:hidden'
       >
-        Teams
-
-        <span class='absolute -right-[11px] top-0'>
-          <span class='relative flex h-2 w-2'>
-            <span
-              class='absolute inline-flex h-full w-full animate-ping rounded-full bg-sky-400 opacity-75'
-            ></span>
-            <span class='relative inline-flex h-2 w-2 rounded-full bg-sky-500'
-            ></span>
-          </span>
-        </span>
+        AI Tutor
       </a>
 
       <!-- Desktop navigation items -->
@@ -43,15 +34,11 @@ import { RoadmapDropdownMenu } from '../RoadmapDropdownMenu/RoadmapDropdownMenu'
           Start Here
         </a>
         <RoadmapDropdownMenu client:load />
-        <a href='/teams' class='group relative text-gray-400 hover:text-white'>
-          Teams
-        </a>
         <a
-          href='/changelog'
-          class='group relative text-blue-300 hover:text-white hidden md:block ml-0.5'
+          href='/ai-tutor'
+          class='group relative mr-3 text-blue-300 hover:text-white'
         >
-          Changelog
-
+          AI Tutor
           <span class='absolute -right-[11px] top-0'>
             <span class='relative flex h-2 w-2'>
               <span
@@ -62,6 +49,12 @@ import { RoadmapDropdownMenu } from '../RoadmapDropdownMenu/RoadmapDropdownMenu'
             </span>
           </span>
         </a>
+        <a
+          href='/teams'
+          class='group relative hidden text-gray-400 hover:text-white xl:block'
+        >
+          Teams
+        </a>
       </div>
     </div>
 
diff --git a/src/components/NavigationDropdown.tsx b/src/components/NavigationDropdown.tsx
index d9f7c99c7..4bcec1cb7 100644
--- a/src/components/NavigationDropdown.tsx
+++ b/src/components/NavigationDropdown.tsx
@@ -109,7 +109,7 @@ export function NavigationDropdown() {
       </button>
       <div
         className={cn(
-          'pointer-events-none invisible absolute left-0 top-full z-[999] mt-2 w-48 min-w-[320px] -translate-y-1 rounded-lg bg-slate-800 py-2 opacity-0 shadow-xl transition-all duration-100',
+          'pointer-events-none invisible absolute left-0 top-full z-[90] mt-2 w-48 min-w-[320px] -translate-y-1 rounded-lg bg-slate-800 py-2 opacity-0 shadow-xl transition-all duration-100',
           {
             'pointer-events-auto visible translate-y-2.5 opacity-100':
               $navigationDropdownOpen,
diff --git a/src/components/OnboardingNudge.tsx b/src/components/OnboardingNudge.tsx
index 97fb1c330..f2bb862f8 100644
--- a/src/components/OnboardingNudge.tsx
+++ b/src/components/OnboardingNudge.tsx
@@ -37,6 +37,9 @@ export function OnboardingNudge(props: OnboardingNudgeProps) {
     return null;
   }
 
+  // @TODO put it back once <CourseAnnouncement /> is removed
+  return null;
+
   return (
     <div
       className={cn(
diff --git a/src/components/Pagination/Pagination.tsx b/src/components/Pagination/Pagination.tsx
index 86f3ac4de..3f4c8d604 100644
--- a/src/components/Pagination/Pagination.tsx
+++ b/src/components/Pagination/Pagination.tsx
@@ -11,6 +11,7 @@ type PaginationProps = {
   totalCount: number;
   isDisabled?: boolean;
   onPageChange: (page: number) => void;
+  className?: string;
 };
 
 export function Pagination(props: PaginationProps) {
@@ -22,6 +23,7 @@ export function Pagination(props: PaginationProps) {
     currPage,
     perPage,
     isDisabled = false,
+    className,
   } = props;
 
   if (!totalPages || totalPages === 1) {
@@ -32,10 +34,14 @@ export function Pagination(props: PaginationProps) {
 
   return (
     <div
-      className={cn('flex items-center', {
-        'justify-between': variant === 'default',
-        'justify-start': variant === 'minimal',
-      })}
+      className={cn(
+        'flex items-center',
+        {
+          'justify-between': variant === 'default',
+          'justify-start': variant === 'minimal',
+        },
+        className,
+      )}
     >
       <div className="flex items-center gap-1 text-xs font-medium">
         <button
diff --git a/src/components/Projects/ListProjectSolutions.tsx b/src/components/Projects/ListProjectSolutions.tsx
index 2d29a4ae2..d361854f2 100644
--- a/src/components/Projects/ListProjectSolutions.tsx
+++ b/src/components/Projects/ListProjectSolutions.tsx
@@ -16,6 +16,8 @@ import { GitHubIcon } from '../ReactIcons/GitHubIcon.tsx';
 import { SelectLanguages } from './SelectLanguages.tsx';
 import type { ProjectFrontmatter } from '../../lib/project.ts';
 import { ProjectSolutionModal } from './ProjectSolutionModal.tsx';
+import { SortProjects } from './SortProjects.tsx';
+import { ProjectSolutionRow } from './ProjectSolutionRow';
 
 export interface ProjectStatusDocument {
   _id?: string;
@@ -57,11 +59,13 @@ type ListProjectSolutionsResponse = {
 type QueryParams = {
   p?: string;
   l?: string;
+  s?: string;
 };
 
 type PageState = {
   currentPage: number;
   language: string;
+  sort: string;
 };
 
 type ListProjectSolutionsProps = {
@@ -69,30 +73,6 @@ type ListProjectSolutionsProps = {
   projectId: string;
 };
 
-export const submittedAlternatives = [
-  'submitted their solution',
-  'got it done',
-  'submitted their take',
-  'finished the project',
-  'submitted their work',
-  'completed the project',
-  'got it done',
-  'delivered their project',
-  'handed in their solution',
-  'provided their deliverables',
-  'submitted their approach',
-  'sent in their project',
-  'presented their take',
-  'shared their completed task',
-  'submitted their approach',
-  'completed it',
-  'finalized their solution',
-  'delivered their approach',
-  'turned in their project',
-  'submitted their final draft',
-  'delivered their solution',
-];
-
 export function ListProjectSolutions(props: ListProjectSolutionsProps) {
   const { projectId, project: projectData } = props;
 
@@ -100,6 +80,7 @@ export function ListProjectSolutions(props: ListProjectSolutionsProps) {
   const [pageState, setPageState] = useState<PageState>({
     currentPage: 0,
     language: '',
+    sort: 'rating',
   });
 
   const [isLoading, setIsLoading] = useState(true);
@@ -108,12 +89,17 @@ export function ListProjectSolutions(props: ListProjectSolutionsProps) {
     ListProjectSolutionsResponse['data'][number] | null
   >(null);
 
-  const loadSolutions = async (page = 1, language: string = '') => {
+  const loadSolutions = async (
+    page = 1,
+    language: string = '',
+    sort: string = 'rating',
+  ) => {
     const { response, error } = await httpGet<ListProjectSolutionsResponse>(
       `${import.meta.env.PUBLIC_API_URL}/v1-list-project-solutions/${projectId}`,
       {
         currPage: page,
         ...(language ? { languages: language } : {}),
+        sort,
       },
     );
 
@@ -178,6 +164,7 @@ export function ListProjectSolutions(props: ListProjectSolutionsProps) {
     setPageState({
       currentPage: +(queryParams.p || '1'),
       language: queryParams.l || '',
+      sort: queryParams.s || 'rating',
     });
   }, []);
 
@@ -187,17 +174,27 @@ export function ListProjectSolutions(props: ListProjectSolutionsProps) {
       return;
     }
 
-    if (pageState.currentPage !== 1 || pageState.language !== '') {
+    if (
+      pageState.currentPage !== 1 ||
+      pageState.language !== '' ||
+      pageState.sort !== 'rating'
+    ) {
       setUrlParams({
         p: String(pageState.currentPage),
         l: pageState.language,
+        s: pageState.sort,
       });
     } else {
       deleteUrlParam('p');
       deleteUrlParam('l');
+      deleteUrlParam('s');
     }
 
-    loadSolutions(pageState.currentPage, pageState.language).finally(() => {
+    loadSolutions(
+      pageState.currentPage,
+      pageState.language,
+      pageState.sort,
+    ).finally(() => {
       setIsLoading(false);
     });
   }, [pageState]);
@@ -216,6 +213,13 @@ export function ListProjectSolutions(props: ListProjectSolutionsProps) {
 
   const selectedLanguage = pageState.language;
 
+  const setSelectedLanguage = (language: string) => {
+    setPageState((prev) => ({
+      ...prev,
+      language: prev.language === language ? '' : language,
+    }));
+  };
+
   return (
     <div className="mb-4 overflow-hidden rounded-lg border bg-white p-3 sm:p-5">
       {leavingRoadmapModal}
@@ -224,19 +228,32 @@ export function ListProjectSolutions(props: ListProjectSolutionsProps) {
           <h1 className="mb-1 text-xl font-semibold">
             {projectData.title} Solutions
           </h1>
-          <p className="text-sm text-gray-500">{projectData.description}</p>
+          <p className="text-sm text-gray-500">
+            Solutions submitted by the community
+          </p>
         </div>
         {!isLoading && (
-          <SelectLanguages
-            projectId={projectId}
-            selectedLanguage={selectedLanguage}
-            onSelectLanguage={(language) => {
-              setPageState((prev) => ({
-                ...prev,
-                language: prev.language === language ? '' : language,
-              }));
-            }}
-          />
+          <div className="flex flex-shrink-0 items-center gap-2">
+            <SortProjects
+              selectedSort={pageState.sort}
+              onSelectSort={(sort) => {
+                setPageState((prev) => ({
+                  ...prev,
+                  sort,
+                }));
+              }}
+            />
+            <SelectLanguages
+              projectId={projectId}
+              selectedLanguage={selectedLanguage}
+              onSelectLanguage={(language) => {
+                setPageState((prev) => ({
+                  ...prev,
+                  language: prev.language === language ? '' : language,
+                }));
+              }}
+            />
+          </div>
         )}
       </div>
 
@@ -245,73 +262,16 @@ export function ListProjectSolutions(props: ListProjectSolutionsProps) {
       ) : (
         <>
           <div className="flex min-h-[500px] flex-col divide-y divide-gray-100">
-            {solutions?.data.map((solution, counter) => {
-              const avatar = solution.user.avatar || '';
-              return (
-                <div
-                  key={solution._id}
-                  className="flex flex-col gap-2 py-2 text-sm text-gray-500"
-                >
-                  <div className="flex flex-col justify-between gap-2 text-sm text-gray-500 sm:flex-row sm:items-center sm:gap-0">
-                    <div className="flex items-center gap-1.5">
-                      <img
-                        src={
-                          avatar
-                            ? `${import.meta.env.PUBLIC_AVATAR_BASE_URL}/${avatar}`
-                            : '/images/default-avatar.png'
-                        }
-                        alt={solution.user.name}
-                        className="mr-0.5 h-7 w-7 rounded-full"
-                      />
-                      <span className="font-medium text-black">
-                        {solution.user.name}
-                      </span>
-                      <span className="hidden sm:inline">
-                        {submittedAlternatives[
-                          counter % submittedAlternatives.length
-                        ] || 'submitted their solution'}
-                      </span>{' '}
-                      <span className="flex-grow text-right text-gray-400 sm:flex-grow-0 sm:text-left sm:font-medium sm:text-black">
-                        {getRelativeTimeString(solution?.submittedAt!)}
-                      </span>
-                    </div>
-
-                    <div className="flex items-center justify-end gap-1">
-                      <span className="flex shrink-0 overflow-hidden rounded-full border">
-                        <VoteButton
-                          icon={ThumbsUp}
-                          isActive={solution?.voteType === 'upvote'}
-                          count={solution.upvotes || 0}
-                          onClick={() => {
-                            handleSubmitVote(solution._id!, 'upvote');
-                          }}
-                        />
-
-                        <VoteButton
-                          icon={ThumbsDown}
-                          isActive={solution?.voteType === 'downvote'}
-                          count={solution.downvotes || 0}
-                          hideCount={true}
-                          onClick={() => {
-                            handleSubmitVote(solution._id!, 'downvote');
-                          }}
-                        />
-                      </span>
-
-                      <button
-                        className="ml-1 flex items-center gap-1 rounded-full border px-2 py-1 text-xs text-black transition-colors hover:border-black hover:bg-black hover:text-white"
-                        onClick={() => {
-                          setShowLeavingRoadmapModal(solution);
-                        }}
-                      >
-                        <GitHubIcon className="h-4 w-4 text-current" />
-                        Visit Solution
-                      </button>
-                    </div>
-                  </div>
-                </div>
-              );
-            })}
+            {solutions?.data.map((solution, counter) => (
+              <ProjectSolutionRow
+                key={solution._id}
+                solution={solution}
+                counter={counter}
+                onVote={handleSubmitVote}
+                onVisitSolution={setShowLeavingRoadmapModal}
+                onLanguageClick={setSelectedLanguage}
+              />
+            ))}
           </div>
 
           {(solutions?.totalPages || 0) > 1 && (
diff --git a/src/components/Projects/ProjectSolutionModal.tsx b/src/components/Projects/ProjectSolutionModal.tsx
index 0cda0b5cf..a28e105b7 100644
--- a/src/components/Projects/ProjectSolutionModal.tsx
+++ b/src/components/Projects/ProjectSolutionModal.tsx
@@ -1,20 +1,17 @@
+import { ArrowUpRight, ThumbsDown, ThumbsUp } from 'lucide-react';
 import { useEffect, useState } from 'react';
+import { useToast } from '../../hooks/use-toast';
 import { deleteUrlParam, getUrlParams } from '../../lib/browser';
-import { ModalLoader } from '../UserProgress/ModalLoader';
-import { Modal } from '../Modal';
-import { httpGet, httpPost } from '../../lib/http';
-import {
-  submittedAlternatives,
-  type AllowedVoteType,
-} from './ListProjectSolutions';
 import { getRelativeTimeString } from '../../lib/date';
-import { ArrowUpRight, ThumbsDown, ThumbsUp, Trophy } from 'lucide-react';
-import { VoteButton } from './VoteButton';
-import { GitHubIcon } from '../ReactIcons/GitHubIcon';
+import { httpGet, httpPost } from '../../lib/http';
 import { isLoggedIn } from '../../lib/jwt';
 import { showLoginPopup } from '../../lib/popup';
 import { pageProgressMessage } from '../../stores/page';
-import { useToast } from '../../hooks/use-toast';
+import { Modal } from '../Modal';
+import { GitHubIcon } from '../ReactIcons/GitHubIcon';
+import { ModalLoader } from '../UserProgress/ModalLoader';
+import { type AllowedVoteType } from './ListProjectSolutions';
+import { VoteButton } from './VoteButton';
 
 type UserProjectSolutionResponse = {
   id?: string;
@@ -135,8 +132,12 @@ export function ProjectSolutionModal(props: ProjectSolutionModalProps) {
       bodyClassName={'h-auto'}
     >
       <div className="relative p-6">
-          <h1 className="text-2xl text-balance mb-1 font-bold text-gray-900">{projectTitle}</h1>
-          <p className="text-sm text-balance text-gray-600">{projectDescription}</p>
+        <h1 className="mb-1 text-balance text-2xl font-bold text-gray-900">
+          {projectTitle}
+        </h1>
+        <p className="text-balance text-sm text-gray-600">
+          {projectDescription}
+        </p>
 
         <div className="my-5 rounded-lg bg-gray-100 p-4">
           <div className="flex items-center gap-3">
@@ -150,7 +151,9 @@ export function ProjectSolutionModal(props: ProjectSolutionModalProps) {
               className="h-12 w-12 rounded-full border-2 border-white shadow-md"
             />
             <div>
-              <h2 className="text-lg font-semibold text-gray-900">{solution?.user.name}'s Solution</h2>
+              <h2 className="text-lg font-semibold text-gray-900">
+                {solution?.user.name}'s Solution
+              </h2>
               <p className="text-sm text-gray-600">
                 Submitted their solution{' '}
                 {getRelativeTimeString(solution?.submittedAt!)}
diff --git a/src/components/Projects/ProjectSolutionRow.tsx b/src/components/Projects/ProjectSolutionRow.tsx
new file mode 100644
index 000000000..5420cc2db
--- /dev/null
+++ b/src/components/Projects/ProjectSolutionRow.tsx
@@ -0,0 +1,137 @@
+import { ThumbsDown, ThumbsUp } from 'lucide-react';
+import { getRelativeTimeString } from '../../lib/date';
+import { VoteButton } from './VoteButton';
+import { GitHubIcon } from '../ReactIcons/GitHubIcon';
+import type {
+  AllowedVoteType,
+  ProjectStatusDocument,
+} from './ListProjectSolutions';
+
+export const submittedAlternatives = [
+  'submitted their solution',
+  'got it done',
+  'submitted their take',
+  'finished the project',
+  'submitted their work',
+  'completed the project',
+  'got it done',
+  'delivered their project',
+  'handed in their solution',
+  'provided their deliverables',
+  'submitted their approach',
+  'sent in their project',
+  'presented their take',
+  'shared their completed task',
+  'submitted their approach',
+  'completed it',
+  'finalized their solution',
+  'delivered their approach',
+  'turned in their project',
+  'submitted their final draft',
+  'delivered their solution',
+];
+
+type ProjectSolutionRowProps = {
+  solution: ProjectStatusDocument & {
+    user: {
+      id: string;
+      name: string;
+      avatar: string;
+    };
+    voteType?: AllowedVoteType | 'none';
+  };
+  counter: number;
+  onVote: (solutionId: string, voteType: AllowedVoteType) => void;
+  onVisitSolution: (solution: ProjectSolutionRowProps['solution']) => void;
+  onLanguageClick?: (language: string) => void;
+};
+
+export function ProjectSolutionRow(props: ProjectSolutionRowProps) {
+  const { solution, counter, onVote, onVisitSolution, onLanguageClick } = props;
+
+  const avatar = solution.user.avatar || '';
+
+  return (
+    <div className="group flex flex-col border-gray-100 px-3 py-2.5 text-sm hover:bg-gray-50/50 sm:flex-row sm:justify-between">
+      <div className="flex min-w-0 items-start gap-3">
+        <img
+          src={
+            avatar
+              ? `${import.meta.env.PUBLIC_AVATAR_BASE_URL}/${avatar}`
+              : '/images/default-avatar.png'
+          }
+          alt={solution.user.name}
+          className="h-7 w-7 flex-shrink-0 rounded-full sm:h-8 sm:w-8"
+        />
+        <div className="min-w-0 flex-auto">
+          <div className="flex flex-wrap items-baseline gap-x-1.5 gap-y-0.5">
+            <span className="max-w-[150px] truncate font-medium text-gray-900 sm:max-w-[180px]">
+              {solution.user.name}
+            </span>
+            <span className="hidden truncate text-xs text-gray-500 sm:block sm:text-sm">
+              {submittedAlternatives[counter % submittedAlternatives.length] ||
+                'submitted their solution'}
+            </span>
+            <span
+              className="text-xs text-gray-400"
+              title={new Date(solution?.submittedAt!).toLocaleString()}
+            >
+              · {getRelativeTimeString(solution?.submittedAt!)}
+            </span>
+          </div>
+
+          <div className="mt-2.5 flex gap-1.5">
+            <div className="flex gap-1">
+              <span className="flex shrink-0 overflow-hidden rounded-full border">
+                <VoteButton
+                  icon={ThumbsUp}
+                  isActive={solution?.voteType === 'upvote'}
+                  count={solution.upvotes || 0}
+                  onClick={() => {
+                    onVote(solution._id!, 'upvote');
+                  }}
+                />
+
+                <VoteButton
+                  icon={ThumbsDown}
+                  isActive={solution?.voteType === 'downvote'}
+                  count={solution.downvotes || 0}
+                  hideCount={true}
+                  onClick={() => {
+                    onVote(solution._id!, 'downvote');
+                  }}
+                />
+              </span>
+            </div>
+
+            <button
+              className="flex items-center gap-1 rounded-full border px-2 py-1 text-xs text-black transition-colors hover:border-black hover:bg-black hover:text-white"
+              onClick={() => {
+                onVisitSolution(solution);
+              }}
+            >
+              <GitHubIcon className="h-3.5 w-3.5 text-current" />
+              <span>Visit Solution</span>
+            </button>
+          </div>
+        </div>
+      </div>
+
+      <div className="mt-2.5 hidden sm:mt-0 sm:block sm:pl-4">
+        {solution.languages && solution.languages.length > 0 && (
+          <div className="flex flex-wrap items-center gap-1.5">
+            {solution.languages.slice(0, 2).map((lang) => (
+              <button
+                key={lang}
+                onClick={() => onLanguageClick?.(lang)}
+                className="inline-flex items-center rounded-md border border-gray-200 bg-white px-2 py-0.5 text-xs font-medium text-gray-700 transition-colors hover:border-gray-300 hover:bg-gray-50 hover:text-gray-900"
+              >
+                {lang}
+              </button>
+            ))}
+          </div>
+        )}
+      </div>
+    </div>
+  );
+}
diff --git a/src/components/Projects/SelectLanguages.tsx b/src/components/Projects/SelectLanguages.tsx
index bde1db0f2..0030a275a 100644
--- a/src/components/Projects/SelectLanguages.tsx
+++ b/src/components/Projects/SelectLanguages.tsx
@@ -2,7 +2,7 @@ import { useEffect, useRef, useState } from 'react';
 import { useOutsideClick } from '../../hooks/use-outside-click';
 import { httpGet } from '../../lib/http';
 import { useToast } from '../../hooks/use-toast';
-import { ChevronDown, X } from 'lucide-react';
+import { ChevronDown, Search, X } from 'lucide-react';
 
 type SelectLanguagesProps = {
   projectId: string;
@@ -14,10 +14,44 @@ export function SelectLanguages(props: SelectLanguagesProps) {
   const { projectId, onSelectLanguage, selectedLanguage } = props;
 
   const dropdownRef = useRef<HTMLDivElement>(null);
+  const searchInputRef = useRef<HTMLInputElement>(null);
+  const optionsRef = useRef<HTMLDivElement>(null);
   const toast = useToast();
 
   const [distinctLanguages, setDistinctLanguages] = useState<string[]>([]);
   const [isOpen, setIsOpen] = useState(false);
+  const [searchQuery, setSearchQuery] = useState('');
+  const [highlightedIndex, setHighlightedIndex] = useState(0);
+
+  const filteredLanguages = distinctLanguages.filter((language) =>
+    language.toLowerCase().includes(searchQuery.toLowerCase()),
+  );
+
+  // Handle scrolling of highlighted option into view
+  useEffect(() => {
+    if (!isOpen || !optionsRef.current) {
+      return;
+    }
+
+    const options = optionsRef.current.getElementsByTagName('button');
+    const highlightedOption = options[highlightedIndex];
+    if (!highlightedOption) {
+      return;
+    }
+
+    const containerRect = optionsRef.current.getBoundingClientRect();
+    const optionRect = highlightedOption.getBoundingClientRect();
+
+    const isAbove = optionRect.top < containerRect.top;
+    const isBelow = optionRect.bottom > containerRect.bottom;
+
+    if (isAbove || isBelow) {
+      highlightedOption.scrollIntoView({
+        block: 'nearest',
+        behavior: 'instant',
+      });
+    }
+  }, [highlightedIndex, isOpen]);
 
   const loadDistinctLanguages = async () => {
     const { response, error } = await httpGet<string[]>(
@@ -34,53 +68,124 @@ export function SelectLanguages(props: SelectLanguagesProps) {
 
   useOutsideClick(dropdownRef, () => {
     setIsOpen(false);
+    setSearchQuery('');
+    setHighlightedIndex(0);
   });
 
   useEffect(() => {
     loadDistinctLanguages().finally(() => {});
   }, []);
 
+  useEffect(() => {
+    if (isOpen && searchInputRef.current) {
+      searchInputRef.current.focus();
+    }
+  }, [isOpen]);
+
+  const handleKeyDown = (e: React.KeyboardEvent) => {
+    switch (e.key) {
+      case 'ArrowDown':
+        e.preventDefault();
+        setHighlightedIndex((prev) =>
+          prev >= filteredLanguages.length - 1 ? 0 : prev + 1,
+        );
+        break;
+      case 'ArrowUp':
+        e.preventDefault();
+        setHighlightedIndex((prev) =>
+          prev <= 0 ? filteredLanguages.length - 1 : prev - 1,
+        );
+        break;
+      case 'Enter':
+        e.preventDefault();
+        if (filteredLanguages[highlightedIndex]) {
+          onSelectLanguage(filteredLanguages[highlightedIndex]);
+          setIsOpen(false);
+          setSearchQuery('');
+          setHighlightedIndex(0);
+        }
+        break;
+      case 'Escape':
+        setIsOpen(false);
+        setSearchQuery('');
+        setHighlightedIndex(0);
+        break;
+    }
+  };
+
   return (
-    <div className="relative flex">
-      <button
-        className="flex items-center gap-1 rounded-md border border-gray-300 py-1.5 pl-3 pr-2 text-xs font-medium text-gray-900"
-        onClick={() => setIsOpen(!isOpen)}
-      >
-        {selectedLanguage || 'Select Language'}
-
-        <ChevronDown className="ml-1 h-4 w-4" />
-      </button>
-      {selectedLanguage && (
+    <div className="relative flex flex-shrink-0">
+      <div className="relative">
         <button
-          className="ml-1 text-red-500 text-xs border border-red-500 rounded-md px-2 py-1"
-          onClick={() => onSelectLanguage('')}
+          className="flex items-center gap-1 rounded-md border border-gray-300 py-1.5 pl-3 pr-2 text-xs font-medium text-gray-900"
+          onClick={() => setIsOpen(!isOpen)}
         >
-          Clear
+          {selectedLanguage || 'Select Language'}
+          <ChevronDown className="ml-1 h-4 w-4" />
         </button>
-      )}
+        {selectedLanguage && (
+          <button
+            className="absolute -right-1.5 -top-1.5 flex h-4 w-4 items-center justify-center rounded-full bg-red-500 text-white hover:bg-red-600"
+            onClick={(e) => {
+              e.stopPropagation();
+              onSelectLanguage('');
+            }}
+          >
+            <X className="size-3" strokeWidth={2.5} />
+            <span className="sr-only">Clear selection</span>
+          </button>
+        )}
+      </div>
 
       {isOpen && (
         <div
           className="absolute right-0 top-full z-10 w-full min-w-[200px] max-w-[200px] translate-y-1.5 overflow-hidden rounded-md border border-gray-300 bg-white p-1 shadow-lg"
           ref={dropdownRef}
+          onKeyDown={handleKeyDown}
         >
-          {distinctLanguages.map((language) => {
-            const isSelected = selectedLanguage === language;
-
-            return (
-              <button
-                key={language}
-                className="flex w-full items-center rounded-md px-4 py-1.5 text-left text-sm text-gray-700 hover:bg-gray-100 aria-selected:bg-gray-100"
-                onClick={() => {
-                  onSelectLanguage(language);
-                  setIsOpen(false);
-                }}
-                aria-selected={isSelected}
-              >
-                {language}
-              </button>
-            );
-          })}
+          <div className="relative mb-1 px-1">
+            <Search className="absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-gray-400" />
+            <input
+              ref={searchInputRef}
+              type="text"
+              className="w-full rounded-md border border-gray-200 py-1.5 pl-9 pr-3 text-sm focus:border-gray-300 focus:outline-none"
+              placeholder="Search languages..."
+              value={searchQuery}
+              onChange={(e) => {
+                setSearchQuery(e.target.value);
+                setHighlightedIndex(0);
+              }}
+            />
+          </div>
+          <div ref={optionsRef} className="max-h-[200px] overflow-y-auto">
+            {filteredLanguages.map((language, index) => {
+              const isSelected = selectedLanguage === language;
+              const isHighlighted = index === highlightedIndex;
+
+              return (
+                <button
+                  key={language}
+                  className={`flex w-full items-center rounded-md px-4 py-1.5 text-left text-sm text-gray-700 hover:bg-gray-100 aria-selected:bg-gray-100 ${
+                    isHighlighted ? 'bg-gray-100' : ''
+                  }`}
+                  onClick={() => {
+                    onSelectLanguage(language);
+                    setIsOpen(false);
+                    setSearchQuery('');
+                    setHighlightedIndex(0);
+                  }}
+                  aria-selected={isSelected}
+                >
+                  {language}
+                </button>
+              );
+            })}
+            {filteredLanguages.length === 0 && (
+              <div className="px-4 py-2 text-sm text-gray-500">
+                No languages found
+              </div>
+            )}
+          </div>
         </div>
       )}
     </div>
diff --git a/src/components/Projects/SortProjects.tsx b/src/components/Projects/SortProjects.tsx
new file mode 100644
index 000000000..128098c5e
--- /dev/null
+++ b/src/components/Projects/SortProjects.tsx
@@ -0,0 +1,66 @@
+import { useRef, useState } from 'react';
+import { useOutsideClick } from '../../hooks/use-outside-click';
+import { ChevronDown } from 'lucide-react';
+
+type SortOption = {
+  label: string;
+  value: string;
+};
+
+const sortOptions: SortOption[] = [
+  { label: 'Latest First', value: 'latest' },
+  { label: 'Oldest First', value: 'oldest' },
+  { label: 'Highest Rating', value: 'rating' },
+];
+
+type SortProjectsProps = {
+  selectedSort: string;
+  onSelectSort: (sort: string) => void;
+};
+
+export function SortProjects(props: SortProjectsProps) {
+  const { selectedSort, onSelectSort } = props;
+  const [isOpen, setIsOpen] = useState(false);
+  const dropdownRef = useRef<HTMLDivElement>(null);
+
+  useOutsideClick(dropdownRef, () => {
+    setIsOpen(false);
+  });
+
+  const selectedOption =
+    sortOptions.find((option) => option.value === selectedSort) ||
+    sortOptions[0];
+
+  return (
+    <div className="relative flex-shrink-0" ref={dropdownRef}>
+      <button
+        className="flex items-center gap-1 rounded-md border border-gray-300 py-1.5 pl-3 pr-2 text-xs font-medium text-gray-900"
+        onClick={() => setIsOpen(!isOpen)}
+      >
+        {selectedOption.label}
+        <ChevronDown className="ml-1 h-4 w-4" />
+      </button>
+
+      {isOpen && (
+        <div className="absolute right-0 top-full z-10 mt-1.5 min-w-[150px] overflow-hidden rounded-md border border-gray-300 bg-white shadow-lg">
+          <div className="py-1">
+            {sortOptions.map((option) => (
+              <button
+                key={option.value}
+                className={`flex w-full items-center px-4 py-1.5 text-left text-sm text-gray-700 hover:bg-gray-100 ${
+                  selectedSort === option.value ? 'bg-gray-100' : ''
+                }`}
+                onClick={() => {
+                  onSelectSort(option.value);
+                  setIsOpen(false);
+                }}
+              >
+                {option.label}
+              </button>
+            ))}
+          </div>
+        </div>
+      )}
+    </div>
+  );
+}
diff --git a/src/components/Projects/StatusStepper/ProjectStepper.tsx b/src/components/Projects/StatusStepper/ProjectStepper.tsx
index 28bd51181..e5fce5a30 100644
--- a/src/components/Projects/StatusStepper/ProjectStepper.tsx
+++ b/src/components/Projects/StatusStepper/ProjectStepper.tsx
@@ -287,28 +287,32 @@ export function ProjectStepper(props: ProjectStepperProps) {
             number={2}
           />
 
-          <span className="text-gray-600 sm:hidden">&middot;</span>
-          <button
-            className={cn(
-              'flex items-center gap-2 text-sm sm:hidden',
-              isCopied ? 'text-green-500' : 'text-gray-600',
-            )}
-            onClick={() => {
-              copyText(projectSolutionUrl);
-            }}
-          >
-            {isCopied ? (
-              <>
-                <CheckIcon additionalClasses="h-3 w-3" />
-                URL Copied
-              </>
-            ) : (
-              <>
-                <Share className="h-3 w-3 stroke-[2.5px]" />
-                Share your Solution
-              </>
-            )}
-          </button>
+          {activeStep > 1 && (
+            <>
+              <span className="text-gray-600 sm:hidden">&middot;</span>
+              <button
+                className={cn(
+                  'flex items-center gap-2 text-sm sm:hidden',
+                  isCopied ? 'text-green-500' : 'text-gray-600',
+                )}
+                onClick={() => {
+                  copyText(projectSolutionUrl);
+                }}
+              >
+                {isCopied ? (
+                  <>
+                    <CheckIcon additionalClasses="h-3 w-3" />
+                    URL Copied
+                  </>
+                ) : (
+                  <>
+                    <Share className="h-3 w-3 stroke-[2.5px]" />
+                    Share your Solution
+                  </>
+                )}
+              </button>
+            </>
+          )}
         </div>
         <StepperStepSeparator isActive={activeStep > 1} />
         <MilestoneStep
diff --git a/src/components/Questions/QuestionCard.tsx b/src/components/Questions/QuestionCard.tsx
index 067fcbc7e..df3b0aa86 100644
--- a/src/components/Questions/QuestionCard.tsx
+++ b/src/components/Questions/QuestionCard.tsx
@@ -103,7 +103,7 @@ export function QuestionCard(props: QuestionCardProps) {
 
         {question.isLongAnswer && (
           <div
-            className={`qa-answer prose prose-sm prose-quoteless mx-auto flex w-full max-w-[600px] flex-grow flex-col items-start justify-center py-0 px-4 text-left text-sm prose-h1:mb-2.5 prose-h1:mt-7 prose-h2:mb-3 prose-h2:mt-0 prose-h3:mb-[5px] prose-h3:mt-[10px] prose-p:mb-2 prose-p:mt-0 prose-blockquote:font-normal prose-blockquote:not-italic prose-blockquote:text-gray-700 prose-pre:!mb-6 prose-pre:w-full prose-ul:my-2 prose-li:m-0 prose-li:mb-0.5 sm:px-5 sm:text-lg sm:prose-p:mb-4`}
+            className={`qa-answer prose prose-h5:font-semibold prose-h5:mb-2 prose-h5:text-black prose-sm prose-quoteless mx-auto flex w-full max-w-[600px] flex-grow flex-col items-start justify-center py-0 px-4 text-left text-sm prose-h1:mb-2.5 prose-h1:mt-7 prose-h2:mb-3 prose-h2:mt-0 prose-h3:mb-[5px] prose-h3:mt-[10px] prose-p:mb-2 prose-p:mt-0 prose-blockquote:font-normal prose-blockquote:not-italic prose-blockquote:text-gray-700 prose-pre:!mb-6 prose-pre:w-full prose-ul:my-2 prose-li:m-0 prose-li:mb-0.5 sm:px-5 sm:text-lg sm:prose-p:mb-4`}
             dangerouslySetInnerHTML={{
               __html: markdownToHtml(question.answer, false),
             }}
diff --git a/src/components/Questions/QuestionGuide.astro b/src/components/Questions/QuestionGuide.astro
index ddec8fcec..47c8a872d 100644
--- a/src/components/Questions/QuestionGuide.astro
+++ b/src/components/Questions/QuestionGuide.astro
@@ -149,6 +149,11 @@ const { frontmatter: guideFrontmatter, author } = questionGroup;
           </div>
         ))
       }
+      {questionGroup.ending && (
+        <div class='mb-5'>
+          <div set:html={markdownToHtml(questionGroup.ending, false)} />
+        </div>
+      )}
     </MarkdownFile>
   </div>
 </article>
diff --git a/src/components/ReactIcons/HackerNewsIcon.tsx b/src/components/ReactIcons/HackerNewsIcon.tsx
new file mode 100644
index 000000000..bd2994df2
--- /dev/null
+++ b/src/components/ReactIcons/HackerNewsIcon.tsx
@@ -0,0 +1,20 @@
+import { cn } from '../../lib/classname';
+
+interface HackerNewsIconProps {
+  className?: string;
+}
+
+export function HackerNewsIcon(props: HackerNewsIconProps) {
+  const { className } = props;
+
+  return (
+    <svg
+      xmlns="http://www.w3.org/2000/svg"
+      viewBox="0 0 448 512"
+      fill="currentColor"
+      className={cn('h-[26px] w-[26px]', className)}
+    >
+      <path d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM21.2 229.2H21c.1-.1.2-.3.3-.4 0 .1 0 .3-.1.4zm218 53.9V384h-31.4V281.3L128 128h37.3c52.5 98.3 49.2 101.2 59.3 125.6 12.3-27 5.8-24.4 60.6-125.6H320l-80.8 155.1z" />
+    </svg>
+  );
+}
diff --git a/src/components/ReactIcons/RedditIcon.tsx b/src/components/ReactIcons/RedditIcon.tsx
new file mode 100644
index 000000000..506615454
--- /dev/null
+++ b/src/components/ReactIcons/RedditIcon.tsx
@@ -0,0 +1,20 @@
+import { cn } from '../../lib/classname';
+
+interface RedditIconProps {
+  className?: string;
+}
+
+export function RedditIcon(props: RedditIconProps) {
+  const { className } = props;
+
+  return (
+    <svg
+      xmlns="http://www.w3.org/2000/svg"
+      viewBox="0 0 448 512"
+      fill="currentColor"
+      className={cn('h-[26px] w-[26px]', className)}
+    >
+      <path d="M283.2 345.5c2.7 2.7 2.7 6.8 0 9.2-24.5 24.5-93.8 24.6-118.4 0-2.7-2.4-2.7-6.5 0-9.2 2.4-2.4 6.5-2.4 8.9 0 18.7 19.2 81 19.6 100.5 0 2.4-2.3 6.6-2.3 9 0zm-91.3-53.8c0-14.9-11.9-26.8-26.5-26.8a26.67 26.67 0 0 0-26.8 26.8c0 14.6 11.9 26.5 26.8 26.5 14.6 0 26.5-11.9 26.5-26.5zm90.7-26.8c-14.6 0-26.5 11.9-26.5 26.8 0 14.6 11.9 26.5 26.5 26.5 14.9 0 26.8-11.9 26.8-26.5a26.67 26.67 0 0 0-26.8-26.8zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-99.7 140.6c-10.1 0-19 4.2-25.6 10.7-24.1-16.7-56.5-27.4-92.5-28.6l18.7-84.2 59.5 13.4c0 14.6 11.9 26.5 26.5 26.5 14.9 0 26.8-12.2 26.8-26.8s-11.9-26.8-26.8-26.8c-10.4 0-19.3 6.2-23.8 14.9l-65.7-14.6c-3.3-.9-6.5 1.5-7.4 4.8l-20.5 92.8c-35.7 1.5-67.8 12.2-91.9 28.9-6.5-6.8-15.8-11-25.9-11-37.5 0-49.8 50.4-15.5 67.5-1.2 5.4-1.8 11-1.8 16.7 0 56.5 63.7 102.3 141.9 102.3 78.5 0 142.2-45.8 142.2-102.3 0-5.7-.6-11.6-2.1-17 33.6-17.2 21.2-67.2-16.1-67.2z" />
+    </svg>
+  );
+}
diff --git a/src/components/ReactIcons/RoadmapLogo.tsx b/src/components/ReactIcons/RoadmapLogo.tsx
new file mode 100644
index 000000000..34ca4a0f0
--- /dev/null
+++ b/src/components/ReactIcons/RoadmapLogo.tsx
@@ -0,0 +1,28 @@
+import type { SVGProps } from 'react';
+
+type RoadmapLogoIconProps = SVGProps<SVGSVGElement> & {
+  color?: 'white' | 'black';
+};
+
+export function RoadmapLogoIcon(props: RoadmapLogoIconProps) {
+  const { color = 'white', ...rest } = props;
+
+  return (
+    <svg
+      xmlns="http://www.w3.org/2000/svg"
+      width="30"
+      height="30"
+      viewBox="0 0 283 283"
+      {...rest}
+    >
+      <path
+        fill={color === 'black' ? '#000' : '#fff'}
+        d="M0 39C0 17.46 17.46 0 39 0h205c21.539 0 39 17.46 39 39v205c0 21.539-17.461 39-39 39H39c-21.54 0-39-17.461-39-39V39Z"
+      />
+      <path
+        fill={color === 'black' ? '#fff' : '#000'}
+        d="M121.215 210.72c-1.867.56-4.854 1.12-8.96 1.68-3.92.56-8.027.84-12.32.84-4.107 0-7.84-.28-11.2-.84-3.174-.56-5.88-1.68-8.12-3.36s-4.014-3.92-5.32-6.72c-1.12-2.987-1.68-6.813-1.68-11.48v-84c0-4.293.746-7.933 2.24-10.92 1.68-3.173 4.013-5.973 7-8.4s6.626-4.573 10.92-6.44c4.48-2.053 9.24-3.827 14.28-5.32a106.176 106.176 0 0 1 15.68-3.36 95.412 95.412 0 0 1 16.24-1.4c8.96 0 16.053 1.773 21.28 5.32 5.226 3.36 7.84 8.96 7.84 16.8 0 2.613-.374 5.227-1.12 7.84-.747 2.427-1.68 4.667-2.8 6.72a133.1 133.1 0 0 0-12.04.56c-4.107.373-8.12.933-12.04 1.68s-7.654 1.587-11.2 2.52c-3.36.747-6.254 1.68-8.68 2.8v95.48zm45.172-22.4c0-7.84 2.426-14.373 7.28-19.6s11.48-7.84 19.88-7.84 15.026 2.613 19.88 7.84 7.28 11.76 7.28 19.6-2.427 14.373-7.28 19.6-11.48 7.84-19.88 7.84-15.027-2.613-19.88-7.84-7.28-11.76-7.28-19.6z"
+      />
+    </svg>
+  );
+}
diff --git a/src/components/ReactIcons/TwitterIcon.tsx b/src/components/ReactIcons/TwitterIcon.tsx
index 05e6a5683..bb8c1f3d6 100644
--- a/src/components/ReactIcons/TwitterIcon.tsx
+++ b/src/components/ReactIcons/TwitterIcon.tsx
@@ -18,7 +18,7 @@ export function TwitterIcon(props: TwitterIconProps) {
       <rect width="23" height="23" rx="3" fill={boxColor} />
       <path
         d="M12.9285 10.3522L18.5135 4H17.1905L12.339 9.5144L8.467 4H4L9.8565 12.3395L4 19H5.323L10.443 13.1754L14.533 19H19M5.8005 4.97619H7.833L17.1895 18.0718H15.1565"
-        fill='currentColor'
+        fill="currentColor"
       />
     </svg>
   );
diff --git a/src/components/RelatedRoadmaps.astro b/src/components/RelatedRoadmaps.astro
index cc31f2643..919e64f3b 100644
--- a/src/components/RelatedRoadmaps.astro
+++ b/src/components/RelatedRoadmaps.astro
@@ -60,7 +60,7 @@ const relatedQuestionDetails = await getQuestionGroupsByIds(relatedQuestions);
       class:list={[
         'border-t bg-gray-100',
         {
-          'mt-8': !relatedQuestionDetails.length,
+          'mt-0': !relatedQuestionDetails.length,
         },
       ]}
     >
diff --git a/src/components/RoadCard/RoadmapSelect.tsx b/src/components/RoadCard/RoadmapSelect.tsx
index 2db7bc2e4..baa7fae22 100644
--- a/src/components/RoadCard/RoadmapSelect.tsx
+++ b/src/components/RoadCard/RoadmapSelect.tsx
@@ -1,8 +1,8 @@
 import { httpGet } from '../../lib/http';
 import { useEffect, useState } from 'react';
 import { pageProgressMessage } from '../../stores/page';
-import type { UserProgressResponse } from '../HeroSection/FavoriteRoadmaps';
 import { SelectionButton } from './SelectionButton';
+import type { UserProgressResponse } from '../Roadmaps/RoadmapsPage';
 
 type RoadmapSelectProps = {
   selectedRoadmaps: string[];
diff --git a/src/components/RoadmapDropdownMenu/RoadmapDropdownMenu.tsx b/src/components/RoadmapDropdownMenu/RoadmapDropdownMenu.tsx
index 0d7847bf3..7b9797662 100644
--- a/src/components/RoadmapDropdownMenu/RoadmapDropdownMenu.tsx
+++ b/src/components/RoadmapDropdownMenu/RoadmapDropdownMenu.tsx
@@ -17,7 +17,7 @@ const links = [
     isHighlighted: true,
   },
   {
-    link: '/ai/explore',
+    link: '/ai',
     label: 'AI Roadmaps',
     description: 'Generate roadmaps with AI',
     Icon: Sparkles,
@@ -64,7 +64,7 @@ export function RoadmapDropdownMenu() {
       </button>
       <div
         className={cn(
-          'pointer-events-none invisible absolute left-0 top-full z-[999] mt-2 w-48 min-w-[320px] -translate-y-1 rounded-lg bg-slate-800 py-2 opacity-0 shadow-2xl transition-all duration-100',
+          'pointer-events-none invisible absolute left-0 top-full z-[90] mt-2 w-48 min-w-[320px] -translate-y-1 rounded-lg bg-slate-800 py-2 opacity-0 shadow-2xl transition-all duration-100',
           {
             'pointer-events-auto visible translate-y-2.5 opacity-100':
               $roadmapsDropdownOpen,
diff --git a/src/components/RoadmapHeader.astro b/src/components/RoadmapHeader.astro
index 6a0e5904a..2e6c8124c 100644
--- a/src/components/RoadmapHeader.astro
+++ b/src/components/RoadmapHeader.astro
@@ -13,7 +13,7 @@ import { MarkFavorite } from './FeaturedItems/MarkFavorite';
 import { type RoadmapFrontmatter } from '../lib/roadmap';
 import { ShareRoadmapButton } from './ShareRoadmapButton';
 import { DownloadRoadmapButton } from './DownloadRoadmapButton';
-
+import { CourseAnnouncement } from './SQLCourse/CourseAnnouncement';
 export interface Props {
   title: string;
   description: string;
diff --git a/src/components/RoadmapTitleQuestion.tsx b/src/components/RoadmapTitleQuestion.tsx
index 82096a0f0..c2e445028 100644
--- a/src/components/RoadmapTitleQuestion.tsx
+++ b/src/components/RoadmapTitleQuestion.tsx
@@ -33,7 +33,7 @@ export function RoadmapTitleQuestion(props: RoadmapTitleQuestionProps) {
   return (
     <div
       className={cn(
-        'relative hidden rounded-b-[5px] border-t bg-white text-sm font-medium hover:bg-gray-50 sm:block',
+        'relative block rounded-b-[5px] border-t bg-white text-sm font-medium hover:bg-gray-50 sm:block',
         {
           'rounded-0 -mx-4 sm:mx-0': isAnswerVisible,
           // @FIXME:
@@ -41,7 +41,6 @@ export function RoadmapTitleQuestion(props: RoadmapTitleQuestionProps) {
           // the frontend roadmap. This is because we did not use to have the question 
           // on mobile devices before and we don't want to cause any SEO issues. It will
           // be enabled on other roadmaps in the future.
-          block: roadmapId === 'frontend',
         },
       )}
     >
diff --git a/src/components/Roadmaps/RoadmapsPage.tsx b/src/components/Roadmaps/RoadmapsPage.tsx
index defe3e3e8..d841cdcda 100644
--- a/src/components/Roadmaps/RoadmapsPage.tsx
+++ b/src/components/Roadmaps/RoadmapsPage.tsx
@@ -10,8 +10,27 @@ import {
 } from '../../lib/browser.ts';
 import { RoadmapCard } from './RoadmapCard.tsx';
 import { httpGet } from '../../lib/http.ts';
-import type { UserProgressResponse } from '../HeroSection/FavoriteRoadmaps.tsx';
 import { isLoggedIn } from '../../lib/jwt.ts';
+import type { AllowedMemberRoles } from '../ShareOptions/ShareTeamMemberList.tsx';
+
+export type UserProgressResponse = {
+  resourceId: string;
+  resourceType: 'roadmap' | 'best-practice';
+  resourceTitle: string;
+  isFavorite: boolean;
+  done: number;
+  learning: number;
+  skipped: number;
+  total: number;
+  updatedAt: Date;
+  isCustomResource: boolean;
+  roadmapSlug?: string;
+  team?: {
+    name: string;
+    id: string;
+    role: AllowedMemberRoles;
+  };
+}[];
 
 const groupNames = [
   'Absolute Beginners',
@@ -238,6 +257,12 @@ const groups: GroupType[] = [
         type: 'skill',
         otherGroups: ['Web Development'],
       },
+      {
+        title: 'Cloudflare',
+        link: '/cloudflare',
+        type: 'skill',
+        otherGroups: ['Web Development'],
+      },
       {
         title: 'Linux',
         link: '/linux',
diff --git a/src/components/SQLCourse/AccountButton.tsx b/src/components/SQLCourse/AccountButton.tsx
new file mode 100644
index 000000000..cd76e3299
--- /dev/null
+++ b/src/components/SQLCourse/AccountButton.tsx
@@ -0,0 +1,67 @@
+import { useQuery } from '@tanstack/react-query';
+import { useEffect, useState } from 'react';
+import { isLoggedIn } from '../../lib/jwt';
+import {
+  courseProgressOptions
+} from '../../queries/course-progress';
+import { queryClient } from '../../stores/query-client';
+import { CourseLoginPopup } from '../AuthenticationFlow/CourseLoginPopup';
+import { BuyButton, SQL_COURSE_SLUG } from './BuyButton';
+
+export function AccountButton() {
+  const [isVisible, setIsVisible] = useState(false);
+  const [showLoginModal, setShowLoginModal] = useState(false);
+
+  const { data: courseProgress, isLoading: isLoadingCourseProgress } = useQuery(
+    courseProgressOptions(SQL_COURSE_SLUG),
+    queryClient,
+  );
+
+  useEffect(() => {
+    setIsVisible(true);
+  }, []);
+
+  const buttonClasses =
+    'rounded-full px-5 py-2 text-base font-medium text-yellow-700 hover:text-yellow-500 transition-colors';
+
+  const hasEnrolled = !!courseProgress?.enrolledAt;
+  const loginModal = (
+    <CourseLoginPopup
+      checkoutAfterLogin={false}
+      onClose={() => {
+        setShowLoginModal(false);
+      }}
+    />
+  );
+
+  if (!isVisible || isLoadingCourseProgress) {
+    return <button className={`${buttonClasses} opacity-0`}>...</button>;
+  }
+
+  if (!isLoggedIn()) {
+    return (
+      <>
+        <button
+          onClick={() => setShowLoginModal(true)}
+          className={`${buttonClasses} animate-fade-in`}
+        >
+          Login
+        </button>
+        {showLoginModal && loginModal}
+      </>
+    );
+  }
+
+  if (!hasEnrolled) {
+    return <BuyButton variant="top-nav" />;
+  }
+
+  return (
+    <a
+      href={`${import.meta.env.PUBLIC_COURSE_APP_URL}/${SQL_COURSE_SLUG}`}
+      className={`${buttonClasses} animate-fade-in`}
+    >
+      Start Learning
+    </a>
+  );
+}
diff --git a/src/components/SQLCourse/AuthorCredentials.tsx b/src/components/SQLCourse/AuthorCredentials.tsx
new file mode 100644
index 000000000..3eeec0aa3
--- /dev/null
+++ b/src/components/SQLCourse/AuthorCredentials.tsx
@@ -0,0 +1,41 @@
+import { Award } from 'lucide-react';
+
+export function AuthorCredentials() {
+  return (
+    <div className="mx-auto mt-8 flex flex-col items-start gap-4 text-sm text-zinc-400 sm:flex-row sm:flex-wrap sm:items-center md:mt-12 md:justify-center md:gap-x-3 md:gap-y-2">
+      <div className="flex items-center gap-1">
+        <img
+          src="https://assets.roadmap.sh/guest/kamran-lqjta.jpeg"
+          className="size-8 rounded-full object-cover mr-1.5"
+          alt="Kamran Ahmed"
+        />
+        <span>Course by</span>
+        <a
+          href="https://twitter.com/kamrify"
+          target="_blank"
+          className="font-medium text-yellow-500 hover:text-yellow-400"
+        >
+          Kamran Ahmed
+        </a>
+      </div>
+      <div className="hidden flex-wrap items-center gap-x-3 gap-y-2 sm:flex sm:justify-center">
+        <a
+          href="https://github.com/kamranahmedse"
+          target="_blank"
+          className="hidden items-center gap-1 sm:inline-flex text-yellow-500 hover:text-yellow-400"
+        >
+          <svg className="size-4 fill-zinc-400" viewBox="0 0 24 24">
+            <path d="M12 2C6.477 2 2 6.477 2 12c0 4.42 2.865 8.17 6.839 9.49.5.092.682-.217.682-.482 0-.237-.008-.866-.013-1.7-2.782.603-3.369-1.342-3.369-1.342-.454-1.155-1.11-1.462-1.11-1.462-.908-.62.069-.608.069-.608 1.003.07 1.531 1.03 1.531 1.03.892 1.529 2.341 1.087 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.11-4.555-4.943 0-1.091.39-1.984 1.029-2.683-.103-.253-.446-1.27.098-2.647 0 0 .84-.269 2.75 1.022A9.607 9.607 0 0 1 12 6.82c.85.004 1.705.114 2.504.336 1.909-1.291 2.747-1.022 2.747-1.022.546 1.377.203 2.394.1 2.647.64.699 1.028 1.592 1.028 2.683 0 3.842-2.339 4.687-4.566 4.935.359.309.678.919.678 1.852 0 1.336-.012 2.415-.012 2.743 0 .267.18.578.688.48C19.138 20.167 22 16.418 22 12c0-5.523-4.477-10-10-10z" />
+          </svg>
+          #2 most-starred on GitHub
+        </a>
+        <span className="inline-flex items-center gap-1">
+          <svg className="size-3 fill-current" viewBox="0 0 24 24">
+            <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z" />
+          </svg>
+          founder roadmap.sh
+        </span>
+      </div>
+    </div>
+  );
+}
diff --git a/src/components/SQLCourse/AuthorQuoteMessage.tsx b/src/components/SQLCourse/AuthorQuoteMessage.tsx
new file mode 100644
index 000000000..d75be23d8
--- /dev/null
+++ b/src/components/SQLCourse/AuthorQuoteMessage.tsx
@@ -0,0 +1,72 @@
+import { Award, QuoteIcon, Trophy } from 'lucide-react';
+
+export function AuthorQuoteMessage() {
+  return (
+    <div className="mx-auto mt-14 max-w-2xl sm:mt-20">
+      <div className="relative overflow-hidden rounded-2xl bg-gradient-to-br from-yellow-500/10 via-yellow-400/5 to-yellow-300/10 p-8 sm:p-12">
+        <div className="absolute right-0 top-0 -translate-y-1/2 translate-x-1/2">
+          <div className="size-[500px] rounded-full bg-yellow-500/5 blur-3xl" />
+        </div>
+
+        <div className="relative flex flex-col items-center text-center">
+          <h2 className="mb-4 hidden text-2xl font-semibold text-yellow-500 md:block">
+            From your Instructor
+          </h2>
+
+          <div className="mt-4 hidden flex-wrap items-center justify-center gap-x-4 gap-y-2 text-sm text-zinc-400 md:flex">
+            <span className="inline-flex items-center gap-1.5 rounded-full bg-yellow-500/10 px-3 py-1">
+              <Trophy className="size-4 text-yellow-500/80" />
+              Multiple GitHub Star Awards
+            </span>
+            <span className="inline-flex items-center gap-1.5 rounded-full bg-yellow-500/10 px-3 py-1">
+              <svg className="size-4 fill-yellow-500/80" viewBox="0 0 24 24">
+                <path d="M12 2C6.477 2 2 6.477 2 12c0 4.42 2.865 8.17 6.839 9.49.5.092.682-.217.682-.482 0-.237-.008-.866-.013-1.7-2.782.603-3.369-1.342-3.369-1.342-.454-1.155-1.11-1.462-1.11-1.462-.908-.62.069-.608.069-.608 1.003.07 1.531 1.03 1.531 1.03.892 1.529 2.341 1.087 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.11-4.555-4.943 0-1.091.39-1.984 1.029-2.683-.103-.253-.446-1.27.098-2.647 0 0 .84-.269 2.75 1.022A9.607 9.607 0 0 1 12 6.82c.85.004 1.705.114 2.504.336 1.909-1.291 2.747-1.022 2.747-1.022.546 1.377.203 2.394.1 2.647.64.699 1.028 1.592 1.028 2.683 0 3.842-2.339 4.687-4.566 4.935.359.309.678.919.678 1.852 0 1.336-.012 2.415-.012 2.743 0 .267.18.578.688.48C19.138 20.167 22 16.418 22 12c0-5.523-4.477-10-10-10z" />
+              </svg>
+              #2 Most Starred Developer
+            </span>
+            <span className="inline-flex items-center gap-1.5 rounded-full bg-yellow-500/10 px-3 py-1">
+              <Award className="size-4 text-yellow-500/80" />
+              Founder roadmap.sh
+            </span>
+            <span className="inline-flex items-center gap-1.5 rounded-full bg-yellow-500/10 px-3 py-1">
+              <Award className="size-4 text-yellow-500/80" />
+              Google Developer Expert
+            </span>
+          </div>
+
+          <div className="relative mt-0 md:mt-8">
+            <p className="text-base leading-relaxed text-zinc-200 sm:text-xl">
+              "As someone who has worked extensively with databases throughout
+              my career, I know firsthand how crucial SQL skills are. I've
+              created this course to share the practical knowledge that has
+              helped me build and scale data systems at various companies."
+            </p>
+          </div>
+
+          <div className="mt-8 flex items-center gap-4">
+            <img
+              src="https://assets.roadmap.sh/guest/kamran-lqjta.jpeg"
+              alt="Kamran Ahmed"
+              className="size-14 rounded-full ring-2 ring-yellow-500/20"
+            />
+            <div className="text-left">
+              <h3 className="font-medium text-yellow-500">Kamran Ahmed</h3>
+              <p className="text-sm text-zinc-400">
+                Founder roadmap.sh{' '}
+                <span className="mx-1 hidden sm:inline">·</span>
+                <a
+                  href="https://twitter.com/kamrify"
+                  target="_blank"
+                  rel="noopener noreferrer"
+                  className="ml-0.5 text-yellow-500/80 underline underline-offset-4 hover:text-yellow-500"
+                >
+                  @kamrify
+                </a>
+              </p>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  );
+}
diff --git a/src/components/SQLCourse/BuyButton.tsx b/src/components/SQLCourse/BuyButton.tsx
new file mode 100644
index 000000000..2242d4ff8
--- /dev/null
+++ b/src/components/SQLCourse/BuyButton.tsx
@@ -0,0 +1,270 @@
+import { useMutation, useQuery } from '@tanstack/react-query';
+import { ArrowRightIcon, Play } from 'lucide-react';
+import { useEffect, useState } from 'react';
+import { cn } from '../../lib/classname';
+import {
+  COURSE_PURCHASE_PARAM,
+  COURSE_PURCHASE_SUCCESS_PARAM,
+  isLoggedIn,
+} from '../../lib/jwt';
+import { coursePriceOptions } from '../../queries/billing';
+import { courseProgressOptions } from '../../queries/course-progress';
+import { queryClient } from '../../stores/query-client';
+import { CourseLoginPopup } from '../AuthenticationFlow/CourseLoginPopup';
+import { useToast } from '../../hooks/use-toast';
+import { httpPost } from '../../lib/query-http';
+import { deleteUrlParam, getUrlParams } from '../../lib/browser';
+import { VideoModal } from '../VideoModal';
+
+export const SQL_COURSE_SLUG = 'sql';
+
+type CreateCheckoutSessionBody = {
+  courseId: string;
+  success?: string;
+  cancel?: string;
+};
+
+type CreateCheckoutSessionResponse = {
+  checkoutUrl: string;
+};
+
+type BuyButtonProps = {
+  variant?: 'main' | 'floating' | 'top-nav';
+};
+
+export function BuyButton(props: BuyButtonProps) {
+  const { variant = 'main' } = props;
+
+  const [isLoginPopupOpen, setIsLoginPopupOpen] = useState(false);
+  const [isVideoModalOpen, setIsVideoModalOpen] = useState(false);
+  const toast = useToast();
+
+  const { data: coursePricing, isLoading: isLoadingCourse } = useQuery(
+    coursePriceOptions({ courseSlug: SQL_COURSE_SLUG }),
+    queryClient,
+  );
+
+  const { data: courseProgress, isLoading: isLoadingCourseProgress } = useQuery(
+    courseProgressOptions(SQL_COURSE_SLUG),
+    queryClient,
+  );
+
+  const {
+    mutate: createCheckoutSession,
+    isPending: isCreatingCheckoutSession,
+  } = useMutation(
+    {
+      mutationFn: (body: CreateCheckoutSessionBody) => {
+        return httpPost<CreateCheckoutSessionResponse>(
+          '/v1-create-checkout-session',
+          body,
+        );
+      },
+      onMutate: () => {
+        toast.loading('Creating checkout session...');
+      },
+      onSuccess: (data) => {
+        if (!window.gtag) {
+          window.location.href = data.checkoutUrl;
+          return;
+        }
+
+        window?.fireEvent({
+          action: `${SQL_COURSE_SLUG}_begin_checkout`,
+          category: 'course',
+          label: `${SQL_COURSE_SLUG} Course Checkout Started`,
+          callback: () => {
+            window.location.href = data.checkoutUrl;
+          },
+        });
+
+        // Hacky way to make sure that we redirect in case
+        // GA was blocked or not able to redirect the user.
+        setTimeout(() => {
+          window.location.href = data.checkoutUrl;
+        }, 3000);
+      },
+      onError: (error) => {
+        console.error(error);
+        toast.error(error?.message || 'Failed to create checkout session');
+      },
+    },
+    queryClient,
+  );
+
+  useEffect(() => {
+    const urlParams = getUrlParams();
+    const shouldTriggerPurchase = urlParams[COURSE_PURCHASE_PARAM] === '1';
+    if (shouldTriggerPurchase) {
+      deleteUrlParam(COURSE_PURCHASE_PARAM);
+      initPurchase();
+    }
+  }, []);
+
+  useEffect(() => {
+    const urlParams = getUrlParams();
+    const param = urlParams?.[COURSE_PURCHASE_SUCCESS_PARAM];
+    if (!param) {
+      return;
+    }
+
+    const success = param === '1';
+
+    if (success) {
+      window?.fireEvent({
+        action: `${SQL_COURSE_SLUG}_purchase_complete`,
+        category: 'course',
+        label: `${SQL_COURSE_SLUG} Course Purchase Completed`,
+      });
+    } else {
+      window?.fireEvent({
+        action: `${SQL_COURSE_SLUG}_purchase_canceled`,
+        category: 'course',
+        label: `${SQL_COURSE_SLUG} Course Purchase Canceled`,
+      });
+    }
+
+    deleteUrlParam(COURSE_PURCHASE_SUCCESS_PARAM);
+  }, []);
+
+  const isLoadingPricing =
+    isLoadingCourse || !coursePricing || isLoadingCourseProgress;
+  const isAlreadyEnrolled = !!courseProgress?.enrolledAt;
+
+  function initPurchase() {
+    if (!isLoggedIn()) {
+      return;
+    }
+
+    createCheckoutSession({
+      courseId: SQL_COURSE_SLUG,
+      success: `/courses/${SQL_COURSE_SLUG}?${COURSE_PURCHASE_SUCCESS_PARAM}=1`,
+      cancel: `/courses/${SQL_COURSE_SLUG}?${COURSE_PURCHASE_SUCCESS_PARAM}=0`,
+    });
+  }
+
+  function onBuyClick() {
+    if (!isLoggedIn()) {
+      setIsLoginPopupOpen(true);
+      return;
+    }
+
+    const hasEnrolled = !!courseProgress?.enrolledAt;
+    if (hasEnrolled) {
+      window.location.href = `${import.meta.env.PUBLIC_COURSE_APP_URL}/${SQL_COURSE_SLUG}`;
+      return;
+    }
+
+    initPurchase();
+  }
+
+  const courseLoginPopup = isLoginPopupOpen && (
+    <CourseLoginPopup onClose={() => setIsLoginPopupOpen(false)} />
+  );
+
+  if (variant === 'main') {
+    return (
+      <div className="relative flex w-full flex-col items-center gap-2 md:w-auto">
+        {courseLoginPopup}
+        {isVideoModalOpen && (
+          <VideoModal
+            videoId="6S1CcF-ngeQ"
+            onClose={() => setIsVideoModalOpen(false)}
+          />
+        )}
+        <button
+          onClick={onBuyClick}
+          disabled={isLoadingPricing}
+          className={cn(
+            'group relative inline-flex w-full min-w-[235px] items-center justify-center overflow-hidden rounded-xl bg-gradient-to-r from-yellow-500 to-yellow-300 px-8 py-3 text-base font-semibold text-black transition-all duration-300 ease-out hover:scale-[1.02] hover:shadow-[0_0_30px_rgba(234,179,8,0.4)] focus:outline-none active:ring-0 md:w-auto md:rounded-full md:text-lg',
+            (isLoadingPricing || isCreatingCheckoutSession) &&
+              'striped-loader-yellow pointer-events-none scale-105 bg-yellow-500',
+          )}
+        >
+          {isLoadingPricing ? (
+            <span className="relative flex items-center gap-2">&nbsp;</span>
+          ) : isAlreadyEnrolled ? (
+            <span className="relative flex items-center gap-2">
+              Start Learning
+            </span>
+          ) : (
+            <span className="relative flex items-center gap-2">
+              Buy now for{' '}
+              {coursePricing?.isEligibleForDiscount ? (
+                <span className="flex items-center gap-2">
+                  <span className="hidden text-base line-through opacity-75 md:inline">
+                    ${coursePricing?.fullPrice}
+                  </span>
+                  <span className="text-base md:text-xl">
+                    ${coursePricing?.regionalPrice}
+                  </span>
+                </span>
+              ) : (
+                <span>${coursePricing?.regionalPrice}</span>
+              )}
+              <ArrowRightIcon className="h-5 w-5 transition-transform duration-300 ease-out group-hover:translate-x-1" />
+            </span>
+          )}
+        </button>
+
+        {!isLoadingPricing && (
+          <span className="absolute top-full z-50 flex w-[300px] translate-y-3 flex-row items-center justify-center text-sm text-yellow-400">
+            Lifetime access <span className="mx-2">&middot;</span>{' '}
+            <button
+              onClick={() => setIsVideoModalOpen(true)}
+              className="flex cursor-pointer flex-row items-center gap-1.5 underline underline-offset-4 hover:text-yellow-500"
+            >
+              <Play className="size-3 fill-current" /> Watch Video (3 min)
+            </button>
+          </span>
+        )}
+      </div>
+    );
+  }
+
+  if (variant === 'top-nav') {
+    return (
+      <button
+        onClick={onBuyClick}
+        disabled={isLoadingPricing}
+        className={`animate-fade-in rounded-full px-5 py-2 text-base font-medium text-yellow-700 transition-colors hover:text-yellow-500`}
+      >
+        Purchase Course
+      </button>
+    );
+  }
+
+  return (
+    <div className="relative flex flex-col items-center gap-2">
+      {courseLoginPopup}
+      <button
+        onClick={onBuyClick}
+        disabled={isLoadingPricing}
+        className={cn(
+          'group relative inline-flex min-w-[220px] items-center justify-center overflow-hidden rounded-full bg-gradient-to-r from-yellow-500 to-yellow-300 px-8 py-2 font-medium text-black transition-all duration-300 ease-out hover:scale-[1.02] hover:shadow-[0_0_30px_rgba(234,179,8,0.4)] focus:outline-none',
+          (isLoadingPricing || isCreatingCheckoutSession) &&
+            'striped-loader-yellow pointer-events-none bg-yellow-500',
+        )}
+      >
+        {isLoadingPricing ? (
+          <span className="relative flex items-center gap-2">&nbsp;</span>
+        ) : isAlreadyEnrolled ? (
+          <span className="relative flex items-center gap-2">
+            Start Learning
+          </span>
+        ) : (
+          <span className="relative flex items-center gap-2">
+            Buy Now ${coursePricing?.regionalPrice}
+            <ArrowRightIcon className="h-5 w-5 transition-transform duration-300 ease-out group-hover:translate-x-1" />
+          </span>
+        )}
+      </button>
+
+      {!isLoadingPricing && !isAlreadyEnrolled && (
+        <span className="top-full text-sm text-yellow-400">
+          Lifetime access <span className="mx-1">&middot;</span> Free updates
+        </span>
+      )}
+    </div>
+  );
+}
diff --git a/src/components/SQLCourse/ChapterRow.tsx b/src/components/SQLCourse/ChapterRow.tsx
new file mode 100644
index 000000000..181fdf85b
--- /dev/null
+++ b/src/components/SQLCourse/ChapterRow.tsx
@@ -0,0 +1,145 @@
+import { ChevronDown, BookIcon, CodeIcon, FileQuestion, MessageCircleQuestionIcon, CircleDot } from 'lucide-react';
+import { cn } from '../../lib/classname';
+import { useEffect, useState } from 'react';
+
+type ChapterRowProps = {
+  counter: number;
+  icon: React.ReactNode;
+  title: string;
+  description: string;
+  lessonCount: number;
+  challengeCount: number;
+  isExpandable?: boolean;
+  className?: string;
+  lessons?: { title: string; type: 'lesson' | 'challenge' | 'quiz' }[];
+};
+
+export function ChapterRow(props: ChapterRowProps) {
+  const {
+    counter,
+    icon,
+    title,
+    description,
+    lessonCount,
+    challengeCount,
+    isExpandable = true,
+    className,
+    lessons = [],
+  } = props;
+
+  const [isExpanded, setIsExpanded] = useState(true);
+
+  const regularLessons = lessons.filter((l) => l.type === 'lesson');
+  const challenges = lessons.filter((l) =>
+    ['challenge', 'quiz'].includes(l.type),
+  );
+
+  useEffect(() => {
+    const isMobile = window.innerWidth < 768;
+    setIsExpanded(!isMobile);
+  }, []);
+
+  return (
+    <div
+      className={cn('group relative select-none overflow-hidden', className)}
+    >
+      <div
+        role="button"
+        onClick={() => isExpandable && setIsExpanded(!isExpanded)}
+        className={cn(
+          'relative rounded-xl border border-zinc-800 bg-zinc-800 p-6',
+          'bg-gradient-to-br from-zinc-900/90 via-zinc-900/70 to-zinc-900/50',
+          !isExpanded &&
+            'hover:bg-gradient-to-br hover:from-zinc-900/95 hover:via-zinc-900/80 hover:to-zinc-900/60',
+          !isExpanded &&
+            'hover:cursor-pointer hover:shadow-[0_0_30px_rgba(0,0,0,0.2)]',
+          isExpanded && 'rounded-b-none border-b-0',
+        )}
+      >
+        <div className="flex items-start gap-4">
+          <div className="hidden flex-shrink-0 md:block">
+            <div className="rounded-full bg-yellow-500/10 p-3">{icon}</div>
+          </div>
+
+          <div className="flex-grow">
+            <h3 className="text-xl font-semibold tracking-wide text-white">
+              <span className="inline text-gray-500 md:hidden">
+                {counter}.{' '}
+              </span>
+              {title}
+            </h3>
+            <p className="mt-2 text-zinc-400">{description}</p>
+
+            <div className="mt-4 flex items-center gap-4">
+              <div className="flex items-center gap-2 text-sm text-zinc-500">
+                <span>{lessonCount} Lessons</span>
+              </div>
+              <div className="flex items-center gap-2 text-sm text-zinc-500">
+                <span>{challengeCount} Challenges</span>
+              </div>
+            </div>
+          </div>
+
+          {isExpandable && (
+            <div className="flex-shrink-0 rounded-full bg-zinc-800/80 p-2 text-zinc-400 group-hover:bg-zinc-800 group-hover:text-yellow-500">
+              <ChevronDown
+                className={cn(
+                  'h-4 w-4 transition-transform',
+                  isExpanded ? 'rotate-180' : '',
+                )}
+              />
+            </div>
+          )}
+        </div>
+      </div>
+
+      {isExpanded && (
+        <div className="rounded-b-xl border border-t-0 border-zinc-800 bg-gradient-to-br from-zinc-900/50 via-zinc-900/30 to-zinc-900/20">
+          <div className="grid grid-cols-1 divide-zinc-800 md:grid-cols-2 md:divide-x">
+            {regularLessons.length > 0 && (
+              <div className="p-6 pb-0 md:pb-6">
+                <h4 className="mb-4 text-sm font-medium uppercase tracking-wider text-zinc-500">
+                  Lessons
+                </h4>
+                <div className="space-y-3">
+                  {regularLessons.map((lesson, index) => (
+                    <div
+                      key={index}
+                      className="flex items-center gap-3 text-zinc-400 hover:text-yellow-500"
+                    >
+                      <BookIcon className="h-4 w-4" />
+                      <span>{lesson.title}</span>
+                    </div>
+                  ))}
+                </div>
+              </div>
+            )}
+
+            {challenges.length > 0 && (
+              <div className="p-6">
+                <h4 className="mb-4 text-sm font-medium uppercase tracking-wider text-zinc-500">
+                  Exercises
+                </h4>
+                <div className="space-y-3">
+                  {challenges.map((challenge, index) => (
+                    <div
+                      key={index}
+                      className="flex items-center gap-3 text-zinc-400 hover:text-yellow-500"
+                    >
+                      {challenge.type === 'challenge' ? (
+                        <CodeIcon className="h-4 w-4" />
+                      ) : (
+                        <CircleDot className="h-4 w-4" />
+                      )}
+                      <span>{challenge.title}</span>
+                    </div>
+                  ))}
+                </div>
+              </div>
+            )}
+          </div>
+        </div>
+      )}
+    </div>
+  );
+}
diff --git a/src/components/SQLCourse/CourseAnnouncement.tsx b/src/components/SQLCourse/CourseAnnouncement.tsx
new file mode 100644
index 000000000..a3c623d3e
--- /dev/null
+++ b/src/components/SQLCourse/CourseAnnouncement.tsx
@@ -0,0 +1,40 @@
+import { Database, X } from 'lucide-react';
+import { useEffect, useState } from 'react';
+
+export function CourseAnnouncement() {
+  const [isVisible, setIsVisible] = useState(true);
+
+  if (!isVisible) {
+    return null;
+  }
+
+  return (
+    <div className="sticky top-0 z-[91]">
+      <a href="/courses/sql" className="flex items-center bg-yellow-400 py-1.5">
+        <span className="container mx-auto flex items-center justify-start gap-2 text-center sm:justify-center sm:gap-4">
+          <span className="flex items-center gap-1.5 text-xs font-medium text-black md:text-base">
+            <Database className="hidden h-4 w-4 flex-shrink-0 text-black sm:block" />
+            <span className="hidden sm:block">
+              Master SQL with our new paid course
+            </span>
+            <span className="block sm:hidden">Announcing our SQL course</span>
+          </span>
+          <span className="items-center gap-1.5 rounded-full bg-black px-2 py-0.5 text-xs font-medium uppercase tracking-wide text-white hover:bg-zinc-800 sm:px-3 sm:py-1">
+            <span className="mr-1.5 hidden sm:inline">Start Learning</span>
+            <span className="mr-1.5 inline sm:hidden">Visit</span>
+            <span className="">→</span>
+          </span>
+        </span>
+      </a>
+      <button
+        type="button"
+        className="absolute right-3.5 top-1/2 -translate-y-1/2 rounded-lg px-1.5 py-1.5 text-gray-500 hover:bg-yellow-500 hover:text-gray-700"
+        onClick={(e) => {
+          setIsVisible(false);
+        }}
+      >
+        <X className="h-4 w-4" />
+      </button>
+    </div>
+  );
+}
diff --git a/src/components/SQLCourse/CourseAuthor.tsx b/src/components/SQLCourse/CourseAuthor.tsx
new file mode 100644
index 000000000..55c02d963
--- /dev/null
+++ b/src/components/SQLCourse/CourseAuthor.tsx
@@ -0,0 +1,25 @@
+export function CourseAuthor() {
+  return (
+    <div className="mt-8 w-full max-w-3xl space-y-4">
+      <div className="flex flex-row items-center gap-5">
+        <img
+          src="https://assets.roadmap.sh/guest/kamran-lqjta.jpeg"
+          className="size-12 rounded-full bg-yellow-500/10 md:size-16"
+          alt="Kamran Ahmed"
+        />
+        <a
+          href="https://twitter.com/kamrify"
+          target="_blank"
+          className="flex flex-col"
+        >
+          <span className="text-lg font-medium text-zinc-200 md:text-2xl">
+            Kamran Ahmed
+          </span>
+          <span className="text-sm text-zinc-500 md:text-lg">
+            Software Engineer
+          </span>
+        </a>
+      </div>
+    </div>
+  );
+}
diff --git a/src/components/SQLCourse/CourseFeature.tsx b/src/components/SQLCourse/CourseFeature.tsx
new file mode 100644
index 000000000..a26f18a9f
--- /dev/null
+++ b/src/components/SQLCourse/CourseFeature.tsx
@@ -0,0 +1,94 @@
+import { MinusIcon, PlusIcon, type LucideIcon } from 'lucide-react';
+import { useEffect, useState } from 'react';
+import { cn } from '../../lib/classname';
+
+type CourseFeatureProps = {
+  title: string;
+  icon: LucideIcon;
+  description: string;
+  imgUrl?: string;
+};
+
+export function CourseFeature(props: CourseFeatureProps) {
+  const { title, icon: Icon, description, imgUrl } = props;
+
+  const [isExpanded, setIsExpanded] = useState(false);
+  const [isZoomed, setIsZoomed] = useState(false);
+
+  useEffect(() => {
+    function onScroll() {
+      if (isZoomed) {
+        setIsZoomed(false);
+      }
+    }
+
+    window.addEventListener('scroll', onScroll);
+    return () => window.removeEventListener('scroll', onScroll);
+  }, [isZoomed]);
+
+  return (
+    <>
+      {isZoomed && (
+        <div
+          onClick={() => {
+            setIsZoomed(false);
+            setIsExpanded(false);
+          }}
+          className="fixed inset-0 z-[999] flex cursor-zoom-out items-center justify-center bg-black bg-opacity-75"
+        >
+          <img
+            src={imgUrl}
+            alt={title}
+            className="max-h-[50%] max-w-[90%] rounded-xl object-contain"
+          />
+        </div>
+      )}
+      <div
+        className={cn(
+          'fixed inset-0 z-10 bg-black/70 opacity-100 transition-opacity duration-200 ease-out',
+          {
+            'pointer-events-none opacity-0': !isExpanded,
+          },
+        )}
+        onClick={() => setIsExpanded(false)}
+      ></div>
+      <div className="relative">
+        <button
+          onClick={() => setIsExpanded(!isExpanded)}
+          className={cn(
+            'z-20 flex w-full items-center rounded-lg border border-zinc-800 bg-zinc-900/50 px-4 py-3 text-left transition-colors duration-200 ease-out hover:bg-zinc-800/40',
+            {
+              'relative bg-zinc-800 hover:bg-zinc-800': isExpanded,
+            },
+          )}
+        >
+          <span className="flex flex-grow items-center space-x-3">
+            <Icon />
+            <span>{title}</span>
+          </span>
+          {isExpanded ? (
+            <MinusIcon className="h-4 w-4" />
+          ) : (
+            <PlusIcon className="h-4 w-4" />
+          )}
+        </button>
+        {isExpanded && (
+          <div className="absolute left-0 top-full z-20 translate-y-2 rounded-lg border border-zinc-800 bg-zinc-800 p-4">
+            <p>{description}</p>
+            {imgUrl && (
+              <img
+                onClick={() => {
+                  setIsZoomed(true);
+                  setIsExpanded(false);
+                }}
+                src={imgUrl}
+                alt={title}
+                className="mt-4 h-auto pointer-events-none md:pointer-events-auto w-full cursor-zoom-in rounded-lg object-right-top"
+              />
+            )}
+          </div>
+        )}
+      </div>
+    </>
+  );
+}
diff --git a/src/components/SQLCourse/FAQSection.tsx b/src/components/SQLCourse/FAQSection.tsx
new file mode 100644
index 000000000..5e4a0cbf5
--- /dev/null
+++ b/src/components/SQLCourse/FAQSection.tsx
@@ -0,0 +1,113 @@
+import { ChevronDownIcon } from 'lucide-react';
+import { useState } from 'react';
+import { SectionHeader } from './SectionHeader';
+
+type FAQItem = {
+  question: string;
+  answer: string;
+};
+
+function FAQRow({ question, answer }: FAQItem) {
+  const [isExpanded, setIsExpanded] = useState(false);
+
+  return (
+    <div className="rounded-lg border border-zinc-800 bg-zinc-900">
+      <button
+        onClick={() => setIsExpanded(!isExpanded)}
+        className="flex w-full items-center justify-between p-4 md:p-6 text-left gap-2"
+      >
+        <h3 className="text-lg md:text-xl text-balance font-normal text-white">{question}</h3>
+        <ChevronDownIcon
+          className={`h-5 w-5 text-zinc-400 transition-transform duration-200 ${
+            isExpanded ? 'rotate-180' : ''
+          }`}
+        />
+      </button>
+      {isExpanded && (
+        <div className="border-t border-zinc-800 p-6 pt-4 text-base md:text-lg leading-relaxed">
+          <p>{answer}</p>
+        </div>
+      )}
+    </div>
+  );
+}
+
+export function FAQSection() {
+  const faqs: FAQItem[] = [
+    {
+      question: 'What is the format of the course?',
+      answer:
+        'The course is written in textual format. There are several chapters; each chapter has a set of lessons, followed by a set of practice problems and quizzes. You can learn at your own pace and revisit the content anytime.',
+    },
+    {
+      question: 'What prerequisites do I need for this course?',
+      answer:
+        'No prior SQL knowledge is required. The course starts from the basics and gradually progresses to advanced topics.',
+    },
+    {
+      question: 'Do I need to have a local database to follow the course?',
+      answer:
+        'No, we have an integrated coding playground, populated with a sample databases depending on the lesson, that you can use to follow the course. You can also use your own database if you have one.',
+    },
+    {
+      question: 'How long do I have access to the course?',
+      answer:
+        'You get lifetime access to the course including all future updates. Once you purchase, you can learn at your own pace and revisit the content anytime.',
+    },
+    {
+      question: 'What kind of support is available?',
+      answer:
+        'You get access to an AI tutor within the course that can help you with queries 24/7. Additionally, you can use the community forums to discuss problems and get help from other learners.',
+    },
+    {
+      question: 'Will I get a certificate upon completion?',
+      answer:
+        "Yes, upon completing the course and its challenges, you'll receive a certificate of completion that you can share with employers or add to your LinkedIn profile.",
+    },
+    {
+      question: 'Can I use this for job interviews?',
+      answer:
+        'Absolutely! The course covers common SQL interview topics and includes practical challenges similar to what you might face in technical interviews. The hands-on experience will prepare you well for real-world scenarios.',
+    },
+    {
+      question: "What if I don't like the course?",
+      answer:
+        'I will refund your purchase within 7 days of the purchase. No questions asked. However, I would love to hear your feedback so that I can improve the course. Send me an email at kamran@roadmap.sh',
+    },
+    {
+      question: 'I already know SQL, can I still take this course?',
+      answer:
+        'Yes! The course starts from the basics and gradually progresses to advanced topics. You can skip the chapters that you already know and focus on the ones that you need.',
+    },
+    {
+      question: 'Do you offer any team licenses?',
+      answer: 'Yes, please contact me at kamran@roadmap.sh',
+    },
+    {
+      question: 'How can I gift this course to someone?',
+      answer:
+        'Please contact me at kamran@roadmap.sh and I will be happy to help you.',
+    },
+    {
+      question: 'What if I have a question that is not answered here?',
+      answer:
+        'Please contact me at kamran@roadmap.sh and I will be happy to help you.',
+    },
+  ];
+
+  return (
+    <>
+      <SectionHeader
+        title="Frequently Asked Questions"
+        description="Find answers to common questions about the course below."
+        className="mt-10 md:mt-24"
+      />
+
+      <div className="mt-6 md:mt-8 w-full max-w-3xl space-y-2 md:space-y-6">
+        {faqs.map((faq, index) => (
+          <FAQRow key={index} {...faq} />
+        ))}
+      </div>
+    </>
+  );
+}
diff --git a/src/components/SQLCourse/FloatingPurchase.tsx b/src/components/SQLCourse/FloatingPurchase.tsx
new file mode 100644
index 000000000..ce79daac0
--- /dev/null
+++ b/src/components/SQLCourse/FloatingPurchase.tsx
@@ -0,0 +1,56 @@
+import { ArrowRightIcon } from 'lucide-react';
+import { useEffect, useState } from 'react';
+import { cn } from '../../lib/classname';
+import { BuyButton } from './BuyButton';
+
+export function FloatingPurchase() {
+  const [isHidden, setIsHidden] = useState(true);
+
+  useEffect(() => {
+    function onScroll() {
+      setIsHidden(window.scrollY < 400);
+    }
+
+    window.addEventListener('scroll', onScroll);
+    return () => window.removeEventListener('scroll', onScroll);
+  }, []);
+
+  return (
+    <div
+      className={cn(
+        'fixed bottom-0 left-0 right-0 z-[5] flex items-center justify-center transition-all duration-200 ease-out',
+        {
+          'pointer-events-none -bottom-10 opacity-0': isHidden,
+        },
+      )}
+    >
+      {/* Desktop version */}
+      <div className="hidden mb-5 md:flex w-full max-w-[800px] items-center justify-between rounded-2xl bg-yellow-950 p-5 shadow-lg ring-1 ring-yellow-500/40">
+        <div className="flex flex-col">
+          <h2 className="mb-1 text-xl font-medium text-white">
+            Go from Zero to Hero in SQL
+          </h2>
+          <p className="text-sm text-zinc-400">
+            Get instant access to the course and start learning today
+          </p>
+        </div>
+
+        <BuyButton variant="floating" />
+      </div>
+
+      {/* Mobile version */}
+      <div className="flex md:hidden w-full flex-col bg-yellow-950 px-4 pt-3 pb-4 shadow-lg ring-1 ring-yellow-500/40">
+        <div className="flex flex-col items-center text-center mb-3">
+          <h2 className="text-lg font-medium text-white">
+            Master SQL Today
+          </h2>
+          <p className="text-xs text-zinc-400">
+            Get instant lifetime access
+          </p>
+        </div>
+
+        <BuyButton variant="floating" />
+      </div>
+    </div>
+  );
+}
diff --git a/src/components/SQLCourse/PlatformDemo.tsx b/src/components/SQLCourse/PlatformDemo.tsx
new file mode 100644
index 000000000..c12b4332f
--- /dev/null
+++ b/src/components/SQLCourse/PlatformDemo.tsx
@@ -0,0 +1,34 @@
+import { SectionHeader } from './SectionHeader';
+import { useState } from 'react';
+import { Play } from 'lucide-react';
+import { VideoModal } from '../VideoModal';
+
+export function PlatformDemo() {
+  const [isVideoModalOpen, setIsVideoModalOpen] = useState(false);
+
+  return (
+    <>
+      {isVideoModalOpen && (
+        <VideoModal
+          videoId="6S1CcF-ngeQ"
+          onClose={() => setIsVideoModalOpen(false)}
+        />
+      )}
+      <div className="relative mt-12 w-full max-w-5xl sm:mt-24">
+        <img
+          src="https://assets.roadmap.sh/guest/course-environment-87jg8.png"
+          alt="Course Environment"
+          className="w-full rounded-xl"
+        />
+        <div
+          onClick={() => setIsVideoModalOpen(true)}
+          className="group absolute inset-0 flex cursor-pointer items-center justify-center rounded-xl bg-black/40 transition-all hover:bg-black/50"
+        >
+          <div className="flex size-12 items-center justify-center rounded-full bg-white/90 transition-transform group-hover:scale-105 lg:size-16">
+            <Play className="ml-1 fill-current text-black lg:size-8" />
+          </div>
+        </div>
+      </div>
+    </>
+  );
+}
diff --git a/src/components/SQLCourse/ReviewsSection.tsx b/src/components/SQLCourse/ReviewsSection.tsx
new file mode 100644
index 000000000..3e976e64c
--- /dev/null
+++ b/src/components/SQLCourse/ReviewsSection.tsx
@@ -0,0 +1,254 @@
+import { ChevronDownIcon, StarIcon, User2Icon } from 'lucide-react';
+import { useState } from 'react';
+import { cn } from '../../../editor/utils/classname';
+import { markdownToHtml } from '../../lib/markdown';
+
+type Review = {
+  name: string;
+  role: string;
+  rating: number;
+  text: string | string[];
+  avatarUrl?: string;
+  isProminent?: boolean;
+  isSecondaryProminent?: boolean;
+};
+
+export function ReviewsSection() {
+  const [isExpanded, setIsExpanded] = useState(false);
+  const reviews: Review[] = [
+    {
+      name: 'Robin Wieruch',
+      role: 'Author - Multiple best-selling books',
+      rating: 5,
+      text: [
+        'Kamran has been in the **educative space for a long time**, and it shows in the way he teaches SQL: clear, structured, and straight to the point.',
+        "He breaks down SQL fundamentals in a way that's both **intuitive and practical**, helping you not just write queries, but truly understand how databases work.",
+        "Even if you've used SQL before, this **course will fill in gaps you didn't even realize you had**. Get ready to level up your database skills!",
+      ],
+      avatarUrl: 'https://assets.roadmap.sh/guest/robin.jpeg',
+      isProminent: true,
+    },
+    {
+      name: 'William Imoh',
+      role: 'Founder and Data Enthusiast',
+      rating: 5,
+      text: [
+        'I have been working with SQL and databases for a long time, I bought this course for the advanced chapters but ended up completing the entire course. I learned a lot of new things and it was **well worth the investment**.',
+        'No matter your SQL experience, this course is **a must-have** if you want to level up your SQL and data analysis skills. Highly recommended!',
+      ],
+      avatarUrl: 'https://assets.roadmap.sh/guest/william-imoh-sd2dk.jpg',
+      isProminent: true,
+    },
+    {
+      name: 'Tomáš Janků',
+      role: 'Software Engineer',
+      rating: 5,
+      text: "The course and it's interactivity is excellent and I'd honestly say it's **one of the best** on the SQL theme I've seen out there.",
+      avatarUrl: 'https://assets.roadmap.sh/guest/tomas-janku-6bg89.jpeg',
+    },
+    {
+      name: 'Gourav Khunger',
+      role: 'Software Engineer',
+      rating: 5,
+      text: 'This course was **absolutely brilliant!** The integrated database environment to practice what I learned was the best part.',
+      avatarUrl: 'https://assets.roadmap.sh/guest/gourav-h2f3a.png',
+    },
+    {
+      name: 'Meabed',
+      role: 'CTO',
+      rating: 5,
+      text: 'Kamran has **clearly put a lot of thought** into this course. The content, structure and exercises were all great.',
+      avatarUrl: 'https://assets.roadmap.sh/guest/meabed-fu83q.jpeg',
+    },
+    {
+      name: 'Mohsin Aheer',
+      role: 'Sr. Software Engineer',
+      rating: 5,
+      text: 'I already knew SQL but this course **taught me a bunch of new things.** Practical examples and challenges were great. Highly recommended!',
+      avatarUrl: 'https://assets.roadmap.sh/guest/mohsinaheer-szchu.jpeg',
+    },
+    {
+      name: 'Reeve Tee',
+      role: 'Software Engineer',
+      rating: 5,
+      text: 'I found the course **highly comprehensive and incredibly valuable**. I would love to see more courses like this!',
+      avatarUrl: '',
+    },
+    {
+      name: 'Zeeshan',
+      role: 'Sr. Software Engineer',
+      rating: 5,
+      text: 'Loved the teaching style and the way the course was structured. The **AI tutor was a great help** when I got stuck.',
+      avatarUrl: 'https://assets.roadmap.sh/guest/ziishaned-qjepj.png',
+    },
+    {
+      name: 'Adnan Ahmed',
+      role: 'Engineering Manager',
+      rating: 5,
+      text: 'Having the integrated IDE made a huge difference. Being able to **immediately practice** what I learned was **invaluable**.',
+      avatarUrl: 'https://assets.roadmap.sh/guest/idnan-fzps5.jpeg',
+    },
+    {
+      name: 'Kalvin Chakma',
+      role: 'Jr. Software Engineer',
+      rating: 5,
+      text: "Best SQL course I've taken. The progression from basic to advanced concepts is **well thought out**, and the challenges are **excellent**.",
+      avatarUrl: 'https://assets.roadmap.sh/guest/kalvin-d65ol.jpeg',
+    },
+    {
+      name: 'Faisal Ahsan',
+      role: 'Software Engineer',
+      rating: 5,
+      text: 'The course and the learning experience was great. What I really liked was the **no-fluff explanations** and **practical examples**.',
+      avatarUrl: 'https://assets.roadmap.sh/guest/faisal-q78p2.jpeg',
+    },
+  ];
+
+  const prominentReviews = reviews.filter((r) => r.isProminent);
+  const regularReviews = reviews.filter((r) => !r.isProminent);
+
+  return (
+    <div className="relative max-w-5xl">
+      <div
+        className={cn('rounded-2xl pb-0 pt-24', {
+          'pb-8': isExpanded,
+        })}
+      >
+        {/* Prominent Reviews */}
+        <div className="mb-4 md:mb-6">
+          <div className="grid grid-cols-1 gap-4 md:gap-6 md:grid-cols-2">
+            {prominentReviews.map((review, index) => (
+              <div
+                key={index}
+                className="review-testimonial relative overflow-hidden rounded-2xl bg-gradient-to-br from-yellow-500/10 via-yellow-500/5 to-transparent p-8 backdrop-blur [&_strong]:font-normal [&_strong]:text-yellow-300/70"
+              >
+                <div className="absolute -right-8 -top-8 h-32 w-32 rounded-full bg-yellow-500/5" />
+                <div className="flex items-center gap-4">
+                  {review.avatarUrl && (
+                    <img
+                      src={review.avatarUrl}
+                      alt={review.name}
+                      className="h-16 w-16 rounded-full border-2 border-yellow-500/20 object-cover"
+                    />
+                  )}
+                  {!review.avatarUrl && (
+                    <div className="flex h-16 w-16 items-center justify-center rounded-full bg-zinc-800">
+                      <User2Icon className="h-8 w-8 text-zinc-400" />
+                    </div>
+                  )}
+                  <div>
+                    <h3 className="text-lg font-semibold text-zinc-100">
+                      {review.name}
+                    </h3>
+                    <p className="text-sm text-yellow-500/70">{review.role}</p>
+                    <div className="mt-1 flex">
+                      {Array.from({ length: review.rating }).map((_, i) => (
+                        <StarIcon
+                          key={i}
+                          className="h-4 w-4 fill-yellow-500 text-yellow-500"
+                        />
+                      ))}
+                    </div>
+                  </div>
+                </div>
+                <div className="mt-4 flex flex-col gap-3">
+                  {(typeof review.text === 'string'
+                    ? [review.text]
+                    : review.text
+                  ).map((text, index) => (
+                    <p
+                      key={index}
+                      className="text-zinc-300"
+                      dangerouslySetInnerHTML={{
+                        __html: markdownToHtml(text),
+                      }}
+                    />
+                  ))}
+                </div>
+              </div>
+            ))}
+          </div>
+        </div>
+
+        <div
+          className={cn(
+            'relative grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3',
+            isExpanded ? '' : 'max-h-[400px] overflow-hidden',
+          )}
+        >
+          {regularReviews.map((review, index) => (
+            <div
+              key={index}
+              className={cn(
+                'review-testimonial flex-shrink-0 break-inside-avoid-column rounded-xl p-6 backdrop-blur [&_strong]:font-normal [&_strong]:text-yellow-300/70',
+                {
+                  'bg-gradient-to-br from-yellow-500/10 via-yellow-500/5 to-transparent':
+                    review.isSecondaryProminent,
+                  'bg-zinc-800/30': !review.isSecondaryProminent,
+                },
+              )}
+            >
+              <div className="flex items-center gap-4">
+                {review.avatarUrl && (
+                  <img
+                    src={review.avatarUrl}
+                    alt={review.name}
+                    className="h-12 w-12 rounded-full object-cover"
+                  />
+                )}
+                {!review.avatarUrl && (
+                  <div className="flex h-12 w-12 items-center justify-center rounded-full bg-zinc-800">
+                    <User2Icon className="h-6 w-6 text-zinc-400" />
+                  </div>
+                )}
+                <div>
+                  <h3 className="font-semibold text-zinc-100">{review.name}</h3>
+                  <p className="text-sm text-zinc-400">{review.role}</p>
+                </div>
+              </div>
+              <div className="mt-2 flex">
+                {Array.from({ length: review.rating }).map((_, i) => (
+                  <StarIcon
+                    key={i}
+                    className="h-4 w-4 fill-yellow-500 text-yellow-500"
+                  />
+                ))}
+              </div>
+              <p
+                className="mt-4 text-zinc-300"
+                dangerouslySetInnerHTML={{
+                  __html: markdownToHtml(review.text),
+                }}
+              />
+            </div>
+          ))}
+
+          <div
+            className={cn(
+              'absolute bottom-0 left-0 right-0 h-40 bg-gradient-to-t from-[#121212] via-[#121212]/80 to-transparent',
+              isExpanded ? 'opacity-0' : 'opacity-100',
+            )}
+          />
+        </div>
+      </div>
+
+      <div
+        className={cn('absolute left-1/2 top-full -translate-x-1/2', {
+          '-translate-y-1/2': !isExpanded,
+        })}
+      >
+        <button
+          onClick={() => setIsExpanded(!isExpanded)}
+          className="flex items-center gap-2 rounded-full bg-zinc-800 px-6 py-2 text-sm font-medium text-zinc-300 transition-all hover:bg-zinc-700 hover:text-zinc-100"
+        >
+          {isExpanded ? 'Show Less' : 'Show More Reviews'}
+          <ChevronDownIcon
+            className={`h-4 w-4 transition-transform ${
+              isExpanded ? 'rotate-180' : ''
+            }`}
+          />
+        </button>
+      </div>
+    </div>
+  );
+}
diff --git a/src/components/SQLCourse/SQLCoursePage.tsx b/src/components/SQLCourse/SQLCoursePage.tsx
new file mode 100644
index 000000000..04f660a81
--- /dev/null
+++ b/src/components/SQLCourse/SQLCoursePage.tsx
@@ -0,0 +1,424 @@
+import {
+  ArrowUpDownIcon,
+  BarChartIcon,
+  BrainIcon,
+  ClipboardIcon,
+  CodeIcon,
+  DatabaseIcon,
+  Eye,
+  FileCheckIcon,
+  FileQuestionIcon,
+  GitBranchIcon,
+  GitMergeIcon,
+  LayersIcon,
+  TableIcon,
+  WrenchIcon,
+} from 'lucide-react';
+import { RoadmapLogoIcon } from '../ReactIcons/RoadmapLogo';
+import { AccountButton } from './AccountButton';
+import { AuthorCredentials } from './AuthorCredentials';
+import { AuthorQuoteMessage } from './AuthorQuoteMessage';
+import { BuyButton } from './BuyButton';
+import { ChapterRow } from './ChapterRow';
+import { CourseAuthor } from './CourseAuthor';
+import { CourseFeature } from './CourseFeature';
+import { FAQSection } from './FAQSection';
+import { FloatingPurchase } from './FloatingPurchase';
+import { PlatformDemo } from './PlatformDemo';
+import { ReviewsSection } from './ReviewsSection';
+import { SectionHeader } from './SectionHeader';
+import { Spotlight } from './Spotlight';
+
+type ChapterData = {
+  icon: React.ReactNode;
+  title: string;
+  description: string;
+  lessonCount: number;
+  challengeCount: number;
+  lessons: { title: string; type: 'lesson' | 'challenge' | 'quiz' }[];
+};
+
+export function SQLCoursePage() {
+  const chapters: ChapterData[] = [
+    {
+      icon: <DatabaseIcon className="h-6 w-6 text-yellow-500" />,
+      title: 'Introduction',
+      description:
+        'Get comfortable with database concepts and SQL fundamentals.',
+      lessonCount: 4,
+      challengeCount: 1,
+      lessons: [
+        { title: 'Basics of Databases', type: 'lesson' },
+        { title: 'What is SQL?', type: 'lesson' },
+        { title: 'Types of Queries', type: 'lesson' },
+        { title: 'Next Steps', type: 'lesson' },
+        { title: 'Introduction Quiz', type: 'challenge' },
+      ],
+    },
+    {
+      icon: <TableIcon className="h-6 w-6 text-yellow-500" />,
+      title: 'SQL Basics',
+      description: 'Master the essential SQL query operations and syntax.',
+      lessonCount: 9,
+      challengeCount: 7,
+      lessons: [
+        { title: 'SELECT Fundamentals', type: 'lesson' },
+        { title: 'Aliases and Constants', type: 'lesson' },
+        { title: 'Expressions in SELECT', type: 'lesson' },
+        { title: 'Selecting DISTINCT Values', type: 'lesson' },
+        { title: 'Filtering with WHERE', type: 'lesson' },
+        { title: 'Sorting with ORDER BY', type: 'lesson' },
+        { title: 'Limiting Results with LIMIT', type: 'lesson' },
+        { title: 'Handling NULL Values', type: 'lesson' },
+        { title: 'Comments', type: 'lesson' },
+        { title: 'Basic Queries Quiz', type: 'quiz' },
+        { title: 'Projection Challenge', type: 'challenge' },
+        { title: 'Select Expression', type: 'challenge' },
+        { title: 'Select Unique', type: 'challenge' },
+        { title: 'Logical Operators', type: 'challenge' },
+        { title: 'Sorting Challenge', type: 'challenge' },
+        { title: 'Sorting and Limiting', type: 'challenge' },
+        { title: 'Sorting and Filtering', type: 'challenge' },
+      ],
+    },
+    {
+      icon: <CodeIcon className="h-6 w-6 text-yellow-500" />,
+      title: 'Manipulating Data',
+      description: 'Learn how to modify and manipulate data in your database.',
+      lessonCount: 3,
+      challengeCount: 3,
+      lessons: [
+        { title: 'INSERT Operations', type: 'lesson' },
+        { title: 'UPDATE Operations', type: 'lesson' },
+        { title: 'DELETE Operations', type: 'lesson' },
+        { title: 'Data Manipulation Quiz', type: 'quiz' },
+        { title: 'Inserting Customers', type: 'challenge' },
+        { title: 'Updating Bookstore', type: 'challenge' },
+        { title: 'Deleting Books', type: 'challenge' },
+      ],
+    },
+    {
+      icon: <LayersIcon className="h-6 w-6 text-yellow-500" />,
+      title: 'Defining Tables',
+      description: 'Master database schema design and table management.',
+      lessonCount: 9,
+      challengeCount: 7,
+      lessons: [
+        { title: 'Creating Tables', type: 'lesson' },
+        { title: 'Data Types in SQLite', type: 'lesson' },
+        { title: 'Common Data Types', type: 'lesson' },
+        { title: 'More on Numeric Types', type: 'lesson' },
+        { title: 'Temporal Data Types', type: 'lesson' },
+        { title: 'CHECK Constraints', type: 'lesson' },
+        { title: 'Primary Key Constraint', type: 'lesson' },
+        { title: 'Modifying Tables', type: 'lesson' },
+        { title: 'Dropping and Truncating', type: 'lesson' },
+        { title: 'Defining Tables Quiz', type: 'quiz' },
+        { title: 'Simple Table Creation', type: 'challenge' },
+        { title: 'Data Types Challenge', type: 'challenge' },
+        { title: 'Constraints Challenge', type: 'challenge' },
+        { title: 'Temporal Validation', type: 'challenge' },
+        { title: 'Sales Data Analysis', type: 'challenge' },
+        { title: 'Modifying Tables', type: 'challenge' },
+        { title: 'Removing Table Data', type: 'challenge' },
+      ],
+    },
+    {
+      icon: <GitMergeIcon className="h-6 w-6 text-yellow-500" />,
+      title: 'Multi-Table Queries',
+      description:
+        'Learn to work with multiple tables using JOINs and relationships.',
+      lessonCount: 7,
+      challengeCount: 10,
+      lessons: [
+        { title: 'More on Relational Data', type: 'lesson' },
+        { title: 'Relationships and Types', type: 'lesson' },
+        { title: 'JOINs in Queries', type: 'lesson' },
+        { title: 'Self Joins and Usecases', type: 'lesson' },
+        { title: 'Foreign Key Constraint', type: 'lesson' },
+        { title: 'Set Operator Queries', type: 'lesson' },
+        { title: 'Views and Virtual Tables', type: 'lesson' },
+        { title: 'Multi-Table Queries Quiz', type: 'quiz' },
+        { title: 'Inactive Customers', type: 'challenge' },
+        { title: 'Recent 3 Orders', type: 'challenge' },
+        { title: 'High Value Orders', type: 'challenge' },
+        { title: 'Specific Book Customers', type: 'challenge' },
+        { title: 'Referred Customers', type: 'challenge' },
+        { title: 'Readers Like You', type: 'challenge' },
+        { title: 'Same Price Books', type: 'challenge' },
+        { title: 'Multi-Section Authors', type: 'challenge' },
+        { title: 'Expensive Books', type: 'challenge' },
+        { title: 'Trending Tech Books', type: 'challenge' },
+      ],
+    },
+    {
+      icon: <WrenchIcon className="h-6 w-6 text-yellow-500" />,
+      title: 'Aggregate Functions',
+      description:
+        "Analyze and summarize data using SQL's powerful aggregation features.",
+      lessonCount: 4,
+      challengeCount: 10,
+      lessons: [
+        { title: 'What is Aggregation?', type: 'lesson' },
+        { title: 'Basic Aggregation', type: 'lesson' },
+        { title: 'Grouping Data', type: 'lesson' },
+        { title: 'Grouping and Filtering', type: 'lesson' },
+        { title: 'Aggregate Queries Quiz', type: 'quiz' },
+        { title: 'Book Sales Summary', type: 'challenge' },
+        { title: 'Category Insights', type: 'challenge' },
+        { title: 'Author Tier Analysis', type: 'challenge' },
+        { title: 'Author Book Stats', type: 'challenge' },
+        { title: 'Daily Sales Report', type: 'challenge' },
+        { title: 'Publisher Stats', type: 'challenge' },
+        { title: 'High Value Publishers', type: 'challenge' },
+        { title: 'Premium Authors', type: 'challenge' },
+        { title: 'Sales Analysis', type: 'challenge' },
+        { title: 'Employee Performance', type: 'challenge' },
+      ],
+    },
+    {
+      icon: <BarChartIcon className="h-6 w-6 text-yellow-500" />,
+      title: 'Scalar Functions',
+      description:
+        'Master built-in functions for data transformation and manipulation.',
+      lessonCount: 6,
+      challengeCount: 5,
+      lessons: [
+        { title: 'What are they?', type: 'lesson' },
+        { title: 'String Functions', type: 'lesson' },
+        { title: 'Numeric Functions', type: 'lesson' },
+        { title: 'Date Functions', type: 'lesson' },
+        { title: 'Conversion Functions', type: 'lesson' },
+        { title: 'Logical Functions', type: 'lesson' },
+        { title: 'Scalar Functions Quiz', type: 'quiz' },
+        { title: 'Customer Contact List', type: 'challenge' },
+        { title: 'Membership Duration', type: 'challenge' },
+        { title: 'Book Performance', type: 'challenge' },
+        { title: 'Book Categories', type: 'challenge' },
+        { title: 'Monthly Sales Analysis', type: 'challenge' },
+      ],
+    },
+    {
+      icon: <GitBranchIcon className="h-6 w-6 text-yellow-500" />,
+      title: 'Subqueries and CTEs',
+      description:
+        'Write complex queries using subqueries and common table expressions.',
+      lessonCount: 4,
+      challengeCount: 6,
+      lessons: [
+        { title: 'What are Subqueries?', type: 'lesson' },
+        { title: 'Correlated Subqueries', type: 'lesson' },
+        { title: 'Common Table Expressions', type: 'lesson' },
+        { title: 'Recursive CTEs', type: 'lesson' },
+        { title: 'Subqueries Quiz', type: 'quiz' },
+        { title: 'Books Above Average', type: 'challenge' },
+        { title: 'Latest Category Books', type: 'challenge' },
+        { title: 'Low Stock by Category', type: 'challenge' },
+        { title: 'Bestseller Rankings', type: 'challenge' },
+        { title: 'New Customer Analysis', type: 'challenge' },
+        { title: 'Daily Sales Report', type: 'challenge' },
+      ],
+    },
+    {
+      icon: <ArrowUpDownIcon className="h-6 w-6 text-yellow-500" />,
+      title: 'Window Functions',
+      description:
+        'Advanced analytics and calculations using window functions.',
+      lessonCount: 5,
+      challengeCount: 7,
+      lessons: [
+        { title: 'What are they?', type: 'lesson' },
+        { title: 'OVER and PARTITION BY', type: 'lesson' },
+        { title: 'Use of ORDER BY', type: 'lesson' },
+        { title: 'Ranking Functions', type: 'lesson' },
+        { title: 'Window Frames', type: 'lesson' },
+        { title: 'Window Functions Quiz', type: 'quiz' },
+        { title: 'Basic Sales Metrics', type: 'challenge' },
+        { title: 'Bestseller Comparison', type: 'challenge' },
+        { title: 'Author Category Sales', type: 'challenge' },
+        { title: 'Top Authors', type: 'challenge' },
+        { title: 'Price Tier Rankings', type: 'challenge' },
+        { title: 'Month-over-Month Sales', type: 'challenge' },
+        { title: 'Price Range Analysis', type: 'challenge' },
+      ],
+    },
+  ];
+
+  return (
+    <div className="relative flex flex-grow flex-col items-center bg-gradient-to-b from-zinc-900 to-zinc-950 px-4 pb-52 pt-3 text-zinc-400 md:px-10 md:pt-8">
+      <div className="flex w-full items-center justify-between">
+        <a
+          href="https://roadmap.sh"
+          target="_blank"
+          className="opacity-20 transition-opacity hover:opacity-100"
+        >
+          <RoadmapLogoIcon />
+        </a>
+        <AccountButton />
+      </div>
+      <div className="relative mt-7 max-w-4xl text-left md:mt-20 md:text-center">
+        <Spotlight className="left-[-170px] top-[-200px]" fill="#EAB308" />
+
+        <div className="inline-block rounded-full bg-yellow-500/10 px-4 py-1.5 text-base text-yellow-500 md:px-6 md:py-2 md:text-lg">
+          <span className="hidden sm:block">
+            Complete Course to Master Practical SQL
+          </span>
+          <span className="block sm:hidden">Complete SQL Course</span>
+        </div>
+
+        <h1 className="mt-5 text-4xl font-bold tracking-tight text-white md:mt-8 md:text-7xl">
+          Master SQL <span className="hidden min-[384px]:inline">Queries</span>
+          <div className="mt-2.5 bg-gradient-to-r from-yellow-500 to-yellow-300 bg-clip-text text-transparent md:text-6xl lg:text-7xl">
+            From Basic to Advanced
+          </div>
+        </h1>
+
+        <AuthorCredentials />
+        <p className="mx-auto my-5 max-w-2xl text-xl text-zinc-300 md:my-12 lg:text-2xl">
+          A structured course to master database querying - perfect for
+          developers, data analysts, and anyone working with data.
+        </p>
+
+        <div className="hidden flex-row items-center justify-center gap-5 md:flex">
+          <div className="flex flex-row items-center gap-2">
+            <ClipboardIcon className="size-6 text-yellow-600" />
+            <span>55+ Lessons</span>
+          </div>
+          <div className="flex flex-row items-center gap-2">
+            <FileQuestionIcon className="size-6 text-yellow-600" />
+            <span>100+ Challenges</span>
+          </div>
+          <div className="flex flex-row items-center gap-2">
+            <CodeIcon className="size-6 text-yellow-600" />
+            <span>Integrated IDE</span>
+          </div>
+          <div className="flex flex-row items-center gap-2">
+            <BrainIcon className="size-6 text-yellow-600" />
+            <span>AI Tutor</span>
+          </div>
+        </div>
+
+        <div className="mt-7 flex justify-start md:mt-12 md:justify-center">
+          <BuyButton variant="main" />
+        </div>
+      </div>
+
+      <ReviewsSection />
+
+      <PlatformDemo />
+
+      <AuthorQuoteMessage />
+
+      <SectionHeader
+        title="Not your average SQL course"
+        description="Built around a text-based interactive approach and packed with practical challenges, this comprehensive SQL bootcamp stands out with features that make it truly unique."
+        className="mt-16 md:mt-20"
+      />
+
+      <div className="mx-auto mt-6 w-full max-w-5xl md:mt-10">
+        <div className="grid grid-cols-1 gap-2 md:grid-cols-2 md:gap-4 lg:grid-cols-3">
+          <CourseFeature
+            title="Textual Course"
+            icon={Eye}
+            imgUrl="https://assets.roadmap.sh/guest/textual-course.png"
+            description="Unlike video-based courses where you have to learn at the pace of the instructor, this course is text-based, allowing you to learn at your own pace."
+          />
+          <CourseFeature
+            title="Coding Environment"
+            icon={CodeIcon}
+            imgUrl="https://assets.roadmap.sh/guest/coding-environment.png"
+            description="With the integrated IDE, you can practice your SQL queries in real-time, getting instant feedback on your results."
+          />
+          <CourseFeature
+            title="Practical Challenges"
+            icon={FileQuestionIcon}
+            imgUrl="https://assets.roadmap.sh/guest/coding-challenges.png"
+            description="The course is packed with practical challenges and quizzes, allowing you to test your knowledge and skills."
+          />
+          <CourseFeature
+            title="AI Instructor"
+            icon={BrainIcon}
+            description="Powerful AI tutor to help you with your queries, provide additional explanations and help if you get stuck."
+            imgUrl="https://assets.roadmap.sh/guest/ai-integration.png"
+          />
+          <CourseFeature
+            title="Take Notes"
+            icon={ClipboardIcon}
+            description="The course allows you to take notes, where you can write down your thoughts and ideas. You can visit them later to review your progress."
+            imgUrl="https://assets.roadmap.sh/guest/course-notes.png"
+          />
+          <CourseFeature
+            title="Completion Certificate"
+            icon={FileCheckIcon}
+            imgUrl="https://assets.roadmap.sh/guest/course-certificate.jpg"
+            description="The course provides a completion certificate, which you can share with your potential employers."
+          />
+        </div>
+      </div>
+
+      <div className="mt-7 w-full max-w-3xl text-left md:mt-9">
+        <p className="text-lg leading-normal md:text-xl">
+          Oh, and you get the{' '}
+          <span className="bg-gradient-to-r from-yellow-500 to-yellow-300 bg-clip-text text-transparent">
+            lifetime access
+          </span>{' '}
+          to the course including all the future updates. Also, there is a
+          certificate of completion which you can share with your potential
+          employers.
+        </p>
+      </div>
+
+      <SectionHeader
+        title="Course Overview"
+        description="This SQL programming class is designed to help you go from beginner to expert through hands-on practice with real-world scenarios, mastering everything from basic to complex queries."
+        className="mt-8 md:mt-24"
+      />
+
+      <div className="mt-8 w-full max-w-3xl space-y-4 md:mt-12">
+        {chapters.map((chapter, index) => (
+          <ChapterRow key={index} counter={index + 1} {...chapter} />
+        ))}
+      </div>
+
+      <SectionHeader
+        title="About the Author"
+        className="mt-12 md:mt-24"
+        description={
+          <div className="mt-2 flex flex-col gap-4 text-lg leading-[1.52] md:mt-4 md:gap-6 md:text-xl">
+            <p>
+              I am Kamran Ahmed, an engineering leader with over a decade of
+              experience in the tech industry. Throughout my career I have built
+              and scaled software systems, architected complex data systems, and
+              worked with large amounts of data to create efficient solutions.
+            </p>
+            <p>
+              I am also the creator of{' '}
+              <a
+                href="https://roadmap.sh"
+                target="_blank"
+                className="text-yellow-400"
+              >
+                roadmap.sh
+              </a>
+              , a platform trusted by millions of developers to guide their
+              learning journeys. I love to simplify complex topics and make
+              learning practical and accessible.
+            </p>
+            <p>
+              In this course, I will share everything I have learned about SQL
+              from the basics to advanced concepts in a way that is easy to
+              understand and apply. Whether you are just starting or looking to
+              sharpen your skills, you are in the right place.
+            </p>
+          </div>
+        }
+      />
+
+      <CourseAuthor />
+
+      <FAQSection />
+
+      <FloatingPurchase />
+    </div>
+  );
+}
diff --git a/src/components/SQLCourse/SectionHeader.tsx b/src/components/SQLCourse/SectionHeader.tsx
new file mode 100644
index 000000000..8f3c50e2d
--- /dev/null
+++ b/src/components/SQLCourse/SectionHeader.tsx
@@ -0,0 +1,29 @@
+import { cn } from '../../lib/classname';
+
+type SectionHeaderProps = {
+  title: string;
+  description: string | React.ReactNode;
+  className?: string;
+};
+
+export function SectionHeader(props: SectionHeaderProps) {
+  const { title, description, className } = props;
+
+  return (
+    <div className={cn('mx-auto w-full mt-24 max-w-3xl', className)}>
+      <div className="relative w-full">
+        <div className="flex items-center gap-6">
+          <div className="inline-flex items-center rounded-xl ">
+            <span className="text-2xl md:text-3xl font-medium text-zinc-200">{title}</span>
+          </div>
+          <div className="h-[1px] flex-grow bg-gradient-to-r from-yellow-500/20 to-transparent"></div>
+        </div>
+      </div>
+      {typeof description === 'string' ? (
+        <p className="mt-2 md:mt-5 text-lg md:text-xl text-zinc-400">{description}</p>
+      ) : (
+        description
+      )}
+    </div>
+  );
+}
diff --git a/src/components/SQLCourse/Spotlight.tsx b/src/components/SQLCourse/Spotlight.tsx
new file mode 100644
index 000000000..25be38bfc
--- /dev/null
+++ b/src/components/SQLCourse/Spotlight.tsx
@@ -0,0 +1,57 @@
+import { cn } from '../../lib/classname';
+
+type SpotlightProps = {
+  className?: string;
+  fill?: string;
+};
+
+export function Spotlight(props: SpotlightProps) {
+  const { className, fill } = props;
+
+  return (
+    <svg
+      className={cn(
+        'animate-spotlight pointer-events-none absolute z-[1] h-[169%] w-[238%] opacity-0 lg:w-[138%]',
+        className,
+      )}
+      xmlns="http://www.w3.org/2000/svg"
+      viewBox="0 0 3787 2842"
+      fill="none"
+    >
+      <g filter="url(#filter)">
+        <ellipse
+          cx="1924.71"
+          cy="273.501"
+          rx="1924.71"
+          ry="273.501"
+          transform="matrix(-0.822377 -0.568943 -0.568943 0.822377 3631.88 2291.09)"
+          fill={fill || 'white'}
+          fillOpacity="0.21"
+        ></ellipse>
+      </g>
+      <defs>
+        <filter
+          id="filter"
+          x="0.860352"
+          y="0.838989"
+          width="3785.16"
+          height="2840.26"
+          filterUnits="userSpaceOnUse"
+          colorInterpolationFilters="sRGB"
+        >
+          <feFlood floodOpacity="0" result="BackgroundImageFix"></feFlood>
+          <feBlend
+            mode="normal"
+            in="SourceGraphic"
+            in2="BackgroundImageFix"
+            result="shape"
+          ></feBlend>
+          <feGaussianBlur
+            stdDeviation="151"
+            result="effect1_foregroundBlur_1065_8"
+          ></feGaussianBlur>
+        </filter>
+      </defs>
+    </svg>
+  );
+}
diff --git a/src/components/ShareIcons/ShareIcons.astro b/src/components/ShareIcons/ShareIcons.astro
deleted file mode 100644
index 2fa224972..000000000
--- a/src/components/ShareIcons/ShareIcons.astro
+++ /dev/null
@@ -1,34 +0,0 @@
----
-import Icon from '../AstroIcon.astro';
-
-export interface Props {
-  pageUrl: string;
-  description: string;
-}
-
-const { pageUrl, description } = Astro.props;
-
-const twitterUrl = `https://twitter.com/intent/tweet?text=${description}&url=${pageUrl}`;
-const fbUrl = `https://www.facebook.com/sharer/sharer.php?quote=${description}&u=${pageUrl}`;
-const hnUrl = `https://news.ycombinator.com/submitlink?t=${description}&u=${pageUrl}`;
-const redditUrl = `https://www.reddit.com/submit?title=${description}&url=${pageUrl}`;
----
-
-<div class='absolute left-[-18px] top-[110px] h-full hidden' id='page-share-icons'>
-  <div class='flex sticky top-[100px] flex-col gap-1.5 items-center'>
-    <a href={twitterUrl} target='_blank' class='text-gray-500 hover:text-gray-700 mb-0.5'>
-      <Icon icon='twitter' />
-    </a>
-    <a href={fbUrl} target='_blank' class='text-gray-500 hover:text-gray-700'>
-      <Icon icon='facebook' />
-    </a>
-    <a href={hnUrl} target='_blank' class='text-gray-500 hover:text-gray-700'>
-      <Icon icon='hackernews' />
-    </a>
-    <a href={redditUrl} target='_blank' class='text-gray-500 hover:text-gray-700'>
-      <Icon icon='reddit' />
-    </a>
-  </div>
-</div>
-
-<script src='./sharer.js'></script>
diff --git a/src/components/ShareIcons/ShareIcons.tsx b/src/components/ShareIcons/ShareIcons.tsx
new file mode 100644
index 000000000..edf161df7
--- /dev/null
+++ b/src/components/ShareIcons/ShareIcons.tsx
@@ -0,0 +1,105 @@
+import { useEffect, useRef } from 'react';
+import { cn } from '../../lib/classname';
+import { FacebookIcon } from '../ReactIcons/FacebookIcon';
+import { HackerNewsIcon } from '../ReactIcons/HackerNewsIcon';
+import { RedditIcon } from '../ReactIcons/RedditIcon';
+import { TwitterIcon } from '../ReactIcons/TwitterIcon';
+
+type ShareIconsProps = {
+  resourceId: string;
+  resourceType: string;
+  pageUrl: string;
+  description: string;
+};
+
+export function ShareIcons(props: ShareIconsProps) {
+  const { pageUrl, description, resourceType, resourceId } = props;
+
+  const shareIconsRef = useRef<HTMLDivElement>(null);
+
+  const twitterUrl = `https://twitter.com/intent/tweet?text=${description}&url=${pageUrl}`;
+  const fbUrl = `https://www.facebook.com/sharer/sharer.php?quote=${description}&u=${pageUrl}`;
+  const hnUrl = `https://news.ycombinator.com/submitlink?t=${description}&u=${pageUrl}`;
+  const redditUrl = `https://www.reddit.com/submit?title=${description}&url=${pageUrl}`;
+
+  const icons = [
+    {
+      url: twitterUrl,
+      icon: (
+        <TwitterIcon
+          className="size-[24px] [&>path]:fill-[#E5E5E5]"
+          boxColor="currentColor"
+        />
+      ),
+    },
+    {
+      url: fbUrl,
+      icon: <FacebookIcon className="size-[26px]" />,
+    },
+    {
+      url: hnUrl,
+      icon: <HackerNewsIcon className="size-[26px]" />,
+    },
+    {
+      url: redditUrl,
+      icon: <RedditIcon className="size-[26px]" />,
+    },
+  ];
+
+  useEffect(() => {
+    const shareIcons = shareIconsRef.current;
+    if (!shareIcons) {
+      return;
+    }
+
+    const onScroll = () => {
+      if (window.scrollY < 100 || window.innerWidth < 1050) {
+        shareIcons.classList.add('hidden');
+        return null;
+      }
+
+      shareIcons.classList.remove('hidden');
+    };
+
+    onScroll();
+
+    window.addEventListener('scroll', onScroll);
+    return () => {
+      window.removeEventListener('scroll', onScroll);
+    };
+  }, []);
+
+  return (
+    <div
+      className="absolute left-[-18px] top-[110px] hidden h-full"
+      ref={shareIconsRef}
+    >
+      <div className="sticky top-[100px] flex flex-col items-center gap-1.5">
+        {icons.map((icon, index) => {
+          const host = new URL(icon.url).host;
+
+          return (
+            <a
+              key={index}
+              href={icon.url}
+              target="_blank"
+              className={cn(
+                'text-gray-500 hover:text-gray-700',
+                index === 0 && 'mt-0.5',
+              )}
+              onClick={() => {
+                window.fireEvent({
+                  category: 'RoadmapShareLink',
+                  action: `Share Roadmap / ${resourceType} / ${resourceId} / ${host}`,
+                  label: icon.url,
+                });
+              }}
+            >
+              {icon.icon}
+            </a>
+          );
+        })}
+      </div>
+    </div>
+  );
+}
diff --git a/src/components/ShareIcons/sharer.js b/src/components/ShareIcons/sharer.js
deleted file mode 100644
index 8bb12ca76..000000000
--- a/src/components/ShareIcons/sharer.js
+++ /dev/null
@@ -1,32 +0,0 @@
-export class Sharer {
-  constructor() {
-    this.init = this.init.bind(this);
-    this.onScroll = this.onScroll.bind(this);
-
-    this.shareIconsId = 'page-share-icons';
-  }
-
-  get shareIconsEl() {
-    return document.getElementById(this.shareIconsId);
-  }
-
-  onScroll() {
-    if (window.scrollY < 100 || window.innerWidth < 1050) {
-      this.shareIconsEl.classList.add('hidden');
-      return null;
-    }
-
-    this.shareIconsEl.classList.remove('hidden');
-  }
-
-  init() {
-    if (!this.shareIconsEl) {
-      return;
-    }
-
-    window.addEventListener('scroll', this.onScroll, { passive: true });
-  }
-}
-
-const sharer = new Sharer();
-sharer.init();
diff --git a/src/components/TeamProgress/MemberProgressModal.tsx b/src/components/TeamProgress/MemberProgressModal.tsx
index 09ff67389..87aa421a7 100644
--- a/src/components/TeamProgress/MemberProgressModal.tsx
+++ b/src/components/TeamProgress/MemberProgressModal.tsx
@@ -1,7 +1,8 @@
+import '../FrameRenderer/FrameRenderer.css';
+import '../EditorRoadmap/EditorRoadmapRenderer.css';
 import { useEffect, useRef, useState } from 'react';
 import { wireframeJSONToSVG } from 'roadmap-renderer';
 import { Spinner } from '../ReactIcons/Spinner';
-import '../FrameRenderer/FrameRenderer.css';
 import { useOutsideClick } from '../../hooks/use-outside-click';
 import { useKeydown } from '../../hooks/use-keydown';
 import type { TeamMember } from './TeamProgressPage';
@@ -18,6 +19,9 @@ import { pageProgressMessage } from '../../stores/page';
 import { MemberProgressModalHeader } from './MemberProgressModalHeader';
 import { replaceChildren } from '../../lib/dom.ts';
 import { XIcon } from 'lucide-react';
+import type { PageType } from '../CommandMenu/CommandMenu.tsx';
+import { renderFlowJSON } from '../../../editor/renderer/renderer.ts';
+import { getResourceMeta } from '../../lib/roadmap.ts';
 
 export type ProgressMapProps = {
   member: TeamMember;
@@ -56,6 +60,7 @@ export function MemberProgressModal(props: ProgressMapProps) {
     useState<MemberProgressResponse>();
   const [isLoading, setIsLoading] = useState(true);
   const toast = useToast();
+  const [renderer, setRenderer] = useState<PageType['renderer']>('balsamiq');
 
   let resourceJsonUrl = import.meta.env.DEV
     ? 'http://localhost:3000'
@@ -88,14 +93,25 @@ export function MemberProgressModal(props: ProgressMapProps) {
   }
 
   async function renderResource(jsonUrl: string) {
+    const page = await getResourceMeta(resourceType, resourceId);
+    if (!page) {
+      toast.error('Resource not found');
+      return;
+    }
+
+    const renderer = page.renderer || 'balsamiq';
+    setRenderer(renderer);
+
     const res = await fetch(jsonUrl, {});
     const json = await res.json();
-    const svg: SVGElement | null = await wireframeJSONToSVG(json, {
-      fontURL: '/fonts/balsamiq.woff2',
-    });
+    const svg =
+      renderer === 'editor'
+        ? await renderFlowJSON(json as any)
+        : await wireframeJSONToSVG(json, {
+            fontURL: '/fonts/balsamiq.woff2',
+          });
 
     replaceChildren(containerEl.current!, svg);
-    // containerEl.current?.replaceChildren(svg);
   }
 
   useKeydown('Escape', () => {
@@ -136,10 +152,10 @@ export function MemberProgressModal(props: ProgressMapProps) {
           skipped = [],
         } = memberProgress;
 
-        done.forEach((id: string) => renderTopicProgress(id, 'done'));
-        learning.forEach((id: string) => renderTopicProgress(id, 'learning'));
-        skipped.forEach((id: string) => renderTopicProgress(id, 'skipped'));
-        removed.forEach((id: string) => renderTopicProgress(id, 'removed'));
+        done.forEach((id) => renderTopicProgress(id, 'done'));
+        learning.forEach((id) => renderTopicProgress(id, 'learning'));
+        skipped.forEach((id) => renderTopicProgress(id, 'skipped'));
+        removed.forEach((id) => renderTopicProgress(id, 'removed'));
       })
       .catch((err) => {
         console.error(err);
@@ -262,7 +278,7 @@ export function MemberProgressModal(props: ProgressMapProps) {
   return (
     <div className="fixed left-0 right-0 top-0 z-[100] h-full items-center justify-center overflow-y-auto overflow-x-hidden overscroll-contain bg-black/50">
       <div
-        id={'customized-roadmap'}
+        id={renderer === 'editor' ? undefined : 'customized-roadmap'}
         className="relative mx-auto h-full w-full max-w-4xl p-4 md:h-auto"
       >
         <div
diff --git a/src/components/TeamProgress/TeamProgressPage.tsx b/src/components/TeamProgress/TeamProgressPage.tsx
index 78e8c7585..74784f959 100644
--- a/src/components/TeamProgress/TeamProgressPage.tsx
+++ b/src/components/TeamProgress/TeamProgressPage.tsx
@@ -1,16 +1,15 @@
+import { useStore } from '@nanostores/react';
 import { useEffect, useState } from 'react';
+import { useAuth } from '../../hooks/use-auth';
+import { useToast } from '../../hooks/use-toast';
+import { getUrlParams, setUrlParams } from '../../lib/browser';
 import { httpGet } from '../../lib/http';
 import { pageProgressMessage } from '../../stores/page';
-import { MemberProgressItem } from './MemberProgressItem';
-import { useToast } from '../../hooks/use-toast';
-import { useStore } from '@nanostores/react';
 import { $currentTeam } from '../../stores/team';
 import { GroupRoadmapItem } from './GroupRoadmapItem';
-import { getUrlParams, setUrlParams } from '../../lib/browser';
-import { useAuth } from '../../hooks/use-auth';
-import { MemberProgressModal } from './MemberProgressModal';
 import { MemberCustomProgressModal } from './MemberCustomProgressModal';
-import { canManageCurrentRoadmap } from '../../stores/roadmap.ts';
+import { MemberProgressItem } from './MemberProgressItem';
+import { MemberProgressModal } from './MemberProgressModal';
 
 export type UserProgress = {
   resourceTitle: string;
diff --git a/src/components/TopicDetail/TopicProgressButton.tsx b/src/components/TopicDetail/TopicProgressButton.tsx
index e1a2ba11a..8cd1866a6 100644
--- a/src/components/TopicDetail/TopicProgressButton.tsx
+++ b/src/components/TopicDetail/TopicProgressButton.tsx
@@ -108,7 +108,6 @@ export function TopicProgressButton(props: TopicProgressButtonProps) {
   useKeydown(
     'r',
     () => {
-      console.log(progress);
       if (progress === 'pending') {
         onClose();
         return;
diff --git a/src/components/UserProgress/UserProgressModal.tsx b/src/components/UserProgress/UserProgressModal.tsx
index e91bd34bb..6fd1eeba0 100644
--- a/src/components/UserProgress/UserProgressModal.tsx
+++ b/src/components/UserProgress/UserProgressModal.tsx
@@ -11,7 +11,6 @@ import { useAuth } from '../../hooks/use-auth';
 import { ModalLoader } from './ModalLoader.tsx';
 import { UserProgressModalHeader } from './UserProgressModalHeader';
 import { X } from 'lucide-react';
-import type { PageType } from '../CommandMenu/CommandMenu.tsx';
 import type { AllowedRoadmapRenderer } from '../../lib/roadmap.ts';
 import { renderFlowJSON } from '../../../editor/renderer/renderer.ts';
 
diff --git a/src/components/UserProgress/UserProgressModalHeader.tsx b/src/components/UserProgress/UserProgressModalHeader.tsx
index 84b9bf4fa..cb13530c6 100644
--- a/src/components/UserProgress/UserProgressModalHeader.tsx
+++ b/src/components/UserProgress/UserProgressModalHeader.tsx
@@ -13,10 +13,10 @@ export function UserProgressModalHeader(props: UserProgressModalHeaderProps) {
 
   const userProgressTotal = progress?.total || 0;
   const userDone = progress?.done?.length || 0;
+  const userSkipped = progress?.skipped?.length || 0;
   const progressPercentage =
-    Math.round((userDone / userProgressTotal) * 100) || 0;
+    Math.round(((userDone + userSkipped) / userProgressTotal) * 100) || 0;
   const userLearning = progress?.learning?.length || 0;
-  const userSkipped = progress?.skipped?.length || 0;
 
   return (
     <div className="p-4">
diff --git a/src/components/UserPublicProfile/UserProfileRoadmap.tsx b/src/components/UserPublicProfile/UserProfileRoadmap.tsx
index 0d42ba79d..5dfb69ab4 100644
--- a/src/components/UserPublicProfile/UserProfileRoadmap.tsx
+++ b/src/components/UserPublicProfile/UserProfileRoadmap.tsx
@@ -2,7 +2,7 @@ import type {
   GetUserProfileRoadmapResponse,
   GetPublicProfileResponse,
 } from '../../api/user';
-import { getPercentage } from '../../helper/number';
+import { getPercentage } from '../../lib/number';
 import { PrivateProfileBanner } from './PrivateProfileBanner';
 import { UserProfileRoadmapRenderer } from './UserProfileRoadmapRenderer';
 
diff --git a/src/components/UserPublicProfile/UserPublicProgressStats.tsx b/src/components/UserPublicProfile/UserPublicProgressStats.tsx
index 9b8fc85f5..c9eef634c 100644
--- a/src/components/UserPublicProfile/UserPublicProgressStats.tsx
+++ b/src/components/UserPublicProfile/UserPublicProgressStats.tsx
@@ -1,5 +1,5 @@
-import { getPercentage } from '../../helper/number';
 import { getRelativeTimeString } from '../../lib/date';
+import { getPercentage } from '../../lib/number';
 
 type UserPublicProgressStats = {
   resourceType: 'roadmap';
diff --git a/src/components/UserPublicProfile/UserPublicProgresses.tsx b/src/components/UserPublicProfile/UserPublicProgresses.tsx
index 1eac8e296..cb5fb2fb1 100644
--- a/src/components/UserPublicProfile/UserPublicProgresses.tsx
+++ b/src/components/UserPublicProfile/UserPublicProgresses.tsx
@@ -1,6 +1,5 @@
 import type { GetPublicProfileResponse } from '../../api/user';
-import { UserPublicProgressStats } from './UserPublicProgressStats';
-import { getPercentage } from '../../helper/number.ts';
+import { getPercentage } from '../../lib/number';
 
 type UserPublicProgressesProps = {
   userId: string;
@@ -73,15 +72,15 @@ export function UserPublicProgresses(props: UserPublicProgressesProps) {
                   target="_blank"
                   key={roadmap.id + counter}
                   href={`/${roadmap.id}?s=${userId}`}
-                  className="relative group border-gray-300 flex items-center justify-between rounded-md border bg-white px-3 py-2 text-left text-sm transition-all hover:border-gray-400 overflow-hidden"
+                  className="group relative flex items-center justify-between overflow-hidden rounded-md border border-gray-300 bg-white px-3 py-2 text-left text-sm transition-all hover:border-gray-400"
                 >
                   <span className="flex-grow truncate">{roadmap.title}</span>
                   <span className="text-xs text-gray-400">
-                    {parseInt(percentageDone, 10)}%
+                    {percentageDone}%
                   </span>
 
                   <span
-                    className="absolute transition-colors left-0 top-0 block h-full cursor-pointer rounded-tl-md bg-black/5 group-hover:bg-black/10"
+                    className="absolute left-0 top-0 block h-full cursor-pointer rounded-tl-md bg-black/5 transition-colors group-hover:bg-black/10"
                     style={{
                       width: `${percentageDone}%`,
                     }}
diff --git a/src/components/VideoListItem.astro b/src/components/VideoListItem.astro
deleted file mode 100644
index a95bf4905..000000000
--- a/src/components/VideoListItem.astro
+++ /dev/null
@@ -1,40 +0,0 @@
----
-import type { VideoFileType } from '../lib/video';
-
-export interface Props {
-  video: VideoFileType;
-}
-
-const { video } = Astro.props;
-const { frontmatter, id } = video;
----
-
-<a
-  class:list={[
-    'block no-underline py-2 group text-md items-center text-gray-600 hover:text-blue-600 flex justify-between border-b',
-  ]}
-  href={`/videos/${id}`}
->
-  <span class='group-hover:translate-x-2 transition-transform'>
-    {frontmatter.title}
-
-    {
-      frontmatter.isNew && (
-        <span class='bg-green-300 text-green-900 text-xs font-medium px-1.5 py-0.5 rounded-sm uppercase ml-1.5'>
-          New
-          <span class='hidden sm:inline'>
-            &middot;
-            {new Date(frontmatter.date).toLocaleString('default', {
-              month: 'long',
-            })}
-          </span>
-        </span>
-      )
-    }
-  </span>
-  <span class='capitalize text-gray-500 text-xs hidden sm:block'>
-    {frontmatter.duration}
-  </span>
-
-  <span class='text-gray-400 text-xs block sm:hidden'> &raquo;</span>
-</a>
diff --git a/src/components/VideoModal.tsx b/src/components/VideoModal.tsx
new file mode 100644
index 000000000..cfb99e427
--- /dev/null
+++ b/src/components/VideoModal.tsx
@@ -0,0 +1,28 @@
+import { Modal } from './Modal';
+
+type VideoModalProps = {
+  videoId: string;
+  onClose: () => void;
+};
+
+export function VideoModal(props: VideoModalProps) {
+  const { videoId, onClose } = props;
+
+  return (
+    <Modal
+      onClose={onClose}
+      wrapperClassName="w-[90vw] max-w-4xl h-auto"
+      bodyClassName="p-0 bg-black"
+      overlayClassName="items-start md:items-center"
+    >
+      <div className="relative w-full pt-[56.25%]">
+        <iframe
+          className="absolute inset-0 h-full w-full"
+          src={`https://www.youtube.com/embed/${videoId}?autoplay=1`}
+          allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
+          allowFullScreen
+        />
+      </div>
+    </Modal>
+  );
+} 
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/backend-performance.md b/src/data/best-practices/backend-performance/backend-performance.md
index a23cbff20..651f0908e 100644
--- a/src/data/best-practices/backend-performance/backend-performance.md
+++ b/src/data/best-practices/backend-performance/backend-performance.md
@@ -4,7 +4,7 @@ pdfUrl: '/pdfs/best-practices/backend-performance.pdf'
 order: 1
 briefTitle: 'Backend Performance'
 briefDescription: 'Backend Performance Best Practices'
-isNew: true
+isNew: false
 isUpcoming: false
 title: 'Backend Performance Best Practices'
 description: 'Detailed list of best practices to improve your backend performance'
diff --git a/src/data/changelogs/cloudflare-roadmap-new-dashboard.md b/src/data/changelogs/cloudflare-roadmap-new-dashboard.md
new file mode 100644
index 000000000..011a2dcda
--- /dev/null
+++ b/src/data/changelogs/cloudflare-roadmap-new-dashboard.md
@@ -0,0 +1,21 @@
+---
+title: 'Cloudflare and ASP.NET Roadmaps, New Dashboard'
+description: 'We just launched our first paid SQL course'
+images:
+  'New Dashboard': 'https://assets.roadmap.sh/guest/new-dashboard.png'
+  'Cloudflare Roadmap': 'https://assets.roadmap.sh/guest/cloudflare-roadmap.png'
+  'ASP.NET Roadmap Revised': 'https://assets.roadmap.sh/guest/aspnet-core-revision.png'
+seo:
+  title: 'Cloudflare and ASP.NET Roadmaps, New Dashboard'
+  description: ''
+date: 2025-02-21
+---
+
+We have launched a new Cloudflare roadmap, revised ASP.NET Core roadmap and introduced a new dashboard design.
+
+- Brand new [Cloudflare roadmap](https://roadmap.sh/cloudflare) to help you learn Cloudflare
+- [ASP.NET Core roadmap](https://roadmap.sh/aspnet-core) has been revised with new content
+- Fresh new dashboard design with improved navigation and performance
+- Bug fixes and performance improvements
+
+
diff --git a/src/data/changelogs/sql-course.md b/src/data/changelogs/sql-course.md
new file mode 100644
index 000000000..84d74fd63
--- /dev/null
+++ b/src/data/changelogs/sql-course.md
@@ -0,0 +1,19 @@
+---
+title: "Our first paid course about SQL is live"
+description: 'We just launched our first paid SQL course'
+images:
+  "SQL Course": "https://assets.roadmap.sh/guest/course-environment-87jg8.png"
+  "Course Creator Platform": "https://assets.roadmap.sh/guest/course-creator-platform.png"
+seo:
+  title: 'SQL Course is Live'
+  description: ''
+date: 2025-02-04
+---
+
+After months of work, I am excited to announce our [brand-new SQL course](/courses/sql) designed to help you master SQL with a hands-on, practical approach!
+
+For the past few months, we have been working on building a course platform that would not only help us deliver high-quality educational content but also sustain the development of roadmap.sh. This SQL course is our first step in that direction.
+
+The course has been designed with a focus on practical learning. Each topic is accompanied by hands-on exercises, real-world examples, and an integrated coding environment where you can practice what you learn. The AI integration provides personalized learning assistance, helping you grasp concepts better and faster.
+
+Check out the course at [roadmap.sh/courses/sql](https://roadmap.sh/courses/sql)
diff --git a/src/data/guides/ai-data-scientist-career-path.md b/src/data/guides/ai-data-scientist-career-path.md
new file mode 100644
index 000000000..350de73d0
--- /dev/null
+++ b/src/data/guides/ai-data-scientist-career-path.md
@@ -0,0 +1,198 @@
+---
+title: 'Is Data Science a Good Career? Advice From a Pro'
+description: 'Is data science a good career choice? Learn from a professional about the benefits, growth potential, and how to thrive in this exciting field.'
+authorId: fernando
+excludedBySlug: '/ai-data-scientist/career-path'
+seo:
+  title: 'Is Data Science a Good Career? Advice From a Pro'
+  description: 'Is data science a good career choice? Learn from a professional about the benefits, growth potential, and how to thrive in this exciting field.'
+  ogImageUrl: 'https://assets.roadmap.sh/guest/is-data-science-a-good-career-10j3j.jpg'
+isNew: true
+type: 'textual'
+date: 2025-01-28
+sitemap:
+  priority: 0.7
+  changefreq: 'weekly'
+tags:
+  - 'guide'
+  - 'textual-guide'
+  - 'guide-sitemap'
+---
+
+![Is data science a good career choice?](https://assets.roadmap.sh/guest/is-data-science-a-good-career-10j3j.jpg)
+
+Data science is one of the most talked-about career paths today, but is it the right fit for you? 
+
+With [data science](https://roadmap.sh/ai-data-scientist) at the intersection of technology, creativity, and impact, it can be a very appealing role. It definitely promises high and competitive salaries, and the chance to solve real-world problems. Who would say “no” to that?\!
+
+But is it the right fit for your skills and aspirations?
+
+In this guide, I’ll help you uncover the answer to that question by understanding the pros and cons of working as a data scientist. I’ll also look at what the data scientists’ salaries are like and the type of skills you’d need to have to succeed at the job.
+
+Now sit down, relax, and read carefully, because I’m about to help you answer the question of “Is data science a good career for me?”.
+
+## Pros of a Career in Data Science
+
+![Pros of a Career in Data Science](https://assets.roadmap.sh/guest/data-science-pros-4ub43.png)
+
+There are plenty of “pros” when it comes to picking data science as your career, but let’s take a closer look at the main ones.
+
+### High Demand and Job Security
+
+The demand for data scientists has grown exponentially over the past few years and shows no signs of slowing down. According to the [U.S. Bureau of Labor Statistics](https://www.bls.gov/ooh/math/data-scientists.htm), the data science job market is projected to grow by 36% from 2023 to 2033, far outpacing the average for other fields. 
+
+This surge is partly due to the “explosion” of artificial intelligence, particularly tools like ChatGPT, in recent years, which have amplified the need for skilled data scientists to handle complex machine learning models and big data analysis.
+
+### Competitive Salaries
+
+One of the most appealing aspects of data science positions is the average data scientist’s salary. Reports from Glassdoor and Indeed highlight that data scientists are among the highest-paid professionals in the technology sector. For example, the national average salary for a data scientist in the United States is approximately $120,000 annually, with experienced professionals earning significantly more.
+
+These salaries are a reflection of the reality: the high demand for [data science skills](https://roadmap.sh/ai-data-scientist/skills) and the technical expertise required for these roles are not easy to come by. What’s even more, companies in high-cost regions, such as Silicon Valley, New York City, and Seattle, tend to offer premium salaries to attract top talent.
+
+The financial rewards in this field are usually complemented by additional benefits such as opportunities for professional development like research, publishing, patent registration, etc. 
+
+### Intellectual Challenge and Learning Opportunities
+
+Data scientists work in a field that demands continuous learning and adaptation to emerging technologies. Their field is rooted in solving complex problems through a combination of technical knowledge, creativity, and critical thinking. In other words, they rarely have any time to get bored.
+
+What makes data science important and intellectually rewarding, is its ability to address real-world problems. Whether it's optimizing healthcare systems, enhancing customer experiences in retail, or predicting financial risks, data science applications have a tangible impact on people. 
+
+This makes data science a good career for individuals who are passionate about lifelong learning and intellectual stimulation. 
+
+### Versatility
+
+Data science is a good career choice for those who enjoy variety and flexibility. One of the unique aspects of a career in data science is its ability to reach across various industries and domains (I’m talking technology, healthcare, finance, e-commerce, and even entertainment to name a few). This means data scientists can apply their data science skills in almost any sector that generates or relies on data—which is virtually all industries today.
+
+## Cons of a Career in Data Science
+
+![Cons of a Career in Data Science](https://assets.roadmap.sh/guest/data-science-right-fit-x50z5.png)
+
+The data science job is not without its “cons”, after all, there is no “perfect” role out there. Let’s now review some of the potential challenges that come with the role.
+
+### Steep Learning Curve
+
+The steep learning curve in data science is one of the field’s defining characteristics. New data scientists have to develop a deep understanding of technical skills, including proficiency in programming languages like Python, R, and SQL, as well as tools for machine learning and data visualization.
+
+On top of the already complex subjects to master, data scientists need to find ways of staying current with the constant advancements in the field. This is not optional; it’s a necessity for anyone trying to achieve long-term success in data science. This constant evolution can feel overwhelming, especially for newcomers who are also learning foundational skills.
+
+Despite these challenges, the steep learning curve can be incredibly rewarding for those who are passionate about solving problems, making data-driven decisions, and contributing to impactful projects. 
+
+While it might sound harsh, it’s important to note that the dedication required to overcome these challenges often results in a fulfilling and (extremely) lucrative career in the world of data science.
+
+### High Expectations
+
+Data science positions come with high expectations from organizations. Data scientists usually have the huge responsibility of delivering actionable insights and ensuring these insights are both accurate and timely.
+
+One of the key challenges data science professionals face is managing the pressure to deliver results under tight deadlines (they’re always tight). Stakeholders often expect instant answers to complex problems, which can lead to unrealistic demands. 
+
+To succeed in such environments, skilled data scientists need strong communication skills to explain their findings and set realistic expectations with stakeholders. 
+
+### Potential Burnout
+
+The high demand for data science skills usually translates into heavy workloads and tight deadlines, particularly for data scientists working on high-stakes projects (working extra hours is also not an uncommon scenario). 
+
+Data scientists frequently juggle multiple complex responsibilities, such as modeling data, developing machine learning algorithms, and conducting statistical analysis—often within limited timeframes. 
+
+The intense focus required for these tasks, combined with overlapping priorities (and a small dose of poor project management), can lead to mental fatigue and stress.
+
+Work-life balance can also be a challenge for data scientists giving them another reason for burnout. Combine that with highly active industries, like finance and you have a very hard-to-balance combination. 
+
+To mitigate the risk of burnout, data scientists can try to prioritize setting boundaries, managing workloads effectively (when that’s an option), and advocating for clearer role definitions (better separation of concerns). 
+
+## Skills Required for a Data Science Career
+
+![Skills Required for a Data Science Career](https://assets.roadmap.sh/guest/data-science-skills-6i284.png)
+
+To develop a successful career in data science, not all of your [skills](https://roadmap.sh/ai-data-scientist/skills) need to be technical, you also have to look at soft skills, and domain knowledge and to have a mentality of lifelong learning.
+
+Let’s take a closer look.
+
+### Technical Skills
+
+The field of data requires strong foundational technical skills. At the core of these skills is proficiency in programming languages such as Python, R, and SQL. Python is particularly useful and liked for its versatility and extensive libraries, while SQL is essential for querying and managing database systems. R remains a popular choice for statistical analysis and data visualization.
+
+In terms of frameworks, look into TensorFlow, PyTorch, or Scikit-learn. They’re all crucial for building predictive models and implementing artificial intelligence solutions. Tools like Tableau, Power BI, and Matplotlib are fantastic for creating clear and effective data visualizations, which play a significant role in presenting actionable insights.
+
+### Soft Skills
+
+As I said before, it’s not all about technical skills. Data scientists must develop their soft skills, this is key in the field. 
+
+From problem-solving and analytical thinking to developing your communication skills and your ability to collaborate with others. They all work together to help you communicate complex insights and results to other, non-technical stakeholders, which is going to be a key activity in your day-to-day life.
+
+### Domain Knowledge
+
+While technical and soft skills are essential, domain knowledge often distinguishes exceptional data scientists from the rest. Understanding industry-specific contexts—such as healthcare regulations, financial market trends, or retail customer behavior—enables data scientists to deliver tailored insights that directly address business needs. If you understand your problem space, you understand the needs of your client and the data you’re dealing with. 
+
+Getting that domain knowledge often involves on-the-job experience, targeted research, or additional certifications. 
+
+### Lifelong Learning
+
+Finally, if you’re going to be a data scientist, you’ll need to embrace a mindset of continuous learning. The field evolves rapidly, with emerging technologies, tools, and methodologies reshaping best practices. Staying competitive requires consistent professional development through online courses, certifications, conferences, and engagement with the broader data science community. 
+
+Lifelong learning is not just a necessity but also an opportunity to remain excited and engaged in a dynamic and rewarding career.
+
+## How to determine if data science is right for you?
+
+![Is data science right for you?](https://assets.roadmap.sh/guest/data-science-right-fit-x50z5.png)
+
+How can you tell if you’ll actually enjoy working as a data scientist? Even after reading this far, you might still have some doubts. So in this section, I’m going to look at some ways in which you can validate that you’ll enjoy the job of a data scientist before you go through the process of becoming one.
+
+### Self-Assessment Questions
+
+Figuring out whether data science is the right career path starts with introspection. Ask yourself the following:
+
+* Do you enjoy working with numbers and solving complex problems?  
+* Are you comfortable learning and applying programming skills like Python and SQL?  
+* Are you excited by the idea of using algorithms to create data-driven insights and actionable recommendations?  
+* Are you willing to commit to continuous learning in a fast-evolving field?
+
+Take your time while you think about these questions. You don’t even need a full answer, just try to understand how you feel about the idea of each one. If you don’t feel like saying “yes”, then chances are, this might not be the right path for you (and that’s completely fine\!).
+
+### Start with Small Projects
+
+If self-assessment is not your thing, another great way to explore your interest in data science is to dive into small, manageable projects. Platforms like Kaggle offer competitions and publicly available data sets, allowing you to practice exploratory data analysis, data visualization, and predictive modeling. Working on these projects can help you build a portfolio, develop confidence in your skills, and validate that you effectively like working this way.
+
+Online courses and certifications in data analytics, machine learning, and programming languages provide a structured way to build foundational knowledge. Resources like Coursera, edX, and DataCamp offer beginner-friendly paths to learning data science fundamentals. 
+
+### Network and Seek Mentorship
+
+Another great way to understand if you would like to be a data scientist, is to ask other data scientists. It might sound basic, but it’s a very powerful way because you’ll get insights about the field from the source.
+
+Networking, while not easy for everyone, is a key component of entering the data science field. Go to data science meetups, webinars, or conferences to expand your network and stay updated on emerging trends and technologies.
+
+If you’re not into big groups, try seeking mentorship from data scientists already working in the field. This can accelerate your learning curve. Mentors can offer guidance on career planning, project selection, and skill development.
+
+## Alternative career paths to consider
+
+![Alternative career paths to consider](https://assets.roadmap.sh/guest/data-science-alternatives-l7rtz.png)
+
+Not everyone who is interested in data science wants to pursue the full spectrum of technical skills or the specific responsibilities of a data scientist. Lucky for you, there are several related career paths that can still scratch your itch for fun and interesting challenges while working within the data ecosystem.
+
+### Data-Adjacent Roles
+
+* **Data Analyst**: If you enjoy working with data but prefer focusing on interpreting and visualizing it to inform business decisions, a data analyst role might be for you. Data analysts primarily work on identifying trends and providing actionable recommendations without diving deeply into machine learning or predictive modeling.  
+* **Data Engineer**: If you’re more inclined toward building the infrastructure that makes data science possible, consider becoming a data engineer. These data professionals design, build, and maintain data pipelines, ensuring the accessibility and reliability of large data sets for analysis. The role requires expertise in database systems, data structures, and programming.
+
+### Related Fields
+
+* **Software Engineering**: For those who enjoy coding and software development but want to remain close to data-related projects, software engineering offers opportunities to build tools, applications, and systems that support data analysis and visualization.  
+* **Cybersecurity**: With the increasing emphasis on data privacy and security, cybersecurity professionals play a critical role in protecting sensitive information. This field combines technical knowledge with policy enforcement, making it appealing to those interested in data protection and regulatory compliance.
+
+### Non-Technical Roles in the Data Ecosystem
+
+* **Data Governance**: If instead of transforming data and getting insights, you’d like to focus more on how the data is governed (accessed, controlled, cataloged, etc), then this might be the role for you. This role is essential for ensuring that an organization’s data assets are used effectively and responsibly.  
+* **Data Privacy Office**: In a similar vein to a data governance officer, the data privacy officer cares for the actual privacy of the data. With the rise of AI, data is more relevant than ever, and controlling that you comply with regulations like GDPR and CCPA, is critical for organizations. This role focuses on data privacy strategies, audits, and risk management, making it an excellent fit for those interested in the legal and ethical aspects of data.
+
+## Next steps
+
+![Next steps](https://assets.roadmap.sh/guest/data-science-next-steps-o539b.png)
+
+Data science is a promising career path offering high demand, competitive salaries, and multiple opportunities across various industries. Its ability to address real-world problems, combined with the intellectual challenge it presents, makes it an attractive choice for many. However, it also makes it a very difficult and taxing profession for those who don’t enjoy this type of challenge. 
+
+There are many potential next steps for you to take and answer the question of “Is data science a good career?”. 
+
+For example, you can reflect on your interests and strengths. Ask yourself whether or not you enjoy problem-solving, working with data sets, and learning new technologies. Use this reflection to determine if data science aligns with your career goals.
+
+You can also consume resources like the [AI/Data Scientist roadmap](https://roadmap.sh/ai-data-scientist) and the [Data Analyst roadmap](https://roadmap.sh/data-analyst), as they offer a clear progression for developing essential skills, so check them out. These tools can help you identify which areas to focus on based on your current expertise and interests.
+
+In the end, just remember: data science is rapidly evolving so make sure to stay engaged by reading research papers, following industry blogs, or attending conferences. Anything you can do will help, just figure out what works for you and keep doing it. 
diff --git a/src/data/guides/ai-data-scientist-lifecycle.md b/src/data/guides/ai-data-scientist-lifecycle.md
new file mode 100644
index 000000000..9414ddf32
--- /dev/null
+++ b/src/data/guides/ai-data-scientist-lifecycle.md
@@ -0,0 +1,200 @@
+---
+title: "Data Science Lifecycle 101: A Beginners' Ultimate Guide"
+description: 'Discover the Data Science Lifecycle step-by-step: Learn key phases, tools, and techniques in this beginner-friendly guide.'
+authorId: fernando
+excludedBySlug: '/ai-data-scientist/career-path'
+seo:
+  title: "Data Science Lifecycle 101: A Beginners' Ultimate Guide"
+  description: 'Discover the Data Science Lifecycle step-by-step: Learn key phases, tools, and techniques in this beginner-friendly guide.'
+  ogImageUrl: 'https://assets.roadmap.sh/guest/data-science-lifecycle-eib3s.jpg'
+isNew: false
+type: 'textual'
+date: 2025-01-29
+sitemap:
+  priority: 0.7
+  changefreq: 'weekly'
+tags:
+  - 'guide'
+  - 'textual-guide'
+  - 'guide-sitemap'
+---
+
+![Data science lifecycle 101](https://assets.roadmap.sh/guest/data-science-lifecycle-eib3s.jpg)
+
+Developing a data science project, from beginning to production is not a trivial task. It involves so many steps and so many complex tasks, that without some guardrails, releasing to production becomes ten times harder.
+
+Here’s where the data science lifecycle comes into play. It brings a structured approach so that [data scientists](https://roadmap.sh/ai-data-scientist), data analysts, and others can move forward together from raw data to actionable insights.
+
+In this guide, we’ll cover everything you need to know about the data science lifecycle, its many variants, and how to pick the right one for your project.
+
+So let’s get going\!
+
+## Core Concepts of a Lifecycle
+
+![Core concepts of a data science lifecycle](https://assets.roadmap.sh/guest/core-concepts-bn8g0.png)
+
+To fully understand the concept of the lifecycle, we have to look at the core concepts inside this framework, and how they contribute to the delivery of a successful data science project.
+
+### Problem Definition
+
+Every data science project begins with a clear definition of the problem to be solved. This involves collaborating with key stakeholders to identify objectives and desired outcomes. Data scientists must understand the context and scope of the project to ensure that the goals align with business or research needs.
+
+### Data Collection
+
+In the data collection phase, data scientists and data engineers work together and gather relevant data from diverse data sources. This includes both structured and unstructured data, such as historical records, new data, or data streams. 
+
+The process ensures the integration of all pertinent data, creating a robust dataset for the following stages. Data acquisition tools and strategies play a critical role in this phase.
+
+### Data Preparation
+
+This stage addresses the quality of raw data by cleaning and organizing it for analysis. Tasks such as treating inaccurate data, handling missing values, and converting raw data into usable formats are central to this stage. This stage prepares the data for further and more detailed analysis. 
+
+### Exploratory Data Analysis (EDA)
+
+The exploratory data analysis stage is where the “data processing” happens. This stage focuses on uncovering patterns, trends, and relationships within the data. Through data visualization techniques such as bar graphs and statistical models, data scientists perform a thorough data analysis and gain insights into the data’s structure and characteristics. 
+
+Like every stage so far, this one lays the foundation for the upcoming stages. In this particular case, after performing a detailed EDA, data scientists have a much better understanding of the data they have to work with, and a pretty good idea of what they can do with it now.
+
+### Model Building and Evaluation
+
+The model building phase involves developing predictive or machine learning models tailored to the defined problem. Data scientists experiment with various machine learning algorithms and statistical models to determine the best approach. Here’s where data modeling happens, bridging the insights gained during the exploratory data analysis (EDA) phase with actionable predictions and outcomes used in the deployment phase.
+
+Model evaluation follows, where the performance and accuracy of these models are tested to ensure reliability.
+
+### Deployment and Monitoring
+
+The final stage of this generic data science lifecycle involves deploying the model into a production environment. Here, data scientists, machine learning engineers, and quality assurance teams ensure that the model operates effectively within existing software systems. 
+
+After this stage, continuous monitoring and maintenance are essential to address new data or changing conditions, which can impact the performance and accuracy of the model.
+
+## Exploring 6 Popular Lifecycle Variants
+
+![6 popular data science lifecycles](https://assets.roadmap.sh/guest/alternative-lifecycles-wdvp1.png)
+
+The data science lifecycle offers various frameworks tailored to specific needs and contexts. Below, we explore six prominent variants:
+
+### CRISP-DM (Cross Industry Standard Process for Data Mining)
+
+CRISP-DM is one of the most widely used frameworks in data science projects, especially within business contexts. 
+
+It organizes the lifecycle into six stages: Business Understanding, Data Understanding, Data Preparation, Modeling, Evaluation, and Deployment. 
+
+This iterative approach allows teams to revisit and refine previous steps as new insights emerge. CRISP-DM is ideal for projects where aligning technical efforts with business goals is very important.
+
+**Example use case**: A retail company wants to improve customer segmentation for targeted marketing campaigns. Using CRISP-DM, the team starts with business understanding to define segmentation goals, gathers transaction and demographic data, prepares and cleans it, builds clustering models, evaluates their performance, and deploys the best model to group customers for personalized offers.
+
+### KDD (Knowledge Discovery in Databases)
+
+The KDD process focuses on extracting useful knowledge from large datasets. Its stages include Selection, Preprocessing, Transformation, Data Mining, and Interpretation/Evaluation. 
+
+KDD emphasizes the academic and research-oriented aspects of data science, making it an ideal choice for experimental or exploratory projects in scientific domains. It offers a systematic approach to discovering patterns and insights in complex datasets.
+
+**Example use case:** A research institute analyzes satellite data to study climate patterns. They follow KDD by selecting relevant datasets, preprocessing to remove noise, transforming data to highlight seasonal trends, applying data mining techniques to identify long-term climate changes, and interpreting results to publish findings.
+
+### Data Analytics Lifecycle
+
+This specific data science lifecycle is tailored for enterprise-level projects that prioritize actionable insights. It’s composed of six stages: Discovery, Data Preparation, Model Planning, Model Building, Communicating Results, and Operationalizing. 
+
+The framework’s strengths lie in its alignment with business objectives and readiness for model deployment, making it ideal for organizations seeking to integrate data-driven solutions into their operations.
+
+**Example use case:** A financial institution uses the Data Analytics Lifecycle to detect fraudulent transactions. They discover patterns in historical transaction data, prepare it by cleaning and normalizing, plan predictive models, build and test them, communicate results to fraud prevention teams, and operationalize the model to monitor real-time transactions.
+
+### SEMMA (Sample, Explore, Modify, Model, Assess)
+
+SEMMA is a straightforward and tool-centric framework developed by SAS. It focuses on sampling data, exploring it for patterns, modifying it for analysis, modeling it for predictions, and assessing the outcomes. 
+
+This lifecycle is particularly useful for workflows involving specific analytics tools. Its simplicity and strong emphasis on data exploration make it an excellent choice for teams prioritizing rapid insights.
+
+**Example use case:** A healthcare organization predicts patient readmission rates using SEMMA. They sample data from hospital records, explore patient histories for trends, modify features like patient age and diagnoses, build machine learning models, and assess their accuracy to choose the most effective predictor.
+
+### Team Data Science Process (TDSP)
+
+TDSP offers a collaborative and agile framework that organizes the lifecycle into four key stages: Business Understanding, Data Acquisition, Modeling, and Deployment. 
+
+Designed with team-based workflows in mind, TDSP emphasizes iterative progress and adaptability, ensuring that projects align with business needs while remaining flexible to changes. It’s well-suited for scenarios requiring close collaboration among data scientists, engineers, and stakeholders.
+
+**Example use case:** A logistics company improves delivery route optimization. Using TDSP, the team collaborates to understand business goals, acquires data from GPS and traffic systems, develops routing models, and deploys them to dynamically suggest the fastest delivery routes.
+
+### MLOps Lifecycle
+
+MLOps focuses specifically on machine learning operations and production environments. Its stages include Data Engineering, Model Development, Model Deployment, and Monitoring. 
+
+This lifecycle is essential for projects involving large-scale machine learning systems that demand high scalability and automation. 
+
+MLOps integrates seamlessly with continuous integration and delivery pipelines, ensuring that deployed models remain effective and relevant as new data is introduced.
+
+Each of these frameworks has its own strengths and is suited to different types of data science operations.
+
+**Example use case:** An e-commerce platform deploys a recommendation engine using MLOps. They engineer data pipelines from user activity logs, develop collaborative filtering models, deploy them on the website, and monitor their performance to retrain models when new user data is added.
+
+## How to Choose the Right Data Science Lifecycle
+
+![How to pick a data science lifecycle](https://assets.roadmap.sh/guest/how-to-pick-a-lifecycle-q9t3m.png)
+
+Determining the most suitable data science lifecycle for your data science project requires a systematic approach. After all, not all lifecycles are best suited for all situations.
+
+You can follow these steps to identify the framework that aligns best with your goals and resources:
+
+1. **Define your objectives:** Clearly identify the goals of your project. Are you solving a business problem, conducting academic research, or deploying a machine learning model? Understanding the end objective will narrow down your choices.  
+2. **Assess project complexity:** Evaluate the scope and intricacy of your project. Simple projects may benefit from streamlined frameworks like SEMMA, while complex projects with iterative requirements might need CRISP-DM or TDSP.  
+3. **Evaluate your team composition:** Consider the expertise within your team. A team with strong machine learning skills may benefit from MLOps, whereas a diverse team with varying levels of experience might prefer a more general framework like CRISP-DM.  
+4. **Analyze industry and domain requirements:** Different industries may have unique needs. For example, business-driven projects often align with the Data Analytics Lifecycle, while academic projects might find KDD more suitable.  
+5. **Examine available tools and resources:** Ensure that the tools, software, and infrastructure you have access to are compatible with your chosen lifecycle. Frameworks like SEMMA may require specific tools such as SAS.  
+6. **Match to key stakeholder needs:** Align the lifecycle with the expectations and requirements of stakeholders. A collaborative framework like TDSP can be ideal for projects needing frequent input and iteration with business partners.  
+7. **Run a trial phase:** If possible, test a smaller project or a subset of your current project with the selected framework. This will help you assess its effectiveness and make adjustments as needed.
+
+Follow these steps and you can identify the lifecycle that not only suits your project but also ensures that your data science process is efficient and productive. Each project is unique, so tailoring the lifecycle to its specific demands is critical to success.
+
+## Generic Framework for Beginners
+
+![Generic framework for beginners](https://assets.roadmap.sh/guest/basic-lifecycle-nlw8q.png)
+
+While there are many different data science lifecycles and ways to tackle data science projects, if you’re just getting started and you’re trying to push your first project into production, relying on a beginner-friendly lifecycle might be a better idea.
+
+A generic framework for beginners in data science simplifies the lifecycle into manageable steps, making it easier to understand and implement. You can follow these steps to define your new framework:
+
+### 1\. Define the problem
+
+![Define the problem](https://assets.roadmap.sh/guest/lifecycle-define-problem-6snat.png)
+
+Start by clearly identifying the problem you aim to solve. Consider the objectives and outcomes you want to achieve, and ensure these are aligned with the needs of any stakeholder. This will help focus your efforts during development and set the right expectations with your stakeholders.
+
+### 2\. Collect and clean data
+
+![Collect and clean data](https://assets.roadmap.sh/guest/lifecycle-collect-data-8k25a.png)
+
+Gather data from reliable and relevant sources. During this stage, focus on ensuring data quality by treating inaccurate data, filling in missing values, validating and removing potential data biases and finally, converting raw data into usable formats.
+
+### 3\. Analyze and visualize
+
+![Analyze and visualize](https://assets.roadmap.sh/guest/lifecycle-analize-visualize-v07ml.png)
+
+Explore the data to uncover patterns, trends, and insights. Use simple data visualization techniques such as bar graphs and scatter plots, along with basic statistical methods, to gain a deeper understanding of the dataset’s structure and variables.
+
+### 4\. Build and evaluate a model
+
+![Build and evaluate a model](https://assets.roadmap.sh/guest/lifecycle-build-models-0rn42.png)
+
+Develop a basic predictive model using accessible machine learning or statistical tools. Test the model’s performance to ensure it meets the objectives defined earlier during step 1\. For beginners, tools with user-friendly interfaces like Python libraries or Excel can be highly effective.
+
+### 5\. Share results and deploy
+
+![Share results and deploy](https://assets.roadmap.sh/guest/lifecycle-share-results-016nc.png)
+
+Present your findings to stakeholders in a clear and actionable format. If applicable, deploy the model into a small-scale production environment to observe its impact and gather feedback for further improvement.
+
+**Tips for small projects:** Start with a problem you’re familiar with, such as analyzing personal expenses or predicting simple outcomes. Focus on learning the process rather than achieving perfect results. Use open-source tools and resources to experiment and build your confidence.
+
+Use this framework if this is your first data science project, evaluate your results, and most importantly, reflect on your experience. 
+
+Take those insights into your next project and decide if for that one you would actually benefit from using one of the predefined standard lifecycles mentioned above.
+
+## Conclusion
+
+The data science lifecycle is a cornerstone of modern data science. By understanding its stages and principles, professionals can navigate the complexities of data science projects with confidence. 
+
+Regardless of what you’re doing, dealing with unstructured data, creating models, or deploying machine learning algorithms, the lifecycle provides a roadmap for success. 
+
+As data science experts and teams continue to explore and refine their approaches, the lifecycle framework remains a key tool for achieving excellence in any and all operations.
+
+Finally, remember that if you’re interested in developing your data science career, you have our [data scientist](https://roadmap.sh/ai-data-scientist) and [data analyst](https://roadmap.sh/data-analyst) roadmaps at your disposal. These roadmaps will help you focus your learning time on the really important and relevant topics.
\ No newline at end of file
diff --git a/src/data/guides/ai-data-scientist-skills.md b/src/data/guides/ai-data-scientist-skills.md
new file mode 100644
index 000000000..08a31dea5
--- /dev/null
+++ b/src/data/guides/ai-data-scientist-skills.md
@@ -0,0 +1,197 @@
+---
+title: 'Top 11 Data Sience Skills to Master in @currentYear@'
+description: 'Looking to excel in data science? Learn the must-have skills for @currentYear@ with our expert guide and advance your data science career.'
+authorId: fernando
+excludedBySlug: '/ai-data-scientist/skills'
+seo:
+  title: 'Top 11 Data Sience Skills to Master in @currentYear@'
+  description: 'Looking to excel in data science? Learn the must-have skills for @currentYear@ with our expert guide and advance your data science career.'
+  ogImageUrl: 'https://assets.roadmap.sh/guest/data-science-skills-to-master-q36qn.jpg'
+isNew: true
+type: 'textual'
+date: 2025-01-28
+sitemap:
+  priority: 0.7
+  changefreq: 'weekly'
+tags:
+  - 'guide'
+  - 'textual-guide'
+  - 'guide-sitemap'
+---
+
+![Top data science skills](https://assets.roadmap.sh/guest/data-science-skills-to-master-q36qn.jpg)
+
+Data science is becoming more relevant as a field and profession by the day. Part of this constant change is the mind-blowing speed at which AI is evolving these days. Every day a new model is released, every week a new product is built around it, and every month OpenAI releases an earth-shattering change that pushes the field even further than before.
+
+Data scientists sit at the core of that progress, but what does it take to master the profession?
+
+Mastering the essential data scientist skills goes beyond just solving complex problems. It includes the ability to handle data workflows, build machine learning models, and interpret data trends effectively. 
+
+In this guide, we'll explore the top 10 skills that future data scientists must work on to shine brighter than the rest in 2025, setting a foundation for long-term success.
+
+These are the data scientist skills covered in the article:
+
+* Programming proficiency with **Python, R, and SQL**  
+* Data manipulation and analysis, including **data wrangling** and **exploratory data analysis**  
+* Mastery of **machine learning** and **AI techniques**  
+* Strong statistical and **mathematical** **foundations**  
+* Familiarity with **big data technologies**  
+* Data engineering for infrastructure and **ETL pipelines**  
+* Expertise in **data visualization** with tools like **Plotly** and **D3.js**  
+* **Domain knowledge** for aligning data science projects with business goals  
+* **Soft skills** for communication, collaboration, and creativity  
+* **Feature engineering** and selection for **model optimization**.  
+* Staying current with trends like **MLOps** and **Generative AI.**
+
+## **Understanding Data Science**
+
+[Data science](https://roadmap.sh/ai-data-scientist) is an interdisciplinary field that combines multiple disciplines to make sense of data and drive actionable insights. It integrates programming, statistical analysis, and domain knowledge to uncover patterns and trends in both structured and unstructured data. This powerful combination enables data professionals to solve a variety of challenges, such as:
+
+* Building predictive models to forecast sales or identify customer churn.  
+* Developing optimization techniques to streamline supply chains or allocate resources more effectively.  
+* Leveraging automation and artificial intelligence to create personalized recommendations or detect fraudulent activity in massive datasets.
+
+At its core, data science empowers organizations to turn raw data into actionable insights. By interpreting data effectively and applying statistical models, data scientists support data-driven decision-making, ensuring businesses maintain a competitive edge. 
+
+The data science field requires a unique mix of technical skills, analytical prowess, and creativity to handle the vast array of complex data sets encountered in real-world scenarios. In other words, being a data scientist is not for everyone.
+
+**1\. Programming Proficiency**
+
+![Programming proficiency with Python, R and SQL](https://assets.roadmap.sh/guest/r-sql-python-qqm69.png)
+
+Programming remains a cornerstone of the data science field, forming the foundation for nearly every task in data science projects. Mastery of programming languages like Python, R, and SQL is crucial for aspiring data scientists to handle data workflows effectively.
+
+Python is the undisputed leader in data science, thanks to its extensive libraries and frameworks. Pandas, NumPy, and Scikit-learn are essential for tasks ranging from data wrangling and numerical analysis to building machine learning models. Deep learning tools such as TensorFlow and PyTorch make Python indispensable for tackling advanced challenges like developing artificial neural networks for image recognition and natural language processing (NLP).
+
+R excels in statistical analysis and visualization. Its specialized libraries, like ggplot2 for data visualization and caret for machine learning models, make it a preferred choice for academics and data analysis tasks that require interpreting data trends and creating statistical models.
+
+SQL is the backbone of database management, which is essential for extracting, querying, and preparing data from structured databases. A strong command of SQL allows data professionals to manage massive datasets efficiently and ensure smooth integration with analytical tools.
+
+## **2\. Data Manipulation and Analysis**
+
+![Data manipulation and wrangling](https://assets.roadmap.sh/guest/data-wrangling-zwd5i.png)
+
+The ability to manipulate and analyze data lies at the heart of data science skills. These tasks involve transforming raw data into a format suitable for analysis and extracting insights through statistical concepts and exploratory data analysis (EDA).
+
+Data wrangling is a critical skill for cleaning and preparing raw data, addressing missing values, and reshaping complex data sets. For example, consider a dataset containing customer transaction records with incomplete information. Using tools like Pandas in Python, a data scientist can identify missing values, impute or drop them as appropriate, and restructure the data to focus on specific variables like transaction frequency or total purchase amounts. This process ensures the dataset is ready for meaningful analysis.
+
+Tools like Pandas, PySpark, and Dask are invaluable for handling unstructured data or working with massive datasets efficiently. These tools allow data scientists to transform complex data sets into manageable and analyzable forms, which is foundational for building machine learning models or conducting advanced statistical analysis.
+
+Performing exploratory data analysis allows data scientists to identify patterns, correlations, and anomalies within structured data. Visualization libraries like Matplotlib and Seaborn, combined with Python scripts, play a significant role in understanding data insights before building predictive models or statistical models.
+
+**3\. Machine Learning and AI**
+
+![Machine learning and AI techniques](https://assets.roadmap.sh/guest/machine-learning-odmf1.png)
+
+Machine learning is a driving force in the data science industry, enabling data-driven decisions across sectors and revolutionizing how organizations interpret data and make predictions. Mastering machine learning algorithms and frameworks are among the top data science skills for aspiring data scientists who wish to excel in analyzing data and creating impactful solutions.
+
+Data scientists commonly tackle supervised learning tasks, such as predicting housing prices through regression models or identifying fraudulent transactions with classification algorithms. For example, using Scikit-learn, a data scientist can train a decision tree to categorize customer complaints into predefined categories for better issue resolution. Additionally, unsupervised techniques like clustering are applied in market segmentation to group customers based on purchasing patterns, helping businesses make data-driven decisions.
+
+Deep learning represents the cutting edge of artificial intelligence, utilizing artificial neural networks to manage unstructured data and solve highly complex problems. Frameworks like TensorFlow and PyTorch are essential tools for developing advanced solutions, such as NLP models for chatbot interactions or generative AI for creating realistic images. These tools empower data scientists to push the boundaries of innovation and unlock actionable insights from vast and complex datasets.
+
+## **4\. Statistical and Mathematical Foundations**
+
+![Statistical and mathematical foundations](https://assets.roadmap.sh/guest/statistical-analysis-bnkn3.png)
+
+Statistical concepts and mathematical skills form the backbone of building robust data models and interpreting data insights. These foundational skills are indispensable for anyone aiming to succeed in the data science field.
+
+Probability theory and hypothesis testing play a vital role in understanding uncertainty in data workflows. For instance, a data scientist might use hypothesis testing to evaluate whether a new marketing strategy leads to higher sales compared to the current approach, ensuring data-driven decision-making.
+
+Linear algebra and calculus are crucial for developing and optimizing machine learning algorithms. Techniques like matrix decomposition and gradient descent are used to train neural networks and enhance their predictive accuracy. These mathematical tools are the engine behind many advanced algorithms, making them essential data scientist skills.
+
+Advanced statistical analysis, including A/B testing and Bayesian inference, helps validate predictions and understand relationships within complex datasets. For example, A/B testing can determine which website design yields better user engagement, providing actionable insights to businesses.
+
+## **5\. Big Data Technologies**
+
+![Big data technologies](https://assets.roadmap.sh/guest/big-data-x0rmx.png)
+
+While big data skills are secondary for most data scientists, understanding big data technologies enhances their ability to handle massive datasets efficiently. Familiarity with tools like Apache Spark and Hadoop allows data scientists to process and analyze distributed data, which is especially important for projects involving millions of records. For example, Apache Spark can be used to calculate real-time metrics on user behavior across e-commerce platforms, enabling businesses to personalize experiences dynamically.
+
+Cloud computing skills, including proficiency with platforms like AWS or GCP, are also valuable for deploying machine learning projects at scale. A data scientist working with GCP's BigQuery can query massive datasets in seconds, facilitating faster insights for time-sensitive decisions. These technologies, while not the core of a data scientist's responsibilities, are crucial for ensuring scalability and efficiency in data workflows.
+
+## **6\. Data Engineering**
+
+![Data engineering](https://assets.roadmap.sh/guest/data-engineering-lqm7i.png)
+
+Data engineering complements data science by creating the infrastructure required to analyze data effectively. This skill set ensures that data flows seamlessly through pipelines, enabling analysis and decision-making.
+
+Designing ETL (Extract, Transform, Load) pipelines is a critical part of data engineering. For instance, a data engineer might create a pipeline to collect raw sales data from multiple sources, transform it by standardizing formats and handling missing values, and load it into a database for further analysis. These workflows are the backbone of data preparation.
+
+Using tools like Apache Airflow, those workflows can be streamlined, while managing real-time data streaming using Kafka ensures that real-time data—such as social media feeds or IoT sensor data—is processed without delay. For example, a Kafka pipeline could ingest weather data to update forecasts in real-time.
+
+Finally, storing and querying complex data sets in cloud computing with tools like Snowflake or BigQuery allows data scientists to interact with massive datasets effortlessly. 
+
+These platforms support scalable storage and high-performance queries, enabling faster analysis and actionable insights.
+
+## **7\. Data Visualization**
+
+![Data visualization techniques and tools](https://assets.roadmap.sh/guest/data-visualization-bkkel.png)
+
+Data visualization is a cornerstone of the data science field, as it enables data professionals to present data and communicate findings effectively. While traditional tools like Tableau and Power BI are widely used, aspiring data scientists should prioritize programming-based tools like Plotly and D3.js for greater flexibility and customization.
+
+For example, using Plotly, a data scientist can create an interactive dashboard to visualize customer purchase trends over time, allowing stakeholders to explore the data dynamically. Similarly, D3.js offers unparalleled control for designing custom visualizations, such as heatmaps or network graphs, that convey complex relationships in a visually compelling manner.
+
+Applying storytelling techniques further enhances the impact of visualizations. By weaving data insights into a narrative, data scientists can ensure their findings resonate with stakeholders and drive actionable decisions. For instance, a well-crafted story supported by visuals can explain how seasonal demand patterns affect inventory management, bridging the gap between technical analysis and strategic planning.
+
+## **8\. Business and Domain Knowledge**
+
+![Business and domain knowledge](https://assets.roadmap.sh/guest/business-and-domain-knowledge-5mnne.PNG)
+
+Domain knowledge enhances the relevance of data science projects by aligning them with organizational goals and addressing unique industry-specific challenges. Understanding the context in which data is applied allows data professionals to make their analysis more impactful and actionable.
+
+For example, in the finance industry, a data scientist with domain expertise can design predictive models that assess credit risk by analyzing complex data sets of customer transactions, income, and past credit behavior. These models enable financial institutions to make data-driven decisions about lending policies.
+
+In healthcare, domain knowledge allows data scientists to interpret medical data effectively, such as identifying trends in patient outcomes based on treatment history. By leveraging data models tailored to clinical needs, data professionals can help improve patient care and operational efficiency in hospitals.
+
+This alignment ensures that insights are not only technically robust but also directly applicable to solving real-world problems, making domain knowledge an indispensable skill for data professionals seeking to maximize their impact.
+
+## **9\. Soft Skills**
+
+![Soft skills for data scientists](https://assets.roadmap.sh/guest/soft-skills-3y4zs.png)
+
+Soft skills are as essential as technical skills in the data science field, bridging the gap between complex data analysis and practical implementation. These skills enhance a data scientist's ability to communicate findings, collaborate with diverse teams, and approach challenges with innovative solutions.
+
+**Communication** is critical for translating data insights into actionable strategies. For example, a data scientist might present the results of an exploratory data analysis to marketing executives, breaking down statistical models into simple, actionable insights that drive campaign strategies. The ability to clearly interpret data ensures that stakeholders understand and trust the findings.
+
+**Collaboration** is equally vital, as data science projects often involve cross-functional teams. For instance, a data scientist might work closely with software engineers to integrate machine learning models into a production environment or partner with domain experts to ensure that data-driven decisions align with business objectives. Effective teamwork ensures seamless data workflows and successful project outcomes.
+
+**Creativity** allows data scientists to find innovative ways to address complex problems. A creative data scientist might devise a novel approach to handling unstructured data, such as using natural language processing (NLP) techniques to extract insights from customer reviews, providing actionable insights that improve product development.
+
+These critical soft skills complement technical expertise, making data professionals indispensable contributors to their organizations.
+
+## 10\. Feature engineering and selection for model optimization
+
+![Feature engineering and selection](https://assets.roadmap.sh/guest/feature-engineering-1pit4.png)
+
+For machine learning models to interpret and use any type of data, that data needs to be turned into features. And that is where feature engineering and selection comes into play. These are two critical steps in the data science workflow because they directly influence the performance and accuracy of the models. If you think about it, the better the model understands what data to focus on, the better it'll perform.
+
+These processes involve creating, selecting, and transforming raw data into useful features loaded with meaning that help represent the underlying problem for the model.
+
+For example, imagine building a model to predict house prices. Raw data might include information like the size of the house in square meters, the number of rooms, and the year it was built. Through feature engineering, a data scientist could create new features, such as "price per square meter" or "age of the house," which make the data more informative for the model. These features can highlight trends that a model might otherwise miss.
+
+Feature selection, on the other hand, focuses on optimizing the use and dependency on features by identifying the most relevant ones and removing the redundant or irrelevant features. For example, let's consider a retail scenario where a model is predicting customer churn, here it might benefit from focusing on features like "purchase frequency" and "customer feedback sentiment", while ignoring less impactful ones like "the time of day purchases are made". This helps to avoid the model getting overwhelmed by noise, improving both its efficiency and accuracy.
+
+If you're looking to improve your data science game, then focusing on feature engineering and selection can definitely have that effect. 
+
+## 11\. Staying Current
+
+![Staying current with data science trends](https://assets.roadmap.sh/guest/stay-current-vnqqq.png)
+
+The data science field evolves at an unprecedented pace, driven by advancements in artificial intelligence, machine learning, and data technologies. Staying current with emerging trends is essential for maintaining a competitive edge and excelling in the industry.
+
+Joining **data science communities**, such as forums or online groups, provides a platform for exchanging ideas, discussing challenges, and learning from peers. For instance, platforms like Kaggle or GitHub allow aspiring data scientists to collaborate on data science projects and gain exposure to real-world applications.
+
+Attending **data science conferences** is another effective way to stay informed. Events like NeurIPS, Strata Data Conference, or PyData showcase cutting-edge research and practical case studies, offering insights into the latest advancements in machine learning models, big data technologies, and cloud computing tools.
+
+Engaging in **open-source projects** not only sharpens technical skills but also helps data professionals contribute to the broader data science community. For example, contributing to an open-source MLOps framework might provide invaluable experience in deploying and monitoring machine learning pipelines.
+
+Embracing trends like **MLOps** for operationalizing machine learning, **AutoML** for automating model selection, and **Generative AI** for creating synthetic data ensures that data scientists remain at the forefront of innovation. These emerging technologies are reshaping the data science field, making continuous learning a non-negotiable aspect of career growth.
+
+**Summary**
+
+Mastering these essential data scientist skills—from programming languages and machine learning skills to interpreting data insights and statistical models—will future-proof your [career path in data science](https://roadmap.sh/ai-data-scientist/career-path). These include the core skills of data manipulation, statistical analysis, and data visualization, all of which are central to the data science field.
+
+In addition, while big data technologies and data engineering skills are not the central focus of a data scientist's role, they serve as valuable, data science-adjacent competencies. Familiarity with big data tools like Apache Spark and cloud computing platforms can enhance scalability and efficiency in handling massive datasets, while data engineering knowledge helps create robust pipelines to support analysis. By building expertise in these areas and maintaining adaptability, you can excel in this dynamic, data-driven industry.
+
+Check out our [data science roadmap](https://roadmap.sh/ai-data-scientist) next to discover what your potential learning path could look like in this role.
+
diff --git a/src/data/guides/ai-data-scientist-tools.md b/src/data/guides/ai-data-scientist-tools.md
new file mode 100644
index 000000000..1e3759ab3
--- /dev/null
+++ b/src/data/guides/ai-data-scientist-tools.md
@@ -0,0 +1,313 @@
+---
+title: 'Data Science Tools: Our Top 11 Recommendations for @currentYear@'
+description: 'Master your data science projects with our top 11 tools for 2025! Discover the best platforms for data analysis, visualization, and machine learning.'
+authorId: fernando
+excludedBySlug: '/ai-data-scientist/tools'
+seo:
+  title: 'Data Science Tools: Our Top 11 Recommendations for @currentYear@'
+  description: 'Master your data science projects with our top 11 tools for 2025! Discover the best platforms for data analysis, visualization, and machine learning.'
+  ogImageUrl: 'https://assets.roadmap.sh/guest/data-science-tools-1a9w1.jpg'
+isNew: true
+type: 'textual'
+date: 2025-01-28
+sitemap:
+  priority: 0.7
+  changefreq: 'weekly'
+tags:
+  - 'guide'
+  - 'textual-guide'
+  - 'guide-sitemap'
+---
+
+![Top data science tools](https://assets.roadmap.sh/guest/data-science-tools-1a9w1.jpg)
+
+In case you haven't noticed, the data science industry is constantly evolving, potentially even faster than the web industry (which says a lot\!).
+
+And 2025 is shaping up to be another transformative year for tools and technologies. Whether you're exploring machine learning tools, predictive modeling, data management, or data visualization tools, there's an incredible array of software to enable [data scientists](https://roadmap.sh/ai-data-scientist) to analyze data efficiently, manage data effectively, and communicate insights. 
+
+In this article, we dive into the essential data science tools you need to know for 2025, complete with ratings and expert picks to help you navigate the options.
+
+## What is Data Science?
+
+Data science is an interdisciplinary field that combines mathematics, statistics, computer science, and domain expertise to extract meaningful insights from data. It involves collecting, cleaning, and analyzing large datasets to uncover patterns, trends, and actionable information. At its core, data science aims to solve complex problems through data-driven decision-making, using techniques such as machine learning, predictive modeling, and data visualization.
+
+The data science process typically involves:
+
+* **Data Collection**: Gathering data from various sources, such as databases, APIs, or real-time sensors.  
+* **Data Preparation**: Cleaning and transforming raw data into a usable format for analysis.  
+* **Exploratory Data Analysis (EDA):** Identifying trends, correlations, and outliers within the dataset.  
+* **Modeling**: Using algorithms and statistical methods to make predictions or classify data.  
+* **Interpretation and Communication**: Visualizing results and presenting insights to stakeholders in an understandable manner.
+
+Data science plays a key role in various industries, including healthcare, finance, marketing, and technology, driving innovation and efficiency by leveraging the power of data.
+
+## Criteria for Ratings
+
+We rated each of the best data science tools on a 5-star scale based on:
+
+* **Performance:** How efficiently the tool handles large and complex datasets. This includes speed, resource optimization, and reliability during computation.  
+* **Scalability:** The ability to scale across big data and multiple datasets. Tools were evaluated on their capability to maintain performance as data sizes grow.  
+* **Community and Ecosystem:** Availability of resources, support, and integrations. Tools with strong community support and extensive libraries received higher ratings.  
+* **Learning Curve:** Ease of adoption for new and experienced users. Tools with clear documentation and intuitive interfaces were rated more favorably.
+
+## Expert Recommendations![Expert Recommendations](https://assets.roadmap.sh/guest/data-science-expert-advice-4lanb.png)
+
+Picking the best tools for your project is never easy, and it's hard to make an objective decision if you don't have experience with any of them.
+
+So to make your life a bit easier, here's my personal recommendation, you can take it or leave it, it's up to you, but at least you'll know where to start:
+
+While each tool has its strengths, my favorite pick among them is **TensorFlow**. Its perfect scores in performance, scalability, and community support (you'll see them in a second in the table below), combined with its relatively moderate learning curve, make it an amazing choice for building advanced neural networks and developing predictive analytics systems.  You can do so much with it, like image recognition, natural language processing, and recommendation systems cementing its position as the leading choice (and my personal choice) in 2025\.
+
+Now, to help you understand and compare the rest of the tools from this guide, the table below summarizes their grades across key criteria: performance, scalability, community support, and learning curve. It also highlights the primary use cases for these tools.
+
+| Tool | Performance | Scalability | Community | Learning Curve | Best For |
+| ----- | ----- | ----- | ----- | ----- | ----- |
+| TensorFlow | 5 | 5 | 5 | 4 | Advanced neural networks, predictive analytics |
+| Apache Spark | 5 | 5 | 5 | 3 | Distributed analytics, real-time streaming |
+| Jupyter Notebooks | 4 | 4 | 5 | 5 | Exploratory analysis, education |
+| Julia | 4 | 4 | 4 | 3 | Simulations, statistical modeling |
+| NumPy | 4 | 3 | 5 | 5 | Numerical arrays, preprocessing workflows |
+| Polars | 5 | 4 | 4 | 4 | Data preprocessing, ETL acceleration |
+| Apache Arrow | 5 | 5 | 4 | 3 | Interoperability, streaming analytics |
+| Streamlit | 4 | 4 | 5 | 5 | Interactive dashboards, rapid deployment |
+| DuckDB | 4 | 4 | 4 | 5 | SQL queries, lightweight warehousing |
+| dbt | 4 | 4 | 5 | 4 | SQL transformations, pipeline automation |
+| Matplotlib | 4 | 3 | 5 | 4 | Advanced visualizations, publication graphics |
+
+Let's now deep dive into each of these tools to understand in more detail, why they're in this guide.
+
+## Data science tools for ML & Deep learning tools
+
+### TensorFlow
+
+![TensorFlow](https://assets.roadmap.sh/guest/data-science-tools-tensorflow-exdxy.png)
+
+TensorFlow remains one of the top data science tools for deep learning models and machine learning applications. Developed by Google, this open-source platform excels in building neural networks, predictive analytics, and natural language processing models. 
+
+* **Performance (★★★★★):** TensorFlow achieves top marks here due to its use of GPU and TPU acceleration, which allows seamless handling of extremely large models. Its ability to train complex networks without compromising on speed solidifies its high-performance ranking.  
+* **Scalability (★★★★★):** TensorFlow scales from single devices to distributed systems effortlessly, enabling use in both prototyping and full-scale production.  
+* **Community and Ecosystem (★★★★★):** With an active developer community and comprehensive support, TensorFlow offers unmatched resources and third-party integrations.  
+* **Learning Curve (★★★★):** While it offers immense power, mastering TensorFlow's advanced features requires time, making it slightly less accessible for beginners compared to simpler frameworks.
+
+**Strengths:** TensorFlow is a powerhouse for performance and scalability in the world of machine learning. Its GPU and TPU acceleration allow users to train and deploy complex models faster than many competitors. The massive community ensures constant innovation, with frequent updates, robust third-party integrations, and an ever-growing library of resources. The inclusion of TensorFlow Lite and TensorFlow.js makes it versatile for both edge computing and web applications.
+
+**Best For:** Developing advanced neural networks for image recognition, natural language processing pipelines, building recommendation systems, and creating robust predictive analytics tools for a wide array of industries.
+
+**Used by:** Google itself uses TensorFlow extensively for tasks like search algorithms, image recognition, and natural language processing. Similarly, Amazon employs TensorFlow to power recommendation systems and optimize demand forecasting.
+
+## Data science tools for big data processing
+
+### Apache Spark
+
+![Apache Spark](https://assets.roadmap.sh/guest/data-science-tools-spark-tjoqm.png)
+
+An Apache Software Foundation project, Apache Spark is a powerhouse for big data processing, enabling data scientists to perform batch processing and streaming data analysis. It supports a wide range of programming languages, including Python, Scala, and Java, and integrates well with other big data tools like Hadoop and Kafka.
+
+* **Performance (★★★★★):** Spark excels in processing speed thanks to its in-memory computing capabilities, making it a leader in real-time and batch data processing.  
+* **Scalability (★★★★★):** Designed for distributed systems, Spark handles petabytes of data with ease, maintaining efficiency across clusters.  
+* **Community and Ecosystem (★★★★★):** Spark's widespread adoption and integration with tools like Kafka and Hadoop make it a staple for big data workflows.  
+* **Learning Curve (★★★):** Beginners may find distributed computing concepts challenging, though excellent documentation helps mitigate this.
+
+**Strengths:** Spark stands out for its lightning-fast processing speed and flexibility. Its in-memory computation ensures minimal delays during large-scale batch or streaming tasks. The compatibility with multiple programming languages and big data tools enhances its integration into diverse tech stacks.
+
+**Best For:** Executing large-scale data analytics in distributed systems, real-time stream processing for IoT applications, running ETL pipelines, and data mining for insights in industries like finance and healthcare.
+
+**Used by:** Apache Spark has been adopted by companies like Uber and Shopify. Uber uses Spark for real-time analytics and stream processing, enabling efficient ride-sharing logistics. Shopify relies on Spark to process large volumes of e-commerce data, supporting advanced analytics and business intelligence workflows.
+
+## Exploratory & Collaborative tools
+
+### Jupyter Notebooks
+
+![Jupyter Notebooks](https://assets.roadmap.sh/guest/data-science-tools-jupyter-cgfv4.png)
+
+Jupyter Notebooks are an essential data science tool for creating interactive and shareable documents that combine code, visualizations, and narrative text. With support for over 40 programming languages, including Python, R, and Julia, Jupyter facilitates collaboration and exploratory data analysis. 
+
+* **Performance (★★★★):** Jupyter is designed for interactivity rather than computational intensity, which makes it highly effective for small to medium-scale projects but less suitable for high-performance tasks.  
+* **Scalability (★★★★):** While Jupyter itself isn't designed for massive datasets, its compatibility with scalable backends like Apache Spark ensures it remains relevant for larger projects.  
+* **Community and Ecosystem (★★★★★):** Jupyter's open-source nature and extensive community-driven extensions make it a powerhouse for versatility and support.  
+* **Learning Curve (★★★★★):** Its simple and intuitive interface makes it one of the most accessible tools for beginners and professionals alike
+
+**Strengths:** Jupyter's flexibility and ease of use make it indispensable for exploratory analysis and education. Its ability to integrate code, output, and explanatory text in a single interface fosters collaboration and transparency. 
+
+**Best For:** Creating educational tutorials, performing exploratory data analysis, prototyping machine learning models, and sharing reports that integrate code with rich visualizations.
+
+**Used by:** Jupyter Notebooks have become a staple for exploratory analysis and collaboration. Delivery Hero uses Jupyter to enhance delivery logistics through data analysis and visualization, while Intuit leverages the tool to facilitate financial data analysis in collaborative projects.
+
+## Data science tools for statistical computing
+
+### Julia
+
+![Julia](https://assets.roadmap.sh/guest/data-science-tools-julia-ctqlw.png)
+
+Julia is an emerging open-source programming language tailored for statistical computing and data manipulation. It combines the performance of low-level languages like C with the simplicity of high-level languages like Python. Julia's strengths lie in its speed for numerical computation and its dynamic type system, making it highly suitable for big data applications and machine learning models. The Julia ecosystem is rapidly growing, offering libraries for data visualization, optimization, and deep learning.
+
+* **Performance (★★★★):** Julia's design prioritizes speed for numerical and statistical computing, placing it ahead of many high-level languages in terms of raw performance.  
+* **Scalability (★★★★):** With built-in support for parallel computing, Julia scales well for tasks requiring significant computational power, although its ecosystem is still catching up to Python's.  
+* **Community and Ecosystem (★★★★):** Julia's growing community and the increasing availability of libraries make it a solid choice, though it's not yet as robust as more established ecosystems.  
+* **Learning Curve (★★★):** Julia's unique syntax, while designed for simplicity, presents a learning barrier for those transitioning from other languages like Python or R.
+
+**Strengths:** Julia's ability to execute complex numerical tasks at high speed positions it as a top contender in scientific computing. Its built-in support for parallelism allows it to scale efficiently, while its clear syntax lowers barriers for domain experts transitioning from MATLAB or R.
+
+**Best For:** Performing advanced statistical analysis, numerical optimization, developing simulations in physics and finance, and implementing machine learning models for high-performance environments.
+
+**Used by:** The high-performance capabilities of Julia make it a favorite for statistical computing in industries like finance. For example, Capital One uses Julia for risk analytics and modeling, and Aviva employs it to improve actuarial computations and financial modeling processes.
+
+### NumPy
+
+![NumPy](https://assets.roadmap.sh/guest/data-science-tools-numpy-nrbc7.png)
+
+A foundational library in the Python ecosystem, NumPy provides powerful tools for managing data structures, numerical computations, and statistical analysis. It is widely used for data preparation, enabling operations on large multi-dimensional arrays and matrices.
+
+* **Performance (★★★★):** NumPy's optimized C-based implementation allows it to handle numerical operations with high efficiency, but it relies on integration with other tools for larger or distributed workloads.  
+* **Scalability (★★★):** As a single-machine library, NumPy is best suited for datasets that fit in memory, though it integrates well with scalable tools like Dask for extended use.  
+* **Community and Ecosystem (★★★★★):** NumPy's foundational role in Python's data science ecosystem means extensive resources and near-universal compatibility.  
+* **Learning Curve (★★★★★):** Its straightforward API and clear documentation make NumPy an essential and approachable tool for data preparation and numerical computing.
+
+**Strengths:** NumPy's versatility and efficiency underpin its widespread adoption in the Python ecosystem. Its array manipulation capabilities—from slicing and reshaping to broadcasting—make it a cornerstone for numerical operations.
+
+**Best For:** Handling numerical arrays for preprocessing, matrix algebra in physics and engineering, foundational operations for machine learning pipelines, and performing basic statistical analysis efficiently.
+
+**Used by:** NumPy serves as the foundation for many Python-based workflows. Spotify uses NumPy for numerical computations within its recommendation algorithms, and Airbnb employs it to optimize pricing strategies and improve customer experience through data analysis.
+
+## **Data science tools for data manipulation & preprocessing tools**
+
+### Polars
+
+![Polars](https://assets.roadmap.sh/guest/data-science-tools-polaris-5u7yt.png)
+
+Polars is a lightning-fast data processing & manipulation library that enables data scientists to handle complex datasets. Unlike traditional libraries, Polars is written in Rust, offering exceptional performance and low memory usage. Its DataFrame API is intuitive and supports multi-threaded operations, making it a strong choice for large-scale data preprocessing and manipulation tasks.
+
+* **Performance** (★★★★★): Polars' Rust-based architecture ensures exceptional speed and memory efficiency, positioning it as a leading tool for high-performance data manipulation.  
+* **Scalability** (★★★★): While optimized for larger datasets, its scalability is limited to environments supported by multi-threading rather than distributed systems.  
+* **Community and Ecosystem** (★★★★): Though its ecosystem is still growing, Polars' strong integration with Python and intuitive API provide a solid foundation.  
+* **Learning Curve** (★★★★): With a user-friendly interface inspired by Pandas, Polars is easy to adopt for those familiar with similar tools, though Rust concepts may pose challenges for some.
+
+**Strengths:** Polars stands out due to its unparalleled speed, derived from its Rust-based architecture. Its ability to process data in parallel ensures efficiency even with large datasets, reducing bottlenecks in ETL pipelines. The intuitive API and support for lazy evaluation make it both user-friendly and powerful.
+
+**Best For:** Processing complex datasets for data cleaning, reshaping large-scale tables, and accelerating ETL pipelines in environments requiring high-speed operations.
+
+**Used by:** Polars is gaining traction for its exceptional speed in data preprocessing and ETL workflows. Zillow uses Polars for efficient data preprocessing in real estate market analysis, while Stripe adopts it to accelerate ETL processes for handling financial transaction data.
+
+### Apache Arrow
+
+![Apache Arrow](https://assets.roadmap.sh/guest/data-science-tools-apache-arrow-6d6mg.png)
+
+Apache Arrow is revolutionizing how data is stored and transferred for big data applications. Its in-memory columnar format accelerates data processing and integration between multiple datasets and tools. Apache Arrow also acts as a bridge between various programming languages and frameworks, improving the interoperability of data science workflows.
+
+* **Performance (★★★★★):** Apache Arrow's in-memory columnar format delivers unmatched speed for data processing and transfer between tools.  
+* **Scalability (★★★★★):** Its design supports seamless scalability across distributed systems, making it ideal for large-scale workflows.  
+* **Community and Ecosystem (★★★★):** Arrow's adoption by major data tools ensures growing support, though its standalone ecosystem remains limited compared to broader frameworks.  
+* **Learning Curve (★★★):** Understanding columnar data formats and workflows may require extra effort for beginners but pays off in advanced scenarios.
+
+**Strengths:** Apache Arrow's columnar format provides a significant boost in performance and compatibility. Its seamless interoperability between tools such as Pandas, Spark, and TensorFlow eliminates data transfer inefficiencies. The library also supports multi-language workflows, making it indispensable for teams leveraging diverse tech stacks.
+
+**Best For:** Ensuring efficient interoperability between data tools, accelerating data lake operations, and supporting real-time data analytics in distributed systems.
+
+**Used by:** Google BigQuery integrates Arrow to enhance data interchange and query performance, and AWS Athena relies on Arrow's in-memory format to facilitate faster query responses and real-time analytics.
+
+## Data science tools for application development
+
+### Streamlit
+
+![Streamlit](https://assets.roadmap.sh/guest/data-science-tools-streamlit-iq0sl.png)
+
+Streamlit is an open-source framework for creating custom data science applications and dashboards. It simplifies the process of building interactive apps by using Python scripts, making it accessible even for those with minimal web development experience. Streamlit's API enables rapid prototyping of machine learning tools and visualizations.
+
+* **Performance (★★★★):** Optimized for real-time application development, Streamlit is fast for small to medium-scale projects.  
+* **Scalability (★★★★):** Streamlit scales reasonably well but isn't designed for massive applications.  
+* **Community and Ecosystem (★★★★★):** Its active community and constant updates ensure excellent support for users.  
+* **Learning Curve (★★★★★):** With a simple API and Python-centric design, Streamlit is easy for both developers and non-developers.
+
+**Strengths:** Streamlit's simplicity and speed make it ideal for crafting interactive dashboards with minimal effort. Its integration with popular Python libraries like Pandas and Matplotlib allows users to transform raw data into meaningful insights quickly. 
+
+**Best For:** Creating interactive dashboards for sharing machine learning predictions, visualizing complex datasets with minimal development effort, and rapidly deploying prototypes for stakeholder feedback.
+
+**Used by:** Streamlit simplifies the creation of interactive dashboards and data applications. Companies like Snowflake use Streamlit to build client-facing data apps, while Octopus Energy employs it to create dashboards that visualize energy consumption data for their customers.
+
+### DuckDB
+
+![DuckDB](https://assets.roadmap.sh/guest/data-science-tools-duckdb-iv557.png)
+
+DuckDB is an open-source analytics database that simplifies structured queries on raw data. Designed to operate within analytical workflows, it supports SQL-based queries without the need for a dedicated database server. Its efficient storage model makes it ideal for querying structured and unstructured data in ad hoc analysis scenarios, making it highly favored for lightweight data warehousing tasks.
+
+* **Performance (★★★★):** DuckDB delivers impressive speeds for ad hoc analytics, optimized for single-machine workflows.  
+* **Scalability (★★★★):** Suitable for lightweight to medium-scale tasks, DuckDB integrates well into Python and R environments.  
+* **Community and Ecosystem (★★★★):** Growing adoption and strong SQL compatibility make it increasingly popular.  
+* **Learning Curve (★★★★★):** Its SQL-based interface ensures a smooth learning experience for most users.
+
+**Strengths:** DuckDB's efficiency and ease of use make it a go-to tool for analysts. Its ability to operate without infrastructure overhead allows rapid deployment, and its SQL compatibility ensures accessibility for non-programmers.
+
+**Best For:** Running interactive SQL queries in development workflows, performing data warehousing tasks without infrastructure overhead, and integrating ad hoc analyses directly into Python-based projects.
+
+**Used by:**  DuckDB's lightweight and efficient SQL analytics have found applications in various industries. MotherDuck integrates DuckDB to enable fast, in-process analytical queries, and SeMI Technologies leverages DuckDB within its Weaviate platform for high-speed vector search analytics.
+
+### dbt (Data Build Tool)
+
+![dbt](https://assets.roadmap.sh/guest/data-science-tools-dbt-cozps.png)
+
+dbt is a development framework for transforming data in warehouses. It allows analysts and engineers to write modular SQL-based transformations and manage data workflows efficiently. With its focus on collaboration and version control, dbt has become an essential tool for teams working on data pipelines.
+
+* **Performance (★★★★):** dbt's modular approach allows for efficient and scalable SQL transformations.  
+* **Scalability (★★★★):** Designed for modern data warehouses, dbt handles increasing workloads effectively.  
+* **Community and Ecosystem (★★★★★):** Its thriving community and vendor support make it indispensable for data pipeline management.  
+* **Learning Curve (★★★★):** Familiarity with SQL simplifies adoption, though pipeline concepts may require additional learning.
+
+**Strengths:** dbt's modularity and focus on collaboration streamline complex SQL transformations. Its integration with version control systems ensures reproducibility, while the ability to test and document transformations within the tool fosters better collaboration among data teams. 
+
+**Best For:** Automating SQL transformations for analytics, managing data warehouse workflows with version control, and creating reusable and modular pipelines for team collaboration.
+
+**Used by:** dbt has become essential for transforming and managing data workflows. JetBlue uses dbt to optimize their data warehouse for improved analytics, and GitLab adopts it to transform raw data into actionable insights, streamlining their analytics operations.
+
+## Data science tools for data visualization
+
+### Matplotlib
+
+![Matplotlib](https://assets.roadmap.sh/guest/data-science-tools-matplotlib-b8lpy.png)
+
+Matplotlib is a widely used data visualization library in Python that allows users to create static, animated, and interactive visualizations. Known for its flexibility, Matplotlib supports detailed customization, making it suitable for complex visualizations required in data science projects.
+
+* **Performance (★★★★):** Matplotlib handles visualization tasks efficiently for small to medium datasets but may lag with complex or large-scale rendering.  
+* **Scalability (★★★):** Designed for single-threaded use, it integrates with scalable tools for extended capabilities.  
+* **Community and Ecosystem (★★★★★):** A veteran library with vast resources and tutorials ensures comprehensive support.  
+* **Learning Curve (★★★★):** Accessible for beginners, though mastering advanced features takes effort.
+
+**Strengths:** Matplotlib's extensive customization options allow it to cater to diverse visualization needs, from simple plots to publication-grade graphics. Its compatibility with libraries like NumPy ensures seamless data integration, while the active community provides extensive tutorials and third-party tools. Despite being a veteran library, Matplotlib remains relevant by adapting to modern visualization demands.
+
+**Best For:** Creating publication-quality figures, animating time-series data, developing exploratory charts, and embedding visualizations into data-driven applications.
+
+**Used by:** NASA uses Matplotlib to plot and visualize space mission data, while CERN relies on it for visualizing complex results from particle physics experiments.
+
+## How to Pick the Right Data Science Tool?
+
+Choosing the right data science tool can be a daunting task given the vast array of options available. The best tool for your project will depend on several factors, which can be broadly categorized into the evaluation criteria and the context of your specific project.
+
+### Importance of Evaluation Criteria
+
+1. **Performance**: This determines how well the tool handles large and complex datasets. Tools that offer fast computation, reliable processing, and efficient use of resources are ideal for high-performance environments.  
+2. **Scalability**: As data grows, the ability to maintain consistent performance is critical. Tools that scale across big data frameworks or distributed systems ensure longevity and adaptability.  
+3. **Community and Ecosystem**: A strong community provides valuable resources such as tutorials, documentation, and support. An extensive ecosystem ensures compatibility with other tools and libraries, making integration seamless.  
+4. **Learning Curve**: A tool's usability can make or break its adoption. Tools with intuitive interfaces and comprehensive documentation enable faster onboarding for teams with diverse expertise.
+
+### Considering Project Context
+
+While evaluation criteria provide a standardized way to compare tools, the context of your project ultimately determines the best fit. Key considerations include:
+
+Tech Stack: The tools should integrate smoothly with your existing technologies and workflows.
+
+Team Expertise: The skill levels and experience of your team play a significant role in adoption. A tool with a steep learning curve may not be ideal for a team of beginners.
+
+Project Deadlines: Time constraints can affect the choice of tools. A tool with extensive setup requirements may not suit a project with tight deadlines.
+
+Data Complexity and Size: The nature and volume of your data should align with the tool's capabilities.
+
+By balancing these evaluation criteria with the unique needs of your project, you can ensure that the chosen tool maximizes efficiency and effectiveness while minimizing challenges.
+
+## Final Thoughts
+
+Data science is an exciting and ever-evolving field, and the tools we've explored here represent the state-of-the-art of innovation for 2025\. Each tool has its own strengths, from high performance and scalability to user-friendly interfaces and robust community support. Whether you're just starting out in data science or managing complex, large-scale projects, there's a tool out there that's just right for you.
+
+However, choosing that tool isn't just about star ratings or feature lists—it's about finding what works best for your specific context. 
+
+And remember, data science is as much about the journey as it is about the results. Exploring new tools, learning from community resources, and iterating on your processes will make you a better data scientist and help your projects thrive.
+
+Check out our [data scientist roadmap](https://roadmap.sh/ai-data-scientist) to get a full view of your potential journey ahead\!
\ No newline at end of file
diff --git a/src/data/guides/ai-data-scientist-vs-computer-science.md b/src/data/guides/ai-data-scientist-vs-computer-science.md
new file mode 100644
index 000000000..d956d095f
--- /dev/null
+++ b/src/data/guides/ai-data-scientist-vs-computer-science.md
@@ -0,0 +1,166 @@
+---
+title: 'Data Science vs. Computer Science: Which Path to Choose'
+description: 'Data science or computer science? Learn the tools, roles, and paths in each field to decide which fits your strengths and career goals.'
+authorId: ekene
+excludedBySlug: '/ai-data-scientist/vs-computer-science'
+seo:
+  title: 'Data Science vs. Computer Science: Which Path to Choose'
+  description: 'Data science or computer science? Learn the tools, roles, and paths in each field to decide which fits your strengths and career goals.'
+  ogImageUrl: 'https://assets.roadmap.sh/guest/data-science-vs-computer-science-rudoc.jpg'
+isNew: false
+type: 'textual'
+date: 2025-02-06
+sitemap:
+  priority: 0.7
+  changefreq: 'weekly'
+tags:
+  - 'guide'
+  - 'textual-guide'
+  - 'guide-sitemap'
+---
+
+![Data science vs computer science comparison?](https://assets.roadmap.sh/guest/data-science-vs-computer-science-rudoc.jpg)
+
+If you love uncovering patterns in data and using those insights to solve real-world problems, [data science](https://roadmap.sh/ai-data-scientist) might be the right fit for you. On the other hand, if you're drawn to creating systems, writing code, and building the tools that power today's technology, [computer science](https://roadmap.sh/computer-science) could be your path.
+
+From my experience working on projects in both fields, I've seen how they overlap and where they differ. As a data scientist, you'll focus on analyzing complex data using math, programming, and problem-solving skills. Your work might include building models to extract meaningful insights from data, enabling you to identify patterns, predict trends, detect fraud, or improve recommendations.
+
+Computer science, in contrast, focuses on understanding how computing systems work. You'll write code, design algorithms, and develop programs to solve problems. You might create web applications and software tools or even dive into artificial intelligence and cybersecurity.
+
+Although these fields overlap in areas like programming, they cater to different interests and career goals. In this guide, I'll walk you through what each field involves, the skills you need, and the opportunities they offer. By the end, you'll have the clarity to make an informed choice about your future based on which path suits you best.
+
+## Data science vs. computer science: What are the key differences?
+
+First, let's look at this table that summarizes the differences. Then, we'll discuss each one in more detail.
+
+| Characteristics               | Data science                                                               | Computer science                                                           |
+| ----------------------------- | -------------------------------------------------------------------------- | -------------------------------------------------------------------------- |
+| Primary focus                 | Extracting insights from data                                              | Building computer systems to perform tasks                                 |
+| Industries                    | Finance, healthcare, marketing, e-commerce                                 | cybersecurity, gaming, education                                           |
+| Career paths                  | Data analysts, data scientists, machine learning engineers, data engineers | Software engineers, computer scientists, cybersecurity analyst             |
+| Key areas and specializations | Machine learning, data mining, data visualization, statistical analysis    | Data structures, software development, artificial intelligence             |
+| Tools and technologies        | Python (Pandas, NumPy), R, SQL, TensorFlow                                 | Python, Java, C++, JavaScript, Git, Vs code, databases (MySQL and MongoDB) |
+| Educational background        | Mathematics, economics, computer science, data science, physics            | computer science, mathematics, electrical engineering                      |
+
+**Your primary focus**
+The big difference between data science and computer science is their primary focus. If you choose data science, your role will involve extracting insights and helpful information from datasets. You'll use different tools and techniques to interpret and analyze data. The aim is to help businesses make data-driven decisions. Netflix, for example, uses machine learning and data science to learn your viewing history. Data scientists then analyze data to predict what shows you'll like and suggest movies.
+
+In contrast, if you choose computer science, you'll focus on building computer systems to perform tasks. You'll create tools that make computers, web apps, data analysis, etc, work better. For example, a company like Google uses computer science to create algorithms that make search engines work. Computer scientists then create software systems and algorithms that will give you accurate results when you search online.
+
+**Your career path**
+Computer science and data science have very different career paths. As a data science professional, you'll use data to help make decisions and solve business problems. You'll work in various industries, like finance and healthcare, and take on roles such as:
+
+- **Data analyst**: Collect and analyze data to help businesses make intelligent decisions. For example, as a data analyst in healthcare, you would use data analysis to know which treatments work best for a specific illness.
+- **Data scientists**: Build predictive models to predict outcomes. As a data scientist in finance, you'll use data analysis to forecast how the stock market might go.
+- **Data engineers**: Build and maintain data systems that enable data analysis.
+- **Machine learning engineer**: Design and build machine learning models to solve everyday problems. As a machine learning engineer at a robotic car company, you'll create models to spot people, roads, traffic lights, and other cars. You'll be responsible for designing machine learning algorithms to help the car make fast decisions.
+
+![Data science vs. computer science: Career paths](https://assets.roadmap.sh/guest/career-paths-and-industries-for-data-science-and-computer-science-0tzlq.png)
+
+In contrast, as a computer science professional, you'll build the tools data engineers use to get work done. You'll also work in different industries, such as cybersecurity and gaming, and take on roles like:
+
+- **Software engineers**: Build and maintain software systems, including gaming platforms like Steam.
+- **Computer scientists:** Study computer systems' theoretical and practical aspects to create applications.
+- **Cybersecurity analyst**: Monitor and address possible security threats like data breaches.
+
+**Your key areas** **of** **specialization**
+Data science focuses on machine learning, data mining, statistical analysis, and more**.** As a data scientist, you'll use these specializations to understand trends and make better decisions.
+
+In contrast, computer science focuses on artificial intelligence, [data structures](https://roadmap.sh/datastructures-and-algorithms), and software development. As a computer scientist, you'll study these fields to create the tools that data scientists use.
+
+**The** **tools and technologies** **you'll** **use**
+Choosing data science requires using different tools and technologies to manipulate data. These tools include machine learning libraries **(TensorFlow)** and languages like [**Python**](https://roadmap.sh/python) **and R**. Python libraries like Pandas will help you with data manipulation and NumPy for math calculations. As a data scientist, you'll also use big data technologies like Hadoop to work with huge amounts of data.
+
+On the other hand, computer science focuses on software development. As a computer scientist, you'll use programming languages like [Python](https://roadmap.sh/python), [C++](https://roadmap.sh/cpp), and [JavaScript](https://roadmap.sh/javascript) to create different web applications. You'll also use tools like [React](https://roadmap.sh/react), [Git](https://roadmap.sh/git-github), databases **(MySQL and** [**MongoDB**](https://roadmap.sh/mongodb)**)**, and IDEs **(VS code)** to write and test codes.
+
+## What education do you need for computer and data science careers?
+
+Getting a computer science degree gives you a solid foundation for software development. It will help you understand computer science principles and how to code and solve issues. Examples of these principles include programming languages, data structures, and operating systems. As a computer science graduate, you'll have a strong foundation that will help you land various tech jobs.
+
+![Data science vs. computer science: Educational background](https://assets.roadmap.sh/guest/what-education-do-you-need-for-a-computer-and-data-science-career-xbujx.png)
+
+Many universities offer specializations in data science within their computer science programs. Others treat data science as a separate program, recognizing it as a field in its own right. They teach you all about machine learning, data visualization, statistics, and more. These data science programs combine ideas from computer science, mathematics, and other fields. At the end of the program, you'll get a data science degree and the necessary skills to get a tech job.
+
+Studying at a university is not the only way to get a data and computer science education. Many computer science students and aspiring data scientists attend boot camps and learn via certifications or online tutorials. For instance, you can find many [data science courses](https://roadmap.sh/ai-data-scientist) on [roadmap.sh](http://roadmap.sh) and learn at your own pace.
+
+Learning this way is more flexible and can work with all kinds of schedules and ways of learning. For instance, you can juggle work and study at the same time, which is much harder to do when you study at a university. If you go for a traditional degree like a data science degree, you'll need to invest more time, but you'll get a broad education.
+
+With these educational paths in mind, a common question arises: **D\*\***o you need a computer science degree to pursue a career in data science?\*\* The answer is a simple no.
+
+A computer science degree is not always required for computer and data science positions. It can help you start your career in data science, for example, by giving you a solid programming foundation. However, you can study other fields like mathematics, physics, and economics and still be a successful data scientist. You can also go through boot camps and online tutorials on data analysis, machine learning, and data visualization to gain the necessary skills.
+
+Also, having some practical skills and constant practicing will give you more experience. When practicing, work on personal and open-source projects and build your portfolio to increase your chances of getting a job. Create time to attend meetups and [join online communities](https://discord.com/invite/cJpEt5Qbwa) to chat with other professionals.
+
+## What are the essential skills you'll need?
+
+Computer science and data science have a broad range of specialized skill sets. Some of these skills are relevant in both fields, and others are unique.
+
+![Computer science and data science skills](https://assets.roadmap.sh/guest/essential-skills-for-computer-science-and-data-science-k8p58.png)
+
+Even though computer science and data science are not the same, they do have some skills in common. These shared skills make it easy to switch between the two fields. Yes, it's true; you can transition from computer to data science and vice versa. The following are some examples of these shared skills:
+
+- **Programming skills**: Programming skills are a crucial common ground for both fields. Knowing how to code to solve problems as a computer or data scientist is important. The process involves learning programming languages like [Python](https://roadmap.sh/python), having a deep understanding of data structures, and more. It lets you do software development **(computer science)** or data manipulation **(data science)**. However, it is worth noting that some tasks, like data visualization, do not require coding.
+- **Solving problems:** As a computer or data scientist, it is important to be able to solve problems. This helps you to create software, fix errors, and understand data.
+- **Mathematics and statistics**: Knowledge of mathematics and statistics will help you to solve problems in both fields. Computer science uses math principles in areas like algorithms and data structures. They will help you as a computer scientist make fast and better software and solve coding issues. As a data scientist, you use statistics to analyze data and machine learning.
+
+### What skills do you need for computer science?
+
+- **Programming languages:** Computer scientists use programming languages to give instructions to computers**.** Knowing one or more of these programming languages **(JavaScript, Java, etc.)** will help you to be successful in this field.
+- **System architecture:** Knowledge of system architecture will help you build reliable computer systems**.**
+- **Software development methodologies:** Software methodologies help you to plan and manage software projects. These methodologies **(agile, scrum, etc.)** will help you collaborate better with others when creating software.
+
+### What skills do you need for data science?
+
+- **Machine learning techniques**: Machine learning techniques are important skills in data science. A deep understanding of machine learning techniques will help you build prediction models. Among the many examples of these techniques are clustering and decision trees. They allow computers to make predictions and recognize patterns without instructions from anyone.
+- **Data analytics:** To get into the data science field, you must know data analytics. It is the starting point for many data science tasks, e.g., building machine learning models. Data analytics allows you to understand data, find patterns, and draw conclusions.
+- **Data visualization techniques**: These help present data results in clear visual stories. As a data scientist, they allow you to show patterns that might be hard to see in raw numbers in pictures or graphs. You do this using tools like Tableau, Matplotlib, or Power BI. Some examples of these techniques include bar charts, histograms, and scatter plots.
+
+## How to choose between data science and computer science
+
+Let's get into the details to help you decide which field fits you best. Choosing between both fields involves understanding your strengths, interests, and the job market.
+
+![How to choose between computer and data science](https://assets.roadmap.sh/guest/how-to-choose-between-data-science-and-computer-science-zo7p5.png)
+
+**Your strengths and educational background**
+The path you choose boils down to what you're into, what you're good at, and your educational background. Computer science might be a good fit if you're into how computers work and creating software systems. An academic background in computer science or engineering also makes you a good fit.
+
+If you like finding hidden patterns in data and solving problems, then data science could be for you. You'll also be a good fit if you've studied mathematics, economics, or computer science.
+
+**Earning potential and industry demand**
+Many people ask: **Which pays more, data science or computer science?** Well, both fields pay high salaries and are in high demand in the industry.
+
+Data scientists are in high demand across various sectors, like healthcare and finance. [According to Indeed](https://www.indeed.com/career/data-scientist/salaries?from=top_sb), the average salary for a data scientist in the United States (USA) across all industries is **$123,141.**
+
+![Average salary for a data scientist](https://assets.roadmap.sh/guest/average-salary-for-a-data-scientist-vnv54.png)
+
+Computer science professionals like software engineers and software developers are also in demand. [According to Indeed](https://www.indeed.com/career/computer-scientist/salaries?from=top_sb), computer scientists in the USA make around $121,452 a year on average.
+
+![Average salary for a computer scientist](https://assets.roadmap.sh/guest/average-salary-for-a-computer-scientist-88wog.png)
+
+How much money you earn can depend on where you live, your field, and your skills. roadmap.sh provides [computer](https://roadmap.sh/computer-science) and [data science](https://roadmap.sh/ai-data-scientist) resources to help you improve in both fields.
+
+## FAQ: Data science or computer science?
+
+The following are answers to common questions to help you start your career as a computer and data scientist.
+
+![Frequently asked questions about computer and data science](https://assets.roadmap.sh/guest/faq-data-science-or-computer-science-he3pu.png)
+
+**Is data science harder than computer science?**
+Data science and computer science are challenging fields in their different ways. So, it is difficult to say one field is harder than another. The difficulty level varies based on personal viewpoints, interests, and capabilities.
+
+**Is data science still in demand in 2025?**
+Yes, data science is still in demand in 2025. [The US Bureau of Labor Statistics](https://www.bls.gov/ooh/math/data-scientists.htm#:~:text=in%20May%202023.-,Job%20Outlook,on%20average%2C%20over%20the%20decade.) predicts a 36% increase in data science jobs from 2023 to 2033.
+
+**How long does it take to complete most computer science programs?**
+Computer science programs like a bachelor's degree often take four years to complete. Master's programs take one to three years, depending on your pace or the school. Bootcamps and online certifications, however, may take less time.
+
+**Is data science more focused on mathematics or computer science?**
+Both fields are important parts of data science—you can't have one without the other! It uses statistics and mathematical concepts to analyze data and computer science for handling data and building models. The balance may vary depending on the specific role, project, or focus within data science.
+
+## What Next?
+
+Deciding between data science and computer science does not need to be a difficult task. Figure out what works best for you by thinking about what you like, what you're good at, and what you want to achieve.
+
+Also, you don't have to limit yourself to just one field. Many people use data and computer science skills to solve problems daily. So, it is very normal to be good in both fields.
+
+However, if you're a beginner, focus on improving at one before learning another. [roadmap.sh](http://roadmap.sh) provides roadmap guides for you to learn [computer](https://roadmap.sh/computer-science) and [data science](https://roadmap.sh/ai-data-scientist). Both roadmaps contain resources and everything you need to get started.
diff --git a/src/data/guides/ai-data-scientist-vs-data-analytics.md b/src/data/guides/ai-data-scientist-vs-data-analytics.md
new file mode 100644
index 000000000..c4d2f5d0c
--- /dev/null
+++ b/src/data/guides/ai-data-scientist-vs-data-analytics.md
@@ -0,0 +1,174 @@
+---
+title: 'Data Science vs. Data Analytics: Which is Right for You?'
+description: 'Data science vs. Data analytics? This guide breaks down roles, tools, and growth opportunities for aspiring data professionals.'
+authorId: william
+excludedBySlug: '/ai-data-scientist/vs-data-analytics'
+seo:
+  title: 'Data Science vs. Data Analytics: Which is Right for You?'
+  description: 'Data science vs. Data analytics? This guide breaks down roles, tools, and growth opportunities for aspiring data professionals.'
+  ogImageUrl: 'https://assets.roadmap.sh/guest/data-science-vs-data-analytics-3ol7o.jpg'
+isNew: false
+type: 'textual'
+date: 2025-02-06
+sitemap:
+  priority: 0.7
+  changefreq: 'weekly'
+tags:
+  - 'guide'
+  - 'textual-guide'
+  - 'guide-sitemap'
+---
+
+![Data science vs data analytics comparison](https://assets.roadmap.sh/guest/data-science-vs-data-analytics-3ol7o.jpg)
+
+If you enjoy spotting patterns, analyzing trends, and driving business strategies, a career in [data analytics](https://roadmap.sh/data-analyst) might be your ideal fit. On the other hand, if algorithms, coding, and diving into uncharted territory excite you, a career in [data science](https://roadmap.sh/ai-data-scientist) could be the better path.
+
+As someone whose work spans both fields and involves managing data to solve business challenges, I've seen how both data science and analytics shape business success.
+
+Businesses rely heavily on insights, whether streamlining operations, predicting future trends, or crafting innovative strategies. Both data analytics and data science are pivotal to this process, but they approach problems differently.
+
+As a data analyst, you'll focus on making sense of data through trends, visualizations, and actionable insights. As a data scientist, you'll work on building predictive data models and solving complex problems using advanced machine learning techniques.
+
+But the big question is: Which path aligns with your goals?
+
+The answer lies in your interests, strengths, and career aspirations. In this guide, I'll take you through the key differences between data science and data analytics and show you how they complement each other. You'll learn which skills are needed in each role and what career paths and opportunities they offer. By the end, you'll clearly know which role fits you best and how to start building your future.
+
+The table below summarizes the key differences between data science and data analytics.
+
+|                      | **Data Science**                                                                                                                       | **Data Analytics**                                                                                                                                 |
+|---------------------|----------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------|
+| **Key Role**        | Uses statistical analysis and computational methods to gain insights from complex, structured and unstructured data.                     | Analyzes data collected from different sources, generates insights, and makes smart data-driven decisions.                                           |
+| **Skills**          | Machine learning, reinforcement learning techniques, data wrangling, big data technologies, cloud computing, and predictive analytics.   | Proficient in data collection, SQL, knowledge of advanced Excel functions, data visualization, critical thinking, and create visual presentations.   |
+| **Tools**           | TensorFlow, PyTorch, Jupyter Notebooks, and GitHub/Git.                                                                                 | SQL, Excel, Tableau, Power BI, OpenRefine or Google Analytics                                                                                       |
+| **Career Paths**    | Data Scientist > Machine Learning Engineer > AI Specialist                                                                              | Data Analyst > Business Intelligence Manager > Chief Data Officer (CDO)                                                                             |
+| **Salary Range**    | For data scientist job positions, salary ranges from $119,040 to $158,747 per year.                                                     | For data analysis job positions, salary ranges from $82,000 to $86,200 per year.                                                                    |
+
+## What are data science and data analytics?
+
+Data science and data analytics are two multidisciplinary fields that share the goal of helping organizations make smarter decisions, but they achieve this in different ways.
+
+Data science uses advanced tools like machine learning and AI to extract insights from large, complex data sets. As a data scientist, your role is to uncover patterns and build predictive models that solve problems like fraud detection, ad optimization, and trend forecasting. Tools like [Python](https://roadmap.sh/python), Apache Spark, and [SQL](https://roadmap.sh/sql) are key to this work.
+
+Data analytics, meanwhile, focuses on interpreting existing data to uncover trends and deliver actionable insights. As a data analyst, you'll use data analytics tools like Excel, Tableau, and Power BI to identify patterns, forecast sales, analyze customer behavior, and guide strategy. This work is grounded in understanding what has already happened to influence future business decisions.
+
+By understanding the distinct purposes of these roles, we can examine how they interact to drive meaningful results.
+
+## How do data science and data analytics complement each other?
+
+For example, consider an ecommerce business whose sales have declined over the past quarter. A data analyst would start by examining historical sales data using tools like Excel or SQL to identify patterns and uncover potential causes, such as price changes or shifting customer demographics. These findings would then inform the data science team.
+
+The data scientists would take this further by building predictive models to analyze future sales trends. They might incorporate additional features, like customer feedback or competitor pricing, to provide proactive recommendations that could reverse the decline, such as adjusting pricing strategies or launching targeted campaigns.
+
+Therefore, data analytics helps you answer the "**what**,** why**, and **where**" questions. For example, you can use it to ask, "what caused past sales?" or "why did customer churn go up in Q1?" or "where is our main revenue coming from?" By looking at historical data, data analytics gives you the answers you need to improve and build better strategies.
+
+The data science process takes it a step further by answering the "**why**" and **"how**" questions, like why sales went down and how to fix it. Data science leverages machine learning algorithms and predictive techniques to provide you with the right solutions to move forward.
+
+Next, explore the specific job roles and responsibilities in data science and data analytics.
+
+## **Data science vs. data analytics:** **Job role and responsibilities**
+
+Here are the primary responsibilities that define the role of a data analyst and how they contribute to enabling data-informed business decisions.
+
+![Data science & data analytics: Roles and responsibilities](https://assets.roadmap.sh/guest/data-analysts-vs-data-science-role-and-responsibilities-0p0wv.png)
+
+**Key responsibilities of data scientist**
+As a data scientist, you'll work on complex tasks, such as building models, designing algorithms, and experimenting with data to uncover unknown outcomes. For example, to predict which customers are likely to cancel their subscriptions, you will analyze past customer behavior using predictive models to identify patterns.
+
+Here is a quick overview of your key responsibilities as a data scientist:
+
+- **Data collection and management:** Collect data from many sources, often dealing with structured and unstructured data. Your focus will be on getting the data for analysis, which can be simple to very complex, depending on the problem.
+- **Build predictive models:** Apply machine learning techniques to predict future behaviors, such as customer churn or sales demand.
+- **Design algorithms:** Develop new algorithms to optimize business operations, such as fraud detection systems or creating personalized recommendations for customers.
+- **Data experimentation:** Identify hidden patterns and extract meaningful insights from large and unstructured data sets.
+
+**Key responsibilities of data analyst**
+As a data analyst, you focus on understanding structured data to answer specific business queries and make smart decisions. For example, to identify sales trends over the past year, you will perform the following tasks:
+
+- **Data collection and processing:** Gather information from different sources and remove inaccuracies or unnecessary data. Use data-cleaning method to maintain accuracy and prepare data for analysis.
+- **Data analysis:** Interpret formatted and cleaned data using statistical tools and advanced modeling techniques.
+- **Data reporting:** Create clear and concise reports to share with business.
+- **Business recommendations:** Provide recommendations based on what you found to improve sales, efficiency, and performance.
+
+Let's dig into the tools and skills needed for your selected job role.
+
+## **Data science vs. data analytics: Skills and** **tools**
+
+When you choose between becoming a data analyst or a data scientist, understanding the essential skills and tools for each role is crucial. Both positions demand analytical proficiency, but their technical requirements and focus areas differ significantly.
+
+![Data science & data analytics: Skills](https://assets.roadmap.sh/guest/data-analytics-vs-data-science-skills-ftf50.png)
+
+Let's explore the key skills and tools to help you make the right decision.
+
+**Data scientist skills and tools**
+As a data scientist, you'll have technical, analytical, and problem-solving skills to handle large and complex datasets. Some of the main skills and tools that interviewers look for are:
+
+- **Programming skills:** Mastery of Python and R is essential for data science tasks, including statistical analysis and machine learning model development.
+- **Machine learning expertise:** Knowledge of supervision and reinforcement learning techniques. Additionally, you should have an understanding of algorithms and clustering methods.
+- **Big data tools:** Hadoop and Apache Spark are a must for distributed storage and big data analysis.
+- **Mathematics and statistics**: Advanced knowledge of mathematics and statistics is essential for building models and deriving insights.
+
+You should also focus on mastering tools like [TensorFlow](https://roadmap.sh/cpp/libraries/tensorflow), PyTorch, Jupyter Notebooks, [GitHub/Git](https://roadmap.sh/git-github), SQL, Apache Spark, Hadoop, [Docker](https://roadmap.sh/docker), [Kubernetes](https://roadmap.sh/kubernetes), and Tableau. Data visualization, Scikit-learn, and version control systems are also important for data science.
+
+**Data analyst skills and tools**
+As a data analyst, your role focuses on data interpretation for business decisions. Some of the main skills and tool proficiencies you'll need to excel in this role are:
+
+- **SQL (Structured Query Language):** Knowledge of SQL is necessary for querying, managing and retrieving data from databases.
+- **Advanced Excel skills:** Strong Excel skills, including pivot tables, VLOOKUP, and data analysis functions, are necessary to organize and analyze data.
+- **Data visualization:** Ability to create good-looking charts and dashboards using tools like Tableau and Power BI is a must for presenting insights in a clear and effective way.
+- **Critical thinking:** Strong analytical and critical thinking skills to identify trends and derive meaning from data.
+
+Check out the [Data Scientist](https://roadmap.sh/ai-data-scientist) and [Data Analyst](https://roadmap.sh/data-analyst) roadmaps for a structured approach. These will help you decide what to learn and where to focus. By following them, you can prioritize what to learn, focus on high-demand areas, and not feel overwhelmed. Also, join local or online meetups to connect with professionals and participate in hackathons to get hands-on experience and add to your portfolio.
+
+Let's move forward to understand different career trajectories that fall under data science and data analysis. Also, check out the salary ranges for each job profile.
+
+## **Data science vs. data analytics: Career paths and salary insights**
+
+If you're looking into data science or data analytics careers, you're entering a field with huge growth. Both have their own focus, but there's a lot of overlap in skills, tools, and methodologies, so it's easier to move between roles or expand your skills across both domains.
+
+![Data science vs. data analytics: Career paths and salary insights](https://assets.roadmap.sh/guest/data-scentists-vs-data-analysts-career-paths-and-salary-insights-oclgw.png)
+
+Here is a quick overview of role transitions, salary ranges, and the steps you can take to advance your career as a data scientist and data analyst.
+
+**Data science career paths and salary insights**
+As a data scientist engineer, these are the roles that are typically available to you throughout your career:
+
+- Data scientist
+- Machine learning engineer
+- AI specialist
+
+**Data scientist:** As a data scientist, you will analyze large datasets, develop predictive data models, and implement algorithms to extract insights. Additionally, you must have knowledge of machine learning basics, structured data, statistical modeling, and communication skills.
+
+In 2024, the [average salary](https://www.datacamp.com/blog/data-science-salaries) for a data scientist is $123,069 per year in the United States.
+
+**Machine learning engineer:** In this role, you'll focus on developing and deploying machine learning models in production environments. This role requires technical expertise in software engineering, computer science, big data technologies, and scalable systems. You must have knowledge of advanced machine learning, computer science, cloud computing, and software development lifecycle (SDLC) knowledge.
+
+According to [Indeed](https://www.indeed.com/career/machine-learning-engineer/salaries), the average salary for a machine learning engineer in the United States is $161,715 per year.
+
+**AI specialist:** You'll focus on designing cutting-edge AI solutions, managing teams of data professionals, and driving strategic artificial intelligence initiatives for organizations. You even perform research on emerging spot trends and implement AI frameworks.
+
+According to [Glassdoor,](https://www.glassdoor.co.in/Salaries/us-ai-specialist-salary-SRCH_IL.0,2_IN1_KO3,16.htm) the estimated salary of an AI specialist job profile in the US is $129,337 per year, with an average salary of $105,981 per year.
+
+**Data analytics career paths and salary insights**
+If you're leaning towards data analytics, here are some common job titles for you, along with salary details for each role:
+
+- Data analyst
+- Business intelligence manager
+- Chief data officer
+
+**Data analyst:** This role involves collecting, cleaning, and analyzing data to generate actionable insights. You'll work on dashboards, reporting, and descriptive analytics using tools like Excel and Tableau. Additionally, you must have basic programming knowledge, data visualization, and data mining skills.
+
+In 2024, the estimated [average salary](https://www.indeed.com/career/data-analyst/salaries) of a data analyst ranges around $80,811 per year depending on experience, location, and specific skills in demand.
+
+**Business intelligence manager:** As a business intelligence manager, you'll lead data reporting and visualization strategies, manage data accuracy, and design scalable solutions. Communication skills and proficiency in business intelligence tools are key to this role.
+
+[ZipRecruiter](https://www.ziprecruiter.com/Salaries/Business-Intelligence-Manager-Salary) reported that the salary of a business intelligence manager in the US ranges from $29,500 to $158,500.
+
+**Chief data officer (CDO):** Responsible for an organization's data strategy, data governance, and data leveraging for competitive advantage. For this job role, you must have the necessary skills, such as data governance, data strategy, data engineering, and management of complex architecture.
+
+In 2024, the estimated total pay for a chief [data officer](https://www.glassdoor.co.in/Salaries/us-chief-data-officer-salary-SRCH_IL.0,2_IN1_KO3,21.htm) is $373,952 per year in the US.
+
+## **What** **Next**
+
+Once you've decided to pursue a career in data science or data analytics, the next step is figuring out where to start. Our [AI-Data Scientist](https://roadmap.sh/ai-data-scientist) and [Data Analyst roadmap](https://roadmap.sh/data-analyst) are designed to help you with that by breaking down the skills, tools and concepts into smaller steps. Whether you are drawn to the complexity of algorithms or analyzing trends, both paths offer rewarding opportunities for personal and professional growth, these roadmaps will give you a clear structure to build a solid foundation and move forward with confidence.
+
+Remember, the key to success in both fields is a commitment to continuous learning. For detailed overview of any specific role, join the [Discord community](https://roadmap.sh/discord) and stay informed!
diff --git a/src/data/guides/ai-data-scientist-vs-machine-learning.md b/src/data/guides/ai-data-scientist-vs-machine-learning.md
new file mode 100644
index 000000000..60c14f14a
--- /dev/null
+++ b/src/data/guides/ai-data-scientist-vs-machine-learning.md
@@ -0,0 +1,181 @@
+---
+title: 'Data Science vs Machine Learning: How are they different?'
+description: 'Excited about a career in data science or machine learning? Learn the differences, key skills, tools, and how to choose the role that aligns with your ambitions'
+authorId: ekene
+excludedBySlug: '/ai-data-scientist/vs-machine-learning'
+seo:
+  title: 'Data Science vs Machine Learning: How are they different?'
+  description: 'Excited about a career in data science or machine learning? Learn the differences, key skills, tools, and how to choose the role that aligns with your ambitions.'
+  ogImageUrl: 'https://assets.roadmap.sh/guest/data-science-vs-machine-learning-gaa7s.jpg'
+isNew: false
+type: 'textual'
+date: 2025-02-06
+sitemap:
+  priority: 0.7
+  changefreq: 'weekly'
+tags:
+  - 'guide'
+  - 'textual-guide'
+  - 'guide-sitemap'
+---
+
+![Data science vs machine learning comparison](https://assets.roadmap.sh/guest/data-science-vs-machine-learning-gaa7s.jpg)
+
+If you're excited by the idea of extracting insights from data to guide decisions, a career in [data science](https://roadmap.sh/ai-data-scientist) might be for you. On the other hand, if you're drawn to creating the algorithms behind AI systems and building intelligent applications, machine learning could be your ideal path.
+
+Both fields are at the forefront of innovation, driving transformative technologies like ChatGPT, DALL-E, and Gemini. These advancements, used across industries like healthcare, finance, and tech, owe their success to the growing collaboration between data science and machine learning. As AI becomes more accessible with tools from companies like OpenAI and AWS, the demand for experts in these fields is only increasing.
+
+So, how do you choose between these high-demand, rewarding careers? As an ML Engineer with experience on projects that span across data science and machine learning, I have gained a deep understanding of the overlaps and differences between these fields. In this guide, I will explain the responsibilities of each role, highlight their key differences, and outline the essential skills for success. By the end, you'll be better equipped to pick the path that matches your interests, strengths, and career goals.
+
+The table below summarizes the key differences between data science and machine learning you should consider to help you evaluate which one best fits your career goals:
+
+| **Aspect**                            | **Data science**                                                                                | **Machine learning**                                                                               |
+| ------------------------------------- | ----------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
+| **Ideal for you** **i\*\***f\***\*…** | You enjoy exploring and analyzing data to extract insights and inform decisions.                | You are passionate about creating algorithms and systems that learn and improve automatically.     |
+| **Educational background**            | Strong foundation in statistics, data analysis, and visualization tools.                        | Strong foundation in mathematics, programming, and AI techniques.                                  |
+| **Career opportunities**              | Data scientist, [Data Analyst](https://roadmap.sh/data-analyst), Business Intelligence Analyst. | Machine learning Engineer, AI Researcher, Deep Learning Specialist.                                |
+| **Industries**                        | Healthcare, finance, marketing, e-commerce, and government sectors.                             | Technology, autonomous systems, robotics, fintech, and R&D labs.                                   |
+| **Skills you'll need**                | Data cleaning, exploratory analysis, storytelling, and domain expertise.                        | Proficiency in machine learning libraries, algorithm design, and optimization.                     |
+| **Growth potential**                  | Strong demand across industries as companies seek to become more data-driven.                   | High demand in tech-driven fields as AI adoption accelerates.                                      |
+| **Creativity vs. technical**          | Balances creativity in visualizations with technical skills in data processing.                 | Heavily focused on technical and mathematical skills for problem-solving and predictive analytics. |
+| **Long-term vision**                  | Perfect if you want to lead data-driven strategy or explore business analytics.                 | Ideal if you aim to innovate in AI, robotics, or advanced tech solutions.                          |
+
+Before looking at these features in detail, let's take a closer look at these two fields.
+
+## What is data science?
+
+Data science is a field that combines techniques from statistics, domain knowledge, computer science, and data analysis to gain insights from structured and unstructured data. As a data scientist, you'll use tools, machine learning models, and algorithms to understand data and drive decision-making. You'll use these insights to help businesses increase profits, create innovative products and services, improve systems, and solve problems across various industries.
+
+**Key Components of Data Science**
+The key components of data science involve the following processes:
+
+![Data science Components](https://assets.roadmap.sh/guest/data-science-process-flow-57cx5.png)
+
+1. **Data collection**: The first step is to gather raw data from various sources such as APIs, sensors, databases, and web scraping.
+2. **Data cleaning and preparation**: After collecting the raw data, it must be cleaned by removing inaccuracies, handling missing values, and formatting it for analysis.
+3. **Exploratory Data Analysis (EDA)**: Use statistical methods and visualization techniques to explore the data, identify trends, patterns, and anomalies, and gain a better understanding of the dataset.
+4. **Data modeling and machine learning**: Apply machine learning algorithms to build models that can identify patterns, predict outcomes, and automate processes.
+5. **Data visualization**: Use tools like charts, graphs, and dashboards to present insights and communicate findings clearly to stakeholders.
+6. **Deployment and monitoring**: Implement data models in real-world applications and continuously monitor their performance to ensure they remain accurate and effective.
+
+### Essential Skills and Tools You Need for a Successful Data Science Career
+
+To build a successful career in data science, knowledge of a programming language like [Python](https://roadmap.sh/python) is essential. Beyond that, as a data scientist, you'll need to develop expertise in the following skills and tools:
+
+- **Programming languages**: You'll need proficiency in [SQL](https://roadmap.sh/sql), R, SAS, and others to collect, manipulate, and manage both structured and unstructured data.
+- **Mathematics, statistics, and probability**: A strong grasp of these concepts will enable you to build accurate models and make data-driven decisions with confidence.
+- **Data wrangling and visualization**: You'll be responsible for cleaning, transforming, and visualizing data using tools like Matplotlib, Seaborn, Power BI, and Tableau to present insights effectively.
+- **Machine learning and predictive modeling**: Knowledge of machine learning algorithms and techniques for building models that can make predictions and automate decision-making processes.
+- **Data analysis tools**: Familiarity with tools like Jupyter Notebooks, Pandas, NumPy, Apache Spark, and Scikit-learn will help you analyze and process data with ease.
+- **Cloud platforms**: Experience with cloud platforms such as [AWS](https://roadmap.sh/aws), Azure, and Google Cloud will enable you to leverage cloud resources for scalable computing and efficient model deployment.
+
+## What is machine learning?
+
+Machine learning is a branch of Artificial Intelligence (AI) that enables computers to learn from data and make predictions without being explicitly programmed. Rather than manually coding rules for every scenario, machine learning models learn from available data to perform tasks such as fraud detection, recommendation systems, natural language processing, and image recognition. It can be broadly categorized into the following types:
+
+![Illustration representing machine learning](https://assets.roadmap.sh/guest/machine-learning-classification-szzk0.png)
+
+- **Supervised learning**: In supervised learning, you train a model labeled data to predict outcomes and identify patterns. For example, you can use a dataset with details like location, square footage, and other factors to teach the model how to predict house prices.
+- **Unsupervised learning**: In unsupervised learning, the model is trained on unlabeled data and discovers patterns or groupings on its own. For example, you can use it to segment customers based on their purchasing habits without specifying predefined categories.
+- **Reinforcement learning**: In reinforcement learning, you train a model through a trial-and-error process to achieve the best outcomes. For instance, self-driving cars use reinforcement learning by continuously learning to recognize obstacles, road signs, and blockages through repeated experiences.
+
+### Key Components of Machine Learning
+
+The key components of machine learning involve the following processes:
+
+![Machine Learning Pipeline](https://assets.roadmap.sh/guest/machine-learning-pipeline-v5daz.png)
+
+1. **Data processing**: The foundation of any machine learning system is data. For the model to work effectively, it requires selecting and preparing the right data for training.
+2. **Feature engineering**: This step involves selecting the right variables (features) that the model can use to make accurate predictions. For example, a housing price prediction model would need features like the number of bedrooms, square footage, and location to make reliable predictions.
+3. **Model selection**: Choosing the appropriate model for a specific task is crucial. For instance, a **Linear Regression** model is suitable for predicting continuous values, while **Neural Networks** are better suited for tasks like image recognition.
+4. **Model training**: In this process, the selected model is fed with training data to help it learn patterns. The model's internal parameters are adjusted to minimize prediction errors.
+5. **Validation and testing**: After training, the model's performance is evaluated using a separate validation dataset. A final test dataset is used to ensure the model performs well in real-world scenarios.
+6. **Deployment**: Once the model is ready, it is integrated into real-world applications or deployed on cloud platforms to be accessed by third party users.
+7. **Model monitoring and maintenance**: After deployment, the model must be regularly monitored and updated to maintain accuracy and adapt to changes over time.
+
+### Essential Skills and Tools You Need for a Successful Machine Learning Career
+
+To build a successful career in machine learning, you'll need to develop the following essential skills and become familiar with key tools:
+
+- **Strong understanding of mathematics and statistics**: You'll need a solid understanding of linear algebra, calculus, probability, and statistics to grasp how machine learning algorithms function.
+- **Proficiency in programming languages**: Python and R are must-haves for implementing machine learning models and handling data efficiently.
+- **Data handling and preprocessing skills**: You need a solid understanding of how to clean, preprocess, and transform raw data into a format suitable for training models.
+- **Knowledge of machine learning algorithms**: Understanding algorithms like Linear Regression, Q-learning, and K-means and knowing when to apply them will help you tackle diverse challenges.
+- **Model evaluation and tuning**: You need to master techniques to evaluate model performance (e.g., accuracy, precision, recall) and fine-tune hyperparameters to improve results.
+- **Familiarity with libraries and frameworks**: Hands-on experience with Scikit-learn, TensorFlow, Keras, and other popular libraries and frameworks will help you build and deploy machine learning models efficiently.
+- **Cloud Platforms for Infrastructure**: Familiarity with cloud platforms like AWS, Google Cloud, and Azure will let you manage the infrastructure needed for large-scale machine learning projects.
+
+While data science and machine learning share common skills, tools, and workflows, they differ significantly in their approaches, methodologies, and focus areas. The table below summarizes the key differences between machine learning and data science:
+
+| **Category**                   | **Data science**                                                                   | **Machine learning**                                                                                                     |
+| ------------------------------ | ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
+| **Mathematics and statistics** | Strong knowledge of statistics, probability, and linear algebra.                   | Deep understanding of calculus, linear algebra, and optimization techniques.                                             |
+| **Programming languages**      | Python, R, and SQL for data manipulation, statistical analysis, and visualization. | Python, [C++](https://roadmap.sh/cpp), and [Java](https://roadmap.sh/java) for implementing machine learning algorithms. |
+| **Data handling**              | Data wrangling, data cleaning, and data visualization.                             | Data preprocessing, feature engineering, and handling large datasets.                                                    |
+| **Machine learning basics**    | Basic understanding of supervised, unsupervised learning, and regression.          | Advanced knowledge of machine learning algorithms, including deep learning.                                              |
+| **Business acumen**            | Ability to translate business problems into data solutions.                        | Focus on technical problem-solving without a primary business context.                                                   |
+| **Tools and frameworks**       | Tableau, Excel, Hadoop, Pandas, Matplotlib, and Scikit-learn.                      | TensorFlow, PyTorch, Scikit-learn, Keras, and XGBoost.                                                                   |
+| **Data visualization**         | Building dashboards, reports, and storytelling through data.                       | Creating visualizations primarily for model performance evaluation.                                                      |
+| **Communication skills**       | Strong emphasis on presenting insights to non-technical stakeholders.              | Less focus on communication; more technical documentation.                                                               |
+| **Problem-solving approach**   | Emphasis on interpreting data to guide decisions.                                  | Emphasis on building models to automate decision-making.                                                                 |
+| **Domain knowledge**           | Domain expertise in industries like healthcare, finance, marketing, etc.           | Less reliance on specific domain knowledge; more generalizable algorithms.                                               |
+| **Software engineering**       | Less focus on software engineering practices.                                      | Strong focus on scalable system design and code optimization.                                                            |
+| **Algorithm understanding**    | Basic knowledge of algorithms for data analysis.                                   | Deep understanding of algorithms, including neural networks and gradient descent.                                        |
+
+Now that we've covered data science and machine learning regarding processes, tools, similarities, and differences, let's explore the key points you should consider to make the right career decision.
+
+## Data science vs. machine learning: Which career path fits your background?
+
+If you have a background in statistics, data analysis, and business intelligence, data science could be the perfect match for you. Data science is all about turning raw data into valuable insights that businesses can act on. Your familiarity with working with data makes it easier to spot patterns and trends, which is a key part of what data scientists do. It's a role that requires both creative problem-solving and analytical thinking.
+
+Machine learning, on the other hand, is better suited for you if you have a strong foundation in mathematics, programming, and computer science. A machine learning expert builds algorithms that can learn from data without explicitly programming them. It requires a solid grasp of concepts like linear algebra, calculus, probability, and algorithm design. If these are skills you already have, this path is a natural fit for you.
+
+## Data science vs. machine learning: Which path pays off in the long run?
+
+Both machine learning and data science offer exciting and rewarding career paths, especially with the growing demand for AI across industries.
+
+In data science, you typically start your career with entry-level positions like Data Analyst or Business Intelligence Analyst and can evolve into leadership roles like Chief Data Officer. This career path is appealing because it allows you to collaborate with both technical teams and business stakeholders, solving real-world problems with data-driven insights.
+
+A typical career progression in data science involves:
+
+- Data Analyst
+- Data Scientist
+- Senior Data Scientist
+- Analytics Manager
+- Chief Data Officer
+
+![Average data scientist salary in the US](https://assets.roadmap.sh/guest/average-data-scientist-salary-in-the-us-i48ea.png)
+
+Machine learning careers tend to offer slightly higher salaries due to the specialized skills in programming and algorithm design. A machine learning professional typically starts as a machine learning engineer and can progress to advanced roles like Head of AI/ML, focusing on developing intelligent systems and cutting-edge AI solutions.
+
+A typical career progression in machine learning involves:
+
+- Machine Learning Engineer
+- AI Specialist
+- Deep Learning Engineer
+- AI Research Scientist
+- Head of AI/ML
+
+![Average machine learning Engineer salary in the US](https://assets.roadmap.sh/guest/average-machine-learning-engineer-salary-in-the-us-zdz8c.png)
+
+Both paths provide excellent growth opportunities, but your choice should align with your background and long-term career goals.
+
+## Data science vs. machine learning: Which opportunities are available for you?
+
+In terms of opportunities, data scientist are in higher demand across various industries that need data-driven insight to make decisions and improve their processes. These include companies within healthcare, finance, marketing, retail, and e-commerce. So, if your goal is to work in diverse industries that rely on data insights, then data science is an ideal choice.
+
+Machine learning, on the other hand, is more likely to work in technology-focused sectors where prediction, automation, and intelligence systems are at the core of their operation. These include industries like robotics, research and development labs, and autonomous vehicles. As a result, opportunities in machine learning may be harder to come by compared to data science, as machine learning professionals often work in more specialized and focused environments. However, if you're drawn to tech-driven fields involving autonomous systems or AI research, machine learning could be an ideal path for you.
+
+## Machine learning vs. data science: Which balances creativity and tech better?
+
+Data science strikes a balance between technical expertise and creativity. It's all about taking complex data and transforming it into meaningful insights that non-technical stakeholders can easily understand. If you enjoy solving problems creatively and telling compelling stories with data, data science would be a great fit for you.
+
+Machine learning, on the other hand, is more technical and involves developing algorithms. It involves designing, training, and optimizing models that enable machines to learn and make predictions. If you love tackling technical challenges like developing algorithms and building AI models from the ground up, then a career in machine learning would be ideal for you.
+
+As a rule of thumb, use the decision tree table to choose between data science and machine learning:
+
+![Data Science vs Machine Learning Decision Tree](https://assets.roadmap.sh/guest/data-analytics-vs-data-science-skills-ftf50.png)
+
+Choosing between data science and machine learning ultimately depends on your interests and career goals. Both fields offer rewarding opportunities and career growth. The key is to understand what excites you most: extracting meaning from data or building intelligent systems.
+
+If you're considering starting a career as a data scientist, explore our comprehensive [data science roadmap](https://roadmap.sh/ai-data-scientist) for actionable steps and valuable resources to get started.
diff --git a/src/data/guides/backend-developer-skills.md b/src/data/guides/backend-developer-skills.md
index 1f9d7f063..dd1f92fd3 100644
--- a/src/data/guides/backend-developer-skills.md
+++ b/src/data/guides/backend-developer-skills.md
@@ -23,7 +23,7 @@ tags:
 
 ![The best backend developer skills to learn.](https://assets.roadmap.sh/guest/backend-developer-skills-ece68.jpg)
 
-Whether your goal is to become a backend developer or to stay relevant as one, the goal itself requires adopting an eternal student mindset. The ever-evolving web development space demands continuous learning, regardless of the programming language you use. New frameworks, libraries, and methodologies emerge regularly, offering different solutions to old problems. To remain relevant as a [backend developer](/backend), you’ll have to stay updated by honing your core skills.
+Whether your goal is to become a backend developer or to stay relevant as one, the goal itself requires adopting an eternal student mindset. The ever-evolving web development space demands continuous learning, regardless of the programming language you use. New frameworks, libraries, and methodologies emerge regularly, offering different solutions to old problems. To remain relevant as a [backend developer](https://roadmap.sh/backend), you’ll have to stay updated by honing your core skills.
 
 In this article, we’ll cover the following set of backend developer skills we recommend you aim for:
 
@@ -69,7 +69,7 @@ The most common names you should look out for are:
 
 While there are other options, the ones mentioned above, from the backend point of view, are some of the most relevant languages to pay attention to. Here are the top 10 most popular ones amongst professional developers (screenshot taken from SO’s survey of 2023):
 
-![Stackoverflow Survey Result](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1709057007054.png)
+![StackOverflow Survey Result](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1709057007054.png)
 
 ### Keeping an eye on the rising stars
 
@@ -146,7 +146,7 @@ These are the standard structured databases (A.K.A relational databases) where y
 
 ### NoSQL databases
 
-As the name implies, these are not your standard SQL databases; in fact, within this category, there are columnar databases, document-based ones (such as MongoDB), key-value-based ones (like Redis), and more. They don’t use predefined data structures, giving you more flexibility and control over what you can store and how you store it. Backend developers will deal with only a handful of these, as there are many different sub-types, and more are created every year.
+As the name implies, these are not your standard SQL databases; in fact, within this category, there are columnar databases, document-based ones (such as [MongoDB](https://roadmap.sh/mongodb)), key-value-based ones (like [Redis](https://roadmap.sh/redis)), and more. They don’t use predefined data structures, giving you more flexibility and control over what you can store and how you store it. Backend developers will deal with only a handful of these, as there are many different sub-types, and more are created every year.
 
 Some examples of these databases are:
 
@@ -270,6 +270,6 @@ To summarize, if you expect to become a backend developer or to grow in the area
 - CI/CD and DevOps are practices you’ll be involved with, either directly or indirectly, so learn about them.
 - Soft skills are just as important as technical skills if you expect to grow in your career.
 
-That said, do not take this list as the ultimate roadmap but rather as a starting point. If you’re willing to take your backend developer career to the next level, push yourself out of your comfort zone and pursue the skills listed here and the ones listed in this detailed [backend development roadmap](https://roadmap.sh/backend).
+That said, do not take this list as the ultimate roadmap but rather as a starting point. If you’re willing to take your backend developer career to the next level, push yourself out of your comfort zone and pursue the skills listed here and the ones listed in this detailed [backend roadmap](https://roadmap.sh/backend).
 
 Remember, constant learning is the only absolute truth in the software development world (this is true for backend developers, too). If you keep your skillset updated with the latest trends, you’ll remain adaptable and effective as a backend developer.
diff --git a/src/data/guides/backend-developer-tools.md b/src/data/guides/backend-developer-tools.md
index 1de1870c8..21ba34d18 100644
--- a/src/data/guides/backend-developer-tools.md
+++ b/src/data/guides/backend-developer-tools.md
@@ -25,7 +25,7 @@ tags:
 
 As developers, we’re not just writing code on a text editor without any other external help. Whether we realize it or not, we’re constantly using different development tools to improve the way we work and the speed at which we can deliver our code.
 
-In this article, we’ll cover 25 backend development tools that are crucial in the web development industry, and as a [backend developer](/backend), you should be aware of them.
+In this article, we’ll cover 25 backend development tools that are crucial in the web development industry, and as a [backend developer](https://roadmap.sh/backend), you should be aware of them.
 
 The categories we’ll tackle are:
 
diff --git a/src/data/guides/backend-job-description.md b/src/data/guides/backend-job-description.md
index 262222333..bafb00696 100644
--- a/src/data/guides/backend-job-description.md
+++ b/src/data/guides/backend-job-description.md
@@ -155,7 +155,7 @@ A backend engineer needs a combination of soft and technical skills to excel. So
 
 ### Knowledge of at least one backend programming language
 
-A [backend developer](https://roadmap.sh/backend/developer-skills) should have an in-depth knowledge of at least one backend programming language, such as [Java](https://roadmap.sh/java), C#, [Python](https://roadmap.sh/python), [JavaScript (Node.js)](https://roadmap.sh/nodejs), etc. It is also beneficial for a backend engineer to be familiar with some [backend frameworks](https://roadmap.sh/backend/frameworks) such as Django, [ASP.NET](https://roadmap.sh/aspnet-core), Ruby on Rails, [Sprint Boot](https://roadmap.sh/spring-boot), etc.
+A [backend developer](https://roadmap.sh/backend/developer-skills) should have an in-depth knowledge of at least one backend programming language, such as [Java](https://roadmap.sh/java), C#, [Python](https://roadmap.sh/python), [Node.js](https://roadmap.sh/nodejs), etc. It is also beneficial for a backend engineer to be familiar with some [backend frameworks](https://roadmap.sh/backend/frameworks) such as Django, [ASP.NET](https://roadmap.sh/aspnet-core), Ruby on Rails, [Sprint Boot](https://roadmap.sh/spring-boot), etc.
 
 ![Backend languages](https://assets.roadmap.sh/guest/backend-languages.png)
 
@@ -219,7 +219,7 @@ Engineers sometimes have chaotic workloads, which often lead to burnout and affe
 
 ### DevOps skills
 
-Knowledge of [docker](https://roadmap.sh/docker) and container orchestration technologies, such as [Kubernetes,](https://roadmap.sh/kubernetes) is another skill that makes a backend developer stand out. A firm understanding of continuous integration and continuous deployment (CI/CD) setups is a plus. Consider a candidate with this basic DevOps skill for the role.
+Knowledge of [docker](https://roadmap.sh/docker) and container orchestration technologies, such as [Kubernetes](https://roadmap.sh/kubernetes) is another skill that makes a backend developer stand out. A firm understanding of continuous integration and continuous deployment (CI/CD) setups is a plus. Consider a candidate with this basic DevOps skill for the role.
 
 ## Common backend engineer job interview questions
 
diff --git a/src/data/guides/backend-languages.md b/src/data/guides/backend-languages.md
index 38ccbb117..65f6b53c6 100644
--- a/src/data/guides/backend-languages.md
+++ b/src/data/guides/backend-languages.md
@@ -45,7 +45,7 @@ They’re some of the most known and used languages in the industry right now (s
 
 ### Python
 
-Python has been around for decades already and while it’s never been the most popular option, it has always managed to stay within the top 5 choices. People love it for being easy to read, straightforward, and able to handle all sorts of tasks, making it a top pick for developers globally. Sure, Python's got a big name in data processing and machine learning, but let's not forget its solid impact on web development!.
+[Python](https://roadmap.sh/python) has been around for decades already and while it’s never been the most popular option, it has always managed to stay within the top 5 choices. People love it for being easy to read, straightforward, and able to handle all sorts of tasks, making it a top pick for developers globally. Sure, Python's got a big name in data processing and machine learning, but let's not forget its solid impact on web development!.
 
 What makes Python extra appealing, especially for beginners, is the fact that reading and writing it feels very much like English (or at least, as pseudo code). This makes it a top choice for folks just starting out in coding.
 
@@ -53,7 +53,7 @@ What makes Python extra appealing, especially for beginners, is the fact that re
 
 One of Python's standout features is its beginner-friendly syntax, making it an ideal language for those new to programming. The emphasis on readability and the absence of complex syntax (for the most part), eases the learning curve, enabling new developers to quickly grasp fundamental concepts.
 
-Python's community plays a critical role in its accessibility. Abundant learning resources, tutorials, and documentation are readily available, empowering beginners to progress from basic programming principles to advanced backend development seamlessly. Online platforms like Codecademy, Coursera, realpython.com, and even Google offer comprehensive courses tailored to all skill levels.
+Python's community plays a critical role in its accessibility. Abundant learning resources, tutorials, and documentation are readily available, empowering beginners to progress from basic programming principles to advanced backend development seamlessly. Online platforms like Codecademy, Coursera, Real Python, and even Google offer comprehensive courses tailored to all skill levels.
 
 #### Practical Applications and Popular Frameworks
 
@@ -87,11 +87,11 @@ As with all other backend languages in this article, Python has some pros and co
 
 ### Java
 
-Java has a massive presence and for good reason (according to [JetBrain’s survey in 2022, Java was used by 48% of developers](https://w3techs.com/technologies/details/pl-php)).It's the kind of programming language that's everywhere – serving up websites, running your favorite apps, and even powering big-scale enterprise systems.
+[Java](https://roadmap.sh/java) has a massive presence and for good reason (according to [JetBrain’s survey in 2022, Java was used by 48% of developers](https://w3techs.com/technologies/details/pl-php)).It's the kind of programming language that's everywhere – serving up websites, running your favorite apps, and even powering big-scale enterprise systems.
 
 #### Is it worth learning Java?
 
-Now, learning Java, (a strongly typed, object oriented programming language (OOP), is a journey worth taking, but it's not a walk in the park. It's a bit like climbing a mountain – you start at the bottom with the basics, and as you ascend, you get into the nitty-gritty of things like object-oriented programming. The process will force you to learn a lot, which is a great thing, by the end you’ll have a lot of understanding of mechanics and concepts around OOP that can be extrapolated into other languages. However, that can also be overwhelming to some developers who just want to learn by building mini-projects. In those situations, the learning curve of Java might be too long (not steep, but long because there is a lot more to cover than with alternatives such as Python or JavaScript).
+Now, learning Java, (a strongly typed, object oriented programming language (OOP)), is a journey worth taking, but it's not a walk in the park. It's a bit like climbing a mountain – you start at the bottom with the basics, and as you ascend, you get into the nitty-gritty of things like object-oriented programming. The process will force you to learn a lot, which is a great thing, by the end you’ll have a lot of understanding of mechanics and concepts around OOP that can be extrapolated into other languages. However, that can also be overwhelming to some developers who just want to learn by building mini-projects. In those situations, the learning curve of Java might be too long (not steep, but long because there is a lot more to cover than with alternatives such as Python or JavaScript).
 
 That said, the community is big and there are tons of resources, from online courses to forums, helping you navigate the Java landscape. And good reason, considering Java has been around for quite a while.
 
@@ -258,8 +258,6 @@ Once you’ve answered those questions, you’ll probably have some idea of wher
 
 In the end, you’re evaluating the language and its ecosystem, making sure they’re both evolving right along the web industry. If you find that there are aspects that are falling behind, then it probably isn’t a good choice.
 
-A handy tool when trying to evaluate a language like that is [roadmap.sh](https://roadmap.sh).
-
 [![Roadmap.sh](/guides/backend-languages/backend-roadmap-part.png)](https://roadmap.sh/backend)
 
 <p align="center" style="font-size: 14px; margin-top: -10px; text-align: center">Small section of the full backend roadmap available on <a href="https://roadmap.sh/backend">roadmap.sh</a></p>
diff --git a/src/data/guides/backend-project-ideas.md b/src/data/guides/backend-project-ideas.md
index 89a445332..2dba6b724 100644
--- a/src/data/guides/backend-project-ideas.md
+++ b/src/data/guides/backend-project-ideas.md
@@ -29,7 +29,7 @@ That said, having a project portfolio, even as backend developers, it’s very i
 
 As an added bonus, the experience you get out of the entire process of building the apps for your portfolio will help you improve your coding skills.
 
-Let’s take a look at 20 of the best backend projects you can work on to improve both your project portfolio and to [learn backend development](https://roadmap.sh/backend).
+Let’s take a look at 20 of the best backend projects you can work on to improve both your project portfolio and to learn [backend development](https://roadmap.sh/backend).
 
 Keep in mind that these project ideas are organized from easiest to hardest to complete, and the entire list should take you at least a year to complete, if you’re not rushing the process.
 
@@ -108,10 +108,10 @@ For the last of our “easy” backend projects, let’s cover one more API, an
 - Sign up as a new user.
 - Generate and validate JWTs for handling authentication and user session.
 - List and filter your past expenses. You can add the following filters:
-    - Past week.
-    - Last month.
-    - Last 3 months.
-    - Custom (to specify a start and end date of your choosing).
+  - Past week.
+  - Last month.
+  - Last 3 months.
+  - Custom (to specify a start and end date of your choosing).
 - Add new expenses.
 - Remove existing expenses.
 - Update existing expenses.
diff --git a/src/data/guides/backend-technologies.md b/src/data/guides/backend-technologies.md
index e933ccf5b..4094a52af 100644
--- a/src/data/guides/backend-technologies.md
+++ b/src/data/guides/backend-technologies.md
@@ -80,8 +80,7 @@ SQL Server's integration with Visual Studio and other Microsoft development tool
 
 #### SQLite
 
-SQLite is a self-contained, serverless, and zero-configuration database engine known for its simplicity and ease of use. It is lightweight and efficient, making it perfect for small to medium-sized applications, mobile apps, desktop applications, and prototyping. SQLite is embedded within the application, eliminating the need for a separate database server, which simplifies deployment and maintenance.
-Its single-disk file format makes it highly portable across various operating systems and platforms. 
+SQLite is a self-contained, serverless, and zero-configuration database engine known for its simplicity and ease of use. It is lightweight and efficient, making it perfect for small to medium-sized applications, mobile apps, desktop applications, and prototyping. SQLite is embedded within the application, eliminating the need for a separate database server, which simplifies deployment and maintenance. Its single-disk file format makes it highly portable across various operating systems and platforms.
 SQLite's efficient memory and disk usage allow it to perform well even on devices with limited resources, such as IoT devices and embedded systems.
 
 This makes SQLite an excellent choice for applications where simplicity, reliability, and low overhead are essential.
@@ -163,15 +162,16 @@ GitHub is a web-based platform that leverages Git for version control. It provid
 GitHub’s extensive features and strong community support make it the de facto choice for many companies and developers, both for open-source and private projects.
 
 ### GitLab
+
 GitLab is a web-based platform for version control using Git, known for its robust CI/CD pipeline integration. It offers a comprehensive set of tools for the entire DevOps lifecycle, making it suitable for continuous integration, deployment, and monitoring.
 
 #### Key Features and Benefits
 
-**Integrated CI/CD**: Built-in continuous integration and continuous deployment pipelines allow backend developers to automate building, testing, and deploying code changes. With Gitlabs they can even automatically configure CI/CD pipelines, deploy applications, and monitor performance, all through the same platform.
+**Integrated CI/CD**: Built-in continuous integration and continuous deployment pipelines allow backend developers to automate building, testing, and deploying code changes. With Gitlab they can even automatically configure CI/CD pipelines, deploy applications, and monitor performance, all through the same platform.
 
-**Security and Compliance**: Gitlabs provides key security capabilities for backend development: built-in static and dynamic application security testing (SAST/DAST).
+**Security and Compliance**: Gitlab provides key security capabilities for backend development: built-in static and dynamic application security testing (SAST/DAST).
 
-**Collaboration and Communication**: Instead of Pull Requests like Github, Gitlabs provides the concept of “Merge Requests”:  a simplified code review process with inline comments and suggestions.
+**Collaboration and Communication**: Instead of Pull Requests like Github, Gitlab provides the concept of “Merge Requests”:  a simplified code review process with inline comments and suggestions.
 
 GitLab’s all-in-one platform makes it an excellent choice for teams looking to streamline their DevOps processes and improve collaboration and productivity.
 
@@ -288,7 +288,7 @@ REST is ideal for web applications and services due to its ease of implementatio
 
 **Layered System**: REST allows for a layered system architecture, enabling intermediaries like load balancers and proxy servers to enhance security, performance, and scalability.
 
-If you’d like to know more about REST, you can read the full definition directly from [its source here](https://ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm).
+If you’d like to know more about REST, you can read the full definition directly from [its source](https://ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm).
 
 ### GraphQL
 
@@ -451,4 +451,4 @@ As backend developers, focusing on a backend programming language and a backend
 
 This is why you need to stay up-to-date and look at the trends that develop within each area to make sure you’re still working with and focusing on the right solutions.
 
-If you'd like more details on the type of backend development technologies you should be focusing on to excel at your role as a backend developer, check out our [Backend Developer roadmap](https://roadmap.sh/backend).
\ No newline at end of file
+If you'd like more details on the type of backend development technologies you should be focusing on to excel at your role as a backend developer, check out our [Backend Developer Roadmap](https://roadmap.sh/backend).
diff --git a/src/data/guides/basics-of-authentication.md b/src/data/guides/basics-of-authentication.md
index 5826dc223..2fd1aa617 100644
--- a/src/data/guides/basics-of-authentication.md
+++ b/src/data/guides/basics-of-authentication.md
@@ -91,7 +91,7 @@ And in case of authorization failure, i.e., if the user tries to perform an oper
 
 Given below is the list of common authentication strategies:
 
-- Basics of Authentication
+- Basic Authentication
 - Session Based Authentication
 - Token-Based Authentication
 - JWT Authentication
diff --git a/src/data/guides/devops-automation-tools.md b/src/data/guides/devops-automation-tools.md
index 11286269f..221d304b3 100644
--- a/src/data/guides/devops-automation-tools.md
+++ b/src/data/guides/devops-automation-tools.md
@@ -95,7 +95,7 @@ Get comfortable, because it’s going to be a long read.
 
 ### 1. GitHub Actions
 
-![](https://assets.roadmap.sh/guest/github-actions-sddcg.png)
+![Github Actions](https://assets.roadmap.sh/guest/github-actions-sddcg.png)
 
 #### Overview
 
@@ -123,7 +123,7 @@ GitHub Actions offers robust security features, including encrypted secrets, gra
 
 ### 2. Jenkins
 
-[![](https://assets.roadmap.sh/guest/jenkins-3ns0g.png)](https://assets.roadmap.sh/guest/jenkins-3ns0g.png)
+[![Jenkins CI](https://assets.roadmap.sh/guest/jenkins-3ns0g.png)](https://assets.roadmap.sh/guest/jenkins-3ns0g.png)
 
 #### Overview
 
@@ -151,7 +151,7 @@ Jenkins provides essential security features like role-based access control, cre
 
 ### 3. Ansible
 
-[![](https://assets.roadmap.sh/guest/ansible-jxqvt.png)](https://assets.roadmap.sh/guest/ansible-jxqvt.png)
+[![Ansible](https://assets.roadmap.sh/guest/ansible-jxqvt.png)](https://assets.roadmap.sh/guest/ansible-jxqvt.png)
 
 #### Overview
 
@@ -211,7 +211,7 @@ Puppet provides solid security features, including encrypted data handling, role
 
 #### Overview
 
-If you’re talking about DevOps automation tools, Terrafor is definitely up there on the list. **Terraform** by HashiCorp is a leading Infrastructure as Code (IaC) tool that enables you to define and provision infrastructure across various cloud providers using a declarative configuration language.
+If you’re talking about DevOps automation tools, Terraform is definitely up there on the list. **Terraform** by HashiCorp is a leading Infrastructure as Code (IaC) tool that enables you to define and provision infrastructure across various cloud providers using a declarative configuration language.
 
 #### Integration Capabilities 5/5 ★★★★★
 
@@ -277,16 +277,16 @@ Understanding your project requirements and team size will set the foundation fo
 
 #### 1. Project Requirements
 
-* **Type of Projects:** Are you working on small, agile projects or large-scale, enterprise-level applications? Different tools excel in different scenarios.
-* **Development Practices:** Do you follow specific methodologies like Agile, Scrum, or Kanban? Ensure the tool supports your preferred workflow.
-* **Deployment Frequency:** High-frequency deployments require robust CI/CD tools like GitHub Actions or Jenkins to keep up with the pace.
-* **Timeline**: Do you have the time to learn a new skill? Is it better to go with something that gets the job done and is familiar to you vs. picking the ideal tool which has a steeper learning curve and will require you to spend some months fiddling around and making educated guesses.
+- **Type of Projects:** Are you working on small, agile projects or large-scale, enterprise-level applications? Different tools excel in different scenarios.
+- **Development Practices:** Do you follow specific methodologies like Agile, Scrum, or Kanban? Ensure the tool supports your preferred workflow.
+- **Deployment Frequency:** High-frequency deployments require robust CI/CD tools like GitHub Actions or Jenkins to keep up with the pace.
+- **Timeline**: Do you have the time to learn a new skill? Is it better to go with something that gets the job done and is familiar to you vs. picking the ideal tool which has a steeper learning curve and will require you to spend some months fiddling around and making educated guesses.
 
 #### 2. Team Size and Expertise
 
-* **Skill Level:** If your team is new to DevOps, tools with a gentle learning curve like Ansible or GitHub Actions might be more suitable.
-* **Resource Availability:** Larger teams might benefit from more comprehensive tools with extensive features, while smaller teams might prefer lightweight solutions to avoid overcomplicating things.
-* **Collaboration Needs:** Consider how the tool facilitates teamwork. Features like shared dashboards and integrated communication can enhance collaboration.
+- **Skill Level:** If your team is new to DevOps, tools with a gentle learning curve like Ansible or GitHub Actions might be more suitable.
+- **Resource Availability:** Larger teams might benefit from more comprehensive tools with extensive features, while smaller teams might prefer lightweight solutions to avoid overcomplicating things.
+- **Collaboration Needs:** Consider how the tool facilitates teamwork. Features like shared dashboards and integrated communication can enhance collaboration.
 
 ### Considering Integration with Existing Tools
 
@@ -294,14 +294,14 @@ No one likes playing nice with others? Well, in the DevOps world, seamless integ
 
 #### 1. Compatibility with Existing Tools
 
-* **Version Control Systems:** Ensure the automation tool integrates smoothly with your version control system, whether it’s GitHub, GitLab, or Bitbucket.
-* **CI/CD Pipelines:** If you’re already using certain CI/CD tools, check if your new tool can complement or replace them without causing disruptions.
-* **Containerization and Orchestration:** Tools like Docker and Kubernetes are staples in many DevOps workflows. Make sure your automation tool plays well with these technologies.
+- **Version Control Systems:** Ensure the automation tool integrates smoothly with your version control system, whether it’s GitHub, GitLab, or Bitbucket.
+- **CI/CD Pipelines:** If you’re already using certain CI/CD tools, check if your new tool can complement or replace them without causing disruptions.
+- **Containerization and Orchestration:** Tools like Docker and Kubernetes are staples in many DevOps workflows. Make sure your automation tool plays well with these technologies.
 
 #### 2. APIs and Extensibility
 
-* **Custom Integrations:** Look for tools that offer robust APIs, allowing you to create custom integrations tailored to your specific needs.
-* **Plugin Ecosystems:** Tools with extensive plugin libraries (like Jenkins) offer greater flexibility and the ability to extend functionality as needed.
+- **Custom Integrations:** Look for tools that offer robust APIs, allowing you to create custom integrations tailored to your specific needs.
+- **Plugin Ecosystems:** Tools with extensive plugin libraries (like Jenkins) offer greater flexibility and the ability to extend functionality as needed.
 
 ### Evaluating Scalability and Flexibility
 
@@ -309,13 +309,13 @@ Your organization might be small now, but you’re playing the long game, and wh
 
 #### 1. Scalability
 
-* **Handling Increased Load:** Ensure the tool can manage an increase in projects, users, and deployments without performance degradation.
-* **Multi-Project Support:** If you plan to expand your project portfolio, choose tools that can handle multiple projects efficiently.
+- **Handling Increased Load:** Ensure the tool can manage an increase in projects, users, and deployments without performance degradation.
+- **Multi-Project Support:** If you plan to expand your project portfolio, choose tools that can handle multiple projects efficiently.
 
 #### 2. Flexibility
 
-* **Customization Options:** The ability to customize workflows, scripts, and configurations ensures the tool can adapt to your unique processes. This will make the tool useful in more situations/projects, giving you a higher ROI.
-* **Support for Multiple Environments:** Tools that support various environments (development, staging, production) offer greater flexibility in managing different stages of your projects.
+- **Customization Options:** The ability to customize workflows, scripts, and configurations ensures the tool can adapt to your unique processes. This will make the tool useful in more situations/projects, giving you a higher ROI.
+- **Support for Multiple Environments:** Tools that support various environments (development, staging, production) offer greater flexibility in managing different stages of your projects.
 
 ### Budget Considerations
 
@@ -323,14 +323,14 @@ Let’s face it—budget constraints are a reality for most organizations. Balan
 
 #### 1. Cost vs. Features
 
-* **Free vs. Paid Plans:** Many DevOps tools offer free tiers with basic features, which can be great for small teams or startups. Evaluate whether the paid features are worth the investment for your needs.
-* **License Models:** Understand the pricing structure—whether it’s based on the number of users, projects, or usage levels. Choose a model that aligns with your usage patterns.
+- **Free vs. Paid Plans:** Many DevOps tools offer free tiers with basic features, which can be great for small teams or startups. Evaluate whether the paid features are worth the investment for your needs.
+- **License Models:** Understand the pricing structure—whether it’s based on the number of users, projects, or usage levels. Choose a model that aligns with your usage patterns.
 
 #### 2. Total Cost of Ownership (TCO)
 
-* **Initial Setup Costs:** Consider the time and resources required to implement and configure the tool.
-* **Maintenance and Support:** Factor in ongoing costs related to updates, support, and potential training for your team.
-* **Hidden Costs:** Watch out for additional costs like premium plugins, integrations, or storage fees that might not be apparent upfront.
+- **Initial Setup Costs:** Consider the time and resources required to implement and configure the tool.
+- **Maintenance and Support:** Factor in ongoing costs related to updates, support, and potential training for your team.
+- **Hidden Costs:** Watch out for additional costs like premium plugins, integrations, or storage fees that might not be apparent upfront.
 
 ### Quick Tips for Choosing the Right Tool
 
@@ -351,4 +351,4 @@ In essence, these tools are the backbone of a successful DevOps strategy, enabli
 
 Adopting many of these **DevOps automation tools** can transform the way your team works, making your processes more efficient, reliable, and scalable.
 
-If you’re ready to take the next step in your DevOps journey, you should check out our [DevOps Roadmap](https://roadmap.sh/devops) to get started on learning about these powerful automation tools and take your skills to the next level.
\ No newline at end of file
+If you’re ready to take the next step in your DevOps journey, you should check out our [DevOps Roadmap](https://roadmap.sh/devops) to get started on learning about these powerful automation tools and take your skills to the next level.
diff --git a/src/data/guides/devops-automation.md b/src/data/guides/devops-automation.md
index e4809ec39..9d7166fd0 100644
--- a/src/data/guides/devops-automation.md
+++ b/src/data/guides/devops-automation.md
@@ -200,4 +200,4 @@ By automating key portions of your software development process like CI/CD, infr
 
 Implementing best practices will ensure your automation efforts are successful and aligned with your business goals.
 
-If you’re looking for more details on how to get started as a DevOps or you’d like to learn more about this practice, check out the [full DevOps roadmap here](https://roadmap.sh/devops).
+If you’re looking for more details on how to get started as a DevOps or you’d like to learn more about this practice, check out our [DevOps roadmap here](https://roadmap.sh/devops).
diff --git a/src/data/guides/devops-best-practices.md b/src/data/guides/devops-best-practices.md
index 94376acbc..b94648a80 100644
--- a/src/data/guides/devops-best-practices.md
+++ b/src/data/guides/devops-best-practices.md
@@ -114,7 +114,7 @@ The recently concluded [State of DevOps Report](https://cloud.google.com/resourc
 
 Microservice architecture involves breaking down your application into small, independent, and deployable services. Each service is responsible for a specific functionality and can be independently developed, tested, and deployed. This architecture promotes scalability, fault isolation, and rapid innovation, which are essential to the DevOps environment.
 
-![](https://assets.roadmap.sh/guest/microservices-architecture-wo59y.png)
+![Microservices Architecture](https://assets.roadmap.sh/guest/microservices-architecture-wo59y.png)
 
 To implement microservice architecture effectively into your DevOps processes, you need to:
 
@@ -161,7 +161,7 @@ To take advantage of configuration management in your DevOps processes, you need
 
 ### 10. Practice DevSecOps
 
-![](https://assets.roadmap.sh/guest/devsecops-rafjn.png)
+![DevSecOps](https://assets.roadmap.sh/guest/devsecops-rafjn.png)
 
 DevSecOps stands for **Development, Security, and Operations**. It’s an extension of DevOps that promotes the integration of security practices into every phase of the software development lifecycle (SDLC). In the traditional development process, security is often handled by a separate team at the end of the process. In this case, when vulnerabilities are discovered, it slows down the deployment and increases the cost of fixing issues.
 
diff --git a/src/data/guides/devops-career-path.md b/src/data/guides/devops-career-path.md
index e62988e5e..a891ab695 100644
--- a/src/data/guides/devops-career-path.md
+++ b/src/data/guides/devops-career-path.md
@@ -234,5 +234,5 @@ roadmap.sh offers step-by-step guidance on [how to become a DevOps engineer](htt
 
 - Keep track of your progress and also share it on your roadmap.sh profile.
 - Collaborate on other official roadmaps.
-- Draw your roadmap, either as an individual learner or for [Dev](https://roadmap.sh/teams) [t](https://roadmap.sh/teams)[eams](https://roadmap.sh/teams).
-- [Generate new roadmaps with AI](https://roadmap.sh/ai).
+- Draw your [roadmap](https://draw.roadmap.sh/), either as an individual learner or for [Dev](https://roadmap.sh/teams) [team](https://roadmap.sh/teams).
+- Generate new roadmaps with [AI](https://roadmap.sh/ai).
diff --git a/src/data/guides/devops-engineer.md b/src/data/guides/devops-engineer.md
index f5e305300..e58dd2fad 100644
--- a/src/data/guides/devops-engineer.md
+++ b/src/data/guides/devops-engineer.md
@@ -4,7 +4,7 @@ description: 'Explore the responsibilities and roles of a DevOps Engineer in @cu
 authorId: ekene
 excludedBySlug: '/devops/devops-engineer'
 seo:
-  title: 'What is a DevOps Engineer? Responsbilities & Roles in @currentYear@'
+  title: 'What is a DevOps Engineer? Responsibilities & Roles in @currentYear@'
   description: 'Explore the responsibilities and roles of a DevOps Engineer in @currentYear@. Gain insights into the evolving field of DevOps and what it takes to succeed.'
   ogImageUrl: 'https://assets.roadmap.sh/guest/what-is-devops-engineer-jort4.jpg'
 isNew: false
diff --git a/src/data/guides/devops-job-description.md b/src/data/guides/devops-job-description.md
new file mode 100644
index 000000000..c74143029
--- /dev/null
+++ b/src/data/guides/devops-job-description.md
@@ -0,0 +1,235 @@
+---
+title: 'DevOps Engineer Job Description [@currentYear@ Template]'
+description: 'Create the perfect DevOps Engineer job description with our @currentYear@ template, tailored to attract top talent in today''s tech landscape.'
+authorId: william
+excludedBySlug: '/devops/job-description'
+seo:
+  title: 'DevOps Engineer Job Description [@currentYear@ Template]'
+  description: 'Create the perfect DevOps Engineer job description with our @currentYear@ template, tailored to attract top talent in today''s tech landscape.'
+  ogImageUrl: 'https://assets.roadmap.sh/guest/devops-engineer-job-description-0xjml.jpg'
+relatedTitle: 'Other Guides'
+relatedGuidesId: 'devops'
+isNew: true
+type: 'textual'
+date: '2025-01-17'
+sitemap:
+  priority: 0.7
+  changefreq: 'weekly'
+tags:
+  - 'guide'
+  - 'textual-guide'
+  - 'guide-sitemap'
+---
+
+![DevOps engineer job description template](https://assets.roadmap.sh/guest/devops-engineer-job-description-0xjml.jpg)
+
+As businesses adopt agile practices to stay competitive, the demand for skilled DevOps professionals is on the rise. Hiring top talent starts with understanding their role and crafting a clear, compelling job description.
+
+To help you create the ideal profile, this guide draws insights from top job boards like Indeed, LinkedIn, and Glassdoor. It covers the key responsibilities, essential skills, and qualifications of a [DevOps engineer](https://roadmap.sh/devops). Use this template as your go-to resource for attracting the best candidates in the field.
+
+## DevOps engineer job description template
+
+A DevOps engineer ensures seamless collaboration between software development and IT operations to improve software delivery speed and system reliability. Here is a DevOps engineer job description template that highlights the essential skills and qualifications that hiring managers look for in potential candidates.
+
+**Job Title:** DevOps Engineer
+
+**Company:** [Add your company name]
+
+**Location:** [Specify your location]
+
+**Job Type:** Full-time or part-time
+
+**About Us:** [Provide company name and a quick summary of their achievements, history, and goals]
+
+**Job description**
+
+**[Company Name]** is looking for an experienced DevOps engineer with strong technical expertise in CI/CD pipelines, infrastructure automation, and cloud platforms, along with excellent collaboration and communication skills. The candidate should have hands-on experience with configuration management tools, a solid understanding of DevOps practices, and a working knowledge of internal backend systems. The ideal candidate will have the ability to coordinate and bridge gaps between the software developer and the operation team, ensuring a smooth workflow.
+
+**Responsibilities**
+
+DevOps engineer's responsibilities include:
+
+- Designing and maintaining continuous integration/continuous deployment pipelines to automate code testing and deployment
+- Tracking software performance, fixing errors, troubleshooting systems, implementing preventive measures for smooth workflows, and building automated processes
+- Optimizing cloud resources and implementing cost-effective solutions
+- Implementing and managing infrastructure using code rather than manual processes. Uses Terraform or CloudFormation for Infrastructure as Code (IaC) management
+- Collaborating between teams helps in resolving issues quickly and deploying new features smoothly
+- Monitoring and creating new processes based on performance analysis
+- Better management of the software development process and implementation of configuration management tools
+- Automating repetitive tasks to improve team efficiency
+- Implementing security best practices, including automated compliance checks and secure code deployment
+
+**Requirements**
+
+The candidate must fulfill the following requirements for the DevOps engineering job profile:
+
+- Hands-on experience with CI/CD tools
+- Good experience in infrastructure as code tools
+- Familiarity with monitoring and logging tools
+- Proficiency in Docker for packaging applications and Kubernetes for managing containers
+- Strong problem-solving and troubleshooting skills
+- Excellent communication and collaboration skills to ensure proper teamwork
+- Proficiency in scripting languages like Python, PowerShell, etc.
+- A Bachelor's degree in Computer Science, Engineering, or a related discipline, or equivalent industry experience
+
+For an entry-level DevOps engineer role, recruiters might look for:
+
+- Basic knowledge of DevOps tools, i.e., Git, Jenkins, and Docker
+- Familiarity with at least one programming language, such as Python or Go
+- Understanding of basic networking concepts
+- Willingness to embrace continuous learning and adoption of new tools
+
+**Nice to have**
+
+- Certification in cloud platforms like AWS certified DevOps engineer
+- Good knowledge of agile methodologies and practices
+
+**What we offer**
+
+Highlight what your company offers, such as competitive salary, health benefits, professional development opportunities, flexible work arrangements, or other perks.
+
+**How to apply**
+
+If you are interested in the DevOps engineer job profile, send your resume and cover letter to your selected company [insert email address] or apply through [insert application portal link].
+
+## Key DevOps engineer skills essential for job profile
+
+When recruiting a DevOps engineer, prioritize candidates with strong technical expertise, adaptability, and collaboration skills. DevOps requires bridging development and operations, so focus on individuals who excel in both technical problem-solving and teamwork.
+
+![Key DevOps engineer skills](https://assets.roadmap.sh/guest/key-devops-engineer-skills-essential-for-job-profile-qhr33.png)
+
+Let's explore the essential skills that make a strong DevOps engineer:
+
+### Technical skills
+
+A DevOps job description must showcase a strong technical background and knowledge of critical concepts. Future engineers must know how to maintain tools, perform root cause analysis, develop project management capabilities, etc. A DevOps engineer must possess the following technical skills:
+
+- **Proficiency with CI/CD tools:** Familiarity with CI/CD tools, such as Jenkins, GitLab CI/CD, or Bamboo, to automate build and deployment processes
+- **Coding and scripting skills:** Knowledge of programming languages like Python, Ruby, or Java, and scripting languages like Bash
+- **Cloud platform expertise:** Experience with AWS or Google Cloud platform for managing scalable infrastructure
+- **Containerization and orchestration:** Understanding of Docker and Kubernetes to deploy and manage containerized applications
+- **Version control systems:** Expertise in Git for code repository management and facilitating team collaboration
+
+### Cross-functional skills
+
+Cross-functional skills are essential for DevOps engineers to enable seamless collaboration across teams and departments. These skills help bridge the gap between technical and non-technical stakeholders for successful project outcomes, such as:
+
+- **Problem-solving:** DevOps engineers must have the ability to quickly identify and resolve system bottlenecks or failures
+- **Communication:** Strong communication skills to explain technical issues and collaborate effectively with multiple teams
+- **Collaboration:** DevOps engineers must have a team-oriented mindset to bridge gaps between development, operations, and business stakeholders
+
+Equipped with an understanding of the essential skills, the next step is evaluating candidates' familiarity with popular DevOps tools. Here's a quick guide to the tools recruiters should expect to see in job descriptions and interviews.
+
+## Common DevOps tools and technologies
+
+Candidates with experience in the following tools are often preferred, as they are essential for automating workflows and ensuring system reliability. Let's explore some of the most popular DevOps tools that are commonly included in job descriptions.
+
+![Common DevOps tools and technologies](https://assets.roadmap.sh/guest/common-devops-tools-and-technologies-dwrxx.png)
+
+### Jenkins
+
+Jenkins is a popular open-source automation server used for continuous integration and continuous delivery (CI/CD). It streamlines software testing and deployment, reducing manual effort and accelerating development cycles. Jenkins offers several features, including:
+
+- **Extensive plugin library:** Supports tools like Docker, Kubernetes, and Git for seamless integration
+- **Real-time feedback:** Alerts teams to failed builds, enabling early issue resolution
+- **Customizable pipelines:** Offers flexibility through domain-specific language (DSL) or GUI-based pipelines
+
+### Docker
+
+Docker is a containerization platform that packages applications and their dependencies into lightweight containers. These containers work seamlessly across different phases, from software development to production. Some of the key features of Docker are:
+
+- **Isolated environment:** Maintains reliable application performance across different underlying systems
+- **Faster deployment:** Enables quicker application deployment compared to traditional virtual machines
+- **Support for microservices architecture:** Facilitates modular development, making it easier to build, deploy, and scale microservices-based applications
+
+Discover additional use cases and strategies for [Docker](https://roadmap.sh/docker) in modern application development.
+
+### Kubernetes
+
+Kubernetes is an open-source orchestration platform for automating the deployment, scaling, and management of containerized applications. It works smoothly with Docker and other container runtimes to guarantee application reliability and scalability. Some standout features make Kubernetes a powerful choice, including:
+
+- **Automated scaling:** Dynamically allocates resources to accommodate fluctuating workloads
+- **Self-healing capabilities:** Automatically restarts failed containers or replaces unresponsive nodes to maintain application health
+- **Service discovery and load balancing:** Efficiently distributes traffic across services, improving resource utilization and application performance
+
+Learn how [Kubernetes](https://roadmap.sh/kubernetes) supports advanced DevOps workflows and container orchestration.
+
+### Terraform
+
+Terraform by HashiCorp is a tool for defining and provisioning infrastructure using declarative configuration files. This approach enables teams to automate the setup and management of cloud resources, maintaining consistency and reducing errors. Key features of Terraform include:
+
+- **Multi-cloud support:** Supports multiple cloud providers, including AWS, Google Cloud, etc.
+- **Version control:** Tracks infrastructure changes, enabling safe rollbacks and thorough audits
+- **Reusable modules:** Simplifies infrastructure management with reusable and shareable code
+
+Explore how [Terraform](https://roadmap.sh/terraform) empowers teams to manage modern infrastructure efficiently.
+
+### Git
+
+Git is a distributed version control system that allows developers to track code changes, collaborate on projects, and maintain a complete history of all modifications. Some of the key features of Git are:
+
+- **Branching and merging:** Enables developers to work on different tasks simultaneously
+- **Support for distributed workflows:** Enables offline work and seamless collaboration, providing flexibility for teams
+- **Platform integration:** Integrates with platforms like GitHub, GitLab, and Bitbucket to streamline project management
+
+### Prometheus and Grafana
+
+Prometheus and Grafana are often used together to monitor and visualize application performance.
+
+- **Prometheus:** A powerful open-source monitoring system designed for metrics collection and alerting. Features a robust query language (PromQL) for analyzing time-series data
+- **Grafana:** A visualization tool that creates interactive dashboards using data from Prometheus and other sources. Enables teams to monitor key metrics in real time
+
+Prometheus collects and stores metrics, while Grafana visualizes these metrics in customizable dashboards. This combination empowers teams to:
+
+- Track application performance in real time
+- Diagnose and resolve system issues efficiently
+- Set up alerts to ensure minimal downtime and maintain service reliability
+
+Equipped with knowledge about essential tools, it's time to explore career growth opportunities and roles within your organization that align with a DevOps engineer's expertise.
+
+## Growth opportunities and the importance of continuous learning
+
+By continuously building skills and staying ahead of industry trends, DevOps engineers can advance their careers and take on more strategic roles within an organization. 
+
+For hiring managers, understanding how these roles contribute to business outcomes is key to aligning talent acquisition strategies with organizational goals. By fostering career growth, organizations not only enhance employee satisfaction but also build a workforce capable of driving innovation and operational efficiency.
+
+A candidate can choose from the different career options available in the future, such as:
+
+### DevOps architect
+
+A [DevOps architect](https://roadmap.sh/devops/devops-engineer) is responsible for designing enterprise-level DevOps frameworks and strategies. This role involves creating scalable frameworks, integrating tools and processes, and aligning DevOps practices with business objectives.
+
+This role requires a deep understanding of cloud technologies, automation tools, and CI/CD pipelines to ensure seamless software delivery. DevOps architects also focus on enhancing collaboration among cross-functional teams and aligning technical initiatives with organizational goals. Their expertise helps businesses achieve faster deployments, improved quality, and greater operational efficiency.
+
+### Site reliability engineer (SRE)
+
+Site reliability engineers focus on maintaining system reliability and performance by leveraging automation and proactive monitoring. They develop robust recovery plans and address potential bottlenecks before they impact users.
+
+SREs minimize downtime and enhance user experience, ensuring high availability of critical systems and boosting customer satisfaction. Their expertise directly reduces operational risks and strengthens business continuity.
+
+### Cloud engineer
+
+Cloud engineers specialize in managing cloud infrastructure and optimizing cloud-based solutions. They oversee multi-cloud or hybrid cloud environments while implementing security measures to protect resources.
+
+Cloud engineers are well-versed in cloud providers like AWS or Google Cloud and work on automating resource provisioning, monitoring, and scaling to accommodate evolving business needs. They also play a crucial role in implementing cloud security measures and ensuring compliance with industry standards, enabling organizations to leverage the full potential of cloud technologies.
+
+### Consultant or advisor
+
+Consultants or advisors help organizations adopt DevOps best practices, select the right tools, and train teams to foster continuous improvement.
+
+They play a critical role in driving organizational transformation by aligning DevOps initiatives with business objectives and empowering software engineering and operation teams with the skills and strategies needed to achieve long-term success in a competitive landscape.
+
+IT dynamics are constantly changing, and staying relevant in the field of DevOps requires a commitment to continuous learning. Organizations that invest in the growth of their DevOps teams reap significant rewards:
+
+- **Retention of top talent:** Employees are more likely to stay with companies that support their professional growth. Offering opportunities for skill development, DevOps training, certifications, and career advancement fosters loyalty and reduces turnover
+- **Enhanced operational efficiency:** A well-trained DevOps team can implement cutting-edge tools and agile principles, improving workflow efficiency and reducing downtime. This directly translates to better product delivery and customer experience
+- **Attracting skilled candidates:** Highlighting growth opportunities in job descriptions makes the organization more appealing to skilled candidates. Professionals in this field actively seek DevOps engineer roles where they can grow and contribute better
+- **Fostering innovation:** This practice helps employees to experiment with new technologies and methodologies, driving innovation. Organizations encouraging this culture remain competitive and adaptive in a rapidly changing market
+
+## What next?
+
+To take the next step:
+
+- Use the above **DevOps engineer job description template** to simplify your hiring process
+- Explore our [**DevOps roadmap**](https://roadmap.sh/devops) for deeper insights into career paths and the skills that matter most
+- Join the [Discord community](https://roadmap.sh/discord) to stay informed about the latest updates and meaningful discussions
\ No newline at end of file
diff --git a/src/data/guides/devops-principles.md b/src/data/guides/devops-principles.md
index e4a4f6184..24cd7f8ef 100644
--- a/src/data/guides/devops-principles.md
+++ b/src/data/guides/devops-principles.md
@@ -57,7 +57,7 @@ Key components of this culture include shared responsibility, transparency, and
 
 ![Continuous Integration and Continuous Deployment](https://assets.roadmap.sh/guest/continous-development-vs-continuous-integration-l2fak.png)
 
-Continuous Integration (CI) and Continuous Deployment (CD) are central to DevOps principles. CI is the practice of frequently integrating code changes into a shared repository, ensuring that new code is automatically tested and validated. This practice helps catch bugs early, reducing the risk of introducing issues into the main codebase. CI allows devs and ops teams to work more efficiently, improving the overall quality of the software.
+Continuous Integration (CI) and Continuous Deployment (CD) are central to DevOps principles. CI is the practice of frequently integrating code changes into a shared repository, ensuring that new code is [automatically tested](https://roadmap.sh/devops/test-automation) and validated. This practice helps catch bugs early, reducing the risk of introducing issues into the main codebase. CI allows devs and ops teams to work more efficiently, improving the overall quality of the software.
 
 Continuous Deployment, on the other hand, takes things a step further by automatically deploying code changes to production once they pass the CI tests. This ensures that new features and bug fixes are delivered to users as quickly as possible. Together, CI and CD form a pipeline that streamlines the software development lifecycle, from code commit to production deployment in seconds (or in some cases, minutes).
 
@@ -139,7 +139,7 @@ Key tools for implementing GitOps include Argo CD and Flux. These tools help you
 
 ## 9\. Continuous Learning and Improvement
 
-![Continious Learning and Improvement](https://assets.roadmap.sh/guest/learn-improve-4fzcr.png)
+![Continuous Learning and Improvement](https://assets.roadmap.sh/guest/learn-improve-4fzcr.png)
 
 In general the world of tech is constantly evolving and changing and continuous learning and improvement are essential practices for staying ahead and relevant.
 
diff --git a/src/data/guides/devops-shift-left-testing.md b/src/data/guides/devops-shift-left-testing.md
index 675598874..7f60499db 100644
--- a/src/data/guides/devops-shift-left-testing.md
+++ b/src/data/guides/devops-shift-left-testing.md
@@ -41,7 +41,7 @@ Over the years, testing has been somewhat considered an afterthought of the deve
 
 The main idea is to move testing to the **left side** of the development process so that it can happen earlier and more often during the design and development phase.
 
-Shift-Left testing aligns with the DevOps principle of continuous integration and continuous delivery (CI/CD) because automated tests can be written alongside the code and executed as part of the development pipeline. This approach ensures that issues are caught early, developers receive immediate feedback, and overall software quality is improved.
+Shift-Left testing aligns with the DevOps principle of continuous integration and continuous delivery (CI/CD) because [automated tests](https://roadmap.sh/devops/test-automation) can be written alongside the code and executed as part of the development pipeline. This approach ensures that issues are caught early, developers receive immediate feedback, and overall software quality is improved.
 
 To implement Shift-Left testing, organizations often rely on a variety of automated testing tools. While the choice of tools may vary based on team preference and specific projects, below are some popular tools for performing Shift-Left testing:
 
diff --git a/src/data/guides/devops-skills.md b/src/data/guides/devops-skills.md
index d804ed4f3..d07bcf119 100644
--- a/src/data/guides/devops-skills.md
+++ b/src/data/guides/devops-skills.md
@@ -207,9 +207,9 @@ These patterns define how applications are structured and interact with cloud in
 * **Serverless Architecture**: Serverless computing allows developers to build and deploy applications without managing the underlying infrastructure. In a serverless architecture, code is executed in response to events, such as HTTP requests or changes in data, using services like **AWS Lambda**, **Azure Functions**, or **Google Cloud Functions**.
 * **Event-Driven Architecture**: In an event-driven architecture, applications respond to events in real-time, often using tools like **event streams** (e.g., Apache Kafka) and **message queues**.
 
-## 6\. Monitoring and Logging!
+## 6\. Monitoring and Logging
 
-[monitoring logging servers][https://assets.roadmap.sh/guest/monitoring-logging-servers-ztf1a.png]
+![monitoring logging servers](https://assets.roadmap.sh/guest/monitoring-logging-servers-ztf1a.png)
 
 Monitoring and logging are vital components of a robust DevOps strategy. They provide visibility into the health and performance of your systems, allowing you to detect issues early, troubleshoot, and ensure the reliability of your applications.
 
diff --git a/src/data/guides/devops-test-automation.md b/src/data/guides/devops-test-automation.md
new file mode 100644
index 000000000..7ecc1084c
--- /dev/null
+++ b/src/data/guides/devops-test-automation.md
@@ -0,0 +1,214 @@
+---
+title: 'DevOps Test Automation: How to accelerate software delivery'
+description: 'Want to deliver software faster? Dive into the power of DevOps test automation and transform your testing pipeline with proven techniques.'
+authorId: fernando
+excludedBySlug: '/devops/test-automation'
+seo:
+  title: 'DevOps Test Automation: How to accelerate software delivery'
+  description: 'Want to deliver software faster? Dive into the power of DevOps test automation and transform your testing pipeline with proven techniques.'
+  ogImageUrl: 'https://assets.roadmap.sh/guest/devops-test-automation-nvpbi.jpg'
+relatedGuidesTitle: 'Other Guides'
+relatedGuidesId: devops
+isNew: true
+type: 'textual'
+date: 2025-01-16
+sitemap:
+  priority: 0.7
+  changefreq: 'weekly'
+tags:
+  - 'guide'
+  - 'textual-guide'
+  - 'guide-sitemap'
+---
+
+![What is DevOps test automation?](https://assets.roadmap.sh/guest/devops-test-automation-nvpbi.jpg)
+
+Long gone are the days when putting a new feature into production meant 3 months of planning, coordination, and careful delivery. The industry has evolved into a new, faster, and more agile way of working.
+
+Instead of waiting for months before pushing something into production, companies are now able to do it multiple times a day, any day (even Fridays!).
+
+All of that is thanks to DevOps test automation, or in other words, thanks to the ability to include tests into the DevOps pipeline. That allows teams to confidently promote to production code that is tested and validated by a machine.
+
+How does that all work? Let’s dive in and I’ll explain it all.
+
+## What is DevOps Test Automation?
+
+DevOps test automation refers to the integration of automated testing into the DevOps pipeline to ensure that every piece of code is properly tested throughout the development lifecycle. It plays a vital role in achieving the speed and reliability that DevOps promises, helping teams deliver high-quality software faster. 
+
+Test automation removes the human factor from the process (at least from most of it) and eliminates the bottlenecks caused by manual testing by running tests more frequently, consistently, and at scale.
+
+### Manual Testing vs. Automated Testing
+
+Manual testing involves testers executing test cases step-by-step and verifying the results. It is valuable for tasks requiring human intuition, such as exploratory testing or evaluating user interfaces. However, these manual tests tend to be slow, labor-intensive, and inconsistent (we’re all human after all).
+
+Automated testing, on the other hand, uses scripts and tools to run tests automatically. This type of testing actually includes multiple different types of tests with unit tests being one of the most common ones (although there are alternatives, such as integration tests, e2e tests, etc). This approach offers several benefits:
+
+* **Speed**: Automated tests execute much faster than manual ones, after all, as long as the system can handle the input, your test will work.  
+* **Reliability**: Automated tests provide consistent results, eliminating human error.  
+* **Scalability**: Large test suites can be run efficiently, even across complex scenarios.  
+* **Reusability**: Test scripts can be reused across multiple projects and cycles.
+
+All of this has the potential to directly translate into faster feedback loops, higher test coverage, and more reliable software releases.
+
+### Key Components of DevOps Test Automation
+
+1. **Continuous Integration (CI):** Continuous Integration is a [DevOps](https://roadmap.sh/devops) practice where developers frequently merge their code changes into a shared repository. With each integration, an automated build and test process is triggered. The goals of CI include:  
+   * Catching issues early by testing incremental code changes.  
+   * Ensuring that new changes don’t break the existing codebase.  
+   * Reducing integration problems by addressing conflicts early and often.  
+2. **Continuous Delivery (CD):** Continuous Delivery ensures that the codebase is always in a deployable state. It extends CI by automating the deployment process to staging or production environments. The key principles of CD include:  
+   * **Automated Deployment Pipelines**: Using tools like Azure DevOps, AWS CodePipeline, or CircleCI (to name a few)  to deploy code with minimal manual intervention.  
+   * **Environment Consistency**: Ensuring that deployments work reliably across staging, testing, and production environments.  
+   * **Fast and Reliable Releases**: Enabling teams to ship new features and fixes to customers quickly and confidently.  
+3. **Continuous Testing:** Continuous Testing integrates automated testing throughout the development lifecycle, from development to deployment. It is designed to provide immediate feedback on the quality and risks of a release, ensuring that issues are detected and resolved early.  
+   Key aspects of Continuous Testing include:  
+   * **Test Coverage**: Automated tests cover unit, integration, API, performance, and end-to-end scenarios to ensure the entire application is tested.  
+   * **Early Risk Detection**: Running tests early in the pipeline to identify potential business risks associated with the release.  
+   * **Rapid Feedback**: Providing developers with actionable insights within minutes of a code change.
+
+### Why DevOps Test Automation Matters
+
+By combining CI, CD, and Continuous Testing into a cohesive DevOps strategy, organizations can accelerate delivery while maintaining high software quality. Test automation reduces the manual effort required for testing, provides faster feedback, and ensures that every code change is reliable and ready for production.
+
+## Challenges in DevOps Test Automation
+
+While DevOps test automation brings significant benefits, implementing and maintaining it comes with its own set of challenges. These problems usually come from cultural, technical, and operational complexities. 
+
+Here’s a closer look at some common challenges and how they impact DevOps teams:
+
+### Cultural and Organizational Barriers
+
+One of the biggest obstacles to successful DevOps test automation is resistance to change within the organization. DevOps relies on collaboration between development, testing, and operations teams, but traditional silos can make this difficult.
+
+For example, development and operations teams may have conflicting goals, such as speed versus stability. There might be a lack of shared ownership for testing that can lead to gaps in responsibility, effectively not having anyone owning the practice. 
+
+And finally, teams may resist adopting new tools or affecting the existing (and working) development lifecycle due to unfamiliarity or fear of disrupting established workflows.
+
+#### Strategies to Overcome
+
+Consider fostering a collaborative culture by promoting shared goals and open communication. Make sure to provide training and resources to help teams adapt to new tools and methodologies, this will lower the entry barrier and show how new tools and practices actually can improve existing processes.
+
+In the end, encourage leadership to advocate for DevOps practices, emphasizing their long-term value to the organization. 
+
+### Tool Integration and Maintenance
+
+DevOps pipelines often rely on a diverse set of tools for version control, CI/CD, test automation, and deployment. Integrating these tools into a cohesive workflow can be difficult, especially when dealing with legacy systems or custom applications.
+
+If you’re not careful during the tool selection process, or if you just don’t have control over it, you might end up in a situation where these tools may not seamlessly integrate with each other, leading to broken pipelines or data silos.
+
+On the other hand, even if they do work well together, maintaining automated test scripts can be time-consuming, especially as applications evolve.
+
+And finally, frequent updates to tools or frameworks can potentially introduce compatibility issues.
+
+#### Strategies to Overcome
+
+If you have the ability to pick or change existing solutions, make sure to use platforms like Jenkins, Azure DevOps, or GitLab that support a wide range of integrations.
+
+Try to adopt modular test automation frameworks to simplify script maintenance. Remember to handle this code like you would the code of any large software project. 
+
+And while you’re at it, if you want to avoid the build-up of technical debt in your toolchain, try to regularly review and update toolchains to ensure compatibility.
+
+### Scalability and Performance Issues
+
+As applications grow in complexity and user bases expand, test automation frameworks must scale to handle increased workloads. However, ensuring scalability while maintaining performance is not a trivial task.
+
+These frameworks will struggle to handle large test suites or datasets, causing either tests to run slow, or even crash for reasons completely unrelated to the code they’re testing. If you’re not careful, performance bottlenecks can occur when running tests on shared resources potentially affecting the main system through your tests.
+
+#### Strategies to Overcome
+
+At this stage, you have to be smart about how you implement testing. Consider using parallel test execution to reduce overall test runtime.
+
+Use cloud-based testing platforms like Sauce Labs or BrowserStack to scale testing infrastructure dynamically and much faster for a fraction of the price you’d have to pay if you were to do it yourself.
+
+Finally, optimize test suites by removing redundant or outdated tests and prioritizing high-impact cases. In other words, consider that some types of tests might be better off applied to only a portion of your app (key features) instead of testing the entire system.
+
+### Choosing the Right Test Automation Tool
+
+Test automation tools form the backbone of successful automation testing strategies. The right tools can simplify workflows, improve test coverage, and ensure seamless integration with your CI/CD pipeline. 
+
+Now the question is: how do you pick the right automation tool for you? 
+
+#### Key considerations when choosing tools
+
+Not every tool is going to be good for you, either because of technical incompatibilities, skill issues from your team, or just budget constraints. So make sure to apply the following 5 principles when deciding on the best automation tools for your project:
+
+1. **Compatibility with Your Tech Stack**: Ensure the tool supports the programming languages, frameworks, and platforms your team uses. For example, if you develop web applications in JavaScript, tools like Cypress or Playwright may be a good fit.  
+2. **Integration with CI/CD Pipelines**: Tools should integrate smoothly with CI/CD platforms like Jenkins, GitLab, Azure DevOps, or CircleCI to enable automated testing as part of your pipeline.  
+3. **Ease of Use and Learning Curve**: Select tools that align with your team’s expertise or offer a low learning curve. Open-source tools with robust documentation and community support can accelerate adoption.  
+4. **Scalability and Performance**: Tools must handle increasing complexity and volume as your test suites and applications grow.  
+5. **Cost and Licensing**: Assess the budget and licensing model. Many open-source tools offer powerful capabilities without added costs, but commercial tools may provide enhanced features or enterprise support.
+
+#### Popular Options
+
+While the following is not an exhaustive list, it’s a great starting point if you’re looking for the right tools and you can’t decide where to start.
+
+1. **Web Application Testing**:  
+   * **Selenium**: A widely-used open-source tool for browser automation. It supports multiple programming languages and browsers.  
+   * **Cypress**: Known for its fast execution and user-friendly interface, Cypress is ideal for modern web applications.  
+   * **Playwright**: Developed by Microsoft, Playwright excels at end-to-end testing across multiple browsers and platforms.  
+2. **API Testing**:  
+   * **Postman**: Offers a simple interface for creating and executing API tests, with support for automation.  
+   * **RestAssured**: A Java-based tool for testing RESTful web services, integrated easily into Java projects.  
+   * **SoapUI**: Useful for testing both REST and SOAP APIs, with enterprise-level capabilities.  
+3. **Mobile Testing**:  
+   * **Appium**: Open-source and versatile, Appium supports testing for native, hybrid, and mobile web apps across iOS and Android.  
+   * **XCUITest/Espresso**: Native tools for iOS and Android testing, offering deep integration with the respective ecosystems.  
+4. **Performance Testing**:  
+   * **JMeter**: Open-source and widely used for load and performance testing of applications, particularly web and API testing.  
+   * **Gatling**: A tool focused on high-performance and scalability testing, ideal for developers.  
+5. **Test Management and Reporting**:  
+   * **TestRail**: A comprehensive tool for test case management, tracking, and reporting.  
+   * **Allure Report**: An open-source reporting tool that integrates with test automation frameworks to provide detailed insights.
+
+## Best Practices for Effective DevOps Test Automation
+
+Successfully implementing DevOps test automation requires addressing challenges with proactive strategies and best practices. These practices help teams build a strong foundation for collaboration, skill development, and process improvement. Let’s take a closer look at the key actions organizations can take:
+
+### Foster a collaborative culture
+
+DevOps thrives on the seamless collaboration between development, testing, and operations teams. In fact, it depends on it. A lack of alignment can slow down progress and reduce the effectiveness of test automation.
+
+We can encourage that collaboration by promoting cross-functional teams (as opposed to vertical teams working in isolation from each other with their own individual priorities) where responsibilities are shared, and everyone is invested in testing and quality.
+
+Fostering that sense of belonging to a greater group by holding regular meetings or retrospectives to discuss challenges, share insights, and align goals.
+
+Finally, using collaborative tools like Jira, Slack, or Confluence to ensure transparent communication and knowledge sharing.
+
+### Invest in Training and Skill Development
+
+Test automation tools and frameworks often require specialized knowledge, and a lack of expertise can hinder adoption. Ensuring team members have the necessary skills is critical for long-term success. The good news is that skills can be trained and developed over time. So let’s take a look at some ideas to grow them.
+
+The most obvious one is to conduct workshops and training sessions on test automation tools like Selenium, Cypress, or Appium. That way you update your teams about the latest trends in the industry while at the same time, providing them with practical knowledge they can then, turn around, and apply to their own projects.
+
+Certifications are also a fantastic way to skill up from the “official” sources. Who better to teach your team how to use a product than those who can certify you on it? So make sure to encourage team members to obtain certifications in DevOps practices and tools.
+
+Finally, you can also provide access to online learning platforms such as Coursera, Pluralsight, or Udemy for self-paced learning.
+
+Investing in skill development empowers teams to use automation tools effectively, leading to higher productivity and better results.
+
+### Select Appropriate Tools and Frameworks
+
+The success of test automation depends heavily on choosing the right tools and frameworks. Tools that align with your technology stack and organizational needs will simplify implementation and reduce maintenance overhead.
+
+So make sure to assess the compatibility of tools with your existing technology stack (e.g., programming languages, CI/CD systems). Prioritize tools with strong community support and regular updates, such as Jenkins, Selenium, or TestNG.
+
+Opt for tools that offer integrations with your DevOps pipeline to streamline workflows, the more out-of-the-box integrations you can get, the better.
+
+### Monitor and Optimize Test Automation Processes
+
+Contrary to popular belief, implementing test automation is not a one-time task. Continuous monitoring and improvement are necessary to ensure that your processes remain efficient and effective as your application and pipeline evolve. In other words, stay on top of your testing process, pick up on problems as soon as they show up on your radar and implement some of the following best practices.
+
+First things first, make sure to use metrics like test coverage, execution time, and defect detection rates to evaluate effectiveness. Compare those values release after release to understand the evolution of your project’s organization.
+
+If monitoring is what you’re looking for, then consider implementing dashboards for real-time visibility into test automation performance.
+
+Regularly review test cases to eliminate redundant or outdated ones, focusing on high-priority scenarios.
+
+And of course, try to gather feedback from developers and testers to identify pain points and opportunities for improvement.
+
+## Conclusion
+
+DevOps test automation is a cornerstone of modern software development, enabling organizations to accelerate software delivery without compromising quality. By integrating automated testing into the development lifecycle, teams can identify and resolve issues early.
+
+To fully realize its benefits, organizations must address challenges such as cultural barriers, tool integration, and scalability. By fostering collaboration, investing in training, choosing the right tools and keeping a close eye on your processes, you’ll start seeing how those KPIs start moving over time, showing a clear improvement over your current operations speed.
+
diff --git a/src/data/guides/devops-tools.md b/src/data/guides/devops-tools.md
index 468804bb0..1c0be420b 100644
--- a/src/data/guides/devops-tools.md
+++ b/src/data/guides/devops-tools.md
@@ -27,7 +27,7 @@ Choosing the right DevOps tools can make a significant difference in how effecti
 
 This article is designed to help development and operations teams (and their organizations) navigate the landscape of DevOps tools, from the most essential to advanced and pro-level solutions.
 
-Whether you are just [starting with DevOps](https://roadmap.sh/devops) or looking to enhance your existing processes, this guide will provide clear and practical information to support your decision-making.
+Whether you are just starting with [DevOps](https://roadmap.sh/devops) or looking to enhance your existing processes, this guide will provide clear and practical information to support your decision-making.
 
 Throughout this article, we’ll cover and evaluate the following technologies:
 
diff --git a/src/data/guides/devops-vs-agile.md b/src/data/guides/devops-vs-agile.md
new file mode 100644
index 000000000..e11c95898
--- /dev/null
+++ b/src/data/guides/devops-vs-agile.md
@@ -0,0 +1,204 @@
+---
+title: 'DevOps vs Agile Methodology: Key Differences & Applications'
+description: 'Explore the contrasts between DevOps and Agile: Understand their principles, differences, and how to apply them effectively in projects.'
+authorId: ekene
+excludedBySlug: '/devops/vs-agile'
+seo:
+  title: 'DevOps vs Agile Methodology: Key Differences & Applications'
+  description: 'Explore the contrasts between DevOps and Agile: Understand their principles, differences, and how to apply them effectively in projects.'
+  ogImageUrl: 'https://assets.roadmap.sh/guest/devops-vs-agile-methodology-tlxj8.jpg'
+relatedTitle: 'Other Guides'
+relatedGuidesId: 'devops'
+isNew: true
+type: 'textual'
+date: '2025-01-17'
+sitemap:
+  priority: 0.7
+  changefreq: 'weekly'
+tags:
+  - 'guide'
+  - 'textual-guide'
+  - 'guide-sitemap'
+---
+
+![DevOps vs Agile Methodology](https://assets.roadmap.sh/guest/devops-vs-agile-methodology-tlxj8.jpg)
+
+Agile and DevOps are modern approaches organizations use to tackle some of the most complex challenges in software engineering. Whether used to complement each other or as separate methodologies, they can be tricky to define, and the line between the two often appears blurred.
+
+Both [DevOps](https://roadmap.sh/devops) and Agile are designed to help organizations build robust software. But when should you choose one over the other? Which approach works best for your project? Can you combine them effectively to maximize their benefits?
+
+Having worked as an engineer on projects of all sizes, I've experienced firsthand how Agile and DevOps shape workflows and outcomes. In this guide, I'll discuss their core principles, key differences, and practical use cases to help you decide which approach fits your needs.
+
+## DevOps vs. Agile: Core values and goals
+
+**Agile** is a project management and software development approach that breaks down the project into several dynamic phases, **known as sprints**, rather than completing an entire project at once. This approach enables teams to adapt to changes quickly, continuously improve the delivery pipeline, and stay focused on meeting customer needs.
+
+It was born from the [Agile Manifesto](https://agilemanifesto.org/) in 2001 as a response to the challenges faced with traditional project management models like the Waterfall method, which often leads to delay, rigidness, and disconnects between customers' demands and what developers have built.
+
+![Agile timeline](https://assets.roadmap.sh/guest/agile-timeline-174xo.png)
+
+The core values of Agile methodologies are:
+
+1. **Individual over processes and tools**: To prioritize human communication and collaboration across cross-functional teams rather than working independently.
+2. **Responding to change over following a plan**: To embrace changing requirements at every stage of the development process. The flexibility allows the team to quickly change workflow and strategies without derailing the entire project.
+3. **Customer collaboration over contract negotiation**: To incorporate continuous customer feedback and use it to shape the project deliverables and align the outcome.
+4. **Working software over comprehensive documentation**: To ensure that the software that Agile teams develop works effectively, while additional tasks like documentation should not take center stage in the development process.
+
+When you use Agile in your application development or other types of software development process, it offers numerous benefits, such as:
+
+- Responding quickly to market changes and customer feedback.
+- Improving collaboration by fostering open communication, frequent iterations, and shared ownership.
+- Increasing customer satisfaction throughout the development process.
+- Enhancing quality through frequent reviews and continuous testing.
+- Empowering teams to innovate and solve problems creatively.
+
+**DevOps,** on the other hand, is a set of tools, practices, and a cultural philosophy that bridges the gap between development (Dev) and operations (Ops) to enhance the delivery pipelines. It emphasizes automation, continuous integration/continuous delivery (CI/CD), and monitoring to ensure rapid and reliable software deployment.
+
+![DevOps timeline](https://assets.roadmap.sh/guest/devops-timeline-f5wbv.png)
+
+DevOps evolved as an extension of Agile to solve the bottleneck around operations, particularly in deployment, releases, and post-production maintenance. Its core values focus on:
+
+1. **Collaboration and communication**: Foster a culture where developers, IT operations teams, QA teams, and other stakeholders actively collaborate and communicate throughout the development process.
+2. **Automation**: Increase efficiency and minimize errors by automating repetitive tasks like testing, deployment, and infrastructure provisioning.
+3. **Continuous Integration and Continuous Delivery (CI/CD)**: Implement automated pipelines to test, integrate, and deploy code quickly and reliably.
+4. **Metrics and monitoring**: Use real-time monitoring and analytics to identify issues, optimize performance, and asses system health.
+5. **Customer-centric focused**: Center development and operations processes around delivering value to customers with high-quality releases that meet their needs.
+6. **Continuous improvement**: Establish a culture of seeing the DevOps process as not a one-time thing but rather a continuous process that promotes a feedback loop and learns from success and failure.
+7. **Infrastructure as Code (IaC)**: Treat infrastructure provisioning and maintenance as code to enable version control, scalability, and reproducibility.
+
+When you adopt DevOps in your development process, it offers numerous benefits, such as:
+
+- Accelerating software releases with streamlined processes and automation.
+- Reducing operational costs through efficient workflows and fewer bottlenecks.
+- Improving software quality with automated testing to reduce bugs and enhance reliability.
+- Resolving issues faster using continuous monitoring and real-time system insights.
+- Enhancing security by integrating security practices into the development lifecycle (DevSecOps).
+- Gaining a competitive advantage through faster innovation and the ability to adapt quickly to market changes.
+
+Both DevOps and Agile offer numerous benefits that help you and your team build robust and scalable applications. But when should you choose one over the other? And what types of projects are best suited for each approach?
+
+Let's dive into their usage and application next.
+
+## Identifying when to use Agile vs. DevOps
+
+The table below summarizes when to use Agile and DevOps:
+
+| **Aspect**               | **When to Use Agile**                                                     | **When to Use DevOps**                                                       |
+| ------------------------ | ------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
+| **Focus**                | Building software step by step, improving as you go.                      | Combining development and operations for faster and smoother delivery.       |
+| **Team Structure**       | Small teams working closely together, focusing on quick updates.          | Developers and operations teams working as one from start to finish.         |
+| **Goal**                 | Deliver small, working parts of the project quickly and get feedback.     | Deliver updates quickly and keep systems running smoothly.                   |
+| **When Changes Happen**  | Use Agile when project needs are likely to change often.                  | Use DevOps to handle changes quickly without breaking the system.            |
+| **Project Size**         | Good for small to medium projects where teamwork and flexibility are key. | Good for large or complex projects where automation and speed are important. |
+| **Release Timing**       | Use Agile when you want planned updates (e.g., every two weeks).          | Use DevOps when updates need to be released continuously.                    |
+| **Tools and Automation** | Relies on planning tools like boards or trackers, with some automation.   | Uses lots of automation tools to test, deploy, and monitor systems.          |
+| **Customer Involvement** | Use Agile when you need frequent feedback from customers.                 | Use DevOps when customers expect reliable and fast updates.                  |
+| **Example Projects**     | Developing a new app or adding new features to a product.                 | Running large systems or releasing updates to software quickly and often.    |
+
+## Focus
+
+If your workflow is to develop software in small, manageable parts, Agile will be ideal for you. For example, if you're developing a new application, you can release the core features first, get feedback, and add more functionality over time.
+
+DevOps, on the other hand, is perfect for delivering software quickly and maintaining its stability. For example, if you're managing a large-scale ticketing platform, DevOps ensures updates without downtime.
+
+## Team structure
+
+Agile works well with small teams of developers, designers, and testers where everyone can collaborate closely. For instance, if you're building a product for a startup, Agile methodology guarantees everyone is aligned.
+
+In contrast, DevOps facilitates collaboration between development and operations teams to manage the entire process, from writing code to running in production.
+
+## Project size and change frequency
+
+Agile is well-suited for small to medium projects that want to launch their minimum viable product (MVP) or add new features to an existing platform that accounts for customers' needs along the way. 
+
+DevOps, in contrast, is good for large or complex projects that involve infrastructure, automation, and scalability.
+
+## Project delivery
+
+Agile uses sprint (a time-boxed iteration) for planned updates, which makes it ideal for projects that deliver new features frequently (e.g., every two weeks). Agile helps you stay organized and on schedule.
+
+DevOps doesn't use intervals like Agile, and it allows you to release updates as soon as they're ready.
+
+## Customer involvement
+
+Agile works best when you need regular feedback from the customer at every stage of the development. In contrast, DevOps is better suited for scenarios where customers prioritize fast responses and high uptime.
+
+## Usage of tools and automation
+
+Agile keeps things simple by using tools like Jira and Trello to focus on planning and collaboration rather than heavy automation in DevOps, which relies on tools like Jenkins, Docker, and others that automate testing, deployment, and monitoring.
+
+| **Agile**                       | **DevOps**                 |
+| ------------------------------- | -------------------------- |
+| Jira (project management)       | Jenkins (CI/CD automation) |
+| Trello (task tracking)          | Docker (containerization)  |
+| Confluence (team collaboration) | Kubernetes (orchestration) |
+
+As a rule of thumb, use the summary table below to decide when starting a new project or expanding existing ones.
+
+| **Factor**                                     | **Agile** | **DevOps** |
+| ---------------------------------------------- | --------- | ---------- |
+| **Small, cross-functional teams?**             | ✅ Yes     | ❌ No       |
+| **Large teams requiring IT operations?**       | ❌ No      | ✅ Yes      |
+| **High variability in project complexity?**    | ✅ Yes     | ❌ No       |
+| **Multi-stage delivery pipelines?**            | ❌ No      | ✅ Yes      |
+| **Rare updates (deployment frequency)?**       | ✅ Yes     | ❌ No       |
+| **Frequent releases (deployment frequency)?**  | ❌ No      | ✅ Yes      |
+| **Need for automation (CI/CD or monitoring)?** | ❌ No      | ✅ Yes      |
+
+## Hybrid Situations: Combining Agile and DevOps
+
+In complex projects, blending Agile's adaptability with DevOps' automation and deployment efficiency can produce the best results for you and your team. Below are some use cases where adopting both methodologies proves most beneficial:
+
+- Large enterprise applications
+- Mobile application development
+- Microservices architecture
+- Artificial Intelligence (AI) and Machine Learning (ML) projects
+
+**Large enterprise applications**
+
+If you're building a large enterprise application, you can break down feature development into smaller tasks and prioritize them in sprints using Agile. At the same time, DevOps helps maintain smooth delivery without downtime by automating testing, integration, and deployment. For instance, if you're managing a video streaming service, you can use Agile to plan features like personalized recommendations and DevOps to deploy them continuously to users.
+
+**Mobile application development**
+
+Mobile app development and maintenance involve fixing bugs, adding new features, and ensuring compatibility with new devices. Agile software development methodology can streamline feature iterations, while DevOps facilitates rapid updates across app stores. For instance, if you're building a fintech app that demands rapid feature development alongside robust security and reliability, Agile can help you build and iterate features efficiently. Meanwhile, DevOps can automate compliance checks, testing, and secure deployments to maintain quality and trust.
+
+**Microservices architecture**
+
+Microservices involves breaking down applications into smaller, independent services that can be developed and deployed separately. This approach aligns closely with Agile, as you can enable development teams to manage individual services, while DevOps facilitates seamless integration between these services and delivery.
+
+**AI and ML projects**
+
+Training, testing, and deploying AI models is an iterative process essential for keeping the system up to date. Agile practices can help you manage the iterative development of models and features, while DevOps can automate the deployment pipelines for updates and ensure effective monitoring in production.
+
+The faster deployment cycles, higher customer satisfaction, and stable releases achieved through the combination of Agile and DevOps stem from the shared values between these software development methodologies. Let's explore these similarities further.
+
+## Similarities between Agile and DevOps
+
+Agile and DevOps are distinct methodologies, but they share some similarities in their goals, approaches, and principles for software development process and delivery. Below are some key similarities between Agile and DevOps:
+
+![Agile and DevOps Similarities](https://assets.roadmap.sh/guest/similarities-between-agile-and-devops-9c79k.png)
+
+- Both emphasize collaboration between developers, testers, and other stakeholders to break down silos and foster teamwork.
+- They prioritize delivering value to customers.
+- Both advocate for working in smaller chunks rather than completing the project in one big cycle.
+- They align in their focus on shortening the development cycles and reducing the time to market.
+- Both promote continuous learning and process optimization.
+- Both encourage the use of automation tools to enhance processes and reduce manual tasks.
+- Both Agile and DevOps cultures require a shift towards openness and shared responsibility.
+
+While Agile and DevOps share common similarities, they also differ in focuses, principles, and practices. Let's explore these differences next.
+
+## Differences between Agile and DevOps
+
+Below are some key differences between Agile and DevOps:
+
+- Agile primarily focuses on the development phase with an emphasis on iterative development and continuous feedback, while DevOps focuses on the entire software lifecycle by bridging the gap between development and operations.
+- Agile's core principle is customer-centric and welcomes changing requirements even late in the development process, while DevOps principle is to automate repetitive tasks, strive for efficiency in the delivery pipeline, and maintain reliable systems.
+- The approach Agile uses to measure success is through speed, quality of software development, and customer satisfaction. DevOps, on the other hand, uses metrics like deployment frequency, mean time to recovery (MTTR), lead time for changes, and system reliability.
+- Agile promotes a culture of collaboration and adaptability among the development team, while DevOps promotes a culture of shared responsibility and accountability across the development and operations team.
+
+## Next steps
+
+Agile and DevOps differ in their approaches, addressing distinct aspects of software delivery. Agile is best suited for small to medium projects that change frequently and require a high degree of adaptability. In contrast, DevOps excels in medium to large projects where efficiency and reliability are paramount. Ultimately, the approach you choose depends on factors such as project complexity, release frequency, and team size.
+
+If you're considering adopting DevOps at any stage of your development process, explore our comprehensive [DevOps roadmap](https://roadmap.sh/devops) for actionable steps and valuable resources to get started.
\ No newline at end of file
diff --git a/src/data/guides/devops-vs-developer.md b/src/data/guides/devops-vs-developer.md
index 07bf43585..0ed79c988 100644
--- a/src/data/guides/devops-vs-developer.md
+++ b/src/data/guides/devops-vs-developer.md
@@ -7,7 +7,7 @@ seo:
   title: 'DevOps Vs. Developer: What Are The Key Differences?'
   description: 'Understand the differences between DevOps and Developer roles. Find out which career aligns with your skills and future goals.'
   ogImageUrl: 'https://assets.roadmap.sh/guest/devops-vs-developer-yv25p.jpg'
-isNew: true
+isNew: false
 relatedGuidesTitle: 'Other Guides'
 relatedGuidesId: devops
 type: 'textual'
diff --git a/src/data/guides/devops-vs-devsecops.md b/src/data/guides/devops-vs-devsecops.md
new file mode 100644
index 000000000..6627eb76e
--- /dev/null
+++ b/src/data/guides/devops-vs-devsecops.md
@@ -0,0 +1,231 @@
+---
+title: 'DevOps vs DevSecOps: Key Differences and Best Fit'
+description: 'DevOps vs DevSecOps: Learn the key differences, benefits, and how to choose the best approach for your needs and applications.'
+authorId: ekene
+excludedBySlug: '/devops/vs-devsecops'
+seo:
+  title: 'DevOps vs DevSecOps: Key Differences and Best Fit'
+  description: 'DevOps vs DevSecOps: Learn the key differences, benefits, and how to choose the best approach for your needs and applications.'
+  ogImageUrl: 'https://assets.roadmap.sh/guest/devops-vs-devsecops-3drth.jpg'
+relatedTitle: 'Other Guides'
+relatedGuidesId: 'devops'
+isNew: true
+type: 'textual'
+date: '2025-01-17'
+sitemap:
+  priority: 0.7
+  changefreq: 'weekly'
+tags:
+  - 'guide'
+  - 'textual-guide'
+  - 'guide-sitemap'
+---
+
+![DevOps vs DevSecOps comparison guide](https://assets.roadmap.sh/guest/devops-vs-devsecops-3drth.jpg)
+
+Over the years, the demand for high-quality software and resilient systems has grown significantly. Businesses are under immense pressure to deliver software faster than ever. However, rushing development often comes with trade-offs, such as increased security risks that can compromise entire systems.
+
+Traditional development practices struggled to keep up with the need for both speed and security, creating a critical challenge for organizations. To address the challenge of balancing rapid software delivery with the need for robust security and quality, two models were introduced: DevOps and DevSecOps.
+
+[DevOps](https://roadmap.sh/devops/devops-engineer) focuses on streamlining the development and operations lifecycle to deliver software quickly. DevSecOps integrates security practices into the DevOps pipeline, prioritizing security from the start and throughout the entire development process.
+
+In this blog, you will learn about the main purpose and role of DevOps and DevSecOps. You will also explore a comparison between the two, helping you determine which approach is right for your needs. Understanding the key differences and benefits is essential to choosing the right model, so keep reading!
+
+Below is a quick comparison table of DevOps vs. DevSecOps for easier reference:
+
+![DevOps vs DevSecOps](https://assets.roadmap.sh/guest/comparison-table-of-devops-vs-devsecops-wcai5.png)
+
+## DevOps vs DevSecOps: How are they different?
+
+Choosing between DevOps and DevSecOps can determine whether your software is fast—or secure from the start.
+
+While both approaches aim to enhance collaboration and efficiency in software development, DevSecOps incorporates security practices early in the development cycle, unlike DevOps, which often addresses security issues at a later stage.
+
+DevOps is primarily focused on improving collaboration between design, development, and operations teams to speed up software delivery. The core idea is to remove bottlenecks and inefficiencies in the development pipeline. DevOps engineers are skilled in coding, automation, and system administration, and they focus on delivering high-quality software with minimal errors, often through continuous integration and continuous delivery (CI/CD).
+
+![Understanding DevOps vs DevSecOps](https://assets.roadmap.sh/guest/understanding-devops-vs-devsecops-v9tkn.png)
+
+On the other hand, DevSecOps brings security into the equation by integrating cybersecurity practices throughout the development process. This approach arose to address increasing cyber threats by embedding security checks at every phase of the software development lifecycle (SDLC). While DevOps ensures quick software delivery, DevSecOps emphasizes secure and compliant software delivery by shifting security considerations to the left of the development timeline, ensuring that vulnerabilities are detected early.
+
+## Security in DevOps vs. DevSecOps: A Closer Look at Processes and Tools
+
+One of the key differences between DevOps and DevSecOps lies in how they handle security.
+In DevOps workflows, security testing typically occurs near the end of the development cycle, during quality assurance or post-deployment. Security measures, such as patches or vulnerability scanning, are often applied as part of the release process. This can result in delayed launches or costly remediation efforts if critical issues are discovered late in the pipeline.
+
+![Role of security in DevOps and DevSecOps](https://assets.roadmap.sh/guest/role-of-security-rj7j1.png)
+
+DevSecOps, on the other hand, focuses on strengthening deployment security and maintaining data protection and compliance by tracking issues as they arise. This approach uses both shift-left and shift-right security testing strategies. Shift-left testing involves identifying security vulnerabilities early in the development process, even before code is merged. 
+
+Tools like static application security testing (SAST), dynamic application security testing (DAST), and dependency checkers are embedded into CI/CD pipelines to catch publicly disclosed vulnerabilities. Additionally, automated scanners and code analyzers ensure that potential risks are flagged before reaching production.
+
+For example, in a DevOps environment, a team may identify security vulnerabilities only after a routine code audit or during the final phase of testing. However, in a DevSecOps setup, automated security checks would be integrated into the CI/CD pipeline, flagging issues in real time before code is deployed, saving time and mitigating risks.
+
+### Shift-Left and Shift-Right Strategies
+
+[Shift-left security](https://roadmap.sh/devops/shift-left-testing) is a key component of DevSecOps. With early security testing (shift-left security), DevSecOps helps identify risks and prevent product compromise. Addressing errors during the production phase is far more cost-effective than fixing them after deployment. Additionally, continuous security testing reinforces compliance with industry standards.
+
+A real-world example of the consequences of delayed security integration is the [2017 Equifax data breach](https://archive.epic.org/privacy/data-breach/equifax/). A known vulnerability in the Apache Struts framework was left unpatched, resulting in the exposure of sensitive customer data for over 147 million people. Had shift-left security practices been in place, experts could have flagged the outdated library during the early stages of development and prevented breach.
+
+Shift-right testing is equally important as it helps developers detect security threats and fix issues in real time. Delays in security threat detection can impact product integrity and customer trust.
+
+For instance, imagine your organization is working on financial application design and creation, in which security processes and tests are supposed to run during the final phase. 
+
+In such a case, issue detection at the final phase can result in a product launch delay. This might also result in higher costs. And if, to avoid a launch delay, you introduce the product, the unresolved vulnerabilities can hamper your reputation and erode customer trust.
+
+DevSecOps understands the impact of security issues and thus recommend implementing shift-left and shift-right strategies that help reduce vulnerabilities and achieve faster time to market, thus saving your organizational reputation and customer trust.
+
+## How DevOps and DevSecOps affect business goals?
+
+DevOps and DevSecOps affects several key business such as time to market, customer satisfaction, operational efficiency and risk management. Here's how they affect these goals.
+
+1. **Time to market**
+
+DevOps speeds up product delivery by automating workflows, removing bottlenecks and enabling faster iterations. DevSecOps puts the necessary checks in place without derailing development timelines so businesses can maintain a regular release cadence and meet market demand.
+
+2. **Customer satisfaction**
+
+DevOps delivers frequent updates and new features to keep up with customer demand and improve user experience. DevSecOps builds on this by delivering secure and reliable products, reducing the risk of issues that will frustrate users. Both speed and reliability increases customer trust and loyalty.
+
+3. **Operational efficiency**
+
+DevOps makes tasks more efficient by removing duplication, eliminating manual intervention. DevSecOps adds to this by addressing risks early, avoiding rework or operational downtime. Together they reduce development costs and increase productivity.
+
+4. **Risk management**
+
+DevOps allows for faster iterations and deployments which can introduce risks if not managed properly. DevSecOps mitigates these risks by making security a core part of the development lifecycle. This proactive approach reduces the chance of breaches or compliance issues and protects the business's reputation and financials.
+
+## Core processes in DevOps and DevSecOps
+
+To accelerate the software development lifecycle, DevOps gives more attention to automation and collaboration. Monitoring in DevOps primarily focuses on performance, availability, and system uptime. Metrics like CPU utilization, application response times, and log aggregation form the foundation of DevOps monitoring strategies. Incident response, while essential, is reactive in nature—triggered only after an issue, such as a system crash or performance degradation, arises.
+
+DevSecOps runs security tests in all stages, thus adopting a more proactive approach. Continuous monitoring in DevSecOps goes beyond traditional metrics to include threat detection, vulnerability scanning, and compliance checks, focusing more on reducing risk and cost. They even use tools like SIEM (Security Information and Event Management) systems and cloud-native security platforms to detect threats in real time. Incident response in DevSecOps involves automated playbooks and AI-driven analysis to address vulnerabilities, often before they can escalate rapidly. 
+
+In fact, DevSecOps even employs SAST and DAST strategies that help identify security vulnerabilities faster. Under SAST, professionals scans source code early to prevent vulnerabilities from entering production. Some of the common SAST tools are [SonarQube](https://www.sonarsource.com/products/sonarqube/) and [Checkmarx](https://checkmarx.com/).
+
+However, under the DAST strategy, professionals evaluate applications in their running state to identify vulnerabilities. Some of the common DAST tools are [OWASP ZAP](https://www.zaproxy.org/) and [Burp Suite](https://portswigger.net/burp) which help identify injection flaws and security misconfigurations.
+
+Interactive Application Security Testing (IAST), another practice that combines SAST and DAST, operates within the application runtime environment to provide detailed insights into vulnerabilities during testing and QA phases.
+
+These advanced testing methodologies—SAST, DAST, and IAST—not only enhance security within specific stages of development but also lay the groundwork for broader, innovative practices in continuous security monitoring. These emerging practices are redefining traditional monitoring and response strategies:
+
+### Real-time incident response
+
+DevSecOps uses tools that use AI and machine learning for real-time threat detection and mitigation.
+
+Examples of tools used for real-time response in DevSecOps are Splunk, Datadog Security Monitoring, and CrowdStrike Falcon which do AI driven threat detection and automated response to incidents.
+
+### Behavioral analytics
+
+Monitoring user and application behavior allows DevSecOps teams to detect anomalies such as data access or traffic patterns that are not normal which could be a breach.
+
+### Continuous compliance
+
+DevSecOps embeds security policies and regulatory standards into the development process for continuous compliance. Teams use automation tools like Policy-as-Code frameworks and compliance scanners to enforce and validate against standards like GDPR, HIPAA and PCI DSS. This way reduces compliance risks and makes auditing easier.
+
+## Moving from DevOps to DevSecOps
+
+The shift from DevOps to DevSecOps is a critical evolution for organizations aiming to integrate security seamlessly into the development lifecycle. Below is a guide to facilitate this transition, highlighting actionable steps, tools, and strategies for success.
+
+![Moving from DevOps to DevSecOps](https://assets.roadmap.sh/guest/moving-from-devops-to-devsecops-gimtv.png)
+
+### Understand your goals
+
+Before implementing changes or transitioning to DevSecOps, step back and clearly lay out your goals. What do you want to achieve after transitioning to the DevSecOps model? Are you looking to enhance your security model or need faster software deployment? Being specific with your goals will help you make informed decisions and develop a plan that aligns with your goals.
+
+### Current flow assessment
+
+Before transitioning to a new model, it is important to assess and change the existing workflow. Trace areas that demand or require improvement and attention. For example, check for proper coordination and communication among development, operations, and security teams. Are there any loopholes or faults in your current workflow? Is security feedback consistently integrated into development cycles? Identify gaps in communication by hosting cross-team retrospectives or root cause analyses to get more clarity of your situation.
+
+### Choose the right automation tool
+
+If workflow efficiency is an issue, the best solution is to implement automation tools. These common tools can reduce manual tasks, run faster code reviews, perform security tests, and provide quick deployment. These tools further enable professionals to focus on other key areas and tasks, such as fixing errors or initiating new features within the application.
+
+### Training your teammates
+
+Adopting a new model or practice demands educating the team members early about the new process and security concerns. Inform and educate your team members about the importance of security systems and how integrating them can improve their overall performance. You can also run training sessions or seminars to cover more about security guidelines and standards. Help them understand rising security concerns, how to fill gaps, and how to integrate security throughout the software development cycle. This step will further prevent confusion and problems from escalating in the future.
+
+Educating the team early prevents missteps and promotes ownership of the new processes. But. despite preparation, organizations often face challenges when transitioning to DevSecOps. Let us have a look at some common DevSecOps transition challenges.
+
+## DevSecOps transition challenges
+
+Remember, transitioning to DevSecOps is not as easy as it sounds. There are various challenges, but these can be managed with the right approach.
+
+![DevSecOps Best Practices](https://assets.roadmap.sh/guest/devsecops-best-practices-m6e21.png)
+
+Here are a few things to avoid in the transition period:
+
+### Wrong tool selection
+
+There is a wide range of security applications on the market, but make sure to select the right one that is relevant to your code and meets your requirements. Otherwise, you might find it hard to run in the long term.
+
+For guidance on selecting the right tools, refer to the **"Top tools and processes for a smooth transition"** section, where we highlight specific tools and best practices to facilitate a successful DevSecOps implementation.
+
+### Non-inclusion of operations and security teams
+
+Security tests are conducted at every phase of software production. Excluding your operations and security teams from the monitoring and tracking process limits the ability to identify and address faults and bugs effectively. Involving security experts from the start allows them to provide guidance on misconfigurations, tools, and best practices.
+
+### Speed over quality
+
+DevOps emphasizes quick software delivery, which can sometimes lead to insufficient attention to quality and security functionality. This may affect the user experience and your business reputation. Allocating more time and effort to ensuring quality and integrating security practices can help strike the right balance.
+
+### Code monitoring issues
+
+Since code constantly changes in software production, keeping an eye on it at all times can be challenging for some professionals. It is important to introduce new configurations, tools, and practices that can identify vulnerabilities in real time.
+
+## Top tools and processes for a smooth transition
+
+Further, let's have a look at how tools and processes can facilitate this transition while keeping agility and innovation intact:
+
+### Prioritize security-first CI/CD configurations
+
+CI/CD pipelines are the backbone of modern DevOps workflows. Embedding security into these pipelines guarantees vulnerabilities are identified and mitigated at every stage. So, incorporate Static Application Security Testing (SAST) and Dynamic Application Security Testing (DAST) tools. 
+
+Further, you can use HashiCorp Vault or AWS Secrets Manager to manage sensitive information securely. Also, you can set policies to prevent critical vulnerabilities using tools such as Jenkins, GitHub Actions, or GitLab CI/CD.
+
+### Embrace infrastructure as code (IaC)
+
+IaC automates infrastructure provisioning, but it can also introduce risks if not properly secured. For a smooth transition, it is important to integrate security into IaC processes. You can invest in Terrascan to detect vulnerabilities in Terraform or implement [immutable infrastructure practices](https://devops.com/immutable-infrastructure-the-next-step-for-devops/) to reduce configuration drift. Further, you can conduct regular audits of IaC templates for misconfigurations.
+
+### Leverage advanced threat modeling
+
+Threat modeling makes certain that potential security risks are identified early. New tools and frameworks make this process more effective. Invest in AI-powered tools that automatically suggest mitigations for identified risks.
+
+## Will DevSecOps replace DevOps?
+
+No, DevSecOps will not replace DevOps; instead, it enhances it. Rather than being a replacement, DevSecOps is an augmentation of DevOps, bringing security practices into the development and operations workflow. While DevOps focuses on speed, collaboration, and efficiency, DevSecOps makes sure that security becomes an inherent part of these processes. For example, integrating security tools like Snyk or SonarQube into CI/CD pipelines helps organizations identify vulnerabilities early in the development lifecycle.
+
+The two are complementary rather than mutually exclusive. DevSecOps acts as a bridge, ensuring that security doesn't become a bottleneck while maintaining the agility of DevOps. This natural evolution addresses the growing need for secure software development without compromising agility. Let's further learn how DevSecOps will evolve in the future.
+
+## Future of DevSecOps
+
+As cybersecurity threats grow in sophistication and compliance regulations tighten, DevSecOps is poised to become the cornerstone of secure software development. In the recent [CrowdStrike Global Threat Report](https://www.crowdstrike.com/en-us/global-threat-report/), experts clearly stated that attacks hardly take a few minutes to succeed. The report also noted that CrowdStrike tracked over 230 adversaries leveraging the global adoption of cloud technologies for their attacks.
+
+Tackling these challenges demands strategic teamwork and technical expertise. Here's how DevSecOps is expected to evolve and why it is the future of secure DevOps:
+
+### Proactive threat mitigation
+
+DevSecOps is transitioning from reactive to proactive security. Predictive threat analysis, enabled by AI and machine learning, will play a crucial role in identifying security concerns and vulnerabilities before exploitation. For example, tools like CrowdStrike will become essential for analyzing attack patterns.
+
+### Integration with governance and compliance
+
+Stricter regulations such as GDPR, HIPAA, and CCPA are driving a compliance-first culture. DevSecOps will increasingly integrate automated compliance checks into CI/CD pipelines, facilitating adherence to global standards without manual intervention.
+
+### Rise of zero-trust architectures
+
+The adoption of zero-trust principles will reshape security frameworks. DevSecOps will integrate zero-trust policies into development environments, guaranteeing continuous authentication and access verification. This approach will strengthen security for microservices and API-driven architectures.
+
+### Cloud-native and container security
+
+With the surge in cloud-native applications, securing containers and serverless environments will be a top priority. Several tools are available that will enable seamless security integration into cloud workloads, addressing misconfigurations and runtime vulnerabilities.
+
+In fact, in terms of demand and salary, DevSecOps roles tend to offer higher salaries due to the specialized skill set and smaller talent pool. Soon, there will be more role demands for security teams, DevSecOps engineers, security automation specialists, and compliance analysts job profiles to integrate security systems throughout the SDLC.
+
+## Conclusion
+
+Now that you understand the differences between DevOps and DevSecOps, the choice comes down to your organization's specific goals and priorities.
+
+If speed and efficiency are your primary focus, DevOps is a great fit. However, if security is paramount, DevSecOps is the better choice. By embedding security into every stage of the development lifecycle, DevSecOps helps mitigate vulnerabilities while ensuring compliance and quality.
+
+Both methodologies hold significant value, but in an era of increasing cybersecurity threats, DevSecOps is becoming essential for organizations that prioritize secure innovation.
+
+To navigate these approaches effectively and align them with your long-term goals—such as scalability, compliance, and reputation—explore our comprehensive [DevOps roadmap](https://roadmap.sh/devops). It offers actionable insights to help you build a strategy that drives efficiency, security, and success.
\ No newline at end of file
diff --git a/src/data/guides/free-resources-to-learn-llms.md b/src/data/guides/free-resources-to-learn-llms.md
index b19ef2982..52219d759 100644
--- a/src/data/guides/free-resources-to-learn-llms.md
+++ b/src/data/guides/free-resources-to-learn-llms.md
@@ -1,7 +1,7 @@
 ---
 title: '5 Free Resources to Master LLMs'
 description: 'Dive into the world of LLMs with these free resources'
-authorId: 'kamran'
+authorId: william
 seo:
   title: '5 Free Resources to Master Language Models (LLMs) - roadmap.sh'
   description: 'Looking to dive into the fascinating world of Language Models (LLMs)? Discover the top 5 free resources that will help you learn and excel in understanding LLMs. From comprehensive tutorials to interactive courses, this blog post provides you with the ultimate guide to sharpen your skills and unravel the potential of language models. Start your journey today and become a pro in LLMs without spending a dime!'
diff --git a/src/data/guides/full-stack-how-to-become.md b/src/data/guides/full-stack-how-to-become.md
new file mode 100644
index 000000000..4c13362f8
--- /dev/null
+++ b/src/data/guides/full-stack-how-to-become.md
@@ -0,0 +1,299 @@
+---
+title: 'How to Become a Full Stack Developer: Career Guide'
+description: 'Want to become a full stack developer? Discover essential skills, tools, and practical steps to kickstart your career in web development.'
+authorId: ekene
+excludedBySlug: '/full-stack/how-to-become'
+seo:
+  title: 'How to Become a Full Stack Developer: Career Guide'
+  description: 'Want to become a full stack developer? Discover essential skills, tools, and practical steps to kickstart your career in web development.'
+  ogImageUrl: 'https://assets.roadmap.sh/guest/become-a-full-stack-developer-54s51.jpg'
+relatedTitle: 'Other Guides'
+relatedGuidesId: full-stack
+isNew: false
+type: 'textual'
+date: 2025-02-04
+sitemap:
+  priority: 0.7
+  changefreq: 'weekly'
+tags:
+  - 'guide'
+  - 'textual-guide'
+  - 'guide-sitemap'
+---
+
+![How to become a full stack developer](https://assets.roadmap.sh/guest/become-a-full-stack-developer-54s51.jpg)
+
+To become a full stack developer, you must learn HTML, CSS, and JavaScript to build interactive interfaces, then move on to backend skills like Node.js and databases like MySQL. Build real projects, use Git for version control, learn deployment tools like AWS, and create a portfolio that showcases your skills.
+
+A full stack developer is a generalist in software engineering. They are good at both the frontend and backend development of web projects. This dual skill set means they have a strong foundation in all areas of the web development process.
+
+However, becoming a full stack developer is not always as easy as expected. It involves a lot of coding practice and effort to learn all the needed tools. You will run into roadblocks, get annoyed, and sometimes question yourself. But, with dedication and the right resources, anyone can become a full stack developer.
+
+**TL;DR: A step-by-step guide on how to become a full stack developer.**
+
+- **Step 1**: Learn the basics of frontend development.
+- **Step 2**: Learn frontend web development frameworks and libraries.
+- **Step 3:** Understand version control systems.
+- **Step 4**: Learn backend web development.
+- **Step 5**: Learn DevOps and deployment basics.
+- **Step 6:** Network and consistently learn more.
+- **Step 7:** Build a portfolio and apply for jobs.
+
+Following the above steps will help you become a successful full stack developer. In this guide, I will take you through the step-by-step process of becoming a full Stack developer. I will also cover the basics of web development, frontend and backend frameworks, and more.
+
+## A step-by-step guide on how to become a full stack developer
+
+Learning full stack development can be a lot to handle. There is so much material—tutorials, blogs, videos—that it can be hard to find where to begin and what resources to rely on. Thankfully, you can make use of the step-by-step [full stack development](https://roadmap.sh/full-stack) roadmap to learn and track your progress.
+
+The full stack development guide provides clear explanations of all the necessary concepts. The steps below present a concise explanation of the full stack developer roadmap.
+
+![A step-by-step guide on how to become a full stack developer](https://assets.roadmap.sh/guest/a-step-by-step-guide-on-how-to-become-a-full-stack-developer-nd2r3.png)
+
+**Step 1: Learn the basics of frontend development.**
+[Learning frontend development](https://roadmap.sh/frontend) basics is important to becoming a successful full stack developer. Frontend development involves making a website look good, responsive, and user-friendly. It is the client side of web development, focusing on how web elements (forms, buttons, etc.) appear on a screen.
+
+Frontend developers depend on three important languages to create interactive websites and applications:
+
+- Hypertext markup languages **(HTML)**.
+- Cascading style sheets **(CSS)**.
+- JavaScript.
+
+HTML and CSS go hand in hand when it comes to web development. HTML serves as the foundation for building web pages. It helps structure and organize the web elements of websites and applications. Examples of these web elements include images, headings, texts, links, and videos. CSS improves the visual appeal of the web elements. It allows you to control the user interface, add colors and spaces, and more using CSS selectors and IDs.
+
+If you want to improve at HTML and CSS, use them to build projects. Do not only focus on studying; build and practice simultaneously. This approach will help you understand
+HTML and CSS well. Some project ideas include:
+
+- Create and design a resume that shows off your work experience.
+- Create a responsive landing page for any product.
+- Create a personal website or a blog.
+
+[**JavaScript**](https://roadmap.sh/javascript) is a programming language used to make your website functional and interactive. It makes web elements like buttons, forms, and animations on your website work. To practice JavaScript, try building:
+
+- A simple calculator.
+- An interactive quiz application.
+- A to-do list application.
+
+Learning HTML, CSS, and JavaScript is important to becoming a full stack developer. They work together to create static, interactive web pages that users engage with.
+
+**Step 2: Learn frontend web development frameworks and libraries.**
+Learning frameworks and libraries are the next step to becoming a full stack developer. Frontend web frameworks and libraries make it easier to create web interfaces.
+
+[Frontend frameworks](https://roadmap.sh/frontend/frameworks) allow users to create websites and applications in a structured manner. They offer pre-written codes and templates to make the development process easier. This way, you won't have to start from scratch and can focus on making your application stand out. [Angular](https://roadmap.sh/angular), Tailwind CSS, Svelte, and [Vue.js](https://roadmap.sh/vue) are a few examples of popular frontend web frameworks.
+
+In contrast, frontend libraries are pre-written codes that perform specific functionalities. They help expand on what frameworks can do, or you can use them alone for particular tasks. Some examples of these tasks include form validation, animation, and data visualization. Animate.css, Chart.js, and [React](https://roadmap.sh/react) are a few examples of popular frontend libraries.
+
+Frameworks and libraries work together to make development easier in different ways. For example, the **Tailwind CSS** framework helps with responsive web design and layout. But if you want to spice things up with fancy animations, you can use a library like **Animate.css**. They work together to help you make web designs that are useful and look good at the same time.
+
+Try building your own projects to understand how these frameworks and libraries work. It doesn't matter how simple these projects are; study and build projects. Some examples of projects to build include:
+
+- Single-page applications **(SPAs)** like game applications.
+- Responsive personal portfolio website.
+
+These projects will help you understand and get better at different concepts. You must practice often and work on real projects to get good at using frameworks.
+
+**Step 3: Understand version control systems**
+The knowledge of version control systems **(VCS)** is important for full stack developers. VCS records every change made to your codebase, so you know who changed what, when, and why. Being able to do this is vital when working with experienced developers on the same project.
+
+Some popular examples of VCS include Git **(GitHub, GitLab, and Bitbucket)**. [GitHub](https://roadmap.sh/git-github) lets you collaborate, store, and share your code using Git repositories. VCS has many advantages:
+
+- It helps full stack developers collaborate without facing difficulties.
+- It helps full stack developers try new ideas without fear of ruining the code.
+- It saves a copy of your code so you can return to an earlier version if you have to.
+- It provides access control and authentication. You can control who can edit, review, or manage your code. It keeps your code safe and tidy when working with other professional developers.
+
+Knowing how to use VCS is important to become a full stack developer. It improves collaboration and helps organize difficult projects. This documentation contains everything you need to know about [**Git**](https://github.com/git-guides).
+
+**Step 4: Learn backend web development**
+Now that you know frontend concepts, it is time to [learn backend web development](https://roadmap.sh/backend). Backend development is the process of building the server side of web applications. It is where the behind-the-scenes operations that make the frontend interface work happen. This part of server-side development focuses on:
+
+- Management of databases.
+- Application programming interfaces **(APIs)** development.
+- Server-side logic and more.
+
+Backend developers create applications using different backend programming languages and frameworks like:
+
+- [Node.js](https://roadmap.sh/nodejs)
+- [Python](https://roadmap.sh/python)
+- C#
+- Ruby
+- [Java](https://roadmap.sh/java)
+
+These backend programming languages have specific strengths and weaknesses. Choosing a language comes down to what the project needs, what your team is good at, and what you like.
+
+If you are looking to start backend development, I recommend learning Node.js. Node.js runs on JavaScript, which is the primary language for backend development. Since you already know JavaScript from the frontend, it will be easy to learn. Node.js allows you to build dynamic backend applications using JavaScript. So, you can work across the whole tech stack **(both the frontend and backend)** using one language.
+
+Node.js has many cool packages and libraries; you can get them through the Node Package Manager **(NPM)**. These resources provide existing solutions like authentication with OAuth for everyday tasks. You can also use Node.js on any operating system, such as Windows, macOS, and Linux.
+
+It is important to practice as you learn to understand how it works better. Think about working on projects that combine your frontend abilities with backend features. Practice Node.js by building basic CRUD **(Create, Read, Update, Delete)** applications, like:
+
+- Social media applications, e.g., Twitter.
+- Project management applications, e.g., Jira.
+- Online shopping websites, e.g., Amazon.
+
+Building CRUD applications will teach you how to handle and work with databases. As you continue learning, build more complex applications that combine different functionalities. For example, you can create a project with user authentication to log in and sign up for an application.
+
+The following are some of the most important concepts to focus on when learning Node.js:
+
+- **Database interactions**: [MongoDB](https://roadmap.sh/mongodb), PostgreSQL, MySQL, CRUD operations.
+- **File and module system**: Reading and writing files, local vs. global modules, NPM.
+- **Asynchronous programming**: Callbacks, Promises, Async/Await syntax, event emitters, etc.
+- **Event loop**: Task queues, event listeners, handling of I/O operations.
+- **Express.js framework**: routing, middleware, HTTP methods (GET, POST, PUT, DELETE), RESTful APIs.
+- **Authentication and security**: JSON Web Tokens (JWT), OAuth implementation, Security best practices, etc.
+
+After learning Node.js and its ecosystem, you can move on to [**Java**](https://roadmap.sh/java), [**Python**](https://roadmap.sh/python), C#, [**Go**](https://roadmap.sh/golang), Ruby or [**Rust**](https://roadmap.sh/rust)**.** Understanding the differences between these languages will help you choose the best tool.
+
+**Note**: As you keep learning more tools, you will realize there is too much to learn, and you can never know everything. I advise you to get very good at using one tool **(such as Node.js)** and have a basic understanding of others. Keep improving using that one tool, and you will be good to go.
+
+**Step 5: Learn DevOps and deployment basics**
+To be a skilled full stack developer, you must know your way around DevOps and deployment. DevOps combines software development and IT operations to improve software delivery. It makes developing, managing, and deploying applications a whole lot easier.
+
+The first step in [learning DevOps](https://roadmap.sh/devops) is to learn about Linux basics, cloud services, and CI/CD pipelines. These skills are important for deploying and managing software applications. The following are areas you should focus on when learning:
+
+- **Linux basics**: Learn Linux, file systems, networking, and security.
+- **Version control systems**: Learn to use [Git](https://roadmap.sh/git-github) to manage code and collaborate.
+- **Cloud services**: Learn about [AWS](https://roadmap.sh/aws), Azure, or Google Cloud.
+- **CI/CD pipelines**: Learn testing and deployment using tools like Jenkins and GitLab CI/CD.
+- **Infrastructure as Code (IaC)**: Learn tools like Terraform for infrastructure automation.
+
+As soon as you have an understanding of these basics, it's time to put your new skills into practice. First, try deploying your full stack applications to cloud platforms like [AWS](https://roadmap.sh/aws) or Heroku. This will help you get real experience managing and maintaining live applications. You can start with easy applications and work up to harder ones.
+
+Next, you will learn about automation and monitoring when working on your projects. GitHub Actions and Ansible are useful tools for this purpose. They assist in automating development, deployment, and configuration tasks. Knowing these DevOps concepts will help you handle the demands of full stack development.
+
+**Step 6: Network and consistently learn more.**
+Building your full stack developer skills requires consistent learning and networking. It involves spending time self-learning, building friendships, and growing skill sets. The tips below will help you learn and network better:
+
+- Take online courses and watch online tutorials to understand full stack development concepts better.
+- Read books and articles about web development, programming languages, and software engineering.
+- Contribute to open-source projects to gain experience and develop relationships with full stack professionals.
+- Join communities like the [roadmap community](https://discord.com/invite/cJpEt5Qbwa) to learn from other professional developers.
+- Attend conferences, meetups, and online forums to learn from industry professionals.
+- Take part in coding challenges and hackathons to practice and learn.
+
+Consistent learning and networking will help you become a better full stack developer. It will help you succeed, keep up with the latest technologies, and solve coding problems.
+
+**Step 7: Build a portfolio and apply for jobs**
+As a developer, you work on projects to improve your skill set and get a full stack developer job. But to show off these projects to a hiring manager, you must have them all in one place. For this reason, it is important to have a portfolio if you want to become a full stack developer.
+
+Portfolios are compilations of your best work that showcase your skills and experiences. It is like a resume, but instead of bullet points listing your coding skills, it shows you pictures and more work details. Among the many benefits of owning a portfolio are:
+
+- It shows a hiring manager that you can do the job, not just talk about it.
+- It shows your full stack developer skills across both old and new technologies.
+- It sets you apart from other developers who have similar qualifications.
+
+When creating your portfolio, include projects that show your skills with different tools. The following are some project ideas to add to your portfolio:
+
+- **Personal projects**: Examples of these applications can be budgeting or recipe applications.
+- **Open-source contributions**: Add links to your open-source contributions.
+- **Full** **\*\***stack applications\*\*: Create applications that show off your frontend and backend development skills. An example of this application is an online shopping website with user authentication.
+- **API development**: Build and include RESTFUL APIs in your portfolio. It will show off your skills in the back-end, working with Node.js and other programming languages.
+
+After you have built a portfolio, it is time to start job hunting for full stack development jobs. This involves creating a resume and cover letter and prepping for interviews.
+
+**Note:** To become a full stack developer, you must create the habit of always learning. So, if you get the job or not, it doesn't matter; you have to keep learning and improving your coding skills.
+
+While a portfolio is not always required when applying for full stack development jobs, it's a good idea to start building one. However, when you first start applying for jobs, a GitHub profile with your key projects may be enough; you can use pinned repositories to display your best work. With time, you can create your full stack developer portfolio to display your projects.
+
+## Responsibilities of a full stack developer
+
+As a full stack developer, you must be able to solve problems, think outside the box, and have good tech skills. Doing this means you will be in charge of a range of responsibilities, like:
+
+- Designing and creating frontend and backend elements.
+- Collaborating with different teams.
+- Writing clean, efficient, and well-documented code.
+- Troubleshooting and debugging issues.
+
+![Responsibilities of a full stack developer](https://assets.roadmap.sh/guest/responsibilities-of-a-full-stack-developer-13tf5.png)
+
+**Design and create frontend and backend elements**
+Creating and designing frontend and backend elements are important duties of full stack development. This involves combining different skill sets to make cool applications.
+
+The responsibilities of full stack developers when creating these elements include the following:
+
+- Creating easy-to-use user interfaces with tools like HTML, CSS, and JavaScript.
+- Creating layouts that look good and are responsive on all devices, e.g., mobile phones, computers, etc.
+- Writing back-end code in programming languages like Node.js, Java, or Python.
+- Building RESTful APIs to make communication easier for the frontend and backend.
+
+**Collaborate with different teams**
+Full stack development demands a wide array of skills to complete a project. A full stack developer can work on a project's frontend and backend. But, completing the project alone is often not the norm. It requires teamwork, with everyone pitching in to get the job done. As a full stack web developer, you will work with different teams, such as:
+
+- UI/UX designers to make interfaces easy for people to use.
+- Product managers to understand the goals and objectives of the project.
+- QA **(Quality assurance)** team to fix issues and make sure the application works well.
+- DevOps team to fix any deployment issues.
+- Business stakeholders to ensure the project meets the business needs.
+
+**Write clean, efficient, and well-documented code**
+Full stack developers are responsible for writing clean, efficient, and well-documented code. It involves following best practices to write easy-to-read, maintain, and scalable codes so everyone on the team can understand the code and help with the project when needed.
+
+Full stack developers follow these best practices to do this:
+
+- Using consistent naming conventions to make the code readable and understandable.
+- Breaking codes into smaller reusable elements. It helps to make the code easier to find and fix errors when testing.
+- Improving performance by cutting out any unnecessary operations. It helps the application run quicker and does not use up much resources.
+- Writing easy-to-understand comments that explain the logic of the code.
+
+Writing clean, efficient, well-documented code leads to good teamwork and a successful project. It helps new developers get up to speed quicker and reduces the time spent on future updates or fixing bugs.
+
+**Troubleshoot and debug issues**
+As a full stack developer, your job is not just to build applications but also to make sure they work well. This involves finding and fixing errors that arise before or after creating applications.
+
+The following are tips full stack developers use to troubleshoot and debug issues:
+
+- Identifying issues through user feedback and more.
+- Studying the code using debugging tools like Chrome DevTools.
+- Testing fixes in different systems to make sure they work. Examples of these tests can be unit or integration tests.
+- Collaborating with other team members, like the QA engineer, to fix difficult issues.
+- Documenting how you fixed the problem so you can refer back to it next time it happens.
+
+## Essential skills for a full stack developer
+
+The following are some of the important full stack developer skills:
+
+- Solid foundation in basic web technologies like HTML, CSS, and JavaScript.
+- Practical experience with frontend frameworks and libraries like React, Angular, or Vue.js.
+- Strong foundation in back-end technologies like Node.js, Python, and Java.
+- Experience in database management systems like MongoDB, MySQL, or [PostgreSQL](https://roadmap.sh/postgresql-dba).
+- Knowledge of required skills such as designing and building RESTful APIs.
+- A good understanding of server management, Linux commands, and CI/CD pipelines.
+- Hands-on experience with version controls like Git for managing code.
+- Knowledge of testing strategies like unit, integration, and end-to-end testing.
+- Good soft skills like teamwork, communication, and time management.
+
+![Essential skills for a full stack developer](https://assets.roadmap.sh/guest/sssential-skills-for-a-full-stack-developer-r1h6a.png)
+
+## Frequently asked questions (FAQ): How to become a full stack developer
+
+Becoming a full stack developer might make you wonder about a few things. The following are some answers to common questions to make the process easier for you:
+
+![Frequently asked questions FAQ how to become a full stack developer](https://assets.roadmap.sh/guest/frequently-asked-questions-faq-how-to-become-a-full-stack-developer-70kjn.png)
+
+**Is a bachelor's degree in Computer Science necessary to become a full stack developer?**
+No! You do not need a computer science or computer engineering bachelor's degree. A computer science degree can give you a strong start in topics like data structures, but that is not the only way to become a full stack developer. You can learn via online resources, coding boot camps, and more. The key is to have a good understanding of coding concepts and be very good at building projects.
+
+**Do I need any prior knowledge to start learning full stack development?**
+No! You do not have to know anything about programming to learn full stack development. Having basic computer skills and knowing how to browse the web is good but unnecessary. **roadmap.sh** provides a [full stack developer roadmap](https://roadmap.sh/full-stack) to help you get started. It covers everything you need to know about learning programming languages and more.
+
+**Can I learn full stack development in 3 months?**
+Learning the basics of full stack development in just three months is possible. But, it is unlikely for you to become a good full stack developer or be ready for a job in that short amount of time.
+
+**How long does it take to become a full stack developer?**
+How long it takes to become a full stack developer depends on the person. A lot depends on how dedicated you are to learning and practicing and how fast you learn. If you practice often, you will pick up the basics in a few months and master the more advanced skills in a few years.
+
+**What are the advantages of becoming a full stack developer?**
+The advantages of becoming a full stack developer are endless. Working on both ends of the web development process makes them useful for any team. They help small businesses save money by eliminating the need to hire separate frontend and backend developers.
+
+Also, you get to do what you love and get paid well—earning an average salary between $80,000 and over $200,000, depending on your experience, company size, and location.
+
+**What can I expect during a full stack development interview?**
+Expect a combination of behavioral and technical questions on frontend and backend topics. The behavioral interview will test your ability to solve problems and work experience. The technical portion often covers your understanding of full stack development concepts.
+
+**What is the difference between MERN and full stack?**
+The MERN stack is a part of full stack development. It is a specialized toolset that includes MongoDB, Express.js, React, and Node.js for building apps. Full stack is a broader term that includes various technologies beyond the MERN stack. It is a more complete toolset that handles both backend and frontend development. So, all MERN developers are full stack developers. Not all full stack developers focus on MERN development.
+
+## What next?
+
+Using the steps in this guide will put you on the right track to becoming a good full stack developer. Take your time to get to know the full stack concepts instead of trying to speed through them. Remember, the key to becoming a full stack developer is always to practice!
+
+[roadmap.sh](http://roadmap.sh) offers a detailed [full stack development guide](https://roadmap.sh/full-stack) to help you get started. Also, it provides beginner and advanced project ideas in its full stack projects guide. To start, visit the full stack roadmap page, sign up, and study. You can also share this roadmap with your study developer friends.
diff --git a/src/data/guides/go-vs-java.md b/src/data/guides/go-vs-java.md
new file mode 100644
index 000000000..9f67b3ae4
--- /dev/null
+++ b/src/data/guides/go-vs-java.md
@@ -0,0 +1,224 @@
+---
+title: 'Go vs Java: Choosing the Right Language for Your Projects'
+description: 'Comparing Go vs Java for your projects? Explore features like concurrency, memory management, and learning curves to find the right fit for your needs.'
+authorId: ekene
+excludedBySlug: '/golang/vs-java'
+seo:
+  title: 'Go vs Java: Choosing the Right Language for Your Projects'
+  description: 'Comparing Go vs Java for your projects? Explore features like concurrency, memory management, and learning curves to find the right fit for your needs.'
+  ogImageUrl: 'https://assets.roadmap.sh/guest/go-vs-java-fo08l.jpg'
+relatedGuidesTitle: 'Other Guides'
+isNew: false
+type: 'textual'
+date: 2025-02-04
+sitemap:
+  priority: 0.7
+  changefreq: 'weekly'
+tags:
+  - 'guide'
+  - 'textual-guide'
+  - 'guide-sitemap'
+---
+
+![Go vs Java comparison guide](https://assets.roadmap.sh/guest/go-vs-java-fo08l.jpg)
+
+Which is better for enterprise-grade systems, Go or Java? Which technology accelerates productivity in large-scale development? Which frameworks provide the most adaptability when tackling modern software challenges? These are the questions developers and tech leads often wrestle with, drawing on personal experiences, industry trends, and the need to keep up with ever-changing application demands.
+
+As someone with experience building high-performance systems and working extensively with both [Go](https://roadmap.sh/golang) and [Java](https://roadmap.sh/java), I understand the debate developers often face when choosing between these two powerful languages. Java has long been the go-to choice for robust, enterprise-level applications, and it is known for its maturity and extensive ecosystem. Meanwhile, Go has steadily risen in popularity and is celebrated for its simplicity, speed, and ability to handle scalable, high-performance systems easily.
+
+In this guide, I'll walk you through the key features of both Go and Java, including their performance, memory management, and adoption rates. I'll also offer guidance on when to choose Go or Java for your next project.
+
+The table below summarizes the key features of Go and Java:
+
+| **Feature**               | **Go**                                                       | **Java**                                                        |
+| ------------------------- | ------------------------------------------------------------ | --------------------------------------------------------------- |
+| **Type**                  | Compiled language to native code                             | Compiled to bytecode, runs on the JVM                           |
+| **Concurrency Model**     | Goroutines (lightweight threads, managed by Go runtime)      | Threads (OS-level, managed by JVM)                              |
+| **Memory Management**     | Garbage collection, with manual memory management options    | Automatic garbage collection (JVM)                              |
+| **Syntax**                | Simple, concise, inspired by C                               | Verbose, object oriented language                               |
+| **Performance**           | High due to direct compilation to machine code               | Good, but can be slower due to the JVM layer                    |
+| **Cross-Platform**        | Compiles to native binaries, runs on multiple platforms      | JVM provides cross-platform compatibility                       |
+| **Error Handling**        | Explicit error handling via return values                    | Exceptions (try-catch mechanism)                                |
+| **Learning Curve**        | Lower due to simpler syntax and fewer features               | Steeper, especially for new developers due to verbosity         |
+| **Use Cases**             | System programming, microservices, cloud-native apps, DevOps | Enterprise applications, Android development, large-scale apps  |
+| **Community & Libraries** | Growing, especially for cloud-native and system tools        | Mature, large ecosystem with extensive libraries and frameworks |
+| **Scalability**           | Excellent for highly concurrent and lightweight applications | Scalable, but can be more resource-intensive                    |
+
+Before looking at these features in detail, let's take a closer look at these two programming languages.
+
+## Go
+
+[Go](https://go.dev/), also known as Golang, is an open-source programming language developed by Google. Since its release in 2009, Go has gained massive adoption in building REST APIs, system programming, cloud computing, and microservices architecture, thanks to its focus on simplicity, efficiency, and reliability.
+
+As a statically typed language, Go allows you to catch errors early and build software faster. It also has a garbage collector that automatically manages memory allocation and deallocation.
+
+Go comes with extensive tools and libraries for building small to large-scale applications.
+
+## Java
+
+[Java](https://www.java.com/en/) is a high-level, object-oriented programming language owned and maintained by the Oracle Corporation. It is known for scalability, extensibility, and portability, which has made it a leading choice for building enterprise-grade applications, Android app development, and web applications.
+
+James Gosling first developed Java at Sun Microsystems in the 1990s, and it introduced the "Write Once, Run Anywhere" (WORA) principle. This means Java code can be compiled and run on any device with a Java Virtual Machine (JVM) installed, irrespective of the underlying operating system.
+
+Java also has robust tools and libraries that make writing code easy and help you build small to large-scale applications.
+
+Both Go and Java are server-side programming languages for building high-performance applications. You may wonder which language is superior and what considerations should guide your choice. Let's dive deep into the side-by-side comparison of these two languages.
+
+## Performance
+
+Golang outperforms Java and is often compared to high-performance programming languages like C or C++ because it compiles into native machine code. For high-intensive operations like I/O bound and CPU-heavy tasks, Go outperforms Java because it doesn't have the JVM overhead.
+
+Java's performance has also improved over the years when used in mission-critical applications and can be competitive with Go, but the major drawback is the JVM layer. It uses more memory, which can impact performance when used in a constrained environment like containers and microservices.
+
+## Cross-platform development
+
+Go compiles binary files separately for each platform, which means you can run it directly on platforms like Linux and macOS without requiring additional software. Java is also platform-independent because any application written in Java can run on any system with JVM installed and supports bytecode portability.
+
+While both Go and Java enable cross-compilation and can run on multiple platforms, Java offers more comprehensive coverage. Java has massive support on desktop (Windows, macOS, Linux), mobile (Android and iOS via frameworks), servers, and embedded systems via Java ME. Go, on the other hand, has limited compatibility with mobile and embedded systems.
+
+![Go vs. Java in Cross-platform development](https://assets.roadmap.sh/guest/go-vs-java-in-cross-platform-development-q5eff.png)
+
+## Community and ecosystem
+
+Java has a more mature and established community with many tools, libraries, and frameworks. It powers a significant portion of enterprise applications and has battle-tested frameworks like Spring, Apache Kafka, and much more.
+
+In comparison, Go's community is relatively young but also growing. It has made significant progress in the cloud-native space with projects like [Docker](https://roadmap.sh/docker), [Kubernetes](https://roadmap.sh/kubernetes), and [Terrafoam](https://roadmap.sh/terraform) powering enterprise applications.
+
+![Go vs Java ecosystem support](https://assets.roadmap.sh/guest/go-vs-java-ecosystem-support-115mf.png)
+
+## Memory management
+
+One of the unique features of Go is not just the in-built garbage collection (GC) that automatically frees up unused memory. Additionally, Go provides more control by allowing developers to manually manage memory allocation and deallocation. However, manual memory management comes at a cost, as you have to take care of edge cases and handle potential memory leaks.
+
+Java on the other hand, also has automatic GC without the option of manually managing memory. The GC in Java has seen massive improvement, especially for large enterprise systems, but it can still show some lags when building low-latency systems like trading platforms.
+
+## Type and compilation
+
+Go and Java are statically typed languages, which means their data types are determined at compile time before the program executes. So, when you develop your application in either of these languages, you detect errors early and improve code readability and reliability.
+
+Go compiles directly into machine code that can be executed by the operating system, which makes it faster as there's no intermediate layer. In contrast, Java compiles to bytecode that uses a JVM as an intermediary, which introduces an overhead, as compared to Go's native compilation.
+
+## Error handling
+
+Go and Java are powerful languages with distinct approaches to handling errors. Go favors explicit error handling, where you have to think about error handling at each step, which can be verbose, repetitive, and missing some benefits of a structured approach to error handling.
+
+```go
+func divide(a, b int) (int, error) {
+	if b == 0 {
+		return 0, errors.New("division by zero")
+	}
+	return a / b, nil
+}
+
+// Usage
+result, err := divide(10, 0)
+if err != nil {
+	log.Fatal(err)
+}
+```
+
+In contrast, Java handles errors through the try-catch and exception mechanism, which centralizes error management. While Java's error handling can be powerful and help you build robust products, you have to be careful of performance issues.
+
+```java
+public int divide(int a, int b) throws ArithmeticException {
+    if (b == 0) {
+        throw new ArithmeticException("division by zero");
+    }
+    return a / b;
+}
+
+// Usage
+try {
+    int result = divide(10, 0);
+} catch (ArithmeticException e) {
+    System.err.println(e.getMessage());
+}
+```
+
+## Learning curve
+
+Go has a relatively low learning curve compared to Java due to its simple syntax, standard library, and fewer language features. It is easy for beginners to pick up due to the language's conciseness and limited ways to perform tasks. However, Go lacks some robust features like operator overloading and inheritance found in other languages, which can limit your expressiveness when building applications.
+
+Java, on the other hand, has a steeper learning curve. It can be difficult for beginners to pick up because of its verbosity and comprehensive features. While Java's syntax is evolving and introducing improvements (like Lambda and functional paradigm) to address some of the concerns, beginners still need to learn design principles like object-oriented programming (OOP) and many more.
+
+## Use cases
+
+Go's efficiency, simplicity, and concurrent pattern make it an ideal choice for building cloud-native applications, network programming, and DevOps tools (like automation scripts and command line tools). Some notable companies actively using Go include:
+
+- Google uses Go extensively for [infrastructure](https://cloud.google.com/go), data processing, and various internal projects.
+- Docker uses Go to build its containerization platform.
+- Dropbox uses Go to build its infrastructure and [file synchronization feature.](https://dropbox.tech/infrastructure/open-sourcing-our-go-libraries)
+
+Java is also widely used for developing enterprise applications, Android development, data processing, and large-scale web applications. Its stable and mature ecosystem makes it an ideal choice for enterprise solutions. Some notable companies actively using Java include:
+
+- Netflix uses Java for its [streaming platform](https://www.infoq.com/presentations/netflix-java/).
+- Airbnb leverages Java for its core platform and data processing platforms.
+- Spotify builds its [microservices with Java](https://spotify.github.io/apollo/#:~:text=Apollo%20is%20a%20set%20of,work%20to%20release%20version%201.0.).
+
+While the points above cover some notable features of both Go and Java, highlighting the strengths and weaknesses of each language, you may still be wondering which one to choose for your next project. Not to worry, that question will be addressed in the next section.
+
+## Which one should you choose?
+
+Well, as any diplomatic developer might say, 'It depends.' Both Go and Java are excellent programming languages, and your choice between them depends on the type of project you want to build, ecosystem support, and other important factors. Let's explore these factors in detail.
+
+**Project Requirements**
+
+Go is a great choice for projects that handle multiple users or require background tasks without interrupting the user experience. Its high concurrency and performance make it ideal for such scenarios. However, if your project needs complex functionalities and a broad ecosystem of tools, Java may be a better option.
+
+**Career and Opportunity**
+
+It's important to carefully evaluate your end goal. If you aim to build a project to demonstrate proof of work, showcase your experience, or secure a job, consider the industry you're targeting and decide based on the opportunities there. For example, if you want to work in corporate sectors like fintech, insurance, or banking, Java might be an ideal choice because of its capability to build enterprise-grade applications. However, if you're aiming for industries focused on cloud infrastructure, Go is often a better choice than Java.
+
+![Average Java developer salary in the US](https://assets.roadmap.sh/guest/average-java-developer-salary-in-the-us-goqr1.png)
+
+**Target Platform**
+
+If you're building for mobile and web platforms, Java offers strong support for applications ranging from small-scale projects to large enterprise solutions, thanks to its proven tools, libraries, and frameworks that you can easily leverage. However, if your target platform is cloud and cloud-native environments, Go might be a better choice due to its extensive ecosystem and robust features.
+
+Choosing between Go and Java largely depends on the factors mentioned above. However, you might also wonder if there are similarities between these languages and whether there's an intersection where using both could be beneficial. Well, you guessed right. Let's explore that next.
+
+## When to use both Go and Java
+
+Both Java and Go are popular programming languages that share similarities like static typing, concurrent handling, GC, platform independence, strong ecosystems, and standard libraries, which make them powerful languages that can be combined for building applications. Below are some scenarios where you can combine the strengths of both Go and Java to build applications:
+
+- Microservices architecture.
+- Web development with high-performance requirements.
+- Data processing pipelines.
+- Cloud-native applications with diverse microservices.
+- Cross-platform mobile and desktop full stack applications.
+
+![Go and Java combination](https://assets.roadmap.sh/guest/when-to-use-both-go-and-java-wr4rs.png)
+
+**Microservices architecture**
+
+If you're building a high-performance microservices system for an e-commerce platform, you can leverage Java's maturity and enterprise-grade ecosystem to build the core backend processes handling complex business logic, such as payment transactions, inventory management, and order processing.
+
+Then, use Go to build services that require high performance and fast execution, like a real-time recommendation system, caching mechanism, and notifications.
+
+**Web development with high-performance requirements**
+
+A real-time social media analytic platform and a stock exchange trading platform are examples of web applications that require high performance because they handle a massive amount of data. You can use Go for real-time data collection and event-driven activities that capture user engagement data, shares, and likes.
+
+Then, Java can be used to manage the backend workflow, such as storing and aggregating data.
+
+**Data processing pipelines**
+
+If you're building a real-time analytic platform that involves processing and analyzing large volumes of data, then you can use Go to process data ingestion and transformation. Go's goroutines make it an ideal language for data ingestion and preprocessing.
+
+Use Java-based data-intensive frameworks like Apache Hadoop or Apache Spark for data processing and analytics.
+
+**Cloud-native applications with diverse microservices**
+
+If you're building a Software as a Service (SaaS) cloud monitoring tool for cloud infrastructure, you can use Go to build your application microservices that handle real-time monitoring, metric collection, and data scraping from different cloud services. Java, on the other hand, can be used to power the backend features like billing, user management, and data reporting.
+
+**Cross-platform mobile and desktop full stack application**
+
+An example of cross-platform mobile and desktop full stack application is a platform for visualizing financial data with a backend analytic engine. In such cases, you can use Java to build the desktop and mobile application logic and user interface due to its cross-platform capabilities.
+
+Use Go to build the backend analytic engine with real-time data processing and expose the services using REST APIs to the Java mobile and desktop client.
+
+## Next steps
+
+Go is an excellent choice for building high-performance, lightweight applications that require concurrency, such as cloud-native applications and microservices. Java, on the other hand, has a mature ecosystem with battle-tested tools, libraries, and frameworks, which makes it a powerful option for building large-scale enterprise applications where scalability and robustness are essential.
+
+Choosing between Go and Java depends on the type of project you want to build, the platform you're targeting, and the ecosystem you want to adopt for your project. Regardless of your choice, you can use the [Go roadmap](https://roadmap.sh/golang) and [Java roadmap](https://roadmap.sh/java) to stay up to date with the latest changes in each language.
diff --git a/src/data/guides/golang-rest-api.md b/src/data/guides/golang-rest-api.md
new file mode 100644
index 000000000..f2caef2e6
--- /dev/null
+++ b/src/data/guides/golang-rest-api.md
@@ -0,0 +1,947 @@
+---
+title: 'How to Build a Rest API in Golang (Detailed Tutorial)'
+description: 'Want to build a REST API in Golang? Follow our detailed tutorial to set up, code, and deploy your API with best practices and clear examples.'
+authorId: william
+excludedBySlug: '/golang/rest-api'
+seo:
+  title: 'How to Build a Rest API in Golang (Detailed Tutorial)'
+  description: 'Want to build a REST API in Golang? Follow our detailed tutorial to set up, code, and deploy your API with best practices and clear examples.'
+  ogImageUrl: 'https://assets.roadmap.sh/guest/build-a-rest-api-in-golang-k3zuq.jpg'
+relatedGuidesTitle: 'Other Guides'
+isNew: true
+type: 'textual'
+date: 2025-01-17
+sitemap:
+  priority: 0.7
+  changefreq: 'weekly'
+tags:
+  - 'guide'
+  - 'textual-guide'
+  - 'guide-sitemap'
+---
+
+![How to Build a Rest API in Golang](https://assets.roadmap.sh/guest/build-a-rest-api-in-golang-k3zuq.jpg)
+
+Building a REST API in [Go](https://roadmap.sh/golang) offers a blend of high performance, ease of deployment, and scalability. Go’s efficient runtime and built-in concurrency model make it an ideal choice for building applications that handle large volumes of requests while still maintaining low latency. With a robust standard library and supportive ecosystem, you can quickly implement REST functionality into your applications.
+
+Since its official release in 2009, Go has gained massive adoption and is gradually becoming the go-to technology for building applications, from small-scale to mission-critical systems. Its adoption surged even further when industry leaders used it to power containerization and orchestration tools like [Docker](https://roadmap.sh/docker) and [Kubernetes](https://roadmap.sh/kubernetes). Whether you’re building a small service or a mission-critical application, Go provides a powerful foundation for REST API development.
+
+Given these advantages, let's put Go's capabilities into practice. In this guide, you will build a basic bookkeeping management API that supports create, read, update, and delete (CRUD) functionalities. You’ll also write unit tests for these functionalities to ensure they work as intended, implement authentication to secure the APIs, and create comprehensive documentation.
+
+Let’s get started building the application.
+
+## Step 1: Project set up
+
+To get started, use your terminal to create a project directory.
+
+```bash
+mkdir go_book_api && cd go_book_api
+```
+
+These commands create a directory called `go_book_api` and navigate into it.
+
+Next, initialize a [Go module](https://go.dev/doc/tutorial/create-module) within the project.
+
+```bash
+go mod init go_book_api
+```
+
+This command creates a `go.mod` file for tracking the project dependencies.
+
+Finally, install the required dependencies.
+
+```bash
+go get -u github.com/gin-gonic/gin
+go get -u gorm.io/gorm
+go get -u gorm.io/driver/postgres
+go get -u gorm.io/driver/sqlite
+go get -u github.com/joho/godotenv
+```
+
+Let’s look at what these dependencies are and what they are used for:
+
+[Gin](https://gin-gonic.com/) is a framework for building web applications.
+
+[Gorm](https://gorm.io/docs/index.html) is a Go-based Object Relational Mapper (ORM). ORMs make it easy to query and manipulate data from a database. The installation also includes both [Postgres](https://github.com/go-gorm/postgres) and [SQLite](https://github.com/go-gorm/sqlite) drivers. You’ll use the Postgres driver to interact with your application data, while SQLite will mock your database interaction when writing unit tests.
+
+[godotenv](https://github.com/joho/godotenv) is a library for loading environment variables.
+
+**Set up the project database**
+To save your API data, you need to set up your project database on [Neon](https://console.neon.tech/realms/prod-realm/protocol/openid-connect/registrations?client_id=neon-console&redirect_uri=https%3A%2F%2Fconsole.neon.tech%2Fauth%2Fkeycloak%2Fcallback&response_type=code&scope=openid+profile+email&state=FB3kotT4P_2z1eLKxJJvkA%3D%3D%2C%2C%2C). Neon is a fully managed serverless PostgreSQL database with a generous free tier you can start with.
+
+To set up your database, log into your [Neon console](https://console.neon.tech/app/projects) and create a project.
+
+![Set up a project](https://assets.roadmap.sh/guest/neon-create-project-i4u20.png)
+
+On successful creation of the project, copy the database URL.
+
+![Copy database URL](https://assets.roadmap.sh/guest/neon-successful-project-r4jiw.png)
+
+> Alternatively, you can use any managed Postgres service or a local Postgres instance.
+
+Lastly, create `.env` in your project directly and add the copied database URL.
+
+```bash
+DB_URL=<REPLACE THIS WITH YOUR DATABASE URL>
+```
+
+## Step 2: Structuring the project
+
+While Go doesn’t enforce how you should structure your project, it is essential you have a good structure when building an application with Go. It makes your codebase easy to maintain and clear for others to understand.
+
+To structure your project, create an `api`, `cmd`, and `tests` folders.
+
+`api` is for organizing API development-related files.
+`cmd` is used to organize the application entry point. This is a convention within the Go community.
+`tests` are for organizing unit tests.
+
+## Step 3: Implement CRUD operations for the bookkeeping application
+
+Create an `api/model.go` file to structure the application’s data and response.
+
+```go
+package api
+
+import "github.com/gin-gonic/gin"
+
+type Book struct {
+	ID     uint   `json:"id" gorm:"primaryKey"`
+	Title  string `json:"title"`
+	Author string `json:"author"`
+	Year   int    `json:"year"`
+}
+
+type JsonResponse struct {
+	Status  int    `json:"status"`
+	Message string `json:"message"`
+	Data    any    `json:"data"`
+}
+
+func ResponseJSON(c *gin.Context, status int, message string, data any) {
+	response := JsonResponse{
+		Status:  status,
+		Message: message,
+		Data:    data,
+	}
+
+	c.JSON(status, response)
+}
+```
+
+The code snippet above creates a `Book` and `JsonResponse` structs with the required properties using struct tags (e.g., `json:"title"`) and a helper function `ResponseJSON` to manage API responses.
+
+> The struct tag lets you send responses that fit into the JSON naming convention.
+
+### Create a new book
+
+To create a new book handler function, create an `api/handlers.go` file that will contain the application business logic. It’s important to separate the business logic from the data model, as it helps deliver scalable, maintainable, and testable code.
+
+```go
+package api
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/joho/godotenv"
+	"gorm.io/driver/postgres"
+	"gorm.io/gorm"
+	"log"
+	"net/http"
+	"os"
+)
+
+var DB *gorm.DB
+
+func InitDB() {
+	err := godotenv.Load()
+	if err != nil {
+		log.Fatal("Failed to connect to database:", err)
+	}
+
+	dsn := os.Getenv("DB_URL")
+	DB, err = gorm.Open(postgres.Open(dsn), &gorm.Config{})
+	if err != nil {
+		log.Fatal("Failed to connect to database:", err)
+	}
+
+	// migrate the schema
+	if err := DB.AutoMigrate(&Book{}); err != nil {
+		log.Fatal("Failed to migrate schema:", err)
+	}
+}
+
+func CreateBook(c *gin.Context) {
+	var book Book
+
+	//bind the request body
+	if err := c.ShouldBindJSON(&book); err != nil {
+		ResponseJSON(c, http.StatusBadRequest, "Invalid input", nil)
+		return
+	}
+	DB.Create(&book)
+	ResponseJSON(c, http.StatusCreated, "Book created successfully", book)
+}
+```
+
+The code snippet declares a global variable `DB` that holds the database connection and is then initialized inside the `InitDB` function. The `InitDB` function loads the environment variable to connect to the database and performs automatic schema migration. Finally, create a `CreateBook` handler that uses the `DB` variable to create a new book, handle errors, and return the appropriate response using the `ResponseJSON` helper.
+
+> When a function, type, or variable is declared with an initial capital letter, it is **exported**. This means it is visible and can be accessed by other packages.
+
+### Getting the list of books
+
+To retrieve the list of books, create a `GetBooks` handler that uses the `DB` variable to get the list of available books inside the database.
+
+```go
+func GetBooks(c *gin.Context) {
+	var books []Book
+	DB.Find(&books)
+	ResponseJSON(c, http.StatusOK, "Books retrieved successfully", books)
+}
+```
+
+### Get a single book
+
+To retrieve a book, create a `GetBook` handler that uses the `DB` variable to get a book matching the specified ID and returns the appropriate response.
+
+```go
+func GetBook(c *gin.Context) {
+	var book Book
+	if err := DB.First(&book, c.Param("id")).Error; err != nil {
+		ResponseJSON(c, http.StatusNotFound, "Book not found", nil)
+		return
+	}
+	ResponseJSON(c, http.StatusOK, "Book retrieved successfully", book)
+}
+```
+
+### Update a book
+
+To update a book, create an `UpdateBook` handler that uses the `DB` variable to get a book matching the specified ID, updates it, and returns the appropriate response.
+
+```go
+func UpdateBook(c *gin.Context) {
+	var book Book
+	if err := DB.First(&book, c.Param("id")).Error; err != nil {
+		ResponseJSON(c, http.StatusNotFound, "Book not found", nil)
+		return
+	}
+
+	// bind the request body
+	if err := c.ShouldBindJSON(&book); err != nil {
+		ResponseJSON(c, http.StatusBadRequest, "Invalid input", nil)
+		return
+	}
+
+	DB.Save(&book)
+	ResponseJSON(c, http.StatusOK, "Book updated successfully", book)
+}
+```
+
+### Delete a book
+
+To delete a book, create a `DeleteBook` handler that uses the `DB` variable to get a book matching the specified ID, deletes it, and returns the appropriate response.
+
+```go
+func DeleteBook(c *gin.Context) {
+	var book Book
+	if err := DB.Delete(&book, c.Param("id")).Error; err != nil {
+		ResponseJSON(c, http.StatusNotFound, "Book not found", nil)
+		return
+	}
+	ResponseJSON(c, http.StatusOK, "Book deleted successfully", nil)
+}
+```
+
+### Putting it all together
+
+With the handlers set up, you need to create the application entry point and specify the application routes. To do this, create a `cmd/main.go` file and add the code snippet below:
+
+```go
+package main
+
+import (
+	"github.com/gin-gonic/gin"
+	"go_book_api/api"
+)
+
+func main() {
+	api.InitDB()
+	r := gin.Default()
+
+	//routes
+	r.POST("/book", api.CreateBook)
+	r.GET("/books", api.GetBooks)
+	r.GET("/book/:id", api.GetBook)
+	r.PUT("/book/:id", api.UpdateBook)
+	r.DELETE("/book/:id", api.DeleteBook)
+
+	r.Run(":8080")
+}
+```
+
+The snippet above creates a `main` function that initializes the database, specifies the routes with the associated handlers, and runs the application on port `8080`.
+
+## Step 4: Testing the REST APIs
+
+To test the APIs, you need a [Postman](https://www.postman.com/downloads/) or any API testing application of your choice.
+
+In your terminal, start the development server by running the command.
+
+```bash
+go run cmd/main.go
+```
+
+Then, use the API testing client of your choice to test out the endpoints as shown below:
+
+### Create a book endpoint
+
+Use the `POST` method and pass in the required data to create a new book.
+
+```bash
+curl --location 'localhost:8080/book' \
+     --header 'Content-Type: application/json' \
+     --data '{
+       "title": "Go by Example: Programmer'\''s guide to idiomatic and testable code",
+       "author": "Inanc Gumus",
+       "year": 2021
+     }'
+```
+
+![Create a book](https://assets.roadmap.sh/guest/postman-create-book-558ii.png)
+
+### Get the list of books
+
+Use the `GET` method to get the list of existing books in the database.
+
+```bash
+curl --location 'localhost:8080/books'
+```
+
+![List of books](https://assets.roadmap.sh/guest/postman-list-books-7y7qi.png)
+
+### Get a book endpoint
+
+Use the `GET` method and add the ID to get the details of an existing book.
+
+```bash
+curl --location 'localhost:8080/book/3'
+```
+
+![Get a book](https://assets.roadmap.sh/guest/postman-get-book-mhlxj.png)
+
+### Update a book endpoint
+
+Use the `PUT` method and specify the ID and the data to update an existing book.
+
+```bash
+curl --location --request PUT 'localhost:8080/book/3' \
+    --header 'Content-Type: application/json' \
+    --data '{
+        "title": "Go by Example: Programmer'\''s guide to idiomatic and testable code - Updated",
+        "author": "Inanc Gumus",
+        "year": 2023
+    }'
+```
+
+![Updated a book](https://assets.roadmap.sh/guest/postman-update-book-1b5k2.png)
+
+### Delete a book
+
+Make a `DELETE` request with an already created book ID.
+
+```bash
+curl --location --request DELETE 'localhost:8080/book/3'
+```
+
+![Delete a book.](https://assets.roadmap.sh/guest/postman-delete-book-t325s.png)
+
+You can also query your Neon database to see the latest changes.
+
+![Neon database](https://assets.roadmap.sh/guest/neon-list-changes-mbxz0.png)
+
+## Step 5: Unit testing the API handler functions
+
+Go comes with a testing package that makes it easy to write unit tests, integration tests, functional tests, and end-to-end tests. To begin, create a `tests/main_test.go` file and add the code snippet below:
+
+```go
+package tests
+
+import (
+	"bytes"
+	"encoding/json"
+	"github.com/gin-gonic/gin"
+	"go_book_api/api"
+	"gorm.io/driver/sqlite"
+	"gorm.io/gorm"
+	"net/http"
+	"net/http/httptest"
+	"strconv"
+	"testing"
+)
+
+func setupTestDB() {
+	var err error
+	api.DB, err = gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
+	if err != nil {
+		panic("failed to connect test database")
+	}
+	api.DB.AutoMigrate(&api.Book{})
+}
+
+func addBook() api.Book {
+	book := api.Book{Title: "Go Programming", Author: "John Doe", Year: 2023}
+	api.DB.Create(&book)
+	return book
+}
+```
+
+The snippet above creates helper functions `setupTestDB` and `addBook`, which initialize a new SQLite in-memory database (`:memory:` ) specifically for testing purposes and insert a new book record into the test database, respectively.
+
+> Ending the test name with `_test.go` is a standard naming convention in the Go ecosystem.
+
+### Create a new book unit test
+
+Create a `TestCreateBook` test function that sets up a mock HTTP server using Gin, sends a POST request to create a book, and checks that the response matches the expected outcome and the HTTP status code defined in the `CreateBook` handler.
+
+```go
+func TestCreateBook(t *testing.T) {
+	setupTestDB()
+	router := gin.Default()
+	router.POST("/book", api.CreateBook)
+
+	book := api.Book{
+		Title: "Demo Book name", Author: "Demo Author name", Year: 2021,
+	}
+
+	jsonValue, _ := json.Marshal(book)
+	req, _ := http.NewRequest("POST", "/book", bytes.NewBuffer(jsonValue))
+
+	w := httptest.NewRecorder()
+	router.ServeHTTP(w, req)
+
+	if status := w.Code; status != http.StatusCreated {
+		t.Errorf("Expected status %d, got %d", http.StatusCreated, status)
+	}
+	var response api.JsonResponse
+	json.NewDecoder(w.Body).Decode(&response)
+
+	if response.Data == nil {
+		t.Errorf("Expected book data, got nil")
+	}
+}
+```
+
+### Get the list of books unit test
+
+Similar to the `TestCreateBook` test function, create a `TestGetBooks` that tests the `GetBooks` handler functionality of retrieving a list of books via a GET request.
+
+```go
+func TestGetBooks(t *testing.T) {
+	setupTestDB()
+	addBook()
+	router := gin.Default()
+	router.GET("/books", api.GetBooks)
+
+	req, _ := http.NewRequest("GET", "/books", nil)
+	w := httptest.NewRecorder()
+	router.ServeHTTP(w, req)
+
+	if status := w.Code; status != http.StatusOK {
+		t.Errorf("Expected status %d, got %d", http.StatusOK, status)
+	}
+
+	var response api.JsonResponse
+	json.NewDecoder(w.Body).Decode(&response)
+
+	if len(response.Data.([]interface{})) == 0 {
+		t.Errorf("Expected non-empty books list")
+	}
+}
+```
+
+### Get a book unit test
+
+Create a `TestGetBook` test function that tests the `GetBook` handler functionality of retrieving a single book that matches the specified ID via a GET request.
+
+```go
+func TestGetBook(t *testing.T) {
+	setupTestDB()
+	book := addBook()
+	router := gin.Default()
+	router.GET("/book/:id", api.GetBook)
+
+	req, _ := http.NewRequest("GET", "/book/"+strconv.Itoa(int(book.ID)), nil)
+	w := httptest.NewRecorder()
+	router.ServeHTTP(w, req)
+
+	if status := w.Code; status != http.StatusOK {
+		t.Errorf("Expected status %d, got %d", http.StatusOK, status)
+	}
+
+	var response api.JsonResponse
+	json.NewDecoder(w.Body).Decode(&response)
+
+	if response.Data == nil || response.Data.(map[string]interface{})["id"] != float64(book.ID) {
+		t.Errorf("Expected book ID %d, got nil or wrong ID", book.ID)
+	}
+}
+```
+
+### Update a book unit test
+
+Create a `TestUpdateBook` test function that tests the `UpdateBook` handler functionality of updating an existing book through a PUT request.
+
+```go
+func TestUpdateBook(t *testing.T) {
+	setupTestDB()
+	book := addBook()
+	router := gin.Default()
+	router.PUT("/book/:id", api.UpdateBook)
+
+	updateBook := api.Book{
+		Title: "Advanced Go Programming", Author: "Demo Author name", Year: 2021,
+	}
+	jsonValue, _ := json.Marshal(updateBook)
+
+	req, _ := http.NewRequest("PUT", "/book/"+strconv.Itoa(int(book.ID)), bytes.NewBuffer(jsonValue))
+	w := httptest.NewRecorder()
+	router.ServeHTTP(w, req)
+
+	if status := w.Code; status != http.StatusOK {
+		t.Errorf("Expected status %d, got %d", http.StatusOK, status)
+	}
+
+	var response api.JsonResponse
+	json.NewDecoder(w.Body).Decode(&response)
+
+	if response.Data == nil || response.Data.(map[string]interface{})["title"] != "Advanced Go Programming" {
+		t.Errorf("Expected updated book title 'Advanced Go Programming', got %v", response.Data)
+	}
+}
+```
+
+### Delete a book unit test
+
+Create a `TestDeleteBook` test function that tests the `DeleteBook` handler functionality of deleting an existing book through a DELETE request.
+
+```go
+func TestDeleteBook(t *testing.T) {
+	setupTestDB()
+	book := addBook()
+	router := gin.Default()
+	router.DELETE("/book/:id", api.DeleteBook)
+
+	req, _ := http.NewRequest("DELETE", "/book/"+strconv.Itoa(int(book.ID)), nil)
+	w := httptest.NewRecorder()
+	router.ServeHTTP(w, req)
+
+	if status := w.Code; status != http.StatusOK {
+		t.Errorf("Expected status %d, got %d", http.StatusOK, status)
+	}
+
+	var response api.JsonResponse
+	json.NewDecoder(w.Body).Decode(&response)
+
+	if response.Message != "Book deleted successfully" {
+		t.Errorf("Expected delete message 'Book deleted successfully', got %v", response.Message)
+	}
+
+	//verify that the book was deleted
+	var deletedBook api.Book
+	result := api.DB.First(&deletedBook, book.ID)
+	if result.Error == nil {
+		t.Errorf("Expected book to be deleted, but it still exists")
+	}
+}
+```
+
+Finally, you can run your test in the development environment using the command below:
+
+```bash
+GIN_MODE=release go test tests/main_test.go -v
+```
+
+> `GIN_MODE=release` is a command in Gin that tells it to mimic the production environment and run the test in an optimized mode.
+
+![running the test](https://assets.roadmap.sh/guest/running-the-test-nd189.png)
+
+## Adding authentication to the REST APIs
+
+An integral part of building a robust API is the authentication mechanism. It verifies the identity of a user or system using your API. When you have authentication set up in your API, you can:
+
+- Prevent unauthorized access to sensitive resources or data.
+- Control the level of access.
+- Track and log who accessed the API and what actions they performed.
+- Tailored responses or experiences for authenticated users.
+
+In Go, you can implement authentication using any of the following methods:
+
+- JSON Web Tokens (JWT).
+- OAuth 2.0.
+- Session-based authentication.
+- API Keys.
+
+For this project, you'll use JWT (JSON Web Tokens) to secure the API. The process begins with a user providing their credentials, such as a username and password. The system then verifies these credentials and issues a token, which the user can use to access protected endpoints.
+
+To get started, install the JWT package.
+
+```bash
+go get -u github.com/golang-jwt/jwt/v5
+```
+
+### Create a middleware
+
+Middlewares are functions or modules that intercept and process HTTP requests before they reach the final route handler or after the response leaves the handler. In this case, you want to check that the request has the right token before accessing any of the endpoints.
+
+To do this, first update your `.env` file with a secret token. The token ensures the security, authenticity, and integrity of the tokens.
+
+```
+SECRET_TOKEN=<REPLACE WITH A RANDOM LONG STRING>
+```
+
+Next, create a `middleware.go` file inside the `api` folder and add the snippet below:
+
+```go
+package api
+
+import (
+	"fmt"
+	"github.com/gin-gonic/gin"
+	"github.com/golang-jwt/jwt/v5"
+	"net/http"
+	"os"
+)
+
+// Secret key for signing JWT
+var jwtSecret = []byte(os.Getenv("SECRET_TOKEN"))
+
+func JWTAuthMiddleware() gin.HandlerFunc {
+	return func(c *gin.Context) {
+		tokenString := c.GetHeader("Authorization")
+		if tokenString == "" {
+			ResponseJSON(c, http.StatusUnauthorized, "Authorization token required", nil)
+			c.Abort()
+			return
+		}
+		// parse and validate the token
+		_, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
+			// Validate the signing method
+			if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
+				return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
+			}
+			return jwtSecret, nil
+		})
+		if err != nil {
+			ResponseJSON(c, http.StatusUnauthorized, "Invalid token", nil)
+			c.Abort()
+			return
+		}
+		// Token is valid, proceed to the next handler
+		c.Next()
+	}
+}
+```
+
+The snippet above creates a `JWTAuthMiddleware` function that uses the JWT package to intercept incoming requests and validate their JWT tokens before allowing the request to proceed to the handler.
+
+Next, update the `handlers.go` file with a `GenerateJWT` function that generates a JWT token-based default username and password.
+
+```go
+package api
+
+import (
+	//other imports
+	"github.com/golang-jwt/jwt/v5"
+)
+
+func GenerateJWT(c *gin.Context) {
+	var loginRequest LoginRequest
+	if err := c.ShouldBindJSON(&loginRequest); err != nil {
+		ResponseJSON(c, http.StatusBadRequest, "Invalid request payload", nil)
+		return
+	}
+	if loginRequest.Username != "admin" || loginRequest.Password != "password" {
+		ResponseJSON(c, http.StatusUnauthorized, "Invalid credentials", nil)
+		return
+	}
+	expirationTime := time.Now().Add(15 * time.Minute)
+	token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
+		"exp": expirationTime.Unix(),
+	})
+	// Sign the token
+	tokenString, err := token.SignedString(jwtSecret)
+	if err != nil {
+		ResponseJSON(c, http.StatusInternalServerError, "Could not generate token", nil)
+		return
+	}
+	ResponseJSON(c, http.StatusOK, "Token generated successfully", gin.H{"token": tokenString})
+}
+```
+
+> In a real-world application, the credentials used to generate the token will be specific to users and not the default ones.
+
+Lastly, update the `main.go` file inside the `cmd` folder to add a public route to generate a token and use the middleware to protect the API routes.
+
+```go
+package main
+
+import (
+	"github.com/gin-gonic/gin"
+	"go_book_api/api"
+)
+
+func main() {
+	api.InitDB()
+	r := gin.Default()
+
+	// Public routes
+	r.POST("/token", api.GenerateJWT)
+
+	// protected routes
+	protected := r.Group("/", api.JWTAuthMiddleware())
+	{
+		protected.POST("/book", api.CreateBook)
+		protected.GET("/books", api.GetBooks)
+		protected.GET("/book/:id", api.GetBook)
+		protected.PUT("/book/:id", api.UpdateBook)
+		protected.DELETE("/book/:id", api.DeleteBook)
+	}
+
+	r.Run(":8080")
+}
+```
+
+## Testing the REST API
+
+If you restart the server and make a request to any of the endpoints without a token, you’ll get unauthorized.
+
+```bash
+curl --location 'localhost:8080/books'
+```
+
+![Request without a Token](https://assets.roadmap.sh/guest/postman-test-rest-api-7711y.png)
+
+To test the API with a token, make a request to the token generation endpoint.
+
+```bash
+curl --location 'localhost:8080/token' \
+    --header 'Content-Type: application/json' \
+    --data '{
+      "username": "admin",
+      "password": "password"
+    }'
+```
+
+![](https://assets.roadmap.sh/guest/postman-create-token-x6yro.png)
+
+Then, use the generated token to make a request.
+
+```bash
+curl --location 'localhost:8080/books' \
+     --header 'Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzM3MDU3Njl9.ULspm6GR9Q0zqZWHifdFEeLZqgtw7k2FDDhSOpwcw4U'
+``` 
+
+![](https://assets.roadmap.sh/guest/postman-listing-books-aukjh.png)
+
+## Updating the unit test
+
+Since the API route is now protected, you also need to update the unit test to capture the authentication mechanism.
+
+```go
+package tests
+
+import (
+	// other imports
+	"github.com/golang-jwt/jwt/v5"
+)
+
+var jwtSecret = []byte(os.Getenv("SECRET_TOKEN"))
+
+func setupTestDB() {
+	// setupTestDB goes here
+}
+
+func addBook() api.Book {
+	// add book code goes here
+}
+
+func generateValidToken() string {
+	expirationTime := time.Now().Add(15 * time.Minute)
+	token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
+		"exp": expirationTime.Unix(),
+	})
+	tokenString, _ := token.SignedString(jwtSecret)
+	return tokenString
+}
+
+func TestGenerateJWT(t *testing.T) {
+	router := gin.Default()
+	router.POST("/token", api.GenerateJWT)
+
+	loginRequest := map[string]string{
+		"username": "admin",
+		"password": "password",
+	}
+
+	jsonValue, _ := json.Marshal(loginRequest)
+	req, _ := http.NewRequest("POST", "/token", bytes.NewBuffer(jsonValue))
+
+	w := httptest.NewRecorder()
+	router.ServeHTTP(w, req)
+
+	if status := w.Code; status != http.StatusOK {
+		t.Errorf("Expected status %d, got %d", http.StatusOK, status)
+	}
+
+	var response api.JsonResponse
+	json.NewDecoder(w.Body).Decode(&response)
+
+	if response.Data == nil || response.Data.(map[string]interface{})["token"] == "" {
+		t.Errorf("Expected token in response, got nil or empty")
+	}
+}
+```
+
+The snippet above imports the required dependency, creates a `generateValidToken` helper and `TestGenerateJWT` function that generates a token and tests the token generation endpoint, respectively.
+
+Next, use the `generateValidToken` helper function to modify the request object for each test by adding authentication to the route, generating a token, and adding it to the request header. For example, the test for creating a book will look like this:
+
+```go
+func TestCreateBook(t *testing.T) {
+	setupTestDB()
+	router := gin.Default()
+	protected := router.Group("/", api.JWTAuthMiddleware()) // add
+	protected.POST("/book", api.CreateBook)                 // add
+
+	token := generateValidToken() // add
+
+	book := api.Book{
+		Title: "Demo Book name", Author: "Demo Author name", Year: 2021,
+	}
+	jsonValue, _ := json.Marshal(book)
+
+	req, _ := http.NewRequest("POST", "/book", bytes.NewBuffer(jsonValue))
+	req.Header.Set("Authorization", token) // add
+
+	w := httptest.NewRecorder()
+	router.ServeHTTP(w, req)
+
+	if status := w.Code; status != http.StatusCreated {
+		t.Errorf("Expected status %d, got %d", http.StatusCreated, status)
+	}
+
+	var response api.JsonResponse
+	json.NewDecoder(w.Body).Decode(&response)
+
+	if response.Data == nil {
+		t.Errorf("Expected book data, got nil")
+	}
+}
+```
+
+## Adding documentation to the REST APIs
+
+Documentation is an integral part of your APIs. It helps you communicate intent and help others understand, maintain, and utilize your APIs effectively. Documentation can be in the form of the following:
+
+- **Technical documentation** that guides developers on APIs, configurations, and architecture of the system.
+- **User manual** that helps end-users understand how to use the product.
+- **Internal documentation** that captures internal processes, workflows, and other operational details.
+- **Code comments** that provide inline explanations of specific sections of the codes.
+
+In Go, you have access to a variety of tools when it comes to generating, maintaining, and displaying documentation. Below are some of the widely used ones:
+
+- GoDoc
+- pkg.go.dev
+- go doc
+- godocdown
+- Swagger/OpenAPI
+
+In this project, you’ll use GoDoc to add documentation.
+
+To get started, first update the [Go version](https://go.dev/dl/) based on your operating system. Then, install the GoDoc package using the command below:
+
+```bash
+go get golang.org/x/tools/cmd/godoc
+```
+Next, modify the `handlers.rs` file and add comments to describe what each helper function and handlers do.
+
+```go
+/*
+Package api provides RESTful handlers and middleware for managing a library of books.
+It includes functionality for creating, reading, updating, and deleting books, as well as generating JWT tokens for authentication.
+*/
+package api
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/golang-jwt/jwt/v5"
+	"github.com/joho/godotenv"
+	"gorm.io/driver/postgres"
+	"gorm.io/gorm"
+	"log"
+	"net/http"
+	"os"
+	"time"
+)
+
+var DB *gorm.DB
+
+// InitDB initializes the database connection using environment variables.
+// It loads the database configuration from a .env file and migrates the Book schema.
+func InitDB() {
+	err := godotenv.Load()
+	if err != nil {
+		log.Fatal("Failed to connect to database:", err)
+	}
+	dsn := os.Getenv("DB_URL")
+	DB, err = gorm.Open(postgres.Open(dsn), &gorm.Config{})
+	if err != nil {
+		log.Fatal("Failed to connect to database:", err)
+	}
+	// Migrate the schema
+	if err := DB.AutoMigrate(&Book{}); err != nil {
+		log.Fatal("Failed to migrate schema:", err)
+	}
+}
+
+// CreateBook handles the creation of a new book in the database.
+// It expects a JSON payload with book details and responds with the created book.
+func CreateBook(c *gin.Context) {
+	var book Book
+	if err := c.ShouldBindJSON(&book); err != nil {
+		ResponseJSON(c, http.StatusBadRequest, "Invalid input", nil)
+		return
+	}
+	DB.Create(&book)
+	ResponseJSON(c, http.StatusCreated, "Book created successfully", book)
+}
+
+// GetBooks retrieves all books from the database.
+// It responds with a list of books.
+func GetBooks(c *gin.Context) {
+	var books []Book
+	DB.Find(&books)
+	ResponseJSON(c, http.StatusOK, "Books retrieved successfully", books)
+}
+
+// other handlers goes below
+```
+
+Finally, test the documentation by running the command below:
+
+```bash
+godoc -http=:6060
+```
+
+Open your browser and navigate to the documentation URL:
+
+```bash
+http://localhost:6060/pkg/go_book_api/api/
+```
+
+![Book API documentation](https://assets.roadmap.sh/guest/golang-package-docs-el1vi.png)
+
+## Next steps
+
+Go’s simplicity, built-in concurrency, cloud-native features, and performance make it a popular choice among developers. The growing ecosystem and community support also ensure that you have the right tools and libraries to build and maintain RESTful APIs efficiently and any other application you want to build.
+
+Apart from the Gin framework, Go also has popular web frameworks like Echo, Revel, and many more for building APIs. To stay up-to-date with the latest changes, check out the [Go roadmap](https://roadmap.sh/golang).
diff --git a/src/data/guides/how-to-become-frontend-developer.md b/src/data/guides/how-to-become-frontend-developer.md
index f904f8a01..15c154f31 100644
--- a/src/data/guides/how-to-become-frontend-developer.md
+++ b/src/data/guides/how-to-become-frontend-developer.md
@@ -1,7 +1,7 @@
 ---
 title: 'How to Become a Front-End Developer in 7 Steps'
 description: 'Learn how to become a front-end developer in 7 clear steps. Start your coding journey with practical tips and resources today!'
-authorId: kamran
+authorId: william
 excludedBySlug: '/frontend/how-to-become-frontend-developer'
 seo:
   title: 'How to become a Front-End Developer in 7 Steps'
diff --git a/src/data/guides/java-vs-javascript.md b/src/data/guides/java-vs-javascript.md
new file mode 100644
index 000000000..dff887493
--- /dev/null
+++ b/src/data/guides/java-vs-javascript.md
@@ -0,0 +1,193 @@
+---
+title: 'Java vs JavaScript: Key Differences Explained'
+description: 'Understand the unique strengths of Java and JavaScript to decide which suits your programming needs best.'
+authorId: ekene
+excludedBySlug: '/java/vs-javascript'
+seo:
+  title: 'Java vs JavaScript: Key Differences Explained'
+  description: 'Understand the unique strengths of Java and JavaScript to decide which suits your programming needs best.'
+  ogImageUrl: 'https://assets.roadmap.sh/guest/java-vs-javascript-66pqp.jpg'
+relatedTitle: 'Other Guides'
+isNew: false
+type: 'textual'
+date: 2025-01-30
+sitemap:
+  priority: 0.7
+  changefreq: 'weekly'
+tags:
+  - 'guide'
+  - 'textual-guide'
+  - 'guide-sitemap'
+---
+
+![Java vs JavaScript](https://assets.roadmap.sh/guest/java-vs-javascript-66pqp.jpg)
+
+Java and JavaScript are among the most popular programming languages in web development. They were both created in 1995: Sun Microsystems released Java in May, and Netscape released JavaScript in September. Despite coming out in the same year with similar names, Java and Javascript are two distinct programming languages with different designs, purposes, and use cases.
+
+[Java](https://roadmap.sh/java) is an object-oriented programming language used to create complex web applications ranging from mobile apps to large-scale enterprise software like banking software. Java is platform-independent—it can work on any device with a Java Virtual Machine **(JVM)** installed. This makes it suitable for backend development and high-performance software.
+
+In contrast, [JavaScript](https://roadmap.sh/javascript) is a lightweight scripting language for creating dynamic web interactions. It runs in web browsers and enables developers to build interactive web pages. Examples of these interactions include forms, animations, and more. JavaScript is often used alongside HTML and CSS in frontend web development. However, full stack developers now use JavaScript through Node.js to create backend applications.
+
+Knowing when to use each language will help you choose the right one for your projects and career goals. I will explain the key differences between Java and JavaScript in this guide. I will also cover their syntax, runtime environments, key features, advantages, and disadvantages.
+
+**TL;DR:**
+Java and JavaScript may share similar names, but they serve distinct purposes. Thanks to its platform independence and high performance, Java is a robust, object-oriented language ideal for building large-scale applications like enterprise software and Android apps. Conversely, JavaScript is a lightweight, flexible scripting language used for creating dynamic, interactive web pages and full stack applications with tools like Node.js. Each language excels in different use cases—choose Java for backend-heavy, scalable systems and JavaScript for web interactivity and rapid development.
+
+## The key differences between Java and JavaScript
+
+Note that the purpose of this guide is not to compare or select a winner between Java and JavaScript. Instead, it aims to help you know the strengths of each programming language and which to use.
+
+The table below summarizes the differences between both programming languages:
+
+| Characteristic        | Java                                              | JavaScript                                                    |
+| --------------------- | ------------------------------------------------- | ------------------------------------------------------------- |
+| Syntax                | Statically typed, verbose                         | Dynamically typed, concise                                    |
+| Runtime environment   | JVM                                               | Web Browser                                                   |
+| Execution environment | Server-side programming                           | Client-side, server-side (Node.js)                            |
+| Primary use case      | Server-side application development, Android apps | Client-side development                                       |
+| Performance           | High-performance, optimized                       | Often slower, more flexible                                   |
+| Compilation           | Compiled into bytecode (compiled language)        | Interpreted in web browsers or Node.js (interpreted language) |
+
+### Java vs. JavaScript: Syntax
+
+Java and JavaScript have different syntaxes. Java is a statically typed language with a more verbose syntax. It has a more rigid syntax, so developers must declare exactly the variable type they use. Doing this leads to fewer errors but requires more lines of code to complete a task. The following are syntax code snippets showing this:
+
+```java
+int number = 5;
+String message = "Sign up on roadmap";
+```
+
+In contrast, JavaScript is a dynamically typed language with a more concise syntax. It is more flexible, so you do not have to declare what type of variable you are using. Doing this makes coding faster but leads to runtime errors if you are not careful. Example of a JavaScript code syntax:
+
+```javascript
+let number = 5;
+number = 'Sign up on roadmap'; // The number variable can be casually reassigned to a string
+```
+
+Usually saved in a .js file extension, this code will show **"Sign up on roadmap"** on the console.
+
+### Java vs. JavaScript: Execution and runtime
+
+Java is often used for server-side programming. It is a compiled language that requires a Java Virtual Machine **(JVM)** to run Java code. Before running your code, it's compiled into bytecode, a platform-independent format. The JVM then executes the bytecode to ensure that Java programs run on any system with JVM installed. It makes Java a good choice for large-scale applications that run on any operating system. These operating systems include Windows, macOS, Linux, and mobile devices.
+
+![](https://assets.roadmap.sh/guest/java-vs-javascript-execution-and-runtime-csnnz.png)
+
+JavaScript, however, is often used for client-side web development. It is an interpreted language that runs in the web browser **(Google Chrome, Internet Explorer, etc.)** or runtime environment like Node.js. There is no separate compilation step like in Java programming language. Instead, developers can see the results of their code changes as soon as they make them. Doing this makes JavaScript a good choice for building interactive websites.
+
+### Java vs. JavaScript: Use case suitability
+
+Java is an [object-oriented programming language](https://www.techtarget.com/searchapparchitecture/definition/object-oriented-programming-OOP) used to build various applications. It's quick, dependable, and versatile, so it's great for creating:
+
+- Native apps.
+- Data analysis tools.
+- Desktop apps.
+- Backend apps.
+- Android apps.
+
+![](https://assets.roadmap.sh/guest/java-vs-javascript-use-case-suitability-ev9gw.png)
+
+JavaScript is a scripting language used to create a web application user interface. Its dynamic nature makes it work well with web browsers, which is good for:
+
+- Game development.
+- Interactive web page experiences.
+- Cross-platform app development (with React Native framework).
+- Frontend and full stack development (Node.js).
+
+Java and JavaScript are important for a lot of leading tech companies**.** Tech companies like \*\*\*\*Amazon, Netflix, and Uber use Java for their backend systems, while Google, Facebook, and Netflix use JavaScript for their frontend services.
+
+### Performance impacts
+
+Java's compiled nature makes it better for building large-scale applications. However, its setup and execution can take a bit more time. So, it's not as perfect as JavaScript for tasks that need quick feedback, like chat apps.
+
+JavaScript focuses on being fast and flexible for client-side interactions. Its event-driven nature makes carrying out tasks like document object model (DOM) manipulation easy. But, it may struggle with CPU-intensive tasks like data compression and decompression.
+
+## Key features of JavaScript and Java
+
+Java and JavaScript each have unique features that are perfect for specific tasks. The table below summarizes the key features of both programming languages:
+
+| Features          | Java                         | JavaScript                                                       |
+| ----------------- | ---------------------------- | ---------------------------------------------------------------- |
+| Concurrency       | Multi-threading support      | Event-driven, single-threaded with asynchronous built-in support |
+| Inheritance model | Class-based inheritance      | Prototype-based inheritance                                      |
+| Memory management | Automatic garbage collection | Automatic garbage collection (modern engines)                    |
+| Cross-platform    | JVM                          | Browsers and on servers (Node.js)                                |
+| Paradigm          | Primarily object-oriented    | Multi-paradigm                                                   |
+
+### Multi-threading vs. Asynchronous calls
+
+Java is an object-based programming language with built-in support for multi-threading. It lets you write applications that run multiple threads **(many tasks)** at the same time. Multi-threading is especially useful for server-side applications, such as web application servers. It lets them juggle many requests at once, making them run quicker and more responsive.
+
+JavaScript, unlike Java, is single-threaded. So, it can only work on one task at a time. However, It has built-in support for asynchronous programming **(callbacks, promises, and async/await)**. This way, developers can work on many background tasks without blocking the main task. It helps create responsive and non-blocking web applications, e.g., chat applications.
+
+The event-driven nature of the JavaScript language is another key feature. It enables websites to react to user actions, e.g., button clicks, so it's great for building the frontend of websites. However, Java's object-oriented nature makes it great for creating robust backends of websites.
+
+### Memory management
+
+Java uses automatic garbage collection \*\*\*\*for memory management. So, developers don't have to worry about managing memory for their apps by themselves. The Java garbage collector cleans up and gets rid of unused memory often. It prevents memory leaks by removing the need for manual memory management. Due to this, Java is a good choice for backend systems that need to be scalable and stable.
+
+![](https://assets.roadmap.sh/guest/memory-management-tdg2z.png)
+
+Developers had to handle memory management themselves in earlier versions of JavaScript. However, [modern JavaScript engines](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_management) like V8 now have good garbage collection systems. These updates improve memory management and make apps and websites run faster. It also enables developers to focus on how to write code rather than on memory issues.
+
+### Cross-platform support
+
+Although both Java and JavaScript support different platforms, they provide good cross-platform compatibility. Java is a platform-independent language because it runs on the Java platform. Any device with an installed Java Virtual Machine can run the Java code you write. It is great for developers because they can write their code once and use it anywhere.
+
+![](https://assets.roadmap.sh/guest/cross-platform-support-ck38q.png)
+
+In contrast, JavaScript operates in web browsers. It is easy to use on all devices and platforms without extra setup. Any device can run your JavaScript code as long as it has a web browser. Also, with tools like Node.js, you can now use JavaScript for server-side development. It makes it easy for a full stack developer to work with JavaScript on frontend and backend projects. Thanks to Node.js, JavaScript can run on many platforms past the browser, e.g., Windows, MacOS, and Linux.
+
+## Advantages and disadvantages of Java and JavaScript
+
+When choosing between both languages, weigh their strengths and weaknesses. You can determine what is best for your project by being aware of these factors.
+
+![](https://assets.roadmap.sh/guest/advantages-and-disadvantages-of-java-and-javascript-4kx25.png)
+
+### Advantages of Java
+
+- **Security**: Java has strong built-in security features like the bytecode verification. It keeps your code secure for applications that need data protection, e.g., banking apps.
+- **Security**: Java has strong built-in security features like the bytecode verification. This keeps Java code secure for applications that need data protection, e.g., banking apps.
+- **Ecosystem**: Java is a popular programming language among developers. Java's popularity has led to a huge library and framework ecosystem, e.g., Spring and Hibernate. They make it easier to learn Java and create large-scale enterprise software applications.
+
+### Disadvantages of Java
+
+- **Verbose Syntax**: Java can be a pain to learn because of its complex syntax and verbose code. It needs more code lines than other programming languages, like JavaScript. This can slow down the building process of websites and apps and be difficult to maintain.
+- **Complex learning curve:** Java is a complex language, especially for beginners. Its many programming concepts, syntax, etc., make it hard to learn Java.
+
+### Advantages of JavaScript
+
+- **Easy learning curve**: It is easier to learn JavaScript because of its flexible syntax. Unlike Java, your code will still work if you forget specific rules like semicolons. So, it's the first programming language for most newbies going into web development.
+- **Flexibility**: JavaScript is a versatile programming language. It works for both frontend and backend development **(with Node.js)**. You can build a whole web application from start to finish using JavaScript.
+- **Large Ecosystem**: One major advantage of JavaScript is its ecosystem. It has a large and active ecosystem of libraries and frameworks, e.g., React and Vue. Unlike other languages, JavaScript's ecosystem is always growing with new tools and resources. This makes learning JavaScript and building web apps way easier for developers.
+- **Less overhead**: JavaScript has less overhead compared to other languages. It is a lightweight programming language that needs fewer system resources to run. It helps speed up web apps, so pages load and respond fast to user actions **(e.g., button clicks)**.
+
+### Disadvantages of JavaScript
+
+- **Security risks:** Poorly written or insecure JavaScript code can cause client-side security risks. Since JavaScript code runs on the user's browser, anyone visiting your website can see it. Hackers can abuse it, causing security problems like [Cross-Site Scripting](https://portswigger.net/web-security/cross-site-scripting) (XSS).
+- **Browser inconsistencies:** JavaScript can have browser inconsistencies. Web browsers like Google Chrome might interpret JavaScript code in different ways. It could cause issues where your website or web app works fine in one browser but not in another. This results in difficulty building sites that work the same on all browsers.
+
+## Factors to consider when choosing between JavaScript and Java
+
+Deciding between Java or JavaScript comes down to a few factors. It is not about one language being better; it's just about picking the one that works best for you. Let's take a closer look at these factors:
+
+![](https://assets.roadmap.sh/guest/factors-to-consider-when-choosing-between-java-and-javascript-jelvx.png)
+
+### Personal preference
+
+When choosing between Java or JavaScript, go with whatever you like best. For a flexible, growing programming language, choose JavaScript.
+
+Choose Java if you enjoy building complex systems with an emphasis on security. Also, if you are new to coding, JavaScript might be easier to learn. It lets you build interactive websites with hardly any setup needed. However, you might prefer Java if you have experience with object-oriented programming **(OOP)**.
+
+### Career goals and professional development
+
+If you want to start a career as a developer, it is important to consider what you want to achieve in the long run. You should base your decision on what kind of projects you want to work on and the industry. If you intend to work at start-ups or companies where you build interactive web apps, then JavaScript is the way to go. But if you are considering going into finance, healthcare, or any industry that relies on robust and scalable enterprise applications, consider learning Java.
+
+### Project requirements
+
+The kind of project you are working on also helps you figure out which of these two languages is the better pick. JavaScript is the way to go if you want to build an interactive web app. Its flexibility allows you to handle many tasks, so it's suitable for fast-paced projects. Java is the better choice to build mobile apps for Android. JavaScript is also better for projects with a tight deadline due to its simpler syntax and fast development time.
+
+## What next?
+
+Knowing the difference between Java and JavaScript will help you choose one to learn or one for a specific project. JavaScript, for example, doesn't have to be the only language you know; you can learn both. Learning both languages will open up more job options and make you a versatile developer.
+
+However, if you are a beginner, focus on being good at one language before learning another. To stay up-to-date on the latest developments in programming, visit [roadmap.sh](http://roadmap.sh). It has tutorials, resources, and everything you need to get started.
diff --git a/src/data/guides/java-vs-python.md b/src/data/guides/java-vs-python.md
new file mode 100644
index 000000000..037ab086f
--- /dev/null
+++ b/src/data/guides/java-vs-python.md
@@ -0,0 +1,294 @@
+---
+title: 'Java vs Python: Which will suit you best?'
+description: 'Wondering which language is right for you? Explore our comprehensive Java vs Python guide to find the best option for your career.'
+authorId: ekene
+excludedBySlug: '/java/vs-python'
+seo:
+  title: 'Java vs Python: Which will suit you best?'
+  description: 'Wondering which language is right for you? Explore our comprehensive Java vs Python guide to find the best option for your career.'
+  ogImageUrl: 'https://assets.roadmap.sh/guest/java-vs-python-xuk2b.jpg'
+relatedTitle: 'Other Guides'
+isNew: true
+type: 'textual'
+date: 2025-01-17
+sitemap:
+  priority: 0.7
+  changefreq: 'weekly'
+tags:
+  - 'guide'
+  - 'textual-guide'
+  - 'guide-sitemap'
+---
+
+![Java vs Python](https://assets.roadmap.sh/guest/java-vs-python-xuk2b.jpg)
+
+Java and Python are two of the most popular programming languages, widely adopted for projects of all sizes. But when should you choose Java over Python, or vice versa? Which language enhances productivity during prototyping? And which ecosystem is better equipped to address modern software engineering challenges, such as those in artificial intelligence? These questions can be tough to answer and may slow down your development process.
+
+Having worked as an engineer building small to enterprise-scale projects, I’ve seen how [Java](https://roadmap.sh/java) and [Python](https://roadmap.sh/python) compare to each other in terms of performance, scalability, and developer experience. In this guide, I’ll discuss their key features and practical use cases to help you decide the best language for your next project.
+
+The table below summarizes the key features of Java and Python to help you choose the right language for your next project:
+
+| **Feature**                 | **Java**                                                              | **Python**                                                         |
+| --------------------------- | --------------------------------------------------------------------- | ------------------------------------------------------------------ |
+| **Type**                    | Compiled to bytecode, runs on the JVM                                 | Interpreted language, runs on Python interpreter                   |
+| **Syntax**                  | Verbose, object oriented language                                     | Simple, easy to read and write, with dynamic typing                |
+| **Performance**             | Faster due to static typing and JVM optimizations                     | Slower because of dynamic typing and interpreted execution         |
+| **Memory Management**       | Automatic garbage collection (JVM)                                    | Automatic garbage collection (via Python's garbage collector)      |
+| **Concurrency Model**       | Multi-threading with JVM threads                                      | Threading and multiprocessing (GIL limits true parallelism)        |
+| **Cross-Platform**          | JVM ensures compatibility across platforms                            | Platform-independent, requires Python runtime installed            |
+| **Error Handling**          | Exception handling (try-catch)                                        | Exception handling with simpler syntax                             |
+| **Learning Curve**          | Steeper, especially for beginners, due to verbosity                   | Beginner-friendly, intuitive syntax                                |
+| **Use Cases**               | Enterprise applications, Android app development, large-scale systems | Data science, web development, scripting, AI, machine learning     |
+| **Community and Libraries** | Mature, extensive ecosystem with robust frameworks                    | Vast and active community, rich libraries for diverse use cases    |
+| **Scalability**             | Excellent for large-scale, high-performance systems                   | Good for scaling applications but may face performance bottlenecks |
+
+When it comes to adoption, both languages rank among the top choices for developing applications across platforms like web, mobile, and IoT.
+
+![Stack Overflow survey 2024](https://assets.roadmap.sh/guest/stack-overflow-survey-2024-ukhae.png)
+
+Before looking at these features in detail, let’s take a closer look at these two programming languages.
+
+## Java
+
+[Java](https://www.java.com/en/) is a high-level, object-oriented, and class-based programming language developed in 1995 by Sun Microsystems (now owned by Oracle). It is designed to have as few implementation details as possible, and it is widely used for building applications across a range of platforms such as mobile, desktop, web, and enterprise systems. Java follows the “Write Once, Run Anywhere” (WORA) philosophy, which means compiled Java code can run on any platform with a Java Virtual Machine (JVM).
+
+## Core features of Java
+
+Below are the core features of Java that make it a powerhouse for building a range of applications:
+
+![Java features](https://assets.roadmap.sh/guest/core-features-of-java-hjs55.png)
+
+1. **Platform independence**: Java code compiles into bytecode, which is portable and can run on any type of computer, including Windows, macOS, and Linux systems, as long as a JVM is available.
+2. **Object oriented programming language**: Java follows the object oriented programming (OOP) paradigm of organizing code into reusable objects, functions, and classes, which makes it more intuitive for building large-scale projects. It also incorporates core OOP principles like encapsulation, inheritance, and polymorphism.
+3. **Scalability and robustness**: Java has features like exception handling, memory management, and garbage collection, which makes it reliable, robust, and well-suited for building large-scale enterprise applications.
+4. **Security**: Java has built-in security mechanisms like sandboxing, cryptography libraries, and bytecode verification, which checks for illegal code and performs runtime security checks. These features make it a preferred choice for security-conscious applications in banking and enterprise environments.
+5. **Multithreading**: Java supports running more than one thread at a time. The concurrent support of executing tasks makes it an excellent choice for building performance-intensive applications.
+6. **Rich APIs and community support**: Java comes with built-in standard libraries for handling tasks like data structures, file management, and networking. Additionally, it has a robust community that is constantly building new libraries and frameworks or extending existing ones.
+
+## Advantages of Java
+
+Below are some of the benefits you get when you use Java to build your applications:
+
+- Java is enterprise-ready because it can handle the heavy load most modern applications need.
+- The syntax is straightforward and relatively easy to learn compared to languages like C++.
+- It has a Just-In-Time (JIT) compiler that improves runtime performance, which makes it an ideal language for building fast applications.
+- There’s a large and active Java community with tons of libraries, frameworks, and resources that beginners can use or experts can rely on when they run into problems.
+- The WORA principle ensures that applications built with Java run on any platform without any modification.
+
+## Disadvantages of Java
+
+While Java's speed and efficiency make it ideal for building robust and scalable applications, there are some limitations to consider:
+
+- Java syntax tends to be verbose compared to newer languages like Python, which can make the code harder to read and manage.
+- The JVM layer makes Java slower than low-level languages like C or C++.
+- Automatic garbage collection makes memory management easier, but it also limits how much control you have if you need to manage memory manually.
+- Java isn’t the best choice for tasks like scientific computing, data analysis, or machine learning, where other languages might shine.
+
+## Python
+
+[Python](https://www.python.org/) is a high-level, all-purpose, popular programming language known for its readability and simplicity. It was designed by Guido van Rossum in 1991 with a focus on code readability with clear syntax and indentation. Python supports programming paradigms like procedural, object-oriented, and functional and is widely used in data science, software development, artificial intelligence (AI), and automation.
+
+## Core features of Python
+
+Below are the core features of Python that make it a go-to programming language for building all sorts of applications:
+
+![Python features](https://assets.roadmap.sh/guest/core-features-of-python-c357l.png)
+
+1. **Simple and readable syntax**: Python’s syntax is intuitive for both beginners and experienced developers, thanks to its similarity to the English language. It’s also clean and concise, so you can achieve your goals with fewer lines of code.
+2. **Interpreted programming language**: Python uses an interpreter to execute code line by line, which simplifies debugging and testing.
+3. **Support for multiple paradigms**: Python accommodates different programming styles, such as object-oriented, functional, and procedural programming, giving you flexibility on how to write code.
+4. **Cross-platform compatibility**: Python is platform-independent and can run on Windows, macOS, and Linux.
+5. **Rich ecosystem and community**: Python offers a wide range of libraries and frameworks, like pandas, TensorFlow, Flask, and Django, for building just about anything. Plus, it has an active and growing community that contributes to its development and provides resources for troubleshooting and learning.
+6. **Dynamic typing**: Python is dynamically typed, so you don’t need to specify variable types when declaring them, making coding faster and more flexible.
+
+## Advantages of Python
+
+Below are some of the benefits you get when you use Python to build your applications:
+
+- The simple and English language-like syntax makes it an excellent choice for developers.
+- The syntax is concise and supports dynamic typing, which reduces development time when compared to other verbose languages.
+- Python is open-source and does not require any license before use, modification, or distribution.
+- Python has extensive libraries, frameworks, and supportive communities that make it a versatile language for web development, artificial intelligence, and data science.
+
+## Disadvantages of Python
+
+While Python's simple and yet elegant syntax makes it a general-purpose language for building all sorts of applications, there are some limitations to consider:
+
+- Python's use of an interpreter makes it slower when compared to a compiled language like Java.
+- Python uses Global Interpreter Lock, a mechanism that allows only a single thread to access the interpreter, which makes it not suitable for resource-intensive applications that need to run multiple threads.
+- Python has limited support for mobile development.
+- Python’s dynamic typing and ease of use can lead to higher memory consumption.
+- The dynamic typing of Python means errors only appear at runtime, which can cause issues in larger projects.
+
+Both Java and Python come with a huge ecosystem of libraries and frameworks for building various applications across devices and platforms. But how do you decide which one is the right fit for you? Let’s dive into a side-by-side comparison of these two popular languages to help you make an informed choice.
+
+## Performance
+
+Java is faster than Python because it uses a compiler that compiles Java code into bytecode that the JVM then executes. The JVM also supports Just-In-Time (JIT) compilation, a program that converts bytecode into native code during the execution of a program, significantly improving performance.
+
+Python, on the other hand, uses an interpreter to execute Python code line by line. This approach introduces latency, which can impact application performance. Furthermore, Python is dynamically typed, meaning type-checking happens at runtime, which can further affect speed.
+
+For instance, if you’re building a financial application that requires real-time support, low latency, and performance at scale, Java is the better choice compared to Python. However, if your focus is on development speed rather than raw performance, then Python is a more suitable option.
+
+## Memory management
+
+Java uses garbage collection within the JVM to automatically manage the allocations and deallocation of memory. The allocation mechanism makes it an ideal choice for applications that require long runtimes. However, Java also tends to consume more memory because of the JVM.
+
+Python also uses garbage collection to automatically manage memory. Although memory handling is simpler, the Global Interpreter Lock can limit multithreading, especially in CPU-intensive tasks.
+
+## Concurrency
+
+Concurrency is important for building applications that require running multi-threaded environments where tasks are executed in parallel (like web servers, real-time banking systems, and stock trading platforms). Both Java and Python handle concurrency differently due to their design philosophies, threading models, and runtime environments.
+
+Java handles multi-threading through the `java.lang.Thread` class and `java.util.concurrent` package, which maps directly to the operating system threads and enables better use of the processor. Furthermore, the JVM also minimizes latency in concurrent tasks, which makes it a perfect programming language for building CPU-heavy applications.
+
+Python also provides a high-level interface for working with threads. It uses events and coroutines to enable running tasks in parallel. As compared to Java, Python’s GIL limits the CPU-bound task and can result in higher overhead.
+
+The table below summarizes what to consider when choosing either Java or Python for CPU-heavy tasks:
+
+| **Feature**           | **Java**                               | **Python**                           |
+| --------------------- | -------------------------------------- | ------------------------------------ |
+| **Concurrency Model** | Multi-threading, parallelism           | Threads, processes, asynchronous I/O |
+| **Performance**       | Better for CPU-bound tasks             | Better for I/O-bound tasks           |
+| **Ease of Use**       | Complex                                | Simplified                           |
+| **Ecosystem**         | Extensive libraries, enterprise-ready  | Lightweight, flexible options        |
+| **Scalability**       | High for multi-core systems            | Limited for CPU-bound tasks          |
+| **Best Fit**          | High-performance and real-time systems | Web scraping, data pipelines         |
+
+## Java vs. Python: Error handling
+
+Java has a robust error-handling mechanism that makes it a perfect choice for enterprise applications that demand high reliability and predictability. Java uses checked and unchecked exceptions, Try-Catch-Finally block, and custom exceptions by extending the `Exception` or `RuntimeException` classes. These options make error handling predictable and enable precise error handling.
+
+```java
+// java code examples
+public class ErrorHandlingExample {
+    public static void main(String[] args) {
+        System.out.println(divide(10, 2)); // Result: 5.0
+        System.out.println(divide(10, 0)); // Error: Division by zero is not allowed.
+    }
+
+    public static String divide(int a, int b) {
+        try {
+            int result = a / b;
+            return "Result: " + result;
+        } catch (ArithmeticException e) {
+            return "Error: Division by zero is not allowed.";
+        } catch (Exception e) {
+            return "Error: " + e.getMessage();
+        } finally {
+            System.out.println("Execution completed.");
+        }
+    }
+}
+```
+
+Python also has exception classes, Try-Except-Finally block, else clause, and custom exceptions by extending the `Exception` class to handle errors.
+
+```python
+# python code examples
+def divide(a, b):
+    try:
+        result = a / b
+    except ZeroDivisionError:
+        return "Error: Division by zero is not allowed."
+    except Exception as e:
+        return f"Error: {str(e)}"
+    else:
+        return f"Result: {result}"
+    finally:
+        print("Execution completed.")
+
+print(divide(10, 2))  # Result: 5.0
+print(divide(10, 0))  # Error: Division by zero is not allowed.
+```
+
+In comparison, Java enforces handling certain exceptions at compile time, while Python does not differentiate between checked and unchecked exceptions.
+
+## Java vs. Python: Learning curve
+
+Java has a steeper learning curve than Python. Factors like syntax, complexity, programming principles, and practical applications affect the adoption of these two languages. Beginners often find Java’s code verbose because it requires explicit declaration for variable types and methods, which can sometimes be difficult for both beginners and experts to read. For example, a simple “Hello World!” program in Java requires defining a class and a main method:
+
+```java
+// java code examples
+public class HelloWorld {
+    public static void main(String[] args) {
+        System.out.println("Hello, World!");
+    }
+}
+```
+
+Additionally, Java requires an understanding of Object-Oriented Programming (OOP) concepts like classes, inheritance, interface, and more, which makes the initial learning curve steeper for beginners.
+
+Python is significantly easier to pick up for beginners because the syntax is less verbose, simpler, and easier to read. It is dynamically typed and has fewer rules, which makes it easier for beginners to experiment and learn programming concepts. “Hello World!” program in Python:
+
+    print("Hello, World!")
+
+Furthermore, Python supports procedural and OOP paradigms, allowing beginners to gradually adopt advanced concepts.
+
+## Python vs. Java: Communities, libraries, and frameworks
+
+Python and Java are two of the most popular programming languages, with extensive communities, libraries, and frameworks. Java has been in existence since 1995, which means it has a more mature and larger community, along with a well-established ecosystem of standard libraries for networking, database access, and concurrent programming.
+
+Python’s community has grown significantly in recent years, driven by its popularity in data science, AI, and web development, as well as its welcoming nature and resources designed for beginners. Python also offers standard libraries for networking, database access, and concurrent programming.
+
+The table below highlights the key strengths of both languages across various domains:
+
+| **Aspect**                | **Java**                                                                                                                                                                                                                                                                                                                    | **Python**                                                                                                                                                                                                                                                                                                                                                         |
+| ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| **Communities**           | **Size and Maturity**: Established since 1995, large and mature. <br>**Enterprise-Focused**: Strong in backend, enterprise, and Android development. <br>**Learning Resources**: Extensive tutorials, forums like Stack Overflow, JavaRanch. <br>**Meetups and Conferences**: Active global presence (e.g., JavaOne, JUGs). | **Size and Growth**: Rapidly growing, popular in data science, AI, and web development. <br>**Beginner-Friendly**: Welcoming community with abundant beginner resources. <br>**Learning Resources**: Interactive platforms like Codecademy, active Stack Overflow, and subreddits. <br>**Meetups and Conferences**: PyCon and diverse events covering many fields. |
+| **Libraries**             | **Core Strengths**: Extensive standard library (networking, DB access, concurrency). <br>**Third-Party Libraries**: Apache Commons, Google Guava, Joda-Time.                                                                                                                                                                | **Core Strengths**: Vast standard library (I/O operations, web services, data manipulation). **Third-Party Libraries**: NumPy, Pandas, Matplotlib, TensorFlow, PyTorch.                                                                                                                                                                                            |
+| **Frameworks**            | **Web Development**: Spring (enterprise), Struts (MVC), Play (reactive). <br>**Mobile Development**: Native Android (Android SDK). <br>**Big Data**: Hadoop, Spark.                                                                                                                                                         | **Web Development**: Django (rapid development), Flask (flexible), FastAPI (high-performance APIs). **Machine Learning**: TensorFlow, PyTorch, Scikit-learn. <br>**Web Scraping**: Scrapy.                                                                                                                                                                         |
+| **Ecosystem Integration** | Strong in enterprise environments (Docker, Kubernetes, cloud platforms). Strong backward compatibility.                                                                                                                                                                                                                     | Ideal for modern ecosystems, especially in data pipelines and AI. Popular with Jupyter Notebooks for interactive coding.                                                                                                                                                                                                                                           |
+
+## Java vs. Python: Cross-platform support
+
+Both Java and Python are cross-platform compatible, but they approach this in slightly different ways. Java’s WORA philosophy ensures that Java programs run on Windows, macOS, Linux, and more, as long as the JVM is installed. Java also offers the Android SDK for mobile app development and frameworks like Swing and JavaFX for building desktop applications.
+
+Python, on the other hand, supports cross-platform compatibility provided the interpreter is installed on the platform (Windows, macOS, Linux, etc.). Once you install the interpreter, the same code can run across multiple platforms without compilation.
+
+While Python has frameworks like Tkinter and PyQt for building desktop applications, these tend to be less consistent across platforms compared to Java-based frameworks.
+
+## Java vs. Python: Use cases
+
+Java and Python each have unique strengths and ecosystems tailored to specific types of projects.
+
+Java’s robustness, scalability, and high performance make it a top choice for enterprise-grade applications such as banking and financial systems, enterprise resource planning (ERP) tools, and customer relationship management (CRM) platforms. It’s also widely adopted in areas like big data and distributed systems (e.g., Apache Hadoop and Apache Spark), game development (e.g., LibGDX and jMonkeyEngine), and embedded systems (e.g., Java ME).
+
+Python, with its simplicity, readable syntax, and versatility, shines in data science and machine learning (e.g., TensorFlow, PyTorch, and Scikit-learn), as well as automation and scripting tasks. While Python offers frameworks like Pygame for game development and Kivy for mobile app development, these are not as robust or scalable as Java-based frameworks for large-scale projects.
+
+The table below summarizes these languages’ use cases across multiple ecosystems:
+
+| **Use Case**                         | **Java**                                                                                                                   | **Python**                                                                                                               |
+| ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
+| **Enterprise Applications**          | Strong choice with frameworks like Spring and Hibernate, offering robust, scalable, and secure solutions.                  | Less common due to slower performance for large-scale enterprise systems.                                                |
+| **Web Development**                  | Popular with enterprise-level frameworks like Spring Boot and Play.                                                        | Well-suited for rapid development with Django, Flask, and FastAPI, especially for startups and small-to-medium projects. |
+| **Mobile Development**               | Primary language for native Android development (Android SDK).                                                             | Limited to frameworks like Kivy; not commonly used for mobile apps.                                                      |
+| **Data Science and AI**              | Limited ecosystem, with libraries like Weka and Tribuo providing basic support.                                            | Dominates the field with TensorFlow, PyTorch, Pandas, and scikit-learn. Excellent for machine learning and AI.           |
+| **Big Data and Distributed Systems** | Widely used with Apache Hadoop, Spark (Java API), and Kafka for handling distributed systems and real-time data streaming. | Gaining traction with PySpark and Dask, but not as strong as Java for distributed systems.                               |
+| **Automation and Scripting**         | Suitable for automation in enterprise systems but lacks simplicity for quick scripting.                                    | Perfect for automation tasks with libraries like Selenium, Beautiful Soup, and PyAutoGUI.                                |
+| **Scientific Computing**             | Basic support with libraries like JGraphT.                                                                                 | Comprehensive tools like NumPy, SciPy, and SymPy for numerical and symbolic computations.                                |
+| **Game Development**                 | Used in Android games and frameworks like libGDX.                                                                          | Supports indie game development with frameworks like Pygame, but less common for AAA games.                              |
+| **Testing and QA**                   | Strong with JUnit, Mockito, and TestNG for enterprise-level testing.                                                       | Flexible and beginner-friendly tools like pytest, unittest, and Hypothesis.                                              |
+| **Learning and Prototyping**         | Steeper learning curve; better for long-term, enterprise-grade systems.                                                    | Beginner-friendly with straightforward syntax, perfect for prototyping and learning.                                     |
+
+To summarize, Java is best for enterprise applications, backend systems, Android development, and big data processing, while Python may be a better option for data science, AI, automation, and rapid prototyping of projects.
+
+## Java vs. Python: Trends, salaries, and career opportunities
+
+Java and Python remain dominant programming languages in the tech industry, but they cater to different markets and job roles.
+
+**Java** has maintained a strong presence in enterprise systems and is the go-to language for mission-critical applications requiring performance and scalability. It's widely used for backend services, microservices, big data processing, and Android development. The average salary for Java developers in the US is around **$90,759**, and demand remains high, especially for developers skilled in modern frameworks like Spring Boot and cloud platforms.
+
+![Java average salary in the US](https://assets.roadmap.sh/guest/java-average-salary-in-the-us-yykpp.png)
+
+Python is also a valuable skill for developers, as its popularity has increased in fields like data science, AI/ML, automation, and web development. It's projected to grow even more, thanks to its adoption in emerging fields like quantum computing and cloud automation. The average salary for a Python developer in the US is about **$124,219**, and demand is expected to increase as industries continue seeking developers with AI/ML expertise and Python skills.
+
+![Python average salary in the US](https://assets.roadmap.sh/guest/python-average-salary-in-the-us-4xvyb.png)
+
+Ultimately, choosing between Java and Python depends on your career goals. If you're drawn to stable industries like finance, healthcare, and e-commerce that require enterprise-level solutions, **Java** is a great choice. On the other hand, if you're excited about data science, ML, AI, or fields embracing rapid innovation and emerging technologies, **Python** might be your best bet.
+
+## Next steps
+
+Choose Java if you're building large-scale enterprise applications that demand scalability, robustness, and performance. Its strong typing and extensive frameworks make it perfect for complex, long-term projects. Opt for Python if you prioritize rapid prototyping or are working on scientific computing, data science, AI, or machine learning projects. Python's simplicity and rich ecosystem of libraries enable faster development and innovation in these domains.
+
+In the end, choosing between Java and Python depends on the type of project you want to build, the platform you're targeting, and the ecosystem you want to adopt for your project. Regardless of your choice, you can use the [Java roadmap](https://roadmap.sh/java) and [Python roadmap](https://roadmap.sh/python) to stay up to date with the latest changes in each language.
diff --git a/src/data/guides/torrent-client.md b/src/data/guides/torrent-client.md
index 62d299e28..514efb7d5 100644
--- a/src/data/guides/torrent-client.md
+++ b/src/data/guides/torrent-client.md
@@ -80,29 +80,29 @@ It would be really fun to write a bencode parser, but parsing isn't our focus to
 
 ```go
 import (
-    "github.com/jackpal/bencode-go"
+	"github.com/jackpal/bencode-go"
 )
 
 type bencodeInfo struct {
-    Pieces      string `bencode:"pieces"`
-    PieceLength int    `bencode:"piece length"`
-    Length      int    `bencode:"length"`
-    Name        string `bencode:"name"`
+	Pieces      string `bencode:"pieces"`
+	PieceLength int    `bencode:"piece length"`
+	Length      int    `bencode:"length"`
+	Name        string `bencode:"name"`
 }
 
 type bencodeTorrent struct {
-    Announce string      `bencode:"announce"`
-    Info     bencodeInfo `bencode:"info"`
+	Announce string      `bencode:"announce"`
+	Info     bencodeInfo `bencode:"info"`
 }
 
 // Open parses a torrent file
 func Open(r io.Reader) (*bencodeTorrent, error) {
-    bto := bencodeTorrent{}
-    err := bencode.Unmarshal(r, &bto)
-    if err != nil {
-        return nil, err
-    }
-    return &bto, nil
+	bto := bencodeTorrent{}
+	err := bencode.Unmarshal(r, &bto)
+	if err != nil {
+		return nil, err
+	}
+	return &bto, nil
 }
 ```
 
@@ -114,16 +114,16 @@ Notably, I split `pieces` (previously a string) into a slice of hashes (each `[2
 
 ```go
 type TorrentFile struct {
-    Announce    string
-    InfoHash    [20]byte
-    PieceHashes [][20]byte
-    PieceLength int
-    Length      int
-    Name        string
+	Announce    string
+	InfoHash    [20]byte
+	PieceHashes [][20]byte
+	PieceLength int
+	Length      int
+	Name        string
 }
 
 func (bto *bencodeTorrent) toTorrentFile() (*TorrentFile, error) {
-    // ...
+	// ...
 }
 ```
 
@@ -133,21 +133,21 @@ Now that we have information about the file and its tracker, let's talk to the t
 
 ```go
 func (t *TorrentFile) buildTrackerURL(peerID [20]byte, port uint16) (string, error) {
-    base, err := url.Parse(t.Announce)
-    if err != nil {
-        return "", err
-    }
-    params := url.Values{
-        "info_hash":  []string{string(t.InfoHash[:])},
-        "peer_id":    []string{string(peerID[:])},
-        "port":       []string{strconv.Itoa(int(Port))},
-        "uploaded":   []string{"0"},
-        "downloaded": []string{"0"},
-        "compact":    []string{"1"},
-        "left":       []string{strconv.Itoa(t.Length)},
-    }
-    base.RawQuery = params.Encode()
-    return base.String(), nil
+	base, err := url.Parse(t.Announce)
+	if err != nil {
+		return "", err
+	}
+	params := url.Values{
+		"info_hash":  []string{string(t.InfoHash[:])},
+		"peer_id":    []string{string(peerID[:])},
+		"port":       []string{strconv.Itoa(int(Port))},
+		"uploaded":   []string{"0"},
+		"downloaded": []string{"0"},
+		"compact":    []string{"1"},
+		"left":       []string{strconv.Itoa(t.Length)},
+	}
+	base.RawQuery = params.Encode()
+	return base.String(), nil
 }
 ```
 
@@ -180,25 +180,25 @@ e
 ```go
 // Peer encodes connection information for a peer
 type Peer struct {
-    IP   net.IP
-    Port uint16
+	IP   net.IP
+	Port uint16
 }
 
 // Unmarshal parses peer IP addresses and ports from a buffer
 func Unmarshal(peersBin []byte) ([]Peer, error) {
-    const peerSize = 6 // 4 for IP, 2 for port
-    numPeers := len(peersBin) / peerSize
-    if len(peersBin)%peerSize != 0 {
-        err := fmt.Errorf("Received malformed peers")
-        return nil, err
-    }
-    peers := make([]Peer, numPeers)
-    for i := 0; i < numPeers; i++ {
-        offset := i * peerSize
-        peers[i].IP = net.IP(peersBin[offset : offset+4])
-        peers[i].Port = binary.BigEndian.Uint16(peersBin[offset+4 : offset+6])
-    }
-    return peers, nil
+	const peerSize = 6 // 4 for IP, 2 for port
+	numPeers := len(peersBin) / peerSize
+	if len(peersBin)%peerSize != 0 {
+		err := fmt.Errorf("Received malformed peers")
+		return nil, err
+	}
+	peers := make([]Peer, numPeers)
+	for i := 0; i < numPeers; i++ {
+		offset := i * peerSize
+		peers[i].IP = net.IP(peersBin[offset : offset+4])
+		peers[i].Port = binary.BigEndian.Uint16(peersBin[offset+4 : offset+6])
+	}
+	return peers, nil
 }
 ```
 
@@ -215,7 +215,7 @@ Now that we have a list of peers, it's time to connect with them and start downl
 ```go
 conn, err := net.DialTimeout("tcp", peer.String(), 3*time.Second)
 if err != nil {
-    return nil, err
+	return nil, err
 }
 ```
 
@@ -252,27 +252,27 @@ In our code, let's make a struct to represent a handshake, and write a few metho
 ```go
 // A Handshake is a special message that a peer uses to identify itself
 type Handshake struct {
-    Pstr     string
-    InfoHash [20]byte
-    PeerID   [20]byte
+	Pstr     string
+	InfoHash [20]byte
+	PeerID   [20]byte
 }
 
 // Serialize serializes the handshake to a buffer
 func (h *Handshake) Serialize() []byte {
-    buf := make([]byte, len(h.Pstr)+49)
-    buf[0] = byte(len(h.Pstr))
-    curr := 1
-    curr += copy(buf[curr:], h.Pstr)
-    curr += copy(buf[curr:], make([]byte, 8)) // 8 reserved bytes
-    curr += copy(buf[curr:], h.InfoHash[:])
-    curr += copy(buf[curr:], h.PeerID[:])
-    return buf
+	buf := make([]byte, len(h.Pstr)+49)
+	buf[0] = byte(len(h.Pstr))
+	curr := 1
+	curr += copy(buf[curr:], h.Pstr)
+	curr += copy(buf[curr:], make([]byte, 8)) // 8 reserved bytes
+	curr += copy(buf[curr:], h.InfoHash[:])
+	curr += copy(buf[curr:], h.PeerID[:])
+	return buf
 }
 
 // Read parses a handshake from a stream
 func Read(r io.Reader) (*Handshake, error) {
-    // Do Serialize(), but backwards
-    // ...
+	// Do Serialize(), but backwards
+	// ...
 }
 ```
 
@@ -296,36 +296,36 @@ A message starts with a length indicator which tells us how many bytes long the
 type messageID uint8
 
 const (
-    MsgChoke         messageID = 0
-    MsgUnchoke       messageID = 1
-    MsgInterested    messageID = 2
-    MsgNotInterested messageID = 3
-    MsgHave          messageID = 4
-    MsgBitfield      messageID = 5
-    MsgRequest       messageID = 6
-    MsgPiece         messageID = 7
-    MsgCancel        messageID = 8
+	MsgChoke         messageID = 0
+	MsgUnchoke       messageID = 1
+	MsgInterested    messageID = 2
+	MsgNotInterested messageID = 3
+	MsgHave          messageID = 4
+	MsgBitfield      messageID = 5
+	MsgRequest       messageID = 6
+	MsgPiece         messageID = 7
+	MsgCancel        messageID = 8
 )
 
 // Message stores ID and payload of a message
 type Message struct {
-    ID      messageID
-    Payload []byte
+	ID      messageID
+	Payload []byte
 }
 
 // Serialize serializes a message into a buffer of the form
 // <length prefix><message ID><payload>
 // Interprets `nil` as a keep-alive message
 func (m *Message) Serialize() []byte {
-    if m == nil {
-        return make([]byte, 4)
-    }
-    length := uint32(len(m.Payload) + 1) // +1 for id
-    buf := make([]byte, 4+length)
-    binary.BigEndian.PutUint32(buf[0:4], length)
-    buf[4] = byte(m.ID)
-    copy(buf[5:], m.Payload)
-    return buf
+	if m == nil {
+		return make([]byte, 4)
+	}
+	length := uint32(len(m.Payload) + 1) // +1 for id
+	buf := make([]byte, 4+length)
+	binary.BigEndian.PutUint32(buf[0:4], length)
+	buf[4] = byte(m.ID)
+	copy(buf[5:], m.Payload)
+	return buf
 }
 ```
 
@@ -334,30 +334,30 @@ To read a message from a stream, we just follow the format of a message. We read
 ```go
 // Read parses a message from a stream. Returns `nil` on keep-alive message
 func Read(r io.Reader) (*Message, error) {
-    lengthBuf := make([]byte, 4)
-    _, err := io.ReadFull(r, lengthBuf)
-    if err != nil {
-        return nil, err
-    }
-    length := binary.BigEndian.Uint32(lengthBuf)
-
-    // keep-alive message
-    if length == 0 {
-        return nil, nil
-    }
-
-    messageBuf := make([]byte, length)
-    _, err = io.ReadFull(r, messageBuf)
-    if err != nil {
-        return nil, err
-    }
-
-    m := Message{
-        ID:      messageID(messageBuf[0]),
-        Payload: messageBuf[1:],
-    }
-
-    return &m, nil
+	lengthBuf := make([]byte, 4)
+	_, err := io.ReadFull(r, lengthBuf)
+	if err != nil {
+		return nil, err
+	}
+	length := binary.BigEndian.Uint32(lengthBuf)
+
+	// keep-alive message
+	if length == 0 {
+		return nil, nil
+	}
+
+	messageBuf := make([]byte, length)
+	_, err = io.ReadFull(r, messageBuf)
+	if err != nil {
+		return nil, err
+	}
+
+	m := Message{
+		ID:      messageID(messageBuf[0]),
+		Payload: messageBuf[1:],
+	}
+
+	return &m, nil
 }
 ```
 
@@ -375,16 +375,16 @@ type Bitfield []byte
 
 // HasPiece tells if a bitfield has a particular index set
 func (bf Bitfield) HasPiece(index int) bool {
-    byteIndex := index / 8
-    offset := index % 8
-    return bf[byteIndex]>>(7-offset)&1 != 0
+	byteIndex := index / 8
+	offset := index % 8
+	return bf[byteIndex]>>(7-offset)&1 != 0
 }
 
 // SetPiece sets a bit in the bitfield
 func (bf Bitfield) SetPiece(index int) {
-    byteIndex := index / 8
-    offset := index % 8
-    bf[byteIndex] |= 1 << (7 - offset)
+	byteIndex := index / 8
+	offset := index % 8
+	bf[byteIndex] |= 1 << (7 - offset)
 }
 ```
 
@@ -403,23 +403,23 @@ We'll set up two channels to synchronize our concurrent workers: one for dishing
 workQueue := make(chan *pieceWork, len(t.PieceHashes))
 results := make(chan *pieceResult)
 for index, hash := range t.PieceHashes {
-    length := t.calculatePieceSize(index)
-    workQueue <- &pieceWork{index, hash, length}
+	length := t.calculatePieceSize(index)
+	workQueue <- &pieceWork{index, hash, length}
 }
 
 // Start workers
 for _, peer := range t.Peers {
-    go t.startDownloadWorker(peer, workQueue, results)
+	go t.startDownloadWorker(peer, workQueue, results)
 }
 
 // Collect results into a buffer until full
 buf := make([]byte, t.Length)
 donePieces := 0
 for donePieces < len(t.PieceHashes) {
-    res := <-results
-    begin, end := t.calculateBoundsForPiece(res.index)
-    copy(buf[begin:end], res.buf)
-    donePieces++
+	res := <-results
+	begin, end := t.calculateBoundsForPiece(res.index)
+	copy(buf[begin:end], res.buf)
+	donePieces++
 }
 close(workQueue)
 ```
@@ -430,41 +430,41 @@ We'll spawn a worker goroutine for each peer we've received from the tracker. It
 
 ```go
 func (t *Torrent) startDownloadWorker(peer peers.Peer, workQueue chan *pieceWork, results chan *pieceResult) {
-    c, err := client.New(peer, t.PeerID, t.InfoHash)
-    if err != nil {
-        log.Printf("Could not handshake with %s. Disconnecting\n", peer.IP)
-        return
-    }
-    defer c.Conn.Close()
-    log.Printf("Completed handshake with %s\n", peer.IP)
-
-    c.SendUnchoke()
-    c.SendInterested()
-
-    for pw := range workQueue {
-        if !c.Bitfield.HasPiece(pw.index) {
-            workQueue <- pw // Put piece back on the queue
-            continue
-        }
-
-        // Download the piece
-        buf, err := attemptDownloadPiece(c, pw)
-        if err != nil {
-            log.Println("Exiting", err)
-            workQueue <- pw // Put piece back on the queue
-            return
-        }
-
-        err = checkIntegrity(pw, buf)
-        if err != nil {
-            log.Printf("Piece #%d failed integrity check\n", pw.index)
-            workQueue <- pw // Put piece back on the queue
-            continue
-        }
-
-        c.SendHave(pw.index)
-        results <- &pieceResult{pw.index, buf}
-    }
+	c, err := client.New(peer, t.PeerID, t.InfoHash)
+	if err != nil {
+		log.Printf("Could not handshake with %s. Disconnecting\n", peer.IP)
+		return
+	}
+	defer c.Conn.Close()
+	log.Printf("Completed handshake with %s\n", peer.IP)
+
+	c.SendUnchoke()
+	c.SendInterested()
+
+	for pw := range workQueue {
+		if !c.Bitfield.HasPiece(pw.index) {
+			workQueue <- pw // Put piece back on the queue
+			continue
+		}
+
+		// Download the piece
+		buf, err := attemptDownloadPiece(c, pw)
+		if err != nil {
+			log.Println("Exiting", err)
+			workQueue <- pw // Put piece back on the queue
+			return
+		}
+
+		err = checkIntegrity(pw, buf)
+		if err != nil {
+			log.Printf("Piece #%d failed integrity check\n", pw.index)
+			workQueue <- pw // Put piece back on the queue
+			continue
+		}
+
+		c.SendHave(pw.index)
+		results <- &pieceResult{pw.index, buf}
+	}
 }
 ```
 
@@ -474,30 +474,30 @@ We'll keep track of each peer in a struct, and modify that struct as we read mes
 
 ```go
 type pieceProgress struct {
-    index      int
-    client     *client.Client
-    buf        []byte
-    downloaded int
-    requested  int
-    backlog    int
+	index      int
+	client     *client.Client
+	buf        []byte
+	downloaded int
+	requested  int
+	backlog    int
 }
 
 func (state *pieceProgress) readMessage() error {
-    msg, err := state.client.Read() // this call blocks
-    switch msg.ID {
-    case message.MsgUnchoke:
-        state.client.Choked = false
-    case message.MsgChoke:
-        state.client.Choked = true
-    case message.MsgHave:
-        index, err := message.ParseHave(msg)
-        state.client.Bitfield.SetPiece(index)
-    case message.MsgPiece:
-        n, err := message.ParsePiece(state.index, state.buf, msg)
-        state.downloaded += n
-        state.backlog--
-    }
-    return nil
+	msg, err := state.client.Read() // this call blocks
+	switch msg.ID {
+	case message.MsgUnchoke:
+		state.client.Choked = false
+	case message.MsgChoke:
+		state.client.Choked = true
+	case message.MsgHave:
+		index, err := message.ParseHave(msg)
+		state.client.Bitfield.SetPiece(index)
+	case message.MsgPiece:
+		n, err := message.ParsePiece(state.index, state.buf, msg)
+		state.downloaded += n
+		state.backlog--
+	}
+	return nil
 }
 ```
 
@@ -523,43 +523,43 @@ const MaxBlockSize = 16384
 const MaxBacklog = 5
 
 func attemptDownloadPiece(c *client.Client, pw *pieceWork) ([]byte, error) {
-    state := pieceProgress{
-        index:  pw.index,
-        client: c,
-        buf:    make([]byte, pw.length),
-    }
-
-    // Setting a deadline helps get unresponsive peers unstuck.
-    // 30 seconds is more than enough time to download a 262 KB piece
-    c.Conn.SetDeadline(time.Now().Add(30 * time.Second))
-    defer c.Conn.SetDeadline(time.Time{}) // Disable the deadline
-
-    for state.downloaded < pw.length {
-        // If unchoked, send requests until we have enough unfulfilled requests
-        if !state.client.Choked {
-            for state.backlog < MaxBacklog && state.requested < pw.length {
-                blockSize := MaxBlockSize
-                // Last block might be shorter than the typical block
-                if pw.length-state.requested < blockSize {
-                    blockSize = pw.length - state.requested
-                }
-
-                err := c.SendRequest(pw.index, state.requested, blockSize)
-                if err != nil {
-                    return nil, err
-                }
-                state.backlog++
-                state.requested += blockSize
-            }
-        }
-
-        err := state.readMessage()
-        if err != nil {
-            return nil, err
-        }
-    }
-
-    return state.buf, nil
+	state := pieceProgress{
+		index:  pw.index,
+		client: c,
+		buf:    make([]byte, pw.length),
+	}
+
+	// Setting a deadline helps get unresponsive peers unstuck.
+	// 30 seconds is more than enough time to download a 262 KB piece
+	c.Conn.SetDeadline(time.Now().Add(30 * time.Second))
+	defer c.Conn.SetDeadline(time.Time{}) // Disable the deadline
+
+	for state.downloaded < pw.length {
+		// If unchoked, send requests until we have enough unfulfilled requests
+		if !state.client.Choked {
+			for state.backlog < MaxBacklog && state.requested < pw.length {
+				blockSize := MaxBlockSize
+				// Last block might be shorter than the typical block
+				if pw.length-state.requested < blockSize {
+					blockSize = pw.length - state.requested
+				}
+
+				err := c.SendRequest(pw.index, state.requested, blockSize)
+				if err != nil {
+					return nil, err
+				}
+				state.backlog++
+				state.requested += blockSize
+			}
+		}
+
+		err := state.readMessage()
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	return state.buf, nil
 }
 ```
 
@@ -571,25 +571,25 @@ This is a short one. We're almost there.
 package main
 
 import (
-    "log"
-    "os"
+	"log"
+	"os"
 
-    "github.com/veggiedefender/torrent-client/torrentfile"
+	"github.com/veggiedefender/torrent-client/torrentfile"
 )
 
 func main() {
-    inPath := os.Args[1]
-    outPath := os.Args[2]
-
-    tf, err := torrentfile.Open(inPath)
-    if err != nil {
-        log.Fatal(err)
-    }
-
-    err = tf.DownloadToFile(outPath)
-    if err != nil {
-        log.Fatal(err)
-    }
+	inPath := os.Args[1]
+	outPath := os.Args[2]
+
+	tf, err := torrentfile.Open(inPath)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	err = tf.DownloadToFile(outPath)
+	if err != nil {
+		log.Fatal(err)
+	}
 }
 ```
 
diff --git a/src/data/guides/what-is-internet.md b/src/data/guides/what-is-internet.md
index 044676320..d47e10f22 100644
--- a/src/data/guides/what-is-internet.md
+++ b/src/data/guides/what-is-internet.md
@@ -73,7 +73,7 @@ Cryptography is what keeps our communication secure on the Internet. In this sho
 
 ## Cybersecurity and Crime
 
-Cybersecurity refers to the protective measures against criminal activity accomplished through using a network, technological devices, and the internet.In this video, you will learn about the basics of cybersecurity and common cybercrimes.
+Cybersecurity refers to the protective measures against criminal activity accomplished through using a network, technological devices, and the internet. In this video, you will learn about the basics of cybersecurity and common cybercrimes.
 
 <iframe class="w-full aspect-video mb-5" width="100%" height="400" src="https://www.youtube.com/embed/AuYNXgO_f3Y" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
 
diff --git a/src/data/projects/tmdb-cli.md b/src/data/projects/tmdb-cli.md
index 28325019a..0e45e3d24 100644
--- a/src/data/projects/tmdb-cli.md
+++ b/src/data/projects/tmdb-cli.md
@@ -26,7 +26,7 @@ roadmapIds:
   - 'cpp'
 ---
 
-In this project, you will build a simple command line interface (CLI) to fetch data from The Movie Database (TMSB) and display it in the terminal. This project will help you practice your programming skills, including working with APIs, handling JSON data, and building a simple CLI application.
+In this project, you will build a simple command line interface (CLI) to fetch data from The Movie Database (TMDB) and display it in the terminal. This project will help you practice your programming skills, including working with APIs, handling JSON data, and building a simple CLI application.
 
 ## Requirements
 
@@ -52,4 +52,4 @@ There are some considerations to keep in mind:
 
 - Handle errors gracefully, such as API failures or network issues.
 - Use a programming language of your choice to build this project.
-- Make sure to include a README file with instructions on how to run the application and any other relevant information.
\ No newline at end of file
+- Make sure to include a README file with instructions on how to run the application and any other relevant information.
diff --git a/src/data/projects/weather-api-wrapper-service.md b/src/data/projects/weather-api-wrapper-service.md
index f3c1213ea..aa96b7e6f 100644
--- a/src/data/projects/weather-api-wrapper-service.md
+++ b/src/data/projects/weather-api-wrapper-service.md
@@ -32,7 +32,7 @@ In this project, instead of relying on our own weather data, we will build a wea
 
 As for the actual weather API to use, you can use your favorite one, as a suggestion, here is a link to [Visual Crossing’s API](https://www.visualcrossing.com/weather-api), it’s completely FREE and easy to use.
 
-Regarding the in-memory cache, a pretty common recommendation is to use [Redis](https://redis.io/), you can read more about it [here](https://redis.io/docs/manual/client-side-caching/), and as a recommendation, you could use the city code entered by the user as the key, and save there the result from calling the API.
+Regarding the in-memory cache, a pretty common recommendation is to use [Redis](https://redis.io/), you can read more about it [here](https://redis.io/docs/latest/develop/clients/client-side-caching/), and as a recommendation, you could use the city code entered by the user as the key, and save there the result from calling the API.
 
 At the same time, when you “set” the value in the cache, you can also give it an expiration time in seconds (using the `EX` flag on the `SET` command). That way the cache (the keys) will automatically clean itself when the data is old enough (for example, giving it a 12-hours expiration time).
 
diff --git a/src/data/question-groups/backend/backend.md b/src/data/question-groups/backend/backend.md
index 1bc52b865..d4442a3cb 100644
--- a/src/data/question-groups/backend/backend.md
+++ b/src/data/question-groups/backend/backend.md
@@ -1,9 +1,9 @@
 ---
 order: 4
 briefTitle: 'Backend'
-briefDescription: 'Test, rate and improve your Backend knowledge with these questions.'
+briefDescription: 'Test, Rate and Improve your Backend knowledge with these questions.'
 title: '50 Popular Backend Developer Interview Questions and Answers'
-description: 'Test, rate and improve your Backend knowledge with these questions.'
+description: 'Test, Rate and Improve your Backend knowledge with these questions.'
 authorId: 'fernando'
 isNew: false
 date: 2024-05-24
@@ -82,7 +82,7 @@ questions:
     answer: maintainable-code.md
     topics:
       - 'Beginner'
-  - question: Describe how you would implement a full-text search in a database
+  - question: Describe how you would implement a full-text search in a database.
     answer: fulltext-search.md
     topics:
       - 'Intermediate'
@@ -122,11 +122,11 @@ questions:
     answer: gdpr-compliance.md
     topics:
       - 'Intermediate'
-  - question: Explain how you would deal with long-running processes in web requests
+  - question: Explain how you would deal with long-running processes in web requests.
     answer: long-running.md
     topics:
       - 'Intermediate'
-  - question: Discuss the implementation of rate limiting to protect APIs from abuse
+  - question: Discuss the implementation of rate limiting to protect APIs from abuse.
     answer: rate-limiting.md
     topics:
       - 'Intermediate'
@@ -142,7 +142,7 @@ questions:
     answer: api-dependencies.md
     topics:
       - 'Intermediate'
-  - question: Describe the concept of eventual consistency and its implications in backend systems
+  - question: Describe the concept of eventual consistency and its implications in backend systems.
     answer: eventual-consistency.md
     topics:
       - 'Intermediate'
@@ -186,7 +186,7 @@ questions:
     answer: realtime-data-sync.md
     topics:
       - 'Advanced'
-  - question: Discuss the benefits and drawbacks of microservice architectures in backend systems
+  - question: Discuss the benefits and drawbacks of microservice architectures in backend systems.
     answer: benefits-drawbacks-microservices.md
     topics:
       - 'Advanced'
@@ -194,7 +194,7 @@ questions:
     answer: load-testing-api.md
     topics:
       - 'Advanced'
-  - question: Describe how you would implement a server-side cache eviction strategy
+  - question: Describe how you would implement a server-side cache eviction strategy.
     answer: cache-eviction.md
     topics:
       - 'Advanced'
@@ -218,7 +218,7 @@ questions:
     answer: anomaly-detection.md
     topics:
       - 'Advanced'
-  - question: Describe the process of creating a global, high-availability data storage solution for a multinational application
+  - question: Describe the process of creating a global, high-availability data storage solution for a multinational application.
     answer: high-available-storage.md
     topics:
       - 'Advanced'
@@ -230,17 +230,16 @@ Getting ready for a software developer interview is never easy, especially if yo
 
 In this article, we’ll go over 50 popular backend interview questions ordered by experience level.
 
-For each question, we’ll provide some explanations, but feel free to further research each topic in detail, or go to the [Backend Roadmap](/backend) if you’re looking for a place to get started in your learning journey.
+For each question, we’ll provide some explanations, but feel free to further research each topic in detail, or go to the [Backend Roadmap](https://roadmap.sh/backend) if you’re looking for a place to get started in your learning journey.
 
 ## Preparing for your Backend interview
 
 Before we get started, it’s important to remember the following points when getting ready for your backend technical interview:
 
 - Cover the basics of backend development. If you’re going for a web dev role, make sure you understand how client-server communication works. If you’re going for a dev tool development, understand the best practices around CLI development, etc.
-- Practice coding, either by developing [your own mini-projects](/backend/developer-tools) or by using sites such as [LeetCode](https://leetcode.com), [HackerRank](https://hackerrank.com), and others.
+- Practice coding, either by completing [projects](https://roadmap.sh/backend/projects) or by using sites such as [LeetCode](https://leetcode.com), [HackerRank](https://hackerrank.com), and others.
 - Consider reading up on software architecture; even if your role won’t be that of an architect, you’ll show understanding on a higher level by being able to discuss these topics.
-- Make sure you have, at least, a basic understanding of most of the foundational layer of tools and practices for your role, such as version management (i.e. using Git), testing (as in unit testing at least), DevOps (including CI/CD pipeline, etc.), and anything else related to your role and the company.
+- Make sure you have, at least, a basic understanding of most of the foundational layer of tools and practices for your role, such as version management (i.e. using Git), testing (as in unit testing at least), [DevOps](https://roadmap.sh/devops) (including CI/CD pipelines, etc.), and anything else related to your role and the company.
 - On a more general note, remember to read up on the company to be able to show interest and understanding of their business/product and also come prepared with a couple of questions of your own, showing you care about the role and the company.
 
 With that said, let’s now focus on the list of backend interview questions that you may be asked when applying for a backend development role!
-
diff --git a/src/data/question-groups/backend/content/distributed-caching.md b/src/data/question-groups/backend/content/distributed-caching.md
index c1ab5c623..4b76339f9 100644
--- a/src/data/question-groups/backend/content/distributed-caching.md
+++ b/src/data/question-groups/backend/content/distributed-caching.md
@@ -3,6 +3,4 @@ In this scenario, you have to consider the following points:
 - Implement a **cluster of servers** that will all act as the distributed cache.
   Implement a **data sharding** process to evenly distribute the data amongst all cache servers and make sure it uses a consistent hashing algorithm to minimize cache reorganization when a server joins or leaves the cluster.
 - Add **cache replication** to have redundancy of your data in case of a failure, that way, your distributed cache is fault-tolerant as well.
-- **Cache invalidation** is a must on any caching solution, as your data will become stale if you don’t update it often.
-
-
+- **Cache invalidation** is a must on any caching solution, as your data will become stale if you don’t update it often.
\ No newline at end of file
diff --git a/src/data/question-groups/backend/content/sql-vs-nosql.md b/src/data/question-groups/backend/content/sql-vs-nosql.md
index 8c7bc57a9..2a9a80c35 100644
--- a/src/data/question-groups/backend/content/sql-vs-nosql.md
+++ b/src/data/question-groups/backend/content/sql-vs-nosql.md
@@ -1,3 +1,3 @@
-[SQL databases](/sql) (or relational databases as they’re also known) rely on a predefined schema (or structure) for their data. Whenever you describe a record, or table inside the database, you do so through its format (name and fields).
+[SQL databases](https://roadmap.sh/sql) (or relational databases as they’re also known) rely on a predefined schema (or structure) for their data. Whenever you describe a record, or table inside the database, you do so through its format (name and fields).
 
-In the case of a NoSQL database, there is no schema, so there is no predefined structure to the data. You usually have collections of records that are not obligated to have the same structure, even if they represent conceptually the same thing.
\ No newline at end of file
+In [NoSQL](https://roadmap.sh/mongodb) databases, there is no schema, so there is no predefined structure to the data. You usually have collections of records that are not obligated to have the same structure, even if they represent conceptually the same thing.
\ No newline at end of file
diff --git a/src/data/question-groups/devops/content/cicd-setup.md b/src/data/question-groups/devops/content/cicd-setup.md
index 63cd694f4..9b86c61b1 100644
--- a/src/data/question-groups/devops/content/cicd-setup.md
+++ b/src/data/question-groups/devops/content/cicd-setup.md
@@ -1,7 +1,7 @@
 Setting up a CI/CD pipeline from scratch involves several steps. Assuming you’ve already set up your project on a version control system, and everyone in your team has proper access to it, then the next steps would help:
 
 1. **Set up the Continuous Integration (CI)**:
-- Select a continuous integration tool (there are many, like Jenkins, GitLab CI, CircleCI, pick one).
+- Select a continuous integration tool (there are many, like [Jenkins](https://jenkins.io), [GitLab CI](https://about.gitlab.com), [CircleCI](https://circleci.com), pick one).
 - Connect the CI tool to your version control system.
 - Write a build script that defines the build process, including steps like code checkout, dependency installation, compiling the code, and running tests.
 - Set up automated testing to run on every code commit or pull request.
@@ -18,7 +18,7 @@ Define deployment scripts that specify how to deploy your application to differe
 Remember that this system should be able to pull the artifacts from the continuous integration pipeline, so set up that access as well.
 
 4. **Infrastructure Setup**:
-- Provision infrastructure using IaC tools (e.g., Terraform, CloudFormation).
+- Provision infrastructure using IaC tools (e.g., [Terraform](https://terraform.io), [CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)).
 - Ensure environments are consistent and reproducible to reduce times if there is a need to create new ones or destroy and recreate existing ones. This should be as easy as executing a command without any human intervention.
 
 5. **Set up your monitoring and logging solutions**:
diff --git a/src/data/question-groups/devops/content/docker-compose.md b/src/data/question-groups/devops/content/docker-compose.md
index fecdafc1c..bb7550eee 100644
--- a/src/data/question-groups/devops/content/docker-compose.md
+++ b/src/data/question-groups/devops/content/docker-compose.md
@@ -1,4 +1,4 @@
-Docker Compose is, in fact, a tool designed to simplify the definition and management of multi-container Docker applications. It allows you to define, configure, and run multiple containers as a single service using a single YAML file.
+[Docker Compose](https://docs.docker.com/compose/) is, in fact, a tool designed to simplify the definition and management of multi-container Docker applications. It allows you to define, configure, and run multiple containers as a single service using a single YAML file.
 
 In a multi-container application, Compose provides the following key roles:
 
diff --git a/src/data/question-groups/devops/content/health-monitor.md b/src/data/question-groups/devops/content/health-monitor.md
index 7356c61fd..e339e5384 100644
--- a/src/data/question-groups/devops/content/health-monitor.md
+++ b/src/data/question-groups/devops/content/health-monitor.md
@@ -5,5 +5,5 @@ Each DevOps team should define this list within the context of their own project
 3. **Deployment Frequency**: How often deployments occur. Frequent deployments indicate a smooth pipeline, while long gaps may signal issues with your CI/CD or with the actual dev workflow.
 4. **Lead Time for Changes**: The time from code commit to production deployment. Shorter lead times are preferable, indicating an efficient pipeline.
 5. **Mean Time to Recovery (MTTR)**: The average time it takes to recover from a failure. A lower MTTR indicates a resilient pipeline that can quickly address and fix issues.
-6. **Test Coverage and Success Rate**: The percentage of code covered by automated tests and the success rate of those tests. High coverage and success rates are good indicators of better quality and reliability. 
+6. **Test Coverage and Success Rate**: The percentage of code covered by automated tests and the success rate of those tests. High coverage and success rates are good indicators of better quality and reliability.
 7. **Change Failure Rate**: The percentage of deployments that result in failures. A lower change failure rate indicates a stable and reliable deployment process.
\ No newline at end of file
diff --git a/src/data/question-groups/devops/content/microservice-challenges.md b/src/data/question-groups/devops/content/microservice-challenges.md
index 3d32a355c..2260ca780 100644
--- a/src/data/question-groups/devops/content/microservice-challenges.md
+++ b/src/data/question-groups/devops/content/microservice-challenges.md
@@ -1,10 +1,10 @@
-While in theory microservices can solve all platform problems, in practice there are several challenges that you might encounter along the way. 
+While in theory microservices can solve all platform problems, in practice there are several challenges that you might encounter along the way.
 
 Some examples are:
 
 1. **Complexity**: Managing multiple services increases the overall system complexity, making development, deployment, and monitoring more challenging (as there are more “moving parts”).
 2. **Service Communication**: Ensuring reliable communication between services, handling network latency, and dealing with issues like service discovery and API versioning can be difficult. There are of course alternatives to deal with all of these issues, but they’re not evident right off the bat nor the same for everyone.
-3. **Data Management**: It’s all about trade-offs in the world of distributed computing. Managing data consistency and transactions across distributed services is complex, often requiring techniques like eventual consistency and distributed databases. 
+3. **Data Management**: It’s all about trade-offs in the world of distributed computing. Managing data consistency and transactions across distributed services is complex, often requiring techniques like eventual consistency and distributed databases.
 4. **Deployment Overhead**: Coordinating the deployment of multiple services, especially when they have interdependencies, can lead to more complex CI/CD pipelines.
 5. **Monitoring and Debugging**: Troubleshooting issues is harder in a microservices architecture due to the distributed nature of the system. Trying to figure out where the information goes and which services are involved in a single request can be quite a challenge for large platforms. This makes debugging microservices architecture a real headache.
 6. **Security**: Securing microservices involves managing authentication, authorization, and data protection across multiple services, often with varying security requirements.
\ No newline at end of file
diff --git a/src/data/question-groups/devops/content/popular-cicd-tools.md b/src/data/question-groups/devops/content/popular-cicd-tools.md
index 5726c1577..ddc65df54 100644
--- a/src/data/question-groups/devops/content/popular-cicd-tools.md
+++ b/src/data/question-groups/devops/content/popular-cicd-tools.md
@@ -14,6 +14,7 @@ These tools allow you to install them on your own infrastructure and don’t req
 On the other hand, these tools either require you to use them from the cloud or are only accessible in SaaS format, which means they provide the infrastructure, and you just use their services.
 
 Some examples of these tools are:
+
 - CircleCI
 - Travis CI
 - GitLab CI/CD (cloud version)
diff --git a/src/data/question-groups/devops/devops.md b/src/data/question-groups/devops/devops.md
index 2ab586c35..929654b32 100644
--- a/src/data/question-groups/devops/devops.md
+++ b/src/data/question-groups/devops/devops.md
@@ -232,13 +232,15 @@ Either way, DevOps engineers work between the development and operations teams,
 
 Because of this strange situation, while detailed roadmaps (be sure to check out our [DevOps roadmap](https://roadmap.sh/devops)!) help a lot, getting ready for a DevOps interview requires a lot of work.
 
+Lastly, Checkout our Devops [Projects](https://roadmap.sh/devops/projects) to test your real world knowledge.
+
 Here are the most relevant DevOps interview questions you’ll likely get asked during a DevOps interview, plus a few more that will push your skills to the next level.
 
 ## Preparing for your DevOps interview
 
 Before diving into your DevOps technical interview, keep these key points in mind:
 
-1.  **Understand the core concepts**: Familiarize yourself with the essentials of DevOps practices, including continuous integration/continuous deployment (CI/CD), infrastructure as code (IaC), the software development lifecycle, and containerization. Understand how these concepts contribute to the overall development lifecycle.
+1. **Understand the core concepts**: Familiarize yourself with the essentials of DevOps practices, including continuous integration/continuous deployment (CI/CD), infrastructure as code (IaC), the software development lifecycle, and containerization. Understand how these concepts contribute to the overall development lifecycle.
 2. **Practice hands-on skills**: There is a lot of practical knowledge involved in the DevOps practice, so make sure you try what you read about. Set up some CI/CD pipelines for your pet projects, understand containerization, and pick a tool to get started. The more you practice, the more prepared you’ll be for real-world problems.
 3. **Study software architecture**: While you may not have the responsibilities of an architect, having a solid understanding of software architecture principles can be a huge help. Being able to discuss the different components of a system with architects would make you a huge asset to any team.
 4. **Research the Company**: In general, it’s always a great idea to research the company you’re interviewing for. In this case, investigate the company’s DevOps practices, the technologies they use, and their overall approach to software development. This will help you demonstrate a genuine interest in their operations and come prepared with thoughtful questions.
diff --git a/src/data/question-groups/full-stack/content/api-security.md b/src/data/question-groups/full-stack/content/api-security.md
new file mode 100644
index 000000000..6fa1bb22e
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/api-security.md
@@ -0,0 +1,32 @@
+Rather than overlapping each other, authorization and authentication reference two very distinct stages of security within your app. 
+
+##### Authentication
+
+On one side, we have authentication, in charge of verifying the user identity. You can use tokens (e.g., JWT, OAuth) or sessions for this.
+
+Example: Validate a JWT sent in headers:  
+
+```javascript
+const token = req.headers['authorization'];
+jwt.verify(token, secretKey, (err, decoded) => { ... });
+```
+
+##### Authorization
+
+Once authenticated, users need to be authorized to access the resources. For this to work, you’ll need to define roles  and permissions for your users.
+
+Middleware example:  
+
+```javascript
+app.use((req, res, next) => {
+  if (req.user.role !== 'admin') return res.status(403).send('Forbidden');
+  next();
+});
+```
+
+##### Best Practices
+
+* Use HTTPS to ensure a secure channel between the browser and the server.  
+* Validate input to prevent injection attacks.  
+* Rate-limit API requests to avoid having your APIs overwhelmed by potential attackers.  
+* Store sensitive data securely (e.g., hashed passwords).
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/async-javascript.md b/src/data/question-groups/full-stack/content/async-javascript.md
new file mode 100644
index 000000000..2c49bd026
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/async-javascript.md
@@ -0,0 +1,83 @@
+JavaScript handles asynchronous operations, like fetching data from an API or reading files, through different paradigms: **callbacks**, **promises**, and **async/await**. Each offers unique advantages and challenges. Here's a detailed look:
+
+##### 1\. Callbacks
+
+**What it is**:  
+A callback is a function passed as an argument to another function to be executed later, usually after an asynchronous task completes.
+
+**Example**:
+
+```javascript
+fs.readFile('file.txt', (err, data) => {
+  if (err) {
+    console.error('Error reading file:', err);
+    return;
+  }
+  console.log('File content:', data.toString());
+});
+```
+
+**Challenges**:
+
+**Callback Hell**: As tasks become more complex, nesting callbacks leads to hard-to-read and maintainable code.
+
+```javascript
+doTask1(() => {
+  doTask2(() => {
+    doTask3(() => {
+      console.log('All tasks done!');
+    });
+  });
+});
+```
+
+##### 2\. Promises
+
+**What it is**:  
+A promise represents a value that may be available now, in the future, or never usually coming as a result of an asynchronous operation. It provides a cleaner way to handle asynchronous operations, chaining actions with `.then()` and catching errors with `.catch()`.
+
+**Example**:
+
+```javascript
+fetch('https://api.example.com/data')
+  .then((response) => response.json())
+  .then((data) => {
+    console.log('Fetched data:', data);
+  })
+  .catch((error) => {
+    console.error('Error fetching data:', error);
+  });
+```
+
+**Advantages**:
+
+- Eliminates deeply nested callbacks.
+- Provides a clearer structure for handling asynchronous workflows.
+
+##### 3\. Async/Await
+
+**What it is**:  
+Async/await is built on promises but provides a more synchronous and readable syntax for managing this type of code.
+
+Functions declared with `async` automatically return a promise, and the `await` keyword pauses execution until a promise resolves.
+
+**Example**:
+
+```javascript
+const fetchData = async () => {
+  try {
+    const response = await fetch('https://api.example.com/data');
+    const data = await response.json();
+    console.log('Fetched data:', data);
+  } catch (error) {
+    console.error('Error fetching data:', error);
+  }
+};
+
+fetchData();
+```
+
+**Advantages**:
+
+- Reads like synchronous code, making it easier to understand.
+- Simplifies error handling with `try/catch` blocks.
diff --git a/src/data/question-groups/full-stack/content/backend-caching.md b/src/data/question-groups/full-stack/content/backend-caching.md
new file mode 100644
index 000000000..7a2d2cfce
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/backend-caching.md
@@ -0,0 +1,13 @@
+1. **In-Memory Cache**: Use tools like Redis or Memcached for quick access to frequently used data. Common use case is caching results of expensive database queries.
+
+2. **HTTP Caching**: Leverage `Cache-Control` headers for client-side and proxy caching.
+
+3. **Application-Level Caching**: Store calculated values or frequently used objects in memory using libraries like `express-cache` or decorators.
+
+4. **Distributed Caching**: In distributed systems, use a shared cache (e.g., Redis) to ensure consistency across instances.
+
+5. **Cache Invalidation**: Use strategies like time-to-live (TTL) or event-driven invalidation to keep the cache up-to-date.
+
+6. **Testing**: Monitor cache hit rates and ensure no stale data is served.
+
+**Browser Caching**: While not strictly server-side, take advantage of browser caching to store static resources client-side, reducing backend requests. 
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/build-tools.md b/src/data/question-groups/full-stack/content/build-tools.md
new file mode 100644
index 000000000..a8cae99ac
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/build-tools.md
@@ -0,0 +1,7 @@
+Build tools bundle, optimize, and prepare your code for deployment.
+
+**Key Functions**:  
+* Bundle JavaScript, CSS, and other assets.  
+* Minify and optimize files for faster loading.  
+* Enable features like hot module replacement (during development).  
+* Handle modern JavaScript (transpile ES6+ to older versions). 
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/cicd-pipelines.md b/src/data/question-groups/full-stack/content/cicd-pipelines.md
new file mode 100644
index 000000000..07444df5b
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/cicd-pipelines.md
@@ -0,0 +1,20 @@
+**CI/CD Pipelines** automate the build, test, and deployment of any project. These pipelines are a critical part of any successful development process.
+
+##### Continuous Integration (CI):
+In this step you automatically build and test the code whenever changes are pushed to a repository. The usual tools for the job are Jenkins, GitHub Actions, CircleCI and other similar alternatives.
+
+##### Continuous Delivery (CD):
+During this phase, the actual deployment of the product is automated, so that once the code is verified in the CI stage, it can automatically be promoted into the right environment.
+
+##### Steps in a Pipeline:
+The steps involved in the full process are:
+
+Pull code → Build app → Run tests → Deploy artifact → Notify team
+
+And all of them are done automatically one after the other, breaking the chain if there is a failure in one of them.
+
+##### Most common tools used:
+1. **Jenkins**: Highly customizable for complex workflows.  
+2. **GitHub Actions**: Easy integration with GitHub repositories.  
+3. **Docker**: For containerized builds.  
+4. **ArgoCD** or **Spinnaker**: For Kubernetes deployments. 
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/client-server-programming.md b/src/data/question-groups/full-stack/content/client-server-programming.md
new file mode 100644
index 000000000..9997c6797
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/client-server-programming.md
@@ -0,0 +1,22 @@
+The **client-side** and **server-side** refer to two distinct parts of a **web application** that work together to deliver functionality to users. Understanding their roles is essential for building efficient and responsive applications.
+
+##### Client-Side
+* **What it Does**: This is the part of the application that runs in the user’s browser. It handles **user interfaces** and interactions, allowing users to see and interact with the application.  
+* **Key Characteristics**:  
+  * Executes **JavaScript code** directly in the browser to handle tasks like form validation, animations, and dynamic content updates (through DOM \-Document Object Model- updates).  
+  * Manages rendering of HTML and CSS for a seamless visual experience.  
+  * Often communicates with the server via **REST (Representational State Transfer)** APIs to fetch or send data asynchronously.  
+* **Examples**:  
+  * Clicking a button that triggers a JavaScript function to show a popup.  
+  * Fetching additional items on a page using `fetch()` or `axios` without a full page reload.  
+
+##### Server-Side
+
+* **What it Does**: This part operates on the server and processes requests from the client, performing tasks like database queries, business logic, and serving responses.  
+* **Key Characteristics**:  
+  * Executes server-side programming languages like Python, Java, or Node.js.  
+  * Handles sensitive operations like authentication and data storage securely.  
+  * Sends data to the client in structured formats (e.g., JSON) via **REST APIs** for rendering.  
+* **Examples**:  
+  * Processing a login request by verifying credentials in a database.  
+  * Returning a list of products in JSON format for the client to display dynamically.
diff --git a/src/data/question-groups/full-stack/content/cloud-deployment.md b/src/data/question-groups/full-stack/content/cloud-deployment.md
new file mode 100644
index 000000000..3b67a6059
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/cloud-deployment.md
@@ -0,0 +1,8 @@
+A full-stack application includes one or more web pages, a backend (which usually involve microservices) and some sort of storage engine (i.e a database).  
+To deploy all of that together, you have to:
+
+1. **Prepare the Application**: Build the frontend (e.g., using `npm run build`). Ensure the back-end is production-ready (e.g., environment variables, database setup).  
+2. **Deploy Frontend**: Push the code into the servers, usually something like AWS S3, GCP Cloud Storage, or Firebase Hosting to host static files. Configure a CDN (e.g., CloudFront) if needed for static content.  
+3. **Deploy Back-End**: Use cloud services like AWS EC2, GCP Compute Engine, or a managed platform like AWS Elastic Beanstalk. Set up environment variables and connect to the database (e.g., RDS, Cloud SQL).  
+4. **Database**: Use a managed database service (e.g., RDS, Firestore) for scalability, or deploy an on-prem database on your server.  
+5. **DNS and SSL**: Configure a custom domain and HTTPS using AWS Route 53, GCP Domains, or another provider. 
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/code-splitting.md b/src/data/question-groups/full-stack/content/code-splitting.md
new file mode 100644
index 000000000..14a4271e2
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/code-splitting.md
@@ -0,0 +1,17 @@
+**Code splitting** breaks a large application into smaller bundles that are loaded only when needed.
+
+**Benefits**:
+* Reduces initial load time by loading only essential code and downloading the rest when needed.
+* Improves performance for slower networks by allowing webapp use much sooner.
+
+**Example using React's `lazy` and `Suspense`**:
+```javascript
+const LazyComponent = React.lazy(() => import('./Component'));
+
+function App() {
+  return (
+    <Suspense fallback={<div>Loading...</div>}>
+      <LazyComponent />
+    </Suspense>
+  );
+} 
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/common-challenges.md b/src/data/question-groups/full-stack/content/common-challenges.md
new file mode 100644
index 000000000..8ed172458
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/common-challenges.md
@@ -0,0 +1,17 @@
+1. **Challenge**: Managing State Across Frontend and Backend.  
+   * **Solution**: Use global state management tools (e.g., Redux, Zustand) and APIs with clear data contracts.  
+
+2. **Challenge**: Scalability Issues.  
+   * **Solution**: Optimize database queries, implement caching, and use scalable cloud infrastructure.  
+
+3. **Challenge**: Security Concerns.  
+   * **Solution**: Implement secure authentication (e.g., OAuth2), sanitize inputs, and follow OWASP guidelines.  
+
+4. **Challenge**: Maintain a consistent quality level across the entire codebase (both frontend and backend code).  
+   * **Solution**: Implement a robust testing strategy that includes: unit testing, integration testing, end-to-end testing, and regular code reviews.  
+
+5. **Challenge**: Keeping Up with Technology Updates.  
+   * **Solution**: Adopt modular architecture to replace outdated tech incrementally.  
+
+6. **Challenge**: Debugging Complex Interactions Between Frontend and Backend.  
+   * **Solution**: Use end-to-end testing frameworks (e.g., Cypress) and logging tools for tracing issues. 
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/cors-handling.md b/src/data/question-groups/full-stack/content/cors-handling.md
new file mode 100644
index 000000000..6426c2521
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/cors-handling.md
@@ -0,0 +1,12 @@
+**CORS** (Cross-Origin Resource Sharing) controls access to resources from a different origin (domain, protocol, or port).
+
+**Handling CORS**:
+
+**Backend**: Set headers to allow specific origins.  
+Example in Express:  
+```javascript
+const cors = require('cors');
+app.use(cors({ origin: 'https://example.com' }));
+```
+
+**Frontend**: Proxy API requests to avoid CORS issues during development. 
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/css-selectors.md b/src/data/question-groups/full-stack/content/css-selectors.md
new file mode 100644
index 000000000..237ba4194
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/css-selectors.md
@@ -0,0 +1,22 @@
+**CSS selectors** are patterns used to select and style specific elements in an HTML document. They define which elements a set of CSS rules should apply to, making them a fundamental part of designing the appearance of **web applications** and **user interfaces**.
+
+##### Why CSS Selectors Matter
+
+Selectors allow you to target elements precisely, enabling you to control layout, colors, fonts, and other visual aspects of your website. They are essential for creating structured and maintainable CSS code.
+
+There are different types of selectors, categorized based on what they target:
+
+* **Elements:** these selectors reference a specific type of element, and affect all instances of that element throughout the page. Example: `p {}`  
+* **Classes:** These selectors only affect those elements that hava a matching class. They’re great to target large groups of elements of the same type, without affecting the entire set. Example: `.my-class {}`  
+* **ID:** ID-level selectors affect only one element (as IDs can only be used on a single element). They’re great when you have a single element that breaks the pattern from the rest of the group. Example: `#my-id {}`  
+* **Attribute:** Attribute-level selectors target elements based on the value of their attributes. They’re great for the cases where you have to dynamically highlight elements. Example: `[type="text"] {}`  
+* **Descendant:** Another way to target other elements is to target them based on the parent element. This method works with any combination of the above, so you can potentially target elements using a specific class that are descendants of an element with a specific attribute value (or any other combination you can think of). Example: `div p {}`
+
+##### When to Use Selectors
+
+* Use type selectors for global styling.  
+* Use class selectors for reusable styles across multiple elements.  
+* Use ID selectors sparingly for unique elements.  
+* Combine selectors for granular control and better maintainability.
+
+CSS selectors give you the power to control every aspect of your web application’s design, ensuring that your user interfaces are consistent, visually appealing, and responsive
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/database-migrations.md b/src/data/question-groups/full-stack/content/database-migrations.md
new file mode 100644
index 000000000..b0239f0ae
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/database-migrations.md
@@ -0,0 +1,17 @@
+1. **Version Control**: Track migrations using tools like Flyway, Liquibase, or Sequelize.
+
+2. **Create Safe Migration Scripts**:  
+   * Avoid destructive changes like dropping columns immediately
+   * Break migrations into additive steps:
+     - Add new columns
+     - Backfill data
+     - Remove old columns later
+
+3. **Testing**:  
+   * Test migrations in a staging environment with a copy of production data
+
+4. **Rollback Plans**:  
+   * Write scripts to revert migrations in case of failure
+
+5. **Zero-Downtime Deployment**:  
+   * Use techniques like dual writes and feature flags to ensure smooth transitions 
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/database-relationships.md b/src/data/question-groups/full-stack/content/database-relationships.md
new file mode 100644
index 000000000..9fb26bbf1
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/database-relationships.md
@@ -0,0 +1,3 @@
+1. **One-to-Many**: One record in a table relates to multiple records in another. Handled via foreign keys. Example: A `user` has many `posts`.  
+2. **Many-to-Many**: Requires a join table to link records from two tables. Example: `students` and `courses` with an intermediary `enrollments` table.  
+3. **Primary/Foreign Keys**: Establish links between tables for querying and ensuring data consistency.
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/div-span-purpose.md b/src/data/question-groups/full-stack/content/div-span-purpose.md
new file mode 100644
index 000000000..97c9f9f0c
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/div-span-purpose.md
@@ -0,0 +1,2 @@
+* **`<div>`**: This is a block-level element that groups other block-level elements (layout or sections) together. It’s quite useful for layout definition.  
+* **`<span>`**: This inline element is great for grouping together other inline elements, such as text nodes. Because the \<span \> has no structural impact on the content when used, it’s perfect for styling text (or even sections of a larger text) without visually affecting it (other than the actual CSS applied).
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/docker-role.md b/src/data/question-groups/full-stack/content/docker-role.md
new file mode 100644
index 000000000..a7f052e07
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/docker-role.md
@@ -0,0 +1,18 @@
+Docker containerizes applications and their dependencies, ensuring they run consistently across environments.
+
+**In Development**:  
+* Provides isolated environments (e.g., for different projects).  
+* Simplifies onboarding (e.g., no need to manually install dependencies).  
+
+**In Deployment**:  
+* Ensures consistent environments between dev and production.  
+* Integrates with orchestration tools (e.g., Kubernetes) for scalability.
+
+Example Dockerfile:  
+```dockerfile
+FROM node:14
+WORKDIR /app
+COPY . .
+RUN npm install
+CMD ["npm", "start"]
+``` 
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/environment-variables.md b/src/data/question-groups/full-stack/content/environment-variables.md
new file mode 100644
index 000000000..1516843fa
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/environment-variables.md
@@ -0,0 +1,6 @@
+Environment variables store configuration values (e.g., API keys, database URLs) outside the codebase. This is important for two main reasons:
+
+1. **Security**. By extracting these values (which tend to be private) from the codebase, you avoid potential code leaks from becoming a bigger security problem.  
+2. **More flexible deployments**. If these values need to change, by having them as environment variables you don’t need to re-deploy your code, you just need to reload those values (either by restarting the app, or hot reloading the values from a file).
+
+For the actual implementation, one might use something like the `dotenv` module, which loads environment variables from a .env file in the local folder of the project, or interact with a secret manager, such as **AWS Secret Manager** which stores these values externally in a secure storage.
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/event-driven-architecture.md b/src/data/question-groups/full-stack/content/event-driven-architecture.md
new file mode 100644
index 000000000..360cc4c6e
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/event-driven-architecture.md
@@ -0,0 +1,11 @@
+**Event-Driven Architecture**: A design pattern where services communicate by emitting and responding to events asynchronously.
+
+**Key Components**:
+* **Event Producer**: Generates events (e.g., a user uploads a file).  
+* **Event Consumer**: Listens and reacts to events (e.g., a service processes the uploaded file).  
+* **Message Broker**: Facilitates event delivery (e.g., Kafka, RabbitMQ).
+
+**When to Use**:
+* Applications needing real-time updates (e.g., chat apps, stock trading platforms).  
+* Decoupled microservices to enhance scalability and maintainability.  
+* Workflows with asynchronous tasks (e.g., order processing). 
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/flexbox-vs-grid.md b/src/data/question-groups/full-stack/content/flexbox-vs-grid.md
new file mode 100644
index 000000000..e2df0ff60
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/flexbox-vs-grid.md
@@ -0,0 +1,3 @@
+**Flexbox**: Designed for one-dimensional layouts (row or column). Best for aligning items within a container. Example use cases: Navigation bars or centering elements.
+
+**CSS Grid**: Designed for two-dimensional layouts (rows and columns). Best for creating complex grid-based layouts. Example use cases: Full-page layouts or dashboards.
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/full-stack-debugging.md b/src/data/question-groups/full-stack/content/full-stack-debugging.md
new file mode 100644
index 000000000..006a43d77
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/full-stack-debugging.md
@@ -0,0 +1,9 @@
+1. **Reproduce the Issue**: Identify when and where it happens.  
+2. **Frontend Debugging**:  
+   * Use browser DevTools to inspect network requests (e.g., check HTTP status codes, payloads).  
+   * Check console errors for clues.  
+3. **Back-End Debugging**:  
+   * Check server logs for errors or trace logs for the request.  
+   * Add breakpoints or use a debugger (e.g., Node.js Inspector).  
+4. **Communication Point**: Verify API endpoints, payload structure, and data format.  
+5. **End-to-End Testing**: Test the workflow with tools like Postman to isolate the layer causing issues. 
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/full-stack-development.md b/src/data/question-groups/full-stack/content/full-stack-development.md
new file mode 100644
index 000000000..25b80c147
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/full-stack-development.md
@@ -0,0 +1,10 @@
+**Full-stack development** refers to the practice of building and maintaining both the **frontend** and **backend** of a **web application** or **web service**. A full-stack developer works across all layers of the application, ensuring seamless functionality from the user interface to the server and database.
+
+Key aspects of full-stack development include:
+
+* **Frontend Development**: Involves creating the parts of the application that users interact with directly, such as buttons, forms, and layouts. Tools and technologies often used include **HTML**, **CSS**, **JavaScript**, and frameworks like React, Angular, or Vue.js. This may also include building **Progressive Web Apps (PWAs)** for enhanced user experiences.  
+* **Backend Development**: Focuses on server-side logic, databases, and APIs that power the frontend. Common programming languages for backend development include **Python**, **Java**, **Node.js**, and **PHP**. Developers often design and integrate **web services** or REST/GraphQL APIs for data handling.  
+* **Databases and Storage**: Managing data through relational databases (e.g., MySQL, PostgreSQL) or non-relational databases (e.g., MongoDB, Redis).  
+* **DevOps and Deployment**: Setting up hosting environments, CI/CD pipelines, and handling cloud services to deploy and maintain applications.
+
+Full-stack developers are valued for their versatility and ability to understand how different components of a web application interact, making them crucial for delivering well-rounded, functional products.
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/full-stack-end.md b/src/data/question-groups/full-stack/content/full-stack-end.md
new file mode 100644
index 000000000..6d396a12c
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/full-stack-end.md
@@ -0,0 +1,14 @@
+## Final thoughts
+
+You’ve reached the end of our full-stack developer interview questions, but you’re not done just yet\!
+
+To make sure you’re ready to knock the interview out of the park, here’s a quick roadmap for success:
+
+* **Dive deeper**: Explore our detailed guides for specific roles, including [**frontend**](https://roadmap.sh/questions/frontend), [**backend**](https://roadmap.sh/questions/backend), and [**DevOps**](https://roadmap.sh/questions/devops) interviews. Each guide is packed with questions, answers, and tips tailored to those specialities.  
+* **Check out official docs**: For a detailed explanation of every function, method, or property of HTML, CSS or JavaScript, consider checking out [MDN](https://developer.mozilla.org/en-US/).  
+* **Practice projects**: Build small projects to solidify your understanding of key concepts. Hands-on experience always makes a big difference.  
+* **Brush up on fundamentals**: Review core concepts like algorithms, data structures, and design patterns to handle technical full-stack developer interview questions confidently.  
+* **Mock interviews**: Simulate the interview experience with a friend or use online platforms to build your confidence.  
+* **Stay curious**: Explore new tools and technologies related to your role to showcase your passion for learning.
+
+Good luck, and remember—confidence comes with preparation\!
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/get-post-difference.md b/src/data/question-groups/full-stack/content/get-post-difference.md
new file mode 100644
index 000000000..b1d0f1090
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/get-post-difference.md
@@ -0,0 +1,5 @@
+While there is no hard rule stating these methods needs to be used in a very specific way, the currently accepted standard, says that:
+
+* **GET**: Retrieves data from a server (read-only).  
+* **POST**: Sends data to the server to create or update resources.
+
diff --git a/src/data/question-groups/full-stack/content/graphql-vs-rest.md b/src/data/question-groups/full-stack/content/graphql-vs-rest.md
new file mode 100644
index 000000000..2872d8f77
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/graphql-vs-rest.md
@@ -0,0 +1,27 @@
+GraphQL is a query language for APIs that allows clients to request exactly the data they need, reducing over-fetching or under-fetching.
+
+##### Main differences with REST:
+
+**Data Fetching**:
+* REST: Fixed endpoints return predefined data
+* GraphQL: Single endpoint with flexible queries
+
+**Batching**:
+* GraphQL can fetch related data in one request (nested queries)
+* REST often requires multiple endpoints for related data
+
+**Versioning**:
+* REST may need new versions for API changes
+* GraphQL avoids versioning by evolving schemas
+
+**Example GraphQL Query**:
+```graphql
+query {
+  user(id: 1) {
+    name
+    posts {
+      title
+    }
+  }
+}
+``` 
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/high-availability.md b/src/data/question-groups/full-stack/content/high-availability.md
new file mode 100644
index 000000000..ca5a9d823
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/high-availability.md
@@ -0,0 +1,13 @@
+**High Availability**:
+* Use load balancers to distribute traffic across multiple servers
+* Set up redundancy with failover systems and multiple availability zones
+* Use managed databases with replicas for disaster recovery
+
+**Scalability**:
+* Implement horizontal scaling by adding more instances
+* Use auto-scaling services like AWS Auto Scaling or Kubernetes
+* Cache frequently accessed data (e.g., using Redis or Memcached)
+
+**Other Best Practices**:
+* Optimize database queries and use indexing
+* Implement rate limiting and throttling to handle surges 
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/html-css-js-purpose.md b/src/data/question-groups/full-stack/content/html-css-js-purpose.md
new file mode 100644
index 000000000..b5ecd77dc
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/html-css-js-purpose.md
@@ -0,0 +1,3 @@
+* **HTML**: Defines the structure and content of a webpage.  
+* **CSS**: Styles the webpage (colors, layout, fonts).  
+* **JavaScript**: Adds interactivity and dynamic behavior to the webpage.
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/include-css.md b/src/data/question-groups/full-stack/content/include-css.md
new file mode 100644
index 000000000..da00b8e78
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/include-css.md
@@ -0,0 +1,21 @@
+There are two main ways to include CSS into your HTML, you can either do it “inline” or you can do it with the “style” tag.
+
+**Inline**: Add `style` directly in an HTML element.
+
+```html
+<p style="color: red;">Hello</p>
+```
+
+**Internal**: Use a `<style>` tag in the `<head>`.
+
+```html
+<style>
+p { color: red; }
+</style>
+```
+
+**External**: Link a CSS file using `<link>` in the `<head>`.
+
+```html
+<link rel="stylesheet" href="styles.css">
+```
diff --git a/src/data/question-groups/full-stack/content/internationalization.md b/src/data/question-groups/full-stack/content/internationalization.md
new file mode 100644
index 000000000..8fb041bd9
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/internationalization.md
@@ -0,0 +1,18 @@
+**Frontend**: Use libraries like `react-intl` or `i18next` to manage translations.
+
+Example:  
+```javascript
+import { useTranslation } from 'react-i18next';
+const { t } = useTranslation();
+<h1>{t('welcome_message')}</h1>;
+```
+
+**Backend**:
+1. Store translations in a database or JSON files.  
+2. Serve the correct language file based on user preferences or `Accept-Language` headers.
+
+**Additional Considerations**:
+* Support language-specific routes (e.g., `/en/home`, `/fr/home`)
+* Translate content dynamically from the database or CMS
+* Provide fallback languages if a translation is unavailable
+* Test language switches and correct text alignment for RTL languages like Arabic 
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/js-dom-manipulation.md b/src/data/question-groups/full-stack/content/js-dom-manipulation.md
new file mode 100644
index 000000000..c1d1d3bd1
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/js-dom-manipulation.md
@@ -0,0 +1,6 @@
+JavaScript accesses and modifies the DOM using methods like:
+
+* **Get elements**: `document.getElementById("id")`, `querySelector(".class")`.  
+* **Modify content**: `element.innerHTML = "New Content"`.  
+* **Change styles**: `element.style.color = "blue"`.  
+* **Add/remove elements**: `appendChild()`, `removeChild()`.
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/js-equality-operators.md b/src/data/question-groups/full-stack/content/js-equality-operators.md
new file mode 100644
index 000000000..aeb925192
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/js-equality-operators.md
@@ -0,0 +1,2 @@
+* **`==`**: Compares values with each other directly, performing type conversion if required first (example: `'5' == 5` → `true`).  
+* **`===`**: This operator strictly compares values and types with each other. There is no type conversion performed with this operator. For example, if you try to compare a string and a number, the result will always be false, no matter what: `'5' === 5` → `false`.
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/memory-leaks.md b/src/data/question-groups/full-stack/content/memory-leaks.md
new file mode 100644
index 000000000..7bc7c9710
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/memory-leaks.md
@@ -0,0 +1,22 @@
+Memory leaks usually happen when unused resources (e.g., DOM elements, event listeners, or data structures) are not properly released, causing unnecessary memory consumption.   
+
+**Common Solutions**:
+
+1. **Clean up event listeners**: Remove listeners when components unmount:
+```javascript
+useEffect(() => {
+  window.addEventListener('resize', handler);
+  return () => window.removeEventListener('resize', handler);
+}, []);
+```
+
+2. **Abort fetch requests**: Use `AbortController` to cancel pending API calls:
+```javascript
+const controller = new AbortController();
+fetch(url, { signal: controller.signal });
+return () => controller.abort();
+```
+
+3. **Avoid stale references**: Ensure state updates do not persist after unmounting by checking component state.
+
+4. **Use profiling tools**: Monitor and analyze memory usage using browser DevTools to detect leaks. 
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/microservices.md b/src/data/question-groups/full-stack/content/microservices.md
new file mode 100644
index 000000000..f0928887e
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/microservices.md
@@ -0,0 +1,15 @@
+1. **Decompose the Application**: Identify distinct business domains and split functionality into small, loosely coupled services.
+
+2. **Service Communication**: 
+   * Use APIs (REST or GraphQL) for synchronous communication
+   * Use messaging systems (e.g., RabbitMQ, Kafka) for asynchronous communication
+
+3. **Independent Data Stores**: Each service manages its own database to ensure independence.
+
+4. **Service Discovery**: Use a registry like Consul or Eureka to manage service locations dynamically.
+
+5. **Deployment**: 
+   * Containerize services with Docker
+   * Orchestrate using Kubernetes
+
+6. **Monitoring**: Use tools like Prometheus, Grafana, or ELK Stack for observability and debugging. 
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/mvc-architecture.md b/src/data/question-groups/full-stack/content/mvc-architecture.md
new file mode 100644
index 000000000..f98cb2c12
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/mvc-architecture.md
@@ -0,0 +1,8 @@
+**MVC** is a design pattern for organizing code in three layers:
+
+1. **Model**: Handles data and business logic (e.g., database interactions).  
+2. **View**: Displays data to users (e.g., HTML, templates).  
+3. **Controller**: Manages user input and communicates between Model and View.
+
+**Flow**:
+* User interacts with the **View** → **Controller** processes input → Updates the **Model** → Changes are reflected in the **View**. 
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/nodejs-database-crud.md b/src/data/question-groups/full-stack/content/nodejs-database-crud.md
new file mode 100644
index 000000000..33cbe9ca7
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/nodejs-database-crud.md
@@ -0,0 +1,95 @@
+In general terms, connecting to a database using Node.js requires the following steps:
+
+1. Install the DB driver.  
+2. Use the driver to connect to the database.  
+3. Use the returned connection object to send requests.
+
+Of course, depending on the database engine you decide to go with, there might be some slight changes to those steps.  
+However, if we think about either MongoDB or PostgreDB, let’s take a look at how to interact with them through Node.js:
+
+##### Install the Database Driver
+
+The first thing you gotta do, is install either the driver which will let you directly interact with the database, or an ORM, which will abstract that connection and give you a higher-level layer of abstraction.   
+Use the appropriate driver for your database.
+
+* For MongoDB: `npm install mongoose`  
+* For PostgreSQL: `npm install pg`
+
+##### Connect to the database
+
+Now to connect to the actual database, you’ll have to adapt the code based on the connection method you’re using. Let’s take a closer look at how to connect either to MongoDB or PostgreDB.
+
+**MongoDB**:  
+
+```javascript
+const mongoose = require('mongoose');
+mongoose.connect('mongodb://localhost:27017/mydb', { useNewUrlParser: true, useUnifiedTopology: true });
+```
+
+**PostgreSQL**:  
+
+```javascript
+const { Pool } = require('pg');
+const pool = new Pool({ user: 'user', host: 'localhost', database: 'mydb', password: 'password', port: 5432 });
+```
+
+##### Perform CRUD Operations
+
+For the CRUD (Create, Read, Update & Delete), the code is going to change based on the technology you’re using. Here in our examples, we have one that’s using an ORM which means we have an abstraction layer on top of the native query language, and then we also have a simple SQL driver, which means we have to directly write SQL queries.
+
+**Create operation**:
+
+**MongoDB**:  
+
+```javascript
+const User = mongoose.model('User', { name: String });
+User.create({ name: 'John Doe' });
+```
+
+**PostgreSQL**:  
+
+```javascript
+pool.query('INSERT INTO users (name) VALUES ($1)', ['John Doe']);
+```
+
+**Read operation**:
+
+**MongoDB**:  
+
+```javascript
+User.find({}, (err, users) => console.log(users));
+```
+
+**PostgreSQL**:  
+
+```javascript
+pool.query('SELECT * FROM users', (err, res) => console.log(res.rows));
+```
+
+**Update operation**:
+
+**MongoDB**:  
+
+```javascript
+User.updateOne({ name: 'John Doe' }, { name: 'Jane Doe' });
+```
+
+**PostgreSQL**:  
+
+```javascript
+pool.query('UPDATE users SET name = $1 WHERE name = $2', ['Jane Doe', 'John Doe']);
+```
+
+**Delete operation**:
+
+**MongoDB**:  
+
+```javascript
+User.deleteOne({ name: 'Jane Doe' });
+```
+
+**PostgreSQL**:  
+
+```javascript
+pool.query('DELETE FROM users WHERE name = $1', ['Jane Doe']);
+```
diff --git a/src/data/question-groups/full-stack/content/nodejs-middleware.md b/src/data/question-groups/full-stack/content/nodejs-middleware.md
new file mode 100644
index 000000000..09c40ec40
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/nodejs-middleware.md
@@ -0,0 +1,9 @@
+Middleware in Express is a function that processes requests and responses in the app’s request-response cycle. It can be used to modify request/response objects adding extra information or removing unnecessary data, it can execute code (like logging, parsing JSON, etc) and it can also end the request-response cycle, allowing it to short-circuit the process and return a different response (commonly used to handle invalid or unauthorized requests).
+
+Example:  
+```javascript
+app.use((req, res, next) => {
+  console.log('Middleware triggered');
+  next();
+});
+```
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/package-json-purpose.md b/src/data/question-groups/full-stack/content/package-json-purpose.md
new file mode 100644
index 000000000..3663eafb6
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/package-json-purpose.md
@@ -0,0 +1,3 @@
+The `package.json` file in a Node.js project has multiple uses. It defines the project's metadata, like its name, version, and description. It also lists the dependencies and devDependencies required to run or develop the application, as well as scripts for tasks like building, testing, or running the app (and any custom script you’d like to add). 
+
+Finally, it ensures reproducible installations by allowing the `npm install` command to pull consistent dependencies, ensuring you can easily port your project into other systems.
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/performance-monitoring.md b/src/data/question-groups/full-stack/content/performance-monitoring.md
new file mode 100644
index 000000000..a472a9ca5
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/performance-monitoring.md
@@ -0,0 +1,18 @@
+As a full-stack developer, the monitoring of your application involves the full 360 view of the app, from the frontend into the backend, including the database, and other involved systems.
+
+##### Frontend Monitoring:
+* Use tools like Google Lighthouse or Web Vitals to track load times, interactivity, and rendering.
+* Monitor user behavior with tools like New Relic Browser or LogRocket.
+
+##### Backend Monitoring:
+* Use APM tools (e.g., Datadog, Dynatrace) to monitor server response times, database query performance, and API latency.
+
+##### Logging:
+* Centralize logs with tools like ELK Stack or CloudWatch Logs for analyzing bottlenecks.
+* Critical for systems with many individual microservices and different clients working together.
+
+##### Database Monitoring:
+* Use query profilers (e.g., MySQL EXPLAIN) and monitor database health with tools like Percona Monitoring.
+
+##### Alerting:
+* Set up alerts for anomalies or thresholds using tools like Prometheus and Grafana. 
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/postman-testing.md b/src/data/question-groups/full-stack/content/postman-testing.md
new file mode 100644
index 000000000..84eac669c
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/postman-testing.md
@@ -0,0 +1,14 @@
+1. **Create a Request**: Enter the API endpoint, method (GET, POST, etc.), and headers.  
+2. **Send Data**:  
+   * Add query params, body (JSON, form data), or headers.  
+3. **Send Request**: Click "Send" to view the response.
+
+**Assertions**: Use the **Tests** tab to write scripts (JavaScript) for automated validation of responses.  
+Example:  
+```javascript
+pm.test("Status is 200", () => {
+  pm.response.to.have.status(200);
+});
+```
+
+4. **Collections**: Group requests for testing workflows or environments. 
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/react-hooks.md b/src/data/question-groups/full-stack/content/react-hooks.md
new file mode 100644
index 000000000..90005dd58
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/react-hooks.md
@@ -0,0 +1,9 @@
+React hooks are functions that let you use state and other React features in functional components.
+
+With hooks you can simplify state and lifecycle management without needing class components. They also enable code reuse through custom hooks.
+
+**Examples of different hooks**:
+
+* `useState` for managing state.  
+* `useEffect` for handling side effects (e.g., fetching data).  
+* `useContext` for global state.
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/react-performance.md b/src/data/question-groups/full-stack/content/react-performance.md
new file mode 100644
index 000000000..a53e4acf4
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/react-performance.md
@@ -0,0 +1,10 @@
+The performance of a React application can be affected by multiple aspects, but some of the most common ones and their way to fix them are:
+
+1. **Reduce Re-renders**:  
+   * Use `React.memo` and `useCallback` to avoid unnecessary updates.  
+   * Split large components into smaller, focused components.  
+2. **Lazy Loading**: Load components or routes on demand using `React.lazy` and `Suspense`.  
+3. **Efficient State Management**: Keep state local where possible and avoid overusing global state.  
+4. **Minimize DOM Updates**: Use keys in lists and avoid deeply nested props/state updates.  
+5. **Code Splitting**: Use Webpack or tools like `react-loadable` to split the bundle.  
+6. **Profile and Debug**: Use React Developer Tools to identify bottlenecks.
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/react-seo.md b/src/data/question-groups/full-stack/content/react-seo.md
new file mode 100644
index 000000000..5e36958ed
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/react-seo.md
@@ -0,0 +1,6 @@
+1. **Server-Side Rendering (SSR)**: Use frameworks like Next.js to render pages on the server for better crawlability.  
+2. **Meta Tags**: Dynamically set titles, descriptions, and keywords using libraries like `react-helmet`.  
+3. **Sitemap and Robots.txt**: Generate a sitemap.xml and configure robots.txt for search engines.  
+4. **Lazy Loading**: Ensure above-the-fold content loads quickly.  
+5. **Structured Data**: Add JSON-LD for rich search results.  
+6. **Canonical URLs**: Avoid duplicate content issues with proper canonical tags. 
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/react-ssr.md b/src/data/question-groups/full-stack/content/react-ssr.md
new file mode 100644
index 000000000..514debfa9
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/react-ssr.md
@@ -0,0 +1,14 @@
+The easiest way is to use a framework like **Next.js** for built-in SSR support.
+
+**Steps involved**:
+
+1. Set up pages with `getServerSideProps` to fetch data at request time:  
+```javascript
+export async function getServerSideProps() {
+  const data = await fetch('https://api.example.com');
+  return { props: { data } };
+}
+```
+
+2. Render the page server-side and send it as HTML to the client.  
+3. Hydrate the page on the client to make it interactive. 
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/react-state-management.md b/src/data/question-groups/full-stack/content/react-state-management.md
new file mode 100644
index 000000000..3ef5ee959
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/react-state-management.md
@@ -0,0 +1,11 @@
+In React you have two different ways to handle state, depending on the scope of the data inside that state. 
+
+If the scope is local, then you can handle it through a simple `useState` hook inside the component itself. 
+
+If on the other hand, you need to store a global state which is accessible for many components, then you can use something like the `Context API` or specific state libraries like Redux, MobX or Zustand.
+
+The way state handling works in React (in general terms) works like this:
+
+* State is updated via actions (e.g., event handlers).  
+* Updated state triggers re-renders to reflect changes in the UI.  
+* Avoid excessive re-renders by optimizing context or using memoization (`React.memo`, `useMemo`).
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/real-time-updates.md b/src/data/question-groups/full-stack/content/real-time-updates.md
new file mode 100644
index 000000000..be04fffc0
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/real-time-updates.md
@@ -0,0 +1,21 @@
+1. **Use WebSockets**: Establish a persistent connection for real-time communication.
+
+Example Client:  
+```javascript
+const socket = new WebSocket('ws://server.com');
+socket.onmessage = (message) => console.log(message.data);
+```
+
+2. **Server Setup**: Use libraries like `socket.io` for WebSocket management.
+
+Example Server:  
+```javascript
+const io = require('socket.io')(server);
+io.on('connection', (socket) => {
+  socket.on('chat message', (msg) => io.emit('chat message', msg));
+});
+```
+
+3. **Fallback for Compatibility**: Implement long polling or server-sent events (SSE) if WebSockets aren't feasible.  
+4. **Database Integration**: Use event-driven solutions like Redis pub/sub for scalability in multi-server setups.  
+5. **Security**: Ensure secure WebSocket connections (wss://) and authenticate users. 
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/relational-vs-nosql.md b/src/data/question-groups/full-stack/content/relational-vs-nosql.md
new file mode 100644
index 000000000..18546d0ae
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/relational-vs-nosql.md
@@ -0,0 +1,2 @@
+* **Relational**: Stores data in structured tables with rows and columns (e.g., MySQL, PostgreSQL). Good for relationships and complex queries.  
+* **Non-relational**: Stores data in flexible formats like documents, key-value pairs, or graphs (e.g., MongoDB, Redis). Better for unstructured or hierarchical data.
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/responsive-design.md b/src/data/question-groups/full-stack/content/responsive-design.md
new file mode 100644
index 000000000..a3026c057
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/responsive-design.md
@@ -0,0 +1,13 @@
+**Responsive design** ensures a website looks good on all devices by adapting its layout to different screen sizes.
+
+To help ensure this, you can use flexible grids (either `CSS Grid` or `Flexbox`).
+
+You will also have to apply media queries which help set breakpoints where the different styles need to be applied based on the width of the window:  
+
+```css
+@media (max-width: 768px) {
+  .container { flex-direction: column; }
+}
+```
+
+You can also use relative units (`%`, `em`, `rem`) instead of fixed units (`px`) to ensure the values automatically adapt to the size of the container.
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/rest-api.md b/src/data/question-groups/full-stack/content/rest-api.md
new file mode 100644
index 000000000..9b17f871d
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/rest-api.md
@@ -0,0 +1,20 @@
+A **REST API** (Representational State Transfer Application Programming Interface) is a standardized way for applications to communicate over HTTP by following a set of principles. It allows clients (like web browsers or mobile apps) to interact with servers to perform operations like fetching or modifying data.
+
+**Key Features of a REST API**:
+
+1. **Stateless Communication**: Each request from the client to the server must contain all the information needed for the server to process it, with no reliance on stored session data.  
+2. **Resource-Based**: Data and functionality are treated as "resources" accessed using endpoints (URLs).  
+   * Example: `/users` to get a list of users, `/users/1` to access a specific user.  
+3. **HTTP Methods**: REST APIs use HTTP methods to define actions:  
+   * **GET**: Retrieve data.  
+   * **POST**: Create new resources.  
+   * **PUT**: Update existing resources.  
+   * **DELETE**: Remove resources.  
+4. **Structured Responses**: Data is typically returned in a lightweight format like **JSON** or **XML**.
+
+**Why is it Used?**
+
+* **Interoperability**: REST APIs enable communication between different systems and platforms, making them ideal for building **web services**.  
+* **Scalability**: They are stateless, allowing them to handle more traffic with horizontal scaling.  
+* **Ease of Use**: Clear structure and standard conventions make it easy for developers to understand and implement.  
+* **Flexibility**: Suitable for a variety of clients, from **web applications** to mobile and IoT devices.
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/rest-pagination.md b/src/data/question-groups/full-stack/content/rest-pagination.md
new file mode 100644
index 000000000..3e68f468f
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/rest-pagination.md
@@ -0,0 +1,35 @@
+Adding pagination to a RESTful API can be done in multiple ways, but assuming a standard implementation, the best option is to go with query parameters.
+
+**Query Parameters**: Using `limit` and `offset` (or `page` and `size`).  
+
+```
+GET /api/items?limit=10&offset=20
+```
+
+**Back-End Implementation**:
+
+In the backend, we’re turn those query params into something like:
+
+**SQL code:**  
+```sql
+SELECT * FROM items LIMIT 10 OFFSET 20;
+```
+
+**In code:**  
+```javascript
+const items = await db.find().skip(offset).limit(limit);
+res.json({ data: items });
+```
+
+##### Metadata
+
+Include total count and current page in the response for better UX.
+
+```json
+{ 
+  "data": [...], 
+  "total": 100,
+  "page": 3,
+  "size": 10 
+}
+```
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/security-vulnerabilities.md b/src/data/question-groups/full-stack/content/security-vulnerabilities.md
new file mode 100644
index 000000000..30206569b
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/security-vulnerabilities.md
@@ -0,0 +1,21 @@
+##### SQL Injection:
+
+To avoid SQL injection attacks, use parameterized queries or prepared statements to prevent malicious SQL code from being executed:
+```javascript
+db.query('SELECT * FROM users WHERE id = ?', [userId]);
+```
+
+Also validate and sanitize user inputs to ensure it doesn't contain characters that might interfere with SQL statements.
+
+##### Cross-Site Scripting (XSS):
+
+To avoid allowing scripts or dynamic content to affect your page:
+
+1. Escape content before rendering in the browser:
+```javascript
+<div>{sanitize(userInput)}</div>
+```
+
+2. Use libraries like DOMPurify to sanitize HTML.
+
+3. Set `Content-Security-Policy` headers to restrict allowed sources for scripts to trusted sources. 
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/user-authentication.md b/src/data/question-groups/full-stack/content/user-authentication.md
new file mode 100644
index 000000000..03dcb94b8
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/user-authentication.md
@@ -0,0 +1,7 @@
+There are many ways to handle authentication, from simple auth, all the way to oAuth. The right option depends on your particular business needs.  
+A classical example is using JWT for authenticating a website with a RESTful API using the following process:
+
+1. **Frontend**: Present a login form to collect credentials from the user.  
+2. **Backend**: Verify credentials against a database and if they’re valid, create a signed token and return it in the response.  
+3. **Secure connection**: From this point on, the frontend will send the token on every request and the backend will validate it to ensure it’s a valid and authenticated user.  
+4. **Secured best practices**: Ensure your passwords are hashed (e.g., with bcrypt) and use HTTPS for a secured data transmission channel.
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/version-control.md b/src/data/question-groups/full-stack/content/version-control.md
new file mode 100644
index 000000000..21a9ca383
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/version-control.md
@@ -0,0 +1,11 @@
+**Purpose**: Version control tracks changes in code, enables collaboration, and allows reverting to previous versions.
+
+**Git Workflow Example**:
+
+1. Clone the repository: `git clone <repo_url>`.  
+2. Create a branch: `git checkout -b feature-branch`.  
+3. Make changes and stage them: `git add .`.  
+4. Commit changes: `git commit -m "Add feature"`.  
+5. Push to the remote: `git push origin feature-branch`.  
+6. Create a pull request for review.  
+7. Merge the branch into the main branch after approval.
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/content/websockets.md b/src/data/question-groups/full-stack/content/websockets.md
new file mode 100644
index 000000000..be555c9a8
--- /dev/null
+++ b/src/data/question-groups/full-stack/content/websockets.md
@@ -0,0 +1,11 @@
+**WebSockets**: A protocol for full-duplex communication between client and server over a single persistent connection.
+
+**Difference**:
+
+* **HTTP**: Request-response model; client initiates every interaction.  
+* **WebSockets**: Persistent, allowing real-time, two-way communication (e.g., live chat, notifications).
+
+Example:
+
+* HTTP: Send a request for new messages repeatedly (polling).  
+* WebSocket: Server pushes new messages as they arrive.
\ No newline at end of file
diff --git a/src/data/question-groups/full-stack/full-stack.md b/src/data/question-groups/full-stack/full-stack.md
new file mode 100644
index 000000000..53d94025f
--- /dev/null
+++ b/src/data/question-groups/full-stack/full-stack.md
@@ -0,0 +1,246 @@
+---
+order: 4
+briefTitle: 'Full-stack'
+briefDescription: 'Test, Rate and Improve your Full-stack knowledge with these questions.'
+title: 'Top 50 Full Stack Developer Interview Questions'
+description: 'Ace your interview with our curated list of 50 full-stack developer interview questions, perfect for beginners and experienced candidates.'
+authorId: 'fernando'
+isNew: false
+date: 2025-01-29
+seo:
+  title: 'Top 50 Full Stack Developer Interview Questions'
+  description: 'Ace your interview with our curated list of 50 full-stack developer interview questions, perfect for beginners and experienced candidates.'
+  keywords:
+    - 'full-stack quiz'
+    - 'full-stack questions'
+    - 'full-stack interview questions'
+    - 'full-stack interview'
+    - 'full-stack test'
+sitemap:
+  priority: 1
+  changefreq: 'monthly'
+ending: 'full-stack-end.md'
+questions:
+  - question: What is full-stack development?
+    answer: full-stack-development.md
+    topics:
+      - 'Beginner'
+  - question: Explain the difference between client-side and server-side programming
+    answer: client-server-programming.md
+    topics:
+      - 'Beginner'
+  - question: What is the purpose of HTML, CSS, and JavaScript in web development?
+    answer: html-css-js-purpose.md
+    topics:
+      - 'Beginner'
+  - question: What is a REST API, and why is it used?
+    answer: rest-api.md
+    topics:
+      - 'Beginner'
+  - question: Explain the difference between GET and POST HTTP methods
+    answer: get-post-difference.md
+    topics:
+      - 'Beginner'
+  - question: How do you include CSS in an HTML document?
+    answer: include-css.md
+    topics:
+      - 'Beginner'
+  - question: What is the purpose of the div and span tags in HTML?
+    answer: div-span-purpose.md
+    topics:
+      - 'Beginner'
+  - question: What are CSS selectors, and can you name a few types?
+    answer: css-selectors.md
+    topics:
+      - 'Beginner'
+  - question: How does JavaScript manipulate the DOM?
+    answer: js-dom-manipulation.md
+    topics:
+      - 'Beginner'
+  - question: What is the difference between == and === in JavaScript?
+    answer: js-equality-operators.md
+    topics:
+      - 'Beginner'
+  - question: What is the difference between relational and non-relational databases?
+    answer: relational-vs-nosql.md
+    topics:
+      - 'Beginner'
+  - question: How would you handle user authentication in a web application?
+    answer: user-authentication.md
+    topics:
+      - 'Beginner'
+  - question: What is the purpose of package.json in a Node.js project?
+    answer: package-json-purpose.md
+    topics:
+      - 'Beginner'
+  - question: How would you connect a Node.js application to a database and perform basic CRUD operations?
+    answer: nodejs-database-crud.md
+    topics:
+      - 'Beginner'
+  - question: What are environment variables, and how are they used?
+    answer: environment-variables.md
+    topics:
+      - 'Beginner'
+  - question: Explain the concept of responsive design. How would you implement it?
+    answer: responsive-design.md
+    topics:
+      - 'Intermediate'
+  - question: What is the difference between Flexbox and CSS Grid?
+    answer: flexbox-vs-grid.md
+    topics:
+      - 'Intermediate'
+  - question: What are React hooks, and why are they used?
+    answer: react-hooks.md
+    topics:
+      - 'Intermediate'
+  - question: How does state management work in React applications?
+    answer: react-state-management.md
+    topics:
+      - 'Intermediate'
+  - question: Explain how you would optimize the performance of a React app
+    answer: react-performance.md
+    topics:
+      - 'Intermediate'
+  - question: What is middleware in the context of Node.js and Express?
+    answer: nodejs-middleware.md
+    topics:
+      - 'Intermediate'
+  - question: How do you manage asynchronous code in JavaScript?
+    answer: async-javascript.md
+    topics:
+      - 'Intermediate'
+  - question: Explain how relational databases handle relationships
+    answer: database-relationships.md
+    topics:
+      - 'Intermediate'
+  - question: How would you implement pagination in a REST API?
+    answer: rest-pagination.md
+    topics:
+      - 'Intermediate'
+  - question: Describe how you would secure an API using authentication and authorization techniques
+    answer: api-security.md
+    topics:
+      - 'Intermediate'
+  - question: Explain the purpose of a version control system and Git workflow
+    answer: version-control.md
+    topics:
+      - 'Intermediate'
+  - question: What are WebSockets, and how do they differ from HTTP requests?
+    answer: websockets.md
+    topics:
+      - 'Intermediate'
+  - question: Describe the concept of MVC architecture
+    answer: mvc-architecture.md
+    topics:
+      - 'Intermediate'
+  - question: What is CORS, and how do you handle it in a web application?
+    answer: cors-handling.md
+    topics:
+      - 'Intermediate'
+  - question: How do you use Postman for testing APIs?
+    answer: postman-testing.md
+    topics:
+      - 'Intermediate'
+  - question: How would you deploy a full-stack application to a cloud provider?
+    answer: cloud-deployment.md
+    topics:
+      - 'Advanced'
+  - question: What is the purpose of a build tool like Webpack or Vite?
+    answer: build-tools.md
+    topics:
+      - 'Advanced'
+  - question: How do you debug an issue that occurs in both the frontend and back-end?
+    answer: full-stack-debugging.md
+    topics:
+      - 'Advanced'
+  - question: Explain the role of Docker in development and deployment
+    answer: docker-role.md
+    topics:
+      - 'Advanced'
+  - question: How would you implement real-time updates in a web application?
+    answer: real-time-updates.md
+    topics:
+      - 'Advanced'
+  - question: What are some strategies for improving the SEO of a React-based application?
+    answer: react-seo.md
+    topics:
+      - 'Advanced'
+  - question: How would you implement server-side rendering in a modern React app?
+    answer: react-ssr.md
+    topics:
+      - 'Advanced'
+  - question: What is code splitting, and how does it improve performance?
+    answer: code-splitting.md
+    topics:
+      - 'Advanced'
+  - question: Explain how to handle memory leaks in frontend applications
+    answer: memory-leaks.md
+    topics:
+      - 'Advanced'
+  - question: How would you implement internationalization in a full-stack app?
+    answer: internationalization.md
+    topics:
+      - 'Advanced'
+  - question: Explain how you would design and implement a microservices architecture
+    answer: microservices.md
+    topics:
+      - 'Advanced'
+  - question: What are some strategies to ensure high availability and scalability?
+    answer: high-availability.md
+    topics:
+      - 'Advanced'
+  - question: How do you handle database migrations in production systems?
+    answer: database-migrations.md
+    topics:
+      - 'Advanced'
+  - question: What is GraphQL, and how does it differ from REST?
+    answer: graphql-vs-rest.md
+    topics:
+      - 'Advanced'
+  - question: How would you implement caching in a back-end system?
+    answer: backend-caching.md
+    topics:
+      - 'Advanced'
+  - question: How do you handle security vulnerabilities such as SQL injection and XSS?
+    answer: security-vulnerabilities.md
+    topics:
+      - 'Advanced'
+  - question: Explain how CI/CD pipelines work and tools used to implement them
+    answer: cicd-pipelines.md
+    topics:
+      - 'Advanced'
+  - question: How do you approach performance monitoring in a full-stack application?
+    answer: performance-monitoring.md
+    topics:
+      - 'Advanced'
+  - question: What is event-driven architecture, and when would you use it?
+    answer: event-driven-architecture.md
+    topics:
+      - 'Advanced'
+  - question: What are common challenges in building full-stack applications?
+    answer: common-challenges.md
+    topics:
+      - 'Advanced'
+
+---
+
+![Top full-stack developer interview questions](https://assets.roadmap.sh/guest/full-stack-developer-interview-questions-baq90.jpg)
+
+Full-stack developers are the backbone of modern software teams, bravely connecting the dots between what users see and the powerful systems working behind the scenes. They're not "just" frontend developers, nor they're "just" backend devs, instead, they tackle the full spectrum. From designing intuitive interfaces to crafting efficient web server logic, they juggle multiple responsibilities, making their role one of the most versatile—and critical—in the tech industry.
+
+If you're aiming for a full-stack role, you'll need to prove you've got the skills to handle it all. That's why we've put together this guide to the **most common full-stack developer interview questions**. 
+
+And if this is not enough, we also have a full [full-stack roadmap](https://roadmap.sh/full-stack) for you to follow. 
+
+So get comfortable, and let's begin.
+
+## Getting ready for your full-stack interview
+
+Before jumping right into your full-stack developer interview, remember the following points:
+
+1. **Understand the Core Concepts**: Familiarize yourself with the foundations of full-stack development, including frontend frameworks (like React or Angular), back-end technologies (such as Node.js or Django), RESTful APIs, and databases. Understanding how these pieces work together is key to unlocking the role of full-stack developer.  
+2. **Practice Hands-On Skills**: Full-stack development is all about practical knowledge, so put your skills to the test. Build a small project or refine an existing one. Practice creating REST APIs, styling responsive UIs, or integrating a database. The more you practice, the more comfortable you'll feel in solving real-world problems.  
+3. **Study Software Architecture**: While you may not be a system architect, a solid understanding of software architecture principles—such as MVC, microservices, and event-driven designs—can be a huge advantage. Being able to discuss how these concepts apply to modern web apps can make you stand out.  
+4. **Research the Company**: Always research the company you're interviewing with. Investigate the tools and technologies they use for any type of software development (regardless if it's backend or frontend), their overall tech stack, and their approach to building software. This will show genuine interest and help you ask insightful questions during the interview.
+
+We're now ready to get started, so let's dive into some of the most common full-stack developer interview questions to help you prepare\!
diff --git a/src/data/roadmaps/ai-data-scientist/ai-data-scientist.json b/src/data/roadmaps/ai-data-scientist/ai-data-scientist.json
index 403b80435..cd8cbe39f 100644
--- a/src/data/roadmaps/ai-data-scientist/ai-data-scientist.json
+++ b/src/data/roadmaps/ai-data-scientist/ai-data-scientist.json
@@ -3,30 +3,19 @@
     {
       "id": "28Iu61OKR6_3BBmO8M5lg",
       "type": "horizontal",
-      "position": {
-        "x": 481.39029212267985,
-        "y": 1925.5843010493045
-      },
-      "selected": false,
+      "position": { "x": 481.39029212267985, "y": 1925.5843010493045 },
+      "selected": true,
       "data": {
         "label": "horizontal node",
         "oldId": "q_oYxEPUvEylwjAyDA5FL",
-        "style": {
-          "stroke": "#0062FF"
-        }
+        "style": { "stroke": "#0062FF" }
       },
       "zIndex": 999,
       "width": 289,
       "height": 20,
-      "positionAbsolute": {
-        "x": 481.39029212267985,
-        "y": 1925.5843010493045
-      },
+      "positionAbsolute": { "x": 481.39029212267985, "y": 1925.5843010493045 },
       "dragging": false,
-      "style": {
-        "width": 289,
-        "height": 20
-      },
+      "style": { "width": 289, "height": 20 },
       "resizing": true,
       "selectable": true,
       "focusable": true
@@ -34,30 +23,19 @@
     {
       "id": "0dVq5C16sFyWglWitQQdD",
       "type": "horizontal",
-      "position": {
-        "x": 542.8902921226799,
-        "y": 1266.7340815556822
-      },
-      "selected": false,
+      "position": { "x": 542.8902921226799, "y": 1266.7340815556822 },
+      "selected": true,
       "data": {
         "label": "horizontal node",
         "oldId": "ofcYD3hTVEMeRptkHsVer",
-        "style": {
-          "stroke": "#0062FF"
-        }
+        "style": { "stroke": "#0062FF" }
       },
       "zIndex": 999,
       "width": 243,
       "height": 20,
-      "positionAbsolute": {
-        "x": 542.8902921226799,
-        "y": 1266.7340815556822
-      },
+      "positionAbsolute": { "x": 542.8902921226799, "y": 1266.7340815556822 },
       "dragging": false,
-      "style": {
-        "width": 243,
-        "height": 20
-      },
+      "style": { "width": 243, "height": 20 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -65,30 +43,19 @@
     {
       "id": "Vdw0GAnxhDCj_C3XDxNDF",
       "type": "horizontal",
-      "position": {
-        "x": 192.89029212267985,
-        "y": 1266.7340815556822
-      },
-      "selected": false,
+      "position": { "x": 192.89029212267985, "y": 1266.7340815556822 },
+      "selected": true,
       "data": {
         "label": "horizontal node",
         "oldId": "q_oYxEPUvEylwjAyDA5FL",
-        "style": {
-          "stroke": "#0062FF"
-        }
+        "style": { "stroke": "#0062FF" }
       },
       "zIndex": 999,
       "width": 77,
       "height": 20,
-      "positionAbsolute": {
-        "x": 192.89029212267985,
-        "y": 1266.7340815556822
-      },
+      "positionAbsolute": { "x": 192.89029212267985, "y": 1266.7340815556822 },
       "dragging": false,
-      "style": {
-        "width": 77,
-        "height": 20
-      },
+      "style": { "width": 77, "height": 20 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -96,29 +63,18 @@
     {
       "id": "Z4MOOqNXpHkxWe0PJ7hjt",
       "type": "horizontal",
-      "position": {
-        "x": -82.10970787732015,
-        "y": 132.4007482223489
-      },
-      "selected": false,
+      "position": { "x": -82.10970787732015, "y": 132.4007482223489 },
+      "selected": true,
       "data": {
         "label": "horizontal node",
         "oldId": "3_CBtQLv0X6GzUEtq7jyp",
-        "style": {
-          "stroke": "#0062FF"
-        }
+        "style": { "stroke": "#0062FF" }
       },
       "zIndex": 999,
       "width": 343,
       "height": 20,
-      "style": {
-        "width": 343,
-        "height": 20
-      },
-      "positionAbsolute": {
-        "x": -82.10970787732015,
-        "y": 132.4007482223489
-      },
+      "style": { "width": 343, "height": 20 },
+      "positionAbsolute": { "x": -82.10970787732015, "y": 132.4007482223489 },
       "dragging": false,
       "resizing": false,
       "selectable": true,
@@ -127,29 +83,15 @@
     {
       "id": "JHqi_gjATUrPtewn-cdGo",
       "type": "vertical",
-      "position": {
-        "x": -164.10970787732015,
-        "y": 46.40074822234891
-      },
-      "selected": false,
-      "data": {
-        "label": "vertical node",
-        "style": {
-          "stroke": "#0062FF"
-        }
-      },
+      "position": { "x": -164.10970787732015, "y": 46.40074822234891 },
+      "selected": true,
+      "data": { "label": "vertical node", "style": { "stroke": "#0062FF" } },
       "zIndex": 999,
       "width": 20,
       "height": 109,
-      "positionAbsolute": {
-        "x": -164.10970787732015,
-        "y": 46.40074822234891
-      },
+      "positionAbsolute": { "x": -164.10970787732015, "y": 46.40074822234891 },
       "dragging": false,
-      "style": {
-        "width": 20,
-        "height": 109
-      },
+      "style": { "width": 20, "height": 109 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -157,30 +99,19 @@
     {
       "id": "I7PI9n8QfW9_tCWOdw7yY",
       "type": "horizontal",
-      "position": {
-        "x": -144.10970787732015,
-        "y": 1174.400748222349
-      },
-      "selected": false,
+      "position": { "x": -144.10970787732015, "y": 1174.400748222349 },
+      "selected": true,
       "data": {
         "label": "horizontal node",
         "oldId": "deHK6yEdytCu2ACvVC0bs",
-        "style": {
-          "stroke": "#0062FF"
-        }
+        "style": { "stroke": "#0062FF" }
       },
       "zIndex": 999,
       "width": 337,
       "height": 20,
-      "positionAbsolute": {
-        "x": -144.10970787732015,
-        "y": 1174.400748222349
-      },
+      "positionAbsolute": { "x": -144.10970787732015, "y": 1174.400748222349 },
       "dragging": false,
-      "style": {
-        "width": 337,
-        "height": 20
-      },
+      "style": { "width": 337, "height": 20 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -188,28 +119,14 @@
     {
       "id": "3_CBtQLv0X6GzUEtq7jyp",
       "type": "horizontal",
-      "position": {
-        "x": 434.89029212267985,
-        "y": 133.4007482223489
-      },
-      "selected": false,
-      "data": {
-        "label": "horizontal node",
-        "style": {
-          "stroke": "#0062FF"
-        }
-      },
+      "position": { "x": 434.89029212267985, "y": 133.4007482223489 },
+      "selected": true,
+      "data": { "label": "horizontal node", "style": { "stroke": "#0062FF" } },
       "zIndex": 999,
       "width": 353,
       "height": 20,
-      "style": {
-        "width": 353,
-        "height": 20
-      },
-      "positionAbsolute": {
-        "x": 434.89029212267985,
-        "y": 133.4007482223489
-      },
+      "style": { "width": 353, "height": 20 },
+      "positionAbsolute": { "x": 434.89029212267985, "y": 133.4007482223489 },
       "dragging": false,
       "resizing": false,
       "selectable": true,
@@ -218,30 +135,19 @@
     {
       "id": "aq0gNWINbAQFG28HLJgCF",
       "type": "horizontal",
-      "position": {
-        "x": -82.10970787732015,
-        "y": 453.9007482223489
-      },
-      "selected": false,
+      "position": { "x": -82.10970787732015, "y": 453.9007482223489 },
+      "selected": true,
       "data": {
         "label": "horizontal node",
         "oldId": "ofcYD3hTVEMeRptkHsVer",
-        "style": {
-          "stroke": "#0062FF"
-        }
+        "style": { "stroke": "#0062FF" }
       },
       "zIndex": 999,
       "width": 330,
       "height": 20,
-      "positionAbsolute": {
-        "x": -82.10970787732015,
-        "y": 453.9007482223489
-      },
+      "positionAbsolute": { "x": -82.10970787732015, "y": 453.9007482223489 },
       "dragging": false,
-      "style": {
-        "width": 330,
-        "height": 20
-      },
+      "style": { "width": 330, "height": 20 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -249,11 +155,8 @@
     {
       "id": "c58fcsthBlVfzfr-MHdpF",
       "type": "vertical",
-      "position": {
-        "x": -164.10970787732015,
-        "y": -107.59925177765109
-      },
-      "selected": false,
+      "position": { "x": -164.10970787732015, "y": -107.59925177765109 },
+      "selected": true,
       "data": {
         "label": "vertical node",
         "style": {
@@ -271,10 +174,7 @@
         "y": -107.59925177765109
       },
       "dragging": false,
-      "style": {
-        "width": 20,
-        "height": 86
-      },
+      "style": { "width": 20, "height": 86 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -282,11 +182,8 @@
     {
       "id": "Ji35JsKgUQXN4DJGEgTAC",
       "type": "title",
-      "position": {
-        "x": -271.10970787732015,
-        "y": -21.59925177765109
-      },
-      "selected": false,
+      "position": { "x": -271.10970787732015, "y": -21.59925177765109 },
+      "selected": true,
       "data": {
         "label": "AI and Data Scientist",
         "style": {
@@ -296,12 +193,9 @@
         }
       },
       "zIndex": 999,
-      "width": 305,
+      "width": 304,
       "height": 68,
-      "positionAbsolute": {
-        "x": -271.10970787732015,
-        "y": -21.59925177765109
-      },
+      "positionAbsolute": { "x": -271.10970787732015, "y": -21.59925177765109 },
       "dragging": false,
       "selectable": true,
       "focusable": true,
@@ -310,11 +204,8 @@
     {
       "id": "aStaDENn5PhEa-cFvNzXa",
       "type": "topic",
-      "position": {
-        "x": -196.10970787732015,
-        "y": 118.90074822234891
-      },
-      "selected": false,
+      "position": { "x": -196.10970787732015, "y": 118.90074822234891 },
+      "selected": true,
       "data": {
         "label": "Mathematics",
         "style": {
@@ -327,10 +218,7 @@
       "zIndex": 999,
       "width": 144,
       "height": 49,
-      "positionAbsolute": {
-        "x": -196.10970787732015,
-        "y": 118.90074822234891
-      },
+      "positionAbsolute": { "x": -196.10970787732015, "y": 118.90074822234891 },
       "dragging": false,
       "selectable": true,
       "focusable": true
@@ -338,11 +226,8 @@
     {
       "id": "4WZL_fzJ3cZdWLLDoWN8D",
       "type": "topic",
-      "position": {
-        "x": 304.89029212267985,
-        "y": 118.90074822234891
-      },
-      "selected": false,
+      "position": { "x": 304.89029212267985, "y": 118.90074822234891 },
+      "selected": true,
       "data": {
         "label": "Statistics",
         "style": {
@@ -354,59 +239,38 @@
       "zIndex": 999,
       "width": 160,
       "height": 49,
-      "positionAbsolute": {
-        "x": 304.89029212267985,
-        "y": 118.90074822234891
-      },
+      "positionAbsolute": { "x": 304.89029212267985, "y": 118.90074822234891 },
       "dragging": false,
       "selectable": true,
       "focusable": true,
-      "style": {
-        "width": 160,
-        "height": 49
-      },
+      "style": { "width": 160, "height": 49 },
       "resizing": false
     },
     {
       "id": "gWMvD83hVXeTmCuHGIiOL",
       "type": "todo",
-      "position": {
-        "x": -226.10970787732015,
-        "y": 200.4007482223489
-      },
-      "selected": false,
+      "position": { "x": -226.10970787732015, "y": 200.4007482223489 },
+      "selected": true,
       "data": {
         "label": "Linear Algebra, Calculus, Mathematical Analysis",
-        "style": {
-          "fontSize": 17,
-          "padding": 0
-        },
+        "style": { "fontSize": 17, "padding": 0 },
         "oldId": "eOFoGKveaHaBm_6ppJUtA"
       },
       "zIndex": 999,
       "width": 416,
       "height": 38,
-      "positionAbsolute": {
-        "x": -226.10970787732015,
-        "y": 200.4007482223489
-      },
+      "positionAbsolute": { "x": -226.10970787732015, "y": 200.4007482223489 },
       "dragging": false,
       "selectable": true,
       "focusable": true,
-      "style": {
-        "width": 416,
-        "height": 38
-      },
+      "style": { "width": 416, "height": 38 },
       "resizing": false
     },
     {
       "id": "HclEU3v8OdC_Oq7ONvApt",
       "type": "resourceButton",
-      "position": {
-        "x": -196.10970787732015,
-        "y": 238.4007482223489
-      },
-      "selected": false,
+      "position": { "x": -196.10970787732015, "y": 238.4007482223489 },
+      "selected": true,
       "data": {
         "label": "Mathematics for Machine Learning",
         "href": "https://imp.i384100.net/baqMYv",
@@ -422,15 +286,9 @@
       "zIndex": 999,
       "width": 432,
       "height": 49,
-      "positionAbsolute": {
-        "x": -196.10970787732015,
-        "y": 238.4007482223489
-      },
+      "positionAbsolute": { "x": -196.10970787732015, "y": 238.4007482223489 },
       "dragging": false,
-      "style": {
-        "width": 432,
-        "height": 49
-      },
+      "style": { "width": 432, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -438,37 +296,27 @@
     {
       "id": "mwPJh33MEUQ4Co_LiVEOb",
       "type": "todo",
-      "position": {
-        "x": -226.10970787732015,
-        "y": 307.4007482223489
-      },
-      "selected": false,
+      "position": { "x": -226.10970787732015, "y": 307.4007482223489 },
+      "selected": true,
       "data": {
-        "label": "Differential Calculus",
-        "style": {
-          "fontSize": 17,
-          "padding": 0
-        }
+        "label": "Differential Calculus ",
+        "style": { "fontSize": 17, "padding": 0 }
       },
       "zIndex": 999,
-      "width": 150,
-      "height": 40,
-      "positionAbsolute": {
-        "x": -226.10970787732015,
-        "y": 307.4007482223489
-      },
+      "width": 246,
+      "height": 38,
+      "positionAbsolute": { "x": -226.10970787732015, "y": 307.4007482223489 },
       "dragging": false,
       "selectable": true,
-      "focusable": true
+      "focusable": true,
+      "style": { "width": 246, "height": 38 },
+      "resizing": false
     },
     {
       "id": "Py2ZgxmPRQ620cuOj_Cig",
       "type": "resourceButton",
-      "position": {
-        "x": -196.10970787732015,
-        "y": 349.4007482223489
-      },
-      "selected": false,
+      "position": { "x": -196.10970787732015, "y": 349.4007482223489 },
+      "selected": true,
       "data": {
         "label": "Coursera: Algebra and Differential Calculus",
         "href": "https://imp.i384100.net/LX5M7M",
@@ -483,15 +331,9 @@
       "zIndex": 999,
       "width": 428,
       "height": 49,
-      "positionAbsolute": {
-        "x": -196.10970787732015,
-        "y": 349.4007482223489
-      },
+      "positionAbsolute": { "x": -196.10970787732015, "y": 349.4007482223489 },
       "dragging": false,
-      "style": {
-        "width": 428,
-        "height": 49
-      },
+      "style": { "width": 428, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -499,43 +341,28 @@
     {
       "id": "Y9YJdARIRqqCBCy3GVYdA",
       "type": "todo",
-      "position": {
-        "x": 279.89029212267985,
-        "y": 200.4007482223489
-      },
-      "selected": false,
+      "position": { "x": 279.89029212267985, "y": 200.4007482223489 },
+      "selected": true,
       "data": {
         "label": "Statistics, CLT",
-        "style": {
-          "fontSize": 17,
-          "padding": 0
-        },
+        "style": { "fontSize": 17, "padding": 0 },
         "oldId": "n2JFGwFxTuOviW6kHO1Uv"
       },
       "zIndex": 999,
       "width": 154,
       "height": 38,
-      "positionAbsolute": {
-        "x": 279.89029212267985,
-        "y": 200.4007482223489
-      },
+      "positionAbsolute": { "x": 279.89029212267985, "y": 200.4007482223489 },
       "dragging": false,
       "selectable": true,
       "focusable": true,
-      "style": {
-        "width": 154,
-        "height": 38
-      },
+      "style": { "width": 154, "height": 38 },
       "resizing": false
     },
     {
       "id": "O-9EsoKrMpfkcGIBKnSty",
       "type": "resourceButton",
-      "position": {
-        "x": 304.89029212267985,
-        "y": 238.4007482223489
-      },
-      "selected": false,
+      "position": { "x": 304.89029212267985, "y": 238.4007482223489 },
+      "selected": true,
       "data": {
         "label": "Coursera: Introduction to Statistics",
         "href": "https://imp.i384100.net/3eRv4v",
@@ -551,15 +378,9 @@
       "zIndex": 999,
       "width": 440,
       "height": 49,
-      "positionAbsolute": {
-        "x": 304.89029212267985,
-        "y": 238.4007482223489
-      },
+      "positionAbsolute": { "x": 304.89029212267985, "y": 238.4007482223489 },
       "dragging": false,
-      "style": {
-        "width": 440,
-        "height": 49
-      },
+      "style": { "width": 440, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -567,43 +388,28 @@
     {
       "id": "XJXIkWVDIrPJ-bVIvX0ZO",
       "type": "todo",
-      "position": {
-        "x": 279.89029212267985,
-        "y": 307.4007482223489
-      },
-      "selected": false,
+      "position": { "x": 279.89029212267985, "y": 307.4007482223489 },
+      "selected": true,
       "data": {
         "label": "Hypothesis Testing",
-        "style": {
-          "fontSize": 17,
-          "padding": 0
-        },
+        "style": { "fontSize": 17, "padding": 0 },
         "oldId": "n2JFGwFxTuOviW6kHO1Uv"
       },
       "zIndex": 999,
       "width": 198,
       "height": 38,
-      "positionAbsolute": {
-        "x": 279.89029212267985,
-        "y": 307.4007482223489
-      },
+      "positionAbsolute": { "x": 279.89029212267985, "y": 307.4007482223489 },
       "dragging": false,
       "selectable": true,
       "focusable": true,
-      "style": {
-        "width": 198,
-        "height": 38
-      },
+      "style": { "width": 198, "height": 38 },
       "resizing": false
     },
     {
       "id": "5_wxpYdzweUkSMugiKV94",
       "type": "resourceButton",
-      "position": {
-        "x": 304.89029212267985,
-        "y": 344.4007482223489
-      },
-      "selected": false,
+      "position": { "x": 304.89029212267985, "y": 344.4007482223489 },
+      "selected": true,
       "data": {
         "label": "Coursera: Hypothesis Testing",
         "href": "https://imp.i384100.net/vN0JAA",
@@ -619,15 +425,9 @@
       "zIndex": 999,
       "width": 440,
       "height": 49,
-      "positionAbsolute": {
-        "x": 304.89029212267985,
-        "y": 344.4007482223489
-      },
+      "positionAbsolute": { "x": 304.89029212267985, "y": 344.4007482223489 },
       "dragging": false,
-      "style": {
-        "width": 440,
-        "height": 49
-      },
+      "style": { "width": 440, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -635,43 +435,28 @@
     {
       "id": "jxJtwbiCvxHqmkWkE7zdx",
       "type": "todo",
-      "position": {
-        "x": 279.89029212267985,
-        "y": 408.4007482223489
-      },
-      "selected": false,
+      "position": { "x": 279.89029212267985, "y": 408.4007482223489 },
+      "selected": true,
       "data": {
         "label": "Probability and Sampling",
-        "style": {
-          "fontSize": 17,
-          "padding": 0
-        },
+        "style": { "fontSize": 17, "padding": 0 },
         "oldId": "n2JFGwFxTuOviW6kHO1Uv"
       },
       "zIndex": 999,
       "width": 245,
       "height": 38,
-      "positionAbsolute": {
-        "x": 279.89029212267985,
-        "y": 408.4007482223489
-      },
+      "positionAbsolute": { "x": 279.89029212267985, "y": 408.4007482223489 },
       "dragging": false,
       "selectable": true,
       "focusable": true,
-      "style": {
-        "width": 245,
-        "height": 38
-      },
+      "style": { "width": 245, "height": 38 },
       "resizing": false
     },
     {
       "id": "jIeLbbE0KYjoQo0t0CVXm",
       "type": "resourceButton",
-      "position": {
-        "x": 304.89029212267985,
-        "y": 439.4007482223489
-      },
-      "selected": false,
+      "position": { "x": 304.89029212267985, "y": 439.4007482223489 },
+      "selected": true,
       "data": {
         "label": "Coursera: Probability and Statistics",
         "href": "https://imp.i384100.net/daDM6Q",
@@ -687,15 +472,9 @@
       "zIndex": 999,
       "width": 440,
       "height": 49,
-      "positionAbsolute": {
-        "x": 304.89029212267985,
-        "y": 439.4007482223489
-      },
+      "positionAbsolute": { "x": 304.89029212267985, "y": 439.4007482223489 },
       "dragging": false,
-      "style": {
-        "width": 440,
-        "height": 49
-      },
+      "style": { "width": 440, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -703,43 +482,28 @@
     {
       "id": "mJq9b50MJM9o9dLhx40iN",
       "type": "todo",
-      "position": {
-        "x": 279.89029212267985,
-        "y": 511.40074822234897
-      },
-      "selected": false,
+      "position": { "x": 279.89029212267985, "y": 511.40074822234897 },
+      "selected": true,
       "data": {
         "label": "AB Testing",
-        "style": {
-          "fontSize": 17,
-          "padding": 0
-        },
+        "style": { "fontSize": 17, "padding": 0 },
         "oldId": "n2JFGwFxTuOviW6kHO1Uv"
       },
       "zIndex": 999,
       "width": 149,
       "height": 38,
-      "positionAbsolute": {
-        "x": 279.89029212267985,
-        "y": 511.40074822234897
-      },
+      "positionAbsolute": { "x": 279.89029212267985, "y": 511.40074822234897 },
       "dragging": false,
       "selectable": true,
       "focusable": true,
-      "style": {
-        "width": 149,
-        "height": 38
-      },
+      "style": { "width": 149, "height": 38 },
       "resizing": false
     },
     {
       "id": "lrDei3AUInJZ1ISDxOxdT",
       "type": "resourceButton",
-      "position": {
-        "x": 304.89029212267985,
-        "y": 549.400748222349
-      },
-      "selected": false,
+      "position": { "x": 304.89029212267985, "y": 549.400748222349 },
+      "selected": true,
       "data": {
         "label": "Practitioner's Guide to Statistical Tests",
         "href": "https://vkteam.medium.com/practitioners-guide-to-statistical-tests-ed2d580ef04f#1e3b",
@@ -755,15 +519,9 @@
       "zIndex": 999,
       "width": 440,
       "height": 49,
-      "positionAbsolute": {
-        "x": 304.89029212267985,
-        "y": 549.400748222349
-      },
+      "positionAbsolute": { "x": 304.89029212267985, "y": 549.400748222349 },
       "dragging": false,
-      "style": {
-        "width": 440,
-        "height": 49
-      },
+      "style": { "width": 440, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -771,11 +529,8 @@
     {
       "id": "R0lIHKW2JmXQp79hoGU6x",
       "type": "resourceButton",
-      "position": {
-        "x": 304.89029212267985,
-        "y": 603.400748222349
-      },
-      "selected": false,
+      "position": { "x": 304.89029212267985, "y": 603.400748222349 },
+      "selected": true,
       "data": {
         "label": "Experiment Design Article",
         "href": "https://towardsdatascience.com/step-by-step-for-planning-an-a-b-test-ef3c93143c0b",
@@ -791,15 +546,9 @@
       "zIndex": 999,
       "width": 440,
       "height": 49,
-      "positionAbsolute": {
-        "x": 304.89029212267985,
-        "y": 603.400748222349
-      },
+      "positionAbsolute": { "x": 304.89029212267985, "y": 603.400748222349 },
       "dragging": false,
-      "style": {
-        "width": 440,
-        "height": 49
-      },
+      "style": { "width": 440, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -807,43 +556,28 @@
     {
       "id": "v68nwX914qCwHDSwY_ZhG",
       "type": "todo",
-      "position": {
-        "x": 282.89029212267985,
-        "y": 669.400748222349
-      },
-      "selected": false,
+      "position": { "x": 282.89029212267985, "y": 669.400748222349 },
+      "selected": true,
       "data": {
         "label": "Increasing Test Sensitivity",
-        "style": {
-          "fontSize": 17,
-          "padding": 0
-        },
+        "style": { "fontSize": 17, "padding": 0 },
         "oldId": "n2JFGwFxTuOviW6kHO1Uv"
       },
       "zIndex": 999,
       "width": 255,
       "height": 38,
-      "positionAbsolute": {
-        "x": 282.89029212267985,
-        "y": 669.400748222349
-      },
+      "positionAbsolute": { "x": 282.89029212267985, "y": 669.400748222349 },
       "dragging": false,
       "selectable": true,
       "focusable": true,
-      "style": {
-        "width": 255,
-        "height": 38
-      },
+      "style": { "width": 255, "height": 38 },
       "resizing": false
     },
     {
       "id": "G6wxStgN1ShtD6RR2xVc-",
       "type": "resourceButton",
-      "position": {
-        "x": 304.89029212267985,
-        "y": 700.400748222349
-      },
-      "selected": false,
+      "position": { "x": 304.89029212267985, "y": 700.400748222349 },
+      "selected": true,
       "data": {
         "label": "Minimum Detectable Effect",
         "href": "https://splitmetrics.com/resources/minimum-detectable-effect-mde/",
@@ -859,15 +593,9 @@
       "zIndex": 999,
       "width": 440,
       "height": 49,
-      "positionAbsolute": {
-        "x": 304.89029212267985,
-        "y": 700.400748222349
-      },
+      "positionAbsolute": { "x": 304.89029212267985, "y": 700.400748222349 },
       "dragging": false,
-      "style": {
-        "width": 440,
-        "height": 49
-      },
+      "style": { "width": 440, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -875,11 +603,8 @@
     {
       "id": "Pu6kiJ0YOvtD6AypKWkfJ",
       "type": "resourceButton",
-      "position": {
-        "x": 304.89029212267985,
-        "y": 753.400748222349
-      },
-      "selected": false,
+      "position": { "x": 304.89029212267985, "y": 753.400748222349 },
+      "selected": true,
       "data": {
         "label": "Paper: Improving Test Sensitivity",
         "href": "https://kdd.org/kdd2016/papers/files/adp0945-xieA.pdf",
@@ -895,15 +620,9 @@
       "zIndex": 999,
       "width": 440,
       "height": 49,
-      "positionAbsolute": {
-        "x": 304.89029212267985,
-        "y": 753.400748222349
-      },
+      "positionAbsolute": { "x": 304.89029212267985, "y": 753.400748222349 },
       "dragging": false,
-      "style": {
-        "width": 440,
-        "height": 49
-      },
+      "style": { "width": 440, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -911,11 +630,8 @@
     {
       "id": "usXkw57ukCuc9gAw6E5Td",
       "type": "resourceButton",
-      "position": {
-        "x": 304.89029212267985,
-        "y": 806.400748222349
-      },
-      "selected": false,
+      "position": { "x": 304.89029212267985, "y": 806.400748222349 },
+      "selected": true,
       "data": {
         "label": "Paper: Improving Sensitivity (CUPED)",
         "href": "https://exp-platform.com/Documents/2013-02-CUPED-ImprovingSensitivityOfControlledExperiments.pdf",
@@ -931,15 +647,9 @@
       "zIndex": 999,
       "width": 440,
       "height": 49,
-      "positionAbsolute": {
-        "x": 304.89029212267985,
-        "y": 806.400748222349
-      },
+      "positionAbsolute": { "x": 304.89029212267985, "y": 806.400748222349 },
       "dragging": false,
-      "style": {
-        "width": 440,
-        "height": 49
-      },
+      "style": { "width": 440, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -947,11 +657,8 @@
     {
       "id": "T0suD_0uw6nSq7NOFBoNQ",
       "type": "resourceButton",
-      "position": {
-        "x": 304.89029212267985,
-        "y": 859.400748222349
-      },
-      "selected": false,
+      "position": { "x": 304.89029212267985, "y": 859.400748222349 },
+      "selected": true,
       "data": {
         "label": "CUPED at Booking.com",
         "href": "https://booking.ai/how-booking-com-increases-the-power-of-online-experiments-with-cuped-995d186fff1d",
@@ -967,15 +674,9 @@
       "zIndex": 999,
       "width": 440,
       "height": 49,
-      "positionAbsolute": {
-        "x": 304.89029212267985,
-        "y": 859.400748222349
-      },
+      "positionAbsolute": { "x": 304.89029212267985, "y": 859.400748222349 },
       "dragging": false,
-      "style": {
-        "width": 440,
-        "height": 49
-      },
+      "style": { "width": 440, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -983,11 +684,8 @@
     {
       "id": "Vx5zD4Y-6yLxorD8kNvop",
       "type": "resourceButton",
-      "position": {
-        "x": 304.89029212267985,
-        "y": 912.400748222349
-      },
-      "selected": false,
+      "position": { "x": 304.89029212267985, "y": 912.400748222349 },
+      "selected": true,
       "data": {
         "label": "Doordash: CUPAC",
         "href": "https://doordash.engineering/2020/06/08/improving-experimental-power-through-control-using-predictions-as-covariate-cupac/",
@@ -1003,15 +701,9 @@
       "zIndex": 999,
       "width": 440,
       "height": 49,
-      "positionAbsolute": {
-        "x": 304.89029212267985,
-        "y": 912.400748222349
-      },
+      "positionAbsolute": { "x": 304.89029212267985, "y": 912.400748222349 },
       "dragging": false,
-      "style": {
-        "width": 440,
-        "height": 49
-      },
+      "style": { "width": 440, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -1019,11 +711,8 @@
     {
       "id": "bdAl2ne0fsE1R02wWdIK9",
       "type": "resourceButton",
-      "position": {
-        "x": 304.89029212267985,
-        "y": 965.400748222349
-      },
-      "selected": false,
+      "position": { "x": 304.89029212267985, "y": 965.400748222349 },
+      "selected": true,
       "data": {
         "label": "Netflix: Stratification",
         "href": "https://www.researchgate.net/publication/305997925_Improving_the_Sensitivity_of_Online_Controlled_Experiments_Case_Studies_at_Netflix",
@@ -1039,15 +728,9 @@
       "zIndex": 999,
       "width": 440,
       "height": 49,
-      "positionAbsolute": {
-        "x": 304.89029212267985,
-        "y": 965.400748222349
-      },
+      "positionAbsolute": { "x": 304.89029212267985, "y": 965.400748222349 },
       "dragging": false,
-      "style": {
-        "width": 440,
-        "height": 49
-      },
+      "style": { "width": 440, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -1055,43 +738,28 @@
     {
       "id": "n2JFGwFxTuOviW6kHO1Uv",
       "type": "todo",
-      "position": {
-        "x": 282.89029212267985,
-        "y": 1036.400748222349
-      },
-      "selected": false,
+      "position": { "x": 282.89029212267985, "y": 1036.400748222349 },
+      "selected": true,
       "data": {
         "label": "Ratio Metrics",
-        "style": {
-          "fontSize": 17,
-          "padding": 0
-        },
+        "style": { "fontSize": 17, "padding": 0 },
         "oldId": "mwPJh33MEUQ4Co_LiVEOb"
       },
       "zIndex": 999,
       "width": 179,
       "height": 38,
-      "positionAbsolute": {
-        "x": 282.89029212267985,
-        "y": 1036.400748222349
-      },
+      "positionAbsolute": { "x": 282.89029212267985, "y": 1036.400748222349 },
       "dragging": false,
       "selectable": true,
       "focusable": true,
-      "style": {
-        "width": 179,
-        "height": 38
-      },
+      "style": { "width": 179, "height": 38 },
       "resizing": false
     },
     {
       "id": "nW_wSh-PoSlmOONP48UDD",
       "type": "resourceButton",
-      "position": {
-        "x": 304.89029212267985,
-        "y": 1072.400748222349
-      },
-      "selected": false,
+      "position": { "x": 304.89029212267985, "y": 1072.400748222349 },
+      "selected": true,
       "data": {
         "label": "Microsoft: Delta Method in Metric Analytics",
         "href": "https://arxiv.org/pdf/1803.06336",
@@ -1107,15 +775,9 @@
       "zIndex": 999,
       "width": 440,
       "height": 49,
-      "positionAbsolute": {
-        "x": 304.89029212267985,
-        "y": 1072.400748222349
-      },
+      "positionAbsolute": { "x": 304.89029212267985, "y": 1072.400748222349 },
       "dragging": false,
-      "style": {
-        "width": 440,
-        "height": 49
-      },
+      "style": { "width": 440, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -1123,11 +785,8 @@
     {
       "id": "KiaiatCPngkVem7Bw3s0T",
       "type": "resourceButton",
-      "position": {
-        "x": 304.89029212267985,
-        "y": 1125.400748222349
-      },
-      "selected": false,
+      "position": { "x": 304.89029212267985, "y": 1125.400748222349 },
+      "selected": true,
       "data": {
         "label": "Paper: Ratio Metrics",
         "href": "https://stat.cmu.edu/~hseltman/files/ratio.pdf",
@@ -1143,15 +802,9 @@
       "zIndex": 999,
       "width": 440,
       "height": 49,
-      "positionAbsolute": {
-        "x": 304.89029212267985,
-        "y": 1125.400748222349
-      },
+      "positionAbsolute": { "x": 304.89029212267985, "y": 1125.400748222349 },
       "dragging": false,
-      "style": {
-        "width": 440,
-        "height": 49
-      },
+      "style": { "width": 440, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -1159,98 +812,68 @@
     {
       "id": "o_Ddc5iv9y4ZLUjmUTvP-",
       "type": "label",
-      "position": {
-        "x": -232.71752171424652,
-        "y": 125.40074822234891
-      },
-      "selected": false,
+      "position": { "x": -232.71752171424652, "y": 125.40074822234891 },
+      "selected": true,
       "data": {
         "label": "1",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 17,
-          "color": "#0062ff"
-        },
+        "style": { "fontSize": 17, "color": "#0062ff" },
         "oldId": "wOqfPAZ24GxUrkxVRRyT5"
       },
       "zIndex": 999,
       "width": 23,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": -232.71752171424652,
-        "y": 125.40074822234891
-      },
+      "positionAbsolute": { "x": -232.71752171424652, "y": 125.40074822234891 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "B3ZzcZspEctJ2kX6At0tb",
       "type": "label",
-      "position": {
-        "x": 273.89029212267985,
-        "y": 125.40074822234891
-      },
-      "selected": false,
+      "position": { "x": 273.89029212267985, "y": 125.40074822234891 },
+      "selected": true,
       "data": {
         "label": "2",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 17,
-          "color": "#0062FF"
-        },
+        "style": { "fontSize": 17, "color": "#0062FF" },
         "oldId": "qRxvTDjpoW1GuQ771syXb"
       },
       "zIndex": 999,
       "width": 26,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": 273.89029212267985,
-        "y": 125.40074822234891
-      },
+      "positionAbsolute": { "x": 273.89029212267985, "y": 125.40074822234891 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "Io-XP7K1_siYDrlwFmbEx",
       "type": "label",
-      "position": {
-        "x": -200.10970787732015,
-        "y": 445.78255589147204
-      },
-      "selected": false,
+      "position": { "x": -200.10970787732015, "y": 445.78255589147204 },
+      "selected": true,
       "data": {
         "label": "3",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 17,
-          "color": "#0062ff"
-        },
+        "style": { "fontSize": 17, "color": "#0062ff" },
         "oldId": "wOqfPAZ24GxUrkxVRRyT5"
       },
       "zIndex": 999,
       "width": 26,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": -200.10970787732015,
-        "y": 445.78255589147204
-      },
+      "positionAbsolute": { "x": -200.10970787732015, "y": 445.78255589147204 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "Gd2egqKZPnbPW1W2jw4j8",
       "type": "topic",
-      "position": {
-        "x": -163.75449749114952,
-        "y": 439.28255589147204
-      },
-      "selected": false,
+      "position": { "x": -163.75449749114952, "y": 439.28255589147204 },
+      "selected": true,
       "data": {
         "label": "Econometrics",
         "style": {
@@ -1263,46 +886,29 @@
       "zIndex": 999,
       "width": 143,
       "height": 49,
-      "positionAbsolute": {
-        "x": -163.75449749114952,
-        "y": 439.28255589147204
-      },
+      "positionAbsolute": { "x": -163.75449749114952, "y": 439.28255589147204 },
       "dragging": false,
       "selectable": true,
       "focusable": true,
-      "style": {
-        "width": 143,
-        "height": 49
-      },
+      "style": { "width": 143, "height": 49 },
       "resizing": false
     },
     {
       "id": "EqgwFsJqejdABpTBoxOix",
       "type": "vertical",
-      "position": {
-        "x": 236.89029212267985,
-        "y": 463.9007482223489
-      },
-      "selected": false,
+      "position": { "x": 236.89029212267985, "y": 463.9007482223489 },
+      "selected": true,
       "data": {
         "label": "vertical node",
         "oldId": "rKb8lqYH0GC_6R5qybzzM",
-        "style": {
-          "stroke": "#0062FF"
-        }
+        "style": { "stroke": "#0062FF" }
       },
       "zIndex": 999,
       "width": 20,
       "height": 747,
-      "positionAbsolute": {
-        "x": 236.89029212267985,
-        "y": 463.9007482223489
-      },
+      "positionAbsolute": { "x": 236.89029212267985, "y": 463.9007482223489 },
       "dragging": false,
-      "style": {
-        "width": 20,
-        "height": 747
-      },
+      "style": { "width": 20, "height": 747 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -1310,29 +916,15 @@
     {
       "id": "GFlPWkEVwPlxPhOitG1xH",
       "type": "horizontal",
-      "position": {
-        "x": 245,
-        "y": 1200.900748222349
-      },
-      "selected": false,
-      "data": {
-        "label": "horizontal node",
-        "style": {
-          "stroke": "#0062FF"
-        }
-      },
+      "position": { "x": 245, "y": 1200.900748222349 },
+      "selected": true,
+      "data": { "label": "horizontal node", "style": { "stroke": "#0062FF" } },
       "zIndex": 999,
       "width": 543,
       "height": 20,
-      "positionAbsolute": {
-        "x": 245,
-        "y": 1200.900748222349
-      },
+      "positionAbsolute": { "x": 245, "y": 1200.900748222349 },
       "dragging": false,
-      "style": {
-        "width": 543,
-        "height": 20
-      },
+      "style": { "width": 543, "height": 20 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -1340,30 +932,19 @@
     {
       "id": "h9_7FHMPipHVN7C4ErKHU",
       "type": "vertical",
-      "position": {
-        "x": 778,
-        "y": 141.9007482223489
-      },
-      "selected": false,
+      "position": { "x": 778, "y": 141.9007482223489 },
+      "selected": true,
       "data": {
         "label": "vertical node",
-        "style": {
-          "stroke": "#0062FF"
-        },
+        "style": { "stroke": "#0062FF" },
         "oldId": "FsU7_B1LCULtlVQg7gEPR"
       },
       "zIndex": 999,
       "width": 20,
       "height": 1069,
-      "positionAbsolute": {
-        "x": 778,
-        "y": 141.9007482223489
-      },
+      "positionAbsolute": { "x": 778, "y": 141.9007482223489 },
       "dragging": false,
-      "style": {
-        "width": 20,
-        "height": 1069
-      },
+      "style": { "width": 20, "height": 1069 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -1371,330 +952,225 @@
     {
       "id": "_uOgVh3d8lAlbTgYNJFpt",
       "type": "label",
-      "position": {
-        "x": 45.89029212267985,
-        "y": 125
-      },
-      "selected": false,
+      "position": { "x": 45.89029212267985, "y": 125 },
+      "selected": true,
       "data": {
         "label": ">",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 24,
-          "color": "#0062FF"
-        },
+        "style": { "fontSize": 24, "color": "#0062FF" },
         "oldId": "Xd_mdvQdbCWcucpSTcDz1"
       },
       "zIndex": 999,
       "width": 34,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": 45.89029212267985,
-        "y": 125
-      },
+      "positionAbsolute": { "x": 45.89029212267985, "y": 125 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "qRxvTDjpoW1GuQ771syXb",
       "type": "label",
-      "position": {
-        "x": 578.5569587893465,
-        "y": 125
-      },
-      "selected": false,
+      "position": { "x": 578.5569587893465, "y": 125 },
+      "selected": true,
       "data": {
         "label": ">",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 20,
-          "color": "#0062FF"
-        }
+        "style": { "fontSize": 20, "color": "#0062FF" }
       },
       "zIndex": 999,
       "width": 31,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": 578.5569587893465,
-        "y": 125
-      },
+      "positionAbsolute": { "x": 578.5569587893465, "y": 125 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "TAN0BhW1tm0t3eNHOmOZ8",
       "type": "label",
-      "position": {
-        "x": 771,
-        "y": 398.4007482223489
-      },
-      "selected": false,
+      "position": { "x": 771, "y": 398.4007482223489 },
+      "selected": true,
       "data": {
         "label": "V",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 24,
-          "color": "#0062FF"
-        },
+        "style": { "fontSize": 24, "color": "#0062FF" },
         "oldId": "93tag4KlRPagkbdpY4lVT"
       },
       "zIndex": 999,
       "width": 31,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": 771,
-        "y": 398.4007482223489
-      },
+      "positionAbsolute": { "x": 771, "y": 398.4007482223489 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "5wqI-L_vEpqtvXZEAbfqE",
       "type": "label",
-      "position": {
-        "x": 771,
-        "y": 835.900748222349
-      },
-      "selected": false,
+      "position": { "x": 771, "y": 835.900748222349 },
+      "selected": true,
       "data": {
         "label": "V",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 24,
-          "color": "#0062FF"
-        },
+        "style": { "fontSize": 24, "color": "#0062FF" },
         "oldId": "93tag4KlRPagkbdpY4lVT"
       },
       "zIndex": 999,
       "width": 31,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": 771,
-        "y": 835.900748222349
-      },
+      "positionAbsolute": { "x": 771, "y": 835.900748222349 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "hvFSTxMfMXPysDinI0oH8",
       "type": "label",
-      "position": {
-        "x": 695.2536071965056,
-        "y": 1192.900748222349
-      },
-      "selected": false,
+      "position": { "x": 695.2536071965056, "y": 1192.900748222349 },
+      "selected": true,
       "data": {
         "label": "<",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 24,
-          "color": "#0062FF"
-        },
+        "style": { "fontSize": 24, "color": "#0062FF" },
         "oldId": "SG6DkcQM4NdgTSu2MR8Q5"
       },
       "zIndex": 999,
       "width": 33,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": 695.2536071965056,
-        "y": 1192.900748222349
-      },
+      "positionAbsolute": { "x": 695.2536071965056, "y": 1192.900748222349 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "YT5_iofe0kQ-wVjd54RT8",
       "type": "label",
-      "position": {
-        "x": 331.89029212267985,
-        "y": 1192.900748222349
-      },
-      "selected": false,
+      "position": { "x": 331.89029212267985, "y": 1192.900748222349 },
+      "selected": true,
       "data": {
         "label": "<",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 24,
-          "color": "#0062FF"
-        }
+        "style": { "fontSize": 24, "color": "#0062FF" }
       },
       "zIndex": 999,
       "width": 33,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": 331.89029212267985,
-        "y": 1192.900748222349
-      },
+      "positionAbsolute": { "x": 331.89029212267985, "y": 1192.900748222349 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "ct0yUXFnbSXCw4HGIh3hh",
       "type": "label",
-      "position": {
-        "x": 229,
-        "y": 799.900748222349
-      },
-      "selected": false,
+      "position": { "x": 229, "y": 799.900748222349 },
+      "selected": true,
       "data": {
         "label": "^",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 28,
-          "color": "#0062FF"
-        },
+        "style": { "fontSize": 28, "color": "#0062FF" },
         "oldId": "Jsyv0X1BPlP0Vi_oklxHA"
       },
       "zIndex": 999,
       "width": 31,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": 229,
-        "y": 799.900748222349
-      },
+      "positionAbsolute": { "x": 229, "y": 799.900748222349 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "_-qXa7MhA16X2BBdaWw4f",
       "type": "label",
-      "position": {
-        "x": 229,
-        "y": 1131.900748222349
-      },
-      "selected": false,
+      "position": { "x": 229, "y": 1131.900748222349 },
+      "selected": true,
       "data": {
         "label": "^",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 28,
-          "color": "#0062FF"
-        }
+        "style": { "fontSize": 28, "color": "#0062FF" }
       },
       "zIndex": 999,
       "width": 31,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": 229,
-        "y": 1131.900748222349
-      },
+      "positionAbsolute": { "x": 229, "y": 1131.900748222349 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "EyjiTmb9kck4OoNtbde1x",
       "type": "label",
-      "position": {
-        "x": 229,
-        "y": 501.40074822234897
-      },
-      "selected": false,
+      "position": { "x": 229, "y": 501.40074822234897 },
+      "selected": true,
       "data": {
         "label": "^",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 28,
-          "color": "#0062FF"
-        },
+        "style": { "fontSize": 28, "color": "#0062FF" },
         "oldId": "Jsyv0X1BPlP0Vi_oklxHA"
       },
       "zIndex": 999,
       "width": 31,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": 229,
-        "y": 501.40074822234897
-      },
+      "positionAbsolute": { "x": 229, "y": 501.40074822234897 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "WmbvaP_zRGs_WhYK30YqM",
       "type": "label",
-      "position": {
-        "x": 45.89029212267985,
-        "y": 445.9007482223489
-      },
-      "selected": false,
+      "position": { "x": 45.89029212267985, "y": 445.9007482223489 },
+      "selected": true,
       "data": {
         "label": "<",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 24,
-          "color": "#0062FF"
-        },
+        "style": { "fontSize": 24, "color": "#0062FF" },
         "oldId": "qRxvTDjpoW1GuQ771syXb"
       },
       "zIndex": 999,
       "width": 33,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": 45.89029212267985,
-        "y": 445.9007482223489
-      },
+      "positionAbsolute": { "x": 45.89029212267985, "y": 445.9007482223489 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "y6xXsc-uSAmRDnNuyhqH2",
       "type": "todo",
-      "position": {
-        "x": -226.10970787732018,
-        "y": 517.6026955968633
-      },
-      "selected": false,
+      "position": { "x": -226.10970787732018, "y": 517.6026955968633 },
+      "selected": true,
       "data": {
         "label": "Pre-requisites of Econometrics",
-        "style": {
-          "fontSize": 17,
-          "padding": 0
-        },
+        "style": { "fontSize": 17, "padding": 0 },
         "oldId": "eOFoGKveaHaBm_6ppJUtA"
       },
       "zIndex": 999,
       "width": 303,
       "height": 38,
-      "positionAbsolute": {
-        "x": -226.10970787732018,
-        "y": 517.6026955968633
-      },
+      "positionAbsolute": { "x": -226.10970787732018, "y": 517.6026955968633 },
       "dragging": false,
       "selectable": true,
       "focusable": true,
-      "style": {
-        "width": 303,
-        "height": 38
-      },
+      "style": { "width": 303, "height": 38 },
       "resizing": false
     },
     {
       "id": "2rt4WE9cE93K6vDM-c-IL",
       "type": "resourceButton",
-      "position": {
-        "x": -196.10970787732018,
-        "y": 548.6026955968633
-      },
-      "selected": false,
+      "position": { "x": -196.10970787732018, "y": 548.6026955968633 },
+      "selected": true,
       "data": {
         "label": "Fundamentals of Econometrics",
         "href": "https://bookdown.org/ts_robinson1994/10EconometricTheorems/",
@@ -1710,15 +1186,9 @@
       "zIndex": 999,
       "width": 418,
       "height": 49,
-      "positionAbsolute": {
-        "x": -196.10970787732018,
-        "y": 548.6026955968633
-      },
+      "positionAbsolute": { "x": -196.10970787732018, "y": 548.6026955968633 },
       "dragging": false,
-      "style": {
-        "width": 418,
-        "height": 49
-      },
+      "style": { "width": 418, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -1726,43 +1196,28 @@
     {
       "id": "h19k9Fn5XPh3_pKEC8Ftp",
       "type": "todo",
-      "position": {
-        "x": -226.10970787732018,
-        "y": 621.1026955968633
-      },
-      "selected": false,
+      "position": { "x": -226.10970787732018, "y": 621.1026955968633 },
+      "selected": true,
       "data": {
         "label": "Regression, Timeseries, Fitting Distributions",
-        "style": {
-          "fontSize": 17,
-          "padding": 0
-        },
+        "style": { "fontSize": 17, "padding": 0 },
         "oldId": "eOFoGKveaHaBm_6ppJUtA"
       },
       "zIndex": 999,
       "width": 383,
       "height": 38,
-      "positionAbsolute": {
-        "x": -226.10970787732018,
-        "y": 621.1026955968633
-      },
+      "positionAbsolute": { "x": -226.10970787732018, "y": 621.1026955968633 },
       "dragging": false,
       "selectable": true,
       "focusable": true,
-      "style": {
-        "width": 383,
-        "height": 38
-      },
+      "style": { "width": 383, "height": 38 },
       "resizing": false
     },
     {
       "id": "Eu7OT0Q7mtrMseUVumGXA",
       "type": "resourceButton",
-      "position": {
-        "x": -191.10970787732018,
-        "y": 658.6026955968633
-      },
-      "selected": false,
+      "position": { "x": -191.10970787732018, "y": 658.6026955968633 },
+      "selected": true,
       "data": {
         "label": "Intro to Econometrics",
         "href": "https://academia.edu/33062577/Dougherty_Intro_to_Econometrics_4th_ed_small",
@@ -1778,15 +1233,9 @@
       "zIndex": 999,
       "width": 418,
       "height": 49,
-      "positionAbsolute": {
-        "x": -191.10970787732018,
-        "y": 658.6026955968633
-      },
+      "positionAbsolute": { "x": -191.10970787732018, "y": 658.6026955968633 },
       "dragging": false,
-      "style": {
-        "width": 418,
-        "height": 49
-      },
+      "style": { "width": 418, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -1794,11 +1243,8 @@
     {
       "id": "hVOt_Ya86r_SIXJBkLXBj",
       "type": "resourceButton",
-      "position": {
-        "x": -191.10970787732018,
-        "y": 711.6026955968633
-      },
-      "selected": false,
+      "position": { "x": -191.10970787732018, "y": 711.6026955968633 },
+      "selected": true,
       "data": {
         "label": "Coursera: Econometrics",
         "href": "https://imp.i384100.net/k0krYL",
@@ -1814,15 +1260,9 @@
       "zIndex": 999,
       "width": 418,
       "height": 49,
-      "positionAbsolute": {
-        "x": -191.10970787732018,
-        "y": 711.6026955968633
-      },
+      "positionAbsolute": { "x": -191.10970787732018, "y": 711.6026955968633 },
       "dragging": false,
-      "style": {
-        "width": 418,
-        "height": 49
-      },
+      "style": { "width": 418, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -1830,11 +1270,8 @@
     {
       "id": "YU_5XufdA-zfhM0fXxGYs",
       "type": "resourceButton",
-      "position": {
-        "x": -191.10970787732018,
-        "y": 784.6026955968633
-      },
-      "selected": false,
+      "position": { "x": -191.10970787732018, "y": 784.6026955968633 },
+      "selected": true,
       "data": {
         "label": "Kaggle: Learn Time Series",
         "href": "https://www.kaggle.com/learn/time-series",
@@ -1850,15 +1287,9 @@
       "zIndex": 999,
       "width": 418,
       "height": 49,
-      "positionAbsolute": {
-        "x": -191.10970787732018,
-        "y": 784.6026955968633
-      },
+      "positionAbsolute": { "x": -191.10970787732018, "y": 784.6026955968633 },
       "dragging": false,
-      "style": {
-        "width": 418,
-        "height": 49
-      },
+      "style": { "width": 418, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -1866,11 +1297,8 @@
     {
       "id": "9mB3u8st5yhM7HfVWWqFZ",
       "type": "resourceButton",
-      "position": {
-        "x": -191.10970787732018,
-        "y": 837.6026955968633
-      },
-      "selected": false,
+      "position": { "x": -191.10970787732018, "y": 837.6026955968633 },
+      "selected": true,
       "data": {
         "label": "Kaggle: Time Series Basics",
         "href": "https://kaggle.com/code/jagangupta/time-series-basics-exploring-traditional-ts#Hierarchical-time-series",
@@ -1886,15 +1314,9 @@
       "zIndex": 999,
       "width": 418,
       "height": 49,
-      "positionAbsolute": {
-        "x": -191.10970787732018,
-        "y": 837.6026955968633
-      },
+      "positionAbsolute": { "x": -191.10970787732018, "y": 837.6026955968633 },
       "dragging": false,
-      "style": {
-        "width": 418,
-        "height": 49
-      },
+      "style": { "width": 418, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -1902,11 +1324,8 @@
     {
       "id": "FwuC8d9ocHeDxi8MSIPH6",
       "type": "resourceButton",
-      "position": {
-        "x": -191.10970787732018,
-        "y": 890.6026955968633
-      },
-      "selected": false,
+      "position": { "x": -191.10970787732018, "y": 890.6026955968633 },
+      "selected": true,
       "data": {
         "label": "ARIMA model for Time Series",
         "href": "https://machinelearningmastery.com/arima-for-time-series-forecasting-with-python",
@@ -1922,15 +1341,9 @@
       "zIndex": 999,
       "width": 418,
       "height": 49,
-      "positionAbsolute": {
-        "x": -191.10970787732018,
-        "y": 890.6026955968633
-      },
+      "positionAbsolute": { "x": -191.10970787732018, "y": 890.6026955968633 },
       "dragging": false,
-      "style": {
-        "width": 418,
-        "height": 49
-      },
+      "style": { "width": 418, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -1938,11 +1351,8 @@
     {
       "id": "53Z3qm-zP4u7_KqSD_XlB",
       "type": "resourceButton",
-      "position": {
-        "x": -191.10970787732006,
-        "y": 943.6026955968633
-      },
-      "selected": false,
+      "position": { "x": -191.10970787732006, "y": 943.6026955968633 },
+      "selected": true,
       "data": {
         "label": "Time Series Models",
         "href": "https://machinelearningmastery.com/time-series-forecasting-methods-in-python-cheat-sheet/",
@@ -1958,15 +1368,9 @@
       "zIndex": 999,
       "width": 418,
       "height": 49,
-      "positionAbsolute": {
-        "x": -191.10970787732006,
-        "y": 943.6026955968633
-      },
+      "positionAbsolute": { "x": -191.10970787732006, "y": 943.6026955968633 },
       "dragging": false,
-      "style": {
-        "width": 418,
-        "height": 49
-      },
+      "style": { "width": 418, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -1974,11 +1378,8 @@
     {
       "id": "LVLv69h57rnKPKpa0Cj4h",
       "type": "resourceButton",
-      "position": {
-        "x": -191.10970787732006,
-        "y": 996.6026955968633
-      },
-      "selected": false,
+      "position": { "x": -191.10970787732006, "y": 996.6026955968633 },
+      "selected": true,
       "data": {
         "label": "Forecasting Task with Solution",
         "href": "https://github.com/stalkermustang/bcdc_ds_takehome",
@@ -1994,15 +1395,9 @@
       "zIndex": 999,
       "width": 418,
       "height": 49,
-      "positionAbsolute": {
-        "x": -191.10970787732006,
-        "y": 996.6026955968633
-      },
+      "positionAbsolute": { "x": -191.10970787732006, "y": 996.6026955968633 },
       "dragging": false,
-      "style": {
-        "width": 418,
-        "height": 49
-      },
+      "style": { "width": 418, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -2010,11 +1405,8 @@
     {
       "id": "FrY1Yl6yvLYA5zjBNKRVx",
       "type": "resourceButton",
-      "position": {
-        "x": -191.10970787732018,
-        "y": 1063.6026955968632
-      },
-      "selected": false,
+      "position": { "x": -191.10970787732018, "y": 1063.6026955968632 },
+      "selected": true,
       "data": {
         "label": "Coursera: Linear Regression",
         "href": "https://imp.i384100.net/9g97Ke",
@@ -2030,15 +1422,9 @@
       "zIndex": 999,
       "width": 418,
       "height": 49,
-      "positionAbsolute": {
-        "x": -191.10970787732018,
-        "y": 1063.6026955968632
-      },
+      "positionAbsolute": { "x": -191.10970787732018, "y": 1063.6026955968632 },
       "dragging": false,
-      "style": {
-        "width": 418,
-        "height": 49
-      },
+      "style": { "width": 418, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -2046,11 +1432,8 @@
     {
       "id": "XLDWuSt4tI4gnmqMFdpmy",
       "type": "topic",
-      "position": {
-        "x": -153.75449749114952,
-        "y": 1159.900748222349
-      },
-      "selected": false,
+      "position": { "x": -153.75449749114952, "y": 1159.900748222349 },
+      "selected": true,
       "data": {
         "label": "Coding",
         "style": {
@@ -2063,10 +1446,7 @@
       "zIndex": 999,
       "width": 100,
       "height": 49,
-      "positionAbsolute": {
-        "x": -153.75449749114952,
-        "y": 1159.900748222349
-      },
+      "positionAbsolute": { "x": -153.75449749114952, "y": 1159.900748222349 },
       "dragging": false,
       "selectable": true,
       "focusable": true
@@ -2074,59 +1454,39 @@
     {
       "id": "HVHYJ8gWHCZMACuvKP7gK",
       "type": "label",
-      "position": {
-        "x": -188.75449749114966,
-        "y": 1166.400748222349
-      },
-      "selected": false,
+      "position": { "x": -188.75449749114966, "y": 1166.400748222349 },
+      "selected": true,
       "data": {
         "label": "4",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 17,
-          "color": "#0062ff"
-        },
+        "style": { "fontSize": 17, "color": "#0062ff" },
         "oldId": "Sehg_WX_mnMCRlKrvwWzc"
       },
       "zIndex": 999,
       "width": 26,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": -188.75449749114966,
-        "y": 1166.400748222349
-      },
+      "positionAbsolute": { "x": -188.75449749114966, "y": 1166.400748222349 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "27CsPu77wfCw4uI0Tu45e",
       "type": "vertical",
-      "position": {
-        "x": -266.2175217142465,
-        "y": 463.28255589147204
-      },
-      "selected": false,
+      "position": { "x": -266.2175217142465, "y": 463.28255589147204 },
+      "selected": true,
       "data": {
         "label": "vertical node",
-        "style": {
-          "stroke": "#0062FF"
-        },
+        "style": { "stroke": "#0062FF" },
         "oldId": "kBQV71KwuVxpUi0nFj17X"
       },
       "zIndex": 999,
       "width": 20,
       "height": 722,
-      "positionAbsolute": {
-        "x": -266.2175217142465,
-        "y": 463.28255589147204
-      },
+      "positionAbsolute": { "x": -266.2175217142465, "y": 463.28255589147204 },
       "dragging": false,
-      "style": {
-        "width": 20,
-        "height": 722
-      },
+      "style": { "width": 20, "height": 722 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -2134,130 +1494,88 @@
     {
       "id": "z9R4_7UWeLz66RptYvcEI",
       "type": "label",
-      "position": {
-        "x": -273,
-        "y": 555.400748222349
-      },
-      "selected": false,
+      "position": { "x": -273, "y": 555.400748222349 },
+      "selected": true,
       "data": {
         "label": "V",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 20,
-          "color": "#0062FF"
-        },
+        "style": { "fontSize": 20, "color": "#0062FF" },
         "oldId": "Jsyv0X1BPlP0Vi_oklxHA"
       },
       "zIndex": 999,
       "width": 28,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": -273,
-        "y": 555.400748222349
-      },
+      "positionAbsolute": { "x": -273, "y": 555.400748222349 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "AIFkyjgGB7AXmCG6D1bzs",
       "type": "label",
-      "position": {
-        "x": -273,
-        "y": 812.400748222349
-      },
-      "selected": false,
+      "position": { "x": -273, "y": 812.400748222349 },
+      "selected": true,
       "data": {
         "label": "V",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 20,
-          "color": "#0062FF"
-        },
+        "style": { "fontSize": 20, "color": "#0062FF" },
         "oldId": "Jsyv0X1BPlP0Vi_oklxHA"
       },
       "zIndex": 999,
       "width": 28,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": -273,
-        "y": 812.400748222349
-      },
+      "positionAbsolute": { "x": -273, "y": 812.400748222349 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "Jsyv0X1BPlP0Vi_oklxHA",
       "type": "label",
-      "position": {
-        "x": -273,
-        "y": 1039.400748222349
-      },
-      "selected": false,
+      "position": { "x": -273, "y": 1039.400748222349 },
+      "selected": true,
       "data": {
         "label": "V",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 20,
-          "color": "#0062FF"
-        },
+        "style": { "fontSize": 20, "color": "#0062FF" },
         "oldId": "_-qXa7MhA16X2BBdaWw4f"
       },
       "zIndex": 999,
       "width": 28,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": -273,
-        "y": 1039.400748222349
-      },
+      "positionAbsolute": { "x": -273, "y": 1039.400748222349 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "MVrAqizgkoAs2aghN8TgV",
       "type": "todo",
-      "position": {
-        "x": -253.75449749114952,
-        "y": 1233.900748222349
-      },
-      "selected": false,
+      "position": { "x": -253.75449749114952, "y": 1233.900748222349 },
+      "selected": true,
       "data": {
         "label": "Learn Python Programming Language",
-        "style": {
-          "fontSize": 17,
-          "padding": 0
-        },
+        "style": { "fontSize": 17, "padding": 0 },
         "oldId": "uPzzUpI0--7OWDfNeBIjt"
       },
       "zIndex": 999,
       "width": 343,
       "height": 38,
-      "positionAbsolute": {
-        "x": -253.75449749114952,
-        "y": 1233.900748222349
-      },
+      "positionAbsolute": { "x": -253.75449749114952, "y": 1233.900748222349 },
       "dragging": false,
       "selectable": true,
       "focusable": true,
-      "style": {
-        "width": 343,
-        "height": 38
-      },
+      "style": { "width": 343, "height": 38 },
       "resizing": false
     },
     {
       "id": "aRYOzyqvWmarRmNaPKqxI",
       "type": "resourceButton",
-      "position": {
-        "x": -227.93697112052075,
-        "y": 1273.94348613687
-      },
-      "selected": false,
+      "position": { "x": -227.93697112052075, "y": 1273.94348613687 },
+      "selected": true,
       "data": {
         "label": "Learn Python: Kaggle",
         "href": "https://www.kaggle.com/learn/python",
@@ -2273,15 +1591,9 @@
       "zIndex": 999,
       "width": 386,
       "height": 49,
-      "positionAbsolute": {
-        "x": -227.93697112052075,
-        "y": 1273.94348613687
-      },
+      "positionAbsolute": { "x": -227.93697112052075, "y": 1273.94348613687 },
       "dragging": false,
-      "style": {
-        "width": 386,
-        "height": 49
-      },
+      "style": { "width": 386, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -2289,11 +1601,8 @@
     {
       "id": "eUQRHOSQq0hjwH0LuGDqY",
       "type": "resourceButton",
-      "position": {
-        "x": -227.93697112052075,
-        "y": 1327.94348613687
-      },
-      "selected": false,
+      "position": { "x": -227.93697112052075, "y": 1327.94348613687 },
+      "selected": true,
       "data": {
         "label": "Google's Python Class",
         "href": "https://developers.google.com/edu/python",
@@ -2309,15 +1618,9 @@
       "zIndex": 999,
       "width": 386,
       "height": 49,
-      "positionAbsolute": {
-        "x": -227.93697112052075,
-        "y": 1327.94348613687
-      },
+      "positionAbsolute": { "x": -227.93697112052075, "y": 1327.94348613687 },
       "dragging": false,
-      "style": {
-        "width": 386,
-        "height": 49
-      },
+      "style": { "width": 386, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -2325,30 +1628,19 @@
     {
       "id": "R2WD0NKP7oM27aHr9SpO6",
       "type": "horizontal",
-      "position": {
-        "x": -257.93697112052075,
-        "y": 453.78255589147204
-      },
-      "selected": false,
+      "position": { "x": -257.93697112052075, "y": 453.78255589147204 },
+      "selected": true,
       "data": {
         "label": "horizontal node",
         "oldId": "iJv3Ii5B5TK8i5mN2mLs2",
-        "style": {
-          "stroke": "#0062FF"
-        }
+        "style": { "stroke": "#0062FF" }
       },
       "zIndex": 999,
       "width": 50,
       "height": 20,
-      "positionAbsolute": {
-        "x": -257.93697112052075,
-        "y": 453.78255589147204
-      },
+      "positionAbsolute": { "x": -257.93697112052075, "y": 453.78255589147204 },
       "dragging": false,
-      "style": {
-        "width": 50,
-        "height": 20
-      },
+      "style": { "width": 50, "height": 20 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -2356,30 +1648,19 @@
     {
       "id": "36wmSfRpWOnprqPo4C7QA",
       "type": "horizontal",
-      "position": {
-        "x": -257.93697112052075,
-        "y": 1174.400748222349
-      },
-      "selected": false,
+      "position": { "x": -257.93697112052075, "y": 1174.400748222349 },
+      "selected": true,
       "data": {
         "label": "horizontal node",
-        "style": {
-          "stroke": "#0062FF"
-        },
+        "style": { "stroke": "#0062FF" },
         "oldId": "iJv3Ii5B5TK8i5mN2mLs2"
       },
       "zIndex": 999,
       "width": 65,
       "height": 20,
-      "positionAbsolute": {
-        "x": -257.93697112052075,
-        "y": 1174.400748222349
-      },
+      "positionAbsolute": { "x": -257.93697112052075, "y": 1174.400748222349 },
       "dragging": false,
-      "style": {
-        "width": 65,
-        "height": 20
-      },
+      "style": { "width": 65, "height": 20 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -2387,43 +1668,28 @@
     {
       "id": "StBCykpzpM4g9PRFeSNXa",
       "type": "todo",
-      "position": {
-        "x": -252.60970787732018,
-        "y": 1405.2347754827133
-      },
-      "selected": false,
+      "position": { "x": -252.60970787732018, "y": 1405.2347754827133 },
+      "selected": true,
       "data": {
         "label": "Data Structures and Algorithms (Python)",
-        "style": {
-          "fontSize": 17,
-          "padding": 0
-        },
+        "style": { "fontSize": 17, "padding": 0 },
         "oldId": "eOFoGKveaHaBm_6ppJUtA"
       },
       "zIndex": 999,
       "width": 361,
       "height": 38,
-      "positionAbsolute": {
-        "x": -252.60970787732018,
-        "y": 1405.2347754827133
-      },
+      "positionAbsolute": { "x": -252.60970787732018, "y": 1405.2347754827133 },
       "dragging": false,
       "selectable": true,
       "focusable": true,
-      "style": {
-        "width": 361,
-        "height": 38
-      },
+      "style": { "width": 361, "height": 38 },
       "resizing": false
     },
     {
       "id": "lhLL1ycUWgeX_d5gd-g8g",
       "type": "resourceButton",
-      "position": {
-        "x": -227.93697112052075,
-        "y": 1497.72719179845
-      },
-      "selected": false,
+      "position": { "x": -227.93697112052075, "y": 1497.72719179845 },
+      "selected": true,
       "data": {
         "label": "Study Plans - Leetcode",
         "href": "https://leetcode.com/studyplan/",
@@ -2439,15 +1705,9 @@
       "zIndex": 999,
       "width": 386,
       "height": 49,
-      "positionAbsolute": {
-        "x": -227.93697112052075,
-        "y": 1497.72719179845
-      },
+      "positionAbsolute": { "x": -227.93697112052075, "y": 1497.72719179845 },
       "dragging": false,
-      "style": {
-        "width": 386,
-        "height": 49
-      },
+      "style": { "width": 386, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -2455,11 +1715,8 @@
     {
       "id": "4_5Q9PesKAtnLlT-NAm3z",
       "type": "resourceButton",
-      "position": {
-        "x": -227.93697112052075,
-        "y": 1442.932766177383
-      },
-      "selected": false,
+      "position": { "x": -227.93697112052075, "y": 1442.932766177383 },
+      "selected": true,
       "data": {
         "label": "Algorithmic Excercises",
         "href": "https://leetcode.com/explore/learn/",
@@ -2475,15 +1732,9 @@
       "zIndex": 999,
       "width": 386,
       "height": 49,
-      "positionAbsolute": {
-        "x": -227.93697112052075,
-        "y": 1442.932766177383
-      },
+      "positionAbsolute": { "x": -227.93697112052075, "y": 1442.932766177383 },
       "dragging": false,
-      "style": {
-        "width": 386,
-        "height": 49
-      },
+      "style": { "width": 386, "height": 49 },
       "resizing": true,
       "selectable": true,
       "focusable": true
@@ -2491,11 +1742,8 @@
     {
       "id": "Bh3vUHjY9So8vWli_464_",
       "type": "resourceButton",
-      "position": {
-        "x": -227.93697112052075,
-        "y": 1551.72719179845
-      },
-      "selected": false,
+      "position": { "x": -227.93697112052075, "y": 1551.72719179845 },
+      "selected": true,
       "data": {
         "label": "Algorithms Specialization",
         "href": "https://imp.i384100.net/5gqv4n",
@@ -2511,15 +1759,9 @@
       "zIndex": 999,
       "width": 386,
       "height": 49,
-      "positionAbsolute": {
-        "x": -227.93697112052075,
-        "y": 1551.72719179845
-      },
+      "positionAbsolute": { "x": -227.93697112052075, "y": 1551.72719179845 },
       "dragging": false,
-      "style": {
-        "width": 386,
-        "height": 49
-      },
+      "style": { "width": 386, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -2527,43 +1769,28 @@
     {
       "id": "Im0tXXn3GC-FUq2aMHgwm",
       "type": "todo",
-      "position": {
-        "x": -252.60970787732018,
-        "y": 1625.613764362119
-      },
-      "selected": false,
+      "position": { "x": -252.60970787732018, "y": 1625.613764362119 },
+      "selected": true,
       "data": {
         "label": "Learn SQL",
-        "style": {
-          "fontSize": 17,
-          "padding": 0
-        },
+        "style": { "fontSize": 17, "padding": 0 },
         "oldId": "eOFoGKveaHaBm_6ppJUtA"
       },
       "zIndex": 999,
       "width": 133,
       "height": 38,
-      "positionAbsolute": {
-        "x": -252.60970787732018,
-        "y": 1625.613764362119
-      },
+      "positionAbsolute": { "x": -252.60970787732018, "y": 1625.613764362119 },
       "dragging": false,
       "selectable": true,
       "focusable": true,
-      "style": {
-        "width": 133,
-        "height": 38
-      },
+      "style": { "width": 133, "height": 38 },
       "resizing": false
     },
     {
       "id": "22XRxoVJX-hIdinkFICPU",
       "type": "resourceButton",
-      "position": {
-        "x": -227.93697112052075,
-        "y": 1667.4659358409885
-      },
-      "selected": false,
+      "position": { "x": -227.93697112052075, "y": 1667.4659358409885 },
+      "selected": true,
       "data": {
         "label": "SQL Tutorial",
         "href": "https://sqltutorial.org/",
@@ -2579,15 +1806,9 @@
       "zIndex": 999,
       "width": 386,
       "height": 49,
-      "positionAbsolute": {
-        "x": -227.93697112052075,
-        "y": 1667.4659358409885
-      },
+      "positionAbsolute": { "x": -227.93697112052075, "y": 1667.4659358409885 },
       "dragging": false,
-      "style": {
-        "width": 386,
-        "height": 49
-      },
+      "style": { "width": 386, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -2595,30 +1816,19 @@
     {
       "id": "Sx6HhmEozlX7CEXQoVkTf",
       "type": "vertical",
-      "position": {
-        "x": 182.89029212267985,
-        "y": 1183
-      },
-      "selected": false,
+      "position": { "x": 182.89029212267985, "y": 1183 },
+      "selected": true,
       "data": {
         "label": "vertical node",
         "oldId": "rKb8lqYH0GC_6R5qybzzM",
-        "style": {
-          "stroke": "#0062FF"
-        }
+        "style": { "stroke": "#0062FF" }
       },
       "zIndex": 999,
       "width": 20,
       "height": 96,
-      "positionAbsolute": {
-        "x": 182.89029212267985,
-        "y": 1183
-      },
+      "positionAbsolute": { "x": 182.89029212267985, "y": 1183 },
       "dragging": false,
-      "style": {
-        "width": 20,
-        "height": 96
-      },
+      "style": { "width": 20, "height": 96 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -2626,11 +1836,8 @@
     {
       "id": "l1027SBZxTHKzqWw98Ee-",
       "type": "topic",
-      "position": {
-        "x": 304.89029212267985,
-        "y": 1252.2340815556822
-      },
-      "selected": false,
+      "position": { "x": 304.89029212267985, "y": 1252.2340815556822 },
+      "selected": true,
       "data": {
         "label": "Exploratory Data Analysis",
         "style": {
@@ -2643,10 +1850,7 @@
       "zIndex": 999,
       "width": 238,
       "height": 49,
-      "positionAbsolute": {
-        "x": 304.89029212267985,
-        "y": 1252.2340815556822
-      },
+      "positionAbsolute": { "x": 304.89029212267985, "y": 1252.2340815556822 },
       "dragging": false,
       "selectable": true,
       "focusable": true
@@ -2654,72 +1858,48 @@
     {
       "id": "YJ2fIGILZJjobx5CAD6QW",
       "type": "label",
-      "position": {
-        "x": 273.89029212267985,
-        "y": 1258.7340815556822
-      },
-      "selected": false,
+      "position": { "x": 273.89029212267985, "y": 1258.7340815556822 },
+      "selected": true,
       "data": {
         "label": "5",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 17,
-          "color": "#0062ff"
-        },
+        "style": { "fontSize": 17, "color": "#0062ff" },
         "oldId": "wOqfPAZ24GxUrkxVRRyT5"
       },
       "zIndex": 999,
       "width": 26,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": 273.89029212267985,
-        "y": 1258.7340815556822
-      },
+      "positionAbsolute": { "x": 273.89029212267985, "y": 1258.7340815556822 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "JaN8YhMeN3whAe2TCXvw9",
       "type": "todo",
-      "position": {
-        "x": 245,
-        "y": 1327.94348613687
-      },
-      "selected": false,
+      "position": { "x": 245, "y": 1327.94348613687 },
+      "selected": true,
       "data": {
         "label": "Data understanding, Data Analysis and Visualization",
-        "style": {
-          "fontSize": 17,
-          "padding": 0
-        },
+        "style": { "fontSize": 17, "padding": 0 },
         "oldId": "uPzzUpI0--7OWDfNeBIjt"
       },
       "zIndex": 999,
       "width": 460,
       "height": 38,
-      "positionAbsolute": {
-        "x": 245,
-        "y": 1327.94348613687
-      },
+      "positionAbsolute": { "x": 245, "y": 1327.94348613687 },
       "dragging": false,
       "selectable": true,
       "focusable": true,
-      "style": {
-        "width": 460,
-        "height": 38
-      },
+      "style": { "width": 460, "height": 38 },
       "resizing": false
     },
     {
       "id": "wG3LU8181BGihDVYJVI09",
       "type": "resourceButton",
-      "position": {
-        "x": 278,
-        "y": 1366.2347754827133
-      },
-      "selected": false,
+      "position": { "x": 278, "y": 1366.2347754827133 },
+      "selected": true,
       "data": {
         "label": "Exploratory Data Analysis with Python and Pandas",
         "href": "https://imp.i384100.net/AWAv4R",
@@ -2735,15 +1915,9 @@
       "zIndex": 999,
       "width": 477,
       "height": 49,
-      "positionAbsolute": {
-        "x": 278,
-        "y": 1366.2347754827133
-      },
+      "positionAbsolute": { "x": 278, "y": 1366.2347754827133 },
       "dragging": false,
-      "style": {
-        "width": 477,
-        "height": 49
-      },
+      "style": { "width": 477, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -2751,11 +1925,8 @@
     {
       "id": "R4MhS5WFGaGOLNq6SRpy0",
       "type": "resourceButton",
-      "position": {
-        "x": 278,
-        "y": 1419.2347754827133
-      },
-      "selected": false,
+      "position": { "x": 278, "y": 1419.2347754827133 },
+      "selected": true,
       "data": {
         "label": "Exploratory Data Analysis for Machine Learning",
         "href": "https://imp.i384100.net/GmQMLE",
@@ -2771,15 +1942,9 @@
       "zIndex": 999,
       "width": 477,
       "height": 49,
-      "positionAbsolute": {
-        "x": 278,
-        "y": 1419.2347754827133
-      },
+      "positionAbsolute": { "x": 278, "y": 1419.2347754827133 },
       "dragging": false,
-      "style": {
-        "width": 477,
-        "height": 49
-      },
+      "style": { "width": 477, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -2787,11 +1952,8 @@
     {
       "id": "mpPs2k7oT7EWrhQwaoPXr",
       "type": "resourceButton",
-      "position": {
-        "x": 278,
-        "y": 1472.2347754827133
-      },
-      "selected": false,
+      "position": { "x": 278, "y": 1472.2347754827133 },
+      "selected": true,
       "data": {
         "label": "Exploratory Data Analysis with Seaborn",
         "href": "https://imp.i384100.net/ZQmMgR",
@@ -2807,15 +1969,9 @@
       "zIndex": 999,
       "width": 477,
       "height": 49,
-      "positionAbsolute": {
-        "x": 278,
-        "y": 1472.2347754827133
-      },
+      "positionAbsolute": { "x": 278, "y": 1472.2347754827133 },
       "dragging": false,
-      "style": {
-        "width": 477,
-        "height": 49
-      },
+      "style": { "width": 477, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -2823,29 +1979,15 @@
     {
       "id": "FsU7_B1LCULtlVQg7gEPR",
       "type": "vertical",
-      "position": {
-        "x": 776,
-        "y": 1275.5
-      },
-      "selected": false,
-      "data": {
-        "label": "vertical node",
-        "style": {
-          "stroke": "#0062FF"
-        }
-      },
+      "position": { "x": 776, "y": 1275.5 },
+      "selected": true,
+      "data": { "label": "vertical node", "style": { "stroke": "#0062FF" } },
       "zIndex": 999,
       "width": 20,
       "height": 288,
-      "positionAbsolute": {
-        "x": 776,
-        "y": 1275.5
-      },
+      "positionAbsolute": { "x": 776, "y": 1275.5 },
       "dragging": false,
-      "style": {
-        "width": 20,
-        "height": 288
-      },
+      "style": { "width": 20, "height": 288 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -2853,30 +1995,19 @@
     {
       "id": "ofcYD3hTVEMeRptkHsVer",
       "type": "horizontal",
-      "position": {
-        "x": 525.8902921226799,
-        "y": 1551.72719179845
-      },
-      "selected": false,
+      "position": { "x": 525.8902921226799, "y": 1551.72719179845 },
+      "selected": true,
       "data": {
         "label": "horizontal node",
         "oldId": "GFlPWkEVwPlxPhOitG1xH",
-        "style": {
-          "stroke": "#0062FF"
-        }
+        "style": { "stroke": "#0062FF" }
       },
       "zIndex": 999,
       "width": 260,
       "height": 20,
-      "positionAbsolute": {
-        "x": 525.8902921226799,
-        "y": 1551.72719179845
-      },
+      "positionAbsolute": { "x": 525.8902921226799, "y": 1551.72719179845 },
       "dragging": false,
-      "style": {
-        "width": 260,
-        "height": 20
-      },
+      "style": { "width": 260, "height": 20 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -2884,11 +2015,8 @@
     {
       "id": "kBdt_t2SvVsY3blfubWIz",
       "type": "topic",
-      "position": {
-        "x": 336.89029212267985,
-        "y": 1537.22719179845
-      },
-      "selected": false,
+      "position": { "x": 336.89029212267985, "y": 1537.22719179845 },
+      "selected": true,
       "data": {
         "label": "Machine Learning",
         "style": {
@@ -2901,75 +2029,49 @@
       "zIndex": 999,
       "width": 206,
       "height": 49,
-      "positionAbsolute": {
-        "x": 336.89029212267985,
-        "y": 1537.22719179845
-      },
+      "positionAbsolute": { "x": 336.89029212267985, "y": 1537.22719179845 },
       "dragging": false,
       "selectable": true,
       "focusable": true,
-      "style": {
-        "width": 206,
-        "height": 49
-      },
+      "style": { "width": 206, "height": 49 },
       "resizing": false
     },
     {
       "id": "wOqfPAZ24GxUrkxVRRyT5",
       "type": "label",
-      "position": {
-        "x": 299.89029212267985,
-        "y": 1543.72719179845
-      },
-      "selected": false,
+      "position": { "x": 299.89029212267985, "y": 1543.72719179845 },
+      "selected": true,
       "data": {
         "label": "6",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 17,
-          "color": "#0062ff"
-        },
+        "style": { "fontSize": 17, "color": "#0062ff" },
         "oldId": "qRxvTDjpoW1GuQ771syXb"
       },
       "zIndex": 999,
       "width": 26,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": 299.89029212267985,
-        "y": 1543.72719179845
-      },
+      "positionAbsolute": { "x": 299.89029212267985, "y": 1543.72719179845 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "oeNjgke33Daibit1E6Rqr",
       "type": "horizontal",
-      "position": {
-        "x": 211.89029212267985,
-        "y": 1551.72719179845
-      },
-      "selected": false,
+      "position": { "x": 211.89029212267985, "y": 1551.72719179845 },
+      "selected": true,
       "data": {
         "label": "horizontal node",
         "oldId": "q_oYxEPUvEylwjAyDA5FL",
-        "style": {
-          "stroke": "#0062FF"
-        }
+        "style": { "stroke": "#0062FF" }
       },
       "zIndex": 999,
       "width": 87,
       "height": 20,
-      "positionAbsolute": {
-        "x": 211.89029212267985,
-        "y": 1551.72719179845
-      },
+      "positionAbsolute": { "x": 211.89029212267985, "y": 1551.72719179845 },
       "dragging": false,
-      "style": {
-        "width": 87,
-        "height": 20
-      },
+      "style": { "width": 87, "height": 20 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -2977,43 +2079,28 @@
     {
       "id": "FdBih8tlGPPy97YWq463y",
       "type": "todo",
-      "position": {
-        "x": 245,
-        "y": 1619.1289204774196
-      },
-      "selected": false,
+      "position": { "x": 245, "y": 1619.1289204774196 },
+      "selected": true,
       "data": {
         "label": "Classic ML (Sup., Unsup.), Advanced ML (Ensembles, NNs)",
-        "style": {
-          "fontSize": 17,
-          "padding": 0
-        },
+        "style": { "fontSize": 17, "padding": 0 },
         "oldId": "uPzzUpI0--7OWDfNeBIjt"
       },
       "zIndex": 999,
       "width": 535,
       "height": 38,
-      "positionAbsolute": {
-        "x": 245,
-        "y": 1619.1289204774196
-      },
+      "positionAbsolute": { "x": 245, "y": 1619.1289204774196 },
       "dragging": false,
       "selectable": true,
       "focusable": true,
-      "style": {
-        "width": 535,
-        "height": 38
-      },
+      "style": { "width": 535, "height": 38 },
       "resizing": false
     },
     {
       "id": "MyBAdtFSNVOnpw1BPQNky",
       "type": "resourceButton",
-      "position": {
-        "x": 272,
-        "y": 1657.1289204774196
-      },
-      "selected": false,
+      "position": { "x": 272, "y": 1657.1289204774196 },
+      "selected": true,
       "data": {
         "label": "Open Machine Learning Course - Open Data Science",
         "href": "https://mlcourse.ai/book/topic01/topic01_intro.html",
@@ -3029,15 +2116,9 @@
       "zIndex": 999,
       "width": 515,
       "height": 49,
-      "positionAbsolute": {
-        "x": 272,
-        "y": 1657.1289204774196
-      },
+      "positionAbsolute": { "x": 272, "y": 1657.1289204774196 },
       "dragging": false,
-      "style": {
-        "width": 515,
-        "height": 49
-      },
+      "style": { "width": 515, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -3045,11 +2126,8 @@
     {
       "id": "qCjcQWK1RGUU6K3dljow2",
       "type": "resourceButton",
-      "position": {
-        "x": 272,
-        "y": 1709
-      },
-      "selected": false,
+      "position": { "x": 272, "y": 1709 },
+      "selected": true,
       "data": {
         "label": "Machine Learning Specialization",
         "href": "https://imp.i384100.net/oqGkrg",
@@ -3065,15 +2143,9 @@
       "zIndex": 999,
       "width": 515,
       "height": 49,
-      "positionAbsolute": {
-        "x": 272,
-        "y": 1709
-      },
+      "positionAbsolute": { "x": 272, "y": 1709 },
       "dragging": false,
-      "style": {
-        "width": 515,
-        "height": 49
-      },
+      "style": { "width": 515, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -3081,11 +2153,8 @@
     {
       "id": "erDpbh0iRTfoUQrU4uEMs",
       "type": "resourceButton",
-      "position": {
-        "x": 272,
-        "y": 1779.259275392802
-      },
-      "selected": false,
+      "position": { "x": 272, "y": 1779.259275392802 },
+      "selected": true,
       "data": {
         "label": "Pattern Recognition & ML by Christopher m. Bishop",
         "href": "https://microsoft.com/en-us/research/uploads/prod/2006/01/Bishop-Pattern-Recognition-and-Machine-Learning-2006.pdf",
@@ -3101,15 +2170,9 @@
       "zIndex": 999,
       "width": 515,
       "height": 49,
-      "positionAbsolute": {
-        "x": 272,
-        "y": 1779.259275392802
-      },
+      "positionAbsolute": { "x": 272, "y": 1779.259275392802 },
       "dragging": false,
-      "style": {
-        "width": 515,
-        "height": 49
-      },
+      "style": { "width": 515, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -3117,11 +2180,8 @@
     {
       "id": "9yKXxruT8s9KBEFf_Twd0",
       "type": "resourceButton",
-      "position": {
-        "x": 272,
-        "y": 1832.1050525886042
-      },
-      "selected": false,
+      "position": { "x": 272, "y": 1832.1050525886042 },
+      "selected": true,
       "data": {
         "label": "GitHub repository with notes & code from the eBook above",
         "href": "https://github.com/gerdm/prml",
@@ -3137,15 +2197,9 @@
       "zIndex": 999,
       "width": 515,
       "height": 49,
-      "positionAbsolute": {
-        "x": 272,
-        "y": 1832.1050525886042
-      },
+      "positionAbsolute": { "x": 272, "y": 1832.1050525886042 },
       "dragging": false,
-      "style": {
-        "width": 515,
-        "height": 49
-      },
+      "style": { "width": 515, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -3153,30 +2207,19 @@
     {
       "id": "uCZ6_FKeaY0lCkrNttNhz",
       "type": "vertical",
-      "position": {
-        "x": 201.89029212267982,
-        "y": 1561.1289204774196
-      },
-      "selected": false,
+      "position": { "x": 201.89029212267982, "y": 1561.1289204774196 },
+      "selected": true,
       "data": {
         "label": "vertical node",
         "oldId": "rKb8lqYH0GC_6R5qybzzM",
-        "style": {
-          "stroke": "#0062FF"
-        }
+        "style": { "stroke": "#0062FF" }
       },
       "zIndex": 999,
       "width": 20,
       "height": 204,
-      "positionAbsolute": {
-        "x": 201.89029212267982,
-        "y": 1561.1289204774196
-      },
+      "positionAbsolute": { "x": 201.89029212267982, "y": 1561.1289204774196 },
       "dragging": false,
-      "style": {
-        "width": 20,
-        "height": 204
-      },
+      "style": { "width": 20, "height": 204 },
       "resizing": true,
       "selectable": true,
       "focusable": true
@@ -3184,30 +2227,19 @@
     {
       "id": "41yv5UhFw3kHIrAMQb6qy",
       "type": "horizontal",
-      "position": {
-        "x": 24.890292122679853,
-        "y": 1754.1289204774196
-      },
-      "selected": false,
+      "position": { "x": 24.890292122679853, "y": 1754.1289204774196 },
+      "selected": true,
       "data": {
         "label": "horizontal node",
         "oldId": "deHK6yEdytCu2ACvVC0bs",
-        "style": {
-          "stroke": "#0062FF"
-        }
+        "style": { "stroke": "#0062FF" }
       },
       "zIndex": 999,
       "width": 187,
       "height": 20,
-      "positionAbsolute": {
-        "x": 24.890292122679853,
-        "y": 1754.1289204774196
-      },
+      "positionAbsolute": { "x": 24.890292122679853, "y": 1754.1289204774196 },
       "dragging": false,
-      "style": {
-        "width": 187,
-        "height": 20
-      },
+      "style": { "width": 187, "height": 20 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -3215,11 +2247,8 @@
     {
       "id": "cjvVLN0XjrKPn6o20oMmc",
       "type": "topic",
-      "position": {
-        "x": -153.75449749114952,
-        "y": 1739.6289204774196
-      },
-      "selected": false,
+      "position": { "x": -153.75449749114952, "y": 1739.6289204774196 },
+      "selected": true,
       "data": {
         "label": "Deep Learning",
         "style": {
@@ -3232,74 +2261,45 @@
       "zIndex": 999,
       "width": 181,
       "height": 49,
-      "positionAbsolute": {
-        "x": -153.75449749114952,
-        "y": 1739.6289204774196
-      },
+      "positionAbsolute": { "x": -153.75449749114952, "y": 1739.6289204774196 },
       "dragging": false,
       "selectable": true,
       "focusable": true,
-      "style": {
-        "width": 181,
-        "height": 49
-      },
+      "style": { "width": 181, "height": 49 },
       "resizing": false
     },
     {
       "id": "rarV0SS26NyqAHkYeqsfa",
       "type": "label",
-      "position": {
-        "x": -188.75449749114966,
-        "y": 1746.1289204774196
-      },
-      "selected": false,
+      "position": { "x": -188.75449749114966, "y": 1746.1289204774196 },
+      "selected": true,
       "data": {
         "label": "7",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 17,
-          "color": "#0062ff"
-        },
+        "style": { "fontSize": 17, "color": "#0062ff" },
         "oldId": "Sehg_WX_mnMCRlKrvwWzc"
       },
       "zIndex": 999,
       "width": 24,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": -188.75449749114966,
-        "y": 1746.1289204774196
-      },
+      "positionAbsolute": { "x": -188.75449749114966, "y": 1746.1289204774196 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "iJv3Ii5B5TK8i5mN2mLs2",
       "type": "horizontal",
-      "position": {
-        "x": -270.93697112052075,
-        "y": 1754.1289204774196
-      },
-      "selected": false,
-      "data": {
-        "label": "horizontal node",
-        "style": {
-          "stroke": "#0062FF"
-        }
-      },
+      "position": { "x": -270.93697112052075, "y": 1754.1289204774196 },
+      "selected": true,
+      "data": { "label": "horizontal node", "style": { "stroke": "#0062FF" } },
       "zIndex": 999,
       "width": 78,
       "height": 20,
-      "positionAbsolute": {
-        "x": -270.93697112052075,
-        "y": 1754.1289204774196
-      },
+      "positionAbsolute": { "x": -270.93697112052075, "y": 1754.1289204774196 },
       "dragging": false,
-      "style": {
-        "width": 78,
-        "height": 20
-      },
+      "style": { "width": 78, "height": 20 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -3307,29 +2307,15 @@
     {
       "id": "kBQV71KwuVxpUi0nFj17X",
       "type": "vertical",
-      "position": {
-        "x": -281,
-        "y": 1763
-      },
-      "selected": false,
-      "data": {
-        "label": "vertical node",
-        "style": {
-          "stroke": "#0062FF"
-        }
-      },
+      "position": { "x": -281, "y": 1763 },
+      "selected": true,
+      "data": { "label": "vertical node", "style": { "stroke": "#0062FF" } },
       "zIndex": 999,
       "width": 20,
       "height": 360,
-      "positionAbsolute": {
-        "x": -281,
-        "y": 1763
-      },
+      "positionAbsolute": { "x": -281, "y": 1763 },
       "dragging": false,
-      "style": {
-        "width": 20,
-        "height": 360
-      },
+      "style": { "width": 20, "height": 360 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -3337,43 +2323,28 @@
     {
       "id": "eOFoGKveaHaBm_6ppJUtA",
       "type": "todo",
-      "position": {
-        "x": -254.10970787732015,
-        "y": 1823.259275392802
-      },
-      "selected": false,
+      "position": { "x": -254.10970787732015, "y": 1823.259275392802 },
+      "selected": true,
       "data": {
         "label": "Fully Connected, CNN, RNN, LSTM, Transformers, TL",
-        "style": {
-          "fontSize": 17,
-          "padding": 0
-        },
+        "style": { "fontSize": 17, "padding": 0 },
         "oldId": "n2JFGwFxTuOviW6kHO1Uv"
       },
       "zIndex": 999,
       "width": 449,
       "height": 38,
-      "positionAbsolute": {
-        "x": -254.10970787732015,
-        "y": 1823.259275392802
-      },
+      "positionAbsolute": { "x": -254.10970787732015, "y": 1823.259275392802 },
       "dragging": false,
       "selectable": true,
       "focusable": true,
-      "style": {
-        "width": 449,
-        "height": 38
-      },
+      "style": { "width": 449, "height": 38 },
       "resizing": false
     },
     {
       "id": "4TyV6lDCVCOIOhmY9bgPC",
       "type": "resourceButton",
-      "position": {
-        "x": -231.10970787732015,
-        "y": 1862.0843010493045
-      },
-      "selected": false,
+      "position": { "x": -231.10970787732015, "y": 1862.0843010493045 },
+      "selected": true,
       "data": {
         "label": "Deep Learning Specialization",
         "href": "https://imp.i384100.net/Wq9MV3",
@@ -3389,15 +2360,9 @@
       "zIndex": 999,
       "width": 405,
       "height": 49,
-      "positionAbsolute": {
-        "x": -231.10970787732015,
-        "y": 1862.0843010493045
-      },
+      "positionAbsolute": { "x": -231.10970787732015, "y": 1862.0843010493045 },
       "dragging": false,
-      "style": {
-        "width": 405,
-        "height": 49
-      },
+      "style": { "width": 405, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -3405,11 +2370,8 @@
     {
       "id": "-rl87TRJZTWqbQmW95NAi",
       "type": "resourceButton",
-      "position": {
-        "x": -231.10970787732015,
-        "y": 1915.0843010493045
-      },
-      "selected": false,
+      "position": { "x": -231.10970787732015, "y": 1915.0843010493045 },
+      "selected": true,
       "data": {
         "label": "Deep Learning Book",
         "href": "https://www.deeplearningbook.org/",
@@ -3425,15 +2387,9 @@
       "zIndex": 999,
       "width": 405,
       "height": 49,
-      "positionAbsolute": {
-        "x": -231.10970787732015,
-        "y": 1915.0843010493045
-      },
+      "positionAbsolute": { "x": -231.10970787732015, "y": 1915.0843010493045 },
       "dragging": false,
-      "style": {
-        "width": 405,
-        "height": 49
-      },
+      "style": { "width": 405, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -3441,11 +2397,8 @@
     {
       "id": "54pd0lYYLvuNYmuaOZbrT",
       "type": "resourceButton",
-      "position": {
-        "x": -231.10970787732015,
-        "y": 1968.0843010493045
-      },
-      "selected": false,
+      "position": { "x": -231.10970787732015, "y": 1968.0843010493045 },
+      "selected": true,
       "data": {
         "label": "Attention is all you need",
         "href": "https://arxiv.org/pdf/1706.03762",
@@ -3461,15 +2414,9 @@
       "zIndex": 999,
       "width": 405,
       "height": 49,
-      "positionAbsolute": {
-        "x": -231.10970787732015,
-        "y": 1968.0843010493045
-      },
+      "positionAbsolute": { "x": -231.10970787732015, "y": 1968.0843010493045 },
       "dragging": false,
-      "style": {
-        "width": 405,
-        "height": 49
-      },
+      "style": { "width": 405, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -3477,11 +2424,8 @@
     {
       "id": "lm3BCmHTcd-_cOIc_dDmU",
       "type": "resourceButton",
-      "position": {
-        "x": -231.10970787732015,
-        "y": 2021.0843010493045
-      },
-      "selected": false,
+      "position": { "x": -231.10970787732015, "y": 2021.0843010493045 },
+      "selected": true,
       "data": {
         "label": "The Illustrated Transformer",
         "href": "https://jalammar.github.io/illustrated-transformer/",
@@ -3497,15 +2441,9 @@
       "zIndex": 999,
       "width": 405,
       "height": 49,
-      "positionAbsolute": {
-        "x": -231.10970787732015,
-        "y": 2021.0843010493045
-      },
+      "positionAbsolute": { "x": -231.10970787732015, "y": 2021.0843010493045 },
       "dragging": false,
-      "style": {
-        "width": 405,
-        "height": 49
-      },
+      "style": { "width": 405, "height": 49 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -3513,30 +2451,19 @@
     {
       "id": "deHK6yEdytCu2ACvVC0bs",
       "type": "horizontal",
-      "position": {
-        "x": -271.10970787732015,
-        "y": 2112
-      },
-      "selected": false,
+      "position": { "x": -271.10970787732015, "y": 2112 },
+      "selected": true,
       "data": {
         "label": "horizontal node",
         "oldId": "ofcYD3hTVEMeRptkHsVer",
-        "style": {
-          "stroke": "#0062FF"
-        }
+        "style": { "stroke": "#0062FF" }
       },
       "zIndex": 999,
       "width": 514,
       "height": 20,
-      "positionAbsolute": {
-        "x": -271.10970787732015,
-        "y": 2112
-      },
+      "positionAbsolute": { "x": -271.10970787732015, "y": 2112 },
       "dragging": false,
-      "style": {
-        "width": 514,
-        "height": 20
-      },
+      "style": { "width": 514, "height": 20 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -3544,30 +2471,19 @@
     {
       "id": "Nn5ZjuUG_uEbCxcIcYY9U",
       "type": "vertical",
-      "position": {
-        "x": 231.89029212267985,
-        "y": 1935
-      },
-      "selected": false,
+      "position": { "x": 231.89029212267985, "y": 1935 },
+      "selected": true,
       "data": {
         "label": "vertical node",
         "oldId": "jVVrvW1PCXEKz5IfJMXKo",
-        "style": {
-          "stroke": "#0062FF"
-        }
+        "style": { "stroke": "#0062FF" }
       },
       "zIndex": 999,
       "width": 20,
       "height": 188,
-      "positionAbsolute": {
-        "x": 231.89029212267985,
-        "y": 1935
-      },
+      "positionAbsolute": { "x": 231.89029212267985, "y": 1935 },
       "dragging": false,
-      "style": {
-        "width": 20,
-        "height": 188
-      },
+      "style": { "width": 20, "height": 188 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -3575,30 +2491,19 @@
     {
       "id": "C85MXDnb-d0eVur0DLGr-",
       "type": "horizontal",
-      "position": {
-        "x": 242.89029212267985,
-        "y": 1925.5843010493045
-      },
-      "selected": false,
+      "position": { "x": 242.89029212267985, "y": 1925.5843010493045 },
+      "selected": true,
       "data": {
         "label": "horizontal node",
         "oldId": "q_oYxEPUvEylwjAyDA5FL",
-        "style": {
-          "stroke": "#0062FF"
-        }
+        "style": { "stroke": "#0062FF" }
       },
       "zIndex": 999,
       "width": 87,
       "height": 20,
-      "positionAbsolute": {
-        "x": 242.89029212267985,
-        "y": 1925.5843010493045
-      },
+      "positionAbsolute": { "x": 242.89029212267985, "y": 1925.5843010493045 },
       "dragging": false,
-      "style": {
-        "width": 87,
-        "height": 20
-      },
+      "style": { "width": 87, "height": 20 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -3606,40 +2511,28 @@
     {
       "id": "Sehg_WX_mnMCRlKrvwWzc",
       "type": "label",
-      "position": {
-        "x": 339.89029212267985,
-        "y": 1918.0843010493045
-      },
-      "selected": false,
+      "position": { "x": 339.89029212267985, "y": 1918.0843010493045 },
+      "selected": true,
       "data": {
         "label": "8",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 17,
-          "color": "#0062ff"
-        },
+        "style": { "fontSize": 17, "color": "#0062ff" },
         "oldId": "wOqfPAZ24GxUrkxVRRyT5"
       },
       "zIndex": 999,
       "width": 26,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": 339.89029212267985,
-        "y": 1918.0843010493045
-      },
+      "positionAbsolute": { "x": 339.89029212267985, "y": 1918.0843010493045 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "Qa85hEVe2kz62k9Pj4QCA",
       "type": "topic",
-      "position": {
-        "x": 369.89029212267985,
-        "y": 1911.5843010493045
-      },
-      "selected": false,
+      "position": { "x": 369.89029212267985, "y": 1911.5843010493045 },
+      "selected": true,
       "data": {
         "label": "MLOps",
         "style": {
@@ -3652,27 +2545,18 @@
       "zIndex": 999,
       "width": 123,
       "height": 49,
-      "positionAbsolute": {
-        "x": 369.89029212267985,
-        "y": 1911.5843010493045
-      },
+      "positionAbsolute": { "x": 369.89029212267985, "y": 1911.5843010493045 },
       "dragging": false,
       "selectable": true,
       "focusable": true,
-      "style": {
-        "width": 123,
-        "height": 49
-      },
+      "style": { "width": 123, "height": 49 },
       "resizing": false
     },
     {
       "id": "bsj2IHFXur-qqDSI4B1wg",
       "type": "resourceButton",
-      "position": {
-        "x": 287,
-        "y": 2017.0843010493045
-      },
-      "selected": false,
+      "position": { "x": 287, "y": 2017.0843010493045 },
+      "selected": true,
       "data": {
         "label": "MLOps Specialization",
         "href": "https://imp.i384100.net/nLA5mx",
@@ -3688,15 +2572,9 @@
       "zIndex": 999,
       "width": 451,
       "height": 49,
-      "positionAbsolute": {
-        "x": 287,
-        "y": 2017.0843010493045
-      },
+      "positionAbsolute": { "x": 287, "y": 2017.0843010493045 },
       "dragging": false,
-      "style": {
-        "width": 451,
-        "height": 49
-      },
+      "style": { "width": 451, "height": 49 },
       "resizing": true,
       "selectable": true,
       "focusable": true
@@ -3704,62 +2582,39 @@
     {
       "id": "uPzzUpI0--7OWDfNeBIjt",
       "type": "todo",
-      "position": {
-        "x": 259.89029212267985,
-        "y": 1979.0843010493045
-      },
-      "selected": false,
+      "position": { "x": 259.89029212267985, "y": 1979.0843010493045 },
+      "selected": true,
       "data": {
         "label": "Deployment Models, CI/CD",
-        "style": {
-          "fontSize": 17,
-          "padding": 0
-        },
+        "style": { "fontSize": 17, "padding": 0 },
         "oldId": "eOFoGKveaHaBm_6ppJUtA"
       },
       "zIndex": 999,
       "width": 535,
       "height": 38,
-      "positionAbsolute": {
-        "x": 259.89029212267985,
-        "y": 1979.0843010493045
-      },
+      "positionAbsolute": { "x": 259.89029212267985, "y": 1979.0843010493045 },
       "dragging": false,
       "selectable": true,
       "focusable": true,
-      "style": {
-        "width": 535,
-        "height": 38
-      },
+      "style": { "width": 535, "height": 38 },
       "resizing": false
     },
     {
       "id": "rKb8lqYH0GC_6R5qybzzM",
       "type": "vertical",
-      "position": {
-        "x": 760,
-        "y": 1935
-      },
-      "selected": false,
+      "position": { "x": 760, "y": 1935 },
+      "selected": true,
       "data": {
         "label": "vertical node",
         "oldId": "FsU7_B1LCULtlVQg7gEPR",
-        "style": {
-          "stroke": "#0062FF"
-        }
+        "style": { "stroke": "#0062FF" }
       },
       "zIndex": 999,
       "width": 20,
       "height": 217,
-      "positionAbsolute": {
-        "x": 760,
-        "y": 1935
-      },
+      "positionAbsolute": { "x": 760, "y": 1935 },
       "dragging": false,
-      "style": {
-        "width": 20,
-        "height": 217
-      },
+      "style": { "width": 20, "height": 217 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -3767,30 +2622,19 @@
     {
       "id": "q_oYxEPUvEylwjAyDA5FL",
       "type": "horizontal",
-      "position": {
-        "x": 277.39029212267985,
-        "y": 2142
-      },
-      "selected": false,
+      "position": { "x": 277.39029212267985, "y": 2142 },
+      "selected": true,
       "data": {
         "label": "horizontal node",
         "oldId": "ofcYD3hTVEMeRptkHsVer",
-        "style": {
-          "stroke": "#0062FF"
-        }
+        "style": { "stroke": "#0062FF" }
       },
       "zIndex": 999,
       "width": 493,
       "height": 20,
-      "positionAbsolute": {
-        "x": 277.39029212267985,
-        "y": 2142
-      },
+      "positionAbsolute": { "x": 277.39029212267985, "y": 2142 },
       "dragging": false,
-      "style": {
-        "width": 493,
-        "height": 20
-      },
+      "style": { "width": 493, "height": 20 },
       "resizing": true,
       "selectable": true,
       "focusable": true
@@ -3798,30 +2642,19 @@
     {
       "id": "jVVrvW1PCXEKz5IfJMXKo",
       "type": "vertical",
-      "position": {
-        "x": 269.89029212267985,
-        "y": 2152
-      },
-      "selected": false,
+      "position": { "x": 269.89029212267985, "y": 2152 },
+      "selected": true,
       "data": {
         "label": "vertical node",
         "oldId": "rKb8lqYH0GC_6R5qybzzM",
-        "style": {
-          "stroke": "#0062FF"
-        }
+        "style": { "stroke": "#0062FF" }
       },
       "zIndex": 999,
       "width": 20,
       "height": 75,
-      "positionAbsolute": {
-        "x": 269.89029212267985,
-        "y": 2152
-      },
+      "positionAbsolute": { "x": 269.89029212267985, "y": 2152 },
       "dragging": false,
-      "style": {
-        "width": 20,
-        "height": 75
-      },
+      "style": { "width": 20, "height": 75 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -3829,11 +2662,8 @@
     {
       "id": "kpF15oUmlUmk1qVGEBB7Y",
       "type": "paragraph",
-      "position": {
-        "x": 443.3036441730079,
-        "y": -71.532769530855
-      },
-      "selected": false,
+      "position": { "x": 443.3036441730079, "y": -71.532769530855 },
+      "selected": true,
       "data": {
         "label": "Find the detailed version of this roadmap along with other similar roadmaps",
         "style": {
@@ -3848,60 +2678,40 @@
       "zIndex": 999,
       "width": 354,
       "height": 143,
-      "positionAbsolute": {
-        "x": 443.3036441730079,
-        "y": -71.532769530855
-      },
+      "positionAbsolute": { "x": 443.3036441730079, "y": -71.532769530855 },
       "dragging": false,
       "selectable": true,
       "focusable": true,
-      "style": {
-        "width": 354,
-        "height": 143
-      },
+      "style": { "width": 354, "height": 143 },
       "resizing": false
     },
     {
       "id": "2zqZkyVgigifcRS1H7F_b",
       "type": "button",
-      "position": {
-        "x": 456.50701858580805,
-        "y": 10.452793886890277
-      },
-      "selected": false,
+      "position": { "x": 456.50701858580805, "y": 10.452793886890277 },
+      "selected": true,
       "data": {
         "label": "roadmap.sh",
         "href": "https://roadmap.sh",
         "color": "#ffffff",
         "backgroundColor": "#4136D6",
-        "style": {
-          "fontSize": 17
-        }
+        "style": { "fontSize": 17 }
       },
       "zIndex": 999,
       "width": 329,
       "height": 49,
       "dragging": false,
-      "style": {
-        "width": 329,
-        "height": 49
-      },
+      "style": { "width": 329, "height": 49 },
       "resizing": false,
-      "positionAbsolute": {
-        "x": 456.50701858580805,
-        "y": 10.452793886890277
-      },
+      "positionAbsolute": { "x": 456.50701858580805, "y": 10.452793886890277 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "qnjDifLlSYoxWd5GmuQXd",
       "type": "linksgroup",
-      "position": {
-        "x": 114.89029212267985,
-        "y": -67.532769530855
-      },
-      "selected": false,
+      "position": { "x": 114.89029212267985, "y": -67.532769530855 },
+      "selected": true,
       "data": {
         "label": "Related Roadmaps",
         "links": [
@@ -3921,15 +2731,9 @@
       "zIndex": 999,
       "width": 315,
       "height": 139,
-      "positionAbsolute": {
-        "x": 114.89029212267985,
-        "y": -67.532769530855
-      },
+      "positionAbsolute": { "x": 114.89029212267985, "y": -67.532769530855 },
       "dragging": false,
-      "style": {
-        "width": 315,
-        "height": 139
-      },
+      "style": { "width": 315, "height": 139 },
       "resizing": false,
       "selectable": true,
       "focusable": true
@@ -3937,388 +2741,268 @@
     {
       "id": "0bn7U-9YoeOqPXTnrMpfz",
       "type": "label",
-      "position": {
-        "x": -287,
-        "y": 1875.0843010493045
-      },
-      "selected": false,
+      "position": { "x": -287, "y": 1875.0843010493045 },
+      "selected": true,
       "data": {
         "label": "V",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 20,
-          "color": "#0062FF"
-        },
+        "style": { "fontSize": 20, "color": "#0062FF" },
         "oldId": "FGJcnSeI5Fgn2bxfY9DEd"
       },
       "zIndex": 999,
       "width": 28,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": -287,
-        "y": 1875.0843010493045
-      },
+      "positionAbsolute": { "x": -287, "y": 1875.0843010493045 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "13tRO2lYWb0m8LwjAcdIY",
       "type": "label",
-      "position": {
-        "x": -287,
-        "y": 1999.8462240428494
-      },
-      "selected": false,
+      "position": { "x": -287, "y": 1999.8462240428494 },
+      "selected": true,
       "data": {
         "label": "V",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 20,
-          "color": "#0062FF"
-        },
+        "style": { "fontSize": 20, "color": "#0062FF" },
         "oldId": "FGJcnSeI5Fgn2bxfY9DEd"
       },
       "zIndex": 999,
       "width": 28,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": -287,
-        "y": 1999.8462240428494
-      },
+      "positionAbsolute": { "x": -287, "y": 1999.8462240428494 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "uBSNhZB4PuEKY1bkzoZGG",
       "type": "label",
-      "position": {
-        "x": 41.890292122679824,
-        "y": 1167
-      },
-      "selected": false,
+      "position": { "x": 41.890292122679824, "y": 1167 },
+      "selected": true,
       "data": {
         "label": ">",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 24,
-          "color": "#0062FF"
-        },
+        "style": { "fontSize": 24, "color": "#0062FF" },
         "oldId": "Xd_mdvQdbCWcucpSTcDz1"
       },
       "zIndex": 999,
       "width": 34,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": 41.890292122679824,
-        "y": 1167
-      },
+      "positionAbsolute": { "x": 41.890292122679824, "y": 1167 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "-5YUJmODVX62RchBu-G0y",
       "type": "label",
-      "position": {
-        "x": 621.8902921226799,
-        "y": 1258.7340815556822
-      },
-      "selected": false,
+      "position": { "x": 621.8902921226799, "y": 1258.7340815556822 },
+      "selected": true,
       "data": {
         "label": ">",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 24,
-          "color": "#0062FF"
-        },
+        "style": { "fontSize": 24, "color": "#0062FF" },
         "oldId": "Xd_mdvQdbCWcucpSTcDz1"
       },
       "zIndex": 999,
       "width": 34,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": 621.8902921226799,
-        "y": 1258.7340815556822
-      },
+      "positionAbsolute": { "x": 621.8902921226799, "y": 1258.7340815556822 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "wt-ifu9mv7Ydc_-Gaqv-V",
       "type": "label",
-      "position": {
-        "x": 609.3902921226799,
-        "y": 1543.72719179845
-      },
-      "selected": false,
+      "position": { "x": 609.3902921226799, "y": 1543.72719179845 },
+      "selected": true,
       "data": {
         "label": "<",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 24,
-          "color": "#0062FF"
-        },
+        "style": { "fontSize": 24, "color": "#0062FF" },
         "oldId": "SG6DkcQM4NdgTSu2MR8Q5"
       },
       "zIndex": 999,
       "width": 33,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": 609.3902921226799,
-        "y": 1543.72719179845
-      },
+      "positionAbsolute": { "x": 609.3902921226799, "y": 1543.72719179845 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "93tag4KlRPagkbdpY4lVT",
       "type": "label",
-      "position": {
-        "x": 768.5,
-        "y": 1383.2347754827133
-      },
-      "selected": false,
+      "position": { "x": 768.5, "y": 1383.2347754827133 },
+      "selected": true,
       "data": {
         "label": "V",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 24,
-          "color": "#0062FF"
-        },
+        "style": { "fontSize": 24, "color": "#0062FF" },
         "oldId": "qRxvTDjpoW1GuQ771syXb"
       },
       "zIndex": 999,
       "width": 31,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": 768.5,
-        "y": 1383.2347754827133
-      },
+      "positionAbsolute": { "x": 768.5, "y": 1383.2347754827133 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "DEW_GsNVEf75P63SvEQwB",
       "type": "label",
-      "position": {
-        "x": 223.89029212267985,
-        "y": 1543.72719179845
-      },
-      "selected": false,
+      "position": { "x": 223.89029212267985, "y": 1543.72719179845 },
+      "selected": true,
       "data": {
         "label": "<",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 24,
-          "color": "#0062FF"
-        },
+        "style": { "fontSize": 24, "color": "#0062FF" },
         "oldId": "SG6DkcQM4NdgTSu2MR8Q5"
       },
       "zIndex": 999,
       "width": 33,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": 223.89029212267985,
-        "y": 1543.72719179845
-      },
+      "positionAbsolute": { "x": 223.89029212267985, "y": 1543.72719179845 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "nAi-ndQiOiYCuAMqtDZ1I",
       "type": "label",
-      "position": {
-        "x": 106.89029212267982,
-        "y": 1746.1289204774196
-      },
-      "selected": false,
+      "position": { "x": 106.89029212267982, "y": 1746.1289204774196 },
+      "selected": true,
       "data": {
         "label": "<",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 24,
-          "color": "#0062FF"
-        },
+        "style": { "fontSize": 24, "color": "#0062FF" },
         "oldId": "SG6DkcQM4NdgTSu2MR8Q5"
       },
       "zIndex": 999,
       "width": 33,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": 106.89029212267982,
-        "y": 1746.1289204774196
-      },
+      "positionAbsolute": { "x": 106.89029212267982, "y": 1746.1289204774196 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "ftUWZ9y0YFc4geCEaCEAq",
       "type": "label",
-      "position": {
-        "x": 561.8902921226799,
-        "y": 1917.5843010493045
-      },
-      "selected": false,
+      "position": { "x": 561.8902921226799, "y": 1917.5843010493045 },
+      "selected": true,
       "data": {
         "label": ">",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 24,
-          "color": "#0062FF"
-        },
+        "style": { "fontSize": 24, "color": "#0062FF" },
         "oldId": "Xd_mdvQdbCWcucpSTcDz1"
       },
       "zIndex": 999,
       "width": 34,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": 561.8902921226799,
-        "y": 1917.5843010493045
-      },
+      "positionAbsolute": { "x": 561.8902921226799, "y": 1917.5843010493045 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "SG6DkcQM4NdgTSu2MR8Q5",
       "type": "label",
-      "position": {
-        "x": 509.89029212267985,
-        "y": 2134
-      },
-      "selected": false,
+      "position": { "x": 509.89029212267985, "y": 2134 },
+      "selected": true,
       "data": {
         "label": "<",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 24,
-          "color": "#0062FF"
-        },
+        "style": { "fontSize": 24, "color": "#0062FF" },
         "oldId": "YT5_iofe0kQ-wVjd54RT8"
       },
       "zIndex": 999,
       "width": 33,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": 509.89029212267985,
-        "y": 2134
-      },
+      "positionAbsolute": { "x": 509.89029212267985, "y": 2134 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "FGJcnSeI5Fgn2bxfY9DEd",
       "type": "label",
-      "position": {
-        "x": 754,
-        "y": 2035.8462240428494
-      },
-      "selected": false,
+      "position": { "x": 754, "y": 2035.8462240428494 },
+      "selected": true,
       "data": {
         "label": "V",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 20,
-          "color": "#0062FF"
-        },
+        "style": { "fontSize": 20, "color": "#0062FF" },
         "oldId": "Jsyv0X1BPlP0Vi_oklxHA"
       },
       "zIndex": 999,
       "width": 28,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": 754,
-        "y": 2035.8462240428494
-      },
+      "positionAbsolute": { "x": 754, "y": 2035.8462240428494 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "PV5ACkfJLhJOUZ2qnobhZ",
       "type": "label",
-      "position": {
-        "x": 27.24550250885048,
-        "y": 2104
-      },
-      "selected": false,
+      "position": { "x": 27.24550250885048, "y": 2104 },
+      "selected": true,
       "data": {
         "label": ">",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 24,
-          "color": "#0062FF"
-        },
+        "style": { "fontSize": 24, "color": "#0062FF" },
         "oldId": "Xd_mdvQdbCWcucpSTcDz1"
       },
       "zIndex": 999,
       "width": 34,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": 27.24550250885048,
-        "y": 2104
-      },
+      "positionAbsolute": { "x": 27.24550250885048, "y": 2104 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "Xd_mdvQdbCWcucpSTcDz1",
       "type": "label",
-      "position": {
-        "x": -164.75449749114966,
-        "y": 2104
-      },
-      "selected": false,
+      "position": { "x": -164.75449749114966, "y": 2104 },
+      "selected": true,
       "data": {
         "label": ">",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 24,
-          "color": "#0062FF"
-        },
+        "style": { "fontSize": 24, "color": "#0062FF" },
         "oldId": "WmbvaP_zRGs_WhYK30YqM"
       },
       "zIndex": 999,
       "width": 34,
       "height": 36,
       "dragging": false,
-      "positionAbsolute": {
-        "x": -164.75449749114966,
-        "y": 2104
-      },
+      "positionAbsolute": { "x": -164.75449749114966, "y": 2104 },
       "selectable": true,
       "focusable": true
     },
     {
       "id": "Ju00mr0KLGN2BV6yEQGPt",
       "type": "vertical",
-      "position": {
-        "x": 272,
-        "y": 2284.5820625712176
-      },
-      "selected": false,
+      "position": { "x": 272, "y": 2284.5820625712176 },
+      "selected": true,
       "data": {
         "label": "vertical node",
         "style": {
@@ -4331,15 +3015,9 @@
       "zIndex": 999,
       "width": 20,
       "height": 55,
-      "positionAbsolute": {
-        "x": 272,
-        "y": 2284.5820625712176
-      },
+      "positionAbsolute": { "x": 272, "y": 2284.5820625712176 },
       "dragging": false,
-      "style": {
-        "width": 20,
-        "height": 55
-      },
+      "style": { "width": 20, "height": 55 },
       "resizing": false,
       "focusable": true,
       "selectable": true
@@ -4347,26 +3025,18 @@
     {
       "id": "IDGTOlC_h3rt_3ZF4x8bG",
       "type": "label",
-      "position": {
-        "x": 205.39029212267985,
-        "y": 2236.300845579272
-      },
-      "selected": false,
+      "position": { "x": 205.39029212267985, "y": 2236.300845579272 },
+      "selected": true,
       "data": {
         "label": "Keep Learning",
         "href": "",
         "color": "#000000",
-        "style": {
-          "fontSize": 20
-        }
+        "style": { "fontSize": 20 }
       },
       "zIndex": 999,
       "width": 149,
       "height": 36,
-      "positionAbsolute": {
-        "x": 205.39029212267985,
-        "y": 2236.300845579272
-      },
+      "positionAbsolute": { "x": 205.39029212267985, "y": 2236.300845579272 },
       "dragging": false,
       "selectable": true,
       "focusable": true
@@ -4384,11 +3054,9 @@
       "sourceHandle": "x2",
       "target": "_hYN0gEi9BL24nptEtXWU",
       "targetHandle": "w1",
-      "data": {
-        "edgeStyle": "solid"
-      },
+      "data": { "edgeStyle": "solid" },
       "id": "XX0I26JoVMVXIe_7bVMix",
-      "selected": false,
+      "selected": true,
       "focusable": true,
       "selectable": true
     },
@@ -4403,11 +3071,9 @@
       "sourceHandle": "z2",
       "target": "idLHBxhvcIqZTqmh_E8Az",
       "targetHandle": "y1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
+      "data": { "edgeStyle": "dashed" },
       "id": "dFn6kGOoJ-0BzJJEb9DSG",
-      "selected": false,
+      "selected": true,
       "focusable": true,
       "selectable": true
     },
@@ -4422,11 +3088,9 @@
       "sourceHandle": "z2",
       "target": "os3Pa6W9SSNEzgmlBbglQ",
       "targetHandle": "y2",
-      "data": {
-        "edgeStyle": "dashed"
-      },
+      "data": { "edgeStyle": "dashed" },
       "id": "arkF7QJJRbCBYWp0crqa2",
-      "selected": false,
+      "selected": true,
       "focusable": true,
       "selectable": true
     },
@@ -4441,11 +3105,9 @@
       "sourceHandle": "z2",
       "target": "3oInpqvTSSC5_K6i7j8N7",
       "targetHandle": "y1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
+      "data": { "edgeStyle": "dashed" },
       "id": "HNVw8OboycWKLEtEbG2bn",
-      "selected": false,
+      "selected": true,
       "focusable": true,
       "selectable": true
     },
@@ -4460,11 +3122,9 @@
       "sourceHandle": "z2",
       "target": "YKhuRbcUFzo0hTvuTq-Yl",
       "targetHandle": "y1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
+      "data": { "edgeStyle": "dashed" },
       "id": "auB7Png72XjmhcLr3IJA7",
-      "selected": false,
+      "selected": true,
       "focusable": true,
       "selectable": true
     },
@@ -4479,11 +3139,9 @@
       "sourceHandle": "x2",
       "target": "hWA7RtuqltMTmHdcCnmES",
       "targetHandle": "y1",
-      "data": {
-        "edgeStyle": "solid"
-      },
+      "data": { "edgeStyle": "solid" },
       "id": "2aoDIr80lXSJLW1hIGUkb",
-      "selected": false,
+      "selected": true,
       "focusable": true,
       "selectable": true
     },
@@ -4497,11 +3155,9 @@
       "sourceHandle": "z2",
       "target": "NMznG9mo2wzNFnjhg990f",
       "targetHandle": "y1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
+      "data": { "edgeStyle": "dashed" },
       "id": "m-_y7nLeYFkUKGiacxWA0",
-      "selected": false,
+      "selected": true,
       "focusable": true,
       "selectable": true
     },
@@ -4515,11 +3171,9 @@
       "sourceHandle": "z2",
       "target": "gc_7cuIO2_joKlQRAPDfX",
       "targetHandle": "y1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
+      "data": { "edgeStyle": "dashed" },
       "id": "G7pXuJfkyt2nWAOHU8yV0",
-      "selected": false,
+      "selected": true,
       "focusable": true,
       "selectable": true
     },
@@ -4534,11 +3188,9 @@
       "sourceHandle": "x2",
       "target": "AvbMQ5vY3ip1oX_6Yq4ie",
       "targetHandle": "w2",
-      "data": {
-        "edgeStyle": "dashed"
-      },
+      "data": { "edgeStyle": "dashed" },
       "id": "2_6Yz3-Agx9_rEN5xW86c",
-      "selected": false,
+      "selected": true,
       "focusable": true,
       "selectable": true
     },
@@ -4553,11 +3205,9 @@
       "sourceHandle": "w2",
       "target": "1AJv95mTLpR7L8KBoGym8",
       "targetHandle": "x1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
+      "data": { "edgeStyle": "dashed" },
       "id": "kgMI98fg2-mKMgUs0wnjD",
-      "selected": false,
+      "selected": true,
       "focusable": true,
       "selectable": true
     },
@@ -4572,10 +3222,8 @@
       "sourceHandle": "y2",
       "target": "0etAs56EeBfh_0IlAaSra",
       "targetHandle": "w1",
-      "data": {
-        "edgeStyle": "solid"
-      },
-      "selected": false,
+      "data": { "edgeStyle": "solid" },
+      "selected": true,
       "id": "ts38Q2ceHs60TJscUBZVE",
       "focusable": true,
       "selectable": true
@@ -4591,11 +3239,9 @@
       "sourceHandle": "y2",
       "target": "h6ceO0kiBIxNRkPzN3hBY",
       "targetHandle": "z1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
+      "data": { "edgeStyle": "dashed" },
       "id": "ZiMV7umyPdhy3JJDcopR-",
-      "selected": false,
+      "selected": true,
       "focusable": true,
       "selectable": true
     },
@@ -4610,11 +3256,9 @@
       "sourceHandle": "y2",
       "target": "_JlT9oKQ6Yu4UX6l19G8P",
       "targetHandle": "z2",
-      "data": {
-        "edgeStyle": "dashed"
-      },
+      "data": { "edgeStyle": "dashed" },
       "id": "WI-MhbxrehFcVwyGJ5CQJ",
-      "selected": false,
+      "selected": true,
       "focusable": true,
       "selectable": true
     },
@@ -4629,11 +3273,9 @@
       "sourceHandle": "x2",
       "target": "jZ67HhVRelJaxjsCckSSI",
       "targetHandle": "w1",
-      "data": {
-        "edgeStyle": "solid"
-      },
+      "data": { "edgeStyle": "solid" },
       "id": "qUrLBzvXvJOg53HBfjrOI",
-      "selected": false,
+      "selected": true,
       "focusable": true,
       "selectable": true
     },
@@ -4648,13 +3290,11 @@
       "sourceHandle": "z2",
       "target": "HVHYJ8gWHCZMACuvKP7gK",
       "targetHandle": "z1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
+      "data": { "edgeStyle": "dashed" },
       "id": "reactflow__edge-wOqfPAZ24GxUrkxVRRyT5z2-wOqfPAZ24GxUrkxVRRyT5z1",
-      "selected": false,
+      "selected": true,
       "selectable": true,
       "focusable": true
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/src/data/roadmaps/ai-data-scientist/ai-data-scientist.md b/src/data/roadmaps/ai-data-scientist/ai-data-scientist.md
index 92697aa21..aec3b3421 100644
--- a/src/data/roadmaps/ai-data-scientist/ai-data-scientist.md
+++ b/src/data/roadmaps/ai-data-scientist/ai-data-scientist.md
@@ -3,10 +3,10 @@ jsonUrl: '/jsons/roadmaps/ai-data-scientist.json'
 pdfUrl: '/pdfs/roadmaps/ai-data-scientist.pdf'
 order: 5
 renderer: 'editor'
-briefTitle: 'AI and Data Scientist'
+briefTitle: 'AI and Data Scientist Roadmap'
 briefDescription: 'Step by step guide to becoming an AI and Data Scientist in 2025'
-title: 'AI and Data Scientist'
-description: 'Step by step guide to becoming an AI and Data Scientist in 2025'
+title: 'AI and Data Scientist Roadmap'
+description: 'Step by step roadmap guide to becoming an AI and Data Scientist in 2025'
 hasTopics: true
 isNew: false
 dimensions:
@@ -18,6 +18,52 @@ schema:
   imageUrl: 'https://roadmap.sh/roadmaps/ai-data-scientist.png'
   datePublished: '2023-08-17'
   dateModified: '2023-08-17'
+question:
+  title: 'What is a data scientist?'
+  description: |
+    A data scientist is a person who extracts actionable insights from data by using programming, statistics, machine learning, and domain knowledge.
+
+    That is a very generic description, however, the field of data science is so broad that it's tough to define the role without going into the specifics.
+
+    To give you an example of what a data scientist can do, take a closer look at the last selfie you took. Look at your face; what emotion are you showing? Are you happy? Sad? Crying? Laughing? All at the same time? For you, answering those questions is trivially simple; however, getting a computer to do it is a whole different problem.
+
+    And that's where data scientists come into play.
+
+    Data scientists take unstructured data (like video, photos, text files, etc) and structured data (like database rows, spreadsheets, etc) and figure out what it all means. By analyzing this data (some call it "big data"), they help companies make better decisions, such as understanding what customers want, how they feel about their products, or even predicting future trends.
+
+    They help find the hidden answers in the data, which is what makes this profession so appealing to some.
+
+    ## What does a data scientist do?
+
+    Most data scientists collect, organize, and study data to uncover useful insights. At a high level, here's a simple way to break that process down:
+
+    **Collecting Data:** They gather information from various sources, like websites, databases, or devices. Depending on the project, the sources of information might be very different, but the point is that once the data enters the domains of the data scientist, it's all 1's and 0's for them to process.
+
+    **Cleaning Data:** Before being able to use the data, they need to ensure the data is formatted correctly, doesn't have any holes, and that the values actually make sense within the context of their source (i.e., that there are not too many "outliers"). They fix these mistakes and make sure the data is ready to use.
+
+    **Analyzing Data:** They use tools and techniques, like exploratory data analysis, charts, or algorithms, to find patterns and trends.
+
+    **Sharing Insights:** Once they're done with their analysis, the last step is sharing the results. Data scientists explain their findings in easy-to-understand ways, often with visuals, so that others can take action based on the data.
+
+    For example, using these steps, a data scientist might help a company predict which products will sell best next month based on historical sales data and customer trends.
+
+    ## How do you become a data scientist?
+
+    There is no single way to become a data scientist, however, the journey usually involves these steps:
+
+    **#1. Learn the Basics:** Start with math (like statistics) and programming (Python or R) to understand and process data efficiently.
+
+    **#2.** Practice with Data: Begin with small projects, like analyzing trends or creating charts, and gradually tackle more complex goals.
+
+    **#3. Take Courses:** Use online classes and tutorials to learn Data Science step by step.
+
+    **#4. Build a Portfolio:** Solve real-world problems and share your work to showcase your skills and attract opportunities.
+
+    **#5. Get Experience:** Seek internships or entry-level roles to apply and grow your skills.
+
+    In the end, you have to keep in mind that this is a marathon, not a race. Rushing through knowledge or cutting corners for the sake of speed will only limit your options and your understanding by the time you actually do get the job.
+
+    With curiosity and practice, anyone can start exploring the world of Data Science.
 seo:
   title: 'AI and Data Scientist Roadmap'
   description: 'Learn to become an AI and Data Scientist using this roadmap. Community driven, articles, resources, guides, interview questions, quizzes for modern backend development.'
diff --git a/src/data/roadmaps/ai-data-scientist/content/machine-learning@kBdt_t2SvVsY3blfubWIz.md b/src/data/roadmaps/ai-data-scientist/content/machine-learning@kBdt_t2SvVsY3blfubWIz.md
index 04ad4c37e..091e6532b 100644
--- a/src/data/roadmaps/ai-data-scientist/content/machine-learning@kBdt_t2SvVsY3blfubWIz.md
+++ b/src/data/roadmaps/ai-data-scientist/content/machine-learning@kBdt_t2SvVsY3blfubWIz.md
@@ -4,6 +4,6 @@ Machine learning is a field of artificial intelligence that uses statistical tec
 
 Learn more from the following resources:
 
-- [@article@Advantages and Disadvantages of AI](https://towardsdatascience.com/advantages-and-disadvantages-of-artificial-intelligence-182a5ef6588c)
-- [@article@Reinforcement Learning 101](https://towardsdatascience.com/reinforcement-learning-101-e24b50e1d292)
-- [@article@Understanding AUC-ROC Curve](https://towardsdatascience.com/understanding-auc-roc-curve-68b2303cc9c5)
\ No newline at end of file
+- [@article@Advantages and Disadvantages of AI](https://medium.com/@laners.org/advantages-and-disadvantages-of-artificial-intelligence-cd6e42819b20)
+- [@article@Reinforcement Learning 101](https://medium.com/towards-data-science/reinforcement-learning-101-e24b50e1d292)
+- [@article@Understanding AUC-ROC Curve](https://medium.com/towards-data-science/understanding-auc-roc-curve-68b2303cc9c5)
diff --git a/src/data/roadmaps/ai-data-scientist/faqs.astro b/src/data/roadmaps/ai-data-scientist/faqs.astro
index e69de29bb..aeb3b180a 100644
--- a/src/data/roadmaps/ai-data-scientist/faqs.astro
+++ b/src/data/roadmaps/ai-data-scientist/faqs.astro
@@ -0,0 +1,116 @@
+---
+import type { FAQType } from '../../components/FAQs/FAQs.astro';
+
+export const faqs: FAQType[] = [
+  {
+    question: 'What degree do you need to become a data scientist?',
+    answer: [
+      "You don't need a specific degree to become a data scientist, but fields like Computer Science, Mathematics, Statistics, or Engineering are helpful for their focus on programming, algorithms, and databases.",
+      'Degrees in Physics, Economics, or Social Sciences also provide critical thinking and research skills valuable for analyzing data.',
+      'Recently, many have transitioned into Data Science through bootcamps or online courses, highlighting the importance of practical skills over formal degrees.',
+    ],
+  },
+  {
+    question: 'Is becoming a data scientist a good career path?',
+    answer: [
+      'Yes, [becoming a data scientist is a good career path](https://roadmap.sh/ai-data-scientist/career-path) for many reasons, although all of them stem from the same one: technology is generating more and more data every day, and making sense of it is crucial for any business. The main derived reasons validating data science as a great career choice are:',
+      '**High Demand:** Companies in almost every industry need data scientists to help them make sense of their data. This creates plenty of job opportunities.',
+      '**Competitive Salaries:** Data Science is one of the highest-paying fields in tech, making it financially rewarding.',
+      '**Diverse Applications:** Getting bored in the field of data science is quite a challenge. If you think about it, data science skills can be applied in healthcare, finance, marketing, sports, and more, offering flexibility in choosing industries.',
+      '**Continuous Learning:** The field evolves quickly, which makes it exciting for those who love learning and staying up-to-date with new tools and techniques.',
+      '**Impactful Work:** Data scientists solve real-world problems, like predicting diseases, optimizing business processes, or making products more user-friendly.',
+      'While the path requires dedication and learning, the rewards—both professional and personal—make it a worthwhile choice for those who enjoy working with data and solving problems.',
+    ],
+  },
+  {
+    question: 'What are data scientist salaries like?',
+    answer: [
+      'Data scientist salaries vary based on factors such as location, experience, and industry, making them very hard to average and provide values that are useful to everyone around the globe.',
+      "Here's an overview of average annual salaries for entry-level data scientists in various regions based on information gathered from Glassdoor and Indeed:",
+      'In the United States, according to Glassdoor, the average salary for an entry-level data scientist is approximately $110k per year. Indeed, on the other hand, reports an average salary of around $54,313 per year for entry-level data scientists.',
+      "For European countries, like Spain, for example, the average salary for an entry-level data scientist is about $40k per year. In the **United Kingdom**, while there aren't a lot of details for entry-level positions, reports show that the average salary for a data scientist in London is £50k per year, suggesting that entry-level positions may start lower.",
+      'Finally, in **Canada**, the average salary for entry-level data scientists is around CAD 88k.',
+      'Remember that all these figures are averages and can vary based on individual qualifications, specific job roles, the employing organization, and even your ability to negotiate your salary.',
+      'However, generally speaking, Data Science is considered a well-compensated field with opportunities for growth and advancement.',
+    ],
+  },
+  {
+    question: 'What skills does a data scientist need?',
+    answer: [
+      'The most important [data science skills](https://roadmap.sh/ai-data-scientist/skills) a data scientist needs to possess are all listed in this roadmap.',
+      'At a high level, a data scientist needs a mix of technical and soft skills to succeed. Here are some of the key skills:',
+      '**Programming:** Knowing Python, R, or [SQL](https://roadmap.sh/sql) is a big plus, as relying on others to deploy your work can be limiting.',
+      '**Statistics & Math:** Essential for interpreting and modeling data, focusing on statistics, probability, and linear algebra.',
+      '**Data Visualization:** Master creating charts, graphs, and dashboards to effectively share your findings.',
+      '**Machine Learning:** Understand algorithms and models for predicting and classifying data.',
+      '**Big Data Tools:** Basic knowledge of Hadoop or Spark helps in handling large datasets and collaborating with data engineers.',
+      '**Data Wrangling:** Cleaning and prepping messy data is a must-have skill.',
+      '**Critical Thinking:** Asking the right questions and solving novel problems is key.',
+      '**Communication:** Simplify complex findings for stakeholders.',
+      '**Domain Knowledge:** Knowing your industry (e.g., finance or healthcare) helps you choose the right tools and approaches.',
+      'These skills combined will help data scientists extract actionable insights from data and drive decision-making in organizations.',
+    ],
+  },
+  {
+    question: 'What tools do data scientists use?',
+    answer: [
+      "The [tools used by data scientists](https://roadmap.sh/ai-data-scientist/tools) vary quite a lot depending on the projects they're working on, the industry they're in, and even on their focus (whether they're purely theoretical data scientists or if they're also writing production-ready code).",
+      'That said, here are some of the most common tools used in the data science field:',
+      '**Programming Languages:** **Python** is one of the most popular programming languages for data analysis, machine learning, and visualization. It is also ideal for developing microservices that make your ML models available to the public. On the other hand, something like R would be perfect for statistical computing and data visualization. Finally, **SQL** is used to query and manage databases.',
+      "**Data Manipulation and Analysis Tools:** Libraries like **Pandas** and **NumPy** are industry standards for data manipulation in Python. If you're using R instead, check out Dplyr and Tidyr; they're both great for data manipulation in that language. Both quantitative and qualitative data are processed and analyzed using tools like Pandas, NumPy, Dplyr, and Tidyr.",
+      '**Data Visualization Tools:** Tableau and Power BI are some of the most used tools for creating interactive dashboards. If, on the other hand, you require more control and customization, you might want to look at Matplotlib and Seaborn; they are Python libraries for generating graphs and plots.',
+      "**Machine Learning Frameworks:** In this case, there aren't that many options; the industry is currently focusing on Scikit-learn, a Python library for machine learning, TensorFlow, and PyTorch, which focus more on deep learning applications.",
+      '**Big Data Tools:** Hadoop and Spark are de facto standards at this point for handling and processing large datasets.',
+      "**Databases:** If you're looking into SQL, MySQL, and [PostgreSQL](https://roadmap.sh/postgresql-dba), they are your best bets. For NoSQL, a great starting point is MongoDB.",
+      "**Cloud Platforms:** In this category, nothing beats the 3 big ones: **AWS**, **Google Cloud**, and **Azure**. If you're looking for scalable storage, processing, and machine learning services, you've found your answers.",
+      '**Version Control:** In terms of industry standards, **Git** is pretty much alone here.',
+      '**Collaboration Tools:** **Jupyter Notebooks** and **RStudio** are designed for sharing code and analysis in an interactive format.',
+    ],
+  },
+  {
+    question: 'What is the Data Science Lifecycle?',
+    answer: [
+      'The [Data Science Lifecycle](https://roadmap.sh/ai-data-scientist/lifecycle) is the process data scientists follow to complete a data science project.',
+      'It consists of several stages:',
+      '**Problem Definition:** Clearly define the problem you want to solve and understand the objectives.',
+      '**Data Collection:** Gather relevant data from various sources, such as databases, APIs, or external datasets.',
+      "**Data Preparation:** Clean, organize, and preprocess the data to ensure it's ready for analysis. This includes handling missing values, removing duplicates, and formatting data correctly.",
+      '**Exploratory Data Analysis (EDA):** Analyze the data to identify patterns, trends, and relationships. Use visualization tools to gain insights.',
+      '**Model Building:** Develop and train machine learning models or statistical algorithms to solve the problem.',
+      "**Model Evaluation:** Test the model's performance using metrics like accuracy, precision, recall, or F1 score to ensure it meets the objectives.",
+      '**Deployment:** Integrate the model into production systems so it can be used in real-world applications.',
+      "**Monitoring and Maintenance:** Continuously monitor the model's performance and update it as needed to adapt to new data or changing requirements.",
+      'With these steps, data scientists ensure that they cover all the basics when working on a project, from ideation to production release.',
+    ],
+  },
+  {
+    question: 'How are data scientists different from AI Engineers?',
+    answer: [
+      "Data scientists are different from [AI Engineers](https://roadmap.sh/ai-engineer), however, they're often confused due to overlapping skills.",
+      'For **data scientists**, the focus is to analyze data and uncover insights, while in the case of **AI Engineers**, their focus is on building, deploying, and maintaining AI systems. **Data scientists** tend to be great at data manipulation (Python, R, SQL) and statistical analysis, while **AI Engineers** are quite skilled in software engineering, programming, and machine learning frameworks.',
+      'In the end, **data scientists** will provide insights, reports, and predictive models. While **AI Engineers** will deliver AI-powered applications, APIs, and scalable systems.',
+    ],
+  },
+  {
+    question: 'What is the difference between Data Science and Data Analytics?',
+    answer: [
+      "The difference between [data science and data analytics](https://roadmap.sh/ai-data-scientist/vs-data-analytics) might not be obvious at first sight, but it's a big one once you look closer into both roles. Data science involves creating predictive models, applying statistical methods, and exploring data to uncover insights. It usually includes advanced techniques such as machine learning. Data analysts, on the other hand, focus on analyzing current and historical data to answer specific questions and generate reports or dashboards, often with less emphasis on predictive modeling or advanced algorithms.",
+    ],
+  },
+  {
+    question:
+      'What is the difference between Data Science and Data Engineering?',
+    answer: [
+      'The main difference between data science and data engineering is their focus.',
+      'Data Science focuses on analyzing and modeling data to extract insights and make predictions. It emphasizes statistics, machine learning, and visualization. Data engineering involves building and maintaining the infrastructure and pipelines needed to collect, store, and process data efficiently from multiple data sources. Data engineers ensure that data scientists have clean, accessible, and reliable data for their analyses.',
+    ],
+  },
+  {
+    question: 'How long does it take to become a data scientist?',
+    answer: [
+      "Becoming a data scientist can take between 1 to 3 years, on average, considering a focused approach. Of course, keep in mind that this answer will highly depend on your approach to becoming a data scientist and your prior experience. And if you're aiming for a position as a senior data scientist, the time to get there will increase significantly if you haven't started yet.",
+      'A strong foundation in programming, statistics, and ML is essential for this to happen. Many achieve this through a combination of formal education, such as a degree or certification program, and hands-on projects to build practical skills.',
+    ],
+  },
+];
+---
diff --git a/src/data/roadmaps/ai-engineer/ai-engineer.json b/src/data/roadmaps/ai-engineer/ai-engineer.json
index 53f4c916b..589e2e95f 100644
--- a/src/data/roadmaps/ai-engineer/ai-engineer.json
+++ b/src/data/roadmaps/ai-engineer/ai-engineer.json
@@ -1 +1 @@
-{"nodes":[{"id":"xgDW3VKPFxsHzV37ZEBtt","type":"paragraph","position":{"x":61.5,"y":-100.15106699547101},"selected":true,"data":{"label":"Pre-requisites (One of these)","style":{"fontSize":17,"borderColor":"#000000","backgroundColor":"#ffffff","color":"#000000","textAlign":"center","justifyContent":"flex-start","padding":16}},"zIndex":999,"width":388,"height":124,"positionAbsolute":{"x":61.5,"y":-100.15106699547101},"dragging":false,"style":{"width":388,"height":124},"resizing":false,"focusable":true,"selectable":true},{"id":"2d12fAvrDGrpBHvIbT2c0","type":"paragraph","position":{"x":60.5,"y":40.33286386694641},"selected":true,"data":{"label":"Scrimba is offering 20% off to roadmap users on their AI Engineer course that covers this roadmap in depth. Check them out!","style":{"fontSize":17,"borderColor":"#000000","backgroundColor":"#ffffff","color":"#000000","textAlign":"center","justifyContent":"flex-start","padding":16}},"zIndex":999,"width":388,"height":166,"positionAbsolute":{"x":60.5,"y":40.33286386694641},"dragging":false,"style":{"width":388,"height":166},"resizing":false,"selectable":true,"focusable":true},{"id":"f7f_Pt8Ymq65FYDn0RTx0","type":"vertical","position":{"x":567.6567530029688,"y":3212.4007482223487},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":98,"style":{"width":20,"height":98},"positionAbsolute":{"x":567.6567530029688,"y":3212.4007482223487},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"cWm7uchA7HllHWHMET2Qy","type":"horizontal","position":{"x":730,"y":2957.9007482223487},"selected":true,"data":{"label":"horizontal node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":107,"height":20,"style":{"width":107,"height":20},"positionAbsolute":{"x":730,"y":2957.9007482223487},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"mag6fPpJF15RiIN9eAlE9","type":"section","position":{"x":837.4985923959754,"y":2922.9007482223487},"width":307,"height":376,"style":{"width":307,"height":376},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":837.4985923959754,"y":2922.9007482223487},"dragging":false,"selectable":true,"focusable":true},{"id":"P2fcMXV6vhm6MMMiBmy3r","type":"section","position":{"x":64.99859239597538,"y":2997.4007482223487},"width":278,"height":376,"style":{"width":278,"height":376},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":64.99859239597538,"y":2997.4007482223487},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"k8QYMT_d6EQWDqDgnPYsT","type":"section","position":{"x":840.3202732289765,"y":2655.9840127727616},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":296,"height":216,"style":{"width":296,"height":216},"dragging":false,"resizing":false,"positionAbsolute":{"x":840.3202732289765,"y":2655.9840127727616},"selectable":true,"focusable":true},{"id":"Lk-hBhJoaDCs6Dzq0d0I2","type":"vertical","position":{"x":570,"y":2652.7263937544244},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":117,"style":{"width":20,"height":117},"positionAbsolute":{"x":570,"y":2652.7263937544244},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"1_t82YAvkh8SCiyU_Otp8","type":"vertical","position":{"x":677,"y":2288.715898273103},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":1110,"style":{"width":20,"height":1110},"positionAbsolute":{"x":677,"y":2288.715898273103},"dragging":false,"resizing":false,"focusable":true,"selectable":true},{"id":"RSb6002qr_JXVKuIq40z2","type":"section","position":{"x":838.3356614935651,"y":2442.7243958663935},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":296,"height":186,"style":{"width":296,"height":186},"resizing":false,"positionAbsolute":{"x":838.3356614935651,"y":2442.7243958663935},"dragging":false,"selectable":true,"focusable":true},{"id":"zK_H4vmJXmyLYu1gVfhYK","type":"section","position":{"x":838.7247553252009,"y":2126.715898273103},"width":296,"height":331,"style":{"width":296,"height":331},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":838.7247553252009,"y":2126.715898273103},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"P7hG9GgyNRlmofosVs3ky","type":"vertical","position":{"x":88.5,"y":2319.227661473262},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"},"oldId":"hHhz7UIZIFgubv6pn5iKn"},"zIndex":999,"width":20,"height":60,"style":{"width":20,"height":60},"positionAbsolute":{"x":88.5,"y":2319.227661473262},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"1C4ZyHDYbp-ykYMBgGCgJ","type":"vertical","position":{"x":256.93627316762456,"y":2145.4100232103433},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":104,"style":{"width":20,"height":104},"positionAbsolute":{"x":256.93627316762456,"y":2145.4100232103433},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"hHhz7UIZIFgubv6pn5iKn","type":"vertical","position":{"x":88.5,"y":2008.0927158417944},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":226,"style":{"width":20,"height":226},"positionAbsolute":{"x":88.5,"y":2008.0927158417944},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"qrUpems5ggl3QG6PU5B9R","type":"section","position":{"x":63.77391817001211,"y":2735.4283305550825},"width":278,"height":164,"style":{"width":278,"height":164},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":63.77391817001211,"y":2735.4283305550825},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"UtzHMjmoyxrD9wHWWyfKI","type":"section","position":{"x":63.77391817001211,"y":2412.7263937544244},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":278,"height":331,"style":{"width":278,"height":331},"resizing":false,"positionAbsolute":{"x":63.77391817001211,"y":2412.7263937544244},"dragging":false,"selectable":true,"focusable":true},{"id":"4P2Sbyy2cVjOrXH75Hc2b","type":"section","position":{"x":487.3795624782034,"y":1896.0927158417944},"width":266,"height":272,"style":{"width":266,"height":272},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":487.3795624782034,"y":1896.0927158417944},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"OFEVSFDYuVn912lbBFEGV","type":"section","position":{"x":841.6087863651624,"y":1830.4687120415522},"width":295,"height":150,"style":{"width":295,"height":150},"selected":true,"data":{},"positionAbsolute":{"x":841.6087863651624,"y":1830.4687120415522},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"LVQKjfoO_nwMlmudTR5xf","type":"section","position":{"x":841.6087863651624,"y":1426.9424648726686},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":295,"height":372,"style":{"width":295,"height":372},"resizing":false,"dragging":false,"positionAbsolute":{"x":841.6087863651624,"y":1426.9424648726686},"selectable":true,"focusable":true},{"id":"Xj67gyzaoFU0809zao-Co","type":"horizontal","position":{"x":394.4565453870415,"y":1222.1146370882086},"selected":true,"data":{"label":"horizontal node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":139,"height":20,"style":{"width":139,"height":20},"positionAbsolute":{"x":394.4565453870415,"y":1222.1146370882086},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"s9fTyULS5azkrxwnXF3ZM","type":"section","position":{"x":65.4565453870415,"y":1189.060087180349},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":329,"height":599,"style":{"width":329,"height":599},"resizing":false,"positionAbsolute":{"x":65.4565453870415,"y":1189.060087180349},"dragging":false,"selectable":true,"focusable":true},{"id":"eilmLpxqlfX17bCbDDt5A","type":"horizontal","position":{"x":676.5,"y":1001.400748222349},"selected":true,"data":{"label":"horizontal node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":182,"height":20,"style":{"width":182,"height":20},"positionAbsolute":{"x":676.5,"y":1001.400748222349},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"QLCmjm7FEloKbKgZd69mp","type":"section","position":{"x":842.3618127280065,"y":902.900748222349},"width":298,"height":217,"style":{"width":298,"height":217},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":842.3618127280065,"y":902.900748222349},"dragging":false,"selectable":true,"focusable":true},{"id":"Nr60kOmUmudHb1H_ktoQh","type":"section","position":{"x":65.4565453870415,"y":784.900748222349},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":329,"height":378,"style":{"width":329,"height":378},"resizing":false,"dragging":false,"positionAbsolute":{"x":65.4565453870415,"y":784.900748222349},"selectable":true,"focusable":true},{"id":"CVA5JJQfQbLhUpq98LxxZ","type":"section","position":{"x":65.4565453870415,"y":590.900748222349},"width":329,"height":197,"style":{"width":329,"height":197},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":65.4565453870415,"y":590.900748222349},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"BO_Wx-cxY7Cr4U-9x-fpD","type":"section","position":{"x":842.3618127280065,"y":334.40074822234897},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":298,"height":430,"style":{"width":298,"height":430},"resizing":false,"positionAbsolute":{"x":842.3618127280065,"y":334.40074822234897},"selectable":true,"focusable":true,"dragging":false},{"width":189,"height":68,"id":"iogwMmOvub2ZF4zgg6WyF","type":"title","position":{"x":526.5,"y":-9.599251777651034},"selected":true,"data":{"label":"AI Engineer","style":{"fontSize":28,"justifyContent":"flex-start","textAlign":"center"},"oldId":"9nxw2PEl-_eQPW0FHNPq2"},"zIndex":999,"dragging":false,"positionAbsolute":{"x":526.5,"y":-9.599251777651034},"focusable":true,"selectable":true},{"width":202,"height":49,"id":"_hYN0gEi9BL24nptEtXWU","type":"topic","position":{"x":520,"y":253.37833957831333},"selected":true,"data":{"label":"Introduction","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"c1edrcSmHO_L2e9DGh7st"},"zIndex":999,"style":{"width":202,"height":49},"resizing":false,"positionAbsolute":{"x":520,"y":253.37833957831333},"dragging":false,"focusable":true,"selectable":true},{"id":"GN6SnI7RXIeW8JeD-qORW","type":"subtopic","position":{"x":842.3618127280065,"y":226.40074822234897},"selected":true,"data":{"label":"What is an AI Engineer?","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":298,"height":49,"style":{"width":298,"height":49},"positionAbsolute":{"x":842.3618127280065,"y":226.40074822234897},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"jSZ1LhPdhlkW-9QJhIvFs","type":"subtopic","position":{"x":842.3618127280065,"y":279.40074822234897},"selected":true,"data":{"label":"AI Engineer vs ML Engineer","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":298,"height":49,"style":{"width":298,"height":49},"positionAbsolute":{"x":842.3618127280065,"y":279.40074822234897},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"wf2BSyUekr1S1q6l8kyq6","type":"subtopic","position":{"x":1011.8618127280065,"y":342.90074822234897},"selected":true,"data":{"label":"LLMs","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":119,"height":49,"style":{"width":119,"height":49},"resizing":false,"positionAbsolute":{"x":1011.8618127280065,"y":342.90074822234897},"dragging":false,"selectable":true,"focusable":true},{"id":"KWjD4xEPhOOYS51dvRLd2","type":"subtopic","position":{"x":851.8618127280066,"y":396.40074822234897},"selected":true,"data":{"label":"Inference","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"Qh4ivGbpmhhCnhAMrlpI5"},"zIndex":999,"width":279,"height":49,"style":{"width":279,"height":49},"positionAbsolute":{"x":851.8618127280066,"y":396.40074822234897},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"xostGgoaYkqMO28iN2gx8","type":"subtopic","position":{"x":851.8618127280066,"y":448.90074822234897},"selected":true,"data":{"label":"Training","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":279,"height":49,"style":{"width":279,"height":49},"positionAbsolute":{"x":851.8618127280066,"y":448.90074822234897},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"XyEp6jnBSpCxMGwALnYfT","type":"subtopic","position":{"x":851.8618127280066,"y":501.40074822234897},"selected":true,"data":{"label":"Embeddings","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":279,"height":49,"style":{"width":279,"height":49},"positionAbsolute":{"x":851.8618127280066,"y":501.40074822234897},"selectable":true,"focusable":true,"dragging":false,"resizing":true},{"id":"LnQ2AatMWpExUHcZhDIPd","type":"subtopic","position":{"x":851.8618127280066,"y":553.900748222349},"selected":true,"data":{"label":"Vector Databases","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":279,"height":49,"style":{"width":279,"height":49},"positionAbsolute":{"x":851.8618127280066,"y":553.900748222349},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"9JwWIK0Z2MK8-6EQQJsCO","type":"subtopic","position":{"x":1011.8618127280065,"y":605.900748222349},"selected":true,"data":{"label":"RAG","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":119,"height":49,"style":{"width":119,"height":49},"resizing":false,"positionAbsolute":{"x":1011.8618127280065,"y":605.900748222349},"dragging":false,"selectable":true,"focusable":true},{"id":"Dc15ayFlzqMF24RqIF_-X","type":"subtopic","position":{"x":851.8618127280066,"y":658.900748222349},"selected":true,"data":{"label":"Prompt Engineering","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":279,"height":49,"style":{"width":279,"height":49},"positionAbsolute":{"x":851.8618127280066,"y":658.900748222349},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"9XCxilAQ7FRet7lHQr1gE","type":"subtopic","position":{"x":851.8618127280066,"y":606.400748222349},"selected":true,"data":{"label":"AI Agents","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":155,"height":49,"style":{"width":155,"height":49},"positionAbsolute":{"x":851.8618127280066,"y":606.400748222349},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"5QdihE1lLpMc3DFrGy46M","type":"subtopic","position":{"x":851.8618127280066,"y":342.90074822234897},"selected":true,"data":{"label":"AI vs AGI","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":155,"height":49,"style":{"width":155,"height":49},"resizing":false,"dragging":false,"positionAbsolute":{"x":851.8618127280066,"y":342.90074822234897},"selectable":true,"focusable":true},{"id":"yd1VRnSOeOzXF8fgl7CW4","type":"label","position":{"x":911.3618127280066,"y":717.400748222349},"selected":true,"data":{"label":"Common Terminology","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":182,"height":36,"style":{},"positionAbsolute":{"x":911.3618127280066,"y":717.400748222349},"dragging":false,"selectable":true,"focusable":true},{"id":"yHmHXymPNWwu8p1vvqD3o","type":"paragraph","position":{"x":808.4971847919508,"y":-105.15106699547101},"selected":true,"data":{"label":"Find the detailed version of this roadmap along with other similar roadmaps","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left","borderColor":"#000000","backgroundColor":"#FFFFFf"}},"zIndex":999,"width":354,"height":143,"positionAbsolute":{"x":808.4971847919508,"y":-105.15106699547101},"dragging":false,"selectable":true,"focusable":true,"style":{"width":354,"height":143},"resizing":false},{"id":"2zqZkyVgigifcRS1H7F_b","type":"button","position":{"x":821.7005592047509,"y":-23.165503577725815},"selected":true,"data":{"label":"roadmap.sh","href":"https://roadmap.sh","color":"#ffffff","backgroundColor":"#4136D6","style":{"fontSize":17}},"zIndex":999,"width":329,"height":49,"dragging":false,"style":{"width":329,"height":49},"resizing":false,"positionAbsolute":{"x":821.7005592047509,"y":-23.165503577725815},"selectable":true,"focusable":true},{"id":"5Irad96FtU3TkNZRK7x_8","type":"vertical","position":{"x":610.3795624782034,"y":-116.59925177765109},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":101,"style":{"width":20,"height":101},"positionAbsolute":{"x":610.3795624782034,"y":-116.59925177765109},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"MJvTQei3yqAMdLf5dACls","type":"button","position":{"x":71.5,"y":-44.62166042168667},"selected":true,"data":{"label":"Frontend","href":"https://roadmap.sh/frontend","color":"#000000","backgroundColor":"#d1d1d1","style":{"fontSize":17}},"zIndex":999,"width":127,"height":49,"style":{"width":127,"height":49},"positionAbsolute":{"x":71.5,"y":-44.62166042168667},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"9Vh9mUCXrYpTqEZexLW1L","type":"button","position":{"x":203,"y":-44.62166042168667},"selected":true,"data":{"label":"Backend","href":"https://roadmap.sh/backend","color":"#000000","backgroundColor":"#D1D1D1","style":{"fontSize":17}},"zIndex":999,"width":110,"height":49,"style":{"width":110,"height":49},"positionAbsolute":{"x":203,"y":-44.62166042168667},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"259d3vMaiFwnLF6ZecFyP","type":"button","position":{"x":317.5,"y":-44.62166042168667},"selected":true,"data":{"label":"Full-Stack","href":"https://roadmap.sh/full-stack","color":"#000000","backgroundColor":"#D1D1D1","style":{"fontSize":17}},"zIndex":999,"width":122,"height":49,"style":{"width":122,"height":49},"positionAbsolute":{"x":317.5,"y":-44.62166042168667},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"qJVgKe9uBvXc-YPfvX_Y7","type":"subtopic","position":{"x":842.3618127280065,"y":79.37833957831333},"selected":true,"data":{"label":"Impact on Product Development","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":298,"height":49,"style":{"width":298,"height":49},"positionAbsolute":{"x":842.3618127280065,"y":79.37833957831333},"dragging":false,"selectable":true,"focusable":true},{"id":"K9EiuFgPBFgeRxY4wxAmb","type":"subtopic","position":{"x":842.3618127280065,"y":132.37833957831333},"selected":true,"data":{"label":"Roles and Responsiblities","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":298,"height":49,"style":{"width":298,"height":49},"positionAbsolute":{"x":842.3618127280065,"y":132.37833957831333},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"wt_3LocKHpvsnsQdDI7LK","type":"paragraph","position":{"x":452.5,"y":378.40074822234897},"selected":true,"data":{"label":"Using Pre-trained Models","style":{"fontSize":20,"borderColor":"transparent","backgroundColor":"transparent","color":"#000000","textAlign":"center","justifyContent":"flex-start","padding":16}},"zIndex":999,"width":337,"height":67,"style":{"width":337,"height":67},"positionAbsolute":{"x":452.5,"y":378.40074822234897},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"d7fzv_ft12EopsQdmEsel","type":"topic","position":{"x":497,"y":510.40074822234897},"selected":true,"data":{"label":"Pre-trained Models","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":248,"height":49,"style":{"width":248,"height":49},"positionAbsolute":{"x":497,"y":510.40074822234897},"selectable":true,"focusable":true,"resizing":false,"dragging":false},{"id":"1Ga6DbOPc6Crz7ilsZMYy","type":"subtopic","position":{"x":65.4565453870415,"y":458.40074822234897},"selected":true,"data":{"label":"Benefits of Pre-trained Models","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":329,"height":49,"style":{"width":329,"height":49},"positionAbsolute":{"x":65.4565453870415,"y":458.40074822234897},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"MXqbQGhNM3xpXlMC2ib_6","type":"subtopic","position":{"x":65.4565453870415,"y":511.40074822234897},"selected":true,"data":{"label":"Limitations and Considerations","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":329,"height":49,"style":{"width":329,"height":49},"positionAbsolute":{"x":65.4565453870415,"y":511.40074822234897},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"ytU145_ip3ePMRKaroV-Z","type":"label","position":{"x":154,"y":791.900748222349},"selected":true,"data":{"label":"Popular AI Models","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":156,"height":36,"style":{},"positionAbsolute":{"x":154,"y":791.900748222349},"dragging":false,"selectable":true,"focusable":true},{"id":"2WbVpRLqwi3Oeqk1JPui4","type":"subtopic","position":{"x":78.5,"y":623.400748222349},"selected":true,"data":{"label":"Open AI Models","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":304,"height":49,"style":{"width":304,"height":49},"positionAbsolute":{"x":78.5,"y":623.400748222349},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"vvpYkmycH0_W030E-L12f","type":"subtopic","position":{"x":78.5,"y":676.400748222349},"selected":true,"data":{"label":"Capabilities / Context Length","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":304,"height":49,"style":{"width":304,"height":49},"positionAbsolute":{"x":78.5,"y":676.400748222349},"selectable":true,"focusable":true,"dragging":false},{"id":"LbB2PeytxRSuU07Bk0KlJ","type":"subtopic","position":{"x":78.5,"y":729.400748222349},"selected":true,"data":{"label":"Cut-off Dates / Knowledge","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":304,"height":49,"style":{"width":304,"height":49},"positionAbsolute":{"x":78.5,"y":729.400748222349},"dragging":false,"selectable":true,"focusable":true},{"id":"hy6EyKiNxk1x84J63dhez","type":"subtopic","position":{"x":78.5,"y":832.900748222349},"selected":true,"data":{"label":"Anthropic's Claude","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":304,"height":49,"style":{"width":304,"height":49},"positionAbsolute":{"x":78.5,"y":832.900748222349},"selectable":true,"focusable":true,"dragging":false},{"id":"oe8E6ZIQWuYvHVbYJHUc1","type":"subtopic","position":{"x":78.5,"y":885.900748222349},"selected":true,"data":{"label":"Google's Gemini","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":304,"height":49,"style":{"width":304,"height":49},"positionAbsolute":{"x":78.5,"y":885.900748222349},"selectable":true,"focusable":true,"dragging":false},{"id":"3PQVZbcr4neNMRr6CuNzS","type":"subtopic","position":{"x":78.5,"y":938.900748222349},"selected":true,"data":{"label":"Azure AI","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":113,"height":49,"style":{"width":113,"height":49},"positionAbsolute":{"x":78.5,"y":938.900748222349},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"OkYO-aSPiuVYuLXHswBCn","type":"subtopic","position":{"x":194.47059387846707,"y":938.900748222349},"selected":true,"data":{"label":"AWS Sagemaker","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":189,"height":49,"style":{"width":189,"height":49},"positionAbsolute":{"x":194.47059387846707,"y":938.900748222349},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"8XjkRqHOdyH-DbXHYiBEt","type":"subtopic","position":{"x":78.5,"y":992.8781089665497},"selected":true,"data":{"label":"Hugging Face Models","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":304,"height":49,"style":{"width":304,"height":49},"positionAbsolute":{"x":78.5,"y":992.8781089665497},"selectable":true,"focusable":true,"dragging":false},{"id":"n-Ud2dXkqIzK37jlKItN4","type":"subtopic","position":{"x":79.5,"y":1044.8781089665497},"selected":true,"data":{"label":"Mistral AI","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":158,"height":49,"style":{"width":158,"height":49},"positionAbsolute":{"x":79.5,"y":1044.8781089665497},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"a7qsvoauFe5u953I699ps","type":"subtopic","position":{"x":240.5,"y":1044.8781089665497},"selected":true,"data":{"label":"Cohere","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":142,"height":49,"style":{"width":142,"height":49},"positionAbsolute":{"x":240.5,"y":1044.8781089665497},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"5ShWZl1QUqPwO-NRGN85V","type":"subtopic","position":{"x":65.4565453870415,"y":566.400748222349},"selected":true,"data":{"label":"OpenAI Models","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center","colorType":"c"}},"zIndex":999,"width":329,"height":49,"style":{"width":329,"height":49},"resizing":false,"positionAbsolute":{"x":65.4565453870415,"y":566.400748222349},"dragging":false,"selectable":true,"focusable":true},{"id":"wr2_2ADvySOUZxzEo1Uw1","type":"paragraph","position":{"x":507,"y":707.900748222349},"selected":true,"data":{"label":"Open AI Platform","style":{"fontSize":20,"borderColor":"transparent","backgroundColor":"transparent","color":"#000000","textAlign":"center","justifyContent":"flex-start","padding":16},"oldId":"wt_3LocKHpvsnsQdDI7LK"},"zIndex":999,"width":228,"height":66,"style":{"width":228,"height":66},"positionAbsolute":{"x":507,"y":707.900748222349},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"zdeuA4GbdBl2DwKgiOA4G","type":"topic","position":{"x":528,"y":986.900748222349},"selected":true,"data":{"label":"OpenAI API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"d7fzv_ft12EopsQdmEsel"},"zIndex":999,"width":186,"height":49,"style":{"width":186,"height":49},"positionAbsolute":{"x":528,"y":986.900748222349},"selectable":true,"focusable":true,"resizing":false,"dragging":false},{"id":"_bPTciEA1GT1JwfXim19z","type":"subtopic","position":{"x":842.3618127280065,"y":795.900748222349},"selected":true,"data":{"label":"Chat Completions API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":298,"height":49,"style":{"width":298,"height":49},"positionAbsolute":{"x":842.3618127280065,"y":795.900748222349},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"9-5DYeOnKJq9XvEMWP45A","type":"subtopic","position":{"x":842.3618127280065,"y":848.900748222349},"selected":true,"data":{"label":"Writing Prompts","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":298,"height":49,"style":{"width":298,"height":49},"positionAbsolute":{"x":842.3618127280065,"y":848.900748222349},"selectable":true,"focusable":true,"dragging":false},{"id":"nyBgEHvUhwF-NANMwkRJW","type":"subtopic","position":{"x":842.3618127280065,"y":1126.900748222349},"selected":true,"data":{"label":"Open AI Playground","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":298,"height":49,"style":{"width":298,"height":49},"positionAbsolute":{"x":842.3618127280065,"y":1126.900748222349},"selectable":true,"focusable":true,"dragging":false},{"id":"15XOFdVp0IC-kLYPXUJWh","type":"subtopic","position":{"x":842.3618127280065,"y":1179.900748222349},"selected":true,"data":{"label":"Fine-tuning","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":298,"height":49,"style":{"width":298,"height":49},"positionAbsolute":{"x":842.3618127280065,"y":1179.900748222349},"selectable":true,"focusable":true,"dragging":false},{"id":"93tz7xYnToF3AMd_JKkNu","type":"label","position":{"x":920,"y":1070.900748222349},"selected":true,"data":{"label":"Managing Tokens","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":151,"height":36,"style":{},"positionAbsolute":{"x":920,"y":1070.900748222349},"selectable":true,"focusable":true,"dragging":false},{"id":"qzvp6YxWDiGakA2mtspfh","type":"subtopic","position":{"x":851.8618127280066,"y":910.900748222349},"selected":true,"data":{"label":"Maximum Tokens","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":279,"height":49,"style":{"width":279,"height":49},"positionAbsolute":{"x":851.8618127280066,"y":910.900748222349},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"FjV3oD7G2Ocq5HhUC17iH","type":"subtopic","position":{"x":851.8618127280066,"y":963.900748222349},"selected":true,"data":{"label":"Token Counting","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":279,"height":49,"style":{"width":279,"height":49},"positionAbsolute":{"x":851.8618127280066,"y":963.900748222349},"selectable":true,"focusable":true,"dragging":false},{"id":"DZPM9zjCbYYWBPLmQImxQ","type":"subtopic","position":{"x":851.8618127280066,"y":1016.900748222349},"selected":true,"data":{"label":"Pricing Considerations","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":279,"height":49,"style":{"width":279,"height":49},"dragging":false,"resizing":false,"positionAbsolute":{"x":851.8618127280066,"y":1016.900748222349},"selectable":true,"focusable":true},{"id":"nXsjZiJGgFyOO8b0J-E2V","type":"button","position":{"x":842.3618127280065,"y":1233.900748222349},"selected":true,"data":{"label":"Prompt Engineering Roadmap","href":"https://roadmap.sh/prompt-engineering","color":"#ffffff","backgroundColor":"#2a79e4","style":{"fontSize":17}},"zIndex":999,"width":298,"height":49,"style":{"width":298,"height":49},"positionAbsolute":{"x":842.3618127280065,"y":1233.900748222349},"dragging":false,"selectable":true,"focusable":true},{"id":"8ndKHDJgL_gYwaXC7XMer","type":"topic","position":{"x":522.5,"y":1207.6146370882086},"selected":true,"data":{"label":"AI Safety and Ethics","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"a_3SabylVqzzOyw3tZN5f"},"zIndex":999,"width":197,"height":49,"style":{"width":197,"height":49},"positionAbsolute":{"x":522.5,"y":1207.6146370882086},"dragging":false,"selectable":true,"focusable":true},{"id":"r3lmdGQuphdbxA3Zd3e8x","type":"label","position":{"x":102.47059387846707,"y":1365.6030951949779},"selected":true,"data":{"label":"Understanding AI Safety Issues","href":"","color":"#000000","style":{"fontSize":17},"oldId":"_G2yiGWt55mSuqhfEL_vt"},"zIndex":999,"width":255,"height":36,"style":{},"dragging":false,"positionAbsolute":{"x":102.47059387846707,"y":1365.6030951949779},"selectable":true,"focusable":true},{"id":"cUyLT6ctYQ1pgmodCKREq","type":"subtopic","position":{"x":76.47059387846707,"y":1199.5015627391044},"selected":true,"data":{"label":"Prompt Injection Attacks","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":307,"height":49,"style":{"width":307,"height":49},"positionAbsolute":{"x":76.47059387846707,"y":1199.5015627391044},"selectable":true,"focusable":true,"dragging":false},{"id":"lhIU0ulpvDAn1Xc3ooYz_","type":"subtopic","position":{"x":76.47059387846707,"y":1305.5015627391044},"selected":true,"data":{"label":"Bias and Fareness","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":307,"height":49,"style":{"width":307,"height":49},"positionAbsolute":{"x":76.47059387846707,"y":1305.5015627391044},"selectable":true,"focusable":true,"dragging":false},{"id":"sWBT-j2cRuFqRFYtV_5TK","type":"subtopic","position":{"x":76.47059387846707,"y":1252.5015627391044},"selected":true,"data":{"label":"Security and Privacy Concerns","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":307,"height":49,"style":{"width":307,"height":49},"positionAbsolute":{"x":76.47059387846707,"y":1252.5015627391044},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"Pt-AJmSJrOxKvolb5_HEv","type":"subtopic","position":{"x":76.47059387846707,"y":1520.7260836911958},"selected":true,"data":{"label":"Conducting adversarial testing","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"ONLDyczNacGVZGojYyJrU"},"zIndex":999,"width":307,"height":49,"style":{"width":307,"height":49},"positionAbsolute":{"x":76.47059387846707,"y":1520.7260836911958},"selectable":true,"focusable":true,"dragging":false},{"id":"ljZLa3yjQpegiZWwtnn_q","type":"subtopic","position":{"x":76.47059387846707,"y":1414.7260836911958},"selected":true,"data":{"label":"OpenAI Moderation API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":307,"height":49,"style":{"width":307,"height":49},"positionAbsolute":{"x":76.47059387846707,"y":1414.7260836911958},"selectable":true,"focusable":true,"dragging":false},{"id":"4Q5x2VCXedAWISBXUIyin","type":"subtopic","position":{"x":76.47059387846707,"y":1467.7260836911958},"selected":true,"data":{"label":"Adding end-user IDs in prompts","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":307,"height":49,"style":{"width":307,"height":49},"positionAbsolute":{"x":76.47059387846707,"y":1467.7260836911958},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"qmx6OHqx4_0JXVIv8dASp","type":"subtopic","position":{"x":76.47059387846707,"y":1573.7260836911958},"selected":true,"data":{"label":"Robust prompt engineering","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"ONLDyczNacGVZGojYyJrU"},"zIndex":999,"width":307,"height":49,"style":{"width":307,"height":49},"positionAbsolute":{"x":76.47059387846707,"y":1573.7260836911958},"selectable":true,"focusable":true,"dragging":false},{"id":"t1SObMWkDZ1cKqNNlcd9L","type":"subtopic","position":{"x":76.47059387846707,"y":1626.7260836911958},"selected":true,"data":{"label":"Know your Customers / Usecases","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"ONLDyczNacGVZGojYyJrU"},"zIndex":999,"width":307,"height":49,"style":{"width":307,"height":49},"positionAbsolute":{"x":76.47059387846707,"y":1626.7260836911958},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"ONLDyczNacGVZGojYyJrU","type":"subtopic","position":{"x":76.47059387846707,"y":1679.7260836911958},"selected":true,"data":{"label":"Constraining outputs and inputs","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":307,"height":49,"style":{"width":307,"height":49},"positionAbsolute":{"x":76.47059387846707,"y":1679.7260836911958},"selectable":true,"focusable":true,"dragging":false},{"id":"_G2yiGWt55mSuqhfEL_vt","type":"label","position":{"x":140.47059387846707,"y":1740.701849711868},"selected":true,"data":{"label":"Safety Best Practices","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":179,"height":36,"style":{},"dragging":false,"positionAbsolute":{"x":140.47059387846707,"y":1740.701849711868},"selectable":true,"focusable":true},{"id":"a_3SabylVqzzOyw3tZN5f","type":"topic","position":{"x":522.5,"y":1372.7838848882502},"selected":true,"data":{"label":"OpenSource AI","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":197,"height":49,"style":{"width":197,"height":49},"positionAbsolute":{"x":522.5,"y":1372.7838848882502},"dragging":false,"selectable":true,"focusable":true},{"id":"RBwGsq9DngUsl8PrrCbqx","type":"subtopic","position":{"x":841.1539837884804,"y":1318.7838848882502},"selected":true,"data":{"label":"Open vs Closed Source Models","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"rTT2UnvqFO3GH6ThPLEjO"},"zIndex":999,"width":298,"height":49,"style":{"width":298,"height":49},"positionAbsolute":{"x":841.1539837884804,"y":1318.7838848882502},"dragging":false,"selectable":true,"focusable":true},{"id":"97eu-XxYUH9pYbD_KjAtA","type":"subtopic","position":{"x":841.1539837884804,"y":1372.7838848882502},"selected":true,"data":{"label":"Popular Open Source Models","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"rTT2UnvqFO3GH6ThPLEjO"},"zIndex":999,"width":298,"height":49,"style":{"width":298,"height":49},"positionAbsolute":{"x":841.1539837884804,"y":1372.7838848882502},"dragging":false,"selectable":true,"focusable":true},{"id":"v99C5Bml2a6148LCJ9gy9","type":"topic","position":{"x":841.6087863651624,"y":1426.9424648726686},"selected":true,"data":{"label":"Hugging Face","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"rTT2UnvqFO3GH6ThPLEjO"},"zIndex":999,"width":295,"height":49,"style":{"width":295,"height":49},"positionAbsolute":{"x":841.6087863651624,"y":1426.9424648726686},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"YLOdOvLXa5Fa7_mmuvKEi","type":"subtopic","position":{"x":851.6087863651624,"y":1580.9265129447253},"selected":true,"data":{"label":"Hugging Face Hub","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"bGLrbpxKgENe2xS1eQtdh"},"zIndex":999,"width":275,"height":49,"style":{"width":275,"height":49},"positionAbsolute":{"x":851.6087863651624,"y":1580.9265129447253},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"YKIPOiSj_FNtg0h8uaSMq","type":"subtopic","position":{"x":851.6087863651624,"y":1527.9265129447253},"selected":true,"data":{"label":"Hugging Face Tasks","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":275,"height":49,"style":{"width":275,"height":49},"positionAbsolute":{"x":851.6087863651624,"y":1527.9265129447253},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"nDVgsa7xov1RjEMJeFAE9","type":"label","position":{"x":869.6087863651624,"y":1486.6598997473122},"selected":true,"data":{"label":"Finding Open Source Models","href":"","color":"#000000","style":{"fontSize":17},"oldId":"dDYwvkBj-voqoFCqSBfVr"},"zIndex":999,"width":239,"height":36,"style":{},"positionAbsolute":{"x":869.6087863651624,"y":1486.6598997473122},"dragging":false,"selectable":true,"focusable":true},{"id":"dDYwvkBj-voqoFCqSBfVr","type":"label","position":{"x":875.6087863651624,"y":1641.8285839892083},"selected":true,"data":{"label":"Using Open Source Models","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":227,"height":36,"style":{},"positionAbsolute":{"x":875.6087863651624,"y":1641.8285839892083},"dragging":false,"selectable":true,"focusable":true},{"id":"3kRTzlLNBnXdTsAEXVu_M","type":"subtopic","position":{"x":851.6087863651624,"y":1682.8285839892083},"selected":true,"data":{"label":"Inference SDK","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"bGLrbpxKgENe2xS1eQtdh"},"zIndex":999,"width":275,"height":49,"style":{"width":275,"height":49},"positionAbsolute":{"x":851.6087863651624,"y":1682.8285839892083},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"bGLrbpxKgENe2xS1eQtdh","type":"subtopic","position":{"x":851.6087863651624,"y":1735.8285839892083},"selected":true,"data":{"label":"Transformers.js","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":275,"height":49,"style":{"width":275,"height":49},"positionAbsolute":{"x":851.6087863651624,"y":1735.8285839892083},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"rTT2UnvqFO3GH6ThPLEjO","type":"topic","position":{"x":841.6087863651624,"y":1805.9687120415522},"selected":true,"data":{"label":"Ollama","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":295,"height":49,"style":{"width":295,"height":49},"positionAbsolute":{"x":841.6087863651624,"y":1805.9687120415522},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"ro3vY_sp6xMQ-hfzO-rc1","type":"subtopic","position":{"x":851.6087863651624,"y":1862.9687120415522},"selected":true,"data":{"label":"Ollama Models","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":275,"height":49,"style":{"width":275,"height":49},"positionAbsolute":{"x":851.6087863651624,"y":1862.9687120415522},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"TsG_I7FL-cOCSw8gvZH3r","type":"subtopic","position":{"x":851.6087863651624,"y":1916.9687120415522},"selected":true,"data":{"label":"Ollama SDK","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":275,"height":49,"style":{"width":275,"height":49},"positionAbsolute":{"x":851.6087863651624,"y":1916.9687120415522},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"--ig0Ume_BnXb9K2U7HJN","type":"topic","position":{"x":487.3795624782034,"y":1814.9687120415522},"selected":true,"data":{"label":"What are Embeddings","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"tt9u3oFlsjEMfPyojuqpc"},"zIndex":999,"width":266,"height":49,"style":{"width":266,"height":49},"positionAbsolute":{"x":487.3795624782034,"y":1814.9687120415522},"dragging":false,"selectable":true,"focusable":true},{"id":"eMfcyBxnMY_l_5-8eg6sD","type":"subtopic","position":{"x":497.90686980833937,"y":1906.0927158417944},"selected":true,"data":{"label":"Semantic Search","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":250,"height":49,"style":{"width":250,"height":49},"dragging":false,"positionAbsolute":{"x":497.90686980833937,"y":1906.0927158417944},"selectable":true,"focusable":true},{"id":"HQe9GKy3p0kTUPxojIfSF","type":"subtopic","position":{"x":497.90686980833937,"y":2012.0927158417944},"selected":true,"data":{"label":"Recommendation Systems","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":250,"height":49,"style":{"width":250,"height":49},"dragging":false,"positionAbsolute":{"x":497.90686980833937,"y":2012.0927158417944},"selectable":true,"focusable":true},{"id":"AglWJ7gb9rTT2rMkstxtk","type":"subtopic","position":{"x":497.90686980833937,"y":2065.0927158417944},"selected":true,"data":{"label":"Anomaly Detection","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":250,"height":49,"style":{"width":250,"height":49},"dragging":false,"positionAbsolute":{"x":497.90686980833937,"y":2065.0927158417944},"selectable":true,"focusable":true},{"id":"06Xta-OqSci05nV2QMFdF","type":"subtopic","position":{"x":497.90686980833937,"y":1959.0927158417944},"selected":true,"data":{"label":"Data Classification","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":250,"height":49,"style":{"width":250,"height":49},"dragging":false,"positionAbsolute":{"x":497.90686980833937,"y":1959.0927158417944},"selectable":true,"focusable":true},{"id":"OZvk1d0XxXwJwbEUYqnFq","type":"paragraph","position":{"x":450.8795624782034,"y":1573.7260836911958},"selected":true,"data":{"label":"Embeddings & Vector Databases","style":{"fontSize":20,"borderColor":"transparent","backgroundColor":"transparent","color":"#000000","textAlign":"center","justifyContent":"center","padding":16}},"zIndex":999,"width":339,"height":64,"style":{"width":339,"height":64},"positionAbsolute":{"x":450.8795624782034,"y":1573.7260836911958},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"S4LeKcmhmhOxGmDXWrYSW","type":"label","position":{"x":509.90686980833937,"y":2125.0927158417944},"selected":true,"data":{"label":"Use Cases for Embeddings","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":226,"height":36,"style":{},"positionAbsolute":{"x":509.90686980833937,"y":2125.0927158417944},"dragging":false,"selectable":true,"focusable":true},{"id":"l6priWeJhbdUD5tJ7uHyG","type":"topic","position":{"x":62.71396345748872,"y":1980.4687120415522},"selected":true,"data":{"label":"Open AI Embeddings API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"tt9u3oFlsjEMfPyojuqpc"},"zIndex":999,"width":264,"height":49,"style":{"width":264,"height":49},"positionAbsolute":{"x":62.71396345748872,"y":1980.4687120415522},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"y0qD5Kb4Pf-ymIwW-tvhX","type":"subtopic","position":{"x":62.71396345748872,"y":1830.6426346064957},"selected":true,"data":{"label":"Open AI Embedding Models","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"4GArjDYipit4SLqKZAWDf"},"zIndex":999,"width":264,"height":49,"style":{"width":264,"height":49},"positionAbsolute":{"x":62.71396345748872,"y":1830.6426346064957},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"4GArjDYipit4SLqKZAWDf","type":"subtopic","position":{"x":62.71396345748872,"y":1883.6426346064957},"selected":true,"data":{"label":"Pricing Considerations","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":264,"height":49,"style":{"width":264,"height":49},"positionAbsolute":{"x":62.71396345748872,"y":1883.6426346064957},"dragging":false,"selectable":true,"focusable":true},{"id":"apVYIV4EyejPft25oAvdI","type":"topic","position":{"x":62.5,"y":2216.727661473262},"selected":true,"data":{"label":"Open-Source Embeddings","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"tt9u3oFlsjEMfPyojuqpc"},"zIndex":999,"width":278,"height":49,"style":{"width":278,"height":49},"positionAbsolute":{"x":62.5,"y":2216.727661473262},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"ZV_V6sqOnRodgaw4mzokC","type":"subtopic","position":{"x":134.93627316762456,"y":2063.3782051585886},"selected":true,"data":{"label":"Sentence Transformers","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"dLEg4IA3F5jgc44Bst9if"},"zIndex":999,"width":264,"height":49,"style":{"width":264,"height":49},"positionAbsolute":{"x":134.93627316762456,"y":2063.3782051585886},"dragging":false,"selectable":true,"focusable":true},{"id":"dLEg4IA3F5jgc44Bst9if","type":"subtopic","position":{"x":134.93627316762456,"y":2116.3782051585886},"selected":true,"data":{"label":"Models on Hugging Face","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":264,"height":49,"style":{"width":264,"height":49},"positionAbsolute":{"x":134.93627316762456,"y":2116.3782051585886},"dragging":false,"selectable":true,"focusable":true},{"id":"tt9u3oFlsjEMfPyojuqpc","type":"topic","position":{"x":62.5,"y":2268.2838160405004},"selected":true,"data":{"label":"Vector Databases","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":278,"height":49,"style":{"width":278,"height":49},"positionAbsolute":{"x":62.5,"y":2268.2838160405004},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"WcjX6p-V-Rdd77EL8Ega9","type":"subtopic","position":{"x":62.5,"y":2358.7263937544244},"selected":true,"data":{"label":"Purpose and Functionality","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":278,"height":49,"style":{"width":278,"height":49},"positionAbsolute":{"x":62.5,"y":2358.7263937544244},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"dSd2C9lNl-ymmCRT9_ZC3","type":"subtopic","position":{"x":73.27752658021024,"y":2464.8371549138815},"selected":true,"data":{"label":"Chroma","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":127,"height":49,"style":{"width":127,"height":49},"resizing":false,"positionAbsolute":{"x":73.27752658021024,"y":2464.8371549138815},"dragging":false,"selectable":true,"focusable":true},{"id":"_Cf7S1DCvX7p1_3-tP3C3","type":"subtopic","position":{"x":204.27752658021024,"y":2464.8371549138815},"selected":true,"data":{"label":"Pinecone","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":130,"height":49,"style":{"width":130,"height":49},"resizing":false,"positionAbsolute":{"x":204.27752658021024,"y":2464.8371549138815},"dragging":false,"selectable":true,"focusable":true},{"id":"VgUnrZGKVjAAO4n_llq5-","type":"subtopic","position":{"x":73.27752658021024,"y":2517.8371549138815},"selected":true,"data":{"label":"Weaviate","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":127,"height":49,"style":{"width":127,"height":49},"positionAbsolute":{"x":73.27752658021024,"y":2517.8371549138815},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"JurLbOO1Z8r6C3yUqRNwf","type":"subtopic","position":{"x":204.27752658021024,"y":2517.8371549138815},"selected":true,"data":{"label":"FAISS","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":130,"height":49,"style":{"width":130,"height":49},"resizing":false,"positionAbsolute":{"x":204.27752658021024,"y":2517.8371549138815},"dragging":false,"selectable":true,"focusable":true},{"id":"rjaCNT3Li45kwu2gXckke","type":"subtopic","position":{"x":73.27752658021024,"y":2570.8371549138815},"selected":true,"data":{"label":"LanceDB","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":127,"height":49,"style":{"width":127,"height":49},"resizing":false,"positionAbsolute":{"x":73.27752658021024,"y":2570.8371549138815},"dragging":false,"selectable":true,"focusable":true},{"id":"DwOAL5mOBgBiw-EQpAzQl","type":"subtopic","position":{"x":204.27752658021024,"y":2570.8371549138815},"selected":true,"data":{"label":"Qdrant","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":130,"height":49,"style":{"width":130,"height":49},"resizing":false,"positionAbsolute":{"x":204.27752658021024,"y":2570.8371549138815},"dragging":false,"selectable":true,"focusable":true},{"id":"9kT7EEQsbeD2WDdN9ADx7","type":"subtopic","position":{"x":73.27752658021024,"y":2624.8371549138815},"selected":true,"data":{"label":"Supabase","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":261,"height":49,"style":{"width":261,"height":49},"positionAbsolute":{"x":73.27752658021024,"y":2624.8371549138815},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"j6bkm0VUgLkHdMDDJFiMC","type":"subtopic","position":{"x":73.27752658021024,"y":2677.8371549138815},"selected":true,"data":{"label":"MongoDB Atlas","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":261,"height":49,"style":{"width":261,"height":49},"dragging":false,"positionAbsolute":{"x":73.27752658021024,"y":2677.8371549138815},"selectable":true,"focusable":true},{"id":"HCuwQPBl48sRzdbxdf_E5","type":"label","position":{"x":79.27391817001211,"y":2423.8371549138815},"selected":true,"data":{"label":"Popular Vector DBs (pick one)","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":247,"height":36,"style":{},"positionAbsolute":{"x":79.27391817001211,"y":2423.8371549138815},"dragging":false,"selectable":true,"focusable":true},{"id":"5TQnO9B4_LTHwqjI7iHB1","type":"subtopic","position":{"x":72.71593368999282,"y":2787.1963926350054},"selected":true,"data":{"label":"Indexing Embeddings","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":262,"height":49,"style":{"width":262,"height":49},"positionAbsolute":{"x":72.71593368999282,"y":2787.1963926350054},"dragging":false,"selectable":true,"focusable":true},{"id":"ZcbRPtgaptqKqWBgRrEBU","type":"subtopic","position":{"x":73.21593368999282,"y":2840.1963926350054},"selected":true,"data":{"label":"Performing Similarity Search","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":261,"height":49,"style":{"width":261,"height":49},"dragging":false,"positionAbsolute":{"x":73.21593368999282,"y":2840.1963926350054},"resizing":false,"selectable":true,"focusable":true},{"id":"xsvdnT7BIbR_jAajTYDWw","type":"label","position":{"x":86.27391817001211,"y":2743.7263937544244},"selected":true,"data":{"label":"Implementing Vector Search","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":233,"height":36,"style":{},"positionAbsolute":{"x":86.27391817001211,"y":2743.7263937544244},"dragging":false,"selectable":true,"focusable":true},{"id":"lVhWhZGR558O-ljHobxIi","type":"topic","position":{"x":520,"y":2268.2838160405004},"selected":true,"data":{"label":"RAG & Implementation","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"W7cKPt_UxcUgwp8J6hS4p"},"zIndex":999,"width":220,"height":49,"style":{"width":220,"height":49},"positionAbsolute":{"x":520,"y":2268.2838160405004},"dragging":false,"selectable":true,"focusable":true},{"id":"GCn4LGNEtPI0NWYAZCRE-","type":"subtopic","position":{"x":839.7247553252009,"y":2018.167205684323},"selected":true,"data":{"label":"RAG Usecases","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":295,"height":49,"style":{"width":295,"height":49},"positionAbsolute":{"x":839.7247553252009,"y":2018.167205684323},"dragging":false,"selectable":true,"focusable":true},{"id":"qlBEXrbV88e_wAGRwO9hW","type":"subtopic","position":{"x":839.7247553252009,"y":2071.167205684323},"selected":true,"data":{"label":"RAG vs Fine-tuning","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":295,"height":49,"style":{"width":295,"height":49},"dragging":false,"positionAbsolute":{"x":839.7247553252009,"y":2071.167205684323},"selectable":true,"focusable":true},{"id":"mX987wiZF7p3V_gExrPeX","type":"subtopic","position":{"x":851.4069839913399,"y":2177.715898273103},"selected":true,"data":{"label":"Chunking","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"2jJnS9vRYhaS69d6OxrMh"},"zIndex":999,"width":272,"height":49,"style":{"width":272,"height":49},"positionAbsolute":{"x":851.4069839913399,"y":2177.715898273103},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"grTcbzT7jKk_sIUwOTZTD","type":"subtopic","position":{"x":851.4069839913398,"y":2230.715898273103},"selected":true,"data":{"label":"Embedding","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"2jJnS9vRYhaS69d6OxrMh"},"zIndex":999,"width":272,"height":49,"style":{"width":272,"height":49},"positionAbsolute":{"x":851.4069839913398,"y":2230.715898273103},"dragging":false,"selectable":true,"focusable":true},{"id":"zZA1FBhf1y4kCoUZ-hM4H","type":"subtopic","position":{"x":851.4069839913398,"y":2283.715898273103},"selected":true,"data":{"label":"Vector Database","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"2jJnS9vRYhaS69d6OxrMh"},"zIndex":999,"width":272,"height":49,"style":{"width":272,"height":49},"positionAbsolute":{"x":851.4069839913398,"y":2283.715898273103},"dragging":false,"selectable":true,"focusable":true},{"id":"OCGCzHQM2LQyUWmiqe6E0","type":"subtopic","position":{"x":851.4069839913398,"y":2336.715898273103},"selected":true,"data":{"label":"Retrieval Process","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"2jJnS9vRYhaS69d6OxrMh"},"zIndex":999,"width":272,"height":49,"style":{"width":272,"height":49},"positionAbsolute":{"x":851.4069839913398,"y":2336.715898273103},"dragging":false,"selectable":true,"focusable":true},{"id":"2jJnS9vRYhaS69d6OxrMh","type":"subtopic","position":{"x":851.4069839913398,"y":2389.715898273103},"selected":true,"data":{"label":"Generation","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":272,"height":49,"style":{"width":272,"height":49},"positionAbsolute":{"x":851.4069839913398,"y":2389.715898273103},"dragging":false,"selectable":true,"focusable":true},{"id":"Bt536neIoWehPSHUB6l_n","type":"label","position":{"x":906.2247553252009,"y":2137.0058206731997},"selected":true,"data":{"label":"Implementing RAG","href":"","color":"#000000","style":{"fontSize":17},"oldId":"v9whDFmN8Wf3oKlaOtHMD"},"zIndex":999,"width":161,"height":36,"style":{},"positionAbsolute":{"x":906.2247553252009,"y":2137.0058206731997},"dragging":false,"selectable":true,"focusable":true},{"id":"v9whDFmN8Wf3oKlaOtHMD","type":"label","position":{"x":874.3356614935651,"y":2468.2465978906853},"selected":true,"data":{"label":"Ways of Implementing RAG","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":225,"height":36,"style":{},"positionAbsolute":{"x":874.3356614935651,"y":2468.2465978906853},"dragging":false,"selectable":true,"focusable":true},{"id":"WZVW8FQu6LyspSKm1C_sl","type":"subtopic","position":{"x":847.8356614935651,"y":2514.3420928710716},"selected":true,"data":{"label":"Using SDKs Directly","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":278,"height":49,"style":{"width":278,"height":49},"positionAbsolute":{"x":847.8356614935651,"y":2514.3420928710716},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"ebXXEhNRROjbbof-Gym4p","type":"subtopic","position":{"x":847.8356614935651,"y":2567.3420928710716},"selected":true,"data":{"label":"Langchain","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"axwBe98SYWkguEwbMipIm"},"zIndex":999,"width":132,"height":49,"style":{"width":132,"height":49},"positionAbsolute":{"x":847.8356614935651,"y":2567.3420928710716},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"d0ontCII8KI8wfP-8Y45R","type":"subtopic","position":{"x":984.8356614935651,"y":2567.3420928710716},"selected":true,"data":{"label":"Llama Index","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"ebXXEhNRROjbbof-Gym4p"},"zIndex":999,"width":141,"height":49,"style":{"width":141,"height":49},"positionAbsolute":{"x":984.8356614935651,"y":2567.3420928710716},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"eOqCBgBTKM8CmY3nsWjre","type":"topic","position":{"x":520,"y":2393.7243958663935},"selected":true,"data":{"label":"Open AI Assistant API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"W7cKPt_UxcUgwp8J6hS4p"},"zIndex":999,"width":220,"height":49,"style":{"width":220,"height":49},"positionAbsolute":{"x":520,"y":2393.7243958663935},"dragging":false,"selectable":true,"focusable":true},{"id":"c0RPhpD00VIUgF4HJgN2T","type":"subtopic","position":{"x":78.5,"y":1098.8781089665497},"selected":true,"data":{"label":"Replicate","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"n-Ud2dXkqIzK37jlKItN4"},"zIndex":999,"width":304,"height":49,"style":{"width":304,"height":49},"positionAbsolute":{"x":78.5,"y":1098.8781089665497},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"AeHkNU-uJ_gBdo5-xdpEu","type":"topic","position":{"x":533.3795624782034,"y":2739.3420928710716},"selected":true,"data":{"label":"AI Agents","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"W7cKPt_UxcUgwp8J6hS4p"},"zIndex":999,"width":220,"height":49,"style":{"width":220,"height":49},"positionAbsolute":{"x":533.3795624782034,"y":2739.3420928710716},"dragging":false,"selectable":true,"focusable":true},{"id":"pqnC9N-AUKg0vjKzuCNqd","type":"label","position":{"x":516.5,"y":2354.715898273103},"selected":true,"data":{"label":"RAG Alternative","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":137,"height":36,"style":{},"positionAbsolute":{"x":516.5,"y":2354.715898273103},"dragging":false,"focusable":true,"selectable":true},{"id":"778HsQzTuJ_3c9OSn5DmH","type":"subtopic","position":{"x":405.1180805793284,"y":2527.2038885388165},"selected":true,"data":{"label":"Agents Usecases","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"6xaRB34_g0HGt-y1dGYXR"},"zIndex":999,"width":239,"height":49,"style":{"width":239,"height":49},"positionAbsolute":{"x":405.1180805793284,"y":2527.2038885388165},"dragging":false,"focusable":true,"selectable":true},{"id":"BRdKYsyWaHg6kJA62mLNO","type":"button","position":{"x":405.1180805793284,"y":2580.2038885388165},"selected":true,"data":{"label":"Prompt Engineering","href":"https://roadmap.sh/prompt-engineering","color":"#ffffff","backgroundColor":"#2a79e4","style":{"fontSize":17}},"zIndex":999,"width":239,"height":49,"style":{"width":239,"height":49},"dragging":false,"positionAbsolute":{"x":405.1180805793284,"y":2580.2038885388165},"focusable":true,"selectable":true},{"id":"voDKcKvXtyLzeZdx2g3Qn","type":"subtopic","position":{"x":405.1180805793284,"y":2633.2038885388165},"selected":true,"data":{"label":"ReAct Prompting","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"6xaRB34_g0HGt-y1dGYXR"},"zIndex":999,"width":239,"height":49,"style":{"width":239,"height":49},"positionAbsolute":{"x":405.1180805793284,"y":2633.2038885388165},"dragging":false,"focusable":true,"selectable":true},{"id":"6xaRB34_g0HGt-y1dGYXR","type":"subtopic","position":{"x":848.3202732289765,"y":2706.1704183412},"selected":true,"data":{"label":"Manual Implementation","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":280,"height":49,"style":{"width":280,"height":49},"positionAbsolute":{"x":848.3202732289765,"y":2706.1704183412},"dragging":false,"focusable":true,"resizing":false,"selectable":true},{"id":"Sm0Ne5Nx72hcZCdAcC0C2","type":"subtopic","position":{"x":848.3202732289765,"y":2759.1704183412},"selected":true,"data":{"label":"OpenAI Functions / Tools","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":280,"height":49,"style":{"width":280,"height":49},"positionAbsolute":{"x":848.3202732289765,"y":2759.1704183412},"dragging":false,"selectable":true,"focusable":true},{"id":"mbp2NoL-VZ5hZIIblNBXt","type":"subtopic","position":{"x":848.3202732289765,"y":2812.1704183412},"selected":true,"data":{"label":"OpenAI Assistant API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":280,"height":49,"style":{"width":280,"height":49},"positionAbsolute":{"x":848.3202732289765,"y":2812.1704183412},"dragging":false,"selectable":true,"focusable":true},{"id":"8DMSxbdBT5el9ECZE2EGx","type":"label","position":{"x":910.3202732289765,"y":2666.47564929518},"selected":true,"data":{"label":"Building AI Agents","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":156,"height":36,"style":{},"positionAbsolute":{"x":910.3202732289765,"y":2666.47564929518},"dragging":false,"selectable":true,"focusable":true},{"id":"W7cKPt_UxcUgwp8J6hS4p","type":"topic","position":{"x":533.3795624782034,"y":2942.715898273103},"selected":true,"data":{"label":"Multimodal AI","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":220,"height":49,"style":{"width":220,"height":49},"positionAbsolute":{"x":533.3795624782034,"y":2942.715898273103},"dragging":false,"selectable":true,"focusable":true},{"id":"sGR9qcro68KrzM8qWxcH8","type":"subtopic","position":{"x":65.4565453870415,"y":2942.715898273103},"selected":true,"data":{"label":"Multimodal AI Usecases","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":278,"height":49,"style":{"width":278,"height":49},"positionAbsolute":{"x":65.4565453870415,"y":2942.715898273103},"dragging":false,"selectable":true,"focusable":true},{"id":"fzVq4hGoa2gdbIzoyY1Zp","type":"subtopic","position":{"x":72.99859239597538,"y":3005.4007482223487},"selected":true,"data":{"label":"Image Understanding","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":261,"height":49,"style":{"width":261,"height":49},"dragging":false,"positionAbsolute":{"x":72.99859239597538,"y":3005.4007482223487},"resizing":false,"selectable":true,"focusable":true},{"id":"49BWxYVFpIgZCCqsikH7l","type":"subtopic","position":{"x":72.99859239597538,"y":3058.4007482223487},"selected":true,"data":{"label":"Image Generation","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":261,"height":49,"style":{"width":261,"height":49},"dragging":false,"positionAbsolute":{"x":72.99859239597538,"y":3058.4007482223487},"selectable":true,"focusable":true},{"id":"TxaZCtTCTUfwCxAJ2pmND","type":"subtopic","position":{"x":72.99859239597538,"y":3111.4007482223487},"selected":true,"data":{"label":"Video Understanding","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":261,"height":49,"style":{"width":261,"height":49},"dragging":false,"positionAbsolute":{"x":72.99859239597538,"y":3111.4007482223487},"selectable":true,"focusable":true},{"id":"mxQYB820447DC6kogyZIL","type":"subtopic","position":{"x":72.99859239597538,"y":3164.4007482223487},"selected":true,"data":{"label":"Audio Processing","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":261,"height":49,"style":{"width":261,"height":49},"dragging":false,"positionAbsolute":{"x":72.99859239597538,"y":3164.4007482223487},"selectable":true,"focusable":true},{"id":"GCERpLz5BcRtWPpv-asUz","type":"subtopic","position":{"x":72.99859239597538,"y":3217.4007482223487},"selected":true,"data":{"label":"Text-to-Speech","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":261,"height":49,"style":{"width":261,"height":49},"dragging":false,"positionAbsolute":{"x":72.99859239597538,"y":3217.4007482223487},"selectable":true,"focusable":true},{"id":"jQX10XKd_QM5wdQweEkVJ","type":"subtopic","position":{"x":72.99859239597538,"y":3270.4007482223487},"selected":true,"data":{"label":"Speech-to-Text","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":261,"height":49,"style":{"width":261,"height":49},"dragging":false,"positionAbsolute":{"x":72.99859239597538,"y":3270.4007482223487},"selectable":true,"focusable":true},{"id":"chm2xTFPJKW0dubKGjq-2","type":"label","position":{"x":119.99859239597538,"y":3330.4007482223487},"selected":true,"data":{"label":"Multimodal AI Tasks","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":168,"height":36,"style":{},"positionAbsolute":{"x":119.99859239597538,"y":3330.4007482223487},"dragging":false,"selectable":true,"focusable":true},{"id":"CRrqa-dBw1LlOwVbrZhjK","type":"subtopic","position":{"x":845.4985923959754,"y":2930.9007482223487},"selected":true,"data":{"label":"OpenAI Vision API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":291,"height":49,"style":{"width":291,"height":49},"positionAbsolute":{"x":845.4985923959754,"y":2930.9007482223487},"selectable":true,"focusable":true,"dragging":false},{"id":"LKFwwjtcawJ4Z12X102Cb","type":"subtopic","position":{"x":845.4985923959754,"y":2983.9007482223487},"selected":true,"data":{"label":"DALL-E API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":291,"height":49,"style":{"width":291,"height":49},"positionAbsolute":{"x":845.4985923959754,"y":2983.9007482223487},"selectable":true,"focusable":true,"dragging":false},{"id":"OTBd6cPUayKaAM-fLWdSt","type":"subtopic","position":{"x":845.4985923959754,"y":3036.9007482223487},"selected":true,"data":{"label":"Whisper API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":291,"height":49,"style":{"width":291,"height":49},"positionAbsolute":{"x":845.4985923959754,"y":3036.9007482223487},"selectable":true,"focusable":true,"dragging":false},{"id":"EIDbwbdolR_qsNKVDla6V","type":"subtopic","position":{"x":845.4985923959754,"y":3089.9007482223487},"selected":true,"data":{"label":"Hugging Face Models","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":291,"height":49,"style":{"width":291,"height":49},"positionAbsolute":{"x":845.4985923959754,"y":3089.9007482223487},"selectable":true,"focusable":true,"dragging":false},{"id":"j9zD3pHysB1CBhLfLjhpD","type":"subtopic","position":{"x":845.4985923959754,"y":3142.9007482223487},"selected":true,"data":{"label":"LangChain for Multimodal Apps","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":291,"height":49,"style":{"width":291,"height":49},"positionAbsolute":{"x":845.4985923959754,"y":3142.9007482223487},"selectable":true,"focusable":true,"dragging":false},{"id":"akQTCKuPRRelj2GORqvsh","type":"subtopic","position":{"x":845.4985923959754,"y":3195.9007482223487},"selected":true,"data":{"label":"LlamaIndex for Multimodal Apps","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":291,"height":49,"style":{"width":291,"height":49},"positionAbsolute":{"x":845.4985923959754,"y":3195.9007482223487},"selectable":true,"focusable":true,"dragging":false},{"id":"5hCv_2FQNIgQC4XLW4AYs","type":"label","position":{"x":875.9985923959754,"y":3255.9007482223487},"selected":true,"data":{"label":"Implementing Multimodal AI","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":230,"height":36,"style":{},"positionAbsolute":{"x":875.9985923959754,"y":3255.9007482223487},"dragging":false,"selectable":true,"focusable":true},{"width":459,"height":119,"id":"0vLaVNJaJSHZ_bHli6Qzs","type":"paragraph","position":{"x":452.1429505186827,"y":3390.969159826914},"selected":true,"data":{"label":"Continue learning with following relevant tracks","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center","borderColor":"#000000","backgroundColor":"WHITe"},"oldId":"m9eO0jLGuR_9w2JJbe_g2"},"zIndex":999,"positionAbsolute":{"x":452.1429505186827,"y":3390.969159826914},"dragging":false,"style":{"width":459,"height":119},"resizing":false,"focusable":true,"selectable":true},{"width":228,"height":49,"id":"OIcmPSbdsuWapb6HZ4BEi","type":"button","position":{"x":466.1567530029688,"y":3445.1148172600238},"selected":true,"data":{"label":"AI & Data Scientist","href":"https://roadmap.sh/ai-data-scientist","color":"#FFf","backgroundColor":"#4136D6","style":{"fontSize":17},"borderColor":"#4136D6","oldId":"cmSSwPPiiHwYh9ct14N6A"},"zIndex":999,"dragging":false,"positionAbsolute":{"x":466.1567530029688,"y":3445.1148172600238},"style":{"width":228,"height":49},"focusable":true,"resizing":false,"selectable":true},{"width":20,"height":85,"id":"RLtk1C3gofHnLJ17x3o5b","type":"vertical","position":{"x":671.6429505186827,"y":3513.969159826914},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"},"oldId":"ExXFPDHXtcOMcvZttzxvD"},"zIndex":999,"positionAbsolute":{"x":671.6429505186827,"y":3513.969159826914},"dragging":false,"focusable":true,"style":{"width":20,"height":85},"resizing":false,"selectable":true},{"width":199,"height":49,"id":"-sFboM4eFUMVq1tlPl-fV","type":"button","position":{"x":699.9869736111889,"y":3445.1148172600238},"selected":true,"data":{"label":"Prompt Engineering","href":"https://roadmap.sh/prompt-engineering","color":"#FFFFFf","backgroundColor":"#4136D6","style":{"fontSize":17},"borderColor":"#4136D6","oldId":"qXKNK_IsGS8-JgLK-Q9oU"},"zIndex":999,"dragging":false,"positionAbsolute":{"x":699.9869736111889,"y":3445.1148172600238},"style":{},"focusable":true,"resizing":false,"selectable":true},{"id":"NYge7PNtfI-y6QWefXJ4d","type":"topic","position":{"x":533.3795624782034,"y":3281.4007482223487},"selected":true,"data":{"label":"Development Tools","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"W7cKPt_UxcUgwp8J6hS4p"},"zIndex":999,"width":220,"height":49,"style":{"width":220,"height":49},"positionAbsolute":{"x":533.3795624782034,"y":3281.4007482223487},"dragging":false,"selectable":true,"focusable":true},{"id":"XcKeQfpTA5ITgdX51I4y-","type":"subtopic","position":{"x":423.1375395659161,"y":3135.6475050579174},"selected":true,"data":{"label":"AI Code Editors","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":423.1375395659161,"y":3135.6475050579174},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"TifVhqFm1zXNssA8QR3SM","type":"subtopic","position":{"x":423.1375395659161,"y":3189.6475050579174},"selected":true,"data":{"label":"Code Completion Tools","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"XcKeQfpTA5ITgdX51I4y-"},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":423.1375395659161,"y":3189.6475050579174},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"8tcMfca2q2_6M-KmzmaT1","type":"button","position":{"x":72.27752658021029,"y":142.3328638669464},"selected":true,"data":{"label":"Scrimba - AI Engineer Path","href":"https://v2.scrimba.com/the-ai-engineer-path-c02v?via=roadmap","color":"#ffffff","backgroundColor":"#4136D6","style":{"fontSize":17}},"zIndex":999,"width":360,"height":49,"style":{"width":360,"height":49},"positionAbsolute":{"x":72.27752658021029,"y":142.3328638669464},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"NxOYVBCLCLZ1wtGAGEn5W","type":"linksgroup","position":{"x":62.71396345748872,"y":225.90074822234897},"selected":true,"data":{"label":"Related Roadmaps","links":[{"id":"sk9lcGKC3DnpMWEn73SUX","label":"AI and Data Scientist Roadmap","href":"","url":"https://roadmap.sh/ai-data-scientist"},{"id":"quj9EG47r_g7lvwZXil4j","label":"Prompt Engineering","url":"https://roadmap.sh/prompt-engineering"},{"id":"7QOvFxjjApFOP5S9nkYf4","label":"Data Analyst Roadamp","url":"https://roadmap.sh/data-analyst"}]},"zIndex":999,"width":388,"height":160,"positionAbsolute":{"x":62.71396345748872,"y":225.90074822234897},"dragging":false,"style":{"width":388,"height":160},"resizing":false,"focusable":true,"selectable":true}],"edges":[{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"iogwMmOvub2ZF4zgg6WyF","sourceHandle":"x2","target":"_hYN0gEi9BL24nptEtXWU","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"XX0I26JoVMVXIe_7bVMix","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"z2","target":"GN6SnI7RXIeW8JeD-qORW","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-_hYN0gEi9BL24nptEtXWUz2-GN6SnI7RXIeW8JeD-qORWy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"z2","target":"jSZ1LhPdhlkW-9QJhIvFs","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-_hYN0gEi9BL24nptEtXWUz2-jSZ1LhPdhlkW-9QJhIvFsy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"GN6SnI7RXIeW8JeD-qORW","sourceHandle":"w2","target":"K9EiuFgPBFgeRxY4wxAmb","targetHandle":"x2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-GN6SnI7RXIeW8JeD-qORWw2-K9EiuFgPBFgeRxY4wxAmbx2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"x2","target":"wt_3LocKHpvsnsQdDI7LK","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-_hYN0gEi9BL24nptEtXWUx2-wt_3LocKHpvsnsQdDI7LKw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"wt_3LocKHpvsnsQdDI7LK","sourceHandle":"x2","target":"d7fzv_ft12EopsQdmEsel","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-wt_3LocKHpvsnsQdDI7LKx2-d7fzv_ft12EopsQdmEselw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"d7fzv_ft12EopsQdmEsel","sourceHandle":"y2","target":"MXqbQGhNM3xpXlMC2ib_6","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-d7fzv_ft12EopsQdmEsely2-MXqbQGhNM3xpXlMC2ib_6z1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"d7fzv_ft12EopsQdmEsel","sourceHandle":"y2","target":"1Ga6DbOPc6Crz7ilsZMYy","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-d7fzv_ft12EopsQdmEsely2-1Ga6DbOPc6Crz7ilsZMYyz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"d7fzv_ft12EopsQdmEsel","sourceHandle":"y2","target":"5ShWZl1QUqPwO-NRGN85V","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-d7fzv_ft12EopsQdmEsely2-5ShWZl1QUqPwO-NRGN85Vz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"d7fzv_ft12EopsQdmEsel","sourceHandle":"x2","target":"wr2_2ADvySOUZxzEo1Uw1","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-d7fzv_ft12EopsQdmEselx2-wr2_2ADvySOUZxzEo1Uw1w1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"wr2_2ADvySOUZxzEo1Uw1","sourceHandle":"x2","target":"zdeuA4GbdBl2DwKgiOA4G","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-wr2_2ADvySOUZxzEo1Uw1x2-zdeuA4GbdBl2DwKgiOA4Gw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"zdeuA4GbdBl2DwKgiOA4G","sourceHandle":"z2","target":"_bPTciEA1GT1JwfXim19z","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-zdeuA4GbdBl2DwKgiOA4Gz2-_bPTciEA1GT1JwfXim19zy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"zdeuA4GbdBl2DwKgiOA4G","sourceHandle":"z2","target":"9-5DYeOnKJq9XvEMWP45A","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-zdeuA4GbdBl2DwKgiOA4Gz2-9-5DYeOnKJq9XvEMWP45Ay1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"zdeuA4GbdBl2DwKgiOA4G","sourceHandle":"z2","target":"nyBgEHvUhwF-NANMwkRJW","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-zdeuA4GbdBl2DwKgiOA4Gz2-nyBgEHvUhwF-NANMwkRJWy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"zdeuA4GbdBl2DwKgiOA4G","sourceHandle":"z2","target":"nXsjZiJGgFyOO8b0J-E2V","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-zdeuA4GbdBl2DwKgiOA4Gz2-nXsjZiJGgFyOO8b0J-E2Vy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"zdeuA4GbdBl2DwKgiOA4G","sourceHandle":"x2","target":"8ndKHDJgL_gYwaXC7XMer","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-zdeuA4GbdBl2DwKgiOA4Gx2-a_3SabylVqzzOyw3tZN5fw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"8ndKHDJgL_gYwaXC7XMer","sourceHandle":"x2","target":"a_3SabylVqzzOyw3tZN5f","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-8ndKHDJgL_gYwaXC7XMerx2-a_3SabylVqzzOyw3tZN5fw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"a_3SabylVqzzOyw3tZN5f","sourceHandle":"z2","target":"RBwGsq9DngUsl8PrrCbqx","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-a_3SabylVqzzOyw3tZN5fz2-RBwGsq9DngUsl8PrrCbqxy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"a_3SabylVqzzOyw3tZN5f","sourceHandle":"z2","target":"97eu-XxYUH9pYbD_KjAtA","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-a_3SabylVqzzOyw3tZN5fz2-97eu-XxYUH9pYbD_KjAtAy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"a_3SabylVqzzOyw3tZN5f","sourceHandle":"x2","target":"OZvk1d0XxXwJwbEUYqnFq","targetHandle":"w2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-a_3SabylVqzzOyw3tZN5fx2-OZvk1d0XxXwJwbEUYqnFqw2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"OZvk1d0XxXwJwbEUYqnFq","sourceHandle":"x2","target":"--ig0Ume_BnXb9K2U7HJN","targetHandle":"w2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-OZvk1d0XxXwJwbEUYqnFqx2-tt9u3oFlsjEMfPyojuqpcw2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"--ig0Ume_BnXb9K2U7HJN","sourceHandle":"x2","target":"4P2Sbyy2cVjOrXH75Hc2b","targetHandle":"w1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-tt9u3oFlsjEMfPyojuqpcx2-4P2Sbyy2cVjOrXH75Hc2bw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"--ig0Ume_BnXb9K2U7HJN","sourceHandle":"y2","target":"l6priWeJhbdUD5tJ7uHyG","targetHandle":"z2","data":{"edgeStyle":"solid"},"id":"reactflow__edge---ig0Ume_BnXb9K2U7HJNy2-tt9u3oFlsjEMfPyojuqpcz2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"l6priWeJhbdUD5tJ7uHyG","sourceHandle":"w2","target":"4GArjDYipit4SLqKZAWDf","targetHandle":"x2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-tt9u3oFlsjEMfPyojuqpcw2-4GArjDYipit4SLqKZAWDfx2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"lVhWhZGR558O-ljHobxIi","sourceHandle":"z2","target":"zK_H4vmJXmyLYu1gVfhYK","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-W7cKPt_UxcUgwp8J6hS4pz2-zK_H4vmJXmyLYu1gVfhYKy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"tt9u3oFlsjEMfPyojuqpc","sourceHandle":"z2","target":"lVhWhZGR558O-ljHobxIi","targetHandle":"y1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-tt9u3oFlsjEMfPyojuqpcz2-W7cKPt_UxcUgwp8J6hS4py1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"AeHkNU-uJ_gBdo5-xdpEu","sourceHandle":"z2","target":"k8QYMT_d6EQWDqDgnPYsT","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-W7cKPt_UxcUgwp8J6hS4pz2-k8QYMT_d6EQWDqDgnPYsTy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"W7cKPt_UxcUgwp8J6hS4p","sourceHandle":"y2","target":"sGR9qcro68KrzM8qWxcH8","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-W7cKPt_UxcUgwp8J6hS4py2-sGR9qcro68KrzM8qWxcH8z1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"KMA7NkxFbPoUDtFnGBFnj","sourceHandle":"x2","target":"0vLaVNJaJSHZ_bHli6Qzs","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-KMA7NkxFbPoUDtFnGBFnjx2-0vLaVNJaJSHZ_bHli6Qzsw1","selected":true,"type":"simplebezier","focusable":true,"selectable":true}]}
\ No newline at end of file
+{"nodes":[{"id":"xgDW3VKPFxsHzV37ZEBtt","type":"paragraph","position":{"x":61.5,"y":-100.15106699547101},"selected":true,"data":{"label":"Pre-requisites (One of these)","style":{"fontSize":17,"borderColor":"#000000","backgroundColor":"#ffffff","color":"#000000","textAlign":"center","justifyContent":"flex-start","padding":16}},"zIndex":999,"width":388,"height":124,"positionAbsolute":{"x":61.5,"y":-100.15106699547101},"dragging":false,"style":{"width":388,"height":124},"resizing":false,"focusable":true,"selectable":true},{"id":"2d12fAvrDGrpBHvIbT2c0","type":"paragraph","position":{"x":60.5,"y":40.33286386694641},"selected":true,"data":{"label":"Scrimba is offering 20% off to roadmap users on their AI Engineer course that covers this roadmap in depth. Check them out!","style":{"fontSize":17,"borderColor":"#000000","backgroundColor":"#ffffff","color":"#000000","textAlign":"center","justifyContent":"flex-start","padding":16}},"zIndex":999,"width":388,"height":166,"positionAbsolute":{"x":60.5,"y":40.33286386694641},"dragging":false,"style":{"width":388,"height":166},"resizing":false,"selectable":true,"focusable":true},{"id":"f7f_Pt8Ymq65FYDn0RTx0","type":"vertical","position":{"x":567.6567530029688,"y":3212.4007482223487},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":98,"style":{"width":20,"height":98},"positionAbsolute":{"x":567.6567530029688,"y":3212.4007482223487},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"cWm7uchA7HllHWHMET2Qy","type":"horizontal","position":{"x":730,"y":2957.9007482223487},"selected":true,"data":{"label":"horizontal node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":107,"height":20,"style":{"width":107,"height":20},"positionAbsolute":{"x":730,"y":2957.9007482223487},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"mag6fPpJF15RiIN9eAlE9","type":"section","position":{"x":837.4985923959754,"y":2922.9007482223487},"width":307,"height":376,"style":{"width":307,"height":376},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":837.4985923959754,"y":2922.9007482223487},"dragging":false,"selectable":true,"focusable":true},{"id":"P2fcMXV6vhm6MMMiBmy3r","type":"section","position":{"x":64.99859239597538,"y":2997.4007482223487},"width":278,"height":376,"style":{"width":278,"height":376},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":64.99859239597538,"y":2997.4007482223487},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"k8QYMT_d6EQWDqDgnPYsT","type":"section","position":{"x":840.3202732289765,"y":2655.9840127727616},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":296,"height":216,"style":{"width":296,"height":216},"dragging":false,"resizing":false,"positionAbsolute":{"x":840.3202732289765,"y":2655.9840127727616},"selectable":true,"focusable":true},{"id":"Lk-hBhJoaDCs6Dzq0d0I2","type":"vertical","position":{"x":570,"y":2652.7263937544244},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":117,"style":{"width":20,"height":117},"positionAbsolute":{"x":570,"y":2652.7263937544244},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"1_t82YAvkh8SCiyU_Otp8","type":"vertical","position":{"x":677,"y":2288.715898273103},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":1110,"style":{"width":20,"height":1110},"positionAbsolute":{"x":677,"y":2288.715898273103},"dragging":false,"resizing":false,"focusable":true,"selectable":true},{"id":"RSb6002qr_JXVKuIq40z2","type":"section","position":{"x":838.3356614935651,"y":2442.7243958663935},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":296,"height":186,"style":{"width":296,"height":186},"resizing":false,"positionAbsolute":{"x":838.3356614935651,"y":2442.7243958663935},"dragging":false,"selectable":true,"focusable":true},{"id":"zK_H4vmJXmyLYu1gVfhYK","type":"section","position":{"x":838.7247553252009,"y":2126.715898273103},"width":296,"height":331,"style":{"width":296,"height":331},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":838.7247553252009,"y":2126.715898273103},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"P7hG9GgyNRlmofosVs3ky","type":"vertical","position":{"x":88.5,"y":2319.227661473262},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"},"oldId":"hHhz7UIZIFgubv6pn5iKn"},"zIndex":999,"width":20,"height":60,"style":{"width":20,"height":60},"positionAbsolute":{"x":88.5,"y":2319.227661473262},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"1C4ZyHDYbp-ykYMBgGCgJ","type":"vertical","position":{"x":256.93627316762456,"y":2145.4100232103433},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":104,"style":{"width":20,"height":104},"positionAbsolute":{"x":256.93627316762456,"y":2145.4100232103433},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"hHhz7UIZIFgubv6pn5iKn","type":"vertical","position":{"x":88.5,"y":2008.0927158417944},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":226,"style":{"width":20,"height":226},"positionAbsolute":{"x":88.5,"y":2008.0927158417944},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"qrUpems5ggl3QG6PU5B9R","type":"section","position":{"x":63.77391817001211,"y":2735.4283305550825},"width":278,"height":164,"style":{"width":278,"height":164},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":63.77391817001211,"y":2735.4283305550825},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"UtzHMjmoyxrD9wHWWyfKI","type":"section","position":{"x":63.77391817001211,"y":2412.7263937544244},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":278,"height":331,"style":{"width":278,"height":331},"resizing":false,"positionAbsolute":{"x":63.77391817001211,"y":2412.7263937544244},"dragging":false,"selectable":true,"focusable":true},{"id":"4P2Sbyy2cVjOrXH75Hc2b","type":"section","position":{"x":487.3795624782034,"y":1896.0927158417944},"width":266,"height":272,"style":{"width":266,"height":272},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":487.3795624782034,"y":1896.0927158417944},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"OFEVSFDYuVn912lbBFEGV","type":"section","position":{"x":841.6087863651624,"y":1830.4687120415522},"width":295,"height":150,"style":{"width":295,"height":150},"selected":true,"data":{},"positionAbsolute":{"x":841.6087863651624,"y":1830.4687120415522},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"LVQKjfoO_nwMlmudTR5xf","type":"section","position":{"x":841.6087863651624,"y":1426.9424648726686},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":295,"height":372,"style":{"width":295,"height":372},"resizing":false,"dragging":false,"positionAbsolute":{"x":841.6087863651624,"y":1426.9424648726686},"selectable":true,"focusable":true},{"id":"Xj67gyzaoFU0809zao-Co","type":"horizontal","position":{"x":394.4565453870415,"y":1222.1146370882086},"selected":true,"data":{"label":"horizontal node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":139,"height":20,"style":{"width":139,"height":20},"positionAbsolute":{"x":394.4565453870415,"y":1222.1146370882086},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"s9fTyULS5azkrxwnXF3ZM","type":"section","position":{"x":65.4565453870415,"y":1189.060087180349},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":329,"height":599,"style":{"width":329,"height":599},"resizing":false,"positionAbsolute":{"x":65.4565453870415,"y":1189.060087180349},"dragging":false,"selectable":true,"focusable":true},{"id":"eilmLpxqlfX17bCbDDt5A","type":"horizontal","position":{"x":676.5,"y":1001.400748222349},"selected":true,"data":{"label":"horizontal node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":182,"height":20,"style":{"width":182,"height":20},"positionAbsolute":{"x":676.5,"y":1001.400748222349},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"QLCmjm7FEloKbKgZd69mp","type":"section","position":{"x":842.3618127280065,"y":902.900748222349},"width":298,"height":217,"style":{"width":298,"height":217},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":842.3618127280065,"y":902.900748222349},"dragging":false,"selectable":true,"focusable":true},{"id":"Nr60kOmUmudHb1H_ktoQh","type":"section","position":{"x":65.4565453870415,"y":784.900748222349},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":329,"height":378,"style":{"width":329,"height":378},"resizing":false,"dragging":false,"positionAbsolute":{"x":65.4565453870415,"y":784.900748222349},"selectable":true,"focusable":true},{"id":"CVA5JJQfQbLhUpq98LxxZ","type":"section","position":{"x":65.4565453870415,"y":590.900748222349},"width":329,"height":197,"style":{"width":329,"height":197},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":65.4565453870415,"y":590.900748222349},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"BO_Wx-cxY7Cr4U-9x-fpD","type":"section","position":{"x":842.3618127280065,"y":334.40074822234897},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":298,"height":430,"style":{"width":298,"height":430},"resizing":false,"positionAbsolute":{"x":842.3618127280065,"y":334.40074822234897},"selectable":true,"focusable":true,"dragging":false},{"width":189,"height":68,"id":"iogwMmOvub2ZF4zgg6WyF","type":"title","position":{"x":526.5,"y":-9.599251777651034},"selected":true,"data":{"label":"AI Engineer","style":{"fontSize":28,"justifyContent":"flex-start","textAlign":"center"},"oldId":"9nxw2PEl-_eQPW0FHNPq2"},"zIndex":999,"dragging":false,"positionAbsolute":{"x":526.5,"y":-9.599251777651034},"focusable":true,"selectable":true},{"width":202,"height":49,"id":"_hYN0gEi9BL24nptEtXWU","type":"topic","position":{"x":520,"y":253.37833957831333},"selected":true,"data":{"label":"Introduction","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"c1edrcSmHO_L2e9DGh7st"},"zIndex":999,"style":{"width":202,"height":49},"resizing":false,"positionAbsolute":{"x":520,"y":253.37833957831333},"dragging":false,"focusable":true,"selectable":true},{"id":"GN6SnI7RXIeW8JeD-qORW","type":"subtopic","position":{"x":842.3618127280065,"y":226.40074822234897},"selected":true,"data":{"label":"What is an AI Engineer?","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":298,"height":49,"style":{"width":298,"height":49},"positionAbsolute":{"x":842.3618127280065,"y":226.40074822234897},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"jSZ1LhPdhlkW-9QJhIvFs","type":"subtopic","position":{"x":842.3618127280065,"y":279.40074822234897},"selected":true,"data":{"label":"AI Engineer vs ML Engineer","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":298,"height":49,"style":{"width":298,"height":49},"positionAbsolute":{"x":842.3618127280065,"y":279.40074822234897},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"wf2BSyUekr1S1q6l8kyq6","type":"subtopic","position":{"x":1011.8618127280065,"y":342.90074822234897},"selected":true,"data":{"label":"LLMs","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":119,"height":49,"style":{"width":119,"height":49},"resizing":false,"positionAbsolute":{"x":1011.8618127280065,"y":342.90074822234897},"dragging":false,"selectable":true,"focusable":true},{"id":"KWjD4xEPhOOYS51dvRLd2","type":"subtopic","position":{"x":851.8618127280066,"y":396.40074822234897},"selected":true,"data":{"label":"Inference","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"Qh4ivGbpmhhCnhAMrlpI5"},"zIndex":999,"width":279,"height":49,"style":{"width":279,"height":49},"positionAbsolute":{"x":851.8618127280066,"y":396.40074822234897},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"xostGgoaYkqMO28iN2gx8","type":"subtopic","position":{"x":851.8618127280066,"y":448.90074822234897},"selected":true,"data":{"label":"Training","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":279,"height":49,"style":{"width":279,"height":49},"positionAbsolute":{"x":851.8618127280066,"y":448.90074822234897},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"XyEp6jnBSpCxMGwALnYfT","type":"subtopic","position":{"x":851.8618127280066,"y":501.40074822234897},"selected":true,"data":{"label":"Embeddings","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":279,"height":49,"style":{"width":279,"height":49},"positionAbsolute":{"x":851.8618127280066,"y":501.40074822234897},"selectable":true,"focusable":true,"dragging":false,"resizing":true},{"id":"LnQ2AatMWpExUHcZhDIPd","type":"subtopic","position":{"x":851.8618127280066,"y":553.900748222349},"selected":true,"data":{"label":"Vector Databases","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":279,"height":49,"style":{"width":279,"height":49},"positionAbsolute":{"x":851.8618127280066,"y":553.900748222349},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"9JwWIK0Z2MK8-6EQQJsCO","type":"subtopic","position":{"x":1011.8618127280065,"y":605.900748222349},"selected":true,"data":{"label":"RAG","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":119,"height":49,"style":{"width":119,"height":49},"resizing":false,"positionAbsolute":{"x":1011.8618127280065,"y":605.900748222349},"dragging":false,"selectable":true,"focusable":true},{"id":"Dc15ayFlzqMF24RqIF_-X","type":"subtopic","position":{"x":851.8618127280066,"y":658.900748222349},"selected":true,"data":{"label":"Prompt Engineering","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":279,"height":49,"style":{"width":279,"height":49},"positionAbsolute":{"x":851.8618127280066,"y":658.900748222349},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"9XCxilAQ7FRet7lHQr1gE","type":"subtopic","position":{"x":851.8618127280066,"y":606.400748222349},"selected":true,"data":{"label":"AI Agents","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":155,"height":49,"style":{"width":155,"height":49},"positionAbsolute":{"x":851.8618127280066,"y":606.400748222349},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"5QdihE1lLpMc3DFrGy46M","type":"subtopic","position":{"x":851.8618127280066,"y":342.90074822234897},"selected":true,"data":{"label":"AI vs AGI","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":155,"height":49,"style":{"width":155,"height":49},"resizing":false,"dragging":false,"positionAbsolute":{"x":851.8618127280066,"y":342.90074822234897},"selectable":true,"focusable":true},{"id":"yd1VRnSOeOzXF8fgl7CW4","type":"label","position":{"x":911.3618127280066,"y":717.400748222349},"selected":true,"data":{"label":"Common Terminology","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":182,"height":36,"style":{},"positionAbsolute":{"x":911.3618127280066,"y":717.400748222349},"dragging":false,"selectable":true,"focusable":true},{"id":"yHmHXymPNWwu8p1vvqD3o","type":"paragraph","position":{"x":808.4971847919508,"y":-105.15106699547101},"selected":true,"data":{"label":"Find the detailed version of this roadmap along with other similar roadmaps","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left","borderColor":"#000000","backgroundColor":"#FFFFFf"}},"zIndex":999,"width":354,"height":143,"positionAbsolute":{"x":808.4971847919508,"y":-105.15106699547101},"dragging":false,"selectable":true,"focusable":true,"style":{"width":354,"height":143},"resizing":false},{"id":"2zqZkyVgigifcRS1H7F_b","type":"button","position":{"x":821.7005592047509,"y":-23.165503577725815},"selected":true,"data":{"label":"roadmap.sh","href":"https://roadmap.sh","color":"#ffffff","backgroundColor":"#4136D6","style":{"fontSize":17}},"zIndex":999,"width":329,"height":49,"dragging":false,"style":{"width":329,"height":49},"resizing":false,"positionAbsolute":{"x":821.7005592047509,"y":-23.165503577725815},"selectable":true,"focusable":true},{"id":"5Irad96FtU3TkNZRK7x_8","type":"vertical","position":{"x":610.3795624782034,"y":-116.59925177765109},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":101,"style":{"width":20,"height":101},"positionAbsolute":{"x":610.3795624782034,"y":-116.59925177765109},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"MJvTQei3yqAMdLf5dACls","type":"button","position":{"x":71.5,"y":-44.62166042168667},"selected":true,"data":{"label":"Frontend","href":"https://roadmap.sh/frontend","color":"#000000","backgroundColor":"#d1d1d1","style":{"fontSize":17}},"zIndex":999,"width":127,"height":49,"style":{"width":127,"height":49},"positionAbsolute":{"x":71.5,"y":-44.62166042168667},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"9Vh9mUCXrYpTqEZexLW1L","type":"button","position":{"x":203,"y":-44.62166042168667},"selected":true,"data":{"label":"Backend","href":"https://roadmap.sh/backend","color":"#000000","backgroundColor":"#D1D1D1","style":{"fontSize":17}},"zIndex":999,"width":110,"height":49,"style":{"width":110,"height":49},"positionAbsolute":{"x":203,"y":-44.62166042168667},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"259d3vMaiFwnLF6ZecFyP","type":"button","position":{"x":317.5,"y":-44.62166042168667},"selected":true,"data":{"label":"Full-Stack","href":"https://roadmap.sh/full-stack","color":"#000000","backgroundColor":"#D1D1D1","style":{"fontSize":17}},"zIndex":999,"width":122,"height":49,"style":{"width":122,"height":49},"positionAbsolute":{"x":317.5,"y":-44.62166042168667},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"qJVgKe9uBvXc-YPfvX_Y7","type":"subtopic","position":{"x":842.3618127280065,"y":79.37833957831333},"selected":true,"data":{"label":"Impact on Product Development","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":298,"height":49,"style":{"width":298,"height":49},"positionAbsolute":{"x":842.3618127280065,"y":79.37833957831333},"dragging":false,"selectable":true,"focusable":true},{"id":"K9EiuFgPBFgeRxY4wxAmb","type":"subtopic","position":{"x":842.3618127280065,"y":132.37833957831333},"selected":true,"data":{"label":"Roles and Responsiblities","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":298,"height":49,"style":{"width":298,"height":49},"positionAbsolute":{"x":842.3618127280065,"y":132.37833957831333},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"wt_3LocKHpvsnsQdDI7LK","type":"paragraph","position":{"x":452.5,"y":378.40074822234897},"selected":true,"data":{"label":"Using Pre-trained Models","style":{"fontSize":20,"borderColor":"transparent","backgroundColor":"transparent","color":"#000000","textAlign":"center","justifyContent":"flex-start","padding":16}},"zIndex":999,"width":337,"height":67,"style":{"width":337,"height":67},"positionAbsolute":{"x":452.5,"y":378.40074822234897},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"d7fzv_ft12EopsQdmEsel","type":"topic","position":{"x":497,"y":510.40074822234897},"selected":true,"data":{"label":"Pre-trained Models","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":248,"height":49,"style":{"width":248,"height":49},"positionAbsolute":{"x":497,"y":510.40074822234897},"selectable":true,"focusable":true,"resizing":false,"dragging":false},{"id":"1Ga6DbOPc6Crz7ilsZMYy","type":"subtopic","position":{"x":65.4565453870415,"y":458.40074822234897},"selected":true,"data":{"label":"Benefits of Pre-trained Models","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":329,"height":49,"style":{"width":329,"height":49},"positionAbsolute":{"x":65.4565453870415,"y":458.40074822234897},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"MXqbQGhNM3xpXlMC2ib_6","type":"subtopic","position":{"x":65.4565453870415,"y":511.40074822234897},"selected":true,"data":{"label":"Limitations and Considerations","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":329,"height":49,"style":{"width":329,"height":49},"positionAbsolute":{"x":65.4565453870415,"y":511.40074822234897},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"ytU145_ip3ePMRKaroV-Z","type":"label","position":{"x":154,"y":791.900748222349},"selected":true,"data":{"label":"Popular AI Models","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":156,"height":36,"style":{},"positionAbsolute":{"x":154,"y":791.900748222349},"dragging":false,"selectable":true,"focusable":true},{"id":"2WbVpRLqwi3Oeqk1JPui4","type":"subtopic","position":{"x":78.5,"y":623.400748222349},"selected":true,"data":{"label":"Open AI Models","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":304,"height":49,"style":{"width":304,"height":49},"positionAbsolute":{"x":78.5,"y":623.400748222349},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"vvpYkmycH0_W030E-L12f","type":"subtopic","position":{"x":78.5,"y":676.400748222349},"selected":true,"data":{"label":"Capabilities / Context Length","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":304,"height":49,"style":{"width":304,"height":49},"positionAbsolute":{"x":78.5,"y":676.400748222349},"selectable":true,"focusable":true,"dragging":false},{"id":"LbB2PeytxRSuU07Bk0KlJ","type":"subtopic","position":{"x":78.5,"y":729.400748222349},"selected":true,"data":{"label":"Cut-off Dates / Knowledge","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":304,"height":49,"style":{"width":304,"height":49},"positionAbsolute":{"x":78.5,"y":729.400748222349},"dragging":false,"selectable":true,"focusable":true},{"id":"hy6EyKiNxk1x84J63dhez","type":"subtopic","position":{"x":78.5,"y":832.900748222349},"selected":true,"data":{"label":"Anthropic's Claude","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":304,"height":49,"style":{"width":304,"height":49},"positionAbsolute":{"x":78.5,"y":832.900748222349},"selectable":true,"focusable":true,"dragging":false},{"id":"oe8E6ZIQWuYvHVbYJHUc1","type":"subtopic","position":{"x":78.5,"y":885.900748222349},"selected":true,"data":{"label":"Google's Gemini","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":304,"height":49,"style":{"width":304,"height":49},"positionAbsolute":{"x":78.5,"y":885.900748222349},"selectable":true,"focusable":true,"dragging":false},{"id":"3PQVZbcr4neNMRr6CuNzS","type":"subtopic","position":{"x":78.5,"y":938.900748222349},"selected":true,"data":{"label":"Azure AI","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":113,"height":49,"style":{"width":113,"height":49},"positionAbsolute":{"x":78.5,"y":938.900748222349},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"OkYO-aSPiuVYuLXHswBCn","type":"subtopic","position":{"x":194.47059387846707,"y":938.900748222349},"selected":true,"data":{"label":"AWS Sagemaker","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":189,"height":49,"style":{"width":189,"height":49},"positionAbsolute":{"x":194.47059387846707,"y":938.900748222349},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"8XjkRqHOdyH-DbXHYiBEt","type":"subtopic","position":{"x":78.5,"y":992.8781089665497},"selected":true,"data":{"label":"Hugging Face Models","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":304,"height":49,"style":{"width":304,"height":49},"positionAbsolute":{"x":78.5,"y":992.8781089665497},"selectable":true,"focusable":true,"dragging":false},{"id":"n-Ud2dXkqIzK37jlKItN4","type":"subtopic","position":{"x":79.5,"y":1044.8781089665497},"selected":true,"data":{"label":"Mistral AI","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":158,"height":49,"style":{"width":158,"height":49},"positionAbsolute":{"x":79.5,"y":1044.8781089665497},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"a7qsvoauFe5u953I699ps","type":"subtopic","position":{"x":240.5,"y":1044.8781089665497},"selected":true,"data":{"label":"Cohere","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":142,"height":49,"style":{"width":142,"height":49},"positionAbsolute":{"x":240.5,"y":1044.8781089665497},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"5ShWZl1QUqPwO-NRGN85V","type":"subtopic","position":{"x":65.4565453870415,"y":566.400748222349},"selected":true,"data":{"label":"OpenAI Models","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center","colorType":"c"}},"zIndex":999,"width":329,"height":49,"style":{"width":329,"height":49},"resizing":false,"positionAbsolute":{"x":65.4565453870415,"y":566.400748222349},"dragging":false,"selectable":true,"focusable":true},{"id":"wr2_2ADvySOUZxzEo1Uw1","type":"paragraph","position":{"x":507,"y":707.900748222349},"selected":true,"data":{"label":"Open AI Platform","style":{"fontSize":20,"borderColor":"transparent","backgroundColor":"transparent","color":"#000000","textAlign":"center","justifyContent":"flex-start","padding":16},"oldId":"wt_3LocKHpvsnsQdDI7LK"},"zIndex":999,"width":228,"height":66,"style":{"width":228,"height":66},"positionAbsolute":{"x":507,"y":707.900748222349},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"zdeuA4GbdBl2DwKgiOA4G","type":"topic","position":{"x":528,"y":986.900748222349},"selected":true,"data":{"label":"OpenAI API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"d7fzv_ft12EopsQdmEsel"},"zIndex":999,"width":186,"height":49,"style":{"width":186,"height":49},"positionAbsolute":{"x":528,"y":986.900748222349},"selectable":true,"focusable":true,"resizing":false,"dragging":false},{"id":"_bPTciEA1GT1JwfXim19z","type":"subtopic","position":{"x":842.3618127280065,"y":795.900748222349},"selected":true,"data":{"label":"Chat Completions API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":298,"height":49,"style":{"width":298,"height":49},"positionAbsolute":{"x":842.3618127280065,"y":795.900748222349},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"9-5DYeOnKJq9XvEMWP45A","type":"subtopic","position":{"x":842.3618127280065,"y":848.900748222349},"selected":true,"data":{"label":"Writing Prompts","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":298,"height":49,"style":{"width":298,"height":49},"positionAbsolute":{"x":842.3618127280065,"y":848.900748222349},"selectable":true,"focusable":true,"dragging":false},{"id":"nyBgEHvUhwF-NANMwkRJW","type":"subtopic","position":{"x":842.3618127280065,"y":1126.900748222349},"selected":true,"data":{"label":"Open AI Playground","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":298,"height":49,"style":{"width":298,"height":49},"positionAbsolute":{"x":842.3618127280065,"y":1126.900748222349},"selectable":true,"focusable":true,"dragging":false},{"id":"15XOFdVp0IC-kLYPXUJWh","type":"subtopic","position":{"x":842.3618127280065,"y":1179.900748222349},"selected":true,"data":{"label":"Fine-tuning","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":298,"height":49,"style":{"width":298,"height":49},"positionAbsolute":{"x":842.3618127280065,"y":1179.900748222349},"selectable":true,"focusable":true,"dragging":false},{"id":"93tz7xYnToF3AMd_JKkNu","type":"label","position":{"x":920,"y":1070.900748222349},"selected":true,"data":{"label":"Managing Tokens","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":151,"height":36,"style":{},"positionAbsolute":{"x":920,"y":1070.900748222349},"selectable":true,"focusable":true,"dragging":false},{"id":"qzvp6YxWDiGakA2mtspfh","type":"subtopic","position":{"x":851.8618127280066,"y":910.900748222349},"selected":true,"data":{"label":"Maximum Tokens","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":279,"height":49,"style":{"width":279,"height":49},"positionAbsolute":{"x":851.8618127280066,"y":910.900748222349},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"FjV3oD7G2Ocq5HhUC17iH","type":"subtopic","position":{"x":851.8618127280066,"y":963.900748222349},"selected":true,"data":{"label":"Token Counting","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":279,"height":49,"style":{"width":279,"height":49},"positionAbsolute":{"x":851.8618127280066,"y":963.900748222349},"selectable":true,"focusable":true,"dragging":false},{"id":"DZPM9zjCbYYWBPLmQImxQ","type":"subtopic","position":{"x":851.8618127280066,"y":1016.900748222349},"selected":true,"data":{"label":"Pricing Considerations","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":279,"height":49,"style":{"width":279,"height":49},"dragging":false,"resizing":false,"positionAbsolute":{"x":851.8618127280066,"y":1016.900748222349},"selectable":true,"focusable":true},{"id":"nXsjZiJGgFyOO8b0J-E2V","type":"button","position":{"x":842.3618127280065,"y":1233.900748222349},"selected":true,"data":{"label":"Prompt Engineering Roadmap","href":"https://roadmap.sh/prompt-engineering","color":"#ffffff","backgroundColor":"#2a79e4","style":{"fontSize":17}},"zIndex":999,"width":298,"height":49,"style":{"width":298,"height":49},"positionAbsolute":{"x":842.3618127280065,"y":1233.900748222349},"dragging":false,"selectable":true,"focusable":true},{"id":"8ndKHDJgL_gYwaXC7XMer","type":"topic","position":{"x":522.5,"y":1207.6146370882086},"selected":true,"data":{"label":"AI Safety and Ethics","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"a_3SabylVqzzOyw3tZN5f"},"zIndex":999,"width":197,"height":49,"style":{"width":197,"height":49},"positionAbsolute":{"x":522.5,"y":1207.6146370882086},"dragging":false,"selectable":true,"focusable":true},{"id":"r3lmdGQuphdbxA3Zd3e8x","type":"label","position":{"x":102.47059387846707,"y":1365.6030951949779},"selected":true,"data":{"label":"Understanding AI Safety Issues","href":"","color":"#000000","style":{"fontSize":17},"oldId":"_G2yiGWt55mSuqhfEL_vt"},"zIndex":999,"width":255,"height":36,"style":{},"dragging":false,"positionAbsolute":{"x":102.47059387846707,"y":1365.6030951949779},"selectable":true,"focusable":true},{"id":"cUyLT6ctYQ1pgmodCKREq","type":"subtopic","position":{"x":76.47059387846707,"y":1199.5015627391044},"selected":true,"data":{"label":"Prompt Injection Attacks","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":307,"height":49,"style":{"width":307,"height":49},"positionAbsolute":{"x":76.47059387846707,"y":1199.5015627391044},"selectable":true,"focusable":true,"dragging":false},{"id":"lhIU0ulpvDAn1Xc3ooYz_","type":"subtopic","position":{"x":76.47059387846707,"y":1305.5015627391044},"selected":true,"data":{"label":"Bias and Fairness","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":307,"height":49,"style":{"width":307,"height":49},"positionAbsolute":{"x":76.47059387846707,"y":1305.5015627391044},"selectable":true,"focusable":true,"dragging":false},{"id":"sWBT-j2cRuFqRFYtV_5TK","type":"subtopic","position":{"x":76.47059387846707,"y":1252.5015627391044},"selected":true,"data":{"label":"Security and Privacy Concerns","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":307,"height":49,"style":{"width":307,"height":49},"positionAbsolute":{"x":76.47059387846707,"y":1252.5015627391044},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"Pt-AJmSJrOxKvolb5_HEv","type":"subtopic","position":{"x":76.47059387846707,"y":1520.7260836911958},"selected":true,"data":{"label":"Conducting adversarial testing","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"ONLDyczNacGVZGojYyJrU"},"zIndex":999,"width":307,"height":49,"style":{"width":307,"height":49},"positionAbsolute":{"x":76.47059387846707,"y":1520.7260836911958},"selectable":true,"focusable":true,"dragging":false},{"id":"ljZLa3yjQpegiZWwtnn_q","type":"subtopic","position":{"x":76.47059387846707,"y":1414.7260836911958},"selected":true,"data":{"label":"OpenAI Moderation API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":307,"height":49,"style":{"width":307,"height":49},"positionAbsolute":{"x":76.47059387846707,"y":1414.7260836911958},"selectable":true,"focusable":true,"dragging":false},{"id":"4Q5x2VCXedAWISBXUIyin","type":"subtopic","position":{"x":76.47059387846707,"y":1467.7260836911958},"selected":true,"data":{"label":"Adding end-user IDs in prompts","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":307,"height":49,"style":{"width":307,"height":49},"positionAbsolute":{"x":76.47059387846707,"y":1467.7260836911958},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"qmx6OHqx4_0JXVIv8dASp","type":"subtopic","position":{"x":76.47059387846707,"y":1573.7260836911958},"selected":true,"data":{"label":"Robust prompt engineering","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"ONLDyczNacGVZGojYyJrU"},"zIndex":999,"width":307,"height":49,"style":{"width":307,"height":49},"positionAbsolute":{"x":76.47059387846707,"y":1573.7260836911958},"selectable":true,"focusable":true,"dragging":false},{"id":"t1SObMWkDZ1cKqNNlcd9L","type":"subtopic","position":{"x":76.47059387846707,"y":1626.7260836911958},"selected":true,"data":{"label":"Know your Customers / Usecases","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"ONLDyczNacGVZGojYyJrU"},"zIndex":999,"width":307,"height":49,"style":{"width":307,"height":49},"positionAbsolute":{"x":76.47059387846707,"y":1626.7260836911958},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"ONLDyczNacGVZGojYyJrU","type":"subtopic","position":{"x":76.47059387846707,"y":1679.7260836911958},"selected":true,"data":{"label":"Constraining outputs and inputs","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":307,"height":49,"style":{"width":307,"height":49},"positionAbsolute":{"x":76.47059387846707,"y":1679.7260836911958},"selectable":true,"focusable":true,"dragging":false},{"id":"_G2yiGWt55mSuqhfEL_vt","type":"label","position":{"x":140.47059387846707,"y":1740.701849711868},"selected":true,"data":{"label":"Safety Best Practices","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":179,"height":36,"style":{},"dragging":false,"positionAbsolute":{"x":140.47059387846707,"y":1740.701849711868},"selectable":true,"focusable":true},{"id":"a_3SabylVqzzOyw3tZN5f","type":"topic","position":{"x":522.5,"y":1372.7838848882502},"selected":true,"data":{"label":"OpenSource AI","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":197,"height":49,"style":{"width":197,"height":49},"positionAbsolute":{"x":522.5,"y":1372.7838848882502},"dragging":false,"selectable":true,"focusable":true},{"id":"RBwGsq9DngUsl8PrrCbqx","type":"subtopic","position":{"x":841.1539837884804,"y":1318.7838848882502},"selected":true,"data":{"label":"Open vs Closed Source Models","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"rTT2UnvqFO3GH6ThPLEjO"},"zIndex":999,"width":298,"height":49,"style":{"width":298,"height":49},"positionAbsolute":{"x":841.1539837884804,"y":1318.7838848882502},"dragging":false,"selectable":true,"focusable":true},{"id":"97eu-XxYUH9pYbD_KjAtA","type":"subtopic","position":{"x":841.1539837884804,"y":1372.7838848882502},"selected":true,"data":{"label":"Popular Open Source Models","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"rTT2UnvqFO3GH6ThPLEjO"},"zIndex":999,"width":298,"height":49,"style":{"width":298,"height":49},"positionAbsolute":{"x":841.1539837884804,"y":1372.7838848882502},"dragging":false,"selectable":true,"focusable":true},{"id":"v99C5Bml2a6148LCJ9gy9","type":"topic","position":{"x":841.6087863651624,"y":1426.9424648726686},"selected":true,"data":{"label":"Hugging Face","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"rTT2UnvqFO3GH6ThPLEjO"},"zIndex":999,"width":295,"height":49,"style":{"width":295,"height":49},"positionAbsolute":{"x":841.6087863651624,"y":1426.9424648726686},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"YLOdOvLXa5Fa7_mmuvKEi","type":"subtopic","position":{"x":851.6087863651624,"y":1580.9265129447253},"selected":true,"data":{"label":"Hugging Face Hub","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"bGLrbpxKgENe2xS1eQtdh"},"zIndex":999,"width":275,"height":49,"style":{"width":275,"height":49},"positionAbsolute":{"x":851.6087863651624,"y":1580.9265129447253},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"YKIPOiSj_FNtg0h8uaSMq","type":"subtopic","position":{"x":851.6087863651624,"y":1527.9265129447253},"selected":true,"data":{"label":"Hugging Face Tasks","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":275,"height":49,"style":{"width":275,"height":49},"positionAbsolute":{"x":851.6087863651624,"y":1527.9265129447253},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"nDVgsa7xov1RjEMJeFAE9","type":"label","position":{"x":869.6087863651624,"y":1486.6598997473122},"selected":true,"data":{"label":"Finding Open Source Models","href":"","color":"#000000","style":{"fontSize":17},"oldId":"dDYwvkBj-voqoFCqSBfVr"},"zIndex":999,"width":239,"height":36,"style":{},"positionAbsolute":{"x":869.6087863651624,"y":1486.6598997473122},"dragging":false,"selectable":true,"focusable":true},{"id":"dDYwvkBj-voqoFCqSBfVr","type":"label","position":{"x":875.6087863651624,"y":1641.8285839892083},"selected":true,"data":{"label":"Using Open Source Models","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":227,"height":36,"style":{},"positionAbsolute":{"x":875.6087863651624,"y":1641.8285839892083},"dragging":false,"selectable":true,"focusable":true},{"id":"3kRTzlLNBnXdTsAEXVu_M","type":"subtopic","position":{"x":851.6087863651624,"y":1682.8285839892083},"selected":true,"data":{"label":"Inference SDK","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"bGLrbpxKgENe2xS1eQtdh"},"zIndex":999,"width":275,"height":49,"style":{"width":275,"height":49},"positionAbsolute":{"x":851.6087863651624,"y":1682.8285839892083},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"bGLrbpxKgENe2xS1eQtdh","type":"subtopic","position":{"x":851.6087863651624,"y":1735.8285839892083},"selected":true,"data":{"label":"Transformers.js","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":275,"height":49,"style":{"width":275,"height":49},"positionAbsolute":{"x":851.6087863651624,"y":1735.8285839892083},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"rTT2UnvqFO3GH6ThPLEjO","type":"topic","position":{"x":841.6087863651624,"y":1805.9687120415522},"selected":true,"data":{"label":"Ollama","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":295,"height":49,"style":{"width":295,"height":49},"positionAbsolute":{"x":841.6087863651624,"y":1805.9687120415522},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"ro3vY_sp6xMQ-hfzO-rc1","type":"subtopic","position":{"x":851.6087863651624,"y":1862.9687120415522},"selected":true,"data":{"label":"Ollama Models","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":275,"height":49,"style":{"width":275,"height":49},"positionAbsolute":{"x":851.6087863651624,"y":1862.9687120415522},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"TsG_I7FL-cOCSw8gvZH3r","type":"subtopic","position":{"x":851.6087863651624,"y":1916.9687120415522},"selected":true,"data":{"label":"Ollama SDK","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":275,"height":49,"style":{"width":275,"height":49},"positionAbsolute":{"x":851.6087863651624,"y":1916.9687120415522},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"--ig0Ume_BnXb9K2U7HJN","type":"topic","position":{"x":487.3795624782034,"y":1814.9687120415522},"selected":true,"data":{"label":"What are Embeddings","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"tt9u3oFlsjEMfPyojuqpc"},"zIndex":999,"width":266,"height":49,"style":{"width":266,"height":49},"positionAbsolute":{"x":487.3795624782034,"y":1814.9687120415522},"dragging":false,"selectable":true,"focusable":true},{"id":"eMfcyBxnMY_l_5-8eg6sD","type":"subtopic","position":{"x":497.90686980833937,"y":1906.0927158417944},"selected":true,"data":{"label":"Semantic Search","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":250,"height":49,"style":{"width":250,"height":49},"dragging":false,"positionAbsolute":{"x":497.90686980833937,"y":1906.0927158417944},"selectable":true,"focusable":true},{"id":"HQe9GKy3p0kTUPxojIfSF","type":"subtopic","position":{"x":497.90686980833937,"y":2012.0927158417944},"selected":true,"data":{"label":"Recommendation Systems","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":250,"height":49,"style":{"width":250,"height":49},"dragging":false,"positionAbsolute":{"x":497.90686980833937,"y":2012.0927158417944},"selectable":true,"focusable":true},{"id":"AglWJ7gb9rTT2rMkstxtk","type":"subtopic","position":{"x":497.90686980833937,"y":2065.0927158417944},"selected":true,"data":{"label":"Anomaly Detection","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":250,"height":49,"style":{"width":250,"height":49},"dragging":false,"positionAbsolute":{"x":497.90686980833937,"y":2065.0927158417944},"selectable":true,"focusable":true},{"id":"06Xta-OqSci05nV2QMFdF","type":"subtopic","position":{"x":497.90686980833937,"y":1959.0927158417944},"selected":true,"data":{"label":"Data Classification","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":250,"height":49,"style":{"width":250,"height":49},"dragging":false,"positionAbsolute":{"x":497.90686980833937,"y":1959.0927158417944},"selectable":true,"focusable":true},{"id":"OZvk1d0XxXwJwbEUYqnFq","type":"paragraph","position":{"x":450.8795624782034,"y":1573.7260836911958},"selected":true,"data":{"label":"Embeddings & Vector Databases","style":{"fontSize":20,"borderColor":"transparent","backgroundColor":"transparent","color":"#000000","textAlign":"center","justifyContent":"center","padding":16}},"zIndex":999,"width":339,"height":64,"style":{"width":339,"height":64},"positionAbsolute":{"x":450.8795624782034,"y":1573.7260836911958},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"S4LeKcmhmhOxGmDXWrYSW","type":"label","position":{"x":509.90686980833937,"y":2125.0927158417944},"selected":true,"data":{"label":"Use Cases for Embeddings","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":226,"height":36,"style":{},"positionAbsolute":{"x":509.90686980833937,"y":2125.0927158417944},"dragging":false,"selectable":true,"focusable":true},{"id":"l6priWeJhbdUD5tJ7uHyG","type":"topic","position":{"x":62.71396345748872,"y":1980.4687120415522},"selected":true,"data":{"label":"Open AI Embeddings API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"tt9u3oFlsjEMfPyojuqpc"},"zIndex":999,"width":264,"height":49,"style":{"width":264,"height":49},"positionAbsolute":{"x":62.71396345748872,"y":1980.4687120415522},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"y0qD5Kb4Pf-ymIwW-tvhX","type":"subtopic","position":{"x":62.71396345748872,"y":1830.6426346064957},"selected":true,"data":{"label":"Open AI Embedding Models","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"4GArjDYipit4SLqKZAWDf"},"zIndex":999,"width":264,"height":49,"style":{"width":264,"height":49},"positionAbsolute":{"x":62.71396345748872,"y":1830.6426346064957},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"4GArjDYipit4SLqKZAWDf","type":"subtopic","position":{"x":62.71396345748872,"y":1883.6426346064957},"selected":true,"data":{"label":"Pricing Considerations","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":264,"height":49,"style":{"width":264,"height":49},"positionAbsolute":{"x":62.71396345748872,"y":1883.6426346064957},"dragging":false,"selectable":true,"focusable":true},{"id":"apVYIV4EyejPft25oAvdI","type":"topic","position":{"x":62.5,"y":2216.727661473262},"selected":true,"data":{"label":"Open-Source Embeddings","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"tt9u3oFlsjEMfPyojuqpc"},"zIndex":999,"width":278,"height":49,"style":{"width":278,"height":49},"positionAbsolute":{"x":62.5,"y":2216.727661473262},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"ZV_V6sqOnRodgaw4mzokC","type":"subtopic","position":{"x":134.93627316762456,"y":2063.3782051585886},"selected":true,"data":{"label":"Sentence Transformers","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"dLEg4IA3F5jgc44Bst9if"},"zIndex":999,"width":264,"height":49,"style":{"width":264,"height":49},"positionAbsolute":{"x":134.93627316762456,"y":2063.3782051585886},"dragging":false,"selectable":true,"focusable":true},{"id":"dLEg4IA3F5jgc44Bst9if","type":"subtopic","position":{"x":134.93627316762456,"y":2116.3782051585886},"selected":true,"data":{"label":"Models on Hugging Face","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":264,"height":49,"style":{"width":264,"height":49},"positionAbsolute":{"x":134.93627316762456,"y":2116.3782051585886},"dragging":false,"selectable":true,"focusable":true},{"id":"tt9u3oFlsjEMfPyojuqpc","type":"topic","position":{"x":62.5,"y":2268.2838160405004},"selected":true,"data":{"label":"Vector Databases","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":278,"height":49,"style":{"width":278,"height":49},"positionAbsolute":{"x":62.5,"y":2268.2838160405004},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"WcjX6p-V-Rdd77EL8Ega9","type":"subtopic","position":{"x":62.5,"y":2358.7263937544244},"selected":true,"data":{"label":"Purpose and Functionality","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":278,"height":49,"style":{"width":278,"height":49},"positionAbsolute":{"x":62.5,"y":2358.7263937544244},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"dSd2C9lNl-ymmCRT9_ZC3","type":"subtopic","position":{"x":73.27752658021024,"y":2464.8371549138815},"selected":true,"data":{"label":"Chroma","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":127,"height":49,"style":{"width":127,"height":49},"resizing":false,"positionAbsolute":{"x":73.27752658021024,"y":2464.8371549138815},"dragging":false,"selectable":true,"focusable":true},{"id":"_Cf7S1DCvX7p1_3-tP3C3","type":"subtopic","position":{"x":204.27752658021024,"y":2464.8371549138815},"selected":true,"data":{"label":"Pinecone","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":130,"height":49,"style":{"width":130,"height":49},"resizing":false,"positionAbsolute":{"x":204.27752658021024,"y":2464.8371549138815},"dragging":false,"selectable":true,"focusable":true},{"id":"VgUnrZGKVjAAO4n_llq5-","type":"subtopic","position":{"x":73.27752658021024,"y":2517.8371549138815},"selected":true,"data":{"label":"Weaviate","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":127,"height":49,"style":{"width":127,"height":49},"positionAbsolute":{"x":73.27752658021024,"y":2517.8371549138815},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"JurLbOO1Z8r6C3yUqRNwf","type":"subtopic","position":{"x":204.27752658021024,"y":2517.8371549138815},"selected":true,"data":{"label":"FAISS","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":130,"height":49,"style":{"width":130,"height":49},"resizing":false,"positionAbsolute":{"x":204.27752658021024,"y":2517.8371549138815},"dragging":false,"selectable":true,"focusable":true},{"id":"rjaCNT3Li45kwu2gXckke","type":"subtopic","position":{"x":73.27752658021024,"y":2570.8371549138815},"selected":true,"data":{"label":"LanceDB","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":127,"height":49,"style":{"width":127,"height":49},"resizing":false,"positionAbsolute":{"x":73.27752658021024,"y":2570.8371549138815},"dragging":false,"selectable":true,"focusable":true},{"id":"DwOAL5mOBgBiw-EQpAzQl","type":"subtopic","position":{"x":204.27752658021024,"y":2570.8371549138815},"selected":true,"data":{"label":"Qdrant","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":130,"height":49,"style":{"width":130,"height":49},"resizing":false,"positionAbsolute":{"x":204.27752658021024,"y":2570.8371549138815},"dragging":false,"selectable":true,"focusable":true},{"id":"9kT7EEQsbeD2WDdN9ADx7","type":"subtopic","position":{"x":73.27752658021024,"y":2624.8371549138815},"selected":true,"data":{"label":"Supabase","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":261,"height":49,"style":{"width":261,"height":49},"positionAbsolute":{"x":73.27752658021024,"y":2624.8371549138815},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"j6bkm0VUgLkHdMDDJFiMC","type":"subtopic","position":{"x":73.27752658021024,"y":2677.8371549138815},"selected":true,"data":{"label":"MongoDB Atlas","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":261,"height":49,"style":{"width":261,"height":49},"dragging":false,"positionAbsolute":{"x":73.27752658021024,"y":2677.8371549138815},"selectable":true,"focusable":true},{"id":"HCuwQPBl48sRzdbxdf_E5","type":"label","position":{"x":79.27391817001211,"y":2423.8371549138815},"selected":true,"data":{"label":"Popular Vector DBs (pick one)","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":247,"height":36,"style":{},"positionAbsolute":{"x":79.27391817001211,"y":2423.8371549138815},"dragging":false,"selectable":true,"focusable":true},{"id":"5TQnO9B4_LTHwqjI7iHB1","type":"subtopic","position":{"x":72.71593368999282,"y":2787.1963926350054},"selected":true,"data":{"label":"Indexing Embeddings","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":262,"height":49,"style":{"width":262,"height":49},"positionAbsolute":{"x":72.71593368999282,"y":2787.1963926350054},"dragging":false,"selectable":true,"focusable":true},{"id":"ZcbRPtgaptqKqWBgRrEBU","type":"subtopic","position":{"x":73.21593368999282,"y":2840.1963926350054},"selected":true,"data":{"label":"Performing Similarity Search","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":261,"height":49,"style":{"width":261,"height":49},"dragging":false,"positionAbsolute":{"x":73.21593368999282,"y":2840.1963926350054},"resizing":false,"selectable":true,"focusable":true},{"id":"xsvdnT7BIbR_jAajTYDWw","type":"label","position":{"x":86.27391817001211,"y":2743.7263937544244},"selected":true,"data":{"label":"Implementing Vector Search","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":233,"height":36,"style":{},"positionAbsolute":{"x":86.27391817001211,"y":2743.7263937544244},"dragging":false,"selectable":true,"focusable":true},{"id":"lVhWhZGR558O-ljHobxIi","type":"topic","position":{"x":520,"y":2268.2838160405004},"selected":true,"data":{"label":"RAG & Implementation","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"W7cKPt_UxcUgwp8J6hS4p"},"zIndex":999,"width":220,"height":49,"style":{"width":220,"height":49},"positionAbsolute":{"x":520,"y":2268.2838160405004},"dragging":false,"selectable":true,"focusable":true},{"id":"GCn4LGNEtPI0NWYAZCRE-","type":"subtopic","position":{"x":839.7247553252009,"y":2018.167205684323},"selected":true,"data":{"label":"RAG Usecases","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":295,"height":49,"style":{"width":295,"height":49},"positionAbsolute":{"x":839.7247553252009,"y":2018.167205684323},"dragging":false,"selectable":true,"focusable":true},{"id":"qlBEXrbV88e_wAGRwO9hW","type":"subtopic","position":{"x":839.7247553252009,"y":2071.167205684323},"selected":true,"data":{"label":"RAG vs Fine-tuning","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":295,"height":49,"style":{"width":295,"height":49},"dragging":false,"positionAbsolute":{"x":839.7247553252009,"y":2071.167205684323},"selectable":true,"focusable":true},{"id":"mX987wiZF7p3V_gExrPeX","type":"subtopic","position":{"x":851.4069839913399,"y":2177.715898273103},"selected":true,"data":{"label":"Chunking","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"2jJnS9vRYhaS69d6OxrMh"},"zIndex":999,"width":272,"height":49,"style":{"width":272,"height":49},"positionAbsolute":{"x":851.4069839913399,"y":2177.715898273103},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"grTcbzT7jKk_sIUwOTZTD","type":"subtopic","position":{"x":851.4069839913398,"y":2230.715898273103},"selected":true,"data":{"label":"Embedding","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"2jJnS9vRYhaS69d6OxrMh"},"zIndex":999,"width":272,"height":49,"style":{"width":272,"height":49},"positionAbsolute":{"x":851.4069839913398,"y":2230.715898273103},"dragging":false,"selectable":true,"focusable":true},{"id":"zZA1FBhf1y4kCoUZ-hM4H","type":"subtopic","position":{"x":851.4069839913398,"y":2283.715898273103},"selected":true,"data":{"label":"Vector Database","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"2jJnS9vRYhaS69d6OxrMh"},"zIndex":999,"width":272,"height":49,"style":{"width":272,"height":49},"positionAbsolute":{"x":851.4069839913398,"y":2283.715898273103},"dragging":false,"selectable":true,"focusable":true},{"id":"OCGCzHQM2LQyUWmiqe6E0","type":"subtopic","position":{"x":851.4069839913398,"y":2336.715898273103},"selected":true,"data":{"label":"Retrieval Process","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"2jJnS9vRYhaS69d6OxrMh"},"zIndex":999,"width":272,"height":49,"style":{"width":272,"height":49},"positionAbsolute":{"x":851.4069839913398,"y":2336.715898273103},"dragging":false,"selectable":true,"focusable":true},{"id":"2jJnS9vRYhaS69d6OxrMh","type":"subtopic","position":{"x":851.4069839913398,"y":2389.715898273103},"selected":true,"data":{"label":"Generation","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":272,"height":49,"style":{"width":272,"height":49},"positionAbsolute":{"x":851.4069839913398,"y":2389.715898273103},"dragging":false,"selectable":true,"focusable":true},{"id":"Bt536neIoWehPSHUB6l_n","type":"label","position":{"x":906.2247553252009,"y":2137.0058206731997},"selected":true,"data":{"label":"Implementing RAG","href":"","color":"#000000","style":{"fontSize":17},"oldId":"v9whDFmN8Wf3oKlaOtHMD"},"zIndex":999,"width":161,"height":36,"style":{},"positionAbsolute":{"x":906.2247553252009,"y":2137.0058206731997},"dragging":false,"selectable":true,"focusable":true},{"id":"v9whDFmN8Wf3oKlaOtHMD","type":"label","position":{"x":874.3356614935651,"y":2468.2465978906853},"selected":true,"data":{"label":"Ways of Implementing RAG","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":225,"height":36,"style":{},"positionAbsolute":{"x":874.3356614935651,"y":2468.2465978906853},"dragging":false,"selectable":true,"focusable":true},{"id":"WZVW8FQu6LyspSKm1C_sl","type":"subtopic","position":{"x":847.8356614935651,"y":2514.3420928710716},"selected":true,"data":{"label":"Using SDKs Directly","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":278,"height":49,"style":{"width":278,"height":49},"positionAbsolute":{"x":847.8356614935651,"y":2514.3420928710716},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"ebXXEhNRROjbbof-Gym4p","type":"subtopic","position":{"x":847.8356614935651,"y":2567.3420928710716},"selected":true,"data":{"label":"Langchain","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"axwBe98SYWkguEwbMipIm"},"zIndex":999,"width":132,"height":49,"style":{"width":132,"height":49},"positionAbsolute":{"x":847.8356614935651,"y":2567.3420928710716},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"d0ontCII8KI8wfP-8Y45R","type":"subtopic","position":{"x":984.8356614935651,"y":2567.3420928710716},"selected":true,"data":{"label":"Llama Index","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"ebXXEhNRROjbbof-Gym4p"},"zIndex":999,"width":141,"height":49,"style":{"width":141,"height":49},"positionAbsolute":{"x":984.8356614935651,"y":2567.3420928710716},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"eOqCBgBTKM8CmY3nsWjre","type":"topic","position":{"x":520,"y":2393.7243958663935},"selected":true,"data":{"label":"Open AI Assistant API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"W7cKPt_UxcUgwp8J6hS4p"},"zIndex":999,"width":220,"height":49,"style":{"width":220,"height":49},"positionAbsolute":{"x":520,"y":2393.7243958663935},"dragging":false,"selectable":true,"focusable":true},{"id":"c0RPhpD00VIUgF4HJgN2T","type":"subtopic","position":{"x":78.5,"y":1098.8781089665497},"selected":true,"data":{"label":"Replicate","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"n-Ud2dXkqIzK37jlKItN4"},"zIndex":999,"width":304,"height":49,"style":{"width":304,"height":49},"positionAbsolute":{"x":78.5,"y":1098.8781089665497},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"AeHkNU-uJ_gBdo5-xdpEu","type":"topic","position":{"x":533.3795624782034,"y":2739.3420928710716},"selected":true,"data":{"label":"AI Agents","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"W7cKPt_UxcUgwp8J6hS4p"},"zIndex":999,"width":220,"height":49,"style":{"width":220,"height":49},"positionAbsolute":{"x":533.3795624782034,"y":2739.3420928710716},"dragging":false,"selectable":true,"focusable":true},{"id":"pqnC9N-AUKg0vjKzuCNqd","type":"label","position":{"x":516.5,"y":2354.715898273103},"selected":true,"data":{"label":"RAG Alternative","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":137,"height":36,"style":{},"positionAbsolute":{"x":516.5,"y":2354.715898273103},"dragging":false,"focusable":true,"selectable":true},{"id":"778HsQzTuJ_3c9OSn5DmH","type":"subtopic","position":{"x":405.1180805793284,"y":2527.2038885388165},"selected":true,"data":{"label":"Agents Usecases","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"6xaRB34_g0HGt-y1dGYXR"},"zIndex":999,"width":239,"height":49,"style":{"width":239,"height":49},"positionAbsolute":{"x":405.1180805793284,"y":2527.2038885388165},"dragging":false,"focusable":true,"selectable":true},{"id":"BRdKYsyWaHg6kJA62mLNO","type":"button","position":{"x":405.1180805793284,"y":2580.2038885388165},"selected":true,"data":{"label":"Prompt Engineering","href":"https://roadmap.sh/prompt-engineering","color":"#ffffff","backgroundColor":"#2a79e4","style":{"fontSize":17}},"zIndex":999,"width":239,"height":49,"style":{"width":239,"height":49},"dragging":false,"positionAbsolute":{"x":405.1180805793284,"y":2580.2038885388165},"focusable":true,"selectable":true},{"id":"voDKcKvXtyLzeZdx2g3Qn","type":"subtopic","position":{"x":405.1180805793284,"y":2633.2038885388165},"selected":true,"data":{"label":"ReAct Prompting","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"6xaRB34_g0HGt-y1dGYXR"},"zIndex":999,"width":239,"height":49,"style":{"width":239,"height":49},"positionAbsolute":{"x":405.1180805793284,"y":2633.2038885388165},"dragging":false,"focusable":true,"selectable":true},{"id":"6xaRB34_g0HGt-y1dGYXR","type":"subtopic","position":{"x":848.3202732289765,"y":2706.1704183412},"selected":true,"data":{"label":"Manual Implementation","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":280,"height":49,"style":{"width":280,"height":49},"positionAbsolute":{"x":848.3202732289765,"y":2706.1704183412},"dragging":false,"focusable":true,"resizing":false,"selectable":true},{"id":"Sm0Ne5Nx72hcZCdAcC0C2","type":"subtopic","position":{"x":848.3202732289765,"y":2759.1704183412},"selected":true,"data":{"label":"OpenAI Functions / Tools","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":280,"height":49,"style":{"width":280,"height":49},"positionAbsolute":{"x":848.3202732289765,"y":2759.1704183412},"dragging":false,"selectable":true,"focusable":true},{"id":"mbp2NoL-VZ5hZIIblNBXt","type":"subtopic","position":{"x":848.3202732289765,"y":2812.1704183412},"selected":true,"data":{"label":"OpenAI Assistant API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":280,"height":49,"style":{"width":280,"height":49},"positionAbsolute":{"x":848.3202732289765,"y":2812.1704183412},"dragging":false,"selectable":true,"focusable":true},{"id":"8DMSxbdBT5el9ECZE2EGx","type":"label","position":{"x":910.3202732289765,"y":2666.47564929518},"selected":true,"data":{"label":"Building AI Agents","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":156,"height":36,"style":{},"positionAbsolute":{"x":910.3202732289765,"y":2666.47564929518},"dragging":false,"selectable":true,"focusable":true},{"id":"W7cKPt_UxcUgwp8J6hS4p","type":"topic","position":{"x":533.3795624782034,"y":2942.715898273103},"selected":true,"data":{"label":"Multimodal AI","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":220,"height":49,"style":{"width":220,"height":49},"positionAbsolute":{"x":533.3795624782034,"y":2942.715898273103},"dragging":false,"selectable":true,"focusable":true},{"id":"sGR9qcro68KrzM8qWxcH8","type":"subtopic","position":{"x":65.4565453870415,"y":2942.715898273103},"selected":true,"data":{"label":"Multimodal AI Usecases","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":278,"height":49,"style":{"width":278,"height":49},"positionAbsolute":{"x":65.4565453870415,"y":2942.715898273103},"dragging":false,"selectable":true,"focusable":true},{"id":"fzVq4hGoa2gdbIzoyY1Zp","type":"subtopic","position":{"x":72.99859239597538,"y":3005.4007482223487},"selected":true,"data":{"label":"Image Understanding","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":261,"height":49,"style":{"width":261,"height":49},"dragging":false,"positionAbsolute":{"x":72.99859239597538,"y":3005.4007482223487},"resizing":false,"selectable":true,"focusable":true},{"id":"49BWxYVFpIgZCCqsikH7l","type":"subtopic","position":{"x":72.99859239597538,"y":3058.4007482223487},"selected":true,"data":{"label":"Image Generation","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":261,"height":49,"style":{"width":261,"height":49},"dragging":false,"positionAbsolute":{"x":72.99859239597538,"y":3058.4007482223487},"selectable":true,"focusable":true},{"id":"TxaZCtTCTUfwCxAJ2pmND","type":"subtopic","position":{"x":72.99859239597538,"y":3111.4007482223487},"selected":true,"data":{"label":"Video Understanding","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":261,"height":49,"style":{"width":261,"height":49},"dragging":false,"positionAbsolute":{"x":72.99859239597538,"y":3111.4007482223487},"selectable":true,"focusable":true},{"id":"mxQYB820447DC6kogyZIL","type":"subtopic","position":{"x":72.99859239597538,"y":3164.4007482223487},"selected":true,"data":{"label":"Audio Processing","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":261,"height":49,"style":{"width":261,"height":49},"dragging":false,"positionAbsolute":{"x":72.99859239597538,"y":3164.4007482223487},"selectable":true,"focusable":true},{"id":"GCERpLz5BcRtWPpv-asUz","type":"subtopic","position":{"x":72.99859239597538,"y":3217.4007482223487},"selected":true,"data":{"label":"Text-to-Speech","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":261,"height":49,"style":{"width":261,"height":49},"dragging":false,"positionAbsolute":{"x":72.99859239597538,"y":3217.4007482223487},"selectable":true,"focusable":true},{"id":"jQX10XKd_QM5wdQweEkVJ","type":"subtopic","position":{"x":72.99859239597538,"y":3270.4007482223487},"selected":true,"data":{"label":"Speech-to-Text","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":261,"height":49,"style":{"width":261,"height":49},"dragging":false,"positionAbsolute":{"x":72.99859239597538,"y":3270.4007482223487},"selectable":true,"focusable":true},{"id":"chm2xTFPJKW0dubKGjq-2","type":"label","position":{"x":119.99859239597538,"y":3330.4007482223487},"selected":true,"data":{"label":"Multimodal AI Tasks","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":168,"height":36,"style":{},"positionAbsolute":{"x":119.99859239597538,"y":3330.4007482223487},"dragging":false,"selectable":true,"focusable":true},{"id":"CRrqa-dBw1LlOwVbrZhjK","type":"subtopic","position":{"x":845.4985923959754,"y":2930.9007482223487},"selected":true,"data":{"label":"OpenAI Vision API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":291,"height":49,"style":{"width":291,"height":49},"positionAbsolute":{"x":845.4985923959754,"y":2930.9007482223487},"selectable":true,"focusable":true,"dragging":false},{"id":"LKFwwjtcawJ4Z12X102Cb","type":"subtopic","position":{"x":845.4985923959754,"y":2983.9007482223487},"selected":true,"data":{"label":"DALL-E API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":291,"height":49,"style":{"width":291,"height":49},"positionAbsolute":{"x":845.4985923959754,"y":2983.9007482223487},"selectable":true,"focusable":true,"dragging":false},{"id":"OTBd6cPUayKaAM-fLWdSt","type":"subtopic","position":{"x":845.4985923959754,"y":3036.9007482223487},"selected":true,"data":{"label":"Whisper API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":291,"height":49,"style":{"width":291,"height":49},"positionAbsolute":{"x":845.4985923959754,"y":3036.9007482223487},"selectable":true,"focusable":true,"dragging":false},{"id":"EIDbwbdolR_qsNKVDla6V","type":"subtopic","position":{"x":845.4985923959754,"y":3089.9007482223487},"selected":true,"data":{"label":"Hugging Face Models","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":291,"height":49,"style":{"width":291,"height":49},"positionAbsolute":{"x":845.4985923959754,"y":3089.9007482223487},"selectable":true,"focusable":true,"dragging":false},{"id":"j9zD3pHysB1CBhLfLjhpD","type":"subtopic","position":{"x":845.4985923959754,"y":3142.9007482223487},"selected":true,"data":{"label":"LangChain for Multimodal Apps","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":291,"height":49,"style":{"width":291,"height":49},"positionAbsolute":{"x":845.4985923959754,"y":3142.9007482223487},"selectable":true,"focusable":true,"dragging":false},{"id":"akQTCKuPRRelj2GORqvsh","type":"subtopic","position":{"x":845.4985923959754,"y":3195.9007482223487},"selected":true,"data":{"label":"LlamaIndex for Multimodal Apps","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":291,"height":49,"style":{"width":291,"height":49},"positionAbsolute":{"x":845.4985923959754,"y":3195.9007482223487},"selectable":true,"focusable":true,"dragging":false},{"id":"5hCv_2FQNIgQC4XLW4AYs","type":"label","position":{"x":875.9985923959754,"y":3255.9007482223487},"selected":true,"data":{"label":"Implementing Multimodal AI","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":230,"height":36,"style":{},"positionAbsolute":{"x":875.9985923959754,"y":3255.9007482223487},"dragging":false,"selectable":true,"focusable":true},{"width":459,"height":119,"id":"0vLaVNJaJSHZ_bHli6Qzs","type":"paragraph","position":{"x":452.1429505186827,"y":3390.969159826914},"selected":true,"data":{"label":"Continue learning with following relevant tracks","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center","borderColor":"#000000","backgroundColor":"WHITe"},"oldId":"m9eO0jLGuR_9w2JJbe_g2"},"zIndex":999,"positionAbsolute":{"x":452.1429505186827,"y":3390.969159826914},"dragging":false,"style":{"width":459,"height":119},"resizing":false,"focusable":true,"selectable":true},{"width":228,"height":49,"id":"OIcmPSbdsuWapb6HZ4BEi","type":"button","position":{"x":466.1567530029688,"y":3445.1148172600238},"selected":true,"data":{"label":"AI & Data Scientist","href":"https://roadmap.sh/ai-data-scientist","color":"#FFf","backgroundColor":"#4136D6","style":{"fontSize":17},"borderColor":"#4136D6","oldId":"cmSSwPPiiHwYh9ct14N6A"},"zIndex":999,"dragging":false,"positionAbsolute":{"x":466.1567530029688,"y":3445.1148172600238},"style":{"width":228,"height":49},"focusable":true,"resizing":false,"selectable":true},{"width":20,"height":85,"id":"RLtk1C3gofHnLJ17x3o5b","type":"vertical","position":{"x":671.6429505186827,"y":3513.969159826914},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"},"oldId":"ExXFPDHXtcOMcvZttzxvD"},"zIndex":999,"positionAbsolute":{"x":671.6429505186827,"y":3513.969159826914},"dragging":false,"focusable":true,"style":{"width":20,"height":85},"resizing":false,"selectable":true},{"width":199,"height":49,"id":"-sFboM4eFUMVq1tlPl-fV","type":"button","position":{"x":699.9869736111889,"y":3445.1148172600238},"selected":true,"data":{"label":"Prompt Engineering","href":"https://roadmap.sh/prompt-engineering","color":"#FFFFFf","backgroundColor":"#4136D6","style":{"fontSize":17},"borderColor":"#4136D6","oldId":"qXKNK_IsGS8-JgLK-Q9oU"},"zIndex":999,"dragging":false,"positionAbsolute":{"x":699.9869736111889,"y":3445.1148172600238},"style":{},"focusable":true,"resizing":false,"selectable":true},{"id":"NYge7PNtfI-y6QWefXJ4d","type":"topic","position":{"x":533.3795624782034,"y":3281.4007482223487},"selected":true,"data":{"label":"Development Tools","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"W7cKPt_UxcUgwp8J6hS4p"},"zIndex":999,"width":220,"height":49,"style":{"width":220,"height":49},"positionAbsolute":{"x":533.3795624782034,"y":3281.4007482223487},"dragging":false,"selectable":true,"focusable":true},{"id":"XcKeQfpTA5ITgdX51I4y-","type":"subtopic","position":{"x":423.1375395659161,"y":3135.6475050579174},"selected":true,"data":{"label":"AI Code Editors","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":423.1375395659161,"y":3135.6475050579174},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"TifVhqFm1zXNssA8QR3SM","type":"subtopic","position":{"x":423.1375395659161,"y":3189.6475050579174},"selected":true,"data":{"label":"Code Completion Tools","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"XcKeQfpTA5ITgdX51I4y-"},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":423.1375395659161,"y":3189.6475050579174},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"8tcMfca2q2_6M-KmzmaT1","type":"button","position":{"x":72.27752658021029,"y":142.3328638669464},"selected":true,"data":{"label":"Scrimba - AI Engineer Path","href":"https://v2.scrimba.com/the-ai-engineer-path-c02v?via=roadmap","color":"#ffffff","backgroundColor":"#4136D6","style":{"fontSize":17}},"zIndex":999,"width":360,"height":49,"style":{"width":360,"height":49},"positionAbsolute":{"x":72.27752658021029,"y":142.3328638669464},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"NxOYVBCLCLZ1wtGAGEn5W","type":"linksgroup","position":{"x":62.71396345748872,"y":225.90074822234897},"selected":true,"data":{"label":"Related Roadmaps","links":[{"id":"sk9lcGKC3DnpMWEn73SUX","label":"AI and Data Scientist Roadmap","href":"","url":"https://roadmap.sh/ai-data-scientist"},{"id":"quj9EG47r_g7lvwZXil4j","label":"Prompt Engineering","url":"https://roadmap.sh/prompt-engineering"},{"id":"7QOvFxjjApFOP5S9nkYf4","label":"Data Analyst Roadamp","url":"https://roadmap.sh/data-analyst"}]},"zIndex":999,"width":388,"height":160,"positionAbsolute":{"x":62.71396345748872,"y":225.90074822234897},"dragging":false,"style":{"width":388,"height":160},"resizing":false,"focusable":true,"selectable":true}],"edges":[{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"iogwMmOvub2ZF4zgg6WyF","sourceHandle":"x2","target":"_hYN0gEi9BL24nptEtXWU","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"XX0I26JoVMVXIe_7bVMix","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"z2","target":"GN6SnI7RXIeW8JeD-qORW","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-_hYN0gEi9BL24nptEtXWUz2-GN6SnI7RXIeW8JeD-qORWy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"z2","target":"jSZ1LhPdhlkW-9QJhIvFs","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-_hYN0gEi9BL24nptEtXWUz2-jSZ1LhPdhlkW-9QJhIvFsy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"GN6SnI7RXIeW8JeD-qORW","sourceHandle":"w2","target":"K9EiuFgPBFgeRxY4wxAmb","targetHandle":"x2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-GN6SnI7RXIeW8JeD-qORWw2-K9EiuFgPBFgeRxY4wxAmbx2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"x2","target":"wt_3LocKHpvsnsQdDI7LK","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-_hYN0gEi9BL24nptEtXWUx2-wt_3LocKHpvsnsQdDI7LKw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"wt_3LocKHpvsnsQdDI7LK","sourceHandle":"x2","target":"d7fzv_ft12EopsQdmEsel","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-wt_3LocKHpvsnsQdDI7LKx2-d7fzv_ft12EopsQdmEselw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"d7fzv_ft12EopsQdmEsel","sourceHandle":"y2","target":"MXqbQGhNM3xpXlMC2ib_6","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-d7fzv_ft12EopsQdmEsely2-MXqbQGhNM3xpXlMC2ib_6z1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"d7fzv_ft12EopsQdmEsel","sourceHandle":"y2","target":"1Ga6DbOPc6Crz7ilsZMYy","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-d7fzv_ft12EopsQdmEsely2-1Ga6DbOPc6Crz7ilsZMYyz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"d7fzv_ft12EopsQdmEsel","sourceHandle":"y2","target":"5ShWZl1QUqPwO-NRGN85V","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-d7fzv_ft12EopsQdmEsely2-5ShWZl1QUqPwO-NRGN85Vz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"d7fzv_ft12EopsQdmEsel","sourceHandle":"x2","target":"wr2_2ADvySOUZxzEo1Uw1","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-d7fzv_ft12EopsQdmEselx2-wr2_2ADvySOUZxzEo1Uw1w1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"wr2_2ADvySOUZxzEo1Uw1","sourceHandle":"x2","target":"zdeuA4GbdBl2DwKgiOA4G","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-wr2_2ADvySOUZxzEo1Uw1x2-zdeuA4GbdBl2DwKgiOA4Gw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"zdeuA4GbdBl2DwKgiOA4G","sourceHandle":"z2","target":"_bPTciEA1GT1JwfXim19z","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-zdeuA4GbdBl2DwKgiOA4Gz2-_bPTciEA1GT1JwfXim19zy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"zdeuA4GbdBl2DwKgiOA4G","sourceHandle":"z2","target":"9-5DYeOnKJq9XvEMWP45A","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-zdeuA4GbdBl2DwKgiOA4Gz2-9-5DYeOnKJq9XvEMWP45Ay1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"zdeuA4GbdBl2DwKgiOA4G","sourceHandle":"z2","target":"nyBgEHvUhwF-NANMwkRJW","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-zdeuA4GbdBl2DwKgiOA4Gz2-nyBgEHvUhwF-NANMwkRJWy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"zdeuA4GbdBl2DwKgiOA4G","sourceHandle":"z2","target":"nXsjZiJGgFyOO8b0J-E2V","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-zdeuA4GbdBl2DwKgiOA4Gz2-nXsjZiJGgFyOO8b0J-E2Vy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"zdeuA4GbdBl2DwKgiOA4G","sourceHandle":"x2","target":"8ndKHDJgL_gYwaXC7XMer","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-zdeuA4GbdBl2DwKgiOA4Gx2-a_3SabylVqzzOyw3tZN5fw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"8ndKHDJgL_gYwaXC7XMer","sourceHandle":"x2","target":"a_3SabylVqzzOyw3tZN5f","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-8ndKHDJgL_gYwaXC7XMerx2-a_3SabylVqzzOyw3tZN5fw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"a_3SabylVqzzOyw3tZN5f","sourceHandle":"z2","target":"RBwGsq9DngUsl8PrrCbqx","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-a_3SabylVqzzOyw3tZN5fz2-RBwGsq9DngUsl8PrrCbqxy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"a_3SabylVqzzOyw3tZN5f","sourceHandle":"z2","target":"97eu-XxYUH9pYbD_KjAtA","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-a_3SabylVqzzOyw3tZN5fz2-97eu-XxYUH9pYbD_KjAtAy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"a_3SabylVqzzOyw3tZN5f","sourceHandle":"x2","target":"OZvk1d0XxXwJwbEUYqnFq","targetHandle":"w2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-a_3SabylVqzzOyw3tZN5fx2-OZvk1d0XxXwJwbEUYqnFqw2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"OZvk1d0XxXwJwbEUYqnFq","sourceHandle":"x2","target":"--ig0Ume_BnXb9K2U7HJN","targetHandle":"w2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-OZvk1d0XxXwJwbEUYqnFqx2-tt9u3oFlsjEMfPyojuqpcw2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"--ig0Ume_BnXb9K2U7HJN","sourceHandle":"x2","target":"4P2Sbyy2cVjOrXH75Hc2b","targetHandle":"w1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-tt9u3oFlsjEMfPyojuqpcx2-4P2Sbyy2cVjOrXH75Hc2bw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"--ig0Ume_BnXb9K2U7HJN","sourceHandle":"y2","target":"l6priWeJhbdUD5tJ7uHyG","targetHandle":"z2","data":{"edgeStyle":"solid"},"id":"reactflow__edge---ig0Ume_BnXb9K2U7HJNy2-tt9u3oFlsjEMfPyojuqpcz2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"l6priWeJhbdUD5tJ7uHyG","sourceHandle":"w2","target":"4GArjDYipit4SLqKZAWDf","targetHandle":"x2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-tt9u3oFlsjEMfPyojuqpcw2-4GArjDYipit4SLqKZAWDfx2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"lVhWhZGR558O-ljHobxIi","sourceHandle":"z2","target":"zK_H4vmJXmyLYu1gVfhYK","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-W7cKPt_UxcUgwp8J6hS4pz2-zK_H4vmJXmyLYu1gVfhYKy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"tt9u3oFlsjEMfPyojuqpc","sourceHandle":"z2","target":"lVhWhZGR558O-ljHobxIi","targetHandle":"y1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-tt9u3oFlsjEMfPyojuqpcz2-W7cKPt_UxcUgwp8J6hS4py1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"AeHkNU-uJ_gBdo5-xdpEu","sourceHandle":"z2","target":"k8QYMT_d6EQWDqDgnPYsT","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-W7cKPt_UxcUgwp8J6hS4pz2-k8QYMT_d6EQWDqDgnPYsTy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"W7cKPt_UxcUgwp8J6hS4p","sourceHandle":"y2","target":"sGR9qcro68KrzM8qWxcH8","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-W7cKPt_UxcUgwp8J6hS4py2-sGR9qcro68KrzM8qWxcH8z1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"KMA7NkxFbPoUDtFnGBFnj","sourceHandle":"x2","target":"0vLaVNJaJSHZ_bHli6Qzs","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-KMA7NkxFbPoUDtFnGBFnjx2-0vLaVNJaJSHZ_bHli6Qzsw1","selected":true,"type":"simplebezier","focusable":true,"selectable":true}]}
\ No newline at end of file
diff --git a/src/data/roadmaps/ai-engineer/content/bias-and-fareness@lhIU0ulpvDAn1Xc3ooYz_.md b/src/data/roadmaps/ai-engineer/content/bias-and-fairness@lhIU0ulpvDAn1Xc3ooYz_.md
similarity index 98%
rename from src/data/roadmaps/ai-engineer/content/bias-and-fareness@lhIU0ulpvDAn1Xc3ooYz_.md
rename to src/data/roadmaps/ai-engineer/content/bias-and-fairness@lhIU0ulpvDAn1Xc3ooYz_.md
index 6f0a4cc46..5c052141d 100644
--- a/src/data/roadmaps/ai-engineer/content/bias-and-fareness@lhIU0ulpvDAn1Xc3ooYz_.md
+++ b/src/data/roadmaps/ai-engineer/content/bias-and-fairness@lhIU0ulpvDAn1Xc3ooYz_.md
@@ -1,4 +1,4 @@
-# Bias and Faireness
+# Bias and Fairness
 
 Bias and fairness in AI refer to the challenges of ensuring that machine learning models do not produce discriminatory or skewed outcomes. Bias can arise from imbalanced training data, flawed assumptions, or biased algorithms, leading to unfair treatment of certain groups based on race, gender, or other factors. Fairness aims to address these issues by developing techniques to detect, mitigate, and prevent biases in AI systems. Ensuring fairness involves improving data diversity, applying fairness constraints during model training, and continuously monitoring models in production to avoid unintended consequences, promoting ethical and equitable AI use.
 
diff --git a/src/data/roadmaps/angular/content/component-lifecycle@nCpfj_35ZvW-NTygg06XZ.md b/src/data/roadmaps/angular/content/component-lifecycle@nCpfj_35ZvW-NTygg06XZ.md
index cb563f8d6..99e31ff21 100644
--- a/src/data/roadmaps/angular/content/component-lifecycle@nCpfj_35ZvW-NTygg06XZ.md
+++ b/src/data/roadmaps/angular/content/component-lifecycle@nCpfj_35ZvW-NTygg06XZ.md
@@ -12,4 +12,5 @@ Visit the following resources to learn more:
 
 - [@official@Component Lifecycle](https://angular.dev/guide/components/lifecycle)
 - [@article@The life cycle hooks of angular - Blog ](https://blog.logrocket.com/angular-lifecycle-hooks/)
-- [@feed@Explore top posts about React Hooks](https://app.daily.dev/tags/react-hooks?ref=roadmapsh)
+- [@article@Angular Lifecycle Hooks — Everything you need to know](https://medium.com/@sinanozturk/angular-component-lifecycle-hooks-2f600c48dff3)
+- [@feed@Explore top posts about Angular LifeCycle Hooks](https://dev.to/search?utf8=%E2%9C%93&q=angular+hook)
\ No newline at end of file
diff --git a/src/data/roadmaps/api-design/content/authorization-methods@nHbn8_sMY7J8o6ckbD-ER.md b/src/data/roadmaps/api-design/content/authorization-methods@nHbn8_sMY7J8o6ckbD-ER.md
index 9ddf24856..e88a63ac8 100644
--- a/src/data/roadmaps/api-design/content/authorization-methods@nHbn8_sMY7J8o6ckbD-ER.md
+++ b/src/data/roadmaps/api-design/content/authorization-methods@nHbn8_sMY7J8o6ckbD-ER.md
@@ -4,4 +4,4 @@ In API design, authorization methods play a crucial role in ensuring the securit
 
 Visit the following resources to learn more:
 
-- [@article@API Authorization Methods](https://konghq.com/blog/engineering/common-api-authentication-methods)
\ No newline at end of file
+- [@article@API Authorization Methods](https://www.pingidentity.com/en/resources/identity-fundamentals/authorization/authorization-methods.html)
diff --git a/src/data/roadmaps/api-design/content/http-caching@qAolZHf_jp8hCdtqHZwC8.md b/src/data/roadmaps/api-design/content/http-caching@qAolZHf_jp8hCdtqHZwC8.md
index cd80d1dd8..4fe4c71ca 100644
--- a/src/data/roadmaps/api-design/content/http-caching@qAolZHf_jp8hCdtqHZwC8.md
+++ b/src/data/roadmaps/api-design/content/http-caching@qAolZHf_jp8hCdtqHZwC8.md
@@ -5,4 +5,5 @@ HTTP caching is a key aspect of API design which involves storing copies of resp
 Learn more from the following resources:
 
 - [@article@Why HTTP Caching matters for APIs](https://thenewstack.io/why-http-caching-matters-for-apis/)
-- [@article@Caching REST API Response](https://restfulapi.net/caching/)
\ No newline at end of file
+- [@article@Caching REST API Response](https://restfulapi.net/caching/)
+- [@article@HTTP caching](https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching)
diff --git a/src/data/roadmaps/api-design/content/rate-limiting@O7wjldZ3yTA2s_F-UnJw_.md b/src/data/roadmaps/api-design/content/rate-limiting@O7wjldZ3yTA2s_F-UnJw_.md
index 530a97e32..3b2bd348b 100644
--- a/src/data/roadmaps/api-design/content/rate-limiting@O7wjldZ3yTA2s_F-UnJw_.md
+++ b/src/data/roadmaps/api-design/content/rate-limiting@O7wjldZ3yTA2s_F-UnJw_.md
@@ -1,3 +1,10 @@
 # Rate Limiting in API Design
 
-Rate Limiting is a critical aspect of API Design that dictates the number of API calls a client can make within a specified timeframe. This helps in managing resource allocation, preventing abuse of the API, and maintaining the overall health of the API system. Proper rate limiting measures should be in place to ensure the API's stability, thereby delivering a consistent and reliable service to all consumers. It works primarily by setting a limit on the frequency of client requests, thereby preventing individual users from overloading the system. It is crucial to design and implement rate limiting carefully for maintaining API availability and performance.
\ No newline at end of file
+Rate Limiting is a critical aspect of API Design that dictates the number of API calls a client can make within a specified timeframe. This helps in managing resource allocation, preventing abuse of the API, and maintaining the overall health of the API system. Proper rate limiting measures should be in place to ensure the API's stability, thereby delivering a consistent and reliable service to all consumers. It works primarily by setting a limit on the frequency of client requests, thereby preventing individual users from overloading the system. It is crucial to design and implement rate limiting carefully for maintaining API availability and performance.
+
+Learn more from the following resources:
+
+- [@article@Rate limit](https://developer.mozilla.org/en-US/docs/Glossary/Rate_limit)
+- [@article@Throttle](https://developer.mozilla.org/en-US/docs/Glossary/Throttle)
+- [@article@Debounce](https://developer.mozilla.org/en-US/docs/Glossary/Debounce)
+- [@article@What is rate limiting? | Rate limiting and bots](https://www.cloudflare.com/en-gb/learning/bots/what-is-rate-limiting/)
diff --git a/src/data/roadmaps/aspnet-core/aspnet-core.json b/src/data/roadmaps/aspnet-core/aspnet-core.json
index e78474e5e..3f1bc7112 100644
--- a/src/data/roadmaps/aspnet-core/aspnet-core.json
+++ b/src/data/roadmaps/aspnet-core/aspnet-core.json
@@ -1,21446 +1 @@
-{
-  "mockup": {
-    "controls": {
-      "control": [
-        {
-          "ID": "4201",
-          "typeID": "Arrow",
-          "zOrder": "0",
-          "w": "319",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "519",
-          "y": "3366",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": -0.15400226456790733,
-              "y": -0.44220738870126297
-            },
-            "p1": {
-              "x": 0.5603752218607518,
-              "y": 0.0000414738548443211
-            },
-            "p2": {
-              "x": 319.31980209782114,
-              "y": -0.44220738870126297
-            }
-          }
-        },
-        {
-          "ID": "4202",
-          "typeID": "Arrow",
-          "zOrder": "1",
-          "w": "1",
-          "h": "253",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1227",
-          "y": "3675",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": -0.13261304041122912,
-              "y": 0.4778822533505718
-            },
-            "p1": {
-              "x": 0.560375221860752,
-              "y": 0.00004147385484432134
-            },
-            "p2": {
-              "x": -0.1326130404113428,
-              "y": 253.9418913877298
-            },
-            "stroke": "dotted"
-          }
-        },
-        {
-          "ID": "4203",
-          "typeID": "Arrow",
-          "zOrder": "2",
-          "w": "1",
-          "h": "88",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "784",
-          "y": "3378",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.3322483172673856,
-              "y": 0.21982730867694045
-            },
-            "p1": {
-              "x": 0.5603752218607518,
-              "y": 0.00004147385484432521
-            },
-            "p2": {
-              "x": 0.3322483172673856,
-              "y": 87.97662329437662
-            }
-          }
-        },
-        {
-          "ID": "4204",
-          "typeID": "Arrow",
-          "zOrder": "3",
-          "w": "340",
-          "h": "276",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "888",
-          "y": "3370",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0.23737962537347812,
-              "y": 0.07693732336474568
-            },
-            "p1": {
-              "x": 0.5467786614590079,
-              "y": 0.24687813111124973
-            },
-            "p2": {
-              "x": 340.5069042692603,
-              "y": 276.38956576007513
-            }
-          }
-        },
-        {
-          "ID": "4205",
-          "typeID": "Arrow",
-          "zOrder": "4",
-          "w": "1",
-          "h": "88",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "440",
-          "y": "3378",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.3322483172673856,
-              "y": 0.21982730867694045
-            },
-            "p1": {
-              "x": 0.5603752218607518,
-              "y": 0.00004147385484432521
-            },
-            "p2": {
-              "x": 0.3322483172673856,
-              "y": 87.97662329437662
-            }
-          }
-        },
-        {
-          "ID": "4206",
-          "typeID": "__group__",
-          "zOrder": "5",
-          "measuredW": "183",
-          "measuredH": "47",
-          "w": "183",
-          "h": "47",
-          "x": "344",
-          "y": "3431",
-          "properties": {
-            "controlName": "100-template-engines:razor"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "173",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "49",
-                  "measuredH": "26",
-                  "x": "72",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Razor"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4207",
-          "typeID": "__group__",
-          "zOrder": "6",
-          "measuredW": "183",
-          "measuredH": "47",
-          "w": "183",
-          "h": "47",
-          "x": "344",
-          "y": "3483",
-          "properties": {
-            "controlName": "101-template-engines:dot-liquid"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "173",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "79",
-                  "measuredH": "26",
-                  "x": "57",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "DotLiquid"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4208",
-          "typeID": "__group__",
-          "zOrder": "7",
-          "measuredW": "183",
-          "measuredH": "47",
-          "w": "183",
-          "h": "47",
-          "x": "344",
-          "y": "3535",
-          "properties": {
-            "controlName": "102-template-engines:scriban"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "173",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "62",
-                  "measuredH": "26",
-                  "x": "66",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Scriban"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4209",
-          "typeID": "Arrow",
-          "zOrder": "8",
-          "w": "1",
-          "h": "107",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "439",
-          "y": "3268",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": -0.13261304041122912,
-              "y": 0.4778822533505718
-            },
-            "p1": {
-              "x": 0.5603752218607518,
-              "y": 0.000041473854844321266
-            },
-            "p2": {
-              "x": -0.13261304041122912,
-              "y": 107.30482174447025
-            }
-          }
-        },
-        {
-          "ID": "4210",
-          "typeID": "Arrow",
-          "zOrder": "9",
-          "w": "1",
-          "h": "121",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "440",
-          "y": "3136",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.3322483172673856,
-              "y": 0.21982730867694045
-            },
-            "p1": {
-              "x": 0.5603752218607518,
-              "y": 0.00004147385484432478
-            },
-            "p2": {
-              "x": 0.3322483172673856,
-              "y": 121.29702065194579
-            }
-          }
-        },
-        {
-          "ID": "4211",
-          "typeID": "__group__",
-          "zOrder": "10",
-          "measuredW": "182",
-          "measuredH": "47",
-          "w": "182",
-          "h": "47",
-          "x": "345",
-          "y": "3137",
-          "properties": {
-            "controlName": "100-client-side-libraries:blazor"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "173",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "52",
-                  "measuredH": "26",
-                  "x": "70",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Blazor"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4212",
-          "typeID": "Arrow",
-          "zOrder": "11",
-          "w": "634",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "528",
-          "y": "3254",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": -0.15400226456790733,
-              "y": -0.44220738870126297
-            },
-            "p1": {
-              "x": 0.5603752218607518,
-              "y": 0.0000414738548443211
-            },
-            "p2": {
-              "x": 633.8673869595887,
-              "y": -0.44220738870126297
-            }
-          }
-        },
-        {
-          "ID": "4213",
-          "typeID": "Arrow",
-          "zOrder": "12",
-          "w": "115",
-          "h": "50",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1311",
-          "y": "3195",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.42567719337330345,
-              "y": 50.0640255109447
-            },
-            "p1": {
-              "x": 0.5036333147009507,
-              "y": -0.13051984348798149
-            },
-            "p2": {
-              "x": 114.83166460620691,
-              "y": 0.2938097338528678
-            }
-          }
-        },
-        {
-          "ID": "4214",
-          "typeID": "Arrow",
-          "zOrder": "13",
-          "w": "123",
-          "h": "97",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1300",
-          "y": "3149",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.09638264302839161,
-              "y": 97.37376803139432
-            },
-            "p1": {
-              "x": 0.5036333147009506,
-              "y": -0.13051984348798162
-            },
-            "p2": {
-              "x": 123.21217956530745,
-              "y": 0.4528215181107953
-            }
-          }
-        },
-        {
-          "ID": "4215",
-          "typeID": "Arrow",
-          "zOrder": "14",
-          "w": "132",
-          "h": "4",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1320",
-          "y": "3253",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.2574795502248435,
-              "y": 3.851708194992625
-            },
-            "p1": {
-              "x": 0.5611518257876795,
-              "y": 0.0004698236247416899
-            },
-            "p2": {
-              "x": 132.02651501520245,
-              "y": -0.07751936635668244
-            }
-          }
-        },
-        {
-          "ID": "4216",
-          "typeID": "Arrow",
-          "zOrder": "15",
-          "w": "94",
-          "h": "41",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1324",
-          "y": "3268",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.42567719337330345,
-              "y": 0.06402551094470255
-            },
-            "p1": {
-              "x": 0.5078771973589815,
-              "y": 0.10006410141674411
-            },
-            "p2": {
-              "x": 93.9732094835083,
-              "y": 41.241409012983695
-            }
-          }
-        },
-        {
-          "ID": "4217",
-          "typeID": "Arrow",
-          "zOrder": "16",
-          "w": "102",
-          "h": "90",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1317",
-          "y": "3271",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.1230354088754666,
-              "y": 0.2588759199402375
-            },
-            "p1": {
-              "x": 0.5078771973589815,
-              "y": 0.1000641014167442
-            },
-            "p2": {
-              "x": 102.28295200395792,
-              "y": 90.63110983097431
-            }
-          }
-        },
-        {
-          "ID": "4218",
-          "typeID": "Arrow",
-          "zOrder": "17",
-          "w": "120",
-          "h": "132",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1299",
-          "y": "3273",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.21335987742122597,
-              "y": -0.4313815596101449
-            },
-            "p1": {
-              "x": 0.43632467184569984,
-              "y": 0.08770425930886809
-            },
-            "p2": {
-              "x": 120.28295200395792,
-              "y": 131.85261300581715
-            }
-          }
-        },
-        {
-          "ID": "4219",
-          "typeID": "Arrow",
-          "zOrder": "18",
-          "w": "1",
-          "h": "303",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1317",
-          "y": "2947",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": -0.13261304041122912,
-              "y": 0.4778822533505718
-            },
-            "p1": {
-              "x": 0.560375221860752,
-              "y": 0.00004147385484432124
-            },
-            "p2": {
-              "x": -0.1326130404113428,
-              "y": 303.3029955927436
-            }
-          }
-        },
-        {
-          "ID": "4220",
-          "typeID": "Arrow",
-          "zOrder": "19",
-          "w": "1",
-          "h": "88",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "713",
-          "y": "2882",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.3322483172673856,
-              "y": 0.21982730867694045
-            },
-            "p1": {
-              "x": 0.5603752218607518,
-              "y": 0.00004147385484432521
-            },
-            "p2": {
-              "x": 0.3322483172673856,
-              "y": 87.97662329437662
-            }
-          }
-        },
-        {
-          "ID": "4221",
-          "typeID": "Arrow",
-          "zOrder": "20",
-          "w": "1",
-          "h": "88",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "994",
-          "y": "2940",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.3322483172673856,
-              "y": 0.21982730867694045
-            },
-            "p1": {
-              "x": 0.5603752218607518,
-              "y": 0.00004147385484432521
-            },
-            "p2": {
-              "x": 0.3322483172673856,
-              "y": 87.97662329437662
-            }
-          }
-        },
-        {
-          "ID": "4222",
-          "typeID": "Arrow",
-          "zOrder": "21",
-          "w": "1009",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "454",
-          "y": "2939",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.30000118386777785,
-              "y": 0.2577914274311297
-            },
-            "p1": {
-              "x": 0.5611518257876795,
-              "y": 0.0004698236247416924
-            },
-            "p2": {
-              "x": 1009.1186887710248,
-              "y": 0.2577914274311297
-            }
-          }
-        },
-        {
-          "ID": "4223",
-          "typeID": "Arrow",
-          "zOrder": "22",
-          "w": "1",
-          "h": "178",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1497",
-          "y": "2847",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.3322483172673856,
-              "y": 0.21982730867694045
-            },
-            "p1": {
-              "x": 0.5603752218607518,
-              "y": 0.000041473854844324716
-            },
-            "p2": {
-              "x": 0.3322483172673856,
-              "y": 177.72561290580643
-            }
-          }
-        },
-        {
-          "ID": "4224",
-          "typeID": "Arrow",
-          "zOrder": "23",
-          "w": "1",
-          "h": "477",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1317",
-          "y": "2455",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": -0.13261304041122912,
-              "y": 0.4778822533505718
-            },
-            "p1": {
-              "x": 0.5603752218607518,
-              "y": 0.000041473854844321144
-            },
-            "p2": {
-              "x": -0.1326130404113428,
-              "y": 477.55779261129874
-            }
-          }
-        },
-        {
-          "ID": "4225",
-          "typeID": "Arrow",
-          "zOrder": "24",
-          "w": "1",
-          "h": "98",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "714",
-          "y": "2452",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.3322483172673856,
-              "y": 0.21982730867694045
-            },
-            "p1": {
-              "x": 0.560375221860752,
-              "y": 0.000041473854844324777
-            },
-            "p2": {
-              "x": 0.3322483172673856,
-              "y": 98.48028302679404
-            }
-          }
-        },
-        {
-          "ID": "4226",
-          "typeID": "Arrow",
-          "zOrder": "25",
-          "w": "1009",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "494",
-          "y": "2448",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.30000118386777785,
-              "y": 0.2577914274311297
-            },
-            "p1": {
-              "x": 0.5611518257876795,
-              "y": 0.0004698236247416924
-            },
-            "p2": {
-              "x": 1009.1186887710248,
-              "y": 0.2577914274311297
-            }
-          }
-        },
-        {
-          "ID": "4227",
-          "typeID": "Arrow",
-          "zOrder": "26",
-          "w": "1",
-          "h": "98",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1049",
-          "y": "2452",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.3322483172673856,
-              "y": 0.21982730867694045
-            },
-            "p1": {
-              "x": 0.560375221860752,
-              "y": 0.000041473854844324777
-            },
-            "p2": {
-              "x": 0.3322483172673856,
-              "y": 98.48028302679404
-            }
-          }
-        },
-        {
-          "ID": "4228",
-          "typeID": "TextArea",
-          "zOrder": "27",
-          "w": "291",
-          "h": "173",
-          "measuredW": "200",
-          "measuredH": "140",
-          "x": "893",
-          "y": "2687"
-        },
-        {
-          "ID": "4229",
-          "typeID": "__group__",
-          "zOrder": "28",
-          "measuredW": "111",
-          "measuredH": "47",
-          "w": "111",
-          "h": "47",
-          "x": "905",
-          "y": "2760",
-          "properties": {
-            "controlName": "106-testing:unit-testing:moq"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "102",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "41",
-                  "measuredH": "28",
-                  "x": "39",
-                  "y": "10",
-                  "properties": {
-                    "size": "20",
-                    "text": "Moq"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4230",
-          "typeID": "Label",
-          "zOrder": "29",
-          "measuredW": "77",
-          "measuredH": "28",
-          "x": "1001",
-          "y": "2819",
-          "properties": {
-            "size": "20",
-            "text": "Mocking"
-          }
-        },
-        {
-          "ID": "4231",
-          "typeID": "__group__",
-          "zOrder": "30",
-          "measuredW": "152",
-          "measuredH": "47",
-          "w": "152",
-          "h": "47",
-          "x": "1024",
-          "y": "2760",
-          "properties": {
-            "controlName": "107-testing:unit-testing:fake-it-easy"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "140",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "100",
-                  "measuredH": "28",
-                  "x": "20",
-                  "y": "10",
-                  "properties": {
-                    "size": "20",
-                    "text": "FakeItEasy"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "128",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4232",
-          "typeID": "__group__",
-          "zOrder": "31",
-          "measuredW": "260",
-          "measuredH": "47",
-          "w": "260",
-          "h": "47",
-          "x": "904",
-          "y": "2705",
-          "properties": {
-            "controlName": "105-testing:unit-testing:nsubstitute"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "252",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "8",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "106",
-                  "measuredH": "28",
-                  "x": "89",
-                  "y": "10",
-                  "properties": {
-                    "size": "20",
-                    "text": "NSubstitute"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4233",
-          "typeID": "TextArea",
-          "zOrder": "32",
-          "w": "160",
-          "h": "179",
-          "measuredW": "200",
-          "measuredH": "140",
-          "x": "894",
-          "y": "2513"
-        },
-        {
-          "ID": "4234",
-          "typeID": "__group__",
-          "zOrder": "33",
-          "measuredW": "98",
-          "measuredH": "47",
-          "w": "98",
-          "h": "47",
-          "x": "842",
-          "y": "2585",
-          "properties": {
-            "controlName": "103-testing:unit-testing:xunit"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "87",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "47",
-                  "measuredH": "28",
-                  "x": "33",
-                  "y": "10",
-                  "properties": {
-                    "size": "20",
-                    "text": "xUnit"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4235",
-          "typeID": "Label",
-          "zOrder": "34",
-          "measuredW": "111",
-          "measuredH": "28",
-          "x": "918",
-          "y": "2648",
-          "properties": {
-            "size": "20",
-            "text": "Frameworks"
-          }
-        },
-        {
-          "ID": "4236",
-          "typeID": "__group__",
-          "zOrder": "35",
-          "measuredW": "98",
-          "measuredH": "47",
-          "w": "98",
-          "h": "47",
-          "x": "948",
-          "y": "2585",
-          "properties": {
-            "controlName": "104-testing:unit-testing:nunit"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "87",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "52",
-                  "measuredH": "28",
-                  "x": "13",
-                  "y": "10",
-                  "properties": {
-                    "size": "20",
-                    "text": "NUnit"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "74",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4237",
-          "typeID": "__group__",
-          "zOrder": "36",
-          "measuredW": "193",
-          "measuredH": "47",
-          "w": "193",
-          "h": "47",
-          "x": "842",
-          "y": "2530",
-          "properties": {
-            "controlName": "102-testing:unit-testing:mstest"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "181",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "12",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "67",
-                  "measuredH": "28",
-                  "x": "69",
-                  "y": "10",
-                  "properties": {
-                    "size": "20",
-                    "text": "MSTest"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4238",
-          "typeID": "TextArea",
-          "zOrder": "37",
-          "w": "136",
-          "h": "179",
-          "measuredW": "200",
-          "measuredH": "140",
-          "x": "1047",
-          "y": "2513"
-        },
-        {
-          "ID": "4239",
-          "typeID": "Label",
-          "zOrder": "38",
-          "measuredW": "85",
-          "measuredH": "28",
-          "x": "1077",
-          "y": "2649",
-          "properties": {
-            "size": "20",
-            "text": "Assertion"
-          }
-        },
-        {
-          "ID": "4240",
-          "typeID": "__group__",
-          "zOrder": "39",
-          "measuredW": "212",
-          "measuredH": "47",
-          "w": "212",
-          "h": "47",
-          "x": "1063",
-          "y": "2530",
-          "properties": {
-            "controlName": "100-testing:unit-testing:fluent-assertions"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "199",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "157",
-                  "measuredH": "28",
-                  "x": "20",
-                  "y": "10",
-                  "properties": {
-                    "size": "20",
-                    "text": "Fluent Assertions"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "188",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4241",
-          "typeID": "__group__",
-          "zOrder": "40",
-          "measuredW": "212",
-          "measuredH": "47",
-          "w": "212",
-          "h": "47",
-          "x": "1063",
-          "y": "2584",
-          "properties": {
-            "controlName": "101-testing:unit-testing:shouldly"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "199",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "75",
-                  "measuredH": "28",
-                  "x": "62",
-                  "y": "10",
-                  "properties": {
-                    "size": "20",
-                    "text": "Shouldly"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "188",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4242",
-          "typeID": "Arrow",
-          "zOrder": "41",
-          "w": "161",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "608",
-          "y": "2270",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.4110450887836805,
-              "y": 99.8413586117099
-            },
-            "p1": {
-              "x": 0.4231894027177999,
-              "y": 0.09832186497826581
-            },
-            "p2": {
-              "x": 160.84311734757637,
-              "y": 0.24319945984052538
-            }
-          }
-        },
-        {
-          "ID": "4243",
-          "typeID": "Arrow",
-          "zOrder": "42",
-          "w": "175",
-          "h": "60",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "604",
-          "y": "2264",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.42710858893474324,
-              "y": 59.994586938627435
-            },
-            "p1": {
-              "x": 0.42318940271780003,
-              "y": 0.0983218649782658
-            },
-            "p2": {
-              "x": 175.90957947556183,
-              "y": -0.08049318472239975
-            }
-          }
-        },
-        {
-          "ID": "4244",
-          "typeID": "Arrow",
-          "zOrder": "43",
-          "w": "1",
-          "h": "90",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1510",
-          "y": "2448",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.3322483172673856,
-              "y": 0.21982730867694045
-            },
-            "p1": {
-              "x": 0.560375221860752,
-              "y": 0.00004147385484432478
-            },
-            "p2": {
-              "x": 0.3322483172673856,
-              "y": 90.58206872075789
-            }
-          }
-        },
-        {
-          "ID": "4245",
-          "typeID": "Arrow",
-          "zOrder": "44",
-          "w": "365",
-          "h": "167",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "954",
-          "y": "2271",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": -0.18887279895193387,
-              "y": -0.2798795686790072
-            },
-            "p1": {
-              "x": 0.5477910365765467,
-              "y": 0.09494911330068262
-            },
-            "p2": {
-              "x": 364.78304818200945,
-              "y": 167.2031201225759
-            }
-          }
-        },
-        {
-          "ID": "4246",
-          "typeID": "Arrow",
-          "zOrder": "45",
-          "w": "196",
-          "h": "5",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "583",
-          "y": "2254",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.420001934898778,
-              "y": 5.720578373475291
-            },
-            "p1": {
-              "x": 0.5603752218607518,
-              "y": 0.00004147385484432611
-            },
-            "p2": {
-              "x": 195.32865631442098,
-              "y": 0.4339678484329852
-            }
-          }
-        },
-        {
-          "ID": "4247",
-          "typeID": "Arrow",
-          "zOrder": "46",
-          "w": "1",
-          "h": "95",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "896",
-          "y": "2169",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.3322483172673856,
-              "y": -0.390329134334479
-            },
-            "p1": {
-              "x": 0.560375221860752,
-              "y": 0.00004147385484432418
-            },
-            "p2": {
-              "x": 0.3322483172673856,
-              "y": 94.9195068152776
-            }
-          }
-        },
-        {
-          "ID": "4248",
-          "typeID": "Arrow",
-          "zOrder": "47",
-          "w": "305",
-          "h": "81",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "957",
-          "y": "2174",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": -0.027026476670357624,
-              "y": 80.91088881991345
-            },
-            "p1": {
-              "x": 0.6044327129378225,
-              "y": -0.09479055582082785
-            },
-            "p2": {
-              "x": 305.091143623501,
-              "y": 0.2838076017333151
-            }
-          }
-        },
-        {
-          "ID": "4249",
-          "typeID": "Arrow",
-          "zOrder": "48",
-          "w": "125",
-          "h": "143",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1306",
-          "y": "2184",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.3569921354428516,
-              "y": -0.19311336974715232
-            },
-            "p1": {
-              "x": 0.5528599740312996,
-              "y": 0.09218888812957025
-            },
-            "p2": {
-              "x": 125.54905696000037,
-              "y": 142.64522160000024
-            }
-          }
-        },
-        {
-          "ID": "4250",
-          "typeID": "Arrow",
-          "zOrder": "49",
-          "w": "155",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1300",
-          "y": "2163",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.03329949087969908,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5611518257876793,
-              "y": 0.0004698236247416945
-            },
-            "p2": {
-              "x": 154.9637692826766,
-              "y": 0.2548855354225452
-            }
-          }
-        },
-        {
-          "ID": "4251",
-          "typeID": "Arrow",
-          "zOrder": "50",
-          "w": "134",
-          "h": "101",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1308",
-          "y": "2177",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.062084703416303455,
-              "y": 0.48319398568992256
-            },
-            "p1": {
-              "x": 0.6107234343255891,
-              "y": 0.0951329387863263
-            },
-            "p2": {
-              "x": 134.3163839935503,
-              "y": 101.66227629869991
-            }
-          }
-        },
-        {
-          "ID": "4252",
-          "typeID": "Arrow",
-          "zOrder": "51",
-          "w": "132",
-          "h": "50",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1310",
-          "y": "2173",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.03329949087969908,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.6033926960450965,
-              "y": 0.10007443087419315
-            },
-            "p2": {
-              "x": 132.3163839935503,
-              "y": 50.32996565877238
-            }
-          }
-        },
-        {
-          "ID": "4253",
-          "typeID": "Arrow",
-          "zOrder": "52",
-          "w": "1",
-          "h": "103",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1265",
-          "y": "2066",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": -0.13261304041122912,
-              "y": 0.4778822533505718
-            },
-            "p1": {
-              "x": 0.5603752218607517,
-              "y": 0.000041473854844321124
-            },
-            "p2": {
-              "x": -0.1326130404113428,
-              "y": 103.54103811831101
-            }
-          }
-        },
-        {
-          "ID": "4254",
-          "typeID": "Arrow",
-          "zOrder": "53",
-          "w": "98",
-          "h": "58",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1375",
-          "y": "2004",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0,
-              "y": 58
-            },
-            "p1": {
-              "x": 0.549376450841471,
-              "y": -0.12327909853320433
-            },
-            "p2": {
-              "x": 98,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4255",
-          "typeID": "Arrow",
-          "zOrder": "54",
-          "w": "111",
-          "h": "3",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1372",
-          "y": "2068",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0,
-              "y": 3
-            },
-            "p1": {
-              "x": 0.5611518257876794,
-              "y": 0.00046982362474169356
-            },
-            "p2": {
-              "x": 111,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4256",
-          "typeID": "Arrow",
-          "zOrder": "55",
-          "w": "264",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "890",
-          "y": "2069",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": -0.13261304041122912,
-              "y": 0.4778822533505718
-            },
-            "p1": {
-              "x": 0.5603752218607517,
-              "y": 0.000041473854844321226
-            },
-            "p2": {
-              "x": 263.85172613121017,
-              "y": 0.4778822533505718
-            }
-          }
-        },
-        {
-          "ID": "4257",
-          "typeID": "Arrow",
-          "zOrder": "56",
-          "w": "109",
-          "h": "52",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "535",
-          "y": "2103",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.420001934898778,
-              "y": -0.2794216265247087
-            },
-            "p1": {
-              "x": 0.5072633037161028,
-              "y": -0.11171061310241293
-            },
-            "p2": {
-              "x": 108.86070140078596,
-              "y": 51.737704484530695
-            }
-          }
-        },
-        {
-          "ID": "4258",
-          "typeID": "Arrow",
-          "zOrder": "57",
-          "w": "112",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "519",
-          "y": "2164",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.420001934898778,
-              "y": -0.2794216265247087
-            },
-            "p1": {
-              "x": 0.5603752218607518,
-              "y": 0.000041473854844323814
-            },
-            "p2": {
-              "x": 111.43776890053402,
-              "y": -0.2794216265247087
-            }
-          }
-        },
-        {
-          "ID": "4259",
-          "typeID": "Arrow",
-          "zOrder": "58",
-          "w": "1",
-          "h": "180",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "715",
-          "y": "1978",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.3322483172673856,
-              "y": -0.390329134334479
-            },
-            "p1": {
-              "x": 0.560375221860752,
-              "y": 0.00004147385484432426
-            },
-            "p2": {
-              "x": 0.3322483172673856,
-              "y": 179.7205783734753
-            }
-          }
-        },
-        {
-          "ID": "4260",
-          "typeID": "Arrow",
-          "zOrder": "59",
-          "w": "1",
-          "h": "183",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "960",
-          "y": "1883",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.3322483172673856,
-              "y": -0.390329134334479
-            },
-            "p1": {
-              "x": 0.560375221860752,
-              "y": 0.0000414738548443241
-            },
-            "p2": {
-              "x": 0.3322483172673856,
-              "y": 182.2514878161844
-            }
-          }
-        },
-        {
-          "ID": "4261",
-          "typeID": "Arrow",
-          "zOrder": "60",
-          "w": "1",
-          "h": "356",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "827",
-          "y": "1716",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": -0.13261304041122912,
-              "y": 0.4778822533505718
-            },
-            "p1": {
-              "x": 0.5603752218607517,
-              "y": 0.00004147385484432138
-            },
-            "p2": {
-              "x": -0.13261304041122912,
-              "y": 356.6572942053813
-            }
-          }
-        },
-        {
-          "ID": "4262",
-          "typeID": "Arrow",
-          "zOrder": "61",
-          "w": "1",
-          "h": "75",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "440",
-          "y": "1711",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.437564080560378,
-              "y": -0.13060308482113214
-            },
-            "p1": {
-              "x": 0.5603752218607518,
-              "y": 0.00004147385484431918
-            },
-            "p2": {
-              "x": -0.437564080560378,
-              "y": 75.30140086667325
-            }
-          }
-        },
-        {
-          "ID": "4263",
-          "typeID": "Arrow",
-          "zOrder": "62",
-          "w": "1",
-          "h": "151",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "692",
-          "y": "1628",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.437564080560378,
-              "y": -0.13060308482113214
-            },
-            "p1": {
-              "x": 0.560375221860752,
-              "y": 0.000041473854844319376
-            },
-            "p2": {
-              "x": -0.437564080560378,
-              "y": 150.84421614431108
-            }
-          }
-        },
-        {
-          "ID": "4264",
-          "typeID": "Arrow",
-          "zOrder": "63",
-          "w": "124",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "551",
-          "y": "1699",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.437564080560378,
-              "y": -0.13060308482113214
-            },
-            "p1": {
-              "x": 0.560375221860752,
-              "y": 0.00004147385484431972
-            },
-            "p2": {
-              "x": 123.37040141957095,
-              "y": -0.13060308482113214
-            }
-          }
-        },
-        {
-          "ID": "4265",
-          "typeID": "Arrow",
-          "zOrder": "64",
-          "w": "264",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "817",
-          "y": "1706",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": -0.13261304041122912,
-              "y": 0.4778822533505718
-            },
-            "p1": {
-              "x": 0.5603752218607517,
-              "y": 0.000041473854844321226
-            },
-            "p2": {
-              "x": 263.85172613121017,
-              "y": 0.4778822533505718
-            }
-          }
-        },
-        {
-          "ID": "4266",
-          "typeID": "Arrow",
-          "zOrder": "65",
-          "w": "89",
-          "h": "65",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1234",
-          "y": "1779",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.46973141187118017,
-              "y": 1.0668555880276926
-            },
-            "p1": {
-              "x": 0.4925674435676276,
-              "y": 0.21967333455679897
-            },
-            "p2": {
-              "x": 89.95594808021747,
-              "y": 65.19864420034241
-            }
-          }
-        },
-        {
-          "ID": "4267",
-          "typeID": "Arrow",
-          "zOrder": "66",
-          "w": "1",
-          "h": "99",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1175",
-          "y": "1773",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.3322483172673856,
-              "y": -0.390329134334479
-            },
-            "p1": {
-              "x": 0.560375221860752,
-              "y": 0.00004147385484432404
-            },
-            "p2": {
-              "x": 0.3322483172673856,
-              "y": 98.55950212865446
-            }
-          }
-        },
-        {
-          "ID": "4268",
-          "typeID": "Arrow",
-          "zOrder": "67",
-          "w": "1",
-          "h": "238",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1189",
-          "y": "1529",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.3322483172673856,
-              "y": -0.22619939572473413
-            },
-            "p1": {
-              "x": 0.5603752218607518,
-              "y": 0.000041473854844323564
-            },
-            "p2": {
-              "x": 0.3322483172673856,
-              "y": 237.55950212865446
-            }
-          }
-        },
-        {
-          "ID": "4269",
-          "typeID": "Arrow",
-          "zOrder": "68",
-          "w": "98",
-          "h": "58",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1209",
-          "y": "1634",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0,
-              "y": 58
-            },
-            "p1": {
-              "x": 0.549376450841471,
-              "y": -0.12327909853320433
-            },
-            "p2": {
-              "x": 98,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4270",
-          "typeID": "Arrow",
-          "zOrder": "69",
-          "w": "63",
-          "h": "61",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1404",
-          "y": "1580",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.2826816296803827,
-              "y": 60.973711769302554
-            },
-            "p1": {
-              "x": 0.4778793130959362,
-              "y": -0.13718947308358445
-            },
-            "p2": {
-              "x": 63.668560824005,
-              "y": -0.2824161135083614
-            }
-          }
-        },
-        {
-          "ID": "4271",
-          "typeID": "Arrow",
-          "zOrder": "70",
-          "w": "85",
-          "h": "6",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1395",
-          "y": "1644",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.49627041426560936,
-              "y": 6.068383154059575
-            },
-            "p1": {
-              "x": 0.5603752218607518,
-              "y": 0.000041473854844312064
-            },
-            "p2": {
-              "x": 84.70364075076168,
-              "y": 0.38072775465388986
-            }
-          }
-        },
-        {
-          "ID": "4272",
-          "typeID": "Arrow",
-          "zOrder": "71",
-          "w": "111",
-          "h": "3",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1206",
-          "y": "1698",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0,
-              "y": 3
-            },
-            "p1": {
-              "x": 0.5611518257876794,
-              "y": 0.00046982362474169356
-            },
-            "p2": {
-              "x": 111,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4273",
-          "typeID": "Arrow",
-          "zOrder": "72",
-          "w": "114",
-          "h": "152",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1355",
-          "y": "1711",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.10728199589652831,
-              "y": 0.0438716228161411
-            },
-            "p1": {
-              "x": 0.5185185185185176,
-              "y": 0.11111111111111069
-            },
-            "p2": {
-              "x": 114.07557680935633,
-              "y": 152.0015980407627
-            }
-          }
-        },
-        {
-          "ID": "4274",
-          "typeID": "Arrow",
-          "zOrder": "73",
-          "w": "89",
-          "h": "56",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1386",
-          "y": "1705",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.06163367362637473,
-              "y": 0.41580768141079716
-            },
-            "p1": {
-              "x": 0.5075693860386883,
-              "y": 0.10428931875525668
-            },
-            "p2": {
-              "x": 88.70364075076168,
-              "y": 56.69644709546492
-            }
-          }
-        },
-        {
-          "ID": "4275",
-          "typeID": "Arrow",
-          "zOrder": "74",
-          "w": "97",
-          "h": "94",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1372",
-          "y": "1714",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.008526179887212493,
-              "y": -0.14209640648118693
-            },
-            "p1": {
-              "x": 0.5018378378378366,
-              "y": 0.12497297297297241
-            },
-            "p2": {
-              "x": 97.07557680935633,
-              "y": 94.12797461205969
-            }
-          }
-        },
-        {
-          "ID": "4276",
-          "typeID": "Arrow",
-          "zOrder": "75",
-          "w": "84",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1390",
-          "y": "1697",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.2826816296803827,
-              "y": -0.026288230697446124
-            },
-            "p1": {
-              "x": 0.560375221860752,
-              "y": 0.000041473854844321646
-            },
-            "p2": {
-              "x": 84.70364075076168,
-              "y": 1.3807277546538899
-            }
-          }
-        },
-        {
-          "ID": "4277",
-          "typeID": "Arrow",
-          "zOrder": "76",
-          "w": "252",
-          "h": "355",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "864",
-          "y": "1347",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 2.872735078975893,
-              "y": -0.33481391621171497
-            },
-            "p1": {
-              "x": 0.519642864580947,
-              "y": -0.23045397934829226
-            },
-            "p2": {
-              "x": 252.64621279854873,
-              "y": 354.2894950317443
-            }
-          }
-        },
-        {
-          "ID": "4278",
-          "typeID": "Arrow",
-          "zOrder": "77",
-          "w": "135",
-          "h": "55",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "491",
-          "y": "1429",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.1311834137360961,
-              "y": 55.67810473497843
-            },
-            "p1": {
-              "x": 0.5610020427769666,
-              "y": 0.0972522041100265
-            },
-            "p2": {
-              "x": 134.37040141957095,
-              "y": 0.8693969151788679
-            }
-          }
-        },
-        {
-          "ID": "4279",
-          "typeID": "Arrow",
-          "zOrder": "78",
-          "w": "128",
-          "h": "3",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "497",
-          "y": "1417",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.437564080560378,
-              "y": 2.869396915178868
-            },
-            "p1": {
-              "x": 0.560375221860752,
-              "y": 0.00004147385484431969
-            },
-            "p2": {
-              "x": 127.84945604086488,
-              "y": 0.057186962663308805
-            }
-          }
-        },
-        {
-          "ID": "4280",
-          "typeID": "Arrow",
-          "zOrder": "79",
-          "w": "124",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "653",
-          "y": "1343",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.437564080560378,
-              "y": -0.13060308482113214
-            },
-            "p1": {
-              "x": 0.560375221860752,
-              "y": 0.00004147385484431972
-            },
-            "p2": {
-              "x": 123.37040141957095,
-              "y": -0.13060308482113214
-            }
-          }
-        },
-        {
-          "ID": "4281",
-          "typeID": "Arrow",
-          "zOrder": "80",
-          "w": "1",
-          "h": "156",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "778",
-          "y": "1254",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.437564080560378,
-              "y": -0.13060308482113214
-            },
-            "p1": {
-              "x": 0.560375221860752,
-              "y": 0.00004147385484431993
-            },
-            "p2": {
-              "x": -0.437564080560378,
-              "y": 156.0392732186167
-            }
-          }
-        },
-        {
-          "ID": "4282",
-          "typeID": "Arrow",
-          "zOrder": "81",
-          "w": "1",
-          "h": "87",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "440",
-          "y": "1477",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.437564080560378,
-              "y": -0.13060308482113214
-            },
-            "p1": {
-              "x": 0.560375221860752,
-              "y": 0.00004147385484431989
-            },
-            "p2": {
-              "x": -0.437564080560378,
-              "y": 86.78558719925854
-            }
-          }
-        },
-        {
-          "ID": "4283",
-          "typeID": "Arrow",
-          "zOrder": "82",
-          "w": "203",
-          "h": "67",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "858",
-          "y": "1272",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0.4306391668677634,
-              "y": 66.22309017168027
-            },
-            "p1": {
-              "x": 0.42724524722153456,
-              "y": 0.13151780040122107
-            },
-            "p2": {
-              "x": 203.04975897053612,
-              "y": 1.0309196937046181
-            }
-          }
-        },
-        {
-          "ID": "4284",
-          "typeID": "Arrow",
-          "zOrder": "83",
-          "w": "139",
-          "h": "105",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1271",
-          "y": "1365",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.6119596717263374,
-              "y": 0.10809426981507679
-            },
-            "p2": {
-              "x": 139,
-              "y": 105
-            }
-          }
-        },
-        {
-          "ID": "4285",
-          "typeID": "Arrow",
-          "zOrder": "84",
-          "w": "162",
-          "h": "60",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1263",
-          "y": "1358",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.6128430230474166,
-              "y": 0.10872422886127613
-            },
-            "p2": {
-              "x": 162,
-              "y": 60
-            }
-          }
-        },
-        {
-          "ID": "4286",
-          "typeID": "Arrow",
-          "zOrder": "85",
-          "w": "154",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1275",
-          "y": "1347",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5612961818921481,
-              "y": 0.00022867252189391965
-            },
-            "p2": {
-              "x": 154,
-              "y": 2
-            }
-          }
-        },
-        {
-          "ID": "4287",
-          "typeID": "Arrow",
-          "zOrder": "86",
-          "w": "1",
-          "h": "77",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1208",
-          "y": "1279",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.3322483172672719,
-              "y": 0.33195240379461666
-            },
-            "p1": {
-              "x": 0.5603752218607517,
-              "y": 0.000041473854844322974
-            },
-            "p2": {
-              "x": 0.3322483172672719,
-              "y": 77.1894182194003
-            }
-          }
-        },
-        {
-          "ID": "4288",
-          "typeID": "Arrow",
-          "zOrder": "87",
-          "w": "1",
-          "h": "92",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1208",
-          "y": "1178",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.3322483172672719,
-              "y": 0.33195240379461666
-            },
-            "p1": {
-              "x": 0.5603752218607517,
-              "y": 0.000041473854844322324
-            },
-            "p2": {
-              "x": 0.3322483172673856,
-              "y": 91.86939691517887
-            }
-          }
-        },
-        {
-          "ID": "4289",
-          "typeID": "Arrow",
-          "zOrder": "88",
-          "w": "123",
-          "h": "2",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1243",
-          "y": "1265",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.437564080560378,
-              "y": 1.8693969151788679
-            },
-            "p1": {
-              "x": 0.5603752218607518,
-              "y": 0.00004147385484432067
-            },
-            "p2": {
-              "x": 122.87465229199029,
-              "y": 0.030919693704618112
-            }
-          }
-        },
-        {
-          "ID": "4290",
-          "typeID": "Arrow",
-          "zOrder": "89",
-          "w": "1",
-          "h": "92",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1466",
-          "y": "1178",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.3322483172672719,
-              "y": 0.33195240379461666
-            },
-            "p1": {
-              "x": 0.5603752218607517,
-              "y": 0.000041473854844322324
-            },
-            "p2": {
-              "x": 0.3322483172673856,
-              "y": 91.86939691517887
-            }
-          }
-        },
-        {
-          "ID": "4291",
-          "typeID": "Arrow",
-          "zOrder": "90",
-          "w": "133",
-          "h": "176",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1189",
-          "y": "714",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.455820544441508,
-              "y": 176.48700951470767
-            },
-            "p1": {
-              "x": 0.5496640195479536,
-              "y": -0.09383017715332964
-            },
-            "p2": {
-              "x": 133.71142804666988,
-              "y": 0.29348403953895286
-            }
-          }
-        },
-        {
-          "ID": "4292",
-          "typeID": "Arrow",
-          "zOrder": "91",
-          "w": "127",
-          "h": "123",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1201",
-          "y": "768",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.30076343352845925,
-              "y": 122.96762737584356
-            },
-            "p1": {
-              "x": 0.5496640195479535,
-              "y": -0.09383017715332966
-            },
-            "p2": {
-              "x": 127.63389949121347,
-              "y": 0.07634490156624452
-            }
-          }
-        },
-        {
-          "ID": "4293",
-          "typeID": "Arrow",
-          "zOrder": "92",
-          "w": "118",
-          "h": "55",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1210",
-          "y": "835",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.18447060034372953,
-              "y": 54.487009514707665
-            },
-            "p1": {
-              "x": 0.5496640195479536,
-              "y": -0.09383017715332968
-            },
-            "p2": {
-              "x": 118.63389949121347,
-              "y": -0.2570870695913072
-            }
-          }
-        },
-        {
-          "ID": "4294",
-          "typeID": "Arrow",
-          "zOrder": "93",
-          "w": "148",
-          "h": "7",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1197",
-          "y": "894",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.14109014987911905,
-              "y": 7.331952403794617
-            },
-            "p1": {
-              "x": 0.560375221860752,
-              "y": 0.00004147385484432276
-            },
-            "p2": {
-              "x": 147.9206959637081,
-              "y": -0.07113690188464261
-            }
-          }
-        },
-        {
-          "ID": "4295",
-          "typeID": "Arrow",
-          "zOrder": "94",
-          "w": "239",
-          "h": "354",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "809",
-          "y": "908",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 2.097169988784458,
-              "y": 0.030919693704618112
-            },
-            "p1": {
-              "x": 0.5624700347893109,
-              "y": -0.23976212880510578
-            },
-            "p2": {
-              "x": 239.37779718930074,
-              "y": 354.244226962707
-            }
-          }
-        },
-        {
-          "ID": "4296",
-          "typeID": "Arrow",
-          "zOrder": "95",
-          "w": "136",
-          "h": "153",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "852",
-          "y": "911",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.14836954386862544,
-              "y": 0.060602459696838196
-            },
-            "p1": {
-              "x": 0.5641384131422579,
-              "y": 0.09437259699405756
-            },
-            "p2": {
-              "x": 136.06847368063154,
-              "y": 152.56424215669153
-            }
-          }
-        },
-        {
-          "ID": "4297",
-          "typeID": "Arrow",
-          "zOrder": "96",
-          "w": "144",
-          "h": "104",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "861",
-          "y": "908",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.26466237705335516,
-              "y": 0.09936673742515723
-            },
-            "p1": {
-              "x": 0.5641384131422578,
-              "y": 0.09437259699405774
-            },
-            "p2": {
-              "x": 143.35527015312618,
-              "y": 103.74261701693615
-            }
-          }
-        },
-        {
-          "ID": "4298",
-          "typeID": "Arrow",
-          "zOrder": "97",
-          "w": "144",
-          "h": "61",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "852",
-          "y": "899",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.14836954386862544,
-              "y": 0.21565957060988694
-            },
-            "p1": {
-              "x": 0.5641384131422578,
-              "y": 0.09437259699405771
-            },
-            "p2": {
-              "x": 143.47156298631091,
-              "y": 60.920991877180654
-            }
-          }
-        },
-        {
-          "ID": "4299",
-          "typeID": "Arrow",
-          "zOrder": "98",
-          "h": "4",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "853",
-          "y": "890",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.3322483172672719,
-              "y": 0.33195240379461666
-            },
-            "p1": {
-              "x": 0.5603752218607518,
-              "y": 0.000041473854844321544
-            },
-            "p2": {
-              "x": 149.8746522919903,
-              "y": 4.030919693704618
-            }
-          }
-        },
-        {
-          "ID": "4300",
-          "typeID": "Arrow",
-          "zOrder": "99",
-          "w": "281",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "584",
-          "y": "904",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0.1745155500960891,
-              "y": 0.030919693704618112
-            },
-            "p1": {
-              "x": 0.5603752218607516,
-              "y": 0.00004147385484432152
-            },
-            "p2": {
-              "x": 281.0497589705361,
-              "y": 0.030919693704618112
-            }
-          }
-        },
-        {
-          "ID": "4301",
-          "typeID": "Arrow",
-          "zOrder": "100",
-          "w": "1",
-          "h": "93",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "543",
-          "y": "912",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 1.097169988784458,
-              "y": 0.030919693704618112
-            },
-            "p1": {
-              "x": 0.564722657257297,
-              "y": -0.008677972962353458
-            },
-            "p2": {
-              "x": 1.097169988784458,
-              "y": 92.89719220148004
-            }
-          }
-        },
-        {
-          "ID": "4302",
-          "typeID": "Arrow",
-          "zOrder": "101",
-          "w": "1",
-          "h": "93",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "408",
-          "y": "912",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 1.097169988784458,
-              "y": 0.030919693704618112
-            },
-            "p1": {
-              "x": 0.564722657257297,
-              "y": -0.008677972962353458
-            },
-            "p2": {
-              "x": 1.097169988784458,
-              "y": 92.89719220148004
-            }
-          }
-        },
-        {
-          "ID": "4303",
-          "typeID": "Arrow",
-          "zOrder": "102",
-          "w": "121",
-          "h": "28",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "602",
-          "y": "761",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0,
-              "y": 28
-            },
-            "p1": {
-              "x": 0.5357706199231295,
-              "y": 0.06148757378953288
-            },
-            "p2": {
-              "x": 121,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4304",
-          "typeID": "Arrow",
-          "zOrder": "103",
-          "w": "114",
-          "h": "24",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "602",
-          "y": "726",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.547045774812979,
-              "y": -0.07709396362740584
-            },
-            "p2": {
-              "x": 114,
-              "y": 22
-            }
-          }
-        },
-        {
-          "ID": "4305",
-          "typeID": "Arrow",
-          "zOrder": "104",
-          "w": "93",
-          "h": "98",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "930",
-          "y": "651",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.347694845664023,
-              "y": 97.82831270679992
-            },
-            "p1": {
-              "x": 0.5719087513824819,
-              "y": -0.09701474419519386
-            },
-            "p2": {
-              "x": 93.62662009722396,
-              "y": 0.10753387183240193
-            }
-          }
-        },
-        {
-          "ID": "4306",
-          "typeID": "Arrow",
-          "zOrder": "105",
-          "w": "98",
-          "h": "50",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "929",
-          "y": "707",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.13292301547187435,
-              "y": 50.71201987361508
-            },
-            "p1": {
-              "x": 0.5745889396395687,
-              "y": -0.10157561581357251
-            },
-            "p2": {
-              "x": 97.58785581949564,
-              "y": 0.37101259499547723
-            }
-          }
-        },
-        {
-          "ID": "4307",
-          "typeID": "Arrow",
-          "zOrder": "106",
-          "w": "114",
-          "h": "6",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "926",
-          "y": "761",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.09415873774355532,
-              "y": 5.595727040430347
-            },
-            "p1": {
-              "x": 0.5537063361730054,
-              "y": 0.0009779515015223314
-            },
-            "p2": {
-              "x": 113.91341656971849,
-              "y": -0.32674440411312844
-            }
-          }
-        },
-        {
-          "ID": "4308",
-          "typeID": "Arrow",
-          "zOrder": "107",
-          "w": "174",
-          "h": "90",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "693",
-          "y": "572",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.02222113824285543,
-              "y": 89.41338087414158
-            },
-            "p1": {
-              "x": 0.5612843769704616,
-              "y": 0.05607023330261442
-            },
-            "p2": {
-              "x": 174.06396411988374,
-              "y": -0.09380123070229729
-            }
-          }
-        },
-        {
-          "ID": "4309",
-          "typeID": "Arrow",
-          "zOrder": "108",
-          "w": "173",
-          "h": "45",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "691",
-          "y": "568",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.26537644525456017,
-              "y": 45.2008579796493
-            },
-            "p1": {
-              "x": 0.5612843769704615,
-              "y": 0.05607023330261436
-            },
-            "p2": {
-              "x": 173.06396411988374,
-              "y": 0.4472669272273606
-            }
-          }
-        },
-        {
-          "ID": "4310",
-          "typeID": "Arrow",
-          "zOrder": "109",
-          "w": "167",
-          "h": "93",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "695",
-          "y": "449",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.1558613574420633,
-              "y": 0.28950157664132803
-            },
-            "p1": {
-              "x": 0.5217150699561692,
-              "y": -0.05809546362490517
-            },
-            "p2": {
-              "x": 167.0913428918368,
-              "y": 92.82731609400469
-            }
-          }
-        },
-        {
-          "ID": "4311",
-          "typeID": "Arrow",
-          "zOrder": "110",
-          "w": "165",
-          "h": "3",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "693",
-          "y": "555",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.09716998878445793,
-              "y": 0.030919693704618112
-            },
-            "p1": {
-              "x": 0.5603752218607517,
-              "y": 0.00004147385484432151
-            },
-            "p2": {
-              "x": 165.0092065759775,
-              "y": 3.23149039216878
-            }
-          }
-        },
-        {
-          "ID": "4312",
-          "typeID": "Arrow",
-          "zOrder": "111",
-          "w": "167",
-          "h": "46",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "695",
-          "y": "502",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.1558613574420633,
-              "y": 0.28950157664132803
-            },
-            "p1": {
-              "x": 0.5217150699561692,
-              "y": -0.058095463624905135
-            },
-            "p2": {
-              "x": 167.27974065494232,
-              "y": 46.0157138571102
-            }
-          }
-        },
-        {
-          "ID": "4313",
-          "typeID": "__group__",
-          "zOrder": "112",
-          "measuredW": "355",
-          "measuredH": "47",
-          "w": "355",
-          "h": "47",
-          "x": "353",
-          "y": "429",
-          "properties": {
-            "controlName": "100-general-development-skills:git"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "346",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "162",
-                  "measuredH": "26",
-                  "x": "101",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Git - Version Control"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4314",
-          "typeID": "__group__",
-          "zOrder": "113",
-          "measuredW": "355",
-          "measuredH": "47",
-          "w": "355",
-          "h": "47",
-          "x": "353",
-          "y": "583",
-          "properties": {
-            "controlName": "103-general-development-skills:http-https"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "346",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "193",
-                  "measuredH": "26",
-                  "x": "85",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "HTTP / HTTPS Protocol"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4315",
-          "typeID": "__group__",
-          "zOrder": "114",
-          "measuredW": "355",
-          "measuredH": "47",
-          "w": "355",
-          "h": "47",
-          "x": "353",
-          "y": "480",
-          "properties": {
-            "controlName": "101-general-development-skills:azure-devops-services"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "346",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "192",
-                  "measuredH": "26",
-                  "x": "86",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Azure DevOps Services"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4316",
-          "typeID": "__group__",
-          "zOrder": "115",
-          "measuredW": "355",
-          "measuredH": "47",
-          "w": "355",
-          "h": "47",
-          "x": "353",
-          "y": "532",
-          "properties": {
-            "controlName": "102-general-development-skills:vcs-hosting-services"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "346",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "204",
-                  "measuredH": "26",
-                  "x": "80",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "GitHub, GitLab, BitBucket"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4317",
-          "typeID": "__group__",
-          "zOrder": "116",
-          "measuredW": "355",
-          "measuredH": "47",
-          "w": "355",
-          "h": "47",
-          "x": "353",
-          "y": "635",
-          "properties": {
-            "controlName": "104-general-development-skills:datastructures-and-algorithms"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "346",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "249",
-                  "measuredH": "26",
-                  "x": "57",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "DataStructures and Algorithms"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "13",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4318",
-          "typeID": "Arrow",
-          "zOrder": "117",
-          "w": "205",
-          "h": "52",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1156",
-          "y": "506",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.3903644341978634,
-              "y": -0.03579004622974935
-            },
-            "p1": {
-              "x": 0.5997856951513523,
-              "y": 0.082373426198768
-            },
-            "p2": {
-              "x": 204.85482628291743,
-              "y": 51.87868141421234
-            }
-          }
-        },
-        {
-          "ID": "4319",
-          "typeID": "Arrow",
-          "zOrder": "118",
-          "w": "222",
-          "h": "57",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1147",
-          "y": "432",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.09245158327996705,
-              "y": 56.56003565560616
-            },
-            "p1": {
-              "x": 0.5667465019538631,
-              "y": -0.09781923610235727
-            },
-            "p2": {
-              "x": 221.70210094693743,
-              "y": 0.32228678989048376
-            }
-          }
-        },
-        {
-          "ID": "4320",
-          "typeID": "Arrow",
-          "zOrder": "119",
-          "w": "224",
-          "h": "8",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1148",
-          "y": "492",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.09716998878445793,
-              "y": 8.030919693704618
-            },
-            "p1": {
-              "x": 0.564722657257297,
-              "y": -0.008677972962353458
-            },
-            "p2": {
-              "x": 223.8410108125454,
-              "y": -0.17733562916464507
-            }
-          }
-        },
-        {
-          "ID": "4321",
-          "typeID": "Arrow",
-          "zOrder": "120",
-          "w": "372",
-          "h": "339",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "566",
-          "y": "554",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 371.52571336931953,
-              "y": 0.22853030359101467
-            },
-            "p1": {
-              "x": 0.5035058827524153,
-              "y": 0.11037164054939656
-            },
-            "p2": {
-              "x": -0.07827100262403519,
-              "y": 338.88889903972404
-            }
-          }
-        },
-        {
-          "ID": "4322",
-          "typeID": "Label",
-          "zOrder": "121",
-          "measuredW": "206",
-          "measuredH": "40",
-          "x": "856",
-          "y": "304",
-          "properties": {
-            "size": "32",
-            "text": "ASP.NET Core"
-          }
-        },
-        {
-          "ID": "4323",
-          "typeID": "Arrow",
-          "zOrder": "122",
-          "w": "17",
-          "h": "92",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "917",
-          "y": "199",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "direction": "bottom",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 16.339656000000105,
-              "y": -0.4605359999999976
-            },
-            "p1": {
-              "x": 0.47266137171756467,
-              "y": -0.1805805391947072
-            },
-            "p2": {
-              "x": 16.339656000000105,
-              "y": 91.24769600000002
-            }
-          }
-        },
-        {
-          "ID": "4324",
-          "typeID": "Arrow",
-          "zOrder": "123",
-          "w": "22",
-          "h": "143",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "957",
-          "y": "355",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 1,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.45347006063746154,
-              "y": 0.15257428266756415
-            },
-            "p2": {
-              "x": 0.2918827508058257,
-              "y": 142.56551140999682
-            }
-          }
-        },
-        {
-          "ID": "4325",
-          "typeID": "__group__",
-          "zOrder": "124",
-          "measuredW": "352",
-          "measuredH": "50",
-          "w": "352",
-          "h": "50",
-          "x": "840",
-          "y": "474",
-          "properties": {
-            "controlName": "100-basics-of-csharp"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "341",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "188",
-                  "measuredH": "26",
-                  "x": "88",
-                  "y": "12",
-                  "properties": {
-                    "size": "18",
-                    "text": "Learn the Basics of C#"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "15",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4326",
-          "typeID": "__group__",
-          "zOrder": "125",
-          "measuredW": "206",
-          "measuredH": "47",
-          "w": "206",
-          "h": "47",
-          "x": "1354",
-          "y": "417",
-          "properties": {
-            "controlName": "100-basics-of-csharp:csharp"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "195",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "25",
-                  "measuredH": "26",
-                  "x": "85",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "C#"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "182",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4340",
-          "typeID": "__group__",
-          "zOrder": "128",
-          "measuredW": "206",
-          "measuredH": "47",
-          "w": "206",
-          "h": "47",
-          "x": "1354",
-          "y": "469",
-          "properties": {
-            "controlName": "101-basics-of-csharp:dotnet"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "195",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "40",
-                  "measuredH": "26",
-                  "x": "78",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": ".NET"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "182",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4341",
-          "typeID": "__group__",
-          "zOrder": "129",
-          "measuredW": "351",
-          "measuredH": "50",
-          "w": "351",
-          "h": "50",
-          "x": "851",
-          "y": "530",
-          "properties": {
-            "controlName": "101-general-development-skills"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "341",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "224",
-                  "measuredH": "26",
-                  "x": "59",
-                  "y": "12",
-                  "properties": {
-                    "size": "18",
-                    "text": "General Development Skills"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "327",
-                  "y": "13",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4342",
-          "typeID": "__group__",
-          "zOrder": "130",
-          "measuredW": "206",
-          "measuredH": "47",
-          "w": "206",
-          "h": "47",
-          "x": "1354",
-          "y": "522",
-          "properties": {
-            "controlName": "102-basics-of-csharp:dotnet-cli"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "195",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "74",
-                  "measuredH": "26",
-                  "x": "61",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": ".NET CLI"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "182",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4343",
-          "typeID": "__group__",
-          "zOrder": "131",
-          "measuredW": "244",
-          "measuredH": "50",
-          "w": "244",
-          "h": "50",
-          "x": "697",
-          "y": "731",
-          "properties": {
-            "controlName": "102-database-fundamentals"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "244",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "199",
-                  "measuredH": "26",
-                  "x": "22",
-                  "y": "12",
-                  "properties": {
-                    "size": "18",
-                    "text": "Database Fundamentals"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4344",
-          "typeID": "__group__",
-          "zOrder": "132",
-          "measuredW": "260",
-          "measuredH": "47",
-          "w": "260",
-          "h": "47",
-          "x": "353",
-          "y": "707",
-          "properties": {
-            "controlName": "100-database-fundamentals:database-design-basics"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "251",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "200",
-                  "measuredH": "26",
-                  "x": "33",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Database Design Basics"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4345",
-          "typeID": "__group__",
-          "zOrder": "133",
-          "measuredW": "260",
-          "measuredH": "47",
-          "w": "260",
-          "h": "47",
-          "x": "353",
-          "y": "760",
-          "properties": {
-            "controlName": "101-database-fundamentals:sql-basics"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "251",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "95",
-                  "measuredH": "26",
-                  "x": "87",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "SQL Basics"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4346",
-          "typeID": "__group__",
-          "zOrder": "134",
-          "measuredW": "236",
-          "measuredH": "47",
-          "w": "236",
-          "h": "47",
-          "x": "1017",
-          "y": "636",
-          "properties": {
-            "controlName": "102-database-fundamentals:stored-procedures"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "226",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "153",
-                  "measuredH": "26",
-                  "x": "36",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Stored Procedures"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "212",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4347",
-          "typeID": "__group__",
-          "zOrder": "135",
-          "measuredW": "236",
-          "measuredH": "47",
-          "w": "236",
-          "h": "47",
-          "x": "1017",
-          "y": "688",
-          "properties": {
-            "controlName": "103-database-fundamentals:constraints"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "226",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "93",
-                  "measuredH": "26",
-                  "x": "66",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Constraints"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "212",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4348",
-          "typeID": "__group__",
-          "zOrder": "136",
-          "measuredW": "236",
-          "measuredH": "47",
-          "w": "236",
-          "h": "47",
-          "x": "1017",
-          "y": "740",
-          "properties": {
-            "controlName": "104-database-fundamentals:triggers"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "226",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "68",
-                  "measuredH": "26",
-                  "x": "79",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Triggers"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "212",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4349",
-          "typeID": "__group__",
-          "zOrder": "137",
-          "measuredW": "269",
-          "measuredH": "50",
-          "w": "269",
-          "h": "50",
-          "x": "340",
-          "y": "879",
-          "properties": {
-            "controlName": "103-basics-of-aspnet-core"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "261",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "8",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "175",
-                  "measuredH": "26",
-                  "x": "51",
-                  "y": "12",
-                  "properties": {
-                    "size": "18",
-                    "text": "ASP.NET Core Basics"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "13",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4350",
-          "typeID": "__group__",
-          "zOrder": "138",
-          "measuredW": "129",
-          "measuredH": "47",
-          "w": "129",
-          "h": "47",
-          "x": "340",
-          "y": "980",
-          "properties": {
-            "controlName": "100-basics-of-aspnet-core:mvc"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "121",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "8",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "39",
-                  "measuredH": "26",
-                  "x": "49",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "MVC"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4351",
-          "typeID": "__group__",
-          "zOrder": "139",
-          "measuredW": "137",
-          "measuredH": "47",
-          "w": "137",
-          "h": "47",
-          "x": "479",
-          "y": "980",
-          "properties": {
-            "controlName": "101-basics-of-aspnet-core:rest"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "130",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "47",
-                  "measuredH": "26",
-                  "x": "41",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "REST"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "113",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4352",
-          "typeID": "__group__",
-          "zOrder": "140",
-          "measuredW": "268",
-          "measuredH": "47",
-          "w": "268",
-          "h": "47",
-          "x": "348",
-          "y": "1032",
-          "properties": {
-            "controlName": "102-basics-of-aspnet-core:razor-pages"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "261",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "104",
-                  "measuredH": "26",
-                  "x": "79",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Razor Pages"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "244",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4353",
-          "typeID": "__group__",
-          "zOrder": "141",
-          "measuredW": "268",
-          "measuredH": "47",
-          "w": "268",
-          "h": "47",
-          "x": "348",
-          "y": "1084",
-          "properties": {
-            "controlName": "103-basics-of-aspnet-core:razor-components"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "261",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "157",
-                  "measuredH": "26",
-                  "x": "52",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Razor Components"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "244",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4354",
-          "typeID": "__group__",
-          "zOrder": "142",
-          "measuredW": "268",
-          "measuredH": "47",
-          "w": "268",
-          "h": "47",
-          "x": "348",
-          "y": "1136",
-          "properties": {
-            "controlName": "104-basics-of-aspnet-core:middlewares"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "261",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "103",
-                  "measuredH": "26",
-                  "x": "79",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Middlewares"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "244",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4355",
-          "typeID": "__group__",
-          "zOrder": "143",
-          "measuredW": "268",
-          "measuredH": "47",
-          "w": "268",
-          "h": "47",
-          "x": "348",
-          "y": "1188",
-          "properties": {
-            "controlName": "105-basics-of-aspnet-core:filters-and-attributes"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "261",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "169",
-                  "measuredH": "26",
-                  "x": "46",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Filters and Attributes"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "244",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4356",
-          "typeID": "__group__",
-          "zOrder": "144",
-          "measuredW": "268",
-          "measuredH": "47",
-          "w": "268",
-          "h": "47",
-          "x": "348",
-          "y": "1241",
-          "properties": {
-            "controlName": "106-basics-of-aspnet-core:app-settings-and-configurations"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "261",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "196",
-                  "measuredH": "26",
-                  "x": "33",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "App Settings and Config"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "244",
-                  "y": "13",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4357",
-          "typeID": "__group__",
-          "zOrder": "145",
-          "measuredW": "141",
-          "measuredH": "50",
-          "w": "141",
-          "h": "50",
-          "x": "737",
-          "y": "879",
-          "properties": {
-            "controlName": "104-orm"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "133",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "8",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "43",
-                  "measuredH": "26",
-                  "x": "53",
-                  "y": "12",
-                  "properties": {
-                    "size": "18",
-                    "text": "ORM"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "13",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4358",
-          "typeID": "__group__",
-          "zOrder": "146",
-          "measuredW": "261",
-          "measuredH": "47",
-          "w": "261",
-          "h": "47",
-          "x": "971",
-          "y": "871",
-          "properties": {
-            "controlName": "100-orm:entity-framework-core"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "251",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "184",
-                  "measuredH": "26",
-                  "x": "44",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Entity Framework Core"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "8",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4359",
-          "typeID": "__group__",
-          "zOrder": "147",
-          "measuredW": "286",
-          "measuredH": "47",
-          "w": "286",
-          "h": "47",
-          "x": "1317",
-          "y": "699",
-          "properties": {
-            "controlName": "100-orm:entity-framework-core:framework-basics"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "277",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "150",
-                  "measuredH": "26",
-                  "x": "64",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Framework Basics"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "262",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4360",
-          "typeID": "__group__",
-          "zOrder": "148",
-          "measuredW": "286",
-          "measuredH": "47",
-          "w": "286",
-          "h": "47",
-          "x": "1317",
-          "y": "755",
-          "properties": {
-            "controlName": "101-orm:entity-framework-core:codefirst-migrations"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "277",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "192",
-                  "measuredH": "26",
-                  "x": "43",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Code First + Migrations"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "262",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4361",
-          "typeID": "__group__",
-          "zOrder": "149",
-          "measuredW": "286",
-          "measuredH": "47",
-          "w": "286",
-          "h": "47",
-          "x": "1317",
-          "y": "811",
-          "properties": {
-            "controlName": "102-orm:entity-framework-core:change-tracker-api"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "277",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "163",
-                  "measuredH": "26",
-                  "x": "57",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Change Tracker API"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "262",
-                  "y": "9",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4362",
-          "typeID": "__group__",
-          "zOrder": "150",
-          "measuredW": "286",
-          "measuredH": "47",
-          "w": "286",
-          "h": "47",
-          "x": "1317",
-          "y": "867",
-          "properties": {
-            "controlName": "103-orm:entity-framework-core:lazy-eager-explicit-loading"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "277",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "229",
-                  "measuredH": "26",
-                  "x": "24",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Lazy, Eager, Explicit Loading"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "262",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4363",
-          "typeID": "__group__",
-          "zOrder": "151",
-          "measuredW": "261",
-          "measuredH": "47",
-          "w": "261",
-          "h": "47",
-          "x": "971",
-          "y": "925",
-          "properties": {
-            "controlName": "101-orm:dapper"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "251",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "62",
-                  "measuredH": "26",
-                  "x": "105",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Dapper"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "40463"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4364",
-          "typeID": "__group__",
-          "zOrder": "152",
-          "measuredW": "261",
-          "measuredH": "47",
-          "w": "261",
-          "h": "47",
-          "x": "971",
-          "y": "978",
-          "properties": {
-            "controlName": "102-orm:repodb"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "251",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "70",
-                  "measuredH": "26",
-                  "x": "101",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "RepoDB"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "13",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "40463"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4365",
-          "typeID": "__group__",
-          "zOrder": "153",
-          "measuredW": "261",
-          "measuredH": "47",
-          "w": "261",
-          "h": "47",
-          "x": "971",
-          "y": "1032",
-          "properties": {
-            "controlName": "103-orm:nhibernate"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "251",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "95",
-                  "measuredH": "26",
-                  "x": "88",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "NHibernate"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "40463"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4366",
-          "typeID": "__group__",
-          "zOrder": "154",
-          "measuredW": "279",
-          "measuredH": "50",
-          "w": "279",
-          "h": "50",
-          "x": "1013",
-          "y": "1241",
-          "properties": {
-            "controlName": "105-dependency-injection"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "270",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "178",
-                  "measuredH": "26",
-                  "x": "46",
-                  "y": "12",
-                  "properties": {
-                    "size": "18",
-                    "text": "Dependency Injection"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "255",
-                  "y": "13",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4367",
-          "typeID": "__group__",
-          "zOrder": "155",
-          "measuredW": "260",
-          "measuredH": "47",
-          "w": "260",
-          "h": "47",
-          "x": "1332",
-          "y": "1242",
-          "properties": {
-            "controlName": "101-dependency-injection:di-containers"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "251",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "113",
-                  "measuredH": "26",
-                  "x": "78",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "DI Containers"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4368",
-          "typeID": "__group__",
-          "zOrder": "156",
-          "measuredW": "261",
-          "measuredH": "76",
-          "w": "261",
-          "h": "76",
-          "x": "1331",
-          "y": "1128",
-          "properties": {
-            "controlName": "100-dependency-injection:di-containers:microsoft-extensions-dependency-injection"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "251",
-                  "h": "76",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "172",
-                  "measuredH": "26",
-                  "x": "50",
-                  "y": "13",
-                  "properties": {
-                    "size": "18",
-                    "text": "Microsoft.Extensions."
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "Label",
-                  "zOrder": "2",
-                  "measuredW": "174",
-                  "measuredH": "26",
-                  "x": "49",
-                  "y": "39",
-                  "properties": {
-                    "size": "18",
-                    "text": "DependencyInjection"
-                  }
-                },
-                {
-                  "ID": "3",
-                  "typeID": "__group__",
-                  "zOrder": "3",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "26",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4369",
-          "typeID": "__group__",
-          "zOrder": "157",
-          "measuredW": "130",
-          "measuredH": "47",
-          "w": "130",
-          "h": "47",
-          "x": "1332",
-          "y": "1075",
-          "properties": {
-            "controlName": "101-dependency-injection:di-containers:auto-fac"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "120",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "67",
-                  "measuredH": "26",
-                  "x": "36",
-                  "y": "10",
-                  "properties": {
-                    "size": "18",
-                    "text": "AutoFac"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4370",
-          "typeID": "__group__",
-          "zOrder": "158",
-          "measuredW": "128",
-          "measuredH": "47",
-          "w": "128",
-          "h": "47",
-          "x": "1472",
-          "y": "1075",
-          "properties": {
-            "controlName": "102-dependency-injection:di-containers:ninject"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "118",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "58",
-                  "measuredH": "26",
-                  "x": "30",
-                  "y": "10",
-                  "properties": {
-                    "size": "18",
-                    "text": "Ninject"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "104",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4371",
-          "typeID": "__group__",
-          "zOrder": "159",
-          "measuredW": "258",
-          "measuredH": "47",
-          "w": "258",
-          "h": "47",
-          "x": "1332",
-          "y": "1021",
-          "properties": {
-            "controlName": "103-dependency-injection:di-containers:castle-windsor"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "248",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "122",
-                  "measuredH": "26",
-                  "x": "73",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Castle Windsor"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4372",
-          "typeID": "__group__",
-          "zOrder": "160",
-          "measuredW": "258",
-          "measuredH": "47",
-          "w": "258",
-          "h": "47",
-          "x": "1332",
-          "y": "967",
-          "properties": {
-            "controlName": "104-dependency-injection:di-containers:simple-injector"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "248",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "123",
-                  "measuredH": "26",
-                  "x": "72",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Simple Injector"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4373",
-          "typeID": "__group__",
-          "zOrder": "161",
-          "measuredW": "158",
-          "measuredH": "47",
-          "w": "158",
-          "h": "47",
-          "x": "1134",
-          "y": "1156",
-          "properties": {
-            "controlName": "100-dependency-injection:scrutor"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "149",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "60",
-                  "measuredH": "26",
-                  "x": "45",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Scrutor"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "134",
-                  "y": "9",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4374",
-          "typeID": "__group__",
-          "zOrder": "162",
-          "measuredW": "158",
-          "measuredH": "47",
-          "w": "158",
-          "h": "47",
-          "x": "1125",
-          "y": "1333",
-          "properties": {
-            "controlName": "102-dependency-injection:life-cycles"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "149",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "89",
-                  "measuredH": "26",
-                  "x": "39",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Life Cycles"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4375",
-          "typeID": "__group__",
-          "zOrder": "163",
-          "measuredW": "196",
-          "measuredH": "47",
-          "w": "196",
-          "h": "47",
-          "x": "1404",
-          "y": "1329",
-          "properties": {
-            "controlName": "100-dependency-injection:life-cycles:scoped"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "187",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "63",
-                  "measuredH": "26",
-                  "x": "62",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Scoped"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "172",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4376",
-          "typeID": "__group__",
-          "zOrder": "164",
-          "measuredW": "196",
-          "measuredH": "47",
-          "w": "196",
-          "h": "47",
-          "x": "1404",
-          "y": "1386",
-          "properties": {
-            "controlName": "101-dependency-injection:life-cycles:transient"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "187",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "76",
-                  "measuredH": "26",
-                  "x": "56",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Transient"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "172",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4377",
-          "typeID": "__group__",
-          "zOrder": "165",
-          "measuredW": "196",
-          "measuredH": "47",
-          "w": "196",
-          "h": "47",
-          "x": "1404",
-          "y": "1444",
-          "properties": {
-            "controlName": "102-dependency-injection:life-cycles:singleton"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "187",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "76",
-                  "measuredH": "26",
-                  "x": "56",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Singleton"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "172",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4378",
-          "typeID": "__group__",
-          "zOrder": "166",
-          "measuredW": "172",
-          "measuredH": "50",
-          "w": "172",
-          "h": "50",
-          "x": "744",
-          "y": "1318",
-          "properties": {
-            "controlName": "106-caching"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "165",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "7",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "68",
-                  "measuredH": "26",
-                  "x": "56",
-                  "y": "12",
-                  "properties": {
-                    "size": "18",
-                    "text": "Caching"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "13",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4379",
-          "typeID": "__group__",
-          "zOrder": "167",
-          "measuredW": "181",
-          "measuredH": "47",
-          "w": "181",
-          "h": "47",
-          "x": "663",
-          "y": "1231",
-          "properties": {
-            "controlName": "100-caching:memory-cache"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "172",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "124",
-                  "measuredH": "26",
-                  "x": "24",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Memory Cache"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "157",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4380",
-          "typeID": "__group__",
-          "zOrder": "168",
-          "measuredW": "335",
-          "measuredH": "47",
-          "w": "335",
-          "h": "47",
-          "x": "340",
-          "y": "1319",
-          "properties": {
-            "controlName": "101-caching:entity-framework-cache"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "327",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "8",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "282",
-                  "measuredH": "26",
-                  "x": "31",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Entity Framework 2nd Level Cache"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4381",
-          "typeID": "__group__",
-          "zOrder": "169",
-          "measuredW": "237",
-          "measuredH": "47",
-          "w": "237",
-          "h": "47",
-          "x": "602",
-          "y": "1398",
-          "properties": {
-            "controlName": "102-caching:distributed-cache"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "228",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "148",
-                  "measuredH": "26",
-                  "x": "40",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Distributed Cache"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "213",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4382",
-          "typeID": "__group__",
-          "zOrder": "170",
-          "measuredW": "166",
-          "measuredH": "47",
-          "w": "166",
-          "h": "47",
-          "x": "340",
-          "y": "1400",
-          "properties": {
-            "controlName": "100-caching:distributed-cache:memcached"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "158",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "8",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "102",
-                  "measuredH": "26",
-                  "x": "37",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Memcached"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "10",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4383",
-          "typeID": "__group__",
-          "zOrder": "171",
-          "measuredW": "167",
-          "measuredH": "47",
-          "w": "167",
-          "h": "47",
-          "x": "340",
-          "y": "1458",
-          "properties": {
-            "controlName": "101-caching:distributed-cache:redis"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "158",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "47",
-                  "measuredH": "26",
-                  "x": "64",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Redis"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4384",
-          "typeID": "__group__",
-          "zOrder": "172",
-          "measuredW": "226",
-          "measuredH": "47",
-          "w": "226",
-          "h": "47",
-          "x": "310",
-          "y": "1547",
-          "properties": {
-            "controlName": "100-caching:distributed-cache:redis:stackexchange-redis"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "217",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "176",
-                  "measuredH": "26",
-                  "x": "30",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "StackExchange.Redis"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4385",
-          "typeID": "__group__",
-          "zOrder": "173",
-          "measuredW": "226",
-          "measuredH": "47",
-          "w": "226",
-          "h": "47",
-          "x": "310",
-          "y": "1599",
-          "properties": {
-            "controlName": "101-caching:distributed-cache:redis:easy-caching"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "217",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "107",
-                  "measuredH": "26",
-                  "x": "64",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "EasyCaching"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4386",
-          "typeID": "__group__",
-          "zOrder": "174",
-          "measuredW": "176",
-          "measuredH": "50",
-          "w": "176",
-          "h": "50",
-          "x": "1053",
-          "y": "1675",
-          "properties": {
-            "controlName": "107-databases"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "165",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "88",
-                  "measuredH": "26",
-                  "x": "50",
-                  "y": "12",
-                  "properties": {
-                    "size": "18",
-                    "text": "Databases"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "17",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4387",
-          "typeID": "__group__",
-          "zOrder": "175",
-          "measuredW": "141",
-          "measuredH": "47",
-          "w": "141",
-          "h": "47",
-          "x": "1275",
-          "y": "1676",
-          "properties": {
-            "controlName": "102-databases:relational"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "130",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "82",
-                  "measuredH": "26",
-                  "x": "35",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Relational"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4388",
-          "typeID": "__group__",
-          "zOrder": "176",
-          "measuredW": "141",
-          "measuredH": "47",
-          "w": "141",
-          "h": "47",
-          "x": "1460",
-          "y": "1676",
-          "properties": {
-            "controlName": "100-databases:relational:sql-server"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "130",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "94",
-                  "measuredH": "26",
-                  "x": "16",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "SQL Server"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "117",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4389",
-          "typeID": "__group__",
-          "zOrder": "177",
-          "measuredW": "141",
-          "measuredH": "47",
-          "w": "141",
-          "h": "47",
-          "x": "1460",
-          "y": "1729",
-          "properties": {
-            "controlName": "101-databases:relational:postgresql"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "130",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "98",
-                  "measuredH": "26",
-                  "x": "13",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "PostgreSQL"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "117",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4390",
-          "typeID": "__group__",
-          "zOrder": "178",
-          "measuredW": "140",
-          "measuredH": "47",
-          "w": "140",
-          "h": "47",
-          "x": "1460",
-          "y": "1781",
-          "properties": {
-            "controlName": "102-databases:relational:mariadb"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "130",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "73",
-                  "measuredH": "26",
-                  "x": "28",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "MariaDB"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "116",
-                  "y": "13",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4391",
-          "typeID": "__group__",
-          "zOrder": "179",
-          "measuredW": "140",
-          "measuredH": "47",
-          "w": "140",
-          "h": "47",
-          "x": "1460",
-          "y": "1833",
-          "properties": {
-            "controlName": "103-databases:relational:mysql"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "130",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "59",
-                  "measuredH": "26",
-                  "x": "35",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "MySQL"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "116",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4392",
-          "typeID": "__group__",
-          "zOrder": "180",
-          "measuredW": "141",
-          "measuredH": "47",
-          "w": "141",
-          "h": "47",
-          "x": "1275",
-          "y": "1618",
-          "properties": {
-            "controlName": "101-databases:cloud"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "130",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "48",
-                  "measuredH": "26",
-                  "x": "52",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Cloud"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4393",
-          "typeID": "__group__",
-          "zOrder": "181",
-          "measuredW": "142",
-          "measuredH": "47",
-          "w": "142",
-          "h": "47",
-          "x": "1460",
-          "y": "1618",
-          "properties": {
-            "controlName": "101-databases:cloud:cosmosdb"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "130",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "92",
-                  "measuredH": "26",
-                  "x": "17",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "CosmosDB"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "118",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4394",
-          "typeID": "__group__",
-          "zOrder": "182",
-          "measuredW": "141",
-          "measuredH": "47",
-          "w": "141",
-          "h": "47",
-          "x": "1460",
-          "y": "1563",
-          "properties": {
-            "controlName": "100-databases:cloud:dynamodb"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "130",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "93",
-                  "measuredH": "26",
-                  "x": "15",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "DynamoDB"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "117",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4395",
-          "typeID": "__group__",
-          "zOrder": "183",
-          "measuredW": "171",
-          "measuredH": "49",
-          "w": "171",
-          "h": "49",
-          "x": "1092",
-          "y": "1589",
-          "properties": {
-            "controlName": "100-databases:search-engines"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "160",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "2",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "129",
-                  "measuredH": "26",
-                  "x": "29",
-                  "y": "13",
-                  "properties": {
-                    "size": "18",
-                    "text": "Search Engines"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "23",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10066329",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                },
-                {
-                  "ID": "3",
-                  "typeID": "__group__",
-                  "zOrder": "3",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "0",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4396",
-          "typeID": "__group__",
-          "zOrder": "184",
-          "measuredW": "171",
-          "measuredH": "47",
-          "w": "171",
-          "h": "47",
-          "x": "1093",
-          "y": "1507",
-          "properties": {
-            "controlName": "100-databases:search-engines:elasticsearch"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "160",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "117",
-                  "measuredH": "26",
-                  "x": "31",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Elastic Search"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4397",
-          "typeID": "__group__",
-          "zOrder": "185",
-          "measuredW": "77",
-          "measuredH": "47",
-          "w": "77",
-          "h": "47",
-          "x": "1094",
-          "y": "1454",
-          "properties": {
-            "controlName": "101-databases:search-engines:solr"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "68",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "32",
-                  "measuredH": "26",
-                  "x": "30",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Solr"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4398",
-          "typeID": "__group__",
-          "zOrder": "186",
-          "measuredW": "97",
-          "measuredH": "47",
-          "w": "97",
-          "h": "47",
-          "x": "1178",
-          "y": "1454",
-          "properties": {
-            "controlName": "102-databases:search-engines:sphinx"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "87",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "55",
-                  "measuredH": "26",
-                  "x": "12",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Sphinx"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "73",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4399",
-          "typeID": "__group__",
-          "zOrder": "187",
-          "measuredW": "154",
-          "measuredH": "47",
-          "w": "154",
-          "h": "47",
-          "x": "1094",
-          "y": "1754",
-          "properties": {
-            "controlName": "103-databases:nosql"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "145",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "60",
-                  "measuredH": "26",
-                  "x": "52",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "NoSQL"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "21",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                },
-                {
-                  "ID": "3",
-                  "typeID": "__group__",
-                  "zOrder": "3",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "0",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10066329",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4400",
-          "typeID": "__group__",
-          "zOrder": "188",
-          "measuredW": "156",
-          "measuredH": "47",
-          "w": "156",
-          "h": "47",
-          "x": "1092",
-          "y": "1833",
-          "properties": {
-            "controlName": "100-databases:nosql:redis"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "145",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "47",
-                  "measuredH": "26",
-                  "x": "60",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Redis"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "10",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4401",
-          "typeID": "__group__",
-          "zOrder": "189",
-          "measuredW": "156",
-          "measuredH": "47",
-          "w": "156",
-          "h": "47",
-          "x": "1092",
-          "y": "1886",
-          "properties": {
-            "controlName": "101-databases:nosql:mongodb"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "145",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "83",
-                  "measuredH": "26",
-                  "x": "42",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "MongoDB"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4402",
-          "typeID": "__group__",
-          "zOrder": "190",
-          "measuredW": "156",
-          "measuredH": "47",
-          "w": "156",
-          "h": "47",
-          "x": "1092",
-          "y": "1939",
-          "properties": {
-            "controlName": "102-databases:nosql:litedb"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "145",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "57",
-                  "measuredH": "26",
-                  "x": "55",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "LiteDB"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4403",
-          "typeID": "__group__",
-          "zOrder": "191",
-          "measuredW": "149",
-          "measuredH": "47",
-          "w": "149",
-          "h": "47",
-          "x": "1261",
-          "y": "1833",
-          "properties": {
-            "controlName": "103-databases:nosql:cassandra"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "139",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "88",
-                  "measuredH": "26",
-                  "x": "26",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Cassandra"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "125",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4404",
-          "typeID": "__group__",
-          "zOrder": "192",
-          "measuredW": "149",
-          "measuredH": "47",
-          "w": "149",
-          "h": "47",
-          "x": "1261",
-          "y": "1886",
-          "properties": {
-            "controlName": "104-databases:nosql:ravendb"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "139",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "78",
-                  "measuredH": "26",
-                  "x": "31",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "RavenDB"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "125",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4405",
-          "typeID": "__group__",
-          "zOrder": "193",
-          "measuredW": "150",
-          "measuredH": "47",
-          "w": "150",
-          "h": "47",
-          "x": "1261",
-          "y": "1939",
-          "properties": {
-            "controlName": "105-databases:nosql:couchdb"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "139",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "79",
-                  "measuredH": "26",
-                  "x": "30",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "CouchDB"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "126",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4406",
-          "typeID": "__group__",
-          "zOrder": "194",
-          "measuredW": "219",
-          "measuredH": "50",
-          "w": "219",
-          "h": "50",
-          "x": "643",
-          "y": "1675",
-          "properties": {
-            "controlName": "108-log-frameworks"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "211",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "8",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "135",
-                  "measuredH": "26",
-                  "x": "46",
-                  "y": "12",
-                  "properties": {
-                    "size": "18",
-                    "text": "Log Frameworks"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "13",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4407",
-          "typeID": "__group__",
-          "zOrder": "195",
-          "measuredW": "171",
-          "measuredH": "47",
-          "w": "171",
-          "h": "47",
-          "x": "602",
-          "y": "1599",
-          "properties": {
-            "controlName": "100-log-frameworks:serilog"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "160",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "57",
-                  "measuredH": "26",
-                  "x": "62",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Serilog"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "10",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4408",
-          "typeID": "__group__",
-          "zOrder": "196",
-          "measuredW": "171",
-          "measuredH": "47",
-          "w": "171",
-          "h": "47",
-          "x": "602",
-          "y": "1754",
-          "properties": {
-            "controlName": "101-log-frameworks:nlog"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "160",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "44",
-                  "measuredH": "26",
-                  "x": "69",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "NLog"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4409",
-          "typeID": "__group__",
-          "zOrder": "197",
-          "measuredW": "265",
-          "measuredH": "47",
-          "w": "265",
-          "h": "47",
-          "x": "310",
-          "y": "1676",
-          "properties": {
-            "controlName": "102-log-frameworks:log-management-system"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "256",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "208",
-                  "measuredH": "26",
-                  "x": "33",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Log Management System"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "23",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10066329",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                },
-                {
-                  "ID": "3",
-                  "typeID": "__group__",
-                  "zOrder": "3",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "0",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4410",
-          "typeID": "__group__",
-          "zOrder": "198",
-          "measuredW": "228",
-          "measuredH": "47",
-          "w": "228",
-          "h": "47",
-          "x": "308",
-          "y": "1754",
-          "properties": {
-            "controlName": "100-log-frameworks:log-management-system:elk-stack"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "217",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "84",
-                  "measuredH": "26",
-                  "x": "78",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "ELK Stack"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4411",
-          "typeID": "__group__",
-          "zOrder": "199",
-          "measuredW": "228",
-          "measuredH": "47",
-          "w": "228",
-          "h": "47",
-          "x": "308",
-          "y": "1809",
-          "properties": {
-            "controlName": "101-log-frameworks:log-management-system:sentry"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "217",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "69",
-                  "measuredH": "26",
-                  "x": "85",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Sentry.io"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "13",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4412",
-          "typeID": "__group__",
-          "zOrder": "200",
-          "measuredW": "226",
-          "measuredH": "47",
-          "w": "226",
-          "h": "47",
-          "x": "310",
-          "y": "1863",
-          "properties": {
-            "controlName": "102-log-frameworks:log-management-system:datadog"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "217",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "70",
-                  "measuredH": "26",
-                  "x": "83",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Datadog"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4413",
-          "typeID": "__group__",
-          "zOrder": "201",
-          "measuredW": "226",
-          "measuredH": "47",
-          "w": "226",
-          "h": "47",
-          "x": "310",
-          "y": "1916",
-          "properties": {
-            "controlName": "103-log-frameworks:log-management-system:loggly"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "217",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "84",
-                  "measuredH": "26",
-                  "x": "76",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "loggly.com"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4414",
-          "typeID": "__group__",
-          "zOrder": "202",
-          "measuredW": "226",
-          "measuredH": "47",
-          "w": "226",
-          "h": "47",
-          "x": "310",
-          "y": "1969",
-          "properties": {
-            "controlName": "104-log-frameworks:log-management-system:elmah"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "217",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "68",
-                  "measuredH": "26",
-                  "x": "84",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "elmah.io"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4415",
-          "typeID": "__group__",
-          "zOrder": "203",
-          "measuredW": "322",
-          "measuredH": "50",
-          "w": "322",
-          "h": "50",
-          "x": "663",
-          "y": "2045",
-          "properties": {
-            "controlName": "109-api-clients"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "314",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "8",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "257",
-                  "measuredH": "26",
-                  "x": "36",
-                  "y": "12",
-                  "properties": {
-                    "size": "18",
-                    "text": "API Clients and Communication"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "13",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4416",
-          "typeID": "__group__",
-          "zOrder": "204",
-          "measuredW": "170",
-          "measuredH": "47",
-          "w": "170",
-          "h": "47",
-          "x": "613",
-          "y": "1957",
-          "properties": {
-            "controlName": "101-api-clients:grpc"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "160",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "48",
-                  "measuredH": "26",
-                  "x": "56",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "gRPC"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "146",
-                  "y": "10",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4417",
-          "typeID": "__group__",
-          "zOrder": "205",
-          "measuredW": "171",
-          "measuredH": "47",
-          "w": "171",
-          "h": "47",
-          "x": "868",
-          "y": "1955",
-          "properties": {
-            "controlName": "100-api-clients:rest"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "160",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "47",
-                  "measuredH": "26",
-                  "x": "69",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "REST"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4418",
-          "typeID": "__group__",
-          "zOrder": "206",
-          "measuredW": "171",
-          "measuredH": "47",
-          "w": "171",
-          "h": "47",
-          "x": "602",
-          "y": "2138",
-          "properties": {
-            "controlName": "102-api-clients:graphql"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "160",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "75",
-                  "measuredH": "26",
-                  "x": "53",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "GraphQL"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "10",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4419",
-          "typeID": "__group__",
-          "zOrder": "207",
-          "measuredW": "170",
-          "measuredH": "47",
-          "w": "170",
-          "h": "47",
-          "x": "871",
-          "y": "1865",
-          "properties": {
-            "controlName": "101-api-clients:rest:odata"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "160",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "53",
-                  "measuredH": "26",
-                  "x": "63",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "OData"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4420",
-          "typeID": "__group__",
-          "zOrder": "208",
-          "measuredW": "170",
-          "measuredH": "47",
-          "w": "170",
-          "h": "47",
-          "x": "871",
-          "y": "1810",
-          "properties": {
-            "controlName": "102-api-clients:rest:sieve"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "160",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "45",
-                  "measuredH": "26",
-                  "x": "67",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Sieve"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4421",
-          "typeID": "__group__",
-          "zOrder": "209",
-          "measuredW": "230",
-          "measuredH": "47",
-          "w": "230",
-          "h": "47",
-          "x": "311",
-          "y": "2138",
-          "properties": {
-            "controlName": "101-api-clients:graphql:hot-chocolate"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "220",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "112",
-                  "measuredH": "26",
-                  "x": "64",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "HotChocolate"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "10",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4422",
-          "typeID": "__group__",
-          "zOrder": "210",
-          "measuredW": "230",
-          "measuredH": "47",
-          "w": "230",
-          "h": "47",
-          "x": "311",
-          "y": "2084",
-          "properties": {
-            "controlName": "100-api-clients:graphql:graphql-dotnet"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "220",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "134",
-                  "measuredH": "26",
-                  "x": "53",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "GraphQL-dotnet"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4423",
-          "typeID": "__group__",
-          "zOrder": "211",
-          "measuredW": "323",
-          "measuredH": "50",
-          "w": "323",
-          "h": "50",
-          "x": "1090",
-          "y": "2043",
-          "properties": {
-            "controlName": "110-real-time-communication"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "314",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "215",
-                  "measuredH": "26",
-                  "x": "58",
-                  "y": "12",
-                  "properties": {
-                    "size": "18",
-                    "text": "Real-Time Communication"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "24",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10066329",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                },
-                {
-                  "ID": "3",
-                  "typeID": "__group__",
-                  "zOrder": "3",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "1",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4424",
-          "typeID": "__group__",
-          "zOrder": "212",
-          "measuredW": "148",
-          "measuredH": "47",
-          "w": "148",
-          "h": "47",
-          "x": "1455",
-          "y": "1993",
-          "properties": {
-            "controlName": "100-real-time-communication:web-sockets"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "139",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "106",
-                  "measuredH": "26",
-                  "x": "12",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Web Sockets"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "124",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4425",
-          "typeID": "__group__",
-          "zOrder": "213",
-          "measuredW": "148",
-          "measuredH": "47",
-          "w": "148",
-          "h": "47",
-          "x": "1455",
-          "y": "2046",
-          "properties": {
-            "controlName": "101-real-time-communication:singlar-core"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "139",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "108",
-                  "measuredH": "26",
-                  "x": "11",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "SignalR Core"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "124",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4426",
-          "typeID": "__group__",
-          "zOrder": "214",
-          "measuredW": "246",
-          "measuredH": "50",
-          "w": "246",
-          "h": "50",
-          "x": "1090",
-          "y": "2142",
-          "properties": {
-            "controlName": "111-object-mapping"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "237",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "130",
-                  "measuredH": "26",
-                  "x": "63",
-                  "y": "12",
-                  "properties": {
-                    "size": "18",
-                    "text": "Object Mapping"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4427",
-          "typeID": "__group__",
-          "zOrder": "215",
-          "measuredW": "176",
-          "measuredH": "47",
-          "w": "176",
-          "h": "47",
-          "x": "1425",
-          "y": "2141",
-          "properties": {
-            "controlName": "100-object-mapping:atuo-mapper"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "165",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "w": "104",
-                  "measuredW": "101",
-                  "measuredH": "26",
-                  "x": "31",
-                  "y": "11",
-                  "properties": {
-                    "text": "AutoMapper",
-                    "size": "18"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "152",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4428",
-          "typeID": "__group__",
-          "zOrder": "216",
-          "measuredW": "173",
-          "measuredH": "47",
-          "w": "173",
-          "h": "47",
-          "x": "1425",
-          "y": "2301",
-          "properties": {
-            "controlName": "103-object-mapping:mapster"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "166",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "68",
-                  "measuredH": "26",
-                  "x": "49",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Mapster"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "149",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4429",
-          "typeID": "__group__",
-          "zOrder": "217",
-          "measuredW": "175",
-          "measuredH": "47",
-          "w": "175",
-          "h": "47",
-          "x": "1425",
-          "y": "2194",
-          "properties": {
-            "controlName": "101-object-mapping:express-mapper"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "166",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "134",
-                  "measuredH": "26",
-                  "x": "13",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Express Mapper"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "151",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4430",
-          "typeID": "__group__",
-          "zOrder": "218",
-          "measuredW": "173",
-          "measuredH": "47",
-          "w": "173",
-          "h": "47",
-          "x": "1425",
-          "y": "2247",
-          "properties": {
-            "controlName": "102-object-mapping:agile-mapper"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "165",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "w": "112",
-                  "measuredW": "109",
-                  "measuredH": "26",
-                  "x": "27",
-                  "y": "11",
-                  "properties": {
-                    "text": "Agile Mapper",
-                    "size": "18"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "149",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4431",
-          "typeID": "__group__",
-          "zOrder": "219",
-          "measuredW": "247",
-          "measuredH": "50",
-          "w": "247",
-          "h": "50",
-          "x": "743",
-          "y": "2236",
-          "properties": {
-            "controlName": "112-task-scheduling"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "237",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "132",
-                  "measuredH": "26",
-                  "x": "44",
-                  "y": "12",
-                  "properties": {
-                    "size": "18",
-                    "text": "Task Scheduling"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "223",
-                  "y": "24",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10066329",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                },
-                {
-                  "ID": "3",
-                  "typeID": "__group__",
-                  "zOrder": "3",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "223",
-                  "y": "1",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4432",
-          "typeID": "__group__",
-          "zOrder": "220",
-          "measuredW": "170",
-          "measuredH": "47",
-          "w": "170",
-          "h": "47",
-          "x": "807",
-          "y": "2148",
-          "properties": {
-            "controlName": "100-task-scheduling:hangfire"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "160",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "70",
-                  "measuredH": "26",
-                  "x": "55",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Hangfire"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4433",
-          "typeID": "__group__",
-          "zOrder": "221",
-          "measuredW": "168",
-          "measuredH": "47",
-          "w": "168",
-          "h": "47",
-          "x": "447",
-          "y": "2294",
-          "properties": {
-            "controlName": "102-task-scheduling:quartz"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "160",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "8",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "56",
-                  "measuredH": "26",
-                  "x": "60",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Quartz"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4434",
-          "typeID": "__group__",
-          "zOrder": "222",
-          "measuredW": "168",
-          "measuredH": "47",
-          "w": "168",
-          "h": "47",
-          "x": "447",
-          "y": "2348",
-          "properties": {
-            "controlName": "103-task-scheduling:coravel"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "160",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "8",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "63",
-                  "measuredH": "26",
-                  "x": "56",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Coravel"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4435",
-          "typeID": "__group__",
-          "zOrder": "223",
-          "measuredW": "306",
-          "measuredH": "47",
-          "w": "306",
-          "h": "47",
-          "x": "310",
-          "y": "2237",
-          "properties": {
-            "controlName": "101-task-scheduling:native-background-service"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "295",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "211",
-                  "measuredH": "26",
-                  "x": "53",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "NativeBackgroundService"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4436",
-          "typeID": "__group__",
-          "zOrder": "224",
-          "measuredW": "212",
-          "measuredH": "50",
-          "w": "212",
-          "h": "50",
-          "x": "1193",
-          "y": "2421",
-          "properties": {
-            "controlName": "113-testing"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "202",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "59",
-                  "measuredH": "26",
-                  "x": "81",
-                  "y": "12",
-                  "properties": {
-                    "size": "18",
-                    "text": "Testing"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "14",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4437",
-          "typeID": "__group__",
-          "zOrder": "225",
-          "measuredW": "170",
-          "measuredH": "48",
-          "w": "170",
-          "h": "48",
-          "x": "1431",
-          "y": "2420",
-          "properties": {
-            "controlName": "100-testing:e2e-testing"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "160",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "1",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "98",
-                  "measuredH": "26",
-                  "x": "31",
-                  "y": "12",
-                  "properties": {
-                    "size": "18",
-                    "text": "E2E Testing"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "146",
-                  "y": "23",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                },
-                {
-                  "ID": "3",
-                  "typeID": "__group__",
-                  "zOrder": "3",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "146",
-                  "y": "0",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10066329",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4438",
-          "typeID": "__group__",
-          "zOrder": "226",
-          "measuredW": "169",
-          "measuredH": "47",
-          "w": "169",
-          "h": "47",
-          "x": "1431",
-          "y": "2498",
-          "properties": {
-            "controlName": "100-testing:e2e-testing:selenium"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "160",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "76",
-                  "measuredH": "26",
-                  "x": "42",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Selenium"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "145",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4439",
-          "typeID": "__group__",
-          "zOrder": "227",
-          "measuredW": "169",
-          "measuredH": "47",
-          "w": "169",
-          "h": "47",
-          "x": "1431",
-          "y": "2604",
-          "properties": {
-            "controlName": "102-testing:e2e-testing:puppeteer"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "160",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "87",
-                  "measuredH": "26",
-                  "x": "36",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Puppeteer"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "145",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4440",
-          "typeID": "__group__",
-          "zOrder": "228",
-          "measuredW": "169",
-          "measuredH": "47",
-          "w": "169",
-          "h": "47",
-          "x": "1431",
-          "y": "2551",
-          "properties": {
-            "controlName": "101-testing:e2e-testing:playwright"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "160",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "83",
-                  "measuredH": "26",
-                  "x": "38",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Playwright"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "145",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4441",
-          "typeID": "__group__",
-          "zOrder": "229",
-          "measuredW": "169",
-          "measuredH": "47",
-          "w": "169",
-          "h": "47",
-          "x": "961",
-          "y": "2425",
-          "properties": {
-            "controlName": "101-testing:unit-testing"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "160",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "w": "97",
-                  "measuredW": "97",
-                  "measuredH": "26",
-                  "x": "40",
-                  "y": "11",
-                  "properties": {
-                    "text": "Unit Testing",
-                    "size": "18"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "10",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4442",
-          "typeID": "__group__",
-          "zOrder": "230",
-          "measuredW": "205",
-          "measuredH": "47",
-          "w": "205",
-          "h": "47",
-          "x": "608",
-          "y": "2425",
-          "properties": {
-            "controlName": "102-testing:integration-testing"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "197",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "8",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "152",
-                  "measuredH": "26",
-                  "x": "31",
-                  "y": "11",
-                  "properties": {
-                    "text": "Integration Testing",
-                    "size": "18"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "10",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4443",
-          "typeID": "__group__",
-          "zOrder": "231",
-          "measuredW": "241",
-          "measuredH": "47",
-          "w": "241",
-          "h": "47",
-          "x": "575",
-          "y": "2513",
-          "properties": {
-            "controlName": "100-testing:integration-testing:web-application-factory"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "229",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "12",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "187",
-                  "measuredH": "26",
-                  "x": "33",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "WebApplicationFactory"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4444",
-          "typeID": "__group__",
-          "zOrder": "232",
-          "measuredW": "238",
-          "measuredH": "47",
-          "w": "238",
-          "h": "47",
-          "x": "578",
-          "y": "2567",
-          "properties": {
-            "controlName": "101-testing:integration-testing:test-server"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "229",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "93",
-                  "measuredH": "26",
-                  "x": "77",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Test Server"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4445",
-          "typeID": "Arrow",
-          "zOrder": "233",
-          "w": "1",
-          "h": "98",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "421",
-          "y": "2452",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.3322483172673856,
-              "y": 0.21982730867694045
-            },
-            "p1": {
-              "x": 0.560375221860752,
-              "y": 0.000041473854844324777
-            },
-            "p2": {
-              "x": 0.3322483172673856,
-              "y": 98.48028302679404
-            }
-          }
-        },
-        {
-          "ID": "4446",
-          "typeID": "__group__",
-          "zOrder": "234",
-          "measuredW": "206",
-          "measuredH": "47",
-          "w": "206",
-          "h": "47",
-          "x": "314",
-          "y": "2425",
-          "properties": {
-            "controlName": "103-testing:behavior-testing"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "197",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "136",
-                  "measuredH": "26",
-                  "x": "40",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Behavior Testing"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4447",
-          "typeID": "__group__",
-          "zOrder": "235",
-          "measuredW": "146",
-          "measuredH": "47",
-          "w": "146",
-          "h": "47",
-          "x": "344",
-          "y": "2513",
-          "properties": {
-            "controlName": "100-testing:behavior-testing:spec-flow"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "137",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "79",
-                  "measuredH": "26",
-                  "x": "38",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "SpecFlow"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4448",
-          "typeID": "__group__",
-          "zOrder": "236",
-          "measuredW": "146",
-          "measuredH": "47",
-          "w": "146",
-          "h": "47",
-          "x": "344",
-          "y": "2567",
-          "properties": {
-            "controlName": "101-testing:behavior-testing:bddfy"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "137",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "60",
-                  "measuredH": "26",
-                  "x": "48",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "BDDFY"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4449",
-          "typeID": "__group__",
-          "zOrder": "237",
-          "measuredW": "146",
-          "measuredH": "47",
-          "w": "146",
-          "h": "47",
-          "x": "344",
-          "y": "2621",
-          "properties": {
-            "controlName": "102-testing:behavior-testing:light-bdd"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "137",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "80",
-                  "measuredH": "26",
-                  "x": "38",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "LightBDD"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4450",
-          "typeID": "__group__",
-          "zOrder": "238",
-          "measuredW": "210",
-          "measuredH": "50",
-          "w": "210",
-          "h": "50",
-          "x": "1143",
-          "y": "2915",
-          "properties": {
-            "controlName": "114-microservices"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "202",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "123",
-                  "measuredH": "26",
-                  "x": "39",
-                  "y": "12",
-                  "properties": {
-                    "size": "18",
-                    "text": "Micro-Services"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "186",
-                  "y": "1",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                },
-                {
-                  "ID": "3",
-                  "typeID": "__group__",
-                  "zOrder": "3",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "186",
-                  "y": "25",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10066329",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4451",
-          "typeID": "__group__",
-          "zOrder": "239",
-          "measuredW": "187",
-          "measuredH": "47",
-          "w": "187",
-          "h": "47",
-          "x": "1397",
-          "y": "2916",
-          "properties": {
-            "controlName": "100-microservices:message-brokers"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "187",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "144",
-                  "measuredH": "26",
-                  "x": "22",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Message Brokers"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4452",
-          "typeID": "__group__",
-          "zOrder": "240",
-          "measuredW": "197",
-          "measuredH": "47",
-          "w": "197",
-          "h": "47",
-          "x": "1397",
-          "y": "2838",
-          "properties": {
-            "controlName": "102-microservices:message-brokers:rabbit-mq"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "187",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "83",
-                  "measuredH": "26",
-                  "x": "52",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "RabbitMQ"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "173",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4453",
-          "typeID": "__group__",
-          "zOrder": "241",
-          "measuredW": "197",
-          "measuredH": "47",
-          "w": "197",
-          "h": "47",
-          "x": "1397",
-          "y": "2785",
-          "properties": {
-            "controlName": "101-microservices:message-brokers:apache-kafka"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "187",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "113",
-                  "measuredH": "26",
-                  "x": "37",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Apache Kafka"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "173",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4454",
-          "typeID": "__group__",
-          "zOrder": "242",
-          "measuredW": "197",
-          "measuredH": "47",
-          "w": "197",
-          "h": "47",
-          "x": "1397",
-          "y": "2732",
-          "properties": {
-            "controlName": "100-microservices:message-brokers:active-mq"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "187",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "78",
-                  "measuredH": "26",
-                  "x": "55",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "ActiveMQ"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "173",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4455",
-          "typeID": "__group__",
-          "zOrder": "243",
-          "measuredW": "197",
-          "measuredH": "47",
-          "w": "197",
-          "h": "47",
-          "x": "1397",
-          "y": "2986",
-          "properties": {
-            "controlName": "103-microservices:message-brokers:net-mq"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "187",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "60",
-                  "measuredH": "26",
-                  "x": "64",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "NetMQ"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "173",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4456",
-          "typeID": "__group__",
-          "zOrder": "244",
-          "measuredW": "198",
-          "measuredH": "47",
-          "w": "198",
-          "h": "47",
-          "x": "1397",
-          "y": "3038",
-          "properties": {
-            "controlName": "104-microservices:message-brokers:azure-service-bus"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "187",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "149",
-                  "measuredH": "26",
-                  "x": "17",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Azure Service Bus"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "174",
-                  "y": "10",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4457",
-          "typeID": "__group__",
-          "zOrder": "245",
-          "measuredW": "173",
-          "measuredH": "47",
-          "w": "173",
-          "h": "47",
-          "x": "908",
-          "y": "2916",
-          "properties": {
-            "controlName": "101-microservices:message-bus"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "173",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "112",
-                  "measuredH": "26",
-                  "x": "31",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Message Bus"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4458",
-          "typeID": "__group__",
-          "zOrder": "246",
-          "measuredW": "183",
-          "measuredH": "47",
-          "w": "183",
-          "h": "47",
-          "x": "898",
-          "y": "2999",
-          "properties": {
-            "controlName": "100-microservices:message-bus:mass-transit"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "173",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "103",
-                  "measuredH": "26",
-                  "x": "45",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Mass Transit"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4459",
-          "typeID": "__group__",
-          "zOrder": "247",
-          "measuredW": "183",
-          "measuredH": "47",
-          "w": "183",
-          "h": "47",
-          "x": "898",
-          "y": "3053",
-          "properties": {
-            "controlName": "101-microservices:message-bus:nservice-bus"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "173",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "106",
-                  "measuredH": "26",
-                  "x": "44",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "NServiceBus"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4460",
-          "typeID": "__group__",
-          "zOrder": "248",
-          "measuredW": "183",
-          "measuredH": "47",
-          "w": "183",
-          "h": "47",
-          "x": "898",
-          "y": "3106",
-          "properties": {
-            "controlName": "102-microservices:message-bus:easy-net-q"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "173",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "83",
-                  "measuredH": "26",
-                  "x": "55",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "EasyNetQ"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4461",
-          "typeID": "TextArea",
-          "zOrder": "249",
-          "w": "173",
-          "h": "119",
-          "measuredW": "200",
-          "measuredH": "140",
-          "x": "627",
-          "y": "2866"
-        },
-        {
-          "ID": "4462",
-          "typeID": "Label",
-          "zOrder": "250",
-          "measuredW": "103",
-          "measuredH": "26",
-          "x": "662",
-          "y": "2877",
-          "properties": {
-            "size": "18",
-            "text": "API Gateway"
-          }
-        },
-        {
-          "ID": "4463",
-          "typeID": "__group__",
-          "zOrder": "251",
-          "measuredW": "150",
-          "measuredH": "47",
-          "w": "150",
-          "h": "47",
-          "x": "635",
-          "y": "2919",
-          "properties": {
-            "controlName": "104-microservices:ocelot"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "142",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "8",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "54",
-                  "measuredH": "26",
-                  "x": "52",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Ocelot"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4464",
-          "typeID": "Arrow",
-          "zOrder": "252",
-          "w": "1",
-          "h": "88",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "713",
-          "y": "2996",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5607664622521449,
-              "y": 0.0019291337642273502
-            },
-            "p2": {
-              "x": 0,
-              "y": 88
-            }
-          }
-        },
-        {
-          "ID": "4465",
-          "typeID": "TextArea",
-          "zOrder": "253",
-          "w": "173",
-          "h": "112",
-          "measuredW": "200",
-          "measuredH": "140",
-          "x": "627",
-          "y": "2980"
-        },
-        {
-          "ID": "4466",
-          "typeID": "Label",
-          "zOrder": "254",
-          "measuredW": "134",
-          "measuredH": "26",
-          "x": "647",
-          "y": "2991",
-          "properties": {
-            "size": "18",
-            "text": "Containerization"
-          }
-        },
-        {
-          "ID": "4467",
-          "typeID": "__group__",
-          "zOrder": "255",
-          "measuredW": "150",
-          "measuredH": "47",
-          "w": "150",
-          "h": "47",
-          "x": "635",
-          "y": "3025",
-          "properties": {
-            "controlName": "105-microservices:docker"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "142",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "8",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "59",
-                  "measuredH": "26",
-                  "x": "49",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Docker"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "10",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4468",
-          "typeID": "Arrow",
-          "zOrder": "256",
-          "w": "1",
-          "h": "88",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "713",
-          "y": "2774",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5607664622521449,
-              "y": 0.0019291337642273502
-            },
-            "p2": {
-              "x": 0,
-              "y": 88
-            }
-          }
-        },
-        {
-          "ID": "4469",
-          "typeID": "TextArea",
-          "zOrder": "257",
-          "w": "173",
-          "h": "178",
-          "measuredW": "200",
-          "measuredH": "140",
-          "x": "627",
-          "y": "2691"
-        },
-        {
-          "ID": "4470",
-          "typeID": "Label",
-          "zOrder": "258",
-          "measuredW": "111",
-          "measuredH": "26",
-          "x": "658",
-          "y": "2707",
-          "properties": {
-            "size": "18",
-            "text": "Orchestration"
-          }
-        },
-        {
-          "ID": "4471",
-          "typeID": "__group__",
-          "zOrder": "259",
-          "measuredW": "151",
-          "measuredH": "48",
-          "w": "151",
-          "h": "48",
-          "x": "634",
-          "y": "2743",
-          "properties": {
-            "controlName": "102-microservices:kubernetes"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "142",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "95",
-                  "measuredH": "26",
-                  "x": "32",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Kubernetes"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "1",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                },
-                {
-                  "ID": "3",
-                  "typeID": "__group__",
-                  "zOrder": "3",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "24",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4472",
-          "typeID": "__group__",
-          "zOrder": "260",
-          "measuredW": "142",
-          "measuredH": "47",
-          "w": "142",
-          "h": "47",
-          "x": "643",
-          "y": "2796",
-          "properties": {
-            "controlName": "103-microservices:docker-swarm"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "142",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "118",
-                  "measuredH": "26",
-                  "x": "12",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Docker Swarm"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4473",
-          "typeID": "Arrow",
-          "zOrder": "261",
-          "w": "1",
-          "h": "88",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "713",
-          "y": "3101",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5607664622521449,
-              "y": 0.0019291337642273502
-            },
-            "p2": {
-              "x": 0,
-              "y": 88
-            }
-          }
-        },
-        {
-          "ID": "4474",
-          "typeID": "TextArea",
-          "zOrder": "262",
-          "w": "173",
-          "h": "112",
-          "measuredW": "200",
-          "measuredH": "140",
-          "x": "627",
-          "y": "3085"
-        },
-        {
-          "ID": "4475",
-          "typeID": "Label",
-          "zOrder": "263",
-          "measuredW": "118",
-          "measuredH": "26",
-          "x": "655",
-          "y": "3096",
-          "properties": {
-            "size": "18",
-            "text": "Reverse Proxy"
-          }
-        },
-        {
-          "ID": "4476",
-          "typeID": "__group__",
-          "zOrder": "264",
-          "measuredW": "150",
-          "measuredH": "47",
-          "w": "150",
-          "h": "47",
-          "x": "635",
-          "y": "3131",
-          "properties": {
-            "controlName": "106-microservices:yarp"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "142",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "8",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "45",
-                  "measuredH": "26",
-                  "x": "56",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "YARP"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "13",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4477",
-          "typeID": "Arrow",
-          "zOrder": "265",
-          "w": "1",
-          "h": "88",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "440",
-          "y": "2820",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5607664622521449,
-              "y": 0.0019291337642273502
-            },
-            "p2": {
-              "x": 0,
-              "y": 88
-            }
-          }
-        },
-        {
-          "ID": "4478",
-          "typeID": "TextArea",
-          "zOrder": "266",
-          "w": "173",
-          "h": "278",
-          "measuredW": "200",
-          "measuredH": "140",
-          "x": "354",
-          "y": "2804"
-        },
-        {
-          "ID": "4479",
-          "typeID": "Label",
-          "zOrder": "267",
-          "measuredW": "47",
-          "measuredH": "26",
-          "x": "417",
-          "y": "2818",
-          "properties": {
-            "size": "18",
-            "text": "Other"
-          }
-        },
-        {
-          "ID": "4480",
-          "typeID": "__group__",
-          "zOrder": "268",
-          "measuredW": "149",
-          "measuredH": "47",
-          "w": "149",
-          "h": "47",
-          "x": "363",
-          "y": "2857",
-          "properties": {
-            "controlName": "107-microservices:orleans"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "142",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "7",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "65",
-                  "measuredH": "26",
-                  "x": "45",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Orleans"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4481",
-          "typeID": "__group__",
-          "zOrder": "269",
-          "measuredW": "149",
-          "measuredH": "47",
-          "w": "149",
-          "h": "47",
-          "x": "363",
-          "y": "2910",
-          "properties": {
-            "controlName": "108-microservices:steel-toe"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "142",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "7",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "72",
-                  "measuredH": "26",
-                  "x": "42",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "SteelToe"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4482",
-          "typeID": "__group__",
-          "zOrder": "270",
-          "measuredW": "149",
-          "measuredH": "47",
-          "w": "149",
-          "h": "47",
-          "x": "363",
-          "y": "2964",
-          "properties": {
-            "controlName": "109-microservices:dapr"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "142",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "7",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "40",
-                  "measuredH": "26",
-                  "x": "58",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Dapr"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4483",
-          "typeID": "__group__",
-          "zOrder": "271",
-          "measuredW": "149",
-          "measuredH": "47",
-          "w": "149",
-          "h": "47",
-          "x": "363",
-          "y": "3017",
-          "properties": {
-            "controlName": "110-microservices:tye"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "142",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "7",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "28",
-                  "measuredH": "26",
-                  "x": "64",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Tye"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4484",
-          "typeID": "__group__",
-          "zOrder": "272",
-          "measuredW": "211",
-          "measuredH": "50",
-          "w": "211",
-          "h": "50",
-          "x": "1134",
-          "y": "3228",
-          "properties": {
-            "controlName": "115-ci-cd"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "202",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "63",
-                  "measuredH": "26",
-                  "x": "78",
-                  "y": "12",
-                  "properties": {
-                    "size": "18",
-                    "text": "CI / CD"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "1",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                },
-                {
-                  "ID": "3",
-                  "typeID": "__group__",
-                  "zOrder": "3",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "25",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10066329",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4485",
-          "typeID": "__group__",
-          "zOrder": "273",
-          "measuredW": "183",
-          "measuredH": "47",
-          "w": "183",
-          "h": "47",
-          "x": "1411",
-          "y": "3129",
-          "properties": {
-            "controlName": "100-ci-cd:github-actions"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "173",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "121",
-                  "measuredH": "26",
-                  "x": "23",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "GitHub Actions"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "159",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4486",
-          "typeID": "__group__",
-          "zOrder": "274",
-          "measuredW": "183",
-          "measuredH": "47",
-          "w": "183",
-          "h": "47",
-          "x": "1411",
-          "y": "3181",
-          "properties": {
-            "controlName": "101-ci-cd:azure-pipelines"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "173",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "126",
-                  "measuredH": "26",
-                  "x": "21",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Azure Pipelines"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "159",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4487",
-          "typeID": "__group__",
-          "zOrder": "275",
-          "measuredW": "182",
-          "measuredH": "47",
-          "w": "182",
-          "h": "47",
-          "x": "1411",
-          "y": "3232",
-          "properties": {
-            "controlName": "102-ci-cd:travis-ci"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "173",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "72",
-                  "measuredH": "26",
-                  "x": "51",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Travis CI"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "158",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4488",
-          "typeID": "__group__",
-          "zOrder": "276",
-          "measuredW": "182",
-          "measuredH": "47",
-          "w": "182",
-          "h": "47",
-          "x": "1411",
-          "y": "3283",
-          "properties": {
-            "controlName": "103-ci-cd:jenkins"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "173",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "63",
-                  "measuredH": "26",
-                  "x": "55",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Jenkins"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "158",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4489",
-          "typeID": "__group__",
-          "zOrder": "277",
-          "measuredW": "181",
-          "measuredH": "47",
-          "w": "181",
-          "h": "47",
-          "x": "1411",
-          "y": "3335",
-          "properties": {
-            "controlName": "104-ci-cd:circle-ci"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "173",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "71",
-                  "measuredH": "26",
-                  "x": "51",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Circle CI"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "157",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4490",
-          "typeID": "__group__",
-          "zOrder": "278",
-          "measuredW": "181",
-          "measuredH": "47",
-          "w": "181",
-          "h": "47",
-          "x": "1411",
-          "y": "3386",
-          "properties": {
-            "controlName": "105-ci-cd:team-city"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "173",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "76",
-                  "measuredH": "26",
-                  "x": "49",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "TeamCity"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "157",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4491",
-          "typeID": "__group__",
-          "zOrder": "279",
-          "measuredW": "356",
-          "measuredH": "55",
-          "w": "356",
-          "h": "55",
-          "x": "658",
-          "y": "3228",
-          "properties": {
-            "controlName": "ext_link:roadmap.sh/software-design-architecture"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "356",
-                  "h": "55",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "4273622",
-                    "borderColor": "4273622"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "303",
-                  "measuredH": "28",
-                  "x": "29",
-                  "y": "14",
-                  "properties": {
-                    "size": "20",
-                    "color": "16777215",
-                    "text": "Software Design and Architecture"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4492",
-          "typeID": "__group__",
-          "zOrder": "280",
-          "measuredW": "229",
-          "measuredH": "50",
-          "w": "229",
-          "h": "50",
-          "x": "345",
-          "y": "3230",
-          "properties": {
-            "controlName": "116-client-side-libraries"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "220",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "165",
-                  "measuredH": "26",
-                  "x": "36",
-                  "y": "12",
-                  "properties": {
-                    "size": "18",
-                    "text": "Client Side Libraries"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4493",
-          "typeID": "__group__",
-          "zOrder": "281",
-          "measuredW": "230",
-          "measuredH": "50",
-          "w": "230",
-          "h": "50",
-          "x": "344",
-          "y": "3340",
-          "properties": {
-            "controlName": "117-template-engines"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "220",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "147",
-                  "measuredH": "26",
-                  "x": "46",
-                  "y": "12",
-                  "properties": {
-                    "size": "18",
-                    "text": "Template Engines"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "0",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                },
-                {
-                  "ID": "3",
-                  "typeID": "__group__",
-                  "zOrder": "3",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "24",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10066329",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4494",
-          "typeID": "__group__",
-          "zOrder": "282",
-          "measuredW": "183",
-          "measuredH": "47",
-          "w": "183",
-          "h": "47",
-          "x": "344",
-          "y": "3586",
-          "properties": {
-            "controlName": "103-template-engines:fluid"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "173",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "40",
-                  "measuredH": "26",
-                  "x": "77",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Fluid"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4495",
-          "typeID": "__group__",
-          "zOrder": "283",
-          "measuredW": "253",
-          "measuredH": "50",
-          "w": "253",
-          "h": "50",
-          "x": "658",
-          "y": "3340",
-          "properties": {
-            "controlName": "118-good-to-know-libraries"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "253",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "190",
-                  "measuredH": "26",
-                  "x": "32",
-                  "y": "12",
-                  "properties": {
-                    "size": "18",
-                    "text": "Good to Know Libraries"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4496",
-          "typeID": "__group__",
-          "zOrder": "284",
-          "measuredW": "208",
-          "measuredH": "47",
-          "w": "208",
-          "h": "47",
-          "x": "676",
-          "y": "3430",
-          "properties": {
-            "controlName": "100-good-to-know-libraries:mediatr"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "198",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "70",
-                  "measuredH": "26",
-                  "x": "74",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "MediatR"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4497",
-          "typeID": "__group__",
-          "zOrder": "285",
-          "measuredW": "208",
-          "measuredH": "47",
-          "w": "208",
-          "h": "47",
-          "x": "676",
-          "y": "3482",
-          "properties": {
-            "controlName": "101-good-to-know-libraries:fluent-validation"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "198",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "130",
-                  "measuredH": "26",
-                  "x": "44",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "FluentValidation"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4498",
-          "typeID": "__group__",
-          "zOrder": "286",
-          "measuredW": "208",
-          "measuredH": "47",
-          "w": "208",
-          "h": "47",
-          "x": "676",
-          "y": "3534",
-          "properties": {
-            "controlName": "102-good-to-know-libraries:polly"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "198",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "37",
-                  "measuredH": "26",
-                  "x": "90",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Polly"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4499",
-          "typeID": "__group__",
-          "zOrder": "287",
-          "measuredW": "208",
-          "measuredH": "47",
-          "w": "208",
-          "h": "47",
-          "x": "676",
-          "y": "3585",
-          "properties": {
-            "controlName": "103-good-to-know-libraries:nuke"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "198",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "43",
-                  "measuredH": "26",
-                  "x": "87",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Nuke"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4500",
-          "typeID": "__group__",
-          "zOrder": "288",
-          "measuredW": "208",
-          "measuredH": "47",
-          "w": "208",
-          "h": "47",
-          "x": "676",
-          "y": "3638",
-          "properties": {
-            "controlName": "104-good-to-know-libraries:benchmark-net"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "198",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "134",
-                  "measuredH": "26",
-                  "x": "42",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Benchmark.NET"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4501",
-          "typeID": "__group__",
-          "zOrder": "289",
-          "measuredW": "208",
-          "measuredH": "47",
-          "w": "208",
-          "h": "47",
-          "x": "676",
-          "y": "3690",
-          "properties": {
-            "controlName": "105-good-to-know-libraries:noda-time"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "198",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "85",
-                  "measuredH": "26",
-                  "x": "66",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "NodaTime"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4502",
-          "typeID": "__group__",
-          "zOrder": "290",
-          "measuredW": "208",
-          "measuredH": "47",
-          "w": "208",
-          "h": "47",
-          "x": "676",
-          "y": "3742",
-          "properties": {
-            "controlName": "106-good-to-know-libraries:gen-fu"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "198",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "55",
-                  "measuredH": "26",
-                  "x": "81",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "GenFu"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4503",
-          "typeID": "__group__",
-          "zOrder": "291",
-          "measuredW": "208",
-          "measuredH": "47",
-          "w": "208",
-          "h": "47",
-          "x": "676",
-          "y": "3795",
-          "properties": {
-            "controlName": "107-good-to-know-libraries:swash-buckle"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "198",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "108",
-                  "measuredH": "26",
-                  "x": "55",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "SwashBuckle"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4504",
-          "typeID": "TextArea",
-          "zOrder": "292",
-          "w": "281",
-          "h": "124",
-          "measuredW": "200",
-          "measuredH": "140",
-          "x": "1103",
-          "y": "3600"
-        },
-        {
-          "ID": "4505",
-          "typeID": "Label",
-          "zOrder": "293",
-          "measuredW": "186",
-          "measuredH": "25",
-          "x": "1151",
-          "y": "3620",
-          "properties": {
-            "size": "17",
-            "text": "Identify what you missed"
-          }
-        },
-        {
-          "ID": "4506",
-          "typeID": "__group__",
-          "zOrder": "294",
-          "measuredW": "229",
-          "measuredH": "44",
-          "w": "229",
-          "h": "44",
-          "x": "1129",
-          "y": "3655",
-          "properties": {
-            "controlName": "ext_link:roadmap.sh/backend"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "229",
-                  "h": "44",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "147",
-                  "measuredH": "25",
-                  "x": "41",
-                  "y": "9",
-                  "properties": {
-                    "size": "17",
-                    "text": "Backend Roadmap"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4507",
-          "typeID": "__group__",
-          "zOrder": "295",
-          "measuredW": "169",
-          "measuredH": "47",
-          "w": "169",
-          "h": "47",
-          "x": "1431",
-          "y": "2656",
-          "properties": {
-            "controlName": "103-testing:e2e-testing:cypress"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "160",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "67",
-                  "measuredH": "26",
-                  "x": "46",
-                  "y": "11",
-                  "properties": {
-                    "size": "18",
-                    "text": "Cypress"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "145",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4508",
-          "typeID": "__group__",
-          "zOrder": "296",
-          "measuredW": "24",
-          "measuredH": "24",
-          "w": "24",
-          "h": "24",
-          "x": "1118",
-          "y": "3666",
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Icon",
-                  "zOrder": "0",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16777215",
-                    "icon": {
-                      "ID": "circle",
-                      "size": "small"
-                    }
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Icon",
-                  "zOrder": "1",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "10027263",
-                    "icon": {
-                      "ID": "check-circle",
-                      "size": "small"
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4509",
-          "typeID": "__group__",
-          "zOrder": "127",
-          "measuredW": "408",
-          "measuredH": "162",
-          "w": "408",
-          "h": "162",
-          "x": "308",
-          "y": "206",
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "408",
-                  "h": "162",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0"
-                },
-                {
-                  "ID": "1",
-                  "typeID": "__group__",
-                  "zOrder": "1",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "23",
-                  "y": "21",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10027263",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "Label",
-                  "zOrder": "2",
-                  "measuredW": "269",
-                  "measuredH": "24",
-                  "x": "59",
-                  "y": "21",
-                  "properties": {
-                    "size": "16",
-                    "text": "Personal Recommendation / Opinion"
-                  }
-                },
-                {
-                  "ID": "3",
-                  "typeID": "Label",
-                  "zOrder": "3",
-                  "measuredW": "159",
-                  "measuredH": "24",
-                  "x": "59",
-                  "y": "118",
-                  "properties": {
-                    "size": "16",
-                    "text": "I wouldn't recommend"
-                  }
-                },
-                {
-                  "ID": "4",
-                  "typeID": "__group__",
-                  "zOrder": "4",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "23",
-                  "y": "118",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10066329",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                },
-                {
-                  "ID": "5",
-                  "typeID": "Label",
-                  "zOrder": "5",
-                  "w": "324",
-                  "measuredW": "315",
-                  "measuredH": "24",
-                  "x": "60",
-                  "y": "86",
-                  "properties": {
-                    "size": "16",
-                    "text": "Order in roadmap not strict (Learn anytime)"
-                  }
-                },
-                {
-                  "ID": "6",
-                  "typeID": "__group__",
-                  "zOrder": "6",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "23",
-                  "y": "86",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "10066329",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                },
-                {
-                  "ID": "7",
-                  "typeID": "Label",
-                  "zOrder": "7",
-                  "measuredW": "272",
-                  "measuredH": "24",
-                  "x": "59",
-                  "y": "54",
-                  "properties": {
-                    "size": "16",
-                    "text": "Alternative Option - Pick this or purple"
-                  }
-                },
-                {
-                  "ID": "8",
-                  "typeID": "__group__",
-                  "zOrder": "8",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "23",
-                  "y": "53",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "3700253",
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4510",
-          "typeID": "__group__",
-          "zOrder": "126",
-          "measuredW": "350",
-          "measuredH": "141",
-          "w": "350",
-          "h": "141",
-          "x": "1242",
-          "y": "216",
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "350",
-                  "h": "141",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0"
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "314",
-                  "measuredH": "25",
-                  "x": "14",
-                  "y": "17",
-                  "properties": {
-                    "size": "17",
-                    "text": "Find the detailed version of this roadmap"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "Label",
-                  "zOrder": "2",
-                  "measuredW": "319",
-                  "measuredH": "25",
-                  "x": "14",
-                  "y": "45",
-                  "properties": {
-                    "size": "17",
-                    "text": "along with resources and other roadmaps"
-                  }
-                },
-                {
-                  "ID": "3",
-                  "typeID": "__group__",
-                  "zOrder": "3",
-                  "measuredW": "320",
-                  "measuredH": "45",
-                  "w": "320",
-                  "h": "45",
-                  "x": "15",
-                  "y": "81",
-                  "properties": {
-                    "controlName": "ext_link:roadmap.sh"
-                  },
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Canvas",
-                          "zOrder": "0",
-                          "w": "320",
-                          "h": "45",
-                          "measuredW": "100",
-                          "measuredH": "70",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "borderColor": "4273622",
-                            "color": "4273622"
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Label",
-                          "zOrder": "1",
-                          "measuredW": "105",
-                          "measuredH": "28",
-                          "x": "141",
-                          "y": "8",
-                          "properties": {
-                            "color": "16777215",
-                            "size": "20",
-                            "text": "roadmap.sh"
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Label",
-                          "zOrder": "2",
-                          "measuredW": "45",
-                          "measuredH": "28",
-                          "x": "65",
-                          "y": "8",
-                          "properties": {
-                            "color": "16777215",
-                            "size": "20",
-                            "text": "https"
-                          }
-                        },
-                        {
-                          "ID": "3",
-                          "typeID": "Label",
-                          "zOrder": "3",
-                          "measuredW": "5",
-                          "measuredH": "28",
-                          "x": "113",
-                          "y": "8",
-                          "properties": {
-                            "bold": "true",
-                            "color": "16777215",
-                            "size": "20",
-                            "text": ":"
-                          }
-                        },
-                        {
-                          "ID": "4",
-                          "typeID": "Label",
-                          "zOrder": "4",
-                          "measuredW": "10",
-                          "measuredH": "28",
-                          "x": "120",
-                          "y": "9",
-                          "properties": {
-                            "color": "16777215",
-                            "size": "20",
-                            "text": "/"
-                          }
-                        },
-                        {
-                          "ID": "5",
-                          "typeID": "Label",
-                          "zOrder": "5",
-                          "measuredW": "10",
-                          "measuredH": "28",
-                          "x": "128",
-                          "y": "9",
-                          "properties": {
-                            "color": "16777215",
-                            "size": "20",
-                            "text": "/"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        }
-      ]
-    },
-    "attributes": {
-      "name": "New Wireframe 1 copy",
-      "order": 1000010.2336643032,
-      "parentID": null,
-      "notes": ""
-    },
-    "branchID": "Master",
-    "resourceID": "D5E1AC09-3023-4145-A52A-4D904363A065",
-    "mockupH": "3729",
-    "mockupW": "1295",
-    "measuredW": "1603",
-    "measuredH": "3928",
-    "version": "1.0"
-  },
-  "groupOffset": {
-    "x": 0,
-    "y": 0
-  },
-  "dependencies": [],
-  "projectID": "file:///Users/kamrify/Desktop/New%20Roadmaps/New%20Project%201.bmpr"
-}
\ No newline at end of file
+{"nodes":[{"id":"yWM-Hgse9GqGipTO1pXVK","type":"section","position":{"x":31.571876400857263,"y":2792.4846359444336},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff"}},"zIndex":-999,"width":231,"height":344,"style":{"width":231,"height":344},"positionAbsolute":{"x":31.571876400857263,"y":2792.4846359444336},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"ocJ-ND5jn9s-ACTAPZKZb","type":"vertical","position":{"x":433.5766878818748,"y":2747.005494878551},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.75},"oldId":"wyzDVcQ87PRh0y2LIfvSU"},"zIndex":999,"width":20,"height":107,"style":{"width":20,"height":107},"positionAbsolute":{"x":433.5766878818748,"y":2747.005494878551},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"wvA5Bi-SaA61FAso8NPj8","type":"vertical","position":{"x":151.8791275129173,"y":2405.055709851968},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.75,"strokeDasharray":"0.8 8","strokeLinecap":"round"}},"zIndex":999,"width":20,"height":90,"style":{"width":20,"height":90},"positionAbsolute":{"x":151.8791275129173,"y":2405.055709851968},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"fSm0vh6u_Lk7esx8BSte8","type":"horizontal","position":{"x":-42.04576166270948,"y":2081.176280366376},"selected":true,"data":{"label":"horizontal node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":82,"height":20,"style":{"width":82,"height":20},"positionAbsolute":{"x":-42.04576166270948,"y":2081.176280366376},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"yasP_jzx1hhGoZZnR0mXU","type":"section","position":{"x":-277.67187829620605,"y":2040.5330508465236},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":238,"height":899,"style":{"width":238,"height":899},"resizing":false,"positionAbsolute":{"x":-277.67187829620605,"y":2040.5330508465236},"dragging":false,"selectable":true,"focusable":true},{"id":"_y6A_pwr-8jDIOoLx9QHC","type":"vertical","position":{"x":164.89029212267985,"y":492.75823396078783},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":70,"style":{"width":20,"height":70},"positionAbsolute":{"x":164.89029212267985,"y":492.75823396078783},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"c8c-AWby5x5_eEF4QLEgX","type":"horizontal","position":{"x":156.59496979792925,"y":1986.960323803236},"selected":true,"data":{"label":"horizontal node","style":{"stroke":"#2B78E4","strokeWidth":3.5,"strokeDasharray":"0.8 8","strokeLinecap":"round"}},"zIndex":999,"width":152,"height":20,"style":{"width":152,"height":20},"positionAbsolute":{"x":156.59496979792925,"y":1986.960323803236},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"BM8AtRoLAVTmjucTfCoVG","type":"section","position":{"x":313.1557525665048,"y":1799.1664942178645},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":462,"height":609,"style":{"width":462,"height":609},"resizing":false,"positionAbsolute":{"x":313.1557525665048,"y":1799.1664942178645},"selectable":true,"focusable":true,"dragging":false},{"id":"UwJdUMdYf1qAlMHOdcLPK","type":"vertical","position":{"x":25.04192151113341,"y":1773.460323803236},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.75,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":132,"style":{"width":20,"height":132},"positionAbsolute":{"x":25.04192151113341,"y":1773.460323803236},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"WYon24IKmo8fX_nAQh7YS","type":"horizontal","position":{"x":178.92830313126262,"y":1560.9442094125654},"selected":true,"data":{"label":"horizontal node","style":{"stroke":"#2B78E4","strokeWidth":3.5}},"zIndex":999,"width":317,"height":20,"style":{"width":317,"height":20},"resizing":false,"dragging":false,"positionAbsolute":{"x":178.92830313126262,"y":1560.9442094125654},"selectable":true,"focusable":true},{"id":"yMcSPPCMSvCYoh8i3x3d1","type":"vertical","position":{"x":714.6445601795068,"y":1475.0968472714264},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":180,"style":{"width":20,"height":180},"positionAbsolute":{"x":714.6445601795068,"y":1475.0968472714264},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"Aic1j37JF27iDpCwYWeA6","type":"vertical","position":{"x":571.9641965658323,"y":1475.9442094125654},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"},"oldId":"yMcSPPCMSvCYoh8i3x3d1"},"zIndex":999,"width":20,"height":78,"style":{"width":20,"height":78},"positionAbsolute":{"x":571.9641965658323,"y":1475.9442094125654},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"bm3XEtLCUU23rU2HhHnSY","type":"horizontal","position":{"x":267.9283031312626,"y":1540.9442094125654},"selected":true,"data":{"label":"horizontal node","style":{"stroke":"#2B78E4","strokeWidth":3.5},"oldId":"WYon24IKmo8fX_nAQh7YS"},"zIndex":999,"width":228,"height":20,"style":{"width":228,"height":20},"resizing":false,"dragging":false,"positionAbsolute":{"x":267.9283031312626,"y":1540.9442094125654},"selectable":true,"focusable":true},{"id":"LK_owhdD3K5uAYG5fD92w","type":"vertical","position":{"x":257.39029212267985,"y":1376.0968472714264},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.5}},"zIndex":999,"width":20,"height":177,"style":{"width":20,"height":177},"positionAbsolute":{"x":257.39029212267985,"y":1376.0968472714264},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"UK9l45WqokS_YM1P8-v3A","type":"vertical","position":{"x":323.6803864110923,"y":1281.065016026603},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":80,"style":{"width":20,"height":80},"positionAbsolute":{"x":323.6803864110923,"y":1281.065016026603},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"XSavYIlcsJ3APyYQypnBc","type":"horizontal","position":{"x":79.81132975781338,"y":1080.6168625008675},"selected":true,"data":{"label":"horizontal node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":141,"height":20,"style":{"width":141,"height":20},"positionAbsolute":{"x":79.81132975781338,"y":1080.6168625008675},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"ZTsi2oL00lox_bz27-hDO","type":"section","position":{"x":-288.1886702421866,"y":1021.4442094125654},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":371,"height":461,"style":{"width":371,"height":461},"resizing":false,"positionAbsolute":{"x":-288.1886702421866,"y":1021.4442094125654},"dragging":false,"selectable":true,"focusable":true},{"id":"h2z_qviXhvmdnwk5eiA05","type":"section","position":{"x":27.95423833729052,"y":672.4543464224016},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":189,"height":156,"style":{"width":189,"height":156},"positionAbsolute":{"x":27.95423833729052,"y":672.4543464224016},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"qGXjjY3jOUKsBdXqFJVnv","type":"horizontal","position":{"x":103.11914288676098,"y":951.6516938508362},"selected":true,"data":{"label":"horizontal node","style":{"stroke":"#2B78E4","strokeWidth":3.75}},"zIndex":999,"width":272,"height":20,"style":{"width":272,"height":20},"positionAbsolute":{"x":103.11914288676098,"y":951.6516938508362},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"ieJjbRAxSGYLPkmaWFJus","type":"vertical","position":{"x":256.89029212267985,"y":485.18247733449107},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.75}},"zIndex":999,"width":20,"height":582,"style":{"width":20,"height":582},"positionAbsolute":{"x":256.89029212267985,"y":485.18247733449107},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"_JbWIWlgwaMHYYi8W48oO","type":"section","position":{"x":640.5854863036282,"y":756.9078325432466},"width":149,"height":196,"style":{"width":149,"height":196},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":640.5854863036282,"y":756.9078325432466},"dragging":false,"selectable":true,"focusable":true},{"id":"_-k1suoaD64ZOMLrS2OeH","type":"vertical","position":{"x":536.3768792343918,"y":884.1516938508362},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":185,"style":{"width":20,"height":185},"positionAbsolute":{"x":536.3768792343918,"y":884.1516938508362},"dragging":false,"resizing":true,"selectable":true,"focusable":true},{"id":"uT9PXHnbTWga5vLIfBr50","type":"section","position":{"x":494.9283031312626,"y":1048.1168625008675},"width":287,"height":152,"style":{"width":287,"height":152},"selected":true,"data":{},"positionAbsolute":{"x":494.9283031312626,"y":1048.1168625008675},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"fUyJsuZx-zLIz_nQ8HZRl","type":"vertical","position":{"x":363.3768792343918,"y":486.18247733449107},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"},"oldId":"_y6A_pwr-8jDIOoLx9QHC"},"zIndex":999,"width":20,"height":75,"style":{"width":20,"height":75},"positionAbsolute":{"x":363.3768792343918,"y":486.18247733449107},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"coNWBnrx1oAfS9UgILkSJ","type":"section","position":{"x":328.96419656583225,"y":556.1824773344911},"width":293,"height":279,"style":{"width":293,"height":279},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":328.96419656583225,"y":556.1824773344911},"dragging":false,"focusable":true,"selectable":true,"resizing":false},{"id":"DVPKdE0w11vA197x__RXo","type":"vertical","position":{"x":-114.84081712321631,"y":375.8564029892008},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.5,"strokeDasharray":"0.8 8","strokeLinecap":"round"}},"zIndex":999,"width":14,"height":108,"style":{"width":14.339111328125,"height":107.5435791015625},"positionAbsolute":{"x":-114.84081712321631,"y":375.8564029892008},"dragging":false,"selectable":true,"focusable":true},{"id":"qw0r959sbdXLP0-GYBf5w","type":"vertical","position":{"x":-237.8408171232163,"y":375.8564029892008},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.5,"strokeDasharray":"0.8 8","strokeLinecap":"round"},"oldId":"DVPKdE0w11vA197x__RXo"},"zIndex":999,"width":14,"height":108,"style":{"width":14.339111328125,"height":107.5435791015625},"positionAbsolute":{"x":-237.8408171232163,"y":375.8564029892008},"dragging":false,"selectable":true,"focusable":true},{"id":"c58fcsthBlVfzfr-MHdpF","type":"vertical","position":{"x":256.89029212267985,"y":-109.59925177765109},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":66,"positionAbsolute":{"x":256.89029212267985,"y":-109.59925177765109},"dragging":false,"style":{"width":20,"height":66},"resizing":false,"selectable":true,"focusable":true},{"id":"Ji35JsKgUQXN4DJGEgTAC","type":"title","position":{"x":156.89029212267985,"y":-43.59925177765109},"selected":true,"data":{"label":"ASP.NET Core","style":{"fontSize":28,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":220,"height":68,"positionAbsolute":{"x":156.89029212267985,"y":-43.59925177765109},"dragging":false,"selectable":true,"focusable":true,"style":{}},{"id":"kpF15oUmlUmk1qVGEBB7Y","type":"paragraph","position":{"x":421.119142886761,"y":-115.9573697023546},"selected":true,"data":{"label":"Find the detailed version of this roadmap along with other similar roadmaps","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left","borderColor":"#000000","backgroundColor":"#FFFFFf"},"oldId":"yHmHXymPNWwu8p1vvqD3o"},"zIndex":999,"width":354,"height":143,"positionAbsolute":{"x":421.119142886761,"y":-115.9573697023546},"dragging":false,"selectable":true,"focusable":true,"style":{"width":354,"height":143},"resizing":false},{"id":"if9eTna5NRTMStVwpSwDP","type":"button","position":{"x":433.619142886761,"y":-34.09925177765109},"selected":true,"data":{"label":"roadmap.sh","href":"https://roadmap.sh","color":"#ffffff","backgroundColor":"#4136D6","style":{"fontSize":17},"oldId":"2zqZkyVgigifcRS1H7F_b"},"zIndex":999,"width":329,"height":49,"dragging":false,"style":{"width":329,"height":49},"resizing":false,"positionAbsolute":{"x":433.619142886761,"y":-34.09925177765109},"selectable":true,"focusable":true},{"id":"g4hjyQF8-SpjPi8mYtIsk","type":"vertical","position":{"x":256.89029212267985,"y":15.028193715390685},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.5}},"zIndex":999,"width":20,"height":99,"style":{"width":20,"height":99},"positionAbsolute":{"x":256.89029212267985,"y":15.028193715390685},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"width":411,"height":121,"id":"0vLaVNJaJSHZ_bHli6Qzs","type":"paragraph","position":{"x":329.993752405053,"y":3007.488386939488},"selected":true,"data":{"label":"Visit Backend path and see what you missed","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center","borderColor":"#000000","backgroundColor":"WHITe"},"oldId":"m9eO0jLGuR_9w2JJbe_g2"},"zIndex":999,"positionAbsolute":{"x":329.993752405053,"y":3007.488386939488},"dragging":false,"style":{"width":411,"height":121},"resizing":false,"focusable":true,"selectable":true},{"width":20,"height":85,"id":"xi0QAi4kXm3-IFKgopnOP","type":"vertical","position":{"x":433.5766878818748,"y":3128.488386939488},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"},"oldId":"RLtk1C3gofHnLJ17x3o5b"},"zIndex":999,"positionAbsolute":{"x":433.5766878818748,"y":3128.488386939488},"dragging":false,"focusable":true,"style":{"width":20,"height":85},"resizing":false,"selectable":true},{"width":377,"height":49,"id":"-sFboM4eFUMVq1tlPl-fV","type":"button","position":{"x":352.68684756812684,"y":3064.2129376580287},"selected":true,"data":{"label":"Backend Roadmap","href":"https://roadmap.sh/backend","color":"#FFFFFf","backgroundColor":"#4136D6","style":{"fontSize":17},"borderColor":"#4136D6","oldId":"qXKNK_IsGS8-JgLK-Q9oU"},"zIndex":999,"dragging":false,"positionAbsolute":{"x":352.68684756812684,"y":3064.2129376580287},"style":{"width":377,"height":49},"focusable":true,"resizing":false,"selectable":true},{"id":"NEnna_8DstfYH4T9qrP3-","type":"topic","position":{"x":128.89029212267985,"y":216.72101054939196},"selected":true,"data":{"label":"General Development Skills","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":276,"height":49,"style":{"width":276,"height":49},"dragging":false,"positionAbsolute":{"x":128.89029212267985,"y":216.72101054939196},"focusable":true,"selectable":true},{"id":"fxANnSiTb2VzA9u-YeBL1","type":"subtopic","position":{"x":535.7391698372666,"y":51.94269326868894},"selected":true,"data":{"label":"C#","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":235,"height":49,"style":{"width":235,"height":49},"positionAbsolute":{"x":535.7391698372666,"y":51.94269326868894},"dragging":false,"focusable":true,"resizing":false,"selectable":true},{"id":"3GGvuxdfuDwLpNX_gtjCK","type":"subtopic","position":{"x":535.7391698372666,"y":104.94269326868894},"selected":true,"data":{"label":".NET","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":112,"height":49,"style":{"width":112,"height":49},"positionAbsolute":{"x":535.7391698372666,"y":104.94269326868894},"dragging":false,"focusable":true,"resizing":false,"selectable":true},{"id":"6HJQ1Evgah0Pki04Z2hQt","type":"subtopic","position":{"x":652.3038707552415,"y":104.94269326868894},"selected":true,"data":{"label":".NET CLI","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":118,"height":49,"style":{"width":118,"height":49},"resizing":false,"positionAbsolute":{"x":652.3038707552415,"y":104.94269326868894},"dragging":false,"focusable":true,"selectable":true},{"id":"NvODRFR0DLINB0RlPSsvt","type":"topic","position":{"x":128.89029212267985,"y":107.76582156925141},"selected":true,"data":{"label":"Learn the Basics of C#","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":276,"height":49,"style":{"width":276,"height":49},"positionAbsolute":{"x":128.89029212267985,"y":107.76582156925141},"dragging":false,"resizing":false,"focusable":true,"selectable":true},{"id":"OtdCmkj0SvrGwCUSfm96C","type":"subtopic","position":{"x":-279.57383949457864,"y":143.02155144086436},"selected":true,"data":{"label":"Git - Version Control","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":296,"height":43,"style":{"width":296,"height":43},"positionAbsolute":{"x":-279.57383949457864,"y":143.02155144086436},"dragging":false,"focusable":true,"selectable":true},{"id":"KAZF-mIg-FlfMonfdOLhb","type":"subtopic","position":{"x":-279.57383949457864,"y":193.02155144086436},"selected":true,"data":{"label":"GitHub, GitLab, BitBucket","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":296,"height":49,"style":{"width":296,"height":49},"positionAbsolute":{"x":-279.57383949457864,"y":193.02155144086436},"dragging":false,"focusable":true,"selectable":true},{"id":"YI3cAezupWNntFw4B6elY","type":"subtopic","position":{"x":-279.57383949457864,"y":246.02155144086436},"selected":true,"data":{"label":"HTTP / HTTPs Protocol","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":296,"height":49,"style":{"width":296,"height":49},"positionAbsolute":{"x":-279.57383949457864,"y":246.02155144086436},"dragging":false,"focusable":true,"selectable":true},{"id":"RAX2xN37taw9cqA3pnORh","type":"subtopic","position":{"x":-279.57383949457864,"y":299.02155144086436},"selected":true,"data":{"label":"Data Structures and Algorithms","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":296,"height":49,"style":{"width":296,"height":49},"resizing":false,"positionAbsolute":{"x":-279.57383949457864,"y":299.02155144086436},"dragging":false,"focusable":true,"selectable":true},{"id":"tnKUdsgp6bnFtQTexEmfy","type":"topic","position":{"x":128.89029212267985,"y":372.3564029892008},"selected":true,"data":{"label":"Database Fundamentals","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":276,"height":49,"style":{"width":276,"height":49},"resizing":false,"positionAbsolute":{"x":128.89029212267985,"y":372.3564029892008},"dragging":false,"selectable":true,"focusable":true},{"id":"aOJMVrTcA_I2y_QHzj7aM","type":"subtopic","position":{"x":533.3038707552415,"y":266.3564029892008},"selected":true,"data":{"label":"SQL Basics","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":239,"height":49,"style":{"width":239,"height":49},"positionAbsolute":{"x":533.3038707552415,"y":266.3564029892008},"dragging":false,"selectable":true,"focusable":true},{"id":"zlAcgLKxGF_TyrcJIk4X7","type":"subtopic","position":{"x":533.3038707552415,"y":319.3564029892008},"selected":true,"data":{"label":"Database Design Basics","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":239,"height":49,"style":{"width":239,"height":49},"positionAbsolute":{"x":533.3038707552415,"y":319.3564029892008},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"ZiK-c9zNbi5RZkKUi44wP","type":"subtopic","position":{"x":533.3038707552415,"y":372.3564029892008},"selected":true,"data":{"label":"Stored Procedures","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":239,"height":49,"style":{"width":239,"height":49},"positionAbsolute":{"x":533.3038707552415,"y":372.3564029892008},"dragging":false,"selectable":true,"focusable":true},{"id":"1-XdtrGPbUoxpu9ZcQlBA","type":"subtopic","position":{"x":533.3038707552415,"y":425.3564029892008},"selected":true,"data":{"label":"Constraints","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":239,"height":49,"style":{"width":239,"height":49},"positionAbsolute":{"x":533.3038707552415,"y":425.3564029892008},"dragging":false,"selectable":true,"focusable":true},{"id":"2f_CJMnXwPxjMEwm5P_QJ","type":"subtopic","position":{"x":533.3038707552415,"y":478.3564029892008},"selected":true,"data":{"label":"Triggers","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"right-center"}},"zIndex":999,"width":239,"height":49,"style":{"width":239,"height":49},"positionAbsolute":{"x":533.3038707552415,"y":478.3564029892008},"dragging":false,"selectable":true,"focusable":true},{"id":"v2ZTCQQFQPoJNhOVGMG2g","type":"topic","position":{"x":-281.8408171232163,"y":372.3564029892008},"selected":true,"data":{"label":"ASP.NET Core Basics","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":238,"height":49,"style":{"width":238,"height":49},"resizing":false,"positionAbsolute":{"x":-281.8408171232163,"y":372.3564029892008},"dragging":false,"selectable":true,"focusable":true},{"id":"D3aQw0-pk3ycO-n10HBaA","type":"subtopic","position":{"x":-281.8408171232163,"y":460.75823396078783},"selected":true,"data":{"label":"MVC","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":102,"height":49,"style":{"width":102,"height":49},"positionAbsolute":{"x":-281.8408171232163,"y":460.75823396078783},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"dZ9fYWMBa1OemTmLOI8_q","type":"subtopic","position":{"x":-171.8408171232163,"y":460.75823396078783},"selected":true,"data":{"label":"REST","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":128,"height":49,"style":{"width":128,"height":49},"dragging":false,"positionAbsolute":{"x":-171.8408171232163,"y":460.75823396078783},"resizing":false,"selectable":true,"focusable":true},{"id":"qpVxwuyA2oE06MZLtEdP1","type":"subtopic","position":{"x":-281.8408171232163,"y":566.7582339607878},"selected":true,"data":{"label":"Razon Pages","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"ipABerBcM9zCte9pYaIse","legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"left-center"}},"zIndex":999,"width":238,"height":49,"style":{"width":238,"height":49},"positionAbsolute":{"x":-281.8408171232163,"y":566.7582339607878},"dragging":false,"selectable":true,"focusable":true},{"id":"vePinRjDfSGULKw0LE9K-","type":"subtopic","position":{"x":-281.8408171232163,"y":619.7582339607878},"selected":true,"data":{"label":"Razor Components","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"zgW3oGPdbclWTlKJdidiB","label":"Optional / Learn anytime","color":"#999999","position":"left-center"}},"zIndex":999,"width":238,"height":49,"style":{"width":238,"height":49},"dragging":false,"positionAbsolute":{"x":-281.8408171232163,"y":619.7582339607878},"selectable":true,"focusable":true},{"id":"dG--AAcZZdltYCeg6zCz2","type":"subtopic","position":{"x":-281.8408171232163,"y":673.5},"selected":true,"data":{"label":"Middlewares","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":238,"height":49,"style":{"width":238,"height":49},"positionAbsolute":{"x":-281.8408171232163,"y":673.5},"dragging":false,"selectable":true,"focusable":true},{"id":"U3HXmNq6x2YA3BwZsOTbe","type":"subtopic","position":{"x":-281.8408171232163,"y":725.758233960788},"selected":true,"data":{"label":"Filters and Attributes","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":238,"height":49,"style":{"width":238,"height":49},"positionAbsolute":{"x":-281.8408171232163,"y":725.758233960788},"dragging":false,"selectable":true,"focusable":true},{"id":"EJxliq-HPVp00CVsFc6kf","type":"subtopic","position":{"x":-281.8408171232163,"y":778.758233960788},"selected":true,"data":{"label":"App Settings and Configs","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"fius143Op9lRLjSZwjwVX","legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":238,"height":49,"style":{"width":238,"height":49},"positionAbsolute":{"x":-281.8408171232163,"y":778.758233960788},"dragging":false,"selectable":true,"focusable":true},{"id":"R7Qk5hsEIl9dspQXdaJAJ","type":"subtopic","position":{"x":535.7391698372666,"y":160.72101054939196},"selected":true,"data":{"label":"StyleCop Rules","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":235,"height":49,"style":{"width":235,"height":49},"positionAbsolute":{"x":535.7391698372666,"y":160.72101054939196},"dragging":false,"focusable":true,"selectable":true},{"id":"ipABerBcM9zCte9pYaIse","type":"subtopic","position":{"x":-281.8408171232163,"y":513.7582339607878},"selected":true,"data":{"label":"Minimal APIs","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":238,"height":49,"style":{"width":238,"height":49},"positionAbsolute":{"x":-281.8408171232163,"y":513.7582339607878},"dragging":false,"selectable":true,"focusable":true},{"id":"POQPoN98eqOH2873ZI6Hm","type":"topic","position":{"x":123.39029212267985,"y":458.3564029892008},"selected":true,"data":{"label":"Object Relational Mapping","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":287,"height":49,"style":{"width":287,"height":49},"positionAbsolute":{"x":123.39029212267985,"y":458.3564029892008},"dragging":false,"focusable":true,"selectable":true},{"id":"ET74_7ieahNaGdPT11_NI","type":"subtopic","position":{"x":328.96419656583225,"y":556.1824773344911},"selected":true,"data":{"label":"Entity Framework Core","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center","colorType":"h"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":293,"height":49,"style":{"width":293,"height":49},"positionAbsolute":{"x":328.96419656583225,"y":556.1824773344911},"dragging":false,"resizing":false,"focusable":true,"selectable":true},{"id":"eGVaAz3VhGu3cXBNxTAWd","type":"subtopic","position":{"x":336.96419656583225,"y":617.1824773344911},"selected":true,"data":{"label":"Framework Basics","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":271,"height":49,"style":{"width":271,"height":49},"positionAbsolute":{"x":336.96419656583225,"y":617.1824773344911},"dragging":false,"focusable":true,"selectable":true},{"id":"ZPeebwJ3OBuywEgLLgQTG","type":"subtopic","position":{"x":336.96419656583225,"y":670.1824773344911},"selected":true,"data":{"label":"Code First + Migrations","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":271,"height":49,"style":{"width":271,"height":49},"positionAbsolute":{"x":336.96419656583225,"y":670.1824773344911},"dragging":false,"focusable":true,"selectable":true},{"id":"9AMotSwdEbB8uOg80SykE","type":"subtopic","position":{"x":336.96419656583225,"y":776.1824773344911},"selected":true,"data":{"label":"Lazy, Eager, Explicit Loading","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":271,"height":49,"style":{"width":271,"height":49},"resizing":false,"positionAbsolute":{"x":336.96419656583225,"y":776.1824773344911},"dragging":false,"focusable":true,"selectable":true},{"id":"wfEOvAkGXkTZGdGX341D4","type":"subtopic","position":{"x":336.96419656583225,"y":723.1824773344911},"selected":true,"data":{"label":"Change Tracker API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":271,"height":49,"style":{"width":271,"height":49},"positionAbsolute":{"x":336.96419656583225,"y":723.1824773344911},"dragging":false,"focusable":true,"selectable":true},{"id":"UkWc41r0bZ1lptjse3As6","type":"subtopic","position":{"x":123.39029212267985,"y":543.5872226672002},"selected":true,"data":{"label":"Dapper","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"right-center"}},"zIndex":999,"width":103,"height":49,"style":{"width":103,"height":49},"dragging":false,"positionAbsolute":{"x":123.39029212267985,"y":543.5872226672002},"focusable":true,"selectable":true,"resizing":false},{"id":"tYDVcnG0oUF3R8DwASvAh","type":"subtopic","position":{"x":14.95423833729052,"y":543.5872226672002},"selected":true,"data":{"label":"RepoDB","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"left-center"}},"zIndex":999,"width":103,"height":49,"style":{"width":103,"height":49},"dragging":false,"positionAbsolute":{"x":14.95423833729052,"y":543.5872226672002},"focusable":true,"selectable":true,"resizing":false},{"id":"z24IJndpQYTl1PhiUI2mx","type":"subtopic","position":{"x":15.04192151113341,"y":597.5872226672002},"selected":true,"data":{"label":"NHibernate","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"left-center"}},"zIndex":999,"width":210,"height":51,"style":{"width":210,"height":51},"dragging":false,"positionAbsolute":{"x":15.04192151113341,"y":597.5872226672002},"focusable":true,"selectable":true,"resizing":true},{"id":"IejHMMVKwA0sIInla4FjX","type":"topic","position":{"x":328.96419656583225,"y":934.4078325432465},"selected":true,"data":{"label":"Dependency Injection","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"7Nth4LOrM_KirhvjDGkgS"},"zIndex":999,"width":263,"height":49,"style":{"width":263,"height":49},"positionAbsolute":{"x":328.96419656583225,"y":934.4078325432465},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"f212ztDU_kb7gO71Nn76L","type":"subtopic","position":{"x":489.3768792343918,"y":859.6516938508362},"selected":true,"data":{"label":"Scrutor","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"left-center"}},"zIndex":999,"width":114,"height":49,"style":{"width":114,"height":49},"positionAbsolute":{"x":489.3768792343918,"y":859.6516938508362},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"Tjaczp2E-cCn0qSv89xgo","type":"topic","position":{"x":640.5854863036282,"y":934.4078325432465},"selected":true,"data":{"label":"Life Cycles","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center","colorType":"g"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":149,"height":49,"style":{"width":149,"height":49},"positionAbsolute":{"x":640.5854863036282,"y":934.4078325432465},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"iM760f8Ys66-VSkMiZfIX","type":"topic","position":{"x":494.9283031312626,"y":1022.223402610819},"selected":true,"data":{"label":"DI Containers","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center","colorType":"h"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":287,"height":49,"style":{"width":287,"height":49},"positionAbsolute":{"x":494.9283031312626,"y":1022.223402610819},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"J9XdYLo7qJiBoL8p3c68P","type":"subtopic","position":{"x":506.9283031312626,"y":1080.6168625008675},"selected":true,"data":{"label":"Microsoft.Extensions","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":261,"height":49,"style":{"width":261,"height":49},"dragging":false,"positionAbsolute":{"x":506.9283031312626,"y":1080.6168625008675},"resizing":false,"selectable":true,"focusable":true},{"id":"gbpSbjF12dBE1Tb3PX8Bz","type":"subtopic","position":{"x":507.59496979792925,"y":1133.6168625008675},"selected":true,"data":{"label":"AutoFac","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"zgW3oGPdbclWTlKJdidiB","label":"Optional / Learn anytime","color":"#999999","position":"right-center"}},"zIndex":999,"width":261,"height":49,"style":{"width":261,"height":49},"positionAbsolute":{"x":507.59496979792925,"y":1133.6168625008675},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"M3BW_63MFQyD8NE68dazD","type":"subtopic","position":{"x":648.5854863036282,"y":769.4078325432466},"selected":true,"data":{"label":"Scoped","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":128,"height":49,"style":{"width":128,"height":49},"positionAbsolute":{"x":648.5854863036282,"y":769.4078325432466},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"-N0XM0-VtCZ6QMo2YyMD-","type":"subtopic","position":{"x":648.5854863036282,"y":822.4078325432465},"selected":true,"data":{"label":"Transient","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":128,"height":49,"style":{"width":128,"height":49},"positionAbsolute":{"x":648.5854863036282,"y":822.4078325432465},"dragging":false,"selectable":true,"focusable":true},{"id":"y9bDrCjkDbxSIrEEtu_Mi","type":"subtopic","position":{"x":648.5854863036282,"y":875.4078325432465},"selected":true,"data":{"label":"Singleton","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":128,"height":49,"style":{"width":128,"height":49},"positionAbsolute":{"x":648.5854863036282,"y":875.4078325432465},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"7Nth4LOrM_KirhvjDGkgS","type":"topic","position":{"x":65.95423833729052,"y":934.4078325432465},"selected":true,"data":{"label":"Caching","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":110,"height":49,"style":{"width":110,"height":49},"positionAbsolute":{"x":65.95423833729052,"y":934.4078325432465},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"8CRsr7UZszjc_fZ-4ZmIx","type":"subtopic","position":{"x":28.45423833729052,"y":856.2469833250727},"selected":true,"data":{"label":"Memory Cache","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":185,"height":49,"style":{"width":185,"height":49},"positionAbsolute":{"x":28.45423833729052,"y":856.2469833250727},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"FV4GsPjUyAc99DnIwkkCC","type":"subtopic","position":{"x":-290.9580784888666,"y":932.4078325432465},"selected":true,"data":{"label":"Entity Framework 2nd Level Cache","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"left-center"}},"zIndex":999,"width":316,"height":53,"style":{"width":316,"height":53},"positionAbsolute":{"x":-290.9580784888666,"y":932.4078325432465},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"SiG0FWWznjDg-2mIWlchy","type":"subtopic","position":{"x":28.95423833729052,"y":799.9057185226321},"selected":true,"data":{"label":"Distributed Cache","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center","colorType":"d"},"oldId":"8CRsr7UZszjc_fZ-4ZmIx","legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":189,"height":49,"style":{"width":189,"height":49},"positionAbsolute":{"x":28.95423833729052,"y":799.9057185226321},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"u2pc3ZkL0EumAsbM12D5y","type":"subtopic","position":{"x":42.45423833729052,"y":742.5144404015044},"selected":true,"data":{"label":"Memcached","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"left-center"}},"zIndex":999,"width":164,"height":50,"style":{"width":164,"height":50},"dragging":false,"positionAbsolute":{"x":42.45423833729052,"y":742.5144404015044},"resizing":false,"selectable":true,"focusable":true},{"id":"Ts0gJ4DdwFp48LGr4YSvM","type":"subtopic","position":{"x":42.45423833729052,"y":685.6280498683051},"selected":true,"data":{"label":"Redis","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":164,"height":49,"style":{"width":164,"height":49},"positionAbsolute":{"x":42.45423833729052,"y":685.6280498683051},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"Ujzn_dILCA7xoupnz398l","type":"topic","position":{"x":171.8791275129173,"y":1067.182477334491},"selected":true,"data":{"label":"Databases","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"fQ3w8REYWzQfeJ0nPyq6W"},"zIndex":999,"width":194,"height":49,"style":{"width":194,"height":49},"positionAbsolute":{"x":171.8791275129173,"y":1067.182477334491},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"6p5atMYw3b3bXkQuXZsDV","type":"topic","position":{"x":-271.48977149716166,"y":1035.361537941145},"selected":true,"data":{"label":"Search Engines","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"left-center"}},"zIndex":999,"width":193,"height":49,"style":{"width":193,"height":49},"resizing":false,"positionAbsolute":{"x":-271.48977149716166,"y":1035.361537941145},"dragging":false,"selectable":true,"focusable":true},{"id":"mK9OAwjReZoQZr1WSLRKJ","type":"subtopic","position":{"x":-271.48977149716166,"y":1088.361537941145},"selected":true,"data":{"label":"Elastic Search","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":193,"height":49,"style":{"width":193,"height":49},"positionAbsolute":{"x":-271.48977149716166,"y":1088.361537941145},"dragging":false,"selectable":true,"focusable":true},{"id":"2sY_p_8cOOBmZtDHO2Cmy","type":"subtopic","position":{"x":-271.48977149716166,"y":1142.2274230053604},"selected":true,"data":{"label":"Solr","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"left-center"}},"zIndex":999,"width":90,"height":49,"style":{"width":90,"height":49},"positionAbsolute":{"x":-271.48977149716166,"y":1142.2274230053604},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"Ye9WHfwZa-Fc2YDaTCmU1","type":"subtopic","position":{"x":-178.48977149716166,"y":1142.2274230053604},"selected":true,"data":{"label":"Sphinx","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"right-center"}},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"positionAbsolute":{"x":-178.48977149716166,"y":1142.2274230053604},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"LrjmJs6_rXUkc2A7fEq24","type":"topic","position":{"x":-69.7527967008875,"y":1035.361537941145},"selected":true,"data":{"label":"Cloud","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"right-center"}},"zIndex":999,"width":137,"height":49,"style":{"width":137,"height":49},"resizing":false,"positionAbsolute":{"x":-69.7527967008875,"y":1035.361537941145},"dragging":false,"selectable":true,"focusable":true},{"id":"KrkV1w9b_Nwm6pe9diDRS","type":"subtopic","position":{"x":-69.7527967008875,"y":1088.361537941145},"selected":true,"data":{"label":"Cosmos DB","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"right-center"}},"zIndex":999,"width":137,"height":49,"style":{"width":137,"height":49},"positionAbsolute":{"x":-69.7527967008875,"y":1088.361537941145},"dragging":false,"selectable":true,"focusable":true},{"id":"1Om9aQDZmnj_DN10ogwDL","type":"subtopic","position":{"x":-69.7527967008875,"y":1142.2274230053604},"selected":true,"data":{"label":"Dynamo DB","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":137,"height":49,"style":{"width":137,"height":49},"dragging":false,"positionAbsolute":{"x":-69.7527967008875,"y":1142.2274230053604},"selectable":true,"focusable":true},{"id":"FnRxRY3uDZdTve1w-nBfc","type":"topic","position":{"x":-271.4385474503373,"y":1206.7412636056727},"selected":true,"data":{"label":"Relational","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":193,"height":49,"style":{"width":193,"height":49},"positionAbsolute":{"x":-271.4385474503373,"y":1206.7412636056727},"dragging":false,"selectable":true,"focusable":true},{"id":"HQHSzsqBGSVYNLQ9o5EI-","type":"subtopic","position":{"x":-271.4385474503373,"y":1259.7412636056727},"selected":true,"data":{"label":"SQL Server","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":193,"height":49,"style":{"width":193,"height":49},"positionAbsolute":{"x":-271.4385474503373,"y":1259.7412636056727},"dragging":false,"selectable":true,"focusable":true},{"id":"An9TLvo-I6NtC8wFU3bh4","type":"subtopic","position":{"x":-271.4385474503373,"y":1312.7412636056727},"selected":true,"data":{"label":"PostgreSQL","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"left-center"}},"zIndex":999,"width":193,"height":49,"style":{"width":193,"height":49},"positionAbsolute":{"x":-271.4385474503373,"y":1312.7412636056727},"dragging":false,"selectable":true,"focusable":true},{"id":"Gs8XcsTo11MeCsiSGpjkU","type":"subtopic","position":{"x":-271.4385474503373,"y":1365.7412636056727},"selected":true,"data":{"label":"MariaDB","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"zgW3oGPdbclWTlKJdidiB","label":"Optional / Learn anytime","color":"#999999","position":"left-center"}},"zIndex":999,"width":193,"height":49,"style":{"width":193,"height":49},"positionAbsolute":{"x":-271.4385474503373,"y":1365.7412636056727},"dragging":false,"selectable":true,"focusable":true},{"id":"WsGwg4qdlu_vBsFEpmBvU","type":"subtopic","position":{"x":-271.4385474503373,"y":1418.7412636056727},"selected":true,"data":{"label":"MySQL","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"zgW3oGPdbclWTlKJdidiB","label":"Optional / Learn anytime","color":"#999999","position":"left-center"}},"zIndex":999,"width":193,"height":49,"style":{"width":193,"height":49},"positionAbsolute":{"x":-271.4385474503373,"y":1418.7412636056727},"dragging":false,"selectable":true,"focusable":true},{"id":"WUis4K9vduriYdVkKvM9r","type":"topic","position":{"x":-69.7527967008875,"y":1206.7412636056727},"selected":true,"data":{"label":"NoSQL","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"right-center"}},"zIndex":999,"width":137,"height":49,"style":{"width":137,"height":49},"dragging":false,"positionAbsolute":{"x":-69.7527967008875,"y":1206.7412636056727},"selectable":true,"focusable":true},{"id":"-wYRa8qSuKVKo_yOTKV67","type":"subtopic","position":{"x":-69.7527967008875,"y":1259.7412636056727},"selected":true,"data":{"label":"MongoDB","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":137,"height":49,"style":{"width":137,"height":49},"positionAbsolute":{"x":-69.7527967008875,"y":1259.7412636056727},"dragging":false,"selectable":true,"focusable":true},{"id":"U_-Gt5csu_hihl7ybFY-B","type":"subtopic","position":{"x":-69.7527967008875,"y":1312.7412636056727},"selected":true,"data":{"label":"Cassandra","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"right-center"}},"zIndex":999,"width":137,"height":49,"style":{"width":137,"height":49},"positionAbsolute":{"x":-69.7527967008875,"y":1312.7412636056727},"dragging":false,"selectable":true,"focusable":true},{"id":"3gcXaOnHL4v5OoStrTWNV","type":"subtopic","position":{"x":-69.7527967008875,"y":1365.7412636056727},"selected":true,"data":{"label":"LiteDB","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"right-center"}},"zIndex":999,"width":137,"height":49,"style":{"width":137,"height":49},"positionAbsolute":{"x":-69.7527967008875,"y":1365.7412636056727},"dragging":false,"selectable":true,"focusable":true},{"id":"vHcwt6ARi5YR3v-eDDjfl","type":"subtopic","position":{"x":-69.7527967008875,"y":1418.7412636056727},"selected":true,"data":{"label":"CouchDB","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"right-center"}},"zIndex":999,"width":137,"height":49,"style":{"width":137,"height":49},"positionAbsolute":{"x":-69.7527967008875,"y":1418.7412636056727},"dragging":false,"selectable":true,"focusable":true},{"id":"fQ3w8REYWzQfeJ0nPyq6W","type":"topic","position":{"x":171.8791275129173,"y":1337.0968472714264},"selected":true,"data":{"label":"Log Frameworks","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"7Nth4LOrM_KirhvjDGkgS"},"zIndex":999,"width":194,"height":49,"style":{"width":194,"height":49},"positionAbsolute":{"x":171.8791275129173,"y":1337.0968472714264},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"xL0s4-HfRxNy2ru0jiIWR","type":"subtopic","position":{"x":301.5766878818748,"y":1196.3470319033936},"selected":true,"data":{"label":"Serilog","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":149,"height":49,"style":{"width":149,"height":49},"positionAbsolute":{"x":301.5766878818748,"y":1196.3470319033936},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"ykF2bB_68AhCOzeQ_QSW1","type":"subtopic","position":{"x":301.5766878818748,"y":1249.9839242654448},"selected":true,"data":{"label":"NLog","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"zgW3oGPdbclWTlKJdidiB","label":"Optional / Learn anytime","color":"#999999","position":"right-center"}},"zIndex":999,"width":149,"height":49,"style":{"width":149,"height":49},"resizing":false,"dragging":false,"positionAbsolute":{"x":301.5766878818748,"y":1249.9839242654448},"selectable":true,"focusable":true},{"id":"GLkDH0X0uy8_1DIdCzbUD","type":"topic","position":{"x":485.3038707552415,"y":1536.4442094125654},"selected":true,"data":{"label":"API Clients and Communication","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"9Vv3OxafB6BlHhi1ZkeVO"},"zIndex":999,"width":287,"height":49,"style":{},"positionAbsolute":{"x":485.3038707552415,"y":1536.4442094125654},"dragging":false,"selectable":true,"focusable":true},{"id":"KJCtxH3mYsZq3hfBZ6cJF","type":"topic","position":{"x":675.6445601795068,"y":1450.7161593360722},"selected":true,"data":{"label":"REST","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center","colorType":"g"},"oldId":"BdTQ5ZMNDNZvkAUoCfL5H","legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":98,"height":49,"style":{"width":98,"height":49},"positionAbsolute":{"x":675.6445601795068,"y":1450.7161593360722},"dragging":false,"selectable":true,"focusable":true},{"id":"w5RnrhsP4p-AdSOLYVAY9","type":"subtopic","position":{"x":675.6445601795068,"y":1338.7161593360722},"selected":true,"data":{"label":"Gridlify","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":98,"height":49,"style":{"width":98,"height":49},"positionAbsolute":{"x":675.6445601795068,"y":1338.7161593360722},"selectable":true,"focusable":true,"dragging":false},{"id":"YojZ5fpzw-5WgoqqkO6wl","type":"subtopic","position":{"x":675.6445601795068,"y":1391.7161593360722},"selected":true,"data":{"label":"Odata","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"zgW3oGPdbclWTlKJdidiB","label":"Optional / Learn anytime","color":"#999999","position":"right-center"}},"zIndex":999,"width":98,"height":49,"style":{"width":98,"height":49},"dragging":false,"positionAbsolute":{"x":675.6445601795068,"y":1391.7161593360722},"selectable":true,"focusable":true},{"id":"BdTQ5ZMNDNZvkAUoCfL5H","type":"topic","position":{"x":493.92617572789345,"y":1450.7161593360722},"selected":true,"data":{"label":"GraphQL","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center","colorType":"g"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"left-center"}},"zIndex":999,"width":170,"height":49,"style":{"width":170,"height":49},"positionAbsolute":{"x":493.92617572789345,"y":1450.7161593360722},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"Efxu9gDodODMTKJbWcXzB","type":"subtopic","position":{"x":493.92617572789345,"y":1338.7161593360722},"selected":true,"data":{"label":"GraphQL .NET","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"zgW3oGPdbclWTlKJdidiB","label":"Optional / Learn anytime","color":"#999999","position":"left-center"}},"zIndex":999,"width":170,"height":49,"style":{"width":170,"height":49},"positionAbsolute":{"x":493.92617572789345,"y":1338.7161593360722},"selectable":true,"focusable":true,"dragging":false},{"id":"XMrQx9JH0eSQJpMzhvy0F","type":"subtopic","position":{"x":493.92617572789345,"y":1391.7161593360722},"selected":true,"data":{"label":"HotChocolate","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":170,"height":49,"style":{"width":170,"height":49},"positionAbsolute":{"x":493.92617572789345,"y":1391.7161593360722},"dragging":false,"selectable":true,"focusable":true},{"id":"x3SJlLc19DNJ-PyDOOj_G","type":"subtopic","position":{"x":675.6445601795068,"y":1636.7686788951287},"selected":true,"data":{"label":"gRPC","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"right-center"}},"zIndex":999,"width":98,"height":49,"style":{"width":98,"height":49},"positionAbsolute":{"x":675.6445601795068,"y":1636.7686788951287},"dragging":false,"selectable":true,"focusable":true},{"id":"9Vv3OxafB6BlHhi1ZkeVO","type":"topic","position":{"x":-23.04576166270948,"y":1546.4442094125654},"selected":true,"data":{"label":"Real-Time Communication","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":248,"height":49,"style":{"width":248,"height":49},"positionAbsolute":{"x":-23.04576166270948,"y":1546.4442094125654},"dragging":false,"selectable":true,"focusable":true},{"id":"tBl8neu3tJd5GPwGfJbjZ","type":"subtopic","position":{"x":-279.20291471146976,"y":1522.4234770816188},"selected":true,"data":{"label":"Web Sockets","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"zgW3oGPdbclWTlKJdidiB","label":"Optional / Learn anytime","color":"#999999","position":"left-center"}},"zIndex":999,"width":154,"height":49,"style":{"width":154,"height":49},"dragging":false,"resizing":false,"positionAbsolute":{"x":-279.20291471146976,"y":1522.4234770816188},"selectable":true,"focusable":true},{"id":"8dvd4M0TKNyQR8dEolGNT","type":"subtopic","position":{"x":-279.20291471146976,"y":1575.4234770816188},"selected":true,"data":{"label":"SignalR Core","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":154,"height":49,"style":{"width":154,"height":49},"dragging":false,"resizing":false,"positionAbsolute":{"x":-279.20291471146976,"y":1575.4234770816188},"selectable":true,"focusable":true},{"id":"9ECykIIvXlDblbFbRVcJS","type":"topic","position":{"x":-23.04576166270948,"y":1667.8598256215682},"selected":true,"data":{"label":"Object Mapping","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"s57tKy1rajlJbKFDVXLqs"},"zIndex":999,"width":248,"height":49,"style":{"width":248,"height":49},"positionAbsolute":{"x":-23.04576166270948,"y":1667.8598256215682},"dragging":false,"selectable":true,"focusable":true},{"id":"GPmlueMnuLCUW_t4jvGhc","type":"subtopic","position":{"x":323.18684756812684,"y":1614.8598256215682},"selected":true,"data":{"label":"AutoMapper","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"oMMBzRrHkUymxAR4oqr75","legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"right-center"}},"zIndex":999,"width":185,"height":49,"style":{"width":185,"height":49},"positionAbsolute":{"x":323.18684756812684,"y":1614.8598256215682},"selectable":true,"focusable":true,"resizing":false,"dragging":false},{"id":"x0OopRTwIvoWgT8qi0CE9","type":"subtopic","position":{"x":323.18684756812684,"y":1667.8598256215682},"selected":true,"data":{"label":"Mapperly","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"oMMBzRrHkUymxAR4oqr75","legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"right-center"}},"zIndex":999,"width":185,"height":49,"style":{"width":185,"height":49},"positionAbsolute":{"x":323.18684756812684,"y":1667.8598256215682},"selectable":true,"focusable":true,"resizing":false,"dragging":false},{"id":"oMMBzRrHkUymxAR4oqr75","type":"subtopic","position":{"x":323.18684756812684,"y":1720.8598256215682},"selected":true,"data":{"label":"Manual Mapping","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":185,"height":49,"style":{"width":185,"height":49},"positionAbsolute":{"x":323.18684756812684,"y":1720.8598256215682},"selectable":true,"focusable":true,"resizing":false,"dragging":false},{"id":"s57tKy1rajlJbKFDVXLqs","type":"topic","position":{"x":12.95423833729052,"y":1877.1363901779303},"selected":true,"data":{"label":"Task Scheduling","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":176,"height":49,"style":{"width":176,"height":49},"positionAbsolute":{"x":12.95423833729052,"y":1877.1363901779303},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"uP1nqbmFmZL_wA2DoqP8C","type":"subtopic","position":{"x":-174.71351420311524,"y":1750.8690373019726},"selected":true,"data":{"label":"Native Background Service","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":253,"height":49,"style":{},"positionAbsolute":{"x":-174.71351420311524,"y":1750.8690373019726},"dragging":false,"selectable":true,"focusable":true},{"id":"QiQsx1udyKcPJ-lZjRQVy","type":"subtopic","position":{"x":-227.96902609725535,"y":1825.145103688996},"selected":true,"data":{"label":"Hangfire","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":111,"height":49,"style":{"width":111,"height":49},"positionAbsolute":{"x":-227.96902609725535,"y":1825.145103688996},"dragging":false,"selectable":true,"focusable":true},{"id":"zOWlPXIl4XPs_0pA8-yi5","type":"subtopic","position":{"x":-227.96902609725535,"y":1878.145103688996},"selected":true,"data":{"label":"Quartz","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"zgW3oGPdbclWTlKJdidiB","label":"Optional / Learn anytime","color":"#999999","position":"left-center"}},"zIndex":999,"width":111,"height":49,"style":{"width":111,"height":49},"positionAbsolute":{"x":-227.96902609725535,"y":1878.145103688996},"dragging":false,"selectable":true,"focusable":true},{"id":"p3bZnKIyRgLmB764Kkhju","type":"subtopic","position":{"x":-227.96902609725535,"y":1931.145103688996},"selected":true,"data":{"label":"Coravel","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"zgW3oGPdbclWTlKJdidiB","label":"Optional / Learn anytime","color":"#999999","position":"left-center"}},"zIndex":999,"width":111,"height":49,"style":{"width":111,"height":49},"positionAbsolute":{"x":-227.96902609725535,"y":1931.145103688996},"dragging":false,"selectable":true,"focusable":true},{"id":"XofWWhlU_vWCG5oXVMZze","type":"topic","position":{"x":13.95423833729052,"y":1974.0673712978817},"selected":true,"data":{"label":"Testing","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"KIFmahcNiSo2NGoLtAyRR"},"zIndex":999,"width":174,"height":49,"style":{"width":174,"height":49},"positionAbsolute":{"x":13.95423833729052,"y":1974.0673712978817},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"AtyL0ij8FeJCBmqG2YvTO","type":"subtopic","position":{"x":327.50948132668987,"y":1868.0673712978817},"selected":true,"data":{"label":"Playwright","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":177,"height":49,"style":{"width":177,"height":49},"dragging":false,"positionAbsolute":{"x":327.50948132668987,"y":1868.0673712978817},"selectable":true,"focusable":true},{"id":"UCpoLiQJ4LeniI9x3uGcY","type":"subtopic","position":{"x":327.50948132668987,"y":1921.0673712978817},"selected":true,"data":{"label":"Puppeteer","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"left-center"}},"zIndex":999,"width":177,"height":49,"style":{"width":177,"height":49},"positionAbsolute":{"x":327.50948132668987,"y":1921.0673712978817},"selectable":true,"focusable":true,"dragging":false},{"id":"f2UP2jDnDr7XEFIdAtBhH","type":"subtopic","position":{"x":327.50948132668987,"y":1974.0673712978817},"selected":true,"data":{"label":"Cypress","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"left-center"}},"zIndex":999,"width":177,"height":49,"style":{"width":177,"height":49},"positionAbsolute":{"x":327.50948132668987,"y":1974.0673712978817},"selectable":true,"focusable":true,"dragging":false},{"id":"Xx5G09n4WWnnydCgxnL0A","type":"subtopic","position":{"x":515.2293649548315,"y":1867.0701218212512},"selected":true,"data":{"label":"WebApplicationFactory","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":246,"height":49,"style":{"width":246,"height":49},"dragging":false,"positionAbsolute":{"x":515.2293649548315,"y":1867.0701218212512},"selectable":true,"focusable":true},{"id":"8eW5BaOjJbnQ7uk4zMOiU","type":"subtopic","position":{"x":515.2293649548315,"y":1921.0673712978817},"selected":true,"data":{"label":"Test Containers","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":246,"height":49,"style":{"width":246,"height":49},"positionAbsolute":{"x":515.2293649548315,"y":1921.0673712978817},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"Ohc0xzI6qX4hOFVNfRj1F","type":"subtopic","position":{"x":515.2293649548315,"y":1973.0701218212512},"selected":true,"data":{"label":".NET Aspire","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"TCswZHviRiu6SIOwUisu8","legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"right-center"}},"zIndex":999,"width":140,"height":49,"style":{"width":140,"height":49},"positionAbsolute":{"x":515.2293649548315,"y":1973.0701218212512},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"TCswZHviRiu6SIOwUisu8","type":"subtopic","position":{"x":661.9711685016747,"y":1974.0673712978817},"selected":true,"data":{"label":"Respawn","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"zgW3oGPdbclWTlKJdidiB","label":"Optional / Learn anytime","color":"#999999","position":"right-center"}},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"positionAbsolute":{"x":661.9711685016747,"y":1974.0673712978817},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"9WZmjiFowydYrkHQ2xeNm","type":"subtopic","position":{"x":327.50948132668987,"y":2096.750904410703},"selected":true,"data":{"label":"Specflow","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"aWRv5sU9dksgcpE9RGJb1","legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":177,"height":49,"style":{"width":177,"height":49},"positionAbsolute":{"x":327.50948132668987,"y":2096.750904410703},"dragging":false,"selectable":true,"focusable":true},{"id":"aWRv5sU9dksgcpE9RGJb1","type":"subtopic","position":{"x":327.50948132668987,"y":2150.750904410703},"selected":true,"data":{"label":"Light BDD","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"left-center"}},"zIndex":999,"width":177,"height":49,"style":{"width":177,"height":49},"positionAbsolute":{"x":327.50948132668987,"y":2150.750904410703},"dragging":false,"selectable":true,"focusable":true},{"id":"rcr1V3vhuilYbvgaQm7IE","type":"label","position":{"x":541.8494981027027,"y":2050.250904410703},"selected":true,"data":{"label":"Unit Testing Frameworks","href":"","color":"#000000","style":{"fontSize":17},"oldId":"FjpBEi77yGh9oSsHdh7mf"},"zIndex":999,"width":205,"height":36,"style":{},"positionAbsolute":{"x":541.8494981027027,"y":2050.250904410703},"dragging":false,"selectable":true,"focusable":true},{"id":"R8C6s53RYjkRVma0nCJpy","type":"subtopic","position":{"x":606.1986160843118,"y":2095.5613753534185},"selected":true,"data":{"label":"XUnit","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"236VJJjMvqHfSj-MHSDPV","legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":75,"height":49,"style":{"width":75,"height":49},"positionAbsolute":{"x":606.1986160843118,"y":2095.5613753534185},"dragging":false,"selectable":true,"focusable":true},{"id":"qHYBlBCvCGUZGh6gyEI63","type":"subtopic","position":{"x":689.8451259605433,"y":2095.5613753534185},"selected":true,"data":{"label":"NUnit","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"right-center"}},"zIndex":999,"width":70,"height":49,"style":{"width":70,"height":49},"positionAbsolute":{"x":689.8451259605433,"y":2095.5613753534185},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"TAKxVS6DfIhmSJ6oOQxOM","type":"label","position":{"x":574.7823116265199,"y":2153.223734582062},"selected":true,"data":{"label":"Assertions","href":"","color":"#000000","style":{"fontSize":17},"oldId":"nYOf8Q0lWnzBdGRHbdwwq"},"zIndex":999,"width":99,"height":26,"style":{"width":99.0003662109375,"height":26.3497314453125},"positionAbsolute":{"x":574.7823116265199,"y":2153.223734582062},"dragging":false,"selectable":true,"focusable":true},{"id":"zhn-VLGPfV6FZT2OMl6zf","type":"subtopic","position":{"x":513.8451259605433,"y":2188.41097832855},"selected":true,"data":{"label":"Shouldly","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"diRJ_F6kx42Ucs0fxidtZ","legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":246,"height":49,"style":{"width":246,"height":49},"dragging":false,"positionAbsolute":{"x":513.8451259605433,"y":2188.41097832855},"selectable":true,"focusable":true},{"id":"nYOf8Q0lWnzBdGRHbdwwq","type":"label","position":{"x":576.1665506208079,"y":2246.563695311414},"selected":true,"data":{"label":"Mocking","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":99,"height":26,"style":{"width":99.0003662109375,"height":26.3497314453125},"positionAbsolute":{"x":576.1665506208079,"y":2246.563695311414},"dragging":false,"selectable":true,"focusable":true},{"id":"iZCxinqlVefBk5-ICqt4v","type":"subtopic","position":{"x":515.2293649548313,"y":2286.8339739890553},"selected":true,"data":{"label":"NSubstitute","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"diRJ_F6kx42Ucs0fxidtZ","legend":{"id":"zgW3oGPdbclWTlKJdidiB","label":"Optional / Learn anytime","color":"#999999","position":"right-center"}},"zIndex":999,"width":246,"height":49,"style":{"width":246,"height":49},"dragging":false,"positionAbsolute":{"x":515.2293649548313,"y":2286.8339739890553},"selectable":true,"focusable":true},{"id":"eyOXWb1kL80Wqiwc2WHd_","type":"subtopic","position":{"x":515.2293649548313,"y":2340.8339739890553},"selected":true,"data":{"label":"Moq","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"diRJ_F6kx42Ucs0fxidtZ","legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"dragging":false,"positionAbsolute":{"x":515.2293649548313,"y":2340.8339739890553},"resizing":false,"selectable":true,"focusable":true},{"id":"diRJ_F6kx42Ucs0fxidtZ","type":"subtopic","position":{"x":629.1665506208079,"y":2340.8339739890553},"selected":true,"data":{"label":"FakeItEasy","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"zgW3oGPdbclWTlKJdidiB","label":"Optional / Learn anytime","color":"#999999","position":"right-center"}},"zIndex":999,"width":133,"height":49,"style":{"width":133,"height":49},"dragging":false,"positionAbsolute":{"x":629.1665506208079,"y":2340.8339739890553},"resizing":false,"selectable":true,"focusable":true},{"id":"K49M_7gSpfJuZaE6WaHxQ","type":"subtopic","position":{"x":327.50948132668987,"y":2287.0368559257836},"selected":true,"data":{"label":"AutoFixture","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":177,"height":49,"style":{"width":177,"height":49},"dragging":false,"positionAbsolute":{"x":327.50948132668987,"y":2287.0368559257836},"selectable":true,"focusable":true},{"id":"QERTjawqCCCkHfR44Ca0s","type":"subtopic","position":{"x":327.50948132668987,"y":2340.8339739890553},"selected":true,"data":{"label":"Bogus","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"left-center"}},"zIndex":999,"width":177,"height":49,"style":{"width":177,"height":49},"positionAbsolute":{"x":327.50948132668987,"y":2340.8339739890553},"dragging":false,"selectable":true,"focusable":true},{"id":"37c2eCvRdebztkbc5AjYp","type":"topic","position":{"x":17.45423833729052,"y":2063.676280366376},"selected":true,"data":{"label":"Microservices","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"KIFmahcNiSo2NGoLtAyRR"},"zIndex":999,"width":167,"height":49,"style":{"width":167,"height":49},"positionAbsolute":{"x":17.45423833729052,"y":2063.676280366376},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"_cHDH4bo1Q_Ru9iuKaPQa","type":"label","position":{"x":362.0094813266899,"y":1817.460323803236},"selected":true,"data":{"label":"E2E Testing","href":"","color":"#000000","style":{"fontSize":17},"oldId":"GbK3uwt1x7Bp_rSXCHYwL"},"zIndex":999,"width":108,"height":36,"style":{},"positionAbsolute":{"x":362.0094813266899,"y":1817.460323803236},"dragging":false,"selectable":true,"focusable":true},{"id":"FjpBEi77yGh9oSsHdh7mf","type":"label","position":{"x":558.7293649548313,"y":1817.460323803236},"selected":true,"data":{"label":"Integration Testing","href":"","color":"#000000","style":{"fontSize":17},"oldId":"nYOf8Q0lWnzBdGRHbdwwq"},"zIndex":999,"width":159,"height":36,"style":{},"positionAbsolute":{"x":558.7293649548313,"y":1817.460323803236},"dragging":false,"selectable":true,"focusable":true},{"id":"8sr7NcSsrn67x75-vYLNQ","type":"label","position":{"x":344.00948132668987,"y":2050.250904410703},"selected":true,"data":{"label":"Behavior Testing","href":"","color":"#000000","style":{"fontSize":17},"oldId":"GbK3uwt1x7Bp_rSXCHYwL"},"zIndex":999,"width":144,"height":36,"style":{},"positionAbsolute":{"x":344.00948132668987,"y":2050.250904410703},"dragging":false,"selectable":true,"focusable":true},{"id":"GbK3uwt1x7Bp_rSXCHYwL","type":"label","position":{"x":323.50948132668987,"y":2236.563695311414},"selected":true,"data":{"label":"Fake Data Generation","href":"","color":"#000000","style":{"fontSize":17},"oldId":"FjpBEi77yGh9oSsHdh7mf"},"zIndex":999,"width":185,"height":36,"style":{},"positionAbsolute":{"x":323.50948132668987,"y":2236.563695311414},"dragging":false,"selectable":true,"focusable":true},{"id":"eMolc0UKdEgLDFJ2FximV","type":"label","position":{"x":-232.74239716008708,"y":2052.181173440632},"selected":true,"data":{"label":"Message Brokers","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":151,"height":36,"style":{},"positionAbsolute":{"x":-232.74239716008708,"y":2052.181173440632},"dragging":false,"selectable":true,"focusable":true},{"id":"sNYYEBMHV_NO_NToP51VY","type":"subtopic","position":{"x":-265.73144955169835,"y":2099.622670740455},"selected":true,"data":{"label":"ActiveMQ","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"zgW3oGPdbclWTlKJdidiB","label":"Optional / Learn anytime","color":"#999999","position":"left-center"}},"zIndex":999,"width":109,"height":49,"style":{"width":109,"height":49},"positionAbsolute":{"x":-265.73144955169835,"y":2099.622670740455},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"L8RkeMYm0WGNeLLcHKF1R","type":"subtopic","position":{"x":-152.38897900509676,"y":2098.622670740455},"selected":true,"data":{"label":"Kafka","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"right-center"}},"zIndex":999,"width":100,"height":50,"style":{"width":100,"height":50},"positionAbsolute":{"x":-152.38897900509676,"y":2098.622670740455},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"KqvBn2_wvYhFdv0dBZMC9","type":"subtopic","position":{"x":-265.73144955169835,"y":2153.622670740455},"selected":true,"data":{"label":"RabbitMQ","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":109,"height":49,"style":{"width":109,"height":49},"positionAbsolute":{"x":-265.73144955169835,"y":2153.622670740455},"dragging":false,"resizing":true,"selectable":true,"focusable":true},{"id":"8d4f7_3VO03vy7YDWwPI9","type":"subtopic","position":{"x":-152.73144955169835,"y":2153.622670740455},"selected":true,"data":{"label":"NetMQ","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"positionAbsolute":{"x":-152.73144955169835,"y":2153.622670740455},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"gBuaVZfqJ0-g21sKohQtx","type":"subtopic","position":{"x":-265.73144955169835,"y":2205.56858838567},"selected":true,"data":{"label":"Azuer Service Bus","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"zgW3oGPdbclWTlKJdidiB","label":"Optional / Learn anytime","color":"#999999","position":"left-center"}},"zIndex":999,"width":213,"height":49,"style":{"width":213,"height":49},"positionAbsolute":{"x":-265.73144955169835,"y":2205.56858838567},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"X0hmqW8LAkhBGprxP8iBo","type":"label","position":{"x":-222.74239716008708,"y":2268.838867063311},"selected":true,"data":{"label":"Message Bus","href":"","color":"#000000","style":{"fontSize":17},"oldId":"Kq2TQn9DN1bIy9fWSSCkP"},"zIndex":999,"width":121,"height":36,"style":{},"positionAbsolute":{"x":-222.74239716008708,"y":2268.838867063311},"dragging":false,"selectable":true,"focusable":true},{"id":"SQKIUa_UsJ4cls-Vs9yHU","type":"subtopic","position":{"x":-263.84712995368886,"y":2357.838867063311},"selected":true,"data":{"label":"Mass Transit","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":213,"height":49,"style":{"width":213,"height":49},"dragging":false,"positionAbsolute":{"x":-263.84712995368886,"y":2357.838867063311},"selectable":true,"focusable":true},{"id":"vf8W1FLhcb3awx4JBaY5r","type":"subtopic","position":{"x":-263.84712995368886,"y":2304.838867063311},"selected":true,"data":{"label":"NServiceBus","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"left-center"}},"zIndex":999,"width":213,"height":49,"style":{"width":213,"height":49},"dragging":false,"positionAbsolute":{"x":-263.84712995368886,"y":2304.838867063311},"selectable":true,"focusable":true},{"id":"X6iSHoHnFFMaGb6YPQFhl","type":"subtopic","position":{"x":-263.84712995368886,"y":2410.838867063311},"selected":true,"data":{"label":"EasyNetQ","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"02rtFStTeIm8prNskxaUN","legend":{"id":"zgW3oGPdbclWTlKJdidiB","label":"Optional / Learn anytime","color":"#999999","position":"left-center"}},"zIndex":999,"width":213,"height":49,"style":{"width":213,"height":49},"positionAbsolute":{"x":-263.84712995368886,"y":2410.838867063311},"dragging":false,"selectable":true,"focusable":true},{"id":"TY3iovpKLvTqPQmbQFTRW","type":"label","position":{"x":-220.21191851316905,"y":2470.937760229362},"selected":true,"data":{"label":"API Gateway","href":"","color":"#000000","style":{"fontSize":17},"oldId":"Kq2TQn9DN1bIy9fWSSCkP"},"zIndex":999,"width":113,"height":36,"style":{},"positionAbsolute":{"x":-220.21191851316905,"y":2470.937760229362},"dragging":false,"selectable":true,"focusable":true},{"id":"2k-rGuhYTTAR9XN3aDAnW","type":"subtopic","position":{"x":-264.38897900509687,"y":2510.049532546853},"selected":true,"data":{"label":"Ocelot","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":108,"height":49,"style":{"width":108,"height":49},"positionAbsolute":{"x":-264.38897900509687,"y":2510.049532546853},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"2axfolu26P8XwxMxgMaS3","type":"subtopic","position":{"x":-153.38897900509676,"y":2510.049532546853},"selected":true,"data":{"label":"YARP","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":102,"height":49,"style":{"width":102,"height":49},"positionAbsolute":{"x":-153.38897900509676,"y":2510.049532546853},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"4ObSoVqiiYzV_Ph0UdSr-","type":"label","position":{"x":-233.24239716008708,"y":2568.739205506869},"selected":true,"data":{"label":"Containerization","href":"","color":"#000000","style":{"fontSize":17},"oldId":"Kq2TQn9DN1bIy9fWSSCkP"},"zIndex":999,"width":142,"height":36,"style":{},"positionAbsolute":{"x":-233.24239716008708,"y":2568.739205506869},"dragging":false,"selectable":true,"focusable":true},{"id":"rmRESzLiZNWdBFXLrwQFJ","type":"subtopic","position":{"x":-263.7423971600871,"y":2604.739205506869},"selected":true,"data":{"label":"Docker","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"02rtFStTeIm8prNskxaUN","legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":213,"height":49,"style":{"width":213,"height":49},"positionAbsolute":{"x":-263.7423971600871,"y":2604.739205506869},"dragging":false,"selectable":true,"focusable":true},{"id":"02rtFStTeIm8prNskxaUN","type":"subtopic","position":{"x":-263.7423971600871,"y":2658.739205506869},"selected":true,"data":{"label":"Kubernetes","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":213,"height":49,"style":{"width":213,"height":49},"positionAbsolute":{"x":-263.7423971600871,"y":2658.739205506869},"dragging":false,"selectable":true,"focusable":true},{"id":"Kq2TQn9DN1bIy9fWSSCkP","type":"label","position":{"x":-192.8408171232163,"y":2721.005494878551},"selected":true,"data":{"label":"Other","href":"","color":"#000000","style":{"fontSize":17},"oldId":"eMolc0UKdEgLDFJ2FximV"},"zIndex":999,"width":60,"height":36,"style":{},"positionAbsolute":{"x":-192.8408171232163,"y":2721.005494878551},"dragging":false,"selectable":true,"focusable":true},{"id":"HqhqqiA5X00Xl1RnZgrNJ","type":"subtopic","position":{"x":-263.7423971600871,"y":2767.6564093838533},"selected":true,"data":{"label":".NET Aspire","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"IHY9uL3dzYmf2D2wWgIh-","legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"left-center"}},"zIndex":999,"width":213,"height":49,"style":{"width":213,"height":49},"dragging":false,"resizing":false,"positionAbsolute":{"x":-263.7423971600871,"y":2767.6564093838533},"selectable":true,"focusable":true},{"id":"XKsLqDDco5OXKURCcWAmv","type":"subtopic","position":{"x":-263.7423971600871,"y":2821.6564093838533},"selected":true,"data":{"label":"Orleans","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"s8evqe2MireS1UhxoXrd1","legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"left-center"}},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"resizing":true,"positionAbsolute":{"x":-263.7423971600871,"y":2821.6564093838533},"dragging":false,"selectable":true,"focusable":true},{"id":"s8evqe2MireS1UhxoXrd1","type":"subtopic","position":{"x":-158.74239716008708,"y":2821.6564093838533},"selected":true,"data":{"label":"SteelToe","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"zgW3oGPdbclWTlKJdidiB","label":"Optional / Learn anytime","color":"#999999","position":"right-center"}},"zIndex":999,"width":106,"height":49,"style":{"width":106,"height":49},"resizing":false,"positionAbsolute":{"x":-158.74239716008708,"y":2821.6564093838533},"dragging":false,"selectable":true,"focusable":true},{"id":"IHY9uL3dzYmf2D2wWgIh-","type":"subtopic","position":{"x":-263.7423971600871,"y":2877.548245909759},"selected":true,"data":{"label":"Dapr","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"zgW3oGPdbclWTlKJdidiB","label":"Optional / Learn anytime","color":"#999999","position":"right-center"}},"zIndex":999,"width":213,"height":49,"style":{"width":213,"height":49},"dragging":false,"resizing":false,"positionAbsolute":{"x":-263.7423971600871,"y":2877.548245909759},"selectable":true,"focusable":true},{"id":"KIFmahcNiSo2NGoLtAyRR","type":"topic","position":{"x":7.454238337290576,"y":2473.154603018019},"selected":true,"data":{"label":"CI / CD","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":187,"height":49,"style":{"width":187,"height":49},"positionAbsolute":{"x":7.454238337290576,"y":2473.154603018019},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"0-PLMXGlRyRzTk-EjXMs2","type":"subtopic","position":{"x":129.19572608840792,"y":2215.258261345686},"selected":true,"data":{"label":"GitHub Actions","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"8Y73Ae32eo6_ye7dw5QRQ","legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":164,"height":49,"style":{"width":164,"height":49},"positionAbsolute":{"x":129.19572608840792,"y":2215.258261345686},"dragging":false,"selectable":true,"focusable":true},{"id":"_-GQNpsb7KZw76hNNOq3h","type":"subtopic","position":{"x":129.19572608840792,"y":2268.258261345686},"selected":true,"data":{"label":"Azure Pipelines","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"8Y73Ae32eo6_ye7dw5QRQ","legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"right-center"}},"zIndex":999,"width":164,"height":49,"style":{"width":164,"height":49},"positionAbsolute":{"x":129.19572608840792,"y":2268.258261345686},"dragging":false,"selectable":true,"focusable":true},{"id":"8Y73Ae32eo6_ye7dw5QRQ","type":"subtopic","position":{"x":129.19572608840792,"y":2321.258261345686},"selected":true,"data":{"label":"GitLab CI/CD","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"right-center"}},"zIndex":999,"width":164,"height":49,"style":{"width":164,"height":49},"positionAbsolute":{"x":129.19572608840792,"y":2321.258261345686},"dragging":false,"selectable":true,"focusable":true},{"id":"KyGjXgG6JFo42qOV0wqfB","type":"subtopic","position":{"x":129.19572608840792,"y":2374.258261345686},"selected":true,"data":{"label":"Circle CI","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"right-center"}},"zIndex":999,"width":164,"height":49,"style":{"width":164,"height":49},"positionAbsolute":{"x":129.19572608840792,"y":2374.258261345686},"dragging":false,"selectable":true,"focusable":true},{"id":"RX_6yD1QGLEGwV4j6z_g-","type":"button","position":{"x":301.96419656583225,"y":2473.154603018019},"selected":true,"data":{"label":"Software Design and Architecture","href":"https://roadmap.sh/software-design-architecture","color":"#ffffff","backgroundColor":"#2a79e4","style":{"fontSize":17}},"zIndex":999,"width":302,"height":49,"style":{"width":302,"height":49},"positionAbsolute":{"x":301.96419656583225,"y":2473.154603018019},"dragging":false,"selectable":true,"focusable":true},{"id":"C85aJvrzj6rP2Hmfj9uPB","type":"topic","position":{"x":356.96419656583225,"y":2654.6289816349786},"selected":true,"data":{"label":"Template Engines","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"1YL7aXluINOO15W3waaiD"},"zIndex":999,"width":192,"height":49,"style":{"width":192,"height":49},"positionAbsolute":{"x":356.96419656583225,"y":2654.6289816349786},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"nUE2-egUMNFQoPVrVRFPl","type":"subtopic","position":{"x":76.43680101835645,"y":2604.2447426406907},"selected":true,"data":{"label":"Razor","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"right-center"}},"zIndex":999,"width":177,"height":49,"style":{"width":177,"height":49},"positionAbsolute":{"x":76.43680101835645,"y":2604.2447426406907},"dragging":false,"selectable":true,"focusable":true},{"id":"dWB5OCvWVYkD30Op_dMwy","type":"subtopic","position":{"x":76.43680101835645,"y":2657.2447426406907},"selected":true,"data":{"label":"Scriban","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"zgW3oGPdbclWTlKJdidiB","label":"Optional / Learn anytime","color":"#999999","position":"right-center"}},"zIndex":999,"width":177,"height":49,"style":{"width":177,"height":49},"positionAbsolute":{"x":76.43680101835645,"y":2657.2447426406907},"dragging":false,"selectable":true,"focusable":true},{"id":"ZaOhWWDgVxrn0hbesJ7xT","type":"subtopic","position":{"x":76.43680101835645,"y":2710.2447426406907},"selected":true,"data":{"label":"Fluid","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"zgW3oGPdbclWTlKJdidiB","label":"Optional / Learn anytime","color":"#999999","position":"right-center"}},"zIndex":999,"width":177,"height":49,"style":{"width":177,"height":49},"resizing":false,"positionAbsolute":{"x":76.43680101835645,"y":2710.2447426406907},"dragging":false,"selectable":true,"focusable":true},{"id":"1YL7aXluINOO15W3waaiD","type":"topic","position":{"x":356.96419656583225,"y":2710.2447426406907},"selected":true,"data":{"label":"Frameworks","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":192,"height":49,"style":{"width":192,"height":49},"positionAbsolute":{"x":356.96419656583225,"y":2710.2447426406907},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"o2oks1bG_-8InCKVol_s3","type":"label","position":{"x":369.96419656583225,"y":2605.7447426406907},"selected":true,"data":{"label":"Client-Side .NET","href":"","color":"#000000","style":{"fontSize":20},"oldId":"nw-pE4itvz1D7BWtyx5cm"},"zIndex":999,"width":166,"height":36,"style":{},"positionAbsolute":{"x":369.96419656583225,"y":2605.7447426406907},"dragging":false,"selectable":true,"focusable":true},{"id":"4iD_hDtgJ15IlJGxiO-E8","type":"subtopic","position":{"x":625.7530528135321,"y":2657.2447426406907},"selected":true,"data":{"label":"Blazor","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":138,"height":49,"style":{"width":138,"height":49},"positionAbsolute":{"x":625.7530528135321,"y":2657.2447426406907},"dragging":false,"selectable":true,"focusable":true},{"id":"olqSPUU3RoxhQ6exfMzeN","type":"subtopic","position":{"x":625.7530528135321,"y":2710.2447426406907},"selected":true,"data":{"label":".NET MAUI","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"right-center"}},"zIndex":999,"width":138,"height":49,"style":{"width":138,"height":49},"positionAbsolute":{"x":625.7530528135321,"y":2710.2447426406907},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"ao7YnoJ31qQxcItMY8XJU","type":"vertical","position":{"x":430.5766878818748,"y":2504.6289816349786},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.75}},"zIndex":999,"width":20,"height":85,"style":{"width":20,"height":85},"positionAbsolute":{"x":430.5766878818748,"y":2504.6289816349786},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"nw-pE4itvz1D7BWtyx5cm","type":"label","position":{"x":340.96419656583225,"y":2866.0426302976452},"selected":true,"data":{"label":"Good-to-Know Libraries","href":"","color":"#000000","style":{"fontSize":20}},"zIndex":999,"width":231,"height":36,"style":{},"positionAbsolute":{"x":340.96419656583225,"y":2866.0426302976452},"dragging":false,"selectable":true,"focusable":true},{"id":"Zb4Gugxf7d6MoeEcfngrV","type":"subtopic","position":{"x":44.10695532015461,"y":2803.2129376580287},"selected":true,"data":{"label":"Scalar","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"resizing":false,"positionAbsolute":{"x":44.10695532015461,"y":2803.2129376580287},"dragging":false,"selectable":true,"focusable":true},{"id":"cc0UNQwbDlySue-CvpChR","type":"subtopic","position":{"x":151.82344177403695,"y":2803.2129376580287},"selected":true,"data":{"label":"MediatR","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"right-center"}},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"positionAbsolute":{"x":151.82344177403695,"y":2803.2129376580287},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"sa0zXd8lpNs_SFQ2y-PY4","type":"subtopic","position":{"x":44.10695532015461,"y":2856.2129376580287},"selected":true,"data":{"label":"FluentValidation","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion","position":"left-center"}},"zIndex":999,"width":207,"height":49,"style":{"width":207,"height":49},"positionAbsolute":{"x":44.10695532015461,"y":2856.2129376580287},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"gQhiEpvx__70N1WbEHGYJ","type":"subtopic","position":{"x":44.10695532015461,"y":2909.2129376580287},"selected":true,"data":{"label":"Polly","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"EsC1JwFOMOlQVelpmxISh","legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"left-center"}},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"positionAbsolute":{"x":44.10695532015461,"y":2909.2129376580287},"dragging":false,"selectable":true,"focusable":true},{"id":"ipb6proIZKG-_vCOMAiBu","type":"subtopic","position":{"x":151.82344177403695,"y":2910.2477050182865},"selected":true,"data":{"label":"Marten","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"legend":{"id":"zgW3oGPdbclWTlKJdidiB","label":"Optional / Learn anytime","color":"#999999","position":"right-center"}},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"positionAbsolute":{"x":151.82344177403695,"y":2910.2477050182865},"dragging":false,"selectable":true,"focusable":true},{"id":"EsC1JwFOMOlQVelpmxISh","type":"subtopic","position":{"x":43.6576825168454,"y":2962.2129376580287},"selected":true,"data":{"label":"Nuke","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"ipb6proIZKG-_vCOMAiBu","legend":{"id":"zgW3oGPdbclWTlKJdidiB","label":"Optional / Learn anytime","color":"#999999","position":"left-center"}},"zIndex":999,"width":207,"height":49,"style":{"width":207,"height":49},"positionAbsolute":{"x":43.6576825168454,"y":2962.2129376580287},"dragging":false,"selectable":true,"focusable":true},{"id":"9LEVN-uVEwxJooEiB9ApK","type":"subtopic","position":{"x":44.10695532015461,"y":3015.2129376580287},"selected":true,"data":{"label":"Benchmark.NET","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"T2FsSndxzSuKTFdjoyPi-","legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"left-center"}},"zIndex":999,"width":207,"height":49,"style":{"width":207,"height":49},"positionAbsolute":{"x":44.10695532015461,"y":3015.2129376580287},"dragging":false,"selectable":true,"focusable":true},{"id":"T2FsSndxzSuKTFdjoyPi-","type":"subtopic","position":{"x":44.10695532015461,"y":3069.2129376580287},"selected":true,"data":{"label":"Distributed Lock","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"EsC1JwFOMOlQVelpmxISh","legend":{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500","position":"left-center"}},"zIndex":999,"width":207,"height":49,"style":{"width":207,"height":49},"positionAbsolute":{"x":44.10695532015461,"y":3069.2129376580287},"dragging":false,"selectable":true,"focusable":true},{"id":"Gc82P2ClaRuPMM1N6k2bN","type":"horizontal","position":{"x":262.57187640085726,"y":2873.7129376580287},"selected":true,"data":{"label":"horizontal node","style":{"stroke":"#2B78E4","strokeWidth":3.75}},"zIndex":999,"width":62,"height":20,"style":{"width":62,"height":20},"positionAbsolute":{"x":262.57187640085726,"y":2873.7129376580287},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"wyzDVcQ87PRh0y2LIfvSU","type":"vertical","position":{"x":433.5766878818748,"y":2926.548245909759},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.75}},"zIndex":999,"width":20,"height":80,"style":{"width":20,"height":80},"positionAbsolute":{"x":433.5766878818748,"y":2926.548245909759},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"q2z_1wnPUnWM7MYIIUyBg","type":"legend","position":{"x":-279.20291471146976,"y":-129.55580566097228},"selected":true,"data":{"label":"","legends":[{"id":"FURC-X3vopFKhZ0F5BdYH","color":"#2b78e4","label":"Personal Recommendation / Opinion"},{"id":"sRAiZODQQ8xrMiVpCdnI7","label":"Alternative Options","color":"#6d7500"},{"id":"zgW3oGPdbclWTlKJdidiB","label":"Optional / Learn anytime","color":"#999999"}]},"zIndex":999,"width":351,"height":130,"positionAbsolute":{"x":-279.20291471146976,"y":-129.55580566097228},"dragging":false,"style":{"width":351,"height":130},"resizing":false,"selectable":true,"focusable":true},{"id":"2zqZkyVgigifcRS1H7F_b","type":"button","position":{"x":-278.429978402122,"y":55.94269326868894},"selected":true,"data":{"label":"Moien Tajik","href":"https://github.com/MoienTajik","color":"#000000","backgroundColor":"#d1d1d1","style":{"fontSize":17},"borderColor":"#D1D1D1"},"zIndex":999,"width":351,"height":49,"dragging":false,"style":{"width":351,"height":49},"resizing":false,"positionAbsolute":{"x":-278.429978402122,"y":55.94269326868894},"selectable":true,"focusable":true},{"id":"azsxJoFI1qHGwcNGw8c28","type":"label","position":{"x":-280.929978402122,"y":14.90074822234891},"selected":true,"data":{"label":"Special thanks for the roadmap contribution","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":351,"height":36,"positionAbsolute":{"x":-280.929978402122,"y":14.90074822234891},"dragging":false,"selectable":true,"focusable":true},{"id":"236VJJjMvqHfSj-MHSDPV","type":"subtopic","position":{"x":516.9641965658323,"y":2095.5613753534185},"selected":true,"data":{"label":"MSTest","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"qHYBlBCvCGUZGh6gyEI63","legend":{"id":"zgW3oGPdbclWTlKJdidiB","label":"Optional / Learn anytime","color":"#999999","position":"right-center"}},"zIndex":999,"width":80,"height":49,"style":{"width":80,"height":49},"positionAbsolute":{"x":516.9641965658323,"y":2095.5613753534185},"dragging":false,"selectable":true,"focusable":true,"resizing":false}],"edges":[{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"iogwMmOvub2ZF4zgg6WyF","sourceHandle":"x2","target":"_hYN0gEi9BL24nptEtXWU","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"XX0I26JoVMVXIe_7bVMix","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"z2","target":"idLHBxhvcIqZTqmh_E8Az","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"dFn6kGOoJ-0BzJJEb9DSG","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"z2","target":"os3Pa6W9SSNEzgmlBbglQ","targetHandle":"y2","data":{"edgeStyle":"dashed"},"id":"arkF7QJJRbCBYWp0crqa2","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"z2","target":"3oInpqvTSSC5_K6i7j8N7","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"HNVw8OboycWKLEtEbG2bn","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"z2","target":"YKhuRbcUFzo0hTvuTq-Yl","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"auB7Png72XjmhcLr3IJA7","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"jZ67HhVRelJaxjsCckSSI","sourceHandle":"x2","target":"hWA7RtuqltMTmHdcCnmES","targetHandle":"y1","data":{"edgeStyle":"solid"},"id":"2aoDIr80lXSJLW1hIGUkb","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"sourceHandle":"z2","target":"NMznG9mo2wzNFnjhg990f","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"m-_y7nLeYFkUKGiacxWA0","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"sourceHandle":"z2","target":"gc_7cuIO2_joKlQRAPDfX","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"G7pXuJfkyt2nWAOHU8yV0","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"rrrvATyhXqRgJGWI3z0WF","sourceHandle":"x2","target":"AvbMQ5vY3ip1oX_6Yq4ie","targetHandle":"w2","data":{"edgeStyle":"dashed"},"id":"2_6Yz3-Agx9_rEN5xW86c","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"hWA7RtuqltMTmHdcCnmES","sourceHandle":"w2","target":"1AJv95mTLpR7L8KBoGym8","targetHandle":"x1","data":{"edgeStyle":"dashed"},"id":"kgMI98fg2-mKMgUs0wnjD","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"hWA7RtuqltMTmHdcCnmES","sourceHandle":"y2","target":"0etAs56EeBfh_0IlAaSra","targetHandle":"w1","data":{"edgeStyle":"solid"},"selected":true,"id":"ts38Q2ceHs60TJscUBZVE","focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"jZ67HhVRelJaxjsCckSSI","sourceHandle":"y2","target":"h6ceO0kiBIxNRkPzN3hBY","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"ZiMV7umyPdhy3JJDcopR-","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"jZ67HhVRelJaxjsCckSSI","sourceHandle":"y2","target":"_JlT9oKQ6Yu4UX6l19G8P","targetHandle":"z2","data":{"edgeStyle":"dashed"},"id":"WI-MhbxrehFcVwyGJ5CQJ","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"x2","target":"jZ67HhVRelJaxjsCckSSI","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"qUrLBzvXvJOg53HBfjrOI","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"Ji35JsKgUQXN4DJGEgTAC","sourceHandle":"x2","target":"t3Op8UcgDKVeMLNMDePrW","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-Ji35JsKgUQXN4DJGEgTACx2-t3Op8UcgDKVeMLNMDePrWw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"Ji35JsKgUQXN4DJGEgTAC","sourceHandle":"x2","target":"c2YZ7PPCX1jF_RU7C0AqN","targetHandle":"w2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-Ji35JsKgUQXN4DJGEgTACx2-c2YZ7PPCX1jF_RU7C0AqNw2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"KMA7NkxFbPoUDtFnGBFnj","sourceHandle":"x2","target":"0vLaVNJaJSHZ_bHli6Qzs","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-KMA7NkxFbPoUDtFnGBFnjx2-0vLaVNJaJSHZ_bHli6Qzsw1","selected":true,"type":"simplebezier","focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"DYkdM_L7T2GcTPAoZNnUR","sourceHandle":"x2","target":"0vLaVNJaJSHZ_bHli6Qzs","targetHandle":"z1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-DYkdM_L7T2GcTPAoZNnURx2-0vLaVNJaJSHZ_bHli6Qzsz1","selected":true,"type":"smoothstep","selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"NvODRFR0DLINB0RlPSsvt","sourceHandle":"z2","target":"fxANnSiTb2VzA9u-YeBL1","targetHandle":"y2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-NvODRFR0DLINB0RlPSsvtz2-fxANnSiTb2VzA9u-YeBL1y2","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"NvODRFR0DLINB0RlPSsvt","sourceHandle":"z2","target":"3GGvuxdfuDwLpNX_gtjCK","targetHandle":"y2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-NvODRFR0DLINB0RlPSsvtz2-3GGvuxdfuDwLpNX_gtjCKy2","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"NEnna_8DstfYH4T9qrP3-","sourceHandle":"y2","target":"OtdCmkj0SvrGwCUSfm96C","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-NEnna_8DstfYH4T9qrP3-y2-OtdCmkj0SvrGwCUSfm96Cz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"NEnna_8DstfYH4T9qrP3-","sourceHandle":"y2","target":"KAZF-mIg-FlfMonfdOLhb","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-NEnna_8DstfYH4T9qrP3-y2-KAZF-mIg-FlfMonfdOLhbz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"NEnna_8DstfYH4T9qrP3-","sourceHandle":"y2","target":"YI3cAezupWNntFw4B6elY","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-NEnna_8DstfYH4T9qrP3-y2-YI3cAezupWNntFw4B6elYz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"NEnna_8DstfYH4T9qrP3-","sourceHandle":"y2","target":"RAX2xN37taw9cqA3pnORh","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-NEnna_8DstfYH4T9qrP3-y2-RAX2xN37taw9cqA3pnORhz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"NEnna_8DstfYH4T9qrP3-","sourceHandle":"x2","target":"tnKUdsgp6bnFtQTexEmfy","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-NEnna_8DstfYH4T9qrP3-x2-tnKUdsgp6bnFtQTexEmfyw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"tnKUdsgp6bnFtQTexEmfy","sourceHandle":"z2","target":"aOJMVrTcA_I2y_QHzj7aM","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-tnKUdsgp6bnFtQTexEmfyz2-aOJMVrTcA_I2y_QHzj7aMy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"tnKUdsgp6bnFtQTexEmfy","sourceHandle":"z2","target":"zlAcgLKxGF_TyrcJIk4X7","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-tnKUdsgp6bnFtQTexEmfyz2-zlAcgLKxGF_TyrcJIk4X7y1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"tnKUdsgp6bnFtQTexEmfy","sourceHandle":"z2","target":"ZiK-c9zNbi5RZkKUi44wP","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-tnKUdsgp6bnFtQTexEmfyz2-ZiK-c9zNbi5RZkKUi44wPy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"tnKUdsgp6bnFtQTexEmfy","sourceHandle":"z2","target":"1-XdtrGPbUoxpu9ZcQlBA","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-tnKUdsgp6bnFtQTexEmfyz2-1-XdtrGPbUoxpu9ZcQlBAy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"tnKUdsgp6bnFtQTexEmfy","sourceHandle":"z2","target":"2f_CJMnXwPxjMEwm5P_QJ","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-tnKUdsgp6bnFtQTexEmfyz2-2f_CJMnXwPxjMEwm5P_QJy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"tnKUdsgp6bnFtQTexEmfy","sourceHandle":"y2","target":"v2ZTCQQFQPoJNhOVGMG2g","targetHandle":"z1","data":{"edgeStyle":"solid"},"selected":true,"id":"reactflow__edge-tnKUdsgp6bnFtQTexEmfyy2-v2ZTCQQFQPoJNhOVGMG2gz1","selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"NvODRFR0DLINB0RlPSsvt","sourceHandle":"z2","target":"R7Qk5hsEIl9dspQXdaJAJ","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-NvODRFR0DLINB0RlPSsvtz2-R7Qk5hsEIl9dspQXdaJAJy1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"v2ZTCQQFQPoJNhOVGMG2g","sourceHandle":"z2","target":"POQPoN98eqOH2873ZI6Hm","targetHandle":"y1","data":{"edgeStyle":"solid"},"selected":true,"focusable":true,"id":"reactflow__edge-v2ZTCQQFQPoJNhOVGMG2gz2-POQPoN98eqOH2873ZI6Hmy1","selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"IejHMMVKwA0sIInla4FjX","sourceHandle":"z2","target":"Tjaczp2E-cCn0qSv89xgo","targetHandle":"y1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-7Nth4LOrM_KirhvjDGkgSz2-Tjaczp2E-cCn0qSv89xgoy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"7Nth4LOrM_KirhvjDGkgS","sourceHandle":"y2","target":"FV4GsPjUyAc99DnIwkkCC","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-7Nth4LOrM_KirhvjDGkgSy2-FV4GsPjUyAc99DnIwkkCCz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"7Nth4LOrM_KirhvjDGkgS","sourceHandle":"w2","target":"8CRsr7UZszjc_fZ-4ZmIx","targetHandle":"x1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-7Nth4LOrM_KirhvjDGkgSw2-8CRsr7UZszjc_fZ-4ZmIxx1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"Ujzn_dILCA7xoupnz398l","sourceHandle":"x2","target":"fQ3w8REYWzQfeJ0nPyq6W","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-Ujzn_dILCA7xoupnz398lx2-fQ3w8REYWzQfeJ0nPyq6Ww1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"9Vv3OxafB6BlHhi1ZkeVO","sourceHandle":"y2","target":"tBl8neu3tJd5GPwGfJbjZ","targetHandle":"z2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-9Vv3OxafB6BlHhi1ZkeVOy2-tBl8neu3tJd5GPwGfJbjZz2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"9Vv3OxafB6BlHhi1ZkeVO","sourceHandle":"y2","target":"8dvd4M0TKNyQR8dEolGNT","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-9Vv3OxafB6BlHhi1ZkeVOy2-8dvd4M0TKNyQR8dEolGNTz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"9Vv3OxafB6BlHhi1ZkeVO","sourceHandle":"x2","target":"9ECykIIvXlDblbFbRVcJS","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-9Vv3OxafB6BlHhi1ZkeVOx2-s57tKy1rajlJbKFDVXLqsw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"9ECykIIvXlDblbFbRVcJS","sourceHandle":"z2","target":"GPmlueMnuLCUW_t4jvGhc","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-s57tKy1rajlJbKFDVXLqsz2-GPmlueMnuLCUW_t4jvGhcy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"9ECykIIvXlDblbFbRVcJS","sourceHandle":"z2","target":"x0OopRTwIvoWgT8qi0CE9","targetHandle":"y2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-s57tKy1rajlJbKFDVXLqsz2-x0OopRTwIvoWgT8qi0CE9y2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"9ECykIIvXlDblbFbRVcJS","sourceHandle":"z2","target":"oMMBzRrHkUymxAR4oqr75","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-s57tKy1rajlJbKFDVXLqsz2-oMMBzRrHkUymxAR4oqr75y1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"9ECykIIvXlDblbFbRVcJS","sourceHandle":"x2","target":"s57tKy1rajlJbKFDVXLqs","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-9ECykIIvXlDblbFbRVcJSx2-s57tKy1rajlJbKFDVXLqsw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"s57tKy1rajlJbKFDVXLqs","sourceHandle":"y2","target":"QiQsx1udyKcPJ-lZjRQVy","targetHandle":"z2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-s57tKy1rajlJbKFDVXLqsy2-QiQsx1udyKcPJ-lZjRQVyz2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"s57tKy1rajlJbKFDVXLqs","sourceHandle":"y2","target":"p3bZnKIyRgLmB764Kkhju","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-s57tKy1rajlJbKFDVXLqsy2-p3bZnKIyRgLmB764Kkhjuz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"s57tKy1rajlJbKFDVXLqs","sourceHandle":"y2","target":"zOWlPXIl4XPs_0pA8-yi5","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-s57tKy1rajlJbKFDVXLqsy2-zOWlPXIl4XPs_0pA8-yi5z1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"s57tKy1rajlJbKFDVXLqs","sourceHandle":"x2","target":"XofWWhlU_vWCG5oXVMZze","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-s57tKy1rajlJbKFDVXLqsx2-KIFmahcNiSo2NGoLtAyRRw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"XofWWhlU_vWCG5oXVMZze","sourceHandle":"x2","target":"37c2eCvRdebztkbc5AjYp","targetHandle":"w2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-XofWWhlU_vWCG5oXVMZzex2-KIFmahcNiSo2NGoLtAyRRw2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"Z-zHIbLBy7cqcDu_QEJIn","sourceHandle":"y2","target":"WSrbHa0mKIQs33vEJHp15","targetHandle":"x2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-Z-zHIbLBy7cqcDu_QEJIny2-WSrbHa0mKIQs33vEJHp15x2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"37c2eCvRdebztkbc5AjYp","sourceHandle":"x2","target":"KIFmahcNiSo2NGoLtAyRR","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-37c2eCvRdebztkbc5AjYpx2-KIFmahcNiSo2NGoLtAyRRw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"KIFmahcNiSo2NGoLtAyRR","sourceHandle":"z2","target":"RX_6yD1QGLEGwV4j6z_g-","targetHandle":"y2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-KIFmahcNiSo2NGoLtAyRRz2-RX_6yD1QGLEGwV4j6z_g-y2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"C85aJvrzj6rP2Hmfj9uPB","sourceHandle":"y2","target":"nUE2-egUMNFQoPVrVRFPl","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-1YL7aXluINOO15W3waaiDy2-nUE2-egUMNFQoPVrVRFPlz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"C85aJvrzj6rP2Hmfj9uPB","sourceHandle":"y2","target":"dWB5OCvWVYkD30Op_dMwy","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-1YL7aXluINOO15W3waaiDy2-dWB5OCvWVYkD30Op_dMwyz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"C85aJvrzj6rP2Hmfj9uPB","sourceHandle":"y2","target":"ZaOhWWDgVxrn0hbesJ7xT","targetHandle":"z2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-1YL7aXluINOO15W3waaiDy2-ZaOhWWDgVxrn0hbesJ7xTz2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"RX_6yD1QGLEGwV4j6z_g-","sourceHandle":"x2","target":"ia7YtgDjVoLxFKtQZPqJD","targetHandle":"w1","data":{"edgeStyle":"solid"},"selected":true,"id":"reactflow__edge-RX_6yD1QGLEGwV4j6z_g-x2-ia7YtgDjVoLxFKtQZPqJDw1","selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"1YL7aXluINOO15W3waaiD","sourceHandle":"z2","target":"4iD_hDtgJ15IlJGxiO-E8","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-1YL7aXluINOO15W3waaiDz2-4iD_hDtgJ15IlJGxiO-E8y1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"1YL7aXluINOO15W3waaiD","sourceHandle":"z2","target":"olqSPUU3RoxhQ6exfMzeN","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-1YL7aXluINOO15W3waaiDz2-olqSPUU3RoxhQ6exfMzeNy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"NvODRFR0DLINB0RlPSsvt","sourceHandle":"x2","target":"NEnna_8DstfYH4T9qrP3-","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-NvODRFR0DLINB0RlPSsvtx2-NEnna_8DstfYH4T9qrP3-w1","selected":true,"selectable":true,"focusable":true}]}
\ No newline at end of file
diff --git a/src/data/roadmaps/aspnet-core/aspnet-core.md b/src/data/roadmaps/aspnet-core/aspnet-core.md
index 2feca453c..ab3c98bf6 100644
--- a/src/data/roadmaps/aspnet-core/aspnet-core.md
+++ b/src/data/roadmaps/aspnet-core/aspnet-core.md
@@ -2,6 +2,7 @@
 jsonUrl: '/jsons/roadmaps/aspnet-core.json'
 pdfUrl: '/pdfs/roadmaps/aspnet-core.pdf'
 order: 9
+renderer: 'editor'
 briefTitle: 'ASP.NET Core'
 briefDescription: 'Step by step guide to becoming an ASP.NET Core Developer in 2025'
 title: 'ASP.NET Core Developer'
@@ -10,7 +11,7 @@ isNew: false
 hasTopics: true
 dimensions:
   width: 968
-  height: 2773.45
+  height: 2920
 schema:
   headline: 'ASP.NET Core Developer Roadmap'
   description: 'Learn how to become a ASP.NET Core Developer with this interactive step by step guide in 2025. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place.'
diff --git a/src/data/roadmaps/aspnet-core/content/101-general-development-skills/101-azure-devops-services.md b/src/data/roadmaps/aspnet-core/content/101-general-development-skills/101-azure-devops-services.md
deleted file mode 100644
index 056f2905a..000000000
--- a/src/data/roadmaps/aspnet-core/content/101-general-development-skills/101-azure-devops-services.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Azure Devops Services
-
-Azure DevOps Services is a collection of services provided by Microsoft that can be used to plan, build, test, and deploy .NET applications. These services can be used together or independently to support various aspects of the software development process. Some of the main services include:
-
-- Azure Boards: Provides features for agile planning and tracking, such as backlogs, boards, and sprint planning.
-- Azure Repos: Provides source control management for Git and Team Foundation Version Control (TFVC) repositories.
-- Azure Artifacts: Provides package management for NuGet, npm, and Maven packages.
-- Azure Test Plans: Provides support for manual and exploratory testing, as well as continuous testing and testing in production.
-- Azure Pipeline: Provides a way to build, test, and deploy code automatically, with support for multiple languages and platforms, including .NET.
-
-These services can be used to create a full-featured development environment that can be used to manage all aspects of a software development project, from planning and design to testing and deployment.
-
-For more information, visit the following links:
-
-- [@article@Build, test, and deploy .NET Core apps](https://learn.microsoft.com/en-us/azure/devops/pipelines/ecosystems/dotnet-core?view=azure-devops\&tabs=dotnetfive)
-- [@article@Microsoft Azure DevOps for ASP .NET Core Web apps](https://techmindfactory.com/Microsoft-Azure-DevOps-for-ASP-.NET-Core-Web-apps/)
-- [@feed@Explore top posts about Azure](https://app.daily.dev/tags/azure?ref=roadmapsh)
diff --git a/src/data/roadmaps/aspnet-core/content/105-dependency-injection/101-di-containers/102-ninject.md b/src/data/roadmaps/aspnet-core/content/105-dependency-injection/101-di-containers/102-ninject.md
deleted file mode 100644
index bad4cf066..000000000
--- a/src/data/roadmaps/aspnet-core/content/105-dependency-injection/101-di-containers/102-ninject.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Ninject
-
-Ninject is an open-source dependency injection framework for .NET. It is designed to make it easier to manage the dependencies of an application by automatically resolving and managing the lifetime of objects and their dependencies.
-
-Ninject uses a technique called "binding" to define the objects and dependencies of an application. This is done by creating instances of the `StandardKernel` class and using its methods to register types, instances and factories. Then, the `Get()` method is called to resolve the dependencies throughout the application.
-
-For more information, visit the following resources:
-
-- [@official@Intro to Ninject](http://www.ninject.org/)
-- [@article@What is Ninject and when do you use it?](https://stackoverflow.com/questions/17375234/what-is-ninject-and-when-do-you-use-it)
-- [@article@How to use NInject?](https://www.infoworld.com/article/3191648/how-to-implement-di-in-webapi-using-ninject.html)
diff --git a/src/data/roadmaps/aspnet-core/content/105-dependency-injection/101-di-containers/103-castle-windsor.md b/src/data/roadmaps/aspnet-core/content/105-dependency-injection/101-di-containers/103-castle-windsor.md
deleted file mode 100644
index b137af3e9..000000000
--- a/src/data/roadmaps/aspnet-core/content/105-dependency-injection/101-di-containers/103-castle-windsor.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Castle Windsor
-
-Castle Windsor is an open-source dependency injection framework for .NET. It is designed to make it easier to manage the dependencies of an application by automatically resolving and managing the lifetime of objects and their dependencies.
-
-Castle Windsor uses a technique called "registration" to define the objects and dependencies of an application. This is done by creating instances of the `WindsorContainer` class and using its methods to register types, instances and factories. Then, the `Resolve()` method is called to resolve the dependencies throughout the application.
-
-Visit the following links for more resources:
-
-- [@article@Getting Started with Dependency Injection Using Castle Windsor](https://www.codementor.io/@copperstarconsulting/getting-started-with-dependency-injection-using-castle-windsor-4meqzcsvh)
-- [@article@What is Castle Windsor?](https://stackoverflow.com/questions/124871/what-is-castle-windsor-and-why-should-i-care)
-- [@article@Intro to Castle Windsor](http://www.castleproject.org/projects/windsor/)
diff --git a/src/data/roadmaps/aspnet-core/content/105-dependency-injection/101-di-containers/104-simple-injector.md b/src/data/roadmaps/aspnet-core/content/105-dependency-injection/101-di-containers/104-simple-injector.md
deleted file mode 100644
index ee53c224f..000000000
--- a/src/data/roadmaps/aspnet-core/content/105-dependency-injection/101-di-containers/104-simple-injector.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Simple Injector
-
-Simple Injector is an open-source dependency injection framework for .NET. It is designed to make it easy to manage the dependencies of an application by automatically resolving and managing the lifetime of objects and their dependencies.
-
-Simple Injector uses a technique called "registration" to define the objects and dependencies of an application. This is done by creating an instance of the `Container` class and using its methods to register types, instances and factories. Then, the `GetInstance()` method is called to resolve the dependencies throughout the application.
-
-For more information, visit the following resources:
-
-- [@article@How to use Simple Injector?](https://www.infoworld.com/article/3636242/how-to-use-simple-injector-in-aspnet-core-mvc.html)
-- [@article@Simple Injector's Documentation](https://docs.simpleinjector.org/en/latest/)
-- [@article@Example of Dependency Injection Using Simple Injector](https://www.c-sharpcorner.com/UploadFile/4d9083/dependency-injection-using-simple-injector/)
diff --git a/src/data/roadmaps/aspnet-core/content/106-caching/102-distributed-cache/101-redis/easy-caching.md b/src/data/roadmaps/aspnet-core/content/106-caching/102-distributed-cache/101-redis/easy-caching.md
deleted file mode 100644
index c8519a32d..000000000
--- a/src/data/roadmaps/aspnet-core/content/106-caching/102-distributed-cache/101-redis/easy-caching.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Easy Caching
-
-EasyCaching is an open-source caching library that contains basic usages and some advanced usages of caching which can help us to handle caching more easily.
-
-Visit the following resources to learn more:
-
-- [@article@Easy Caching using Redis](https://easycaching.readthedocs.io/en/latest/Redis/)
diff --git a/src/data/roadmaps/aspnet-core/content/106-caching/102-distributed-cache/101-redis/stackexchange-redis.md b/src/data/roadmaps/aspnet-core/content/106-caching/102-distributed-cache/101-redis/stackexchange-redis.md
deleted file mode 100644
index 113608067..000000000
--- a/src/data/roadmaps/aspnet-core/content/106-caching/102-distributed-cache/101-redis/stackexchange-redis.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# Stackexchange Redis
-
-StackExchange.Redis is a high performance general purpose redis client for .NET languages (C#, etc.). It is the logical successor to BookSleeve, and is the client developed-by (and used-by) Stack Exchange for busy sites like Stack Overflow.
-
-Visit the following resources to learn more:
-
-- [@article@Using StackExchange.Redis with .NET](https://docs.redis.com/latest/rs/references/client_references/client_csharp/)
-- [@video@Introduction to StackExchange.Redis](https://www.youtube.com/watch?v=rsXvpCHdldg)
-- [@article@Getting Started with Stackexchange Redis](https://stackexchange.github.io/StackExchange.Redis/)
-- [@feed@Explore top posts about Redis](https://app.daily.dev/tags/redis?ref=roadmapsh)
diff --git a/src/data/roadmaps/aspnet-core/content/107-databases/103-nosql/100-redis.md b/src/data/roadmaps/aspnet-core/content/107-databases/103-nosql/100-redis.md
deleted file mode 100644
index 18c7ba845..000000000
--- a/src/data/roadmaps/aspnet-core/content/107-databases/103-nosql/100-redis.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# Redis
-
-Redis (Remote Dictionary Server) is an open-source, in-memory data structure store that can be used as a database, cache, and message broker. It supports various data structures such as strings, hashes, lists, sets, and sorted sets.
-
-In an ASP.NET application, Redis can be used as a caching mechanism to store frequently accessed data in memory, rather than reading it from a slower storage system like a traditional relational database. This can greatly improve the performance of an application by reducing the number of database queries and the amount of data that needs to be read from disk.
-
-To learn more, visit the following resources:
-
-- [@official@Redis OM .NET](https://redis.io/docs/stack/get-started/tutorials/stack-dotnet/)
-- [@article@Caching in ASP.NET using Redis](https://www.codemag.com/Article/2205091/Distributed-Caching-in-ASP.NET-Core-6-Using-Redis-in-Azure)
-- [@article@Getting started in Redis with .NET](https://docs.redis.com/latest/rs/references/client_references/client_csharp/)
-- [@feed@Explore top posts about Redis](https://app.daily.dev/tags/redis?ref=roadmapsh)
diff --git a/src/data/roadmaps/aspnet-core/content/107-databases/103-nosql/104-ravendb.md b/src/data/roadmaps/aspnet-core/content/107-databases/103-nosql/104-ravendb.md
deleted file mode 100644
index d7a277b28..000000000
--- a/src/data/roadmaps/aspnet-core/content/107-databases/103-nosql/104-ravendb.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# RavenDB
-
-RavenDB is an open-source, NoSQL document database designed for the .NET platform. It is a document database, which means that it stores data in semi-structured JSON format, and it is designed to be simple and easy to use. It is also a multi-model database, which allows you to store and query data using a variety of data models, including document, key-value, graph, and column-family.
-
-In an ASP.NET application, RavenDB can be used as a data store to persist and retrieve application data. There are several libraries available for integrating RavenDB with an ASP.NET application, such as RavenDB.Client, which provides a .NET client for RavenDB that can be used to interact with the RavenDB server from within an ASP.NET application.
-
-For more information, visit the following links:
-
-- [@article@Using RavenDB in ASP.NET Applications](https://www.codeguru.com/dotnet/using-ravendb-in-asp-net-applications/)
-- [@official@Getting started with RavenDB](https://ravendb.net/docs/article-page/5.4/csharp/start/getting-started)
-- [@article@Using RavenDB Unit of Work and .NET Core MVC](https://ayende.com/blog/187906-B/using-ravendb-unit-of-work-and-net-core-mvc)
-- [@feed@Explore top posts about RavenDB](https://app.daily.dev/tags/ravendb?ref=roadmapsh)
diff --git a/src/data/roadmaps/aspnet-core/content/108-log-frameworks/102-log-management-system/100-elk-stack.md b/src/data/roadmaps/aspnet-core/content/108-log-frameworks/102-log-management-system/100-elk-stack.md
deleted file mode 100644
index 31eb9b027..000000000
--- a/src/data/roadmaps/aspnet-core/content/108-log-frameworks/102-log-management-system/100-elk-stack.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# ELK Stack
-
-The ELK Stack is a collection of three open-source products — Elasticsearch, Logstash, and Kibana. ELK stack provides centralized logging in order to identify problems with servers or applications. It allows you to search all the logs in a single place. It also helps to find issues in multiple servers by connecting logs during a specific time frame.
-
-- **E** stands for ElasticSearch: used for storing logs
-- **L** stands for LogStash : used for both shipping as well as processing and storing logs
-- **K** stands for Kibana: is a visualization tool (a web interface) which is hosted through Nginx or Apache
-
-For more information, visit the following links:
-
-- [@article@What Is Elk?](https://aws.amazon.com/what-is/elk-stack/)
-- [@article@Complete Guide to Elk](https://logz.io/learn/complete-guide-elk-stack/)
-- [@article@ELK Stack Tutorial: What is Kibana, Logstash & Elasticsearch?](https://www.guru99.com/elk-stack-tutorial.html)
-- [@feed@Explore top posts about ELK](https://app.daily.dev/tags/elk?ref=roadmapsh)
diff --git a/src/data/roadmaps/aspnet-core/content/108-log-frameworks/102-log-management-system/101-sentry.md b/src/data/roadmaps/aspnet-core/content/108-log-frameworks/102-log-management-system/101-sentry.md
deleted file mode 100644
index 031057514..000000000
--- a/src/data/roadmaps/aspnet-core/content/108-log-frameworks/102-log-management-system/101-sentry.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Sentry
-
-Sentry is an open-source error tracking platform that helps developers identify and fix errors in their applications. It provides detailed error reports, including stack traces, context data, and user feedback, making it easy to understand and reproduce errors. Sentry can be integrated with a variety of platforms, including .NET and ASP.NET.
-
-In an ASP.NET application, Sentry can be used to capture and track errors that occur in the application. Sentry provides an SDK, called Sentry.NET, which can be integrated with an ASP.NET application to automatically capture and track errors. The SDK can be configured to capture and track different types of errors, including unhandled exceptions, handled exceptions, and custom events.
-
-For more information, visit the following links:
-
-- [@article@Sentry Documentation in .NET](https://docs.sentry.io/platforms/dotnet/)
-- [@article@ASP.NET and Sentry](https://docs.sentry.io/platforms/dotnet/guides/aspnetcore/)
-- [@article@Usage of Sentry in ASP.NET](https://docs.sentry.io/platforms/dotnet/guides/aspnetcore/usage/)
diff --git a/src/data/roadmaps/aspnet-core/content/108-log-frameworks/102-log-management-system/102-datadog.md b/src/data/roadmaps/aspnet-core/content/108-log-frameworks/102-log-management-system/102-datadog.md
deleted file mode 100644
index 5ee82d849..000000000
--- a/src/data/roadmaps/aspnet-core/content/108-log-frameworks/102-log-management-system/102-datadog.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Datadog
-
-Datadog is a cloud-based monitoring and analytics platform that helps organizations to monitor, troubleshoot, and optimize their applications and infrastructure. It provides a wide range of features including real-time monitoring, log management, tracing, and alerting, and it can be integrated with a variety of platforms, including .NET and ASP.NET.
-
-In an ASP.NET application, Datadog can be used to monitor and analyze the performance and behavior of the application. Datadog provides an SDK, called Datadog.Trace, which can be integrated with an ASP.NET application to automatically collect and report performance data. The SDK can be configured to report data such as request and response times, error rates, and custom metrics.
-
-Visit the following links:
-
-- [@article@Documentation of Datadog](https://www.datadoghq.com/)
-- [@article@Configuring the .NET Core with Datadog](https://docs.datadoghq.com/tracing/trace_collection/library_config/dotnet-core/?tab=environmentvariables)
-- [@feed@Explore top posts about DevOps](https://app.daily.dev/tags/devops?ref=roadmapsh)
diff --git a/src/data/roadmaps/aspnet-core/content/108-log-frameworks/102-log-management-system/103-loggly.md b/src/data/roadmaps/aspnet-core/content/108-log-frameworks/102-log-management-system/103-loggly.md
deleted file mode 100644
index 75b0c01f0..000000000
--- a/src/data/roadmaps/aspnet-core/content/108-log-frameworks/102-log-management-system/103-loggly.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# Loggly
-
-Loggly is a cloud-based log management and analytics platform that helps organizations to collect, store, and analyze log data from a variety of sources, including .NET and ASP.NET applications. It provides a wide range of features such as real-time log search and analysis, alerting, and reporting, and allows for easy integration with other tools such as Datadog, Splunk, and New Relic.
-
-In an ASP.NET application, Loggly can be used to collect and analyze log data. Loggly provides an SDK, called Loggly.Serilog, which can be integrated with an ASP.NET application to automatically collect log data and send it to Loggly. The SDK can be configured to collect different types of log data, such as log messages, error messages, and custom events.
-
-For more resources, visit the following links:
-
-- [@article@Loggly in ASP.NET Core using Serilog](https://itnext.io/loggly-in-asp-net-core-using-serilog-dc0e2c7d52eb)
-- [@official@Using Loggly For Troubleshooting Bugs](https://www.loggly.com/blog/use-loggly-troubleshooting-bugs-code/)
diff --git a/src/data/roadmaps/aspnet-core/content/108-log-frameworks/102-log-management-system/104-elmah.md b/src/data/roadmaps/aspnet-core/content/108-log-frameworks/102-log-management-system/104-elmah.md
deleted file mode 100644
index 5f5455769..000000000
--- a/src/data/roadmaps/aspnet-core/content/108-log-frameworks/102-log-management-system/104-elmah.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# ELMAH
-
-ELMAH (Error Logging Modules and Handlers) is an open-source error logging and management library for ASP.NET applications. It is designed to be easy to use and easy to integrate into existing ASP.NET applications.
-
-ELMAH is widely used for error logging, management and tracking in ASP.NET applications, it's easy to use, easy to integrate with existing applications, and provides a wealth of features that help developers to identify, diagnose and fix errors in their applications.
-
-For more resources, visit the following links:
-
-- [@article@Introduction To ELMAH](https://www.c-sharpcorner.com/article/introduction-to-elmah-in-mvc/)
-- [@video@How to Configure Elmah in ASP.net MVC](https://www.youtube.com/watch?v=oqheVBZR0PM)
-- [@article@ELMAH Integration in ASP.NET MVC Application](https://www.ecanarys.com/Blogs/ArticleID/184/ELMAH-Integration-in-ASP-NET-MVC-Application)
diff --git a/src/data/roadmaps/aspnet-core/content/108-log-frameworks/102-log-management-system/index.md b/src/data/roadmaps/aspnet-core/content/108-log-frameworks/102-log-management-system/index.md
deleted file mode 100644
index 574fe44d5..000000000
--- a/src/data/roadmaps/aspnet-core/content/108-log-frameworks/102-log-management-system/index.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Log Management System
-
-A log management system is a software or service that is designed to collect, store, and analyze log data from a variety of sources. Logs are records of events that occur in a system, such as application logs, system logs, and network logs. Log management systems are used to gather, store and analyze these logs in order to provide insight into the performance, stability and security of a system.
-
-The use of log management system can help IT professionals to identify and troubleshoot issues, monitor performance, detect security threats and meet regulatory compliance requirements, also it's a fundamental part of IT infrastructure management, and provides a way to measure the health and security of the system.
-
-Visit the following resources for more information:
-
-- [@article@Structured Logging and Logs Management in ASP.NET](https://medium.com/@stavsofer/structured-logging-and-logs-management-asp-net-core-serilog-seq-61109f740696)
-- [@article@ASP.NET Logging Basics](https://www.loggly.com/ultimate-guide/net-logging-basics/)
-- [@feed@Explore top posts about Logging](https://app.daily.dev/tags/logging?ref=roadmapsh)
diff --git a/src/data/roadmaps/aspnet-core/content/109-api-clients/100-rest/102-sieve.md b/src/data/roadmaps/aspnet-core/content/109-api-clients/100-rest/102-sieve.md
deleted file mode 100644
index 3af2f0f1f..000000000
--- a/src/data/roadmaps/aspnet-core/content/109-api-clients/100-rest/102-sieve.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# Sieve
-
-Sieve is a language for filtering email messages, it's defined in the Internet standard, also it's called as Sieve: An Email Filtering Language. It provides a simple, human-readable syntax for specifying rules that determine what actions to take on incoming email messages. These actions can include filing messages into different folders, forwarding messages to other addresses, discarding messages, and more.
-
-Sieve is typically used in email servers and clients, and it can be used to implement server-side and client-side email filtering. It allows users to create their own rules for filtering email, without requiring access to the server's configuration or the need for complex server-side scripts.
-
-To learn more, visit the following resources:
-
-- [@article@Analysis of Sieve](https://en.wikipedia.org/wiki/Sieve_analysis)
-- [@video@Sorting in a .NET Core API using Sieve](https://www.youtube.com/watch?v=x0utCah3cFk)
diff --git a/src/data/roadmaps/aspnet-core/content/111-object-mapping/101-express-mapper.md b/src/data/roadmaps/aspnet-core/content/111-object-mapping/101-express-mapper.md
deleted file mode 100644
index 9069d4821..000000000
--- a/src/data/roadmaps/aspnet-core/content/111-object-mapping/101-express-mapper.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Express Mapper
-
-ExpressMapper is an open-source object-to-object mapping library for .NET, similar to AutoMapper. It allows you to easily map between objects of different types, and it is particularly useful when working with domain models and data transfer objects (DTOs) in a layered architecture.
-
-ExpressMapper uses a convention-based approach to mapping, which means that it automatically maps properties with the same name and type from one object to another. It also provides a fluent API for configuring more complex mappings, such as ignoring certain properties, using custom logic to map properties, or mapping properties based on a value in another property.
-
-To learn more, visit the following links:
-
-- [@official@Intro to Express Mapper](https://expressmapper.org/)
-- [@article@Express Mapper - The New .NET Mapper](https://www.codeproject.com/Tips/1009198/Expressmapper-The-New-NET-Mapper)
-- [@feed@Explore top posts about Express.js](https://app.daily.dev/tags/express?ref=roadmapsh)
diff --git a/src/data/roadmaps/aspnet-core/content/111-object-mapping/102-agile-mapper.md b/src/data/roadmaps/aspnet-core/content/111-object-mapping/102-agile-mapper.md
deleted file mode 100644
index e172d08bc..000000000
--- a/src/data/roadmaps/aspnet-core/content/111-object-mapping/102-agile-mapper.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Agile Mapper
-
-AgileMapper is an open-source, convention-based object-to-object mapping library for .NET, similar to AutoMapper and ExpressMapper. It allows you to easily map between objects of different types, and it is particularly useful when working with domain models and data transfer objects (DTOs) in a layered architecture.
-
-AgileMapper uses a convention-based approach to mapping, which means that it automatically maps properties with the same name and type from one object to another. It also provides a fluent API for configuring more complex mappings, such as ignoring certain properties, using custom logic to map properties, or mapping properties based on a value in another property.
-
-To learn more, visit the following links:
-
-- [@article@Comparison of Object Mapper Libraries](https://www.simplilearn.com/tutorials/asp-dot-net-tutorial/automapper-in-c-sharp)
-- [@article@Overview of Agile Mapper](https://readthedocs.org/projects/agilemapper/)
-- [@feed@Explore top posts about Agile](https://app.daily.dev/tags/agile?ref=roadmapsh)
diff --git a/src/data/roadmaps/aspnet-core/content/111-object-mapping/103-mapster.md b/src/data/roadmaps/aspnet-core/content/111-object-mapping/103-mapster.md
deleted file mode 100644
index f6dba7129..000000000
--- a/src/data/roadmaps/aspnet-core/content/111-object-mapping/103-mapster.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Mapster
-
-Mapster is an open-source, high-performance object-to-object mapping library for .NET, similar to AutoMapper, ExpressMapper, AgileMapper, and AgileMapster. It allows you to easily map between objects of different types, and it is particularly useful when working with domain models and data transfer objects (DTOs) in a layered architecture.
-
-Mapster uses a convention-based approach to mapping, which means that it automatically maps properties with the same name and type from one object to another. It also provides a fluent API for configuring more complex mappings, such as ignoring certain properties, using custom logic to map properties, or mapping properties based on a value in another property.
-
-To learn more, visit the following links:
-
-- [@article@Getting Started With Mapster in ASP.NET](https://code-maze.com/mapster-aspnetcore-introduction/)
-- [@article@Overview of Mapster in .Net ](https://medium.com/@M-S-2/enjoy-using-mapster-in-net-6-2d3f287a0989)
-- [@video@Introduction to Mapster](https://youtube.com/watch?v=bClE7Uon9e8)
diff --git a/src/data/roadmaps/aspnet-core/content/113-testing/100-e2e-testing/100-selenium.md b/src/data/roadmaps/aspnet-core/content/113-testing/100-e2e-testing/100-selenium.md
deleted file mode 100644
index 3cebc579a..000000000
--- a/src/data/roadmaps/aspnet-core/content/113-testing/100-e2e-testing/100-selenium.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Selenium
-
-Selenium is an open-source library that allows developers to automate web browsers and simulate user interactions, it's commonly used for testing web applications. It can be integrated with .NET and provides a .NET binding for interacting with the Selenium API. The Selenium WebDriver API for .NET allows developers to write tests for web applications in C# or other .NET languages and supports various programming paradigms like Page Object Model.
-
-To learn more, visit the following links:
-
-- [@article@Automated UI Tests with Selenium and ASP.NET](https://code-maze.com/selenium-aspnet-core-ui-tests/)
-- [@article@Selenium Web Driver in .NET](https://stephan-bester.medium.com/automated-testing-with-selenium-web-driver-in-net-bde6854d3207)
-- [@feed@Explore top posts about Selenium](https://app.daily.dev/tags/selenium?ref=roadmapsh)
diff --git a/src/data/roadmaps/aspnet-core/content/113-testing/100-e2e-testing/index.md b/src/data/roadmaps/aspnet-core/content/113-testing/100-e2e-testing/index.md
deleted file mode 100644
index a1cbfa170..000000000
--- a/src/data/roadmaps/aspnet-core/content/113-testing/100-e2e-testing/index.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# E2E Testing
-
-E2E testing is a method of testing the complete functionality of an application, from start to finish, it's used to test the entire workflow of an application and ensure that all the different components and features work together seamlessly. In the context of ASP.NET, E2E testing can be used to test web applications built using the ASP.NET framework. E2E testing can be done using frameworks such as Selenium, Playwright, and Cypress which allow developers to automate browser interactions and simulate user interactions with the application. E2E testing is an important aspect of software development and it helps to identify and fix issues early in the development process and ensure that the application behaves as expected when it is released to the users.
-
-Visit the following links to learn more:
-
-- [@video@End-to-End Testing ASP.NET Core APIs](https://www.youtube.com/watch?v=WWN-9ahbdIU)
-- [@article@ASP.NET Core and its testing](https://blog.devgenius.io/asp-net-core-end-to-end-testing-52325e28e387)
-- [@article@Unit Test and E2E Test in ASP.NET](https://learn.microsoft.com/en-us/odata/webapi/unittest-e2etest)
-- [@feed@Explore top posts about Testing](https://app.daily.dev/tags/testing?ref=roadmapsh)
diff --git a/src/data/roadmaps/aspnet-core/content/113-testing/101-unit-testing/100-fluent-assertions.md b/src/data/roadmaps/aspnet-core/content/113-testing/101-unit-testing/100-fluent-assertions.md
deleted file mode 100644
index 6baa5741d..000000000
--- a/src/data/roadmaps/aspnet-core/content/113-testing/101-unit-testing/100-fluent-assertions.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Fluent Assertions
-
-Fluent Assertions is a fluent, readable, and extensible set of .NET extension methods that allow developers to write more natural and expressive assertions in their unit tests, it provides a fluent, fluent-like API that makes it easy to write assertions in a natural language-like syntax. In the context of ASP.NET, Fluent Assertions can be used in conjunction with test frameworks such as MSTest, xUnit, and NUnit to write more expressive and readable unit tests for the application. It provides advanced features such as support for collection-specific assertions, support for asynchronous code, and support for custom types. It's a widely used and open source library, it's very useful to improve code readability and make the test code more expressive.
-
-To learn more, visit the following links:
-
-- [@official@Introduction of Fluent Assertions](https://fluentassertions.com/introduction)
-- [@article@Improving Unit Tests with Fluent Assertions](https://code-maze.com/unit-tests-with-fluent-assertions/)
-- [@article@Exploring Fluent Assertions in Unit Testing](https://www.meziantou.net/exploring-fluent-assertions.htm)
diff --git a/src/data/roadmaps/aspnet-core/content/113-testing/101-unit-testing/index.md b/src/data/roadmaps/aspnet-core/content/113-testing/101-unit-testing/index.md
deleted file mode 100644
index ff9a27a2a..000000000
--- a/src/data/roadmaps/aspnet-core/content/113-testing/101-unit-testing/index.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# Unit Testing
-
-Unit testing is a software testing method in which individual units or components of a software application are tested in isolation from the rest of the application. The goal of unit testing is to validate that each unit of the software application is working as intended and that the interactions between units are also working as intended. In the context of ASP.NET, unit testing can be used to test individual components of a web application built using the ASP.NET framework. Unit testing is a good practice in software development as it helps to catch bugs early in the development process, improves the quality of the code and makes it more maintainable. Additionally, unit tests provide developers with a suite of automated tests that can be run against the application at any time. There are different Unit Testing frameworks available for .NET and many libraries for Mocking, Assertions, and fake objects.
-
-To learn more, visit the following links:
-
-- [@article@Overview of .NET Unit Testing](https://www.toptal.com/dot-net/dotnet-unit-testing-tutorial)
-- [@article@Unit Testing in ASP.NET - Complete Tutorial](https://www.guru99.com/asp-net-unit-testing-project.html)
-- [@video@How to UnitTest ASP.Net MVC Controllers with XUnit ?](https://www.youtube.com/watch?v=VtPosbYAhD8)
-- [@feed@Explore top posts about Testing](https://app.daily.dev/tags/testing?ref=roadmapsh)
diff --git a/src/data/roadmaps/aspnet-core/content/113-testing/102-integration-testing/101-test-server.md b/src/data/roadmaps/aspnet-core/content/113-testing/102-integration-testing/101-test-server.md
deleted file mode 100644
index 008194468..000000000
--- a/src/data/roadmaps/aspnet-core/content/113-testing/102-integration-testing/101-test-server.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# TestServer
-
-TestServer in ASP.NET is a programmatic way to create a web server that can be used to run integration or end-to-end tests for a web application. The TestServer simulates the behavior of a real web server, and allows developers to test the web application in a realistic environment, without the need for a physical web server or a browser. The TestServer can be created and configured using the built-in Web Application Factory (WAF) feature in ASP.NET Core. The WAF allows developers to configure the TestServer to use different services, middleware, and settings, depending on the needs of the application. The TestServer can also be used to test the web application against different configurations, such as different databases, different authentication providers, and different hosting environments.
-
-To learn more, visit the following links:
-
-- [@article@Integration Tests with TestServer](https://visualstudiomagazine.com/articles/2017/07/01/testserver.aspx)
-- [@article@ASP.NET Core Integration Tests With TestServer](https://scotthannen.org/blog/2021/11/18/testserver-how-did-i-not-know.html)
-- [@article@How do you create a TestServer in .NET](https://stackoverflow.com/questions/69897652/how-do-you-create-a-test-server-in-net-6)
diff --git a/src/data/roadmaps/aspnet-core/content/113-testing/102-integration-testing/index.md b/src/data/roadmaps/aspnet-core/content/113-testing/102-integration-testing/index.md
deleted file mode 100644
index 9dc27cccf..000000000
--- a/src/data/roadmaps/aspnet-core/content/113-testing/102-integration-testing/index.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# Integration Testing
-
-Integration testing in ASP.NET refers to the process of testing how different components or modules of a web application interact with each other. This type of testing is done to ensure that the different parts of the application are working together correctly and that the application as a whole is functioning properly. Integration testing typically involves testing the interactions between different layers of the application, such as the data access layer, the business logic layer, and the presentation layer. It can also involve testing the interactions between the web application and external systems, such as databases, web services, and other external APIs. Integration testing can be done using a variety of testing frameworks and tools, such as xUnit, NUnit, MSTest, and others. These frameworks provide the ability to create test cases that simulate different scenarios and test the application's behavior under different conditions.
-
-Visit the following links to learn more:;
-
-- [@article@Integration tests in ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-7.0)
-- [@video@Integration Testing ASP.NET Core WebAPI Applications](https://www.youtube.com/watch?v=xs8gNQjCXw0)
-- [@video@A Sample Project Integration Test In ASP.NET](https://www.youtube.com/watch?v=ziSKkR2nvis)
-- [@feed@Explore top posts about Testing](https://app.daily.dev/tags/testing?ref=roadmapsh)
diff --git a/src/data/roadmaps/aspnet-core/content/113-testing/103-behavior-testing/101-bddfy.md b/src/data/roadmaps/aspnet-core/content/113-testing/103-behavior-testing/101-bddfy.md
deleted file mode 100644
index 0583689e8..000000000
--- a/src/data/roadmaps/aspnet-core/content/113-testing/103-behavior-testing/101-bddfy.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# BDDfy
-
-BDDfy is an open-source, fluent, and extensible BDD (Behavior-Driven Development) framework for .NET, which allows developers to create automated acceptance tests in a readable and expressive format. BDDfy is commonly used in the context of ASP.NET and other .NET technologies, to write acceptance tests for web applications. With BDDfy, developers can write test scenarios using a fluent API, which allows them to describe the behavior of their application in a natural language format. The framework also provides a set of extension methods, which can be used to add additional functionality, such as validating the output of a test, logging test results, or integrating with other testing tools. BDDfy also comes with a built-in test runner, which makes it easy to execute tests and view the results. The framework supports a variety of test runners, such as NUnit, xUnit, and MSTest, and can be integrated with other BDD frameworks, such as SpecFlow and Cucumber.
-
-To learn more, visit the following links:
-
-- [@article@Using BDDfy for Unit Tests](https://www.michael-whelan.net/using-bddfy-for-unit-tests/)
-- [@article@Introducing BDDfy in ASP.NET](https://codeproject.com/Articles/205381/Introducing-BDDfy-the-simplest-BDD-framework-for-N)
-- [@video@Implement BDD with .NET](https://www.youtube.com/watch?v=GYN_srjAvyk)
diff --git a/src/data/roadmaps/aspnet-core/content/113-testing/103-behavior-testing/index.md b/src/data/roadmaps/aspnet-core/content/113-testing/103-behavior-testing/index.md
deleted file mode 100644
index bdf1d9557..000000000
--- a/src/data/roadmaps/aspnet-core/content/113-testing/103-behavior-testing/index.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Behavior Testing
-
-Behavior testing, also known as Behavioral-Driven Development (BDD), is a software development methodology that focuses on the behavior of the system being developed, rather than its implementation. BDD is a variation of Test-Driven Development (TDD), which emphasizes the use of automated tests to drive the development of software. BDD frameworks such as SpecFlow, Cucumber, and LightBDD provide a set of tools for writing and executing BDD tests in the context of ASP.NET. These frameworks allow developers to write tests using a fluent API, which allows them to describe the behavior of their application in a natural language format. They also provide a set of extension methods, which can be used to add additional functionality, such as validating the output of a test, logging test results, or integrating with other testing tools.
-
-To learn more, visit the following links:
-
-- [@article@A Complete Tutorial on ASP.NET Testing](https://www.lambdatest.com/blog/aspnet-testing/)
-- [@article@Learn Behavior Testing in ASP.NET](https://public.vectorly.team/articles/learn_Behavior_Testing_for_Tech_Lead_role_ASP.NET_Developer)
-- [@feed@Explore top posts about Testing](https://app.daily.dev/tags/testing?ref=roadmapsh)
diff --git a/src/data/roadmaps/aspnet-core/content/114-microservices/100-message-brokers/index.md b/src/data/roadmaps/aspnet-core/content/114-microservices/100-message-brokers/index.md
deleted file mode 100644
index ea3f4c526..000000000
--- a/src/data/roadmaps/aspnet-core/content/114-microservices/100-message-brokers/index.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# Message Brokers
-
-Message Brokers are systems that provide a messaging infrastructure for applications and services to communicate with each other in a reliable, secure and scalable way. They act as a central hub for sending and receiving messages between different applications, services and devices.
-
-In the context of ASP.NET, message brokers can be used to send and receive messages between different parts of an application or between different applications or services, enabling them to communicate with each other in a decoupled and asynchronous manner.
-
-Visit the following links to learn more:
-
-- [@article@What are message brokers?](https://www.ibm.com/topics/message-brokers)
-- [@article@Building a messaging solution with .Net Core?](https://medium.com/c-sharp-progarmming/quick-start-how-could-you-build-a-messaging-solution-with-net-core-b5f8253f31ea)
diff --git a/src/data/roadmaps/aspnet-core/content/114-microservices/101-message-bus/index.md b/src/data/roadmaps/aspnet-core/content/114-microservices/101-message-bus/index.md
deleted file mode 100644
index 9c2670487..000000000
--- a/src/data/roadmaps/aspnet-core/content/114-microservices/101-message-bus/index.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# Message Bus
-
-A message bus is a software architecture pattern that enables different parts of an application, or different systems, to communicate with each other asynchronously using a message-based protocol. The message bus acts as a central intermediary, routing messages from senders to receivers and providing features such as message persistence, message routing, and message acknowledgements.
-
-There are different types of message buses, such as event-driven message buses, command-driven message buses, and publish-subscribe message buses. Each type of message bus is designed to handle specific messaging patterns and use cases.
-
-Visit the following links to learn more:
-
-- [@article@Implementation of Message Bus C# microservices](https://stackoverflow.com/questions/51330229/implementation-of-message-bus-c-sharp-microservices)
-- [@article@Building a Message Bus with .NET Core](https://fatihdumanli.medium.com/build-a-message-bus-implementation-with-net-core-and-rabbitmq-9ba350b777f4)
diff --git a/src/data/roadmaps/aspnet-core/content/114-microservices/103-docker-swarm.md b/src/data/roadmaps/aspnet-core/content/114-microservices/103-docker-swarm.md
deleted file mode 100644
index e77f95bce..000000000
--- a/src/data/roadmaps/aspnet-core/content/114-microservices/103-docker-swarm.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Docker Swarm
-
-Docker Swarm is a container orchestration platform for managing and scheduling Docker containers across a cluster of servers. It is a native clustering solution for Docker and provides the ability to create and manage a swarm of Docker nodes as a single virtual host.
-
-With Docker Swarm, you can easily deploy and scale your applications across multiple servers, ensuring high availability and fault tolerance. It provides features such as load balancing, service discovery, and rolling updates, making it easy to manage and maintain your containerized applications.
-
-To learn more, visit the following links:
-
-- [@article@Introduction to Docker Swarm](https://www.section.io/engineering-education/introduction-to-docker-swarm-in-container-orchestration/)
-- [@article@How - Deploy to Swarm?](https://docs.docker.com/get-started/swarm-deploy/)
-- [@feed@Explore top posts about Docker](https://app.daily.dev/tags/docker?ref=roadmapsh)
diff --git a/src/data/roadmaps/aspnet-core/content/114-microservices/110-tye.md b/src/data/roadmaps/aspnet-core/content/114-microservices/110-tye.md
deleted file mode 100644
index 123779f17..000000000
--- a/src/data/roadmaps/aspnet-core/content/114-microservices/110-tye.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Tye
-
-Tye (short for "Try Everything") is a developer tool for .NET that makes it easy to develop, test, and deploy microservices and distributed applications. It is built on top of the .NET Core CLI and Docker and provides a simple and consistent way to run multiple services and components locally, making it easy to test and debug distributed applications.
-
-Tye allows you to define the components of your application in a single YAML file, and then automatically starts, stops and configures all the required services and dependencies. It also provides a set of features to make it easy to manage the application, such as automatic service discovery and configuration, and automatic binding of services to the right ports.
-
-To learn more, visit the following links:
-
-- [@opensource@Getting Started with Tye](https://github.com/dotnet/tye)
diff --git a/src/data/roadmaps/aspnet-core/content/115-ci-cd/102-travis-ci.md b/src/data/roadmaps/aspnet-core/content/115-ci-cd/102-travis-ci.md
deleted file mode 100644
index 1563837ea..000000000
--- a/src/data/roadmaps/aspnet-core/content/115-ci-cd/102-travis-ci.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Travis CI
-
-Travis CI is a cloud-based continuous integration and continuous delivery (CI/CD) platform that allows developers to automate the process of building, testing, and deploying code. It is a popular platform that supports a wide range of languages and frameworks, including ASP.NET.
-
-In ASP.NET, Travis CI can be used to automate various tasks related to the development, testing, and deployment of ASP.NET applications. For example, you can use Travis CI to automatically build, test, and deploy an ASP.NET application to a hosting provider, such as Azure or AWS, every time you push code to your source control repository.
-
-Visit the following links to learn more:
-
-- [@article@How to use Travis CI to Deploy to Azure in ASP.NET](https://devblogs.microsoft.com/cse/2015/09/30/using-travis-ci-to-deploy-to-azure/)
-- [@article@Concepts for Beginners of Travis CI in ASP.NET](https://docs.travis-ci.com/user/for-beginners/)
-- [@feed@Explore top posts about CI/CD](https://app.daily.dev/tags/cicd?ref=roadmapsh)
diff --git a/src/data/roadmaps/aspnet-core/content/115-ci-cd/103-jenkins.md b/src/data/roadmaps/aspnet-core/content/115-ci-cd/103-jenkins.md
deleted file mode 100644
index c80c02e3c..000000000
--- a/src/data/roadmaps/aspnet-core/content/115-ci-cd/103-jenkins.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# Jenkins
-
-Jenkins is an open-source automation server that can be used to automate various tasks related to software development, including building, testing, and deploying code. It is a popular platform that supports a wide range of languages and frameworks, including ASP.NET.
-
-In ASP.NET, Jenkins can be used to automate various tasks related to the development, testing, and deployment of ASP.NET applications. For example, you can use Jenkins to automatically build, test, and deploy an ASP.NET application to a hosting provider, such as Azure or AWS, every time you push code to your source control repository.
-
-To learn more, visit the following links:
-
-- [@article@Continuous Deployment With Jenkins And .NET](https://www.c-sharpcorner.com/article/continuous-deployment-with-jenkins-and-net/)
-- [@article@How to build ASP.NET Core code with Jenkins](https://referbruv.com/blog/cicd-getting-started-automating-aspnet-core-build-using-jenkins/)
-- [@article@How to publish ASP.NET Apps using Jenkins](https://www.ahmetkucukoglu.com/en/how-to-publish-asp-net-core-application-by-using-jenkins)
-- [@feed@Explore top posts about Jenkins](https://app.daily.dev/tags/jenkins?ref=roadmapsh)
diff --git a/src/data/roadmaps/aspnet-core/content/115-ci-cd/105-team-city.md b/src/data/roadmaps/aspnet-core/content/115-ci-cd/105-team-city.md
deleted file mode 100644
index 744ab999b..000000000
--- a/src/data/roadmaps/aspnet-core/content/115-ci-cd/105-team-city.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# TeamCity
-
-TeamCity is a Java-based continuous integration and continuous delivery (CI/CD) platform that allows developers to automate the process of building, testing, and deploying code. It is a popular platform that supports a wide range of languages and frameworks, including ASP.NET.
-
-In ASP.NET, TeamCity can be used to automate various tasks related to the development, testing, and deployment of ASP.NET applications. For example, you can use TeamCity to automatically build, test, and deploy an ASP.NET application to a hosting provider, such as Azure or AWS, every time you push code to your source control repository.
-
-Visit the following links to learn more:
-
-- [@article@Tutorial on TeamCity with ASP.NET](https://www.jetbrains.com/help/teamcity/net.html)
-- [@video@How to Build ASP.NET application with TeamCity?](https://www.youtube.com/watch?v=KNzxyhSWV-4)
-- [@article@How to deploy ASP.NET Core sites using Teamcity?](https://medium.com/monkii/how-to-deploy-asp-net-core-sites-using-teamcity-or-just-command-line-cf05fdee58f5)
diff --git a/src/data/roadmaps/aspnet-core/content/116-client-side-libraries/index.md b/src/data/roadmaps/aspnet-core/content/116-client-side-libraries/index.md
deleted file mode 100644
index 202400223..000000000
--- a/src/data/roadmaps/aspnet-core/content/116-client-side-libraries/index.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Client Side Libraries
-
-Client-side libraries in ASP.NET are libraries that are used to add functionality and enhance the user experience of web applications on the client-side, or the browser. Some popular client-side libraries in ASP.NET include jQuery, Bootstrap, React.js, Angular.js, and Vue.js, which can be easily integrated with ASP.NET applications by including them as a dependency in the project, and can be used to enhance the user interface, add interactive elements, and improve the user experience of your application.
-
-Visit the following resources to learn more:
-
-- [@video@How to use Client Side Library in ASP.NET Core](https://www.youtube.com/watch?v=VwqozSbQuec)
diff --git a/src/data/roadmaps/aspnet-core/content/117-template-engines/101-dot-liquid.md b/src/data/roadmaps/aspnet-core/content/117-template-engines/101-dot-liquid.md
deleted file mode 100644
index 9d2ea0753..000000000
--- a/src/data/roadmaps/aspnet-core/content/117-template-engines/101-dot-liquid.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# DotLiquid
-
-DotLiquid is an open-source templating engine for .NET that is based on the Liquid template language. It allows you to embed dynamic data in HTML templates, and is commonly used for generating email templates, reports, and other types of documents. It is a .NET implementation of the Liquid template language, it provides a simple and easy-to-use API for parsing and rendering Liquid templates, and can be easily integrated with ASP.NET and other .NET frameworks. It is often used in web applications to separate the logic of the application from the presentation of the data, making it easy to change the appearance of the application without having to change the underlying code.
-
-To learn more, visit the following resources:
-
-- [@article@Guide to DotLiquid](https://discoverdot.net/projects/dotliquid)
-- [@article@What is DotLiquid in ASP.NET Core?](https://grandnode.medium.com/dotliquid-in-asp-net-core-e-commerce-platform-how-to-handle-message-templates-a6865be3a612)
diff --git a/src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/105-noda-time.md b/src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/105-noda-time.md
deleted file mode 100644
index 61f1c502a..000000000
--- a/src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/105-noda-time.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# Noda Time
-
-Noda Time is an open-source library for .NET that provides a more complete and accurate way of working with dates, times, and time zones. It addresses the limitations and inconsistencies of the built-in .NET DateTime and TimeZone classes, and provides a number of features that are not present in the .NET framework. It provides a set of immutable and thread-safe value types, such as LocalDate, LocalTime, and Instant. It also provides a time zone abstraction, the DateTimeZone class, that allows you to work with time zones in a more accurate and consistent way, and a set of helper classes and extension methods that make it easy to perform common date and time-related operations.
-
-To learn more, visit the following links:
-
-- [@official@Intro to Noda Time](https://nodatime.org/)
-- [@official@What's the use of Noda Time?](https://nodatime.org/3.1.x/userguide/rationale)
diff --git a/src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/106-gen-fu.md b/src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/106-gen-fu.md
deleted file mode 100644
index c6323f2db..000000000
--- a/src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/106-gen-fu.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# GenFu
-
-GenFu is an open-source library for .NET that provides a simple and flexible way to generate test data for use in automated testing and development. It uses a fluent API to define the types of data that should be generated, and provides a set of built-in generators for common types, such as strings, numbers, and dates. It allows you to easily generate large quantities of test data quickly, and it is especially useful when working with complex object graphs and scenarios that require large amounts of data. It also has built-in support for some of the common libraries like AutoFixture, NBuilder and more, so that you can use it seamlessly with those libraries.
-
-To learn more, visit the following links:
-
-- [@opensource@Overview of GenFu in ASP.NET](https://github.com/MisterJames/GenFu)
diff --git a/src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/107-swash-buckle.md b/src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/107-swash-buckle.md
deleted file mode 100644
index 2038a3d04..000000000
--- a/src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/107-swash-buckle.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Swashbuckle
-
-Swashbuckle is an open-source library for .NET that provides a simple and easy-to-use API for generating Swagger (OpenAPI) documentation for web APIs. It automatically generates a Swagger specification for your API based on your existing .NET code, and provides a set of tools for customizing and displaying the documentation in a user-friendly format. It can be easily integrated into an ASP.NET Core web application and has a built-in web UI for developers and users to interact with the API and test its functionality. It also supports some of the advanced features like Authentication, Authorization, and more.
-
-To learn more, visit the following resources:
-
-- [@article@Get started with Swashbuckle and ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/tutorials/getting-started-with-swashbuckle?view=aspnetcore-7.0&tabs=visual-studio)
-- [@article@How to Setup Swagger in ASP.NET with Swashbuckle?](https://www.andrewhoefling.com/Blog/Post/web-api-swagger-swashbuckle)
-- [@article@How to use Swagger/Swashbuckle in ASP.NET?](https://www.pragimtech.com/blog/azure/how-to-use-swagger-in-asp.net-core-web-api/)
diff --git a/src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/index.md b/src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/index.md
deleted file mode 100644
index 4197f1dff..000000000
--- a/src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/index.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# Good To Know Libraries
-
-There are many libraries available for .NET and ASP.NET that can help you with various tasks and improve your development workflow. Some of the libraries that are commonly used and considered to be "good to know" include:
-
-- Entity Framework
-- AutoMapper
-- MediatR
-- FluentValidation
-- Newtonsoft.Json
-
-To learn more, visit the following resources:
-
-- [@article@Top ASP.NET Libraries – Every Developer Should Know](https://procodeguide.com/programming/top-12-aspnet-core-libraries/)
-- [@article@Top 10 .NET Libraries Every Developer Should Know](https://www.syncfusion.com/blogs/post/top-10-net-core-libraries-every-web-developers-should-know.aspx)
diff --git a/src/data/roadmaps/aspnet-core/content/114-microservices/100-message-brokers/100-active-mq.md b/src/data/roadmaps/aspnet-core/content/activemq@sNYYEBMHV_NO_NToP51VY.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/114-microservices/100-message-brokers/100-active-mq.md
rename to src/data/roadmaps/aspnet-core/content/activemq@sNYYEBMHV_NO_NToP51VY.md
diff --git a/src/data/roadmaps/aspnet-core/content/109-api-clients/index.md b/src/data/roadmaps/aspnet-core/content/api-clients-and-communication@GLkDH0X0uy8_1DIdCzbUD.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/109-api-clients/index.md
rename to src/data/roadmaps/aspnet-core/content/api-clients-and-communication@GLkDH0X0uy8_1DIdCzbUD.md
diff --git a/src/data/roadmaps/aspnet-core/content/103-basics-of-aspnet-core/106-app-settings-and-configurations.md b/src/data/roadmaps/aspnet-core/content/app-settings-and-configs@EJxliq-HPVp00CVsFc6kf.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/103-basics-of-aspnet-core/106-app-settings-and-configurations.md
rename to src/data/roadmaps/aspnet-core/content/app-settings-and-configs@EJxliq-HPVp00CVsFc6kf.md
diff --git a/src/data/roadmaps/aspnet-core/content/103-basics-of-aspnet-core/index.md b/src/data/roadmaps/aspnet-core/content/aspnet-core-basics@v2ZTCQQFQPoJNhOVGMG2g.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/103-basics-of-aspnet-core/index.md
rename to src/data/roadmaps/aspnet-core/content/aspnet-core-basics@v2ZTCQQFQPoJNhOVGMG2g.md
diff --git a/src/data/roadmaps/aspnet-core/content/105-dependency-injection/101-di-containers/101-auto-fac.md b/src/data/roadmaps/aspnet-core/content/autofac@gbpSbjF12dBE1Tb3PX8Bz.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/105-dependency-injection/101-di-containers/101-auto-fac.md
rename to src/data/roadmaps/aspnet-core/content/autofac@gbpSbjF12dBE1Tb3PX8Bz.md
diff --git a/src/data/roadmaps/aspnet-core/content/autofixture@K49M_7gSpfJuZaE6WaHxQ.md b/src/data/roadmaps/aspnet-core/content/autofixture@K49M_7gSpfJuZaE6WaHxQ.md
new file mode 100644
index 000000000..87edac20d
--- /dev/null
+++ b/src/data/roadmaps/aspnet-core/content/autofixture@K49M_7gSpfJuZaE6WaHxQ.md
@@ -0,0 +1 @@
+# AutoFixture
\ No newline at end of file
diff --git a/src/data/roadmaps/aspnet-core/content/111-object-mapping/100-atuo-mapper.md b/src/data/roadmaps/aspnet-core/content/automapper@GPmlueMnuLCUW_t4jvGhc.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/111-object-mapping/100-atuo-mapper.md
rename to src/data/roadmaps/aspnet-core/content/automapper@GPmlueMnuLCUW_t4jvGhc.md
diff --git a/src/data/roadmaps/aspnet-core/content/115-ci-cd/101-azure-pipelines.md b/src/data/roadmaps/aspnet-core/content/azure-pipelines@_-GQNpsb7KZw76hNNOq3h.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/115-ci-cd/101-azure-pipelines.md
rename to src/data/roadmaps/aspnet-core/content/azure-pipelines@_-GQNpsb7KZw76hNNOq3h.md
diff --git a/src/data/roadmaps/aspnet-core/content/114-microservices/100-message-brokers/104-azure-service-bus.md b/src/data/roadmaps/aspnet-core/content/azure-service-bus@gBuaVZfqJ0-g21sKohQtx.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/114-microservices/100-message-brokers/104-azure-service-bus.md
rename to src/data/roadmaps/aspnet-core/content/azure-service-bus@gBuaVZfqJ0-g21sKohQtx.md
diff --git a/src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/104-benchmark-net.md b/src/data/roadmaps/aspnet-core/content/benchmarknet@9LEVN-uVEwxJooEiB9ApK.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/104-benchmark-net.md
rename to src/data/roadmaps/aspnet-core/content/benchmarknet@9LEVN-uVEwxJooEiB9ApK.md
diff --git a/src/data/roadmaps/aspnet-core/content/116-client-side-libraries/100-blazor.md b/src/data/roadmaps/aspnet-core/content/blazor@4iD_hDtgJ15IlJGxiO-E8.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/116-client-side-libraries/100-blazor.md
rename to src/data/roadmaps/aspnet-core/content/blazor@4iD_hDtgJ15IlJGxiO-E8.md
diff --git a/src/data/roadmaps/aspnet-core/content/bogus@QERTjawqCCCkHfR44Ca0s.md b/src/data/roadmaps/aspnet-core/content/bogus@QERTjawqCCCkHfR44Ca0s.md
new file mode 100644
index 000000000..f2cd29f45
--- /dev/null
+++ b/src/data/roadmaps/aspnet-core/content/bogus@QERTjawqCCCkHfR44Ca0s.md
@@ -0,0 +1 @@
+# Bogus
\ No newline at end of file
diff --git a/src/data/roadmaps/aspnet-core/content/100-basics-of-csharp/100-csharp.md b/src/data/roadmaps/aspnet-core/content/c@fxANnSiTb2VzA9u-YeBL1.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/100-basics-of-csharp/100-csharp.md
rename to src/data/roadmaps/aspnet-core/content/c@fxANnSiTb2VzA9u-YeBL1.md
diff --git a/src/data/roadmaps/aspnet-core/content/106-caching/index.md b/src/data/roadmaps/aspnet-core/content/caching@7Nth4LOrM_KirhvjDGkgS.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/106-caching/index.md
rename to src/data/roadmaps/aspnet-core/content/caching@7Nth4LOrM_KirhvjDGkgS.md
diff --git a/src/data/roadmaps/aspnet-core/content/107-databases/103-nosql/103-cassandra.md b/src/data/roadmaps/aspnet-core/content/cassandra@U_-Gt5csu_hihl7ybFY-B.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/107-databases/103-nosql/103-cassandra.md
rename to src/data/roadmaps/aspnet-core/content/cassandra@U_-Gt5csu_hihl7ybFY-B.md
diff --git a/src/data/roadmaps/aspnet-core/content/104-orm/100-entity-framework-core/102-change-tracker-api.md b/src/data/roadmaps/aspnet-core/content/change-tracker-api@wfEOvAkGXkTZGdGX341D4.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/104-orm/100-entity-framework-core/102-change-tracker-api.md
rename to src/data/roadmaps/aspnet-core/content/change-tracker-api@wfEOvAkGXkTZGdGX341D4.md
diff --git a/src/data/roadmaps/aspnet-core/content/115-ci-cd/index.md b/src/data/roadmaps/aspnet-core/content/ci--cd@KIFmahcNiSo2NGoLtAyRR.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/115-ci-cd/index.md
rename to src/data/roadmaps/aspnet-core/content/ci--cd@KIFmahcNiSo2NGoLtAyRR.md
diff --git a/src/data/roadmaps/aspnet-core/content/115-ci-cd/104-circle-ci.md b/src/data/roadmaps/aspnet-core/content/circle-ci@KyGjXgG6JFo42qOV0wqfB.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/115-ci-cd/104-circle-ci.md
rename to src/data/roadmaps/aspnet-core/content/circle-ci@KyGjXgG6JFo42qOV0wqfB.md
diff --git a/src/data/roadmaps/aspnet-core/content/107-databases/101-cloud/index.md b/src/data/roadmaps/aspnet-core/content/cloud@LrjmJs6_rXUkc2A7fEq24.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/107-databases/101-cloud/index.md
rename to src/data/roadmaps/aspnet-core/content/cloud@LrjmJs6_rXUkc2A7fEq24.md
diff --git a/src/data/roadmaps/aspnet-core/content/104-orm/100-entity-framework-core/101-codefirst-migrations.md b/src/data/roadmaps/aspnet-core/content/code-first--migrations@ZPeebwJ3OBuywEgLLgQTG.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/104-orm/100-entity-framework-core/101-codefirst-migrations.md
rename to src/data/roadmaps/aspnet-core/content/code-first--migrations@ZPeebwJ3OBuywEgLLgQTG.md
diff --git a/src/data/roadmaps/aspnet-core/content/102-database-fundamentals/103-constraints.md b/src/data/roadmaps/aspnet-core/content/constraints@1-XdtrGPbUoxpu9ZcQlBA.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/102-database-fundamentals/103-constraints.md
rename to src/data/roadmaps/aspnet-core/content/constraints@1-XdtrGPbUoxpu9ZcQlBA.md
diff --git a/src/data/roadmaps/aspnet-core/content/112-task-scheduling/103-coravel.md b/src/data/roadmaps/aspnet-core/content/coravel@p3bZnKIyRgLmB764Kkhju.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/112-task-scheduling/103-coravel.md
rename to src/data/roadmaps/aspnet-core/content/coravel@p3bZnKIyRgLmB764Kkhju.md
diff --git a/src/data/roadmaps/aspnet-core/content/107-databases/101-cloud/101-cosmosdb.md b/src/data/roadmaps/aspnet-core/content/cosmos-db@KrkV1w9b_Nwm6pe9diDRS.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/107-databases/101-cloud/101-cosmosdb.md
rename to src/data/roadmaps/aspnet-core/content/cosmos-db@KrkV1w9b_Nwm6pe9diDRS.md
diff --git a/src/data/roadmaps/aspnet-core/content/107-databases/103-nosql/105-couchdb.md b/src/data/roadmaps/aspnet-core/content/couchdb@vHcwt6ARi5YR3v-eDDjfl.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/107-databases/103-nosql/105-couchdb.md
rename to src/data/roadmaps/aspnet-core/content/couchdb@vHcwt6ARi5YR3v-eDDjfl.md
diff --git a/src/data/roadmaps/aspnet-core/content/113-testing/100-e2e-testing/103-cypress.md b/src/data/roadmaps/aspnet-core/content/cypress@f2UP2jDnDr7XEFIdAtBhH.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/113-testing/100-e2e-testing/103-cypress.md
rename to src/data/roadmaps/aspnet-core/content/cypress@f2UP2jDnDr7XEFIdAtBhH.md
diff --git a/src/data/roadmaps/aspnet-core/content/104-orm/101-dapper.md b/src/data/roadmaps/aspnet-core/content/dapper@UkWc41r0bZ1lptjse3As6.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/104-orm/101-dapper.md
rename to src/data/roadmaps/aspnet-core/content/dapper@UkWc41r0bZ1lptjse3As6.md
diff --git a/src/data/roadmaps/aspnet-core/content/114-microservices/109-dapr.md b/src/data/roadmaps/aspnet-core/content/dapr@IHY9uL3dzYmf2D2wWgIh-.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/114-microservices/109-dapr.md
rename to src/data/roadmaps/aspnet-core/content/dapr@IHY9uL3dzYmf2D2wWgIh-.md
diff --git a/src/data/roadmaps/aspnet-core/content/101-general-development-skills/104-datastructures-and-algorithms.md b/src/data/roadmaps/aspnet-core/content/data-structures-and-algorithms@RAX2xN37taw9cqA3pnORh.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/101-general-development-skills/104-datastructures-and-algorithms.md
rename to src/data/roadmaps/aspnet-core/content/data-structures-and-algorithms@RAX2xN37taw9cqA3pnORh.md
diff --git a/src/data/roadmaps/aspnet-core/content/102-database-fundamentals/100-database-design-basics.md b/src/data/roadmaps/aspnet-core/content/database-design-basics@zlAcgLKxGF_TyrcJIk4X7.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/102-database-fundamentals/100-database-design-basics.md
rename to src/data/roadmaps/aspnet-core/content/database-design-basics@zlAcgLKxGF_TyrcJIk4X7.md
diff --git a/src/data/roadmaps/aspnet-core/content/102-database-fundamentals/index.md b/src/data/roadmaps/aspnet-core/content/database-fundamentals@tnKUdsgp6bnFtQTexEmfy.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/102-database-fundamentals/index.md
rename to src/data/roadmaps/aspnet-core/content/database-fundamentals@tnKUdsgp6bnFtQTexEmfy.md
diff --git a/src/data/roadmaps/aspnet-core/content/107-databases/index.md b/src/data/roadmaps/aspnet-core/content/databases@Ujzn_dILCA7xoupnz398l.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/107-databases/index.md
rename to src/data/roadmaps/aspnet-core/content/databases@Ujzn_dILCA7xoupnz398l.md
diff --git a/src/data/roadmaps/aspnet-core/content/105-dependency-injection/index.md b/src/data/roadmaps/aspnet-core/content/dependency-injection@IejHMMVKwA0sIInla4FjX.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/105-dependency-injection/index.md
rename to src/data/roadmaps/aspnet-core/content/dependency-injection@IejHMMVKwA0sIInla4FjX.md
diff --git a/src/data/roadmaps/aspnet-core/content/105-dependency-injection/101-di-containers/index.md b/src/data/roadmaps/aspnet-core/content/di-containers@iM760f8Ys66-VSkMiZfIX.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/105-dependency-injection/101-di-containers/index.md
rename to src/data/roadmaps/aspnet-core/content/di-containers@iM760f8Ys66-VSkMiZfIX.md
diff --git a/src/data/roadmaps/aspnet-core/content/106-caching/102-distributed-cache/index.md b/src/data/roadmaps/aspnet-core/content/distributed-cache@SiG0FWWznjDg-2mIWlchy.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/106-caching/102-distributed-cache/index.md
rename to src/data/roadmaps/aspnet-core/content/distributed-cache@SiG0FWWznjDg-2mIWlchy.md
diff --git a/src/data/roadmaps/aspnet-core/content/distributed-lock@T2FsSndxzSuKTFdjoyPi-.md b/src/data/roadmaps/aspnet-core/content/distributed-lock@T2FsSndxzSuKTFdjoyPi-.md
new file mode 100644
index 000000000..696e21e32
--- /dev/null
+++ b/src/data/roadmaps/aspnet-core/content/distributed-lock@T2FsSndxzSuKTFdjoyPi-.md
@@ -0,0 +1 @@
+# Distributed Lock
\ No newline at end of file
diff --git a/src/data/roadmaps/aspnet-core/content/114-microservices/105-docker.md b/src/data/roadmaps/aspnet-core/content/docker@rmRESzLiZNWdBFXLrwQFJ.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/114-microservices/105-docker.md
rename to src/data/roadmaps/aspnet-core/content/docker@rmRESzLiZNWdBFXLrwQFJ.md
diff --git a/src/data/roadmaps/aspnet-core/content/107-databases/101-cloud/100-dynamodb.md b/src/data/roadmaps/aspnet-core/content/dynamo-db@1Om9aQDZmnj_DN10ogwDL.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/107-databases/101-cloud/100-dynamodb.md
rename to src/data/roadmaps/aspnet-core/content/dynamo-db@1Om9aQDZmnj_DN10ogwDL.md
diff --git a/src/data/roadmaps/aspnet-core/content/114-microservices/101-message-bus/102-easy-net-q.md b/src/data/roadmaps/aspnet-core/content/easynetq@X6iSHoHnFFMaGb6YPQFhl.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/114-microservices/101-message-bus/102-easy-net-q.md
rename to src/data/roadmaps/aspnet-core/content/easynetq@X6iSHoHnFFMaGb6YPQFhl.md
diff --git a/src/data/roadmaps/aspnet-core/content/107-databases/100-search-engines/100-elasticsearch.md b/src/data/roadmaps/aspnet-core/content/elastic-search@mK9OAwjReZoQZr1WSLRKJ.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/107-databases/100-search-engines/100-elasticsearch.md
rename to src/data/roadmaps/aspnet-core/content/elastic-search@mK9OAwjReZoQZr1WSLRKJ.md
diff --git a/src/data/roadmaps/aspnet-core/content/106-caching/101-entity-framework-cache.md b/src/data/roadmaps/aspnet-core/content/entity-framework-2nd-level-cache@FV4GsPjUyAc99DnIwkkCC.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/106-caching/101-entity-framework-cache.md
rename to src/data/roadmaps/aspnet-core/content/entity-framework-2nd-level-cache@FV4GsPjUyAc99DnIwkkCC.md
diff --git a/src/data/roadmaps/aspnet-core/content/104-orm/100-entity-framework-core/index.md b/src/data/roadmaps/aspnet-core/content/entity-framework-core@ET74_7ieahNaGdPT11_NI.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/104-orm/100-entity-framework-core/index.md
rename to src/data/roadmaps/aspnet-core/content/entity-framework-core@ET74_7ieahNaGdPT11_NI.md
diff --git a/src/data/roadmaps/aspnet-core/content/113-testing/101-unit-testing/107-fake-it-easy.md b/src/data/roadmaps/aspnet-core/content/fakeiteasy@diRJ_F6kx42Ucs0fxidtZ.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/113-testing/101-unit-testing/107-fake-it-easy.md
rename to src/data/roadmaps/aspnet-core/content/fakeiteasy@diRJ_F6kx42Ucs0fxidtZ.md
diff --git a/src/data/roadmaps/aspnet-core/content/103-basics-of-aspnet-core/105-filters-and-attributes.md b/src/data/roadmaps/aspnet-core/content/filters-and-attributes@U3HXmNq6x2YA3BwZsOTbe.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/103-basics-of-aspnet-core/105-filters-and-attributes.md
rename to src/data/roadmaps/aspnet-core/content/filters-and-attributes@U3HXmNq6x2YA3BwZsOTbe.md
diff --git a/src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/101-fluent-validation.md b/src/data/roadmaps/aspnet-core/content/fluentvalidation@sa0zXd8lpNs_SFQ2y-PY4.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/101-fluent-validation.md
rename to src/data/roadmaps/aspnet-core/content/fluentvalidation@sa0zXd8lpNs_SFQ2y-PY4.md
diff --git a/src/data/roadmaps/aspnet-core/content/117-template-engines/103-fluid.md b/src/data/roadmaps/aspnet-core/content/fluid@ZaOhWWDgVxrn0hbesJ7xT.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/117-template-engines/103-fluid.md
rename to src/data/roadmaps/aspnet-core/content/fluid@ZaOhWWDgVxrn0hbesJ7xT.md
diff --git a/src/data/roadmaps/aspnet-core/content/104-orm/100-entity-framework-core/100-framework-basics.md b/src/data/roadmaps/aspnet-core/content/framework-basics@eGVaAz3VhGu3cXBNxTAWd.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/104-orm/100-entity-framework-core/100-framework-basics.md
rename to src/data/roadmaps/aspnet-core/content/framework-basics@eGVaAz3VhGu3cXBNxTAWd.md
diff --git a/src/data/roadmaps/cpp/content/frameworks/index.md b/src/data/roadmaps/aspnet-core/content/frameworks@1YL7aXluINOO15W3waaiD.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/frameworks/index.md
rename to src/data/roadmaps/aspnet-core/content/frameworks@1YL7aXluINOO15W3waaiD.md
diff --git a/src/data/roadmaps/aspnet-core/content/101-general-development-skills/index.md b/src/data/roadmaps/aspnet-core/content/general-development-skills@NEnna_8DstfYH4T9qrP3-.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/101-general-development-skills/index.md
rename to src/data/roadmaps/aspnet-core/content/general-development-skills@NEnna_8DstfYH4T9qrP3-.md
diff --git a/src/data/roadmaps/aspnet-core/content/101-general-development-skills/100-git.md b/src/data/roadmaps/aspnet-core/content/git---version-control@OtdCmkj0SvrGwCUSfm96C.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/101-general-development-skills/100-git.md
rename to src/data/roadmaps/aspnet-core/content/git---version-control@OtdCmkj0SvrGwCUSfm96C.md
diff --git a/src/data/roadmaps/aspnet-core/content/115-ci-cd/100-github-actions.md b/src/data/roadmaps/aspnet-core/content/github-actions@0-PLMXGlRyRzTk-EjXMs2.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/115-ci-cd/100-github-actions.md
rename to src/data/roadmaps/aspnet-core/content/github-actions@0-PLMXGlRyRzTk-EjXMs2.md
diff --git a/src/data/roadmaps/aspnet-core/content/101-general-development-skills/102-vcs-hosting-services.md b/src/data/roadmaps/aspnet-core/content/github-gitlab-bitbucket@KAZF-mIg-FlfMonfdOLhb.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/101-general-development-skills/102-vcs-hosting-services.md
rename to src/data/roadmaps/aspnet-core/content/github-gitlab-bitbucket@KAZF-mIg-FlfMonfdOLhb.md
diff --git a/src/data/roadmaps/aspnet-core/content/gitlab-cicd@8Y73Ae32eo6_ye7dw5QRQ.md b/src/data/roadmaps/aspnet-core/content/gitlab-cicd@8Y73Ae32eo6_ye7dw5QRQ.md
new file mode 100644
index 000000000..0d71bbe17
--- /dev/null
+++ b/src/data/roadmaps/aspnet-core/content/gitlab-cicd@8Y73Ae32eo6_ye7dw5QRQ.md
@@ -0,0 +1 @@
+# GitLab CI/CD
\ No newline at end of file
diff --git a/src/data/roadmaps/aspnet-core/content/109-api-clients/102-graphql/100-graphql-dotnet.md b/src/data/roadmaps/aspnet-core/content/graphql-net@Efxu9gDodODMTKJbWcXzB.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/109-api-clients/102-graphql/100-graphql-dotnet.md
rename to src/data/roadmaps/aspnet-core/content/graphql-net@Efxu9gDodODMTKJbWcXzB.md
diff --git a/src/data/roadmaps/aspnet-core/content/109-api-clients/102-graphql/index.md b/src/data/roadmaps/aspnet-core/content/graphql@BdTQ5ZMNDNZvkAUoCfL5H.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/109-api-clients/102-graphql/index.md
rename to src/data/roadmaps/aspnet-core/content/graphql@BdTQ5ZMNDNZvkAUoCfL5H.md
diff --git a/src/data/roadmaps/aspnet-core/content/gridlify@w5RnrhsP4p-AdSOLYVAY9.md b/src/data/roadmaps/aspnet-core/content/gridlify@w5RnrhsP4p-AdSOLYVAY9.md
new file mode 100644
index 000000000..206de4a7f
--- /dev/null
+++ b/src/data/roadmaps/aspnet-core/content/gridlify@w5RnrhsP4p-AdSOLYVAY9.md
@@ -0,0 +1 @@
+# Gridlify
\ No newline at end of file
diff --git a/src/data/roadmaps/aspnet-core/content/109-api-clients/101-grpc.md b/src/data/roadmaps/aspnet-core/content/grpc@x3SJlLc19DNJ-PyDOOj_G.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/109-api-clients/101-grpc.md
rename to src/data/roadmaps/aspnet-core/content/grpc@x3SJlLc19DNJ-PyDOOj_G.md
diff --git a/src/data/roadmaps/aspnet-core/content/112-task-scheduling/100-hangfire.md b/src/data/roadmaps/aspnet-core/content/hangfire@QiQsx1udyKcPJ-lZjRQVy.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/112-task-scheduling/100-hangfire.md
rename to src/data/roadmaps/aspnet-core/content/hangfire@QiQsx1udyKcPJ-lZjRQVy.md
diff --git a/src/data/roadmaps/aspnet-core/content/109-api-clients/102-graphql/101-hot-chocolate.md b/src/data/roadmaps/aspnet-core/content/hotchocolate@XMrQx9JH0eSQJpMzhvy0F.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/109-api-clients/102-graphql/101-hot-chocolate.md
rename to src/data/roadmaps/aspnet-core/content/hotchocolate@XMrQx9JH0eSQJpMzhvy0F.md
diff --git a/src/data/roadmaps/aspnet-core/content/101-general-development-skills/103-http-https.md b/src/data/roadmaps/aspnet-core/content/http--https-protocol@YI3cAezupWNntFw4B6elY.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/101-general-development-skills/103-http-https.md
rename to src/data/roadmaps/aspnet-core/content/http--https-protocol@YI3cAezupWNntFw4B6elY.md
diff --git a/src/data/roadmaps/aspnet-core/content/114-microservices/100-message-brokers/101-apache-kafka.md b/src/data/roadmaps/aspnet-core/content/kafka@L8RkeMYm0WGNeLLcHKF1R.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/114-microservices/100-message-brokers/101-apache-kafka.md
rename to src/data/roadmaps/aspnet-core/content/kafka@L8RkeMYm0WGNeLLcHKF1R.md
diff --git a/src/data/roadmaps/aspnet-core/content/114-microservices/102-kubernetes.md b/src/data/roadmaps/aspnet-core/content/kubernetes@02rtFStTeIm8prNskxaUN.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/114-microservices/102-kubernetes.md
rename to src/data/roadmaps/aspnet-core/content/kubernetes@02rtFStTeIm8prNskxaUN.md
diff --git a/src/data/roadmaps/aspnet-core/content/104-orm/100-entity-framework-core/103-lazy-eager-explicit-loading.md b/src/data/roadmaps/aspnet-core/content/lazy-eager-explicit-loading@9AMotSwdEbB8uOg80SykE.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/104-orm/100-entity-framework-core/103-lazy-eager-explicit-loading.md
rename to src/data/roadmaps/aspnet-core/content/lazy-eager-explicit-loading@9AMotSwdEbB8uOg80SykE.md
diff --git a/src/data/roadmaps/aspnet-core/content/100-basics-of-csharp/index.md b/src/data/roadmaps/aspnet-core/content/learn-the-basics-of-c@NvODRFR0DLINB0RlPSsvt.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/100-basics-of-csharp/index.md
rename to src/data/roadmaps/aspnet-core/content/learn-the-basics-of-c@NvODRFR0DLINB0RlPSsvt.md
diff --git a/src/data/roadmaps/aspnet-core/content/105-dependency-injection/102-life-cycles/index.md b/src/data/roadmaps/aspnet-core/content/life-cycles@Tjaczp2E-cCn0qSv89xgo.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/105-dependency-injection/102-life-cycles/index.md
rename to src/data/roadmaps/aspnet-core/content/life-cycles@Tjaczp2E-cCn0qSv89xgo.md
diff --git a/src/data/roadmaps/aspnet-core/content/113-testing/103-behavior-testing/102-light-bdd.md b/src/data/roadmaps/aspnet-core/content/light-bdd@aWRv5sU9dksgcpE9RGJb1.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/113-testing/103-behavior-testing/102-light-bdd.md
rename to src/data/roadmaps/aspnet-core/content/light-bdd@aWRv5sU9dksgcpE9RGJb1.md
diff --git a/src/data/roadmaps/aspnet-core/content/107-databases/103-nosql/102-litedb.md b/src/data/roadmaps/aspnet-core/content/litedb@3gcXaOnHL4v5OoStrTWNV.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/107-databases/103-nosql/102-litedb.md
rename to src/data/roadmaps/aspnet-core/content/litedb@3gcXaOnHL4v5OoStrTWNV.md
diff --git a/src/data/roadmaps/aspnet-core/content/108-log-frameworks/index.md b/src/data/roadmaps/aspnet-core/content/log-frameworks@fQ3w8REYWzQfeJ0nPyq6W.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/108-log-frameworks/index.md
rename to src/data/roadmaps/aspnet-core/content/log-frameworks@fQ3w8REYWzQfeJ0nPyq6W.md
diff --git a/src/data/roadmaps/aspnet-core/content/manual-mapping@oMMBzRrHkUymxAR4oqr75.md b/src/data/roadmaps/aspnet-core/content/manual-mapping@oMMBzRrHkUymxAR4oqr75.md
new file mode 100644
index 000000000..5c17b9306
--- /dev/null
+++ b/src/data/roadmaps/aspnet-core/content/manual-mapping@oMMBzRrHkUymxAR4oqr75.md
@@ -0,0 +1 @@
+# Manual Mapping
\ No newline at end of file
diff --git a/src/data/roadmaps/aspnet-core/content/mapperly@x0OopRTwIvoWgT8qi0CE9.md b/src/data/roadmaps/aspnet-core/content/mapperly@x0OopRTwIvoWgT8qi0CE9.md
new file mode 100644
index 000000000..036af536c
--- /dev/null
+++ b/src/data/roadmaps/aspnet-core/content/mapperly@x0OopRTwIvoWgT8qi0CE9.md
@@ -0,0 +1 @@
+# Mapperly
\ No newline at end of file
diff --git a/src/data/roadmaps/aspnet-core/content/107-databases/102-relational/102-mariadb.md b/src/data/roadmaps/aspnet-core/content/mariadb@Gs8XcsTo11MeCsiSGpjkU.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/107-databases/102-relational/102-mariadb.md
rename to src/data/roadmaps/aspnet-core/content/mariadb@Gs8XcsTo11MeCsiSGpjkU.md
diff --git a/src/data/roadmaps/aspnet-core/content/marten@ipb6proIZKG-_vCOMAiBu.md b/src/data/roadmaps/aspnet-core/content/marten@ipb6proIZKG-_vCOMAiBu.md
new file mode 100644
index 000000000..fca1954aa
--- /dev/null
+++ b/src/data/roadmaps/aspnet-core/content/marten@ipb6proIZKG-_vCOMAiBu.md
@@ -0,0 +1 @@
+# Marten
\ No newline at end of file
diff --git a/src/data/roadmaps/aspnet-core/content/114-microservices/101-message-bus/100-mass-transit.md b/src/data/roadmaps/aspnet-core/content/mass-transit@SQKIUa_UsJ4cls-Vs9yHU.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/114-microservices/101-message-bus/100-mass-transit.md
rename to src/data/roadmaps/aspnet-core/content/mass-transit@SQKIUa_UsJ4cls-Vs9yHU.md
diff --git a/src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/100-mediatr.md b/src/data/roadmaps/aspnet-core/content/mediatr@cc0UNQwbDlySue-CvpChR.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/100-mediatr.md
rename to src/data/roadmaps/aspnet-core/content/mediatr@cc0UNQwbDlySue-CvpChR.md
diff --git a/src/data/roadmaps/aspnet-core/content/106-caching/102-distributed-cache/100-memcached.md b/src/data/roadmaps/aspnet-core/content/memcached@u2pc3ZkL0EumAsbM12D5y.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/106-caching/102-distributed-cache/100-memcached.md
rename to src/data/roadmaps/aspnet-core/content/memcached@u2pc3ZkL0EumAsbM12D5y.md
diff --git a/src/data/roadmaps/aspnet-core/content/106-caching/100-memory-cache.md b/src/data/roadmaps/aspnet-core/content/memory-cache@8CRsr7UZszjc_fZ-4ZmIx.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/106-caching/100-memory-cache.md
rename to src/data/roadmaps/aspnet-core/content/memory-cache@8CRsr7UZszjc_fZ-4ZmIx.md
diff --git a/src/data/roadmaps/aspnet-core/content/114-microservices/index.md b/src/data/roadmaps/aspnet-core/content/microservices@37c2eCvRdebztkbc5AjYp.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/114-microservices/index.md
rename to src/data/roadmaps/aspnet-core/content/microservices@37c2eCvRdebztkbc5AjYp.md
diff --git a/src/data/roadmaps/aspnet-core/content/105-dependency-injection/101-di-containers/100-microsoft-extensions-dependency-injection.md b/src/data/roadmaps/aspnet-core/content/microsoftextensions@J9XdYLo7qJiBoL8p3c68P.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/105-dependency-injection/101-di-containers/100-microsoft-extensions-dependency-injection.md
rename to src/data/roadmaps/aspnet-core/content/microsoftextensions@J9XdYLo7qJiBoL8p3c68P.md
diff --git a/src/data/roadmaps/aspnet-core/content/103-basics-of-aspnet-core/104-middlewares.md b/src/data/roadmaps/aspnet-core/content/middlewares@dG--AAcZZdltYCeg6zCz2.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/103-basics-of-aspnet-core/104-middlewares.md
rename to src/data/roadmaps/aspnet-core/content/middlewares@dG--AAcZZdltYCeg6zCz2.md
diff --git a/src/data/roadmaps/aspnet-core/content/minimal-apis@ipABerBcM9zCte9pYaIse.md b/src/data/roadmaps/aspnet-core/content/minimal-apis@ipABerBcM9zCte9pYaIse.md
new file mode 100644
index 000000000..19fa64730
--- /dev/null
+++ b/src/data/roadmaps/aspnet-core/content/minimal-apis@ipABerBcM9zCte9pYaIse.md
@@ -0,0 +1 @@
+# Minimal APIs
\ No newline at end of file
diff --git a/src/data/roadmaps/aspnet-core/content/107-databases/103-nosql/101-mongodb.md b/src/data/roadmaps/aspnet-core/content/mongodb@-wYRa8qSuKVKo_yOTKV67.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/107-databases/103-nosql/101-mongodb.md
rename to src/data/roadmaps/aspnet-core/content/mongodb@-wYRa8qSuKVKo_yOTKV67.md
diff --git a/src/data/roadmaps/aspnet-core/content/113-testing/101-unit-testing/106-moq.md b/src/data/roadmaps/aspnet-core/content/moq@eyOXWb1kL80Wqiwc2WHd_.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/113-testing/101-unit-testing/106-moq.md
rename to src/data/roadmaps/aspnet-core/content/moq@eyOXWb1kL80Wqiwc2WHd_.md
diff --git a/src/data/roadmaps/aspnet-core/content/113-testing/101-unit-testing/102-mstest.md b/src/data/roadmaps/aspnet-core/content/mstest@236VJJjMvqHfSj-MHSDPV.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/113-testing/101-unit-testing/102-mstest.md
rename to src/data/roadmaps/aspnet-core/content/mstest@236VJJjMvqHfSj-MHSDPV.md
diff --git a/src/data/roadmaps/aspnet-core/content/103-basics-of-aspnet-core/100-mvc.md b/src/data/roadmaps/aspnet-core/content/mvc@D3aQw0-pk3ycO-n10HBaA.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/103-basics-of-aspnet-core/100-mvc.md
rename to src/data/roadmaps/aspnet-core/content/mvc@D3aQw0-pk3ycO-n10HBaA.md
diff --git a/src/data/roadmaps/aspnet-core/content/107-databases/102-relational/103-mysql.md b/src/data/roadmaps/aspnet-core/content/mysql@WsGwg4qdlu_vBsFEpmBvU.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/107-databases/102-relational/103-mysql.md
rename to src/data/roadmaps/aspnet-core/content/mysql@WsGwg4qdlu_vBsFEpmBvU.md
diff --git a/src/data/roadmaps/aspnet-core/content/112-task-scheduling/101-native-background-service.md b/src/data/roadmaps/aspnet-core/content/native-background-service@uP1nqbmFmZL_wA2DoqP8C.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/112-task-scheduling/101-native-background-service.md
rename to src/data/roadmaps/aspnet-core/content/native-background-service@uP1nqbmFmZL_wA2DoqP8C.md
diff --git a/src/data/roadmaps/aspnet-core/content/net-aspire@HqhqqiA5X00Xl1RnZgrNJ.md b/src/data/roadmaps/aspnet-core/content/net-aspire@HqhqqiA5X00Xl1RnZgrNJ.md
new file mode 100644
index 000000000..34743c858
--- /dev/null
+++ b/src/data/roadmaps/aspnet-core/content/net-aspire@HqhqqiA5X00Xl1RnZgrNJ.md
@@ -0,0 +1 @@
+# .NET Aspire
\ No newline at end of file
diff --git a/src/data/roadmaps/aspnet-core/content/net-aspire@Ohc0xzI6qX4hOFVNfRj1F.md b/src/data/roadmaps/aspnet-core/content/net-aspire@Ohc0xzI6qX4hOFVNfRj1F.md
new file mode 100644
index 000000000..34743c858
--- /dev/null
+++ b/src/data/roadmaps/aspnet-core/content/net-aspire@Ohc0xzI6qX4hOFVNfRj1F.md
@@ -0,0 +1 @@
+# .NET Aspire
\ No newline at end of file
diff --git a/src/data/roadmaps/aspnet-core/content/100-basics-of-csharp/102-dotnet-cli.md b/src/data/roadmaps/aspnet-core/content/net-cli@6HJQ1Evgah0Pki04Z2hQt.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/100-basics-of-csharp/102-dotnet-cli.md
rename to src/data/roadmaps/aspnet-core/content/net-cli@6HJQ1Evgah0Pki04Z2hQt.md
diff --git a/src/data/roadmaps/aspnet-core/content/net-maui@olqSPUU3RoxhQ6exfMzeN.md b/src/data/roadmaps/aspnet-core/content/net-maui@olqSPUU3RoxhQ6exfMzeN.md
new file mode 100644
index 000000000..1c6c33a26
--- /dev/null
+++ b/src/data/roadmaps/aspnet-core/content/net-maui@olqSPUU3RoxhQ6exfMzeN.md
@@ -0,0 +1 @@
+# .NET MAUI
\ No newline at end of file
diff --git a/src/data/roadmaps/aspnet-core/content/100-basics-of-csharp/101-dotnet.md b/src/data/roadmaps/aspnet-core/content/net@3GGvuxdfuDwLpNX_gtjCK.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/100-basics-of-csharp/101-dotnet.md
rename to src/data/roadmaps/aspnet-core/content/net@3GGvuxdfuDwLpNX_gtjCK.md
diff --git a/src/data/roadmaps/aspnet-core/content/114-microservices/100-message-brokers/103-net-mq.md b/src/data/roadmaps/aspnet-core/content/netmq@8d4f7_3VO03vy7YDWwPI9.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/114-microservices/100-message-brokers/103-net-mq.md
rename to src/data/roadmaps/aspnet-core/content/netmq@8d4f7_3VO03vy7YDWwPI9.md
diff --git a/src/data/roadmaps/aspnet-core/content/104-orm/103-nhibernate.md b/src/data/roadmaps/aspnet-core/content/nhibernate@z24IJndpQYTl1PhiUI2mx.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/104-orm/103-nhibernate.md
rename to src/data/roadmaps/aspnet-core/content/nhibernate@z24IJndpQYTl1PhiUI2mx.md
diff --git a/src/data/roadmaps/aspnet-core/content/108-log-frameworks/101-nlog.md b/src/data/roadmaps/aspnet-core/content/nlog@ykF2bB_68AhCOzeQ_QSW1.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/108-log-frameworks/101-nlog.md
rename to src/data/roadmaps/aspnet-core/content/nlog@ykF2bB_68AhCOzeQ_QSW1.md
diff --git a/src/data/roadmaps/aspnet-core/content/107-databases/103-nosql/index.md b/src/data/roadmaps/aspnet-core/content/nosql@WUis4K9vduriYdVkKvM9r.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/107-databases/103-nosql/index.md
rename to src/data/roadmaps/aspnet-core/content/nosql@WUis4K9vduriYdVkKvM9r.md
diff --git a/src/data/roadmaps/aspnet-core/content/114-microservices/101-message-bus/101-nservice-bus.md b/src/data/roadmaps/aspnet-core/content/nservicebus@vf8W1FLhcb3awx4JBaY5r.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/114-microservices/101-message-bus/101-nservice-bus.md
rename to src/data/roadmaps/aspnet-core/content/nservicebus@vf8W1FLhcb3awx4JBaY5r.md
diff --git a/src/data/roadmaps/aspnet-core/content/113-testing/101-unit-testing/105-nsubstitute.md b/src/data/roadmaps/aspnet-core/content/nsubstitute@iZCxinqlVefBk5-ICqt4v.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/113-testing/101-unit-testing/105-nsubstitute.md
rename to src/data/roadmaps/aspnet-core/content/nsubstitute@iZCxinqlVefBk5-ICqt4v.md
diff --git a/src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/103-nuke.md b/src/data/roadmaps/aspnet-core/content/nuke@EsC1JwFOMOlQVelpmxISh.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/103-nuke.md
rename to src/data/roadmaps/aspnet-core/content/nuke@EsC1JwFOMOlQVelpmxISh.md
diff --git a/src/data/roadmaps/aspnet-core/content/113-testing/101-unit-testing/104-nunit.md b/src/data/roadmaps/aspnet-core/content/nunit@qHYBlBCvCGUZGh6gyEI63.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/113-testing/101-unit-testing/104-nunit.md
rename to src/data/roadmaps/aspnet-core/content/nunit@qHYBlBCvCGUZGh6gyEI63.md
diff --git a/src/data/roadmaps/aspnet-core/content/111-object-mapping/index.md b/src/data/roadmaps/aspnet-core/content/object-mapping@9ECykIIvXlDblbFbRVcJS.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/111-object-mapping/index.md
rename to src/data/roadmaps/aspnet-core/content/object-mapping@9ECykIIvXlDblbFbRVcJS.md
diff --git a/src/data/roadmaps/aspnet-core/content/104-orm/index.md b/src/data/roadmaps/aspnet-core/content/object-relational-mapping@POQPoN98eqOH2873ZI6Hm.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/104-orm/index.md
rename to src/data/roadmaps/aspnet-core/content/object-relational-mapping@POQPoN98eqOH2873ZI6Hm.md
diff --git a/src/data/roadmaps/aspnet-core/content/114-microservices/104-ocelot.md b/src/data/roadmaps/aspnet-core/content/ocelot@2k-rGuhYTTAR9XN3aDAnW.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/114-microservices/104-ocelot.md
rename to src/data/roadmaps/aspnet-core/content/ocelot@2k-rGuhYTTAR9XN3aDAnW.md
diff --git a/src/data/roadmaps/aspnet-core/content/109-api-clients/100-rest/101-odata.md b/src/data/roadmaps/aspnet-core/content/odata@YojZ5fpzw-5WgoqqkO6wl.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/109-api-clients/100-rest/101-odata.md
rename to src/data/roadmaps/aspnet-core/content/odata@YojZ5fpzw-5WgoqqkO6wl.md
diff --git a/src/data/roadmaps/aspnet-core/content/114-microservices/107-orleans.md b/src/data/roadmaps/aspnet-core/content/orleans@XKsLqDDco5OXKURCcWAmv.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/114-microservices/107-orleans.md
rename to src/data/roadmaps/aspnet-core/content/orleans@XKsLqDDco5OXKURCcWAmv.md
diff --git a/src/data/roadmaps/aspnet-core/content/113-testing/100-e2e-testing/101-playwright.md b/src/data/roadmaps/aspnet-core/content/playwright@AtyL0ij8FeJCBmqG2YvTO.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/113-testing/100-e2e-testing/101-playwright.md
rename to src/data/roadmaps/aspnet-core/content/playwright@AtyL0ij8FeJCBmqG2YvTO.md
diff --git a/src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/102-polly.md b/src/data/roadmaps/aspnet-core/content/polly@gQhiEpvx__70N1WbEHGYJ.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/102-polly.md
rename to src/data/roadmaps/aspnet-core/content/polly@gQhiEpvx__70N1WbEHGYJ.md
diff --git a/src/data/roadmaps/aspnet-core/content/107-databases/102-relational/101-postgresql.md b/src/data/roadmaps/aspnet-core/content/postgresql@An9TLvo-I6NtC8wFU3bh4.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/107-databases/102-relational/101-postgresql.md
rename to src/data/roadmaps/aspnet-core/content/postgresql@An9TLvo-I6NtC8wFU3bh4.md
diff --git a/src/data/roadmaps/aspnet-core/content/113-testing/100-e2e-testing/102-puppeteer.md b/src/data/roadmaps/aspnet-core/content/puppeteer@UCpoLiQJ4LeniI9x3uGcY.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/113-testing/100-e2e-testing/102-puppeteer.md
rename to src/data/roadmaps/aspnet-core/content/puppeteer@UCpoLiQJ4LeniI9x3uGcY.md
diff --git a/src/data/roadmaps/aspnet-core/content/112-task-scheduling/102-quartz.md b/src/data/roadmaps/aspnet-core/content/quartz@zOWlPXIl4XPs_0pA8-yi5.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/112-task-scheduling/102-quartz.md
rename to src/data/roadmaps/aspnet-core/content/quartz@zOWlPXIl4XPs_0pA8-yi5.md
diff --git a/src/data/roadmaps/aspnet-core/content/114-microservices/100-message-brokers/102-rabbit-mq.md b/src/data/roadmaps/aspnet-core/content/rabbitmq@KqvBn2_wvYhFdv0dBZMC9.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/114-microservices/100-message-brokers/102-rabbit-mq.md
rename to src/data/roadmaps/aspnet-core/content/rabbitmq@KqvBn2_wvYhFdv0dBZMC9.md
diff --git a/src/data/roadmaps/aspnet-core/content/103-basics-of-aspnet-core/102-razor-pages.md b/src/data/roadmaps/aspnet-core/content/razon-pages@qpVxwuyA2oE06MZLtEdP1.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/103-basics-of-aspnet-core/102-razor-pages.md
rename to src/data/roadmaps/aspnet-core/content/razon-pages@qpVxwuyA2oE06MZLtEdP1.md
diff --git a/src/data/roadmaps/aspnet-core/content/103-basics-of-aspnet-core/103-razor-components.md b/src/data/roadmaps/aspnet-core/content/razor-components@vePinRjDfSGULKw0LE9K-.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/103-basics-of-aspnet-core/103-razor-components.md
rename to src/data/roadmaps/aspnet-core/content/razor-components@vePinRjDfSGULKw0LE9K-.md
diff --git a/src/data/roadmaps/aspnet-core/content/117-template-engines/100-razor.md b/src/data/roadmaps/aspnet-core/content/razor@nUE2-egUMNFQoPVrVRFPl.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/117-template-engines/100-razor.md
rename to src/data/roadmaps/aspnet-core/content/razor@nUE2-egUMNFQoPVrVRFPl.md
diff --git a/src/data/roadmaps/aspnet-core/content/110-real-time-communication/index.md b/src/data/roadmaps/aspnet-core/content/real-time-communication@9Vv3OxafB6BlHhi1ZkeVO.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/110-real-time-communication/index.md
rename to src/data/roadmaps/aspnet-core/content/real-time-communication@9Vv3OxafB6BlHhi1ZkeVO.md
diff --git a/src/data/roadmaps/aspnet-core/content/106-caching/102-distributed-cache/101-redis/index.md b/src/data/roadmaps/aspnet-core/content/redis@Ts0gJ4DdwFp48LGr4YSvM.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/106-caching/102-distributed-cache/101-redis/index.md
rename to src/data/roadmaps/aspnet-core/content/redis@Ts0gJ4DdwFp48LGr4YSvM.md
diff --git a/src/data/roadmaps/aspnet-core/content/107-databases/102-relational/index.md b/src/data/roadmaps/aspnet-core/content/relational@FnRxRY3uDZdTve1w-nBfc.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/107-databases/102-relational/index.md
rename to src/data/roadmaps/aspnet-core/content/relational@FnRxRY3uDZdTve1w-nBfc.md
diff --git a/src/data/roadmaps/aspnet-core/content/104-orm/102-repodb.md b/src/data/roadmaps/aspnet-core/content/repodb@tYDVcnG0oUF3R8DwASvAh.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/104-orm/102-repodb.md
rename to src/data/roadmaps/aspnet-core/content/repodb@tYDVcnG0oUF3R8DwASvAh.md
diff --git a/src/data/roadmaps/aspnet-core/content/respawn@TCswZHviRiu6SIOwUisu8.md b/src/data/roadmaps/aspnet-core/content/respawn@TCswZHviRiu6SIOwUisu8.md
new file mode 100644
index 000000000..bc92cd9f6
--- /dev/null
+++ b/src/data/roadmaps/aspnet-core/content/respawn@TCswZHviRiu6SIOwUisu8.md
@@ -0,0 +1 @@
+# Respawn
\ No newline at end of file
diff --git a/src/data/roadmaps/aspnet-core/content/109-api-clients/100-rest/index.md b/src/data/roadmaps/aspnet-core/content/rest@KJCtxH3mYsZq3hfBZ6cJF.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/109-api-clients/100-rest/index.md
rename to src/data/roadmaps/aspnet-core/content/rest@KJCtxH3mYsZq3hfBZ6cJF.md
diff --git a/src/data/roadmaps/aspnet-core/content/103-basics-of-aspnet-core/101-rest.md b/src/data/roadmaps/aspnet-core/content/rest@dZ9fYWMBa1OemTmLOI8_q.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/103-basics-of-aspnet-core/101-rest.md
rename to src/data/roadmaps/aspnet-core/content/rest@dZ9fYWMBa1OemTmLOI8_q.md
diff --git a/src/data/roadmaps/aspnet-core/content/scalar@Zb4Gugxf7d6MoeEcfngrV.md b/src/data/roadmaps/aspnet-core/content/scalar@Zb4Gugxf7d6MoeEcfngrV.md
new file mode 100644
index 000000000..7bdf50b8f
--- /dev/null
+++ b/src/data/roadmaps/aspnet-core/content/scalar@Zb4Gugxf7d6MoeEcfngrV.md
@@ -0,0 +1 @@
+# Scalar
\ No newline at end of file
diff --git a/src/data/roadmaps/aspnet-core/content/105-dependency-injection/102-life-cycles/100-scoped.md b/src/data/roadmaps/aspnet-core/content/scoped@M3BW_63MFQyD8NE68dazD.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/105-dependency-injection/102-life-cycles/100-scoped.md
rename to src/data/roadmaps/aspnet-core/content/scoped@M3BW_63MFQyD8NE68dazD.md
diff --git a/src/data/roadmaps/aspnet-core/content/117-template-engines/102-scriban.md b/src/data/roadmaps/aspnet-core/content/scriban@dWB5OCvWVYkD30Op_dMwy.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/117-template-engines/102-scriban.md
rename to src/data/roadmaps/aspnet-core/content/scriban@dWB5OCvWVYkD30Op_dMwy.md
diff --git a/src/data/roadmaps/aspnet-core/content/105-dependency-injection/100-scrutor.md b/src/data/roadmaps/aspnet-core/content/scrutor@f212ztDU_kb7gO71Nn76L.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/105-dependency-injection/100-scrutor.md
rename to src/data/roadmaps/aspnet-core/content/scrutor@f212ztDU_kb7gO71Nn76L.md
diff --git a/src/data/roadmaps/aspnet-core/content/107-databases/100-search-engines/index.md b/src/data/roadmaps/aspnet-core/content/search-engines@6p5atMYw3b3bXkQuXZsDV.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/107-databases/100-search-engines/index.md
rename to src/data/roadmaps/aspnet-core/content/search-engines@6p5atMYw3b3bXkQuXZsDV.md
diff --git a/src/data/roadmaps/aspnet-core/content/108-log-frameworks/100-serilog.md b/src/data/roadmaps/aspnet-core/content/serilog@xL0s4-HfRxNy2ru0jiIWR.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/108-log-frameworks/100-serilog.md
rename to src/data/roadmaps/aspnet-core/content/serilog@xL0s4-HfRxNy2ru0jiIWR.md
diff --git a/src/data/roadmaps/aspnet-core/content/113-testing/101-unit-testing/101-shouldly.md b/src/data/roadmaps/aspnet-core/content/shouldly@zhn-VLGPfV6FZT2OMl6zf.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/113-testing/101-unit-testing/101-shouldly.md
rename to src/data/roadmaps/aspnet-core/content/shouldly@zhn-VLGPfV6FZT2OMl6zf.md
diff --git a/src/data/roadmaps/aspnet-core/content/110-real-time-communication/101-singlar-core.md b/src/data/roadmaps/aspnet-core/content/signalr-core@8dvd4M0TKNyQR8dEolGNT.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/110-real-time-communication/101-singlar-core.md
rename to src/data/roadmaps/aspnet-core/content/signalr-core@8dvd4M0TKNyQR8dEolGNT.md
diff --git a/src/data/roadmaps/aspnet-core/content/105-dependency-injection/102-life-cycles/102-singleton.md b/src/data/roadmaps/aspnet-core/content/singleton@y9bDrCjkDbxSIrEEtu_Mi.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/105-dependency-injection/102-life-cycles/102-singleton.md
rename to src/data/roadmaps/aspnet-core/content/singleton@y9bDrCjkDbxSIrEEtu_Mi.md
diff --git a/src/data/roadmaps/aspnet-core/content/107-databases/100-search-engines/101-solr.md b/src/data/roadmaps/aspnet-core/content/solr@2sY_p_8cOOBmZtDHO2Cmy.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/107-databases/100-search-engines/101-solr.md
rename to src/data/roadmaps/aspnet-core/content/solr@2sY_p_8cOOBmZtDHO2Cmy.md
diff --git a/src/data/roadmaps/aspnet-core/content/113-testing/103-behavior-testing/100-spec-flow.md b/src/data/roadmaps/aspnet-core/content/specflow@9WZmjiFowydYrkHQ2xeNm.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/113-testing/103-behavior-testing/100-spec-flow.md
rename to src/data/roadmaps/aspnet-core/content/specflow@9WZmjiFowydYrkHQ2xeNm.md
diff --git a/src/data/roadmaps/aspnet-core/content/107-databases/100-search-engines/102-sphinx.md b/src/data/roadmaps/aspnet-core/content/sphinx@Ye9WHfwZa-Fc2YDaTCmU1.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/107-databases/100-search-engines/102-sphinx.md
rename to src/data/roadmaps/aspnet-core/content/sphinx@Ye9WHfwZa-Fc2YDaTCmU1.md
diff --git a/src/data/roadmaps/aspnet-core/content/102-database-fundamentals/101-sql-basics.md b/src/data/roadmaps/aspnet-core/content/sql-basics@aOJMVrTcA_I2y_QHzj7aM.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/102-database-fundamentals/101-sql-basics.md
rename to src/data/roadmaps/aspnet-core/content/sql-basics@aOJMVrTcA_I2y_QHzj7aM.md
diff --git a/src/data/roadmaps/aspnet-core/content/107-databases/102-relational/100-sql-server.md b/src/data/roadmaps/aspnet-core/content/sql-server@HQHSzsqBGSVYNLQ9o5EI-.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/107-databases/102-relational/100-sql-server.md
rename to src/data/roadmaps/aspnet-core/content/sql-server@HQHSzsqBGSVYNLQ9o5EI-.md
diff --git a/src/data/roadmaps/aspnet-core/content/114-microservices/108-steel-toe.md b/src/data/roadmaps/aspnet-core/content/steeltoe@s8evqe2MireS1UhxoXrd1.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/114-microservices/108-steel-toe.md
rename to src/data/roadmaps/aspnet-core/content/steeltoe@s8evqe2MireS1UhxoXrd1.md
diff --git a/src/data/roadmaps/aspnet-core/content/102-database-fundamentals/102-stored-procedures.md b/src/data/roadmaps/aspnet-core/content/stored-procedures@ZiK-c9zNbi5RZkKUi44wP.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/102-database-fundamentals/102-stored-procedures.md
rename to src/data/roadmaps/aspnet-core/content/stored-procedures@ZiK-c9zNbi5RZkKUi44wP.md
diff --git a/src/data/roadmaps/aspnet-core/content/stylecop-rules@R7Qk5hsEIl9dspQXdaJAJ.md b/src/data/roadmaps/aspnet-core/content/stylecop-rules@R7Qk5hsEIl9dspQXdaJAJ.md
new file mode 100644
index 000000000..9bb092720
--- /dev/null
+++ b/src/data/roadmaps/aspnet-core/content/stylecop-rules@R7Qk5hsEIl9dspQXdaJAJ.md
@@ -0,0 +1,10 @@
+# StyleCop Rules
+
+StyleCop is a tool used for developers to standardize their code and ensure they all follow the same syntax principles. With StyleCop, one standard can be defined in a `stylecop.json` file and shared across your team so that each member has the same guidelines when formatting your code. Beyond a single project, StyleCop can also be added as an extension, so all of the projects on your IDE follow the same formatting rules, this is especially useful if your organization follows the same rule standards for all projects.
+
+Visit the following resources to learn more:
+
+- [@opensource@StyleCop GitHub official page](https://github.com/StyleCop/StyleCop)
+- [@opensource@StyeleCop Analyzers, a more modern version of StyleCop](https://github.com/DotNetAnalyzers/StyleCopAnalyzers)
+- [@video@The StyleCop setup and Advantages](https://www.youtube.com/watch?v=dmpOKmz3lPw)
+- [@article@StyleCop: A Detailed Guide to Starting and Using It](https://blog.submain.com/stylecop-detailed-guide/)
diff --git a/src/data/roadmaps/aspnet-core/content/112-task-scheduling/index.md b/src/data/roadmaps/aspnet-core/content/task-scheduling@s57tKy1rajlJbKFDVXLqs.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/112-task-scheduling/index.md
rename to src/data/roadmaps/aspnet-core/content/task-scheduling@s57tKy1rajlJbKFDVXLqs.md
diff --git a/src/data/roadmaps/aspnet-core/content/117-template-engines/index.md b/src/data/roadmaps/aspnet-core/content/template-engines@C85aJvrzj6rP2Hmfj9uPB.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/117-template-engines/index.md
rename to src/data/roadmaps/aspnet-core/content/template-engines@C85aJvrzj6rP2Hmfj9uPB.md
diff --git a/src/data/roadmaps/aspnet-core/content/test-containers@8eW5BaOjJbnQ7uk4zMOiU.md b/src/data/roadmaps/aspnet-core/content/test-containers@8eW5BaOjJbnQ7uk4zMOiU.md
new file mode 100644
index 000000000..6482ad900
--- /dev/null
+++ b/src/data/roadmaps/aspnet-core/content/test-containers@8eW5BaOjJbnQ7uk4zMOiU.md
@@ -0,0 +1 @@
+# Test Containers
\ No newline at end of file
diff --git a/src/data/roadmaps/aspnet-core/content/113-testing/index.md b/src/data/roadmaps/aspnet-core/content/testing@XofWWhlU_vWCG5oXVMZze.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/113-testing/index.md
rename to src/data/roadmaps/aspnet-core/content/testing@XofWWhlU_vWCG5oXVMZze.md
diff --git a/src/data/roadmaps/aspnet-core/content/105-dependency-injection/102-life-cycles/101-transient.md b/src/data/roadmaps/aspnet-core/content/transient@-N0XM0-VtCZ6QMo2YyMD-.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/105-dependency-injection/102-life-cycles/101-transient.md
rename to src/data/roadmaps/aspnet-core/content/transient@-N0XM0-VtCZ6QMo2YyMD-.md
diff --git a/src/data/roadmaps/aspnet-core/content/102-database-fundamentals/104-triggers.md b/src/data/roadmaps/aspnet-core/content/triggers@2f_CJMnXwPxjMEwm5P_QJ.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/102-database-fundamentals/104-triggers.md
rename to src/data/roadmaps/aspnet-core/content/triggers@2f_CJMnXwPxjMEwm5P_QJ.md
diff --git a/src/data/roadmaps/aspnet-core/content/110-real-time-communication/100-web-sockets.md b/src/data/roadmaps/aspnet-core/content/web-sockets@tBl8neu3tJd5GPwGfJbjZ.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/110-real-time-communication/100-web-sockets.md
rename to src/data/roadmaps/aspnet-core/content/web-sockets@tBl8neu3tJd5GPwGfJbjZ.md
diff --git a/src/data/roadmaps/aspnet-core/content/113-testing/102-integration-testing/100-web-application-factory.md b/src/data/roadmaps/aspnet-core/content/webapplicationfactory@Xx5G09n4WWnnydCgxnL0A.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/113-testing/102-integration-testing/100-web-application-factory.md
rename to src/data/roadmaps/aspnet-core/content/webapplicationfactory@Xx5G09n4WWnnydCgxnL0A.md
diff --git a/src/data/roadmaps/aspnet-core/content/113-testing/101-unit-testing/103-xunit.md b/src/data/roadmaps/aspnet-core/content/xunit@R8C6s53RYjkRVma0nCJpy.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/113-testing/101-unit-testing/103-xunit.md
rename to src/data/roadmaps/aspnet-core/content/xunit@R8C6s53RYjkRVma0nCJpy.md
diff --git a/src/data/roadmaps/aspnet-core/content/114-microservices/106-yarp.md b/src/data/roadmaps/aspnet-core/content/yarp@2axfolu26P8XwxMxgMaS3.md
similarity index 100%
rename from src/data/roadmaps/aspnet-core/content/114-microservices/106-yarp.md
rename to src/data/roadmaps/aspnet-core/content/yarp@2axfolu26P8XwxMxgMaS3.md
diff --git a/src/data/roadmaps/aspnet-core/migration-mapping.json b/src/data/roadmaps/aspnet-core/migration-mapping.json
new file mode 100644
index 000000000..e4da549c9
--- /dev/null
+++ b/src/data/roadmaps/aspnet-core/migration-mapping.json
@@ -0,0 +1,131 @@
+{
+  "basics-of-csharp": "NvODRFR0DLINB0RlPSsvt",
+  "basics-of-csharp:csharp": "fxANnSiTb2VzA9u-YeBL1",
+  "basics-of-csharp:dotnet": "3GGvuxdfuDwLpNX_gtjCK",
+  "basics-of-csharp:dotnet-cli": "6HJQ1Evgah0Pki04Z2hQt",
+  "general-development-skills": "NEnna_8DstfYH4T9qrP3-",
+  "general-development-skills:git": "OtdCmkj0SvrGwCUSfm96C",
+  "general-development-skills:vcs-hosting-services": "KAZF-mIg-FlfMonfdOLhb",
+  "general-development-skills:http-https": "YI3cAezupWNntFw4B6elY",
+  "general-development-skills:datastructures-and-algorithms": "RAX2xN37taw9cqA3pnORh",
+  "database-fundamentals": "tnKUdsgp6bnFtQTexEmfy",
+  "database-fundamentals:sql-basics": "aOJMVrTcA_I2y_QHzj7aM",
+  "database-fundamentals:database-design-basics": "zlAcgLKxGF_TyrcJIk4X7",
+  "database-fundamentals:stored-procedures": "ZiK-c9zNbi5RZkKUi44wP",
+  "database-fundamentals:constraints": "1-XdtrGPbUoxpu9ZcQlBA",
+  "database-fundamentals:triggers": "2f_CJMnXwPxjMEwm5P_QJ",
+  "basics-of-aspnet-core": "v2ZTCQQFQPoJNhOVGMG2g",
+  "basics-of-aspnet-core:mvc": "D3aQw0-pk3ycO-n10HBaA",
+  "basics-of-aspnet-core:rest": "dZ9fYWMBa1OemTmLOI8_q",
+  "basics-of-aspnet-core:razor-pages": "qpVxwuyA2oE06MZLtEdP1",
+  "basics-of-aspnet-core:razor-components": "vePinRjDfSGULKw0LE9K-",
+  "basics-of-aspnet-core:middlewares": "dG--AAcZZdltYCeg6zCz2",
+  "basics-of-aspnet-core:filters-and-attributes": "U3HXmNq6x2YA3BwZsOTbe",
+  "basics-of-aspnet-core:app-settings-and-configurations": "EJxliq-HPVp00CVsFc6kf",
+  "orm": "POQPoN98eqOH2873ZI6Hm",
+  "orm:entity-framework-core": "ET74_7ieahNaGdPT11_NI",
+  "orm:entity-framework-core:framework-basics": "eGVaAz3VhGu3cXBNxTAWd",
+  "orm:entity-framework-core:codefirst-migrations": "ZPeebwJ3OBuywEgLLgQTG",
+  "orm:entity-framework-core:change-tracker-api": "wfEOvAkGXkTZGdGX341D4",
+  "orm:entity-framework-core:lazy-eager-explicit-loading": "9AMotSwdEbB8uOg80SykE",
+  "orm:dapper": "UkWc41r0bZ1lptjse3As6",
+  "orm:repodb": "tYDVcnG0oUF3R8DwASvAh",
+  "orm:nhibernate": "z24IJndpQYTl1PhiUI2mx",
+  "dependency-injection": "IejHMMVKwA0sIInla4FjX",
+  "dependency-injection:scrutor": "f212ztDU_kb7gO71Nn76L",
+  "dependency-injection:life-cycles": "Tjaczp2E-cCn0qSv89xgo",
+  "dependency-injection:life-cycles:scoped": "M3BW_63MFQyD8NE68dazD",
+  "dependency-injection:life-cycles:transient": "-N0XM0-VtCZ6QMo2YyMD-",
+  "dependency-injection:life-cycles:singleton": "y9bDrCjkDbxSIrEEtu_Mi",
+  "dependency-injection:di-containers": "iM760f8Ys66-VSkMiZfIX",
+  "dependency-injection:di-containers:microsoft-extensions-dependency-injection": "J9XdYLo7qJiBoL8p3c68P",
+  "dependency-injection:di-containers:auto-fac": "gbpSbjF12dBE1Tb3PX8Bz",
+  "caching": "7Nth4LOrM_KirhvjDGkgS",
+  "caching:entity-framework-cache": "FV4GsPjUyAc99DnIwkkCC",
+  "caching:memory-cache": "8CRsr7UZszjc_fZ-4ZmIx",
+  "caching:distributed-cache": "SiG0FWWznjDg-2mIWlchy",
+  "caching:distributed-cache:memcached": "u2pc3ZkL0EumAsbM12D5y",
+  "caching:distributed-cache:redis": "Ts0gJ4DdwFp48LGr4YSvM",
+  "databases": "Ujzn_dILCA7xoupnz398l",
+  "databases:search-engines": "6p5atMYw3b3bXkQuXZsDV",
+  "databases:search-engines:elasticsearch": "mK9OAwjReZoQZr1WSLRKJ",
+  "databases:search-engines:solr": "2sY_p_8cOOBmZtDHO2Cmy",
+  "databases:search-engines:sphinx": "Ye9WHfwZa-Fc2YDaTCmU1",
+  "databases:cloud": "LrjmJs6_rXUkc2A7fEq24",
+  "databases:cloud:dynamodb": "1Om9aQDZmnj_DN10ogwDL",
+  "databases:cloud:cosmosdb": "KrkV1w9b_Nwm6pe9diDRS",
+  "databases:relational": "FnRxRY3uDZdTve1w-nBfc",
+  "databases:relational:sql-server": "HQHSzsqBGSVYNLQ9o5EI-",
+  "databases:relational:postgresql": "An9TLvo-I6NtC8wFU3bh4",
+  "databases:relational:mariadb": "Gs8XcsTo11MeCsiSGpjkU",
+  "databases:relational:mysql": "WsGwg4qdlu_vBsFEpmBvU",
+  "databases:nosql": "WUis4K9vduriYdVkKvM9r",
+  "databases:nosql:mongodb": "-wYRa8qSuKVKo_yOTKV67",
+  "databases:nosql:litedb": "3gcXaOnHL4v5OoStrTWNV",
+  "databases:nosql:cassandra": "U_-Gt5csu_hihl7ybFY-B",
+  "databases:nosql:couchdb": "vHcwt6ARi5YR3v-eDDjfl",
+  "log-frameworks": "fQ3w8REYWzQfeJ0nPyq6W",
+  "log-frameworks:serilog": "xL0s4-HfRxNy2ru0jiIWR",
+  "log-frameworks:nlog": "ykF2bB_68AhCOzeQ_QSW1",
+  "api-clients": "GLkDH0X0uy8_1DIdCzbUD",
+  "api-clients:rest": "KJCtxH3mYsZq3hfBZ6cJF",
+  "api-clients:rest:odata": "YojZ5fpzw-5WgoqqkO6wl",
+  "api-clients:grpc": "x3SJlLc19DNJ-PyDOOj_G",
+  "api-clients:graphql": "BdTQ5ZMNDNZvkAUoCfL5H",
+  "api-clients:graphql:hot-chocolate": "XMrQx9JH0eSQJpMzhvy0F",
+  "api-clients:graphql:graphql-dotnet": "Efxu9gDodODMTKJbWcXzB",
+  "real-time-communication": "9Vv3OxafB6BlHhi1ZkeVO",
+  "real-time-communication:web-sockets": "tBl8neu3tJd5GPwGfJbjZ",
+  "real-time-communication:singlar-core": "8dvd4M0TKNyQR8dEolGNT",
+  "object-mapping": "9ECykIIvXlDblbFbRVcJS",
+  "object-mapping:atuo-mapper": "GPmlueMnuLCUW_t4jvGhc",
+  "task-scheduling": "s57tKy1rajlJbKFDVXLqs",
+  "task-scheduling:native-background-service": "uP1nqbmFmZL_wA2DoqP8C",
+  "task-scheduling:quartz": "zOWlPXIl4XPs_0pA8-yi5",
+  "task-scheduling:coravel": "p3bZnKIyRgLmB764Kkhju",
+  "task-scheduling:hangfire": "QiQsx1udyKcPJ-lZjRQVy",
+  "testing": "XofWWhlU_vWCG5oXVMZze",
+  "testing:e2e-testing:playwright": "AtyL0ij8FeJCBmqG2YvTO",
+  "testing:e2e-testing:puppeteer": "UCpoLiQJ4LeniI9x3uGcY",
+  "testing:e2e-testing:cypress": "f2UP2jDnDr7XEFIdAtBhH",
+  "testing:unit-testing:mstest": "236VJJjMvqHfSj-MHSDPV",
+  "testing:unit-testing:xunit": "R8C6s53RYjkRVma0nCJpy",
+  "testing:unit-testing:nunit": "qHYBlBCvCGUZGh6gyEI63",
+  "testing:unit-testing:shouldly": "zhn-VLGPfV6FZT2OMl6zf",
+  "testing:unit-testing:nsubstitute": "iZCxinqlVefBk5-ICqt4v",
+  "testing:unit-testing:moq": "eyOXWb1kL80Wqiwc2WHd_",
+  "testing:unit-testing:fake-it-easy": "diRJ_F6kx42Ucs0fxidtZ",
+  "testing:integration-testing:web-application-factory": "Xx5G09n4WWnnydCgxnL0A",
+  "testing:behavior-testing:spec-flow": "9WZmjiFowydYrkHQ2xeNm",
+  "testing:behavior-testing:light-bdd": "aWRv5sU9dksgcpE9RGJb1",
+  "microservices": "37c2eCvRdebztkbc5AjYp",
+  "microservices:message-brokers:apache-kafka": "L8RkeMYm0WGNeLLcHKF1R",
+  "microservices:message-brokers:rabbit-mq": "KqvBn2_wvYhFdv0dBZMC9",
+  "microservices:message-brokers:active-mq": "sNYYEBMHV_NO_NToP51VY",
+  "microservices:message-brokers:azure-service-bus": "gBuaVZfqJ0-g21sKohQtx",
+  "microservices:message-brokers:net-mq": "8d4f7_3VO03vy7YDWwPI9",
+  "microservices:message-bus:mass-transit": "SQKIUa_UsJ4cls-Vs9yHU",
+  "microservices:message-bus:nservice-bus": "vf8W1FLhcb3awx4JBaY5r",
+  "microservices:message-bus:easy-net-q": "X6iSHoHnFFMaGb6YPQFhl",
+  "microservices:docker": "rmRESzLiZNWdBFXLrwQFJ",
+  "microservices:ocelot": "2k-rGuhYTTAR9XN3aDAnW",
+  "microservices:yarp": "2axfolu26P8XwxMxgMaS3",
+  "microservices:kubernetes": "02rtFStTeIm8prNskxaUN",
+  "microservices:dapr": "IHY9uL3dzYmf2D2wWgIh-",
+  "microservices:orleans": "XKsLqDDco5OXKURCcWAmv",
+  "microservices:steel-toe": "s8evqe2MireS1UhxoXrd1",
+  "ci-cd": "KIFmahcNiSo2NGoLtAyRR",
+  "ci-cd:github-actions": "0-PLMXGlRyRzTk-EjXMs2",
+  "ci-cd:azure-pipelines": "_-GQNpsb7KZw76hNNOq3h",
+  "ci-cd:circle-ci": "KyGjXgG6JFo42qOV0wqfB",
+  "client-side-libraries:blazor": "4iD_hDtgJ15IlJGxiO-E8",
+  "template-engines": "C85aJvrzj6rP2Hmfj9uPB",
+  "template-engines:razor": "nUE2-egUMNFQoPVrVRFPl",
+  "template-engines:scriban": "dWB5OCvWVYkD30Op_dMwy",
+  "template-engines:fluid": "ZaOhWWDgVxrn0hbesJ7xT",
+  "good-to-know-libraries:mediatr": "cc0UNQwbDlySue-CvpChR",
+  "good-to-know-libraries:fluent-validation": "sa0zXd8lpNs_SFQ2y-PY4",
+  "good-to-know-libraries:polly": "gQhiEpvx__70N1WbEHGYJ",
+  "good-to-know-libraries:nuke": "EsC1JwFOMOlQVelpmxISh",
+  "good-to-know-libraries:benchmark-net": "9LEVN-uVEwxJooEiB9ApK"
+}
\ No newline at end of file
diff --git a/src/data/roadmaps/aws/content/113-ecs/100-clusters.md b/src/data/roadmaps/aws/content/113-ecs/100-clusters.md
index d5bc35d12..10fa6cba0 100644
--- a/src/data/roadmaps/aws/content/113-ecs/100-clusters.md
+++ b/src/data/roadmaps/aws/content/113-ecs/100-clusters.md
@@ -4,4 +4,5 @@ In AWS, an ECS **Cluster** is a logical grouping of tasks or services. If you ru
 
 Visit the following resources to learn more:
 
-- [@official@Clusters / ECS Container Agents](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html)
+- [@official@Clusters](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/clusters.html)
+- [@official@ECS Container Agents](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-config.html)
diff --git a/src/data/roadmaps/aws/content/116-lambda/100-creating-invoking.md b/src/data/roadmaps/aws/content/116-lambda/100-creating-invoking.md
index fae410cf1..4fd7303d7 100644
--- a/src/data/roadmaps/aws/content/116-lambda/100-creating-invoking.md
+++ b/src/data/roadmaps/aws/content/116-lambda/100-creating-invoking.md
@@ -5,3 +5,4 @@ To create a Lambda function in AWS, navigate to the AWS Management Console, sele
 Visit the following resources to learn more:
 
 - [@official@Create Your First Lambda Function](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)
+- [@video@First AWS Lambda Function](https://www.youtube.com/watch?v=e1tkFsFOBHA)
diff --git a/src/data/roadmaps/aws/content/116-lambda/101-layers.md b/src/data/roadmaps/aws/content/116-lambda/101-layers.md
index 7b9a4a94d..afe87f041 100644
--- a/src/data/roadmaps/aws/content/116-lambda/101-layers.md
+++ b/src/data/roadmaps/aws/content/116-lambda/101-layers.md
@@ -5,3 +5,4 @@ AWS Lambda layers are distribution mechanisms for libraries, custom runtimes, an
 Visit the following resources to learn more:
 
 - [@official@AWS Lambda Layers](https://docs.aws.amazon.com/lambda/latest/dg/chapter-layers.html)
+- [@video@Create and Use Lambda Layers](https://www.youtube.com/watch?v=jyuZDkiHe2Q)
diff --git a/src/data/roadmaps/backend/backend-beginner.json b/src/data/roadmaps/backend/backend-beginner.json
index b47a78a6e..86f2601c3 100644
--- a/src/data/roadmaps/backend/backend-beginner.json
+++ b/src/data/roadmaps/backend/backend-beginner.json
@@ -1 +1 @@
-{"nodes":[{"id":"UFd8PEg6IwJMXvuv8Ow1f","type":"section","position":{"x":8.678189763286014,"y":689.9126418589183},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":145,"height":123,"style":{"width":145,"height":123},"positionAbsolute":{"x":8.678189763286014,"y":689.9126418589183},"dragging":false,"resizing":false,"focusable":true,"selectable":true},{"id":"Ju00mr0KLGN2BV6yEQGPt","type":"vertical","position":{"x":-204.47806963137555,"y":1491.372464537289},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#4136D4"}},"zIndex":999,"width":20,"height":104,"positionAbsolute":{"x":-204.47806963137555,"y":1491.372464537289},"dragging":false,"style":{"width":20,"height":104},"resizing":false,"focusable":true,"selectable":true},{"width":413,"height":124,"id":"sVXZrBCsiSzWBBYWTm-nQ","type":"paragraph","position":{"x":-400.97806963137555,"y":1404.0164397619342},"selected":true,"data":{"label":"Have a look at the detailed version","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center","borderColor":"#000000","backgroundColor":"#ffffff"},"oldId":"0vLaVNJaJSHZ_bHli6Qzs"},"zIndex":999,"positionAbsolute":{"x":-400.97806963137555,"y":1404.0164397619342},"dragging":false,"style":{"width":413,"height":124},"resizing":false,"focusable":true,"selectable":true},{"width":231,"height":49,"id":"EwvLPSI6AlZ4TnNIJTZA4","type":"topic","position":{"x":-309.58230823147517,"y":635.9941785421215},"selected":true,"data":{"label":"Learn about APIs","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"iGeAiNtqNadlJVDmd-p-g"},"style":{"width":231,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-309.58230823147517,"y":635.9941785421215},"dragging":false,"resizing":false,"selectable":true},{"width":152,"height":68,"id":"iogwMmOvub2ZF4zgg6WyF","type":"title","position":{"x":-270.08230823147517,"y":-119.42445334555111},"selected":true,"data":{"label":"Backend","style":{"fontSize":28,"justifyContent":"flex-start","textAlign":"center"},"oldId":"9nxw2PEl-_eQPW0FHNPq2"},"zIndex":999,"dragging":false,"positionAbsolute":{"x":-270.08230823147517,"y":-119.42445334555111},"focusable":true,"selectable":true},{"width":126,"height":49,"id":"BdXbcz4-ar3XOX0wIKzBp","type":"subtopic","position":{"x":-555.4238043165935,"y":57.59280263144706},"selected":true,"data":{"label":"Go","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"Of5xsnf0QtksCDnCCHKIv","legend":{"id":"DMx7rAjVBWMbzjSde-tvp","label":"Alternative Option / Pick this or purple","color":"#4f7a28","position":"left-center"}},"style":{"width":126,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-555.4238043165935,"y":57.59280263144706},"dragging":false,"resizing":false,"selectable":true},{"width":126,"height":49,"id":"8-lO-v6jCYYoklEJXULxN","type":"subtopic","position":{"x":-555.4238043165935,"y":4.592802631447057},"selected":true,"data":{"label":"JavaScript","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"CyQ_GODtWgrz6Uikts5bJ","legend":{"id":"NJhQIvMyMD1Cu-JA1UCmJ","color":"#874efe","label":"Personal Recommendation / Opinion","position":"left-center"}},"style":{"width":126,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-555.4238043165935,"y":4.592802631447057},"dragging":false,"resizing":false,"selectable":true},{"width":126,"height":49,"id":"J_sVHsD72Yzyqb9KCIvAY","type":"subtopic","position":{"x":-555.4238043165935,"y":110.59280263144706},"selected":true,"data":{"label":"Python","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"FIPHmInvgJg9e8KqDAh2g","legend":{"id":"DMx7rAjVBWMbzjSde-tvp","label":"Alternative Option / Pick this or purple","color":"#4f7a28","position":"left-center"}},"style":{"width":126,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-555.4238043165935,"y":110.59280263144706},"dragging":false,"resizing":false,"selectable":true},{"width":231,"height":50,"id":"2f0ZO6GJElfZ2Eis28Hzg","type":"topic","position":{"x":-310.2043395768536,"y":54.70730350215206},"selected":true,"data":{"label":"Pick a Language","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"uGqgITLdZbxJdGUihNqxV"},"style":{"width":231,"height":50},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-310.2043395768536,"y":54.70730350215206},"dragging":false,"resizing":false,"selectable":true},{"width":132,"height":49,"id":"_I1E__wCIVrhjMk6IMieE","type":"subtopic","position":{"x":-532.4238043165935,"y":309.642069464665},"selected":true,"data":{"label":"Git","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"eyP1K2ve-C0gDYt6Hdgw0","legend":{"id":"NJhQIvMyMD1Cu-JA1UCmJ","color":"#874efe","label":"Personal Recommendation / Opinion","position":"left-center"}},"style":{"width":132,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-532.4238043165935,"y":309.642069464665},"dragging":false,"resizing":false,"selectable":true},{"width":231,"height":49,"id":"ezdqQW9wTUw93F6kjOzku","type":"topic","position":{"x":-310.2043395768536,"y":309.642069464665},"selected":true,"data":{"label":"Version Control Systems","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"f2sY4RLE0k8vVAfZFnxgj"},"style":{"width":231,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-310.2043395768536,"y":309.642069464665},"dragging":false,"selectable":true},{"width":132,"height":49,"id":"ptD8EVqwFUYr4W5A_tABY","type":"subtopic","position":{"x":-532.4238043165935,"y":366.10143585693174},"selected":true,"data":{"label":"Github","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"eCkVAP0s0GKyY88M2fBDS","legend":{"id":"NJhQIvMyMD1Cu-JA1UCmJ","color":"#874efe","label":"Personal Recommendation / Opinion","position":"left-center"}},"style":{"width":132,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-532.4238043165935,"y":366.10143585693174},"dragging":false,"selectable":true,"resizing":false},{"width":231,"height":49,"id":"NvUcSDWBhzJZ31nzT4UlE","type":"topic","position":{"x":-310.2043395768536,"y":366.10143585693174},"selected":true,"data":{"label":"Repo hosting services","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"I-NkKNiKBNB6f8QaFzRgU"},"style":{"width":231,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-310.2043395768536,"y":366.10143585693174},"dragging":false,"resizing":false,"selectable":true},{"width":145,"height":49,"id":"FihTrMO56kj9jT8O_pO2T","type":"subtopic","position":{"x":6.417691768524833,"y":485.10143585693174},"selected":true,"data":{"label":"PostgreSQL","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"lNsaFZwGE7vA0Km-Jfft4","legend":{"id":"NJhQIvMyMD1Cu-JA1UCmJ","color":"#874efe","label":"Personal Recommendation / Opinion","position":"right-center"}},"style":{"width":145,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":6.417691768524833,"y":485.10143585693174},"dragging":false,"resizing":false,"selectable":true},{"width":231,"height":50,"id":"r45b461NxLN6wBODJ5CNP","type":"topic","position":{"x":-310.2043395768536,"y":485.10143585693174},"selected":true,"data":{"label":"Relational Databases","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"sJ04XNIM7JqzHnffWd5UM"},"style":{"width":231,"height":50},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-310.2043395768536,"y":485.10143585693174},"dragging":false,"resizing":false,"selectable":true},{"width":161,"height":49,"id":"Z7jp_Juj5PffSxV7UZcBb","type":"subtopic","position":{"x":-610.8178956686777,"y":958.4323026615212},"selected":true,"data":{"label":"ORMs","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"FHrVrP-ndnV8MsDKMxdsq"},"style":{"width":161,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-610.8178956686777,"y":958.4323026615212},"dragging":false,"selectable":true},{"width":161,"height":49,"id":"qSAdfaGUfn8mtmDjHJi3z","type":"subtopic","position":{"x":-610.8178956686777,"y":1012.4323026615212},"selected":true,"data":{"label":"ACID","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"4aBoOyTn1ALDRHYcfwzHf"},"style":{"width":161,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-610.8178956686777,"y":1012.4323026615212},"dragging":false,"selectable":true},{"width":161,"height":49,"id":"rq_y_OBMD9AH_4aoecvAi","type":"subtopic","position":{"x":-610.8178956686777,"y":1066.4323026615211},"selected":true,"data":{"label":"Transactions","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"plXELtRHevUzYUL3doQSs"},"style":{"width":161,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-610.8178956686777,"y":1066.4323026615211},"dragging":false,"selectable":true},{"width":161,"height":49,"id":"bQnOAu863hsHdyNMNyJop","type":"subtopic","position":{"x":-610.8178956686777,"y":1120.4323026615211},"selected":true,"data":{"label":"N+1 Problem","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"5pdTq6LCx8VXjd0-J1a1s"},"style":{"width":161,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-610.8178956686777,"y":1120.4323026615211},"dragging":false,"selectable":true},{"width":231,"height":49,"id":"LJt27onEOeIBomiEMTyKd","type":"topic","position":{"x":-310.2043395768536,"y":1011.4323026615211},"selected":true,"data":{"label":"More about Databases","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"pNTfCAoFYG6YwBm5EOCvw"},"style":{"width":231,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-310.2043395768536,"y":1011.4323026615211},"dragging":false,"selectable":true,"resizing":false},{"width":145,"height":49,"id":"sNceS4MpSIjRkWhNDmrFg","type":"subtopic","position":{"x":8.678189763286014,"y":635.9941785421215},"selected":true,"data":{"label":"JSON APIs","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"eZd-7w3ka8BhaAx8kGTgi","legend":{"id":"NJhQIvMyMD1Cu-JA1UCmJ","color":"#874efe","label":"Personal Recommendation / Opinion","position":"right-center"}},"style":{"width":145,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":8.678189763286014,"y":635.9941785421215},"dragging":false,"selectable":true,"resizing":false},{"width":146,"height":49,"id":"lfNFDZZNdrB0lbEaMtU71","type":"subtopic","position":{"x":6.417691768524833,"y":582.9941785421215},"selected":true,"data":{"label":"REST","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"gVsbyjVssRCpAf6r-tF0O","legend":{"id":"NJhQIvMyMD1Cu-JA1UCmJ","color":"#874efe","label":"Personal Recommendation / Opinion","position":"right-center"}},"style":{"width":146,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":6.417691768524833,"y":582.9941785421215},"dragging":false,"selectable":true,"resizing":false},{"width":231,"height":49,"id":"ELj8af7Mi38kUbaPJfCUR","type":"topic","position":{"x":-310.2043395768536,"y":726.4861514388111},"selected":true,"data":{"label":"Caching","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"T632e8R4J001IajMm9yp7"},"style":{"width":231,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-310.2043395768536,"y":726.4861514388111},"dragging":false,"selectable":true,"resizing":false},{"width":190,"height":49,"id":"381Kw1IMRv7CJp-Uf--qd","type":"subtopic","position":{"x":43.00948964805815,"y":1187.4900452642225},"selected":true,"data":{"label":"Integration Testing","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"U7mP1unVOQgVXCCuXh8De"},"style":{"width":190,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":43.00948964805815,"y":1187.4900452642225},"dragging":false,"resizing":false,"selectable":true},{"width":193,"height":49,"id":"NAGisfq2CgeK3SsuRjnMw","type":"subtopic","position":{"x":43.00948964805815,"y":1295.4900452642225},"selected":true,"data":{"label":"Functional Testing","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"Lcb9mmKc5k2UofZ0_o6Rs"},"style":{"width":193,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":43.00948964805815,"y":1295.4900452642225},"dragging":false,"resizing":false,"selectable":true},{"width":193,"height":49,"id":"3OYm6b9f6WOrKi4KTOZYK","type":"subtopic","position":{"x":43.00948964805815,"y":1241.4900452642225},"selected":true,"data":{"label":"Unit Testing","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"J_kRwf-neWCW5DjfBmybt"},"style":{"width":193,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":43.00948964805815,"y":1241.4900452642225},"dragging":false,"resizing":false,"selectable":true},{"width":231,"height":49,"id":"STQQbPa7PE3gbjMdL6P-t","type":"topic","position":{"x":-310.2043395768536,"y":1244.3669598992026},"selected":true,"data":{"label":"Testing","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"RFUPBl2Q9hBXP9HacPOo1"},"style":{"width":231,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-310.2043395768536,"y":1244.3669598992026},"dragging":false,"selectable":true},{"width":100,"height":49,"id":"g8GjkJAhvnSxXTZks0V1g","type":"subtopic","position":{"x":-465.97806963137555,"y":726.4861514388111},"selected":true,"data":{"label":"Redis","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"xPvVwGQw28uMeLYIWn8yn"},"style":{"width":100,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-465.97806963137555,"y":726.4861514388111},"dragging":false,"resizing":false,"selectable":true},{"width":375,"height":49,"id":"uSLzfLPXxS5-P7ozscvjZ","type":"button","position":{"x":-383.56446376179997,"y":1460.4861971343921},"selected":true,"data":{"label":"Backend Developer Roadmap","href":"https://roadmap.sh/backend","color":"#FFFFFf","backgroundColor":"#4136D4","style":{"fontSize":17},"borderColor":"#4136D4","oldId":"PkhQdVms2TGgnPrytCBPZ"},"zIndex":999,"dragging":false,"positionAbsolute":{"x":-383.56446376179997,"y":1460.4861971343921},"style":{"width":375,"height":49},"focusable":true,"resizing":false,"selectable":true},{"width":20,"height":102,"id":"LEijbLyxg4RyutKEM2Y5g","type":"vertical","position":{"x":-204.08230823147517,"y":-220.42445334555111},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#0A33FF"},"oldId":"xD07fJ1NmNeAarVCEfubU"},"zIndex":999,"positionAbsolute":{"x":-204.08230823147517,"y":-220.42445334555111},"dragging":false,"focusable":true,"style":{"width":20,"height":102},"resizing":false,"selectable":true},{"id":"qN-6iiXWgn5qSzK3o0Tjo","type":"legend","position":{"x":-714.8814218617622,"y":-254.09541222709834},"selected":true,"data":{"label":"","legends":[{"id":"NJhQIvMyMD1Cu-JA1UCmJ","color":"#874efe","label":"Personal Recommendation / Opinion"},{"id":"DMx7rAjVBWMbzjSde-tvp","label":"Alternative Option / Pick this or purple","color":"#4f7a28"},{"id":"R9WLhURhPdVNXP7AUTDvR","label":"Order not strict / Learn anytime","color":"#929292"}]},"zIndex":999,"width":353,"height":124,"positionAbsolute":{"x":-714.8814218617622,"y":-254.09541222709834},"dragging":false,"focusable":true,"selectable":true},{"id":"yHmHXymPNWwu8p1vvqD3o","type":"paragraph","position":{"x":-14.502815208049242,"y":-245.15106699547107},"selected":true,"data":{"label":"Find the detailed version of this roadmap along with other similar roadmaps","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left","borderColor":"#000000","backgroundColor":"#FFFFFf"}},"zIndex":999,"width":354,"height":143,"positionAbsolute":{"x":-14.502815208049242,"y":-245.15106699547107},"dragging":false,"selectable":true,"focusable":true,"style":{"width":354,"height":143},"resizing":false},{"id":"2zqZkyVgigifcRS1H7F_b","type":"button","position":{"x":-1.2994407952490974,"y":-163.1655035777258},"selected":true,"data":{"label":"roadmap.sh","href":"https://roadmap.sh","color":"#ffffff","backgroundColor":"#4136D6","style":{"fontSize":17}},"zIndex":999,"width":329,"height":49,"dragging":false,"style":{"width":329,"height":49},"resizing":false,"positionAbsolute":{"x":-1.2994407952490974,"y":-163.1655035777258},"selectable":true,"focusable":true},{"id":"MfErpYwkJ0wiWJZEUVfrb","type":"button","position":{"x":-714.8814218617622,"y":-115.72969257809785},"selected":true,"data":{"label":"Visit the Detailed Version","href":"/backend","color":"#ffffff","backgroundColor":"#232323","style":{"fontSize":17},"oldId":"2zqZkyVgigifcRS1H7F_b"},"zIndex":999,"width":351,"height":49,"dragging":false,"style":{"width":351,"height":49},"resizing":false,"positionAbsolute":{"x":-714.8814218617622,"y":-115.72969257809785},"selectable":true,"focusable":true},{"width":145,"height":49,"id":"PY9G7KQy8bF6eIdr1ydHf","type":"subtopic","position":{"x":8.678189763286014,"y":689.9126418589183},"selected":true,"data":{"label":"Authentication","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"lfNFDZZNdrB0lbEaMtU71"},"style":{"width":145,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":8.678189763286014,"y":689.9126418589183},"dragging":false,"resizing":false,"selectable":true},{"width":123,"height":49,"id":"UxS_mzVUjLigEwKrXnEeB","type":"subtopic","position":{"x":20.030089179073684,"y":749.5986472065365},"selected":true,"data":{"label":"JWT","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"PY9G7KQy8bF6eIdr1ydHf"},"style":{"width":123,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":20.030089179073684,"y":749.5986472065365},"dragging":false,"resizing":false,"selectable":true},{"id":"le7iJXCULjq_4FHrhrQWu","type":"paragraph","position":{"x":-28.74067173877563,"y":-51.424453345551115},"selected":true,"data":{"label":"If you are a frontend developer jumping into backend development, I would recommend picking JavaScript and learning Node.js. Alternatively, Go and Python are also good options.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left"}},"zIndex":999,"width":360,"height":157,"positionAbsolute":{"x":-28.74067173877563,"y":-51.424453345551115},"dragging":false,"style":{"width":360,"height":157},"resizing":true,"selectable":true,"focusable":true},{"id":"wgdSRXw6AcPAwQZ0mqBAB","type":"paragraph","position":{"x":-28.74067173877563,"y":100.59280263144706},"selected":true,"data":{"label":"Learn the language and build some CLI apps to practice your konwledge.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left","color":"#001eff"},"oldId":"le7iJXCULjq_4FHrhrQWu"},"zIndex":999,"width":360,"height":88,"positionAbsolute":{"x":-28.74067173877563,"y":100.59280263144706},"dragging":false,"style":{"width":360},"resizing":false,"selectable":true,"focusable":true},{"id":"2BX-MgyEp1AGgtdnUITh5","type":"paragraph","position":{"x":-704.3814218617622,"y":178.57554665444889},"selected":true,"data":{"label":"When you are following this roadmap make sure to develop as many projects as possible for each node of the roadmap.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left","color":"#0033ff"},"oldId":"le7iJXCULjq_4FHrhrQWu"},"zIndex":999,"width":360,"height":114,"positionAbsolute":{"x":-704.3814218617622,"y":178.57554665444889},"dragging":false,"style":{"width":360},"resizing":true,"selectable":true,"focusable":true},{"id":"uM-SRBYQen3ZFiCDAyaJa","type":"paragraph","position":{"x":-28.74067173877563,"y":242.57554665444889},"selected":true,"data":{"label":"Create your GitHub profile and start using GitHub for your future projects.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left"},"oldId":"le7iJXCULjq_4FHrhrQWu"},"zIndex":999,"width":360,"height":88,"positionAbsolute":{"x":-28.74067173877563,"y":242.57554665444889},"dragging":false,"style":{"width":360},"resizing":true,"selectable":true,"focusable":true},{"id":"UAbZBrVgdgCyG0GtU7HgE","type":"paragraph","position":{"x":-28.74067173877563,"y":309.642069464665},"selected":true,"data":{"label":"See if any of your past projects can be published on GitHub as OpenSource.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left","color":"#001eff"},"oldId":"wgdSRXw6AcPAwQZ0mqBAB"},"zIndex":999,"width":360,"height":88,"positionAbsolute":{"x":-28.74067173877563,"y":309.642069464665},"dragging":false,"style":{"width":360},"resizing":false,"selectable":true,"focusable":true},{"id":"WE87iPjyRBuLSQjW1-lQA","type":"paragraph","position":{"x":-704.3814218617622,"y":452.60143585693174},"selected":true,"data":{"label":"Learn about the relational databases, normalization, DB migrations, SQL, DB Indexes and Query performance analysis.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left"},"oldId":"uM-SRBYQen3ZFiCDAyaJa"},"zIndex":999,"width":360,"height":114,"positionAbsolute":{"x":-704.3814218617622,"y":452.60143585693174},"dragging":false,"style":{"width":360},"resizing":true,"selectable":true,"focusable":true},{"id":"s1dRHfNP8Q6ytjueRHb1n","type":"paragraph","position":{"x":-704.3814218617622,"y":581.9126418589183},"selected":true,"data":{"label":"Learn how to build RESTful APIs and add JWT authentication to secure your APIs.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left"},"oldId":"WE87iPjyRBuLSQjW1-lQA"},"zIndex":999,"width":360,"height":88,"positionAbsolute":{"x":-704.3814218617622,"y":581.9126418589183},"dragging":false,"style":{"width":360},"resizing":true,"selectable":true,"focusable":true},{"id":"1HAWiOizGfG3OT9KouNQg","type":"paragraph","position":{"x":-704.3814218617622,"y":643.4861514388111},"selected":true,"data":{"label":"Develop some API and add JWT auth.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left","color":"#001eff"},"oldId":"UAbZBrVgdgCyG0GtU7HgE"},"zIndex":999,"width":360,"height":63,"positionAbsolute":{"x":-704.3814218617622,"y":643.4861514388111},"dragging":false,"style":{"width":360},"resizing":false,"selectable":true,"focusable":true},{"id":"W8BIrC9VsUc4Z0t6G_FnZ","type":"paragraph","position":{"x":-696.2667613883802,"y":793.5986472065365},"selected":true,"data":{"label":"Learn about different caching strategies, including HTTP caching as well.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left"},"oldId":"s1dRHfNP8Q6ytjueRHb1n"},"zIndex":999,"width":360,"height":88,"positionAbsolute":{"x":-696.2667613883802,"y":793.5986472065365},"dragging":false,"style":{"width":360},"resizing":true,"selectable":true,"focusable":true},{"id":"lIC09zhXysTm3qlAJqWMI","type":"paragraph","position":{"x":-696.2667613883802,"y":851.4861514388111},"selected":true,"data":{"label":"Use Redis in some of your projects.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left","color":"#001eff"},"oldId":"1HAWiOizGfG3OT9KouNQg"},"zIndex":999,"width":360,"height":63,"positionAbsolute":{"x":-696.2667613883802,"y":851.4861514388111},"dragging":false,"style":{"width":360},"resizing":false,"selectable":true,"focusable":true},{"id":"wMVGAEIHhVbL6ZXGZOb8Q","type":"paragraph","position":{"x":-167.56446376179997,"y":824.4323026615212},"selected":true,"data":{"label":"Learn about additional database topics including performance analysis, ORMs, limitations, common issues to keep in mind with ORMs and in general.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left"},"oldId":"W8BIrC9VsUc4Z0t6G_FnZ"},"zIndex":999,"width":338,"height":137,"positionAbsolute":{"x":-167.56446376179997,"y":824.4323026615212},"dragging":false,"style":{"width":338,"height":137},"resizing":false,"selectable":true,"focusable":true},{"id":"Lj9dbZmTjKHvooKWLEkhU","type":"paragraph","position":{"x":-167.56446376179997,"y":938.4323026615212},"selected":true,"data":{"label":"Get some experience with some ORM.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left","color":"#001eff"},"oldId":"lIC09zhXysTm3qlAJqWMI"},"zIndex":999,"width":360,"height":63,"positionAbsolute":{"x":-167.56446376179997,"y":938.4323026615212},"dragging":false,"style":{"width":360},"resizing":false,"selectable":true,"focusable":true},{"id":"lxFXAD1DAeq3bGovSEuXE","type":"paragraph","position":{"x":-167.56446376179997,"y":1073.4323026615211},"selected":true,"data":{"label":"Learn about differeng testing techniques and learn learn how to write automated tests.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left"},"oldId":"wMVGAEIHhVbL6ZXGZOb8Q"},"zIndex":999,"width":396,"height":96,"positionAbsolute":{"x":-167.56446376179997,"y":1073.4323026615211},"dragging":false,"style":{"width":396,"height":96},"resizing":false,"selectable":true,"focusable":true}],"edges":[{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"sourceHandle":"x2","target":"sVXZrBCsiSzWBBYWTm-nQ","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"PShueM-HfMGu2Jy1dt73g","selected":true,"type":"smoothstep","focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"STQQbPa7PE3gbjMdL6P-t","sourceHandle":"z2","target":"3OYm6b9f6WOrKi4KTOZYK","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-STQQbPa7PE3gbjMdL6P-tz2-3OYm6b9f6WOrKi4KTOZYKy1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"STQQbPa7PE3gbjMdL6P-t","sourceHandle":"z2","target":"381Kw1IMRv7CJp-Uf--qd","targetHandle":"y2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-STQQbPa7PE3gbjMdL6P-tz2-381Kw1IMRv7CJp-Uf--qdy2","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"STQQbPa7PE3gbjMdL6P-t","sourceHandle":"z2","target":"NAGisfq2CgeK3SsuRjnMw","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-STQQbPa7PE3gbjMdL6P-tz2-NAGisfq2CgeK3SsuRjnMwy1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"iogwMmOvub2ZF4zgg6WyF","sourceHandle":"x2","target":"2f0ZO6GJElfZ2Eis28Hzg","targetHandle":"w1","data":{"edgeStyle":"solid"},"selected":true,"id":"reactflow__edge-iogwMmOvub2ZF4zgg6WyFx2-2f0ZO6GJElfZ2Eis28Hzgw1","selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"2f0ZO6GJElfZ2Eis28Hzg","sourceHandle":"y2","target":"8-lO-v6jCYYoklEJXULxN","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-2f0ZO6GJElfZ2Eis28Hzgy2-8-lO-v6jCYYoklEJXULxNz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"2f0ZO6GJElfZ2Eis28Hzg","sourceHandle":"y2","target":"BdXbcz4-ar3XOX0wIKzBp","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-2f0ZO6GJElfZ2Eis28Hzgy2-BdXbcz4-ar3XOX0wIKzBpz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"2f0ZO6GJElfZ2Eis28Hzg","sourceHandle":"y2","target":"J_sVHsD72Yzyqb9KCIvAY","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-2f0ZO6GJElfZ2Eis28Hzgy2-J_sVHsD72Yzyqb9KCIvAYz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"2f0ZO6GJElfZ2Eis28Hzg","sourceHandle":"x2","target":"ezdqQW9wTUw93F6kjOzku","targetHandle":"w1","data":{"edgeStyle":"solid"},"selected":true,"focusable":true,"selectable":true,"id":"reactflow__edge-2f0ZO6GJElfZ2Eis28Hzgx2-ezdqQW9wTUw93F6kjOzkuw1"},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"ezdqQW9wTUw93F6kjOzku","sourceHandle":"y2","target":"_I1E__wCIVrhjMk6IMieE","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-ezdqQW9wTUw93F6kjOzkuy2-_I1E__wCIVrhjMk6IMieEz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"NvUcSDWBhzJZ31nzT4UlE","sourceHandle":"y2","target":"ptD8EVqwFUYr4W5A_tABY","targetHandle":"z1","data":{"edgeStyle":"dashed"},"selected":true,"focusable":true,"selectable":true,"id":"reactflow__edge-NvUcSDWBhzJZ31nzT4UlEy2-ptD8EVqwFUYr4W5A_tABYz1"},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"NvUcSDWBhzJZ31nzT4UlE","sourceHandle":"x2","target":"r45b461NxLN6wBODJ5CNP","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-NvUcSDWBhzJZ31nzT4UlEx2-r45b461NxLN6wBODJ5CNPw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"r45b461NxLN6wBODJ5CNP","sourceHandle":"z2","target":"FihTrMO56kj9jT8O_pO2T","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-r45b461NxLN6wBODJ5CNPz2-FihTrMO56kj9jT8O_pO2Ty1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"r45b461NxLN6wBODJ5CNP","sourceHandle":"x2","target":"EwvLPSI6AlZ4TnNIJTZA4","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-r45b461NxLN6wBODJ5CNPx2-EwvLPSI6AlZ4TnNIJTZA4w1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"EwvLPSI6AlZ4TnNIJTZA4","sourceHandle":"z2","target":"lfNFDZZNdrB0lbEaMtU71","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-EwvLPSI6AlZ4TnNIJTZA4z2-lfNFDZZNdrB0lbEaMtU71y1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"EwvLPSI6AlZ4TnNIJTZA4","sourceHandle":"z2","target":"sNceS4MpSIjRkWhNDmrFg","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-EwvLPSI6AlZ4TnNIJTZA4z2-sNceS4MpSIjRkWhNDmrFgy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"EwvLPSI6AlZ4TnNIJTZA4","sourceHandle":"z2","target":"PY9G7KQy8bF6eIdr1ydHf","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-EwvLPSI6AlZ4TnNIJTZA4z2-PY9G7KQy8bF6eIdr1ydHfy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"EwvLPSI6AlZ4TnNIJTZA4","sourceHandle":"x2","target":"ELj8af7Mi38kUbaPJfCUR","targetHandle":"w2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-EwvLPSI6AlZ4TnNIJTZA4x2-ELj8af7Mi38kUbaPJfCURw2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"ELj8af7Mi38kUbaPJfCUR","sourceHandle":"y2","target":"g8GjkJAhvnSxXTZks0V1g","targetHandle":"z2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-ELj8af7Mi38kUbaPJfCURy2-g8GjkJAhvnSxXTZks0V1gz2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"LJt27onEOeIBomiEMTyKd","sourceHandle":"y2","target":"Z7jp_Juj5PffSxV7UZcBb","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-LJt27onEOeIBomiEMTyKdy2-Z7jp_Juj5PffSxV7UZcBbz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"LJt27onEOeIBomiEMTyKd","sourceHandle":"y2","target":"qSAdfaGUfn8mtmDjHJi3z","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-LJt27onEOeIBomiEMTyKdy2-qSAdfaGUfn8mtmDjHJi3zz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"LJt27onEOeIBomiEMTyKd","sourceHandle":"y2","target":"rq_y_OBMD9AH_4aoecvAi","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-LJt27onEOeIBomiEMTyKdy2-rq_y_OBMD9AH_4aoecvAiz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"LJt27onEOeIBomiEMTyKd","sourceHandle":"y2","target":"bQnOAu863hsHdyNMNyJop","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-LJt27onEOeIBomiEMTyKdy2-bQnOAu863hsHdyNMNyJopz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"ELj8af7Mi38kUbaPJfCUR","sourceHandle":"x2","target":"LJt27onEOeIBomiEMTyKd","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-ELj8af7Mi38kUbaPJfCURx2-LJt27onEOeIBomiEMTyKdw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"LJt27onEOeIBomiEMTyKd","sourceHandle":"x2","target":"STQQbPa7PE3gbjMdL6P-t","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-LJt27onEOeIBomiEMTyKdx2-STQQbPa7PE3gbjMdL6P-tw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"STQQbPa7PE3gbjMdL6P-t","sourceHandle":"x2","target":"sVXZrBCsiSzWBBYWTm-nQ","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-STQQbPa7PE3gbjMdL6P-tx2-sVXZrBCsiSzWBBYWTm-nQw1","selected":true,"selectable":true,"focusable":true}]}
\ No newline at end of file
+{"nodes":[{"id":"UFd8PEg6IwJMXvuv8Ow1f","type":"section","position":{"x":8.678189763286014,"y":689.9126418589183},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":145,"height":123,"style":{"width":145,"height":123},"positionAbsolute":{"x":8.678189763286014,"y":689.9126418589183},"dragging":false,"resizing":false,"focusable":true,"selectable":true},{"id":"Ju00mr0KLGN2BV6yEQGPt","type":"vertical","position":{"x":-204.47806963137555,"y":1491.372464537289},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#4136D4"}},"zIndex":999,"width":20,"height":104,"positionAbsolute":{"x":-204.47806963137555,"y":1491.372464537289},"dragging":false,"style":{"width":20,"height":104},"resizing":false,"focusable":true,"selectable":true},{"width":413,"height":124,"id":"sVXZrBCsiSzWBBYWTm-nQ","type":"paragraph","position":{"x":-400.97806963137555,"y":1404.0164397619342},"selected":true,"data":{"label":"Have a look at the detailed version","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center","borderColor":"#000000","backgroundColor":"#ffffff"},"oldId":"0vLaVNJaJSHZ_bHli6Qzs"},"zIndex":999,"positionAbsolute":{"x":-400.97806963137555,"y":1404.0164397619342},"dragging":false,"style":{"width":413,"height":124},"resizing":false,"focusable":true,"selectable":true},{"width":231,"height":49,"id":"EwvLPSI6AlZ4TnNIJTZA4","type":"topic","position":{"x":-309.58230823147517,"y":635.9941785421215},"selected":true,"data":{"label":"Learn about APIs","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"iGeAiNtqNadlJVDmd-p-g"},"style":{"width":231,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-309.58230823147517,"y":635.9941785421215},"dragging":false,"resizing":false,"selectable":true},{"width":152,"height":68,"id":"iogwMmOvub2ZF4zgg6WyF","type":"title","position":{"x":-270.08230823147517,"y":-119.42445334555111},"selected":true,"data":{"label":"Backend","style":{"fontSize":28,"justifyContent":"flex-start","textAlign":"center"},"oldId":"9nxw2PEl-_eQPW0FHNPq2"},"zIndex":999,"dragging":false,"positionAbsolute":{"x":-270.08230823147517,"y":-119.42445334555111},"focusable":true,"selectable":true},{"width":126,"height":49,"id":"BdXbcz4-ar3XOX0wIKzBp","type":"subtopic","position":{"x":-555.4238043165935,"y":57.59280263144706},"selected":true,"data":{"label":"Go","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"Of5xsnf0QtksCDnCCHKIv","legend":{"id":"DMx7rAjVBWMbzjSde-tvp","label":"Alternative Option / Pick this or purple","color":"#4f7a28","position":"left-center"}},"style":{"width":126,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-555.4238043165935,"y":57.59280263144706},"dragging":false,"resizing":false,"selectable":true},{"width":126,"height":49,"id":"8-lO-v6jCYYoklEJXULxN","type":"subtopic","position":{"x":-555.4238043165935,"y":4.592802631447057},"selected":true,"data":{"label":"JavaScript","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"CyQ_GODtWgrz6Uikts5bJ","legend":{"id":"NJhQIvMyMD1Cu-JA1UCmJ","color":"#874efe","label":"Personal Recommendation / Opinion","position":"left-center"}},"style":{"width":126,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-555.4238043165935,"y":4.592802631447057},"dragging":false,"resizing":false,"selectable":true},{"width":126,"height":49,"id":"J_sVHsD72Yzyqb9KCIvAY","type":"subtopic","position":{"x":-555.4238043165935,"y":110.59280263144706},"selected":true,"data":{"label":"Python","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"FIPHmInvgJg9e8KqDAh2g","legend":{"id":"DMx7rAjVBWMbzjSde-tvp","label":"Alternative Option / Pick this or purple","color":"#4f7a28","position":"left-center"}},"style":{"width":126,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-555.4238043165935,"y":110.59280263144706},"dragging":false,"resizing":false,"selectable":true},{"width":231,"height":50,"id":"2f0ZO6GJElfZ2Eis28Hzg","type":"topic","position":{"x":-310.2043395768536,"y":54.70730350215206},"selected":true,"data":{"label":"Pick a Language","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"uGqgITLdZbxJdGUihNqxV"},"style":{"width":231,"height":50},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-310.2043395768536,"y":54.70730350215206},"dragging":false,"resizing":false,"selectable":true},{"width":132,"height":49,"id":"_I1E__wCIVrhjMk6IMieE","type":"subtopic","position":{"x":-532.4238043165935,"y":309.642069464665},"selected":true,"data":{"label":"Git","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"eyP1K2ve-C0gDYt6Hdgw0","legend":{"id":"NJhQIvMyMD1Cu-JA1UCmJ","color":"#874efe","label":"Personal Recommendation / Opinion","position":"left-center"}},"style":{"width":132,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-532.4238043165935,"y":309.642069464665},"dragging":false,"resizing":false,"selectable":true},{"width":231,"height":49,"id":"ezdqQW9wTUw93F6kjOzku","type":"topic","position":{"x":-310.2043395768536,"y":309.642069464665},"selected":true,"data":{"label":"Version Control Systems","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"f2sY4RLE0k8vVAfZFnxgj"},"style":{"width":231,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-310.2043395768536,"y":309.642069464665},"dragging":false,"selectable":true},{"width":132,"height":49,"id":"ptD8EVqwFUYr4W5A_tABY","type":"subtopic","position":{"x":-532.4238043165935,"y":366.10143585693174},"selected":true,"data":{"label":"Github","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"eCkVAP0s0GKyY88M2fBDS","legend":{"id":"NJhQIvMyMD1Cu-JA1UCmJ","color":"#874efe","label":"Personal Recommendation / Opinion","position":"left-center"}},"style":{"width":132,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-532.4238043165935,"y":366.10143585693174},"dragging":false,"selectable":true,"resizing":false},{"width":231,"height":49,"id":"NvUcSDWBhzJZ31nzT4UlE","type":"topic","position":{"x":-310.2043395768536,"y":366.10143585693174},"selected":true,"data":{"label":"Repo hosting services","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"I-NkKNiKBNB6f8QaFzRgU"},"style":{"width":231,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-310.2043395768536,"y":366.10143585693174},"dragging":false,"resizing":false,"selectable":true},{"width":145,"height":49,"id":"FihTrMO56kj9jT8O_pO2T","type":"subtopic","position":{"x":6.417691768524833,"y":485.10143585693174},"selected":true,"data":{"label":"PostgreSQL","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"lNsaFZwGE7vA0Km-Jfft4","legend":{"id":"NJhQIvMyMD1Cu-JA1UCmJ","color":"#874efe","label":"Personal Recommendation / Opinion","position":"right-center"}},"style":{"width":145,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":6.417691768524833,"y":485.10143585693174},"dragging":false,"resizing":false,"selectable":true},{"width":231,"height":50,"id":"r45b461NxLN6wBODJ5CNP","type":"topic","position":{"x":-310.2043395768536,"y":485.10143585693174},"selected":true,"data":{"label":"Relational Databases","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"sJ04XNIM7JqzHnffWd5UM"},"style":{"width":231,"height":50},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-310.2043395768536,"y":485.10143585693174},"dragging":false,"resizing":false,"selectable":true},{"width":161,"height":49,"id":"Z7jp_Juj5PffSxV7UZcBb","type":"subtopic","position":{"x":-610.8178956686777,"y":958.4323026615212},"selected":true,"data":{"label":"ORMs","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"FHrVrP-ndnV8MsDKMxdsq"},"style":{"width":161,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-610.8178956686777,"y":958.4323026615212},"dragging":false,"selectable":true},{"width":161,"height":49,"id":"qSAdfaGUfn8mtmDjHJi3z","type":"subtopic","position":{"x":-610.8178956686777,"y":1012.4323026615212},"selected":true,"data":{"label":"ACID","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"4aBoOyTn1ALDRHYcfwzHf"},"style":{"width":161,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-610.8178956686777,"y":1012.4323026615212},"dragging":false,"selectable":true},{"width":161,"height":49,"id":"rq_y_OBMD9AH_4aoecvAi","type":"subtopic","position":{"x":-610.8178956686777,"y":1066.4323026615211},"selected":true,"data":{"label":"Transactions","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"plXELtRHevUzYUL3doQSs"},"style":{"width":161,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-610.8178956686777,"y":1066.4323026615211},"dragging":false,"selectable":true},{"width":161,"height":49,"id":"bQnOAu863hsHdyNMNyJop","type":"subtopic","position":{"x":-610.8178956686777,"y":1120.4323026615211},"selected":true,"data":{"label":"N+1 Problem","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"5pdTq6LCx8VXjd0-J1a1s"},"style":{"width":161,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-610.8178956686777,"y":1120.4323026615211},"dragging":false,"selectable":true},{"width":231,"height":49,"id":"LJt27onEOeIBomiEMTyKd","type":"topic","position":{"x":-310.2043395768536,"y":1011.4323026615211},"selected":true,"data":{"label":"More about Databases","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"pNTfCAoFYG6YwBm5EOCvw"},"style":{"width":231,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-310.2043395768536,"y":1011.4323026615211},"dragging":false,"selectable":true,"resizing":false},{"width":145,"height":49,"id":"sNceS4MpSIjRkWhNDmrFg","type":"subtopic","position":{"x":8.678189763286014,"y":635.9941785421215},"selected":true,"data":{"label":"JSON APIs","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"eZd-7w3ka8BhaAx8kGTgi","legend":{"id":"NJhQIvMyMD1Cu-JA1UCmJ","color":"#874efe","label":"Personal Recommendation / Opinion","position":"right-center"}},"style":{"width":145,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":8.678189763286014,"y":635.9941785421215},"dragging":false,"selectable":true,"resizing":false},{"width":146,"height":49,"id":"lfNFDZZNdrB0lbEaMtU71","type":"subtopic","position":{"x":6.417691768524833,"y":582.9941785421215},"selected":true,"data":{"label":"REST","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"gVsbyjVssRCpAf6r-tF0O","legend":{"id":"NJhQIvMyMD1Cu-JA1UCmJ","color":"#874efe","label":"Personal Recommendation / Opinion","position":"right-center"}},"style":{"width":146,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":6.417691768524833,"y":582.9941785421215},"dragging":false,"selectable":true,"resizing":false},{"width":231,"height":49,"id":"ELj8af7Mi38kUbaPJfCUR","type":"topic","position":{"x":-310.2043395768536,"y":726.4861514388111},"selected":true,"data":{"label":"Caching","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"T632e8R4J001IajMm9yp7"},"style":{"width":231,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-310.2043395768536,"y":726.4861514388111},"dragging":false,"selectable":true,"resizing":false},{"width":190,"height":49,"id":"381Kw1IMRv7CJp-Uf--qd","type":"subtopic","position":{"x":43.00948964805815,"y":1187.4900452642225},"selected":true,"data":{"label":"Integration Testing","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"U7mP1unVOQgVXCCuXh8De"},"style":{"width":190,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":43.00948964805815,"y":1187.4900452642225},"dragging":false,"resizing":false,"selectable":true},{"width":193,"height":49,"id":"NAGisfq2CgeK3SsuRjnMw","type":"subtopic","position":{"x":43.00948964805815,"y":1295.4900452642225},"selected":true,"data":{"label":"Functional Testing","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"Lcb9mmKc5k2UofZ0_o6Rs"},"style":{"width":193,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":43.00948964805815,"y":1295.4900452642225},"dragging":false,"resizing":false,"selectable":true},{"width":193,"height":49,"id":"3OYm6b9f6WOrKi4KTOZYK","type":"subtopic","position":{"x":43.00948964805815,"y":1241.4900452642225},"selected":true,"data":{"label":"Unit Testing","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"J_kRwf-neWCW5DjfBmybt"},"style":{"width":193,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":43.00948964805815,"y":1241.4900452642225},"dragging":false,"resizing":false,"selectable":true},{"width":231,"height":49,"id":"STQQbPa7PE3gbjMdL6P-t","type":"topic","position":{"x":-310.2043395768536,"y":1244.3669598992026},"selected":true,"data":{"label":"Testing","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"RFUPBl2Q9hBXP9HacPOo1"},"style":{"width":231,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-310.2043395768536,"y":1244.3669598992026},"dragging":false,"selectable":true},{"width":100,"height":49,"id":"g8GjkJAhvnSxXTZks0V1g","type":"subtopic","position":{"x":-465.97806963137555,"y":726.4861514388111},"selected":true,"data":{"label":"Redis","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"xPvVwGQw28uMeLYIWn8yn"},"style":{"width":100,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":-465.97806963137555,"y":726.4861514388111},"dragging":false,"resizing":false,"selectable":true},{"width":375,"height":49,"id":"uSLzfLPXxS5-P7ozscvjZ","type":"button","position":{"x":-383.56446376179997,"y":1460.4861971343921},"selected":true,"data":{"label":"Backend Developer Roadmap","href":"https://roadmap.sh/backend","color":"#FFFFFf","backgroundColor":"#4136D4","style":{"fontSize":17},"borderColor":"#4136D4","oldId":"PkhQdVms2TGgnPrytCBPZ"},"zIndex":999,"dragging":false,"positionAbsolute":{"x":-383.56446376179997,"y":1460.4861971343921},"style":{"width":375,"height":49},"focusable":true,"resizing":false,"selectable":true},{"width":20,"height":102,"id":"LEijbLyxg4RyutKEM2Y5g","type":"vertical","position":{"x":-204.08230823147517,"y":-220.42445334555111},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#0A33FF"},"oldId":"xD07fJ1NmNeAarVCEfubU"},"zIndex":999,"positionAbsolute":{"x":-204.08230823147517,"y":-220.42445334555111},"dragging":false,"focusable":true,"style":{"width":20,"height":102},"resizing":false,"selectable":true},{"id":"qN-6iiXWgn5qSzK3o0Tjo","type":"legend","position":{"x":-714.8814218617622,"y":-254.09541222709834},"selected":true,"data":{"label":"","legends":[{"id":"NJhQIvMyMD1Cu-JA1UCmJ","color":"#874efe","label":"Personal Recommendation / Opinion"},{"id":"DMx7rAjVBWMbzjSde-tvp","label":"Alternative Option / Pick this or purple","color":"#4f7a28"},{"id":"R9WLhURhPdVNXP7AUTDvR","label":"Order not strict / Learn anytime","color":"#929292"}]},"zIndex":999,"width":353,"height":124,"positionAbsolute":{"x":-714.8814218617622,"y":-254.09541222709834},"dragging":false,"focusable":true,"selectable":true},{"id":"yHmHXymPNWwu8p1vvqD3o","type":"paragraph","position":{"x":-14.502815208049242,"y":-245.15106699547107},"selected":true,"data":{"label":"Find the detailed version of this roadmap along with other similar roadmaps","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left","borderColor":"#000000","backgroundColor":"#FFFFFf"}},"zIndex":999,"width":354,"height":143,"positionAbsolute":{"x":-14.502815208049242,"y":-245.15106699547107},"dragging":false,"selectable":true,"focusable":true,"style":{"width":354,"height":143},"resizing":false},{"id":"2zqZkyVgigifcRS1H7F_b","type":"button","position":{"x":-1.2994407952490974,"y":-163.1655035777258},"selected":true,"data":{"label":"roadmap.sh","href":"https://roadmap.sh","color":"#ffffff","backgroundColor":"#4136D6","style":{"fontSize":17}},"zIndex":999,"width":329,"height":49,"dragging":false,"style":{"width":329,"height":49},"resizing":false,"positionAbsolute":{"x":-1.2994407952490974,"y":-163.1655035777258},"selectable":true,"focusable":true},{"id":"MfErpYwkJ0wiWJZEUVfrb","type":"button","position":{"x":-714.8814218617622,"y":-115.72969257809785},"selected":true,"data":{"label":"Visit the Detailed Version","href":"/backend","color":"#ffffff","backgroundColor":"#232323","style":{"fontSize":17},"oldId":"2zqZkyVgigifcRS1H7F_b"},"zIndex":999,"width":351,"height":49,"dragging":false,"style":{"width":351,"height":49},"resizing":false,"positionAbsolute":{"x":-714.8814218617622,"y":-115.72969257809785},"selectable":true,"focusable":true},{"width":145,"height":49,"id":"PY9G7KQy8bF6eIdr1ydHf","type":"subtopic","position":{"x":8.678189763286014,"y":689.9126418589183},"selected":true,"data":{"label":"Authentication","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"lfNFDZZNdrB0lbEaMtU71"},"style":{"width":145,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":8.678189763286014,"y":689.9126418589183},"dragging":false,"resizing":false,"selectable":true},{"width":123,"height":49,"id":"UxS_mzVUjLigEwKrXnEeB","type":"subtopic","position":{"x":20.030089179073684,"y":749.5986472065365},"selected":true,"data":{"label":"JWT","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"PY9G7KQy8bF6eIdr1ydHf"},"style":{"width":123,"height":49},"zIndex":999,"focusable":true,"positionAbsolute":{"x":20.030089179073684,"y":749.5986472065365},"dragging":false,"resizing":false,"selectable":true},{"id":"le7iJXCULjq_4FHrhrQWu","type":"paragraph","position":{"x":-28.74067173877563,"y":-51.424453345551115},"selected":true,"data":{"label":"If you are a frontend developer jumping into backend development, I would recommend picking JavaScript and learning Node.js. Alternatively, Go and Python are also good options.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left"}},"zIndex":999,"width":360,"height":157,"positionAbsolute":{"x":-28.74067173877563,"y":-51.424453345551115},"dragging":false,"style":{"width":360,"height":157},"resizing":true,"selectable":true,"focusable":true},{"id":"wgdSRXw6AcPAwQZ0mqBAB","type":"paragraph","position":{"x":-28.74067173877563,"y":100.59280263144706},"selected":true,"data":{"label":"Learn the language and build some CLI apps to practice your knowledge.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left","color":"#001eff"},"oldId":"le7iJXCULjq_4FHrhrQWu"},"zIndex":999,"width":360,"height":88,"positionAbsolute":{"x":-28.74067173877563,"y":100.59280263144706},"dragging":false,"style":{"width":360},"resizing":false,"selectable":true,"focusable":true},{"id":"2BX-MgyEp1AGgtdnUITh5","type":"paragraph","position":{"x":-704.3814218617622,"y":178.57554665444889},"selected":true,"data":{"label":"When you are following this roadmap make sure to develop as many projects as possible for each node of the roadmap.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left","color":"#0033ff"},"oldId":"le7iJXCULjq_4FHrhrQWu"},"zIndex":999,"width":360,"height":114,"positionAbsolute":{"x":-704.3814218617622,"y":178.57554665444889},"dragging":false,"style":{"width":360},"resizing":true,"selectable":true,"focusable":true},{"id":"uM-SRBYQen3ZFiCDAyaJa","type":"paragraph","position":{"x":-28.74067173877563,"y":242.57554665444889},"selected":true,"data":{"label":"Create your GitHub profile and start using GitHub for your future projects.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left"},"oldId":"le7iJXCULjq_4FHrhrQWu"},"zIndex":999,"width":360,"height":88,"positionAbsolute":{"x":-28.74067173877563,"y":242.57554665444889},"dragging":false,"style":{"width":360},"resizing":true,"selectable":true,"focusable":true},{"id":"UAbZBrVgdgCyG0GtU7HgE","type":"paragraph","position":{"x":-28.74067173877563,"y":309.642069464665},"selected":true,"data":{"label":"See if any of your past projects can be published on GitHub as OpenSource.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left","color":"#001eff"},"oldId":"wgdSRXw6AcPAwQZ0mqBAB"},"zIndex":999,"width":360,"height":88,"positionAbsolute":{"x":-28.74067173877563,"y":309.642069464665},"dragging":false,"style":{"width":360},"resizing":false,"selectable":true,"focusable":true},{"id":"WE87iPjyRBuLSQjW1-lQA","type":"paragraph","position":{"x":-704.3814218617622,"y":452.60143585693174},"selected":true,"data":{"label":"Learn about the relational databases, normalization, DB migrations, SQL, DB Indexes and Query performance analysis.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left"},"oldId":"uM-SRBYQen3ZFiCDAyaJa"},"zIndex":999,"width":360,"height":114,"positionAbsolute":{"x":-704.3814218617622,"y":452.60143585693174},"dragging":false,"style":{"width":360},"resizing":true,"selectable":true,"focusable":true},{"id":"s1dRHfNP8Q6ytjueRHb1n","type":"paragraph","position":{"x":-704.3814218617622,"y":581.9126418589183},"selected":true,"data":{"label":"Learn how to build RESTful APIs and add JWT authentication to secure your APIs.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left"},"oldId":"WE87iPjyRBuLSQjW1-lQA"},"zIndex":999,"width":360,"height":88,"positionAbsolute":{"x":-704.3814218617622,"y":581.9126418589183},"dragging":false,"style":{"width":360},"resizing":true,"selectable":true,"focusable":true},{"id":"1HAWiOizGfG3OT9KouNQg","type":"paragraph","position":{"x":-704.3814218617622,"y":643.4861514388111},"selected":true,"data":{"label":"Develop some API and add JWT auth.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left","color":"#001eff"},"oldId":"UAbZBrVgdgCyG0GtU7HgE"},"zIndex":999,"width":360,"height":63,"positionAbsolute":{"x":-704.3814218617622,"y":643.4861514388111},"dragging":false,"style":{"width":360},"resizing":false,"selectable":true,"focusable":true},{"id":"W8BIrC9VsUc4Z0t6G_FnZ","type":"paragraph","position":{"x":-696.2667613883802,"y":793.5986472065365},"selected":true,"data":{"label":"Learn about different caching strategies, including HTTP caching as well.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left"},"oldId":"s1dRHfNP8Q6ytjueRHb1n"},"zIndex":999,"width":360,"height":88,"positionAbsolute":{"x":-696.2667613883802,"y":793.5986472065365},"dragging":false,"style":{"width":360},"resizing":true,"selectable":true,"focusable":true},{"id":"lIC09zhXysTm3qlAJqWMI","type":"paragraph","position":{"x":-696.2667613883802,"y":851.4861514388111},"selected":true,"data":{"label":"Use Redis in some of your projects.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left","color":"#001eff"},"oldId":"1HAWiOizGfG3OT9KouNQg"},"zIndex":999,"width":360,"height":63,"positionAbsolute":{"x":-696.2667613883802,"y":851.4861514388111},"dragging":false,"style":{"width":360},"resizing":false,"selectable":true,"focusable":true},{"id":"wMVGAEIHhVbL6ZXGZOb8Q","type":"paragraph","position":{"x":-167.56446376179997,"y":824.4323026615212},"selected":true,"data":{"label":"Learn about additional database topics including performance analysis, ORMs, limitations, common issues to keep in mind with ORMs and in general.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left"},"oldId":"W8BIrC9VsUc4Z0t6G_FnZ"},"zIndex":999,"width":338,"height":137,"positionAbsolute":{"x":-167.56446376179997,"y":824.4323026615212},"dragging":false,"style":{"width":338,"height":137},"resizing":false,"selectable":true,"focusable":true},{"id":"Lj9dbZmTjKHvooKWLEkhU","type":"paragraph","position":{"x":-167.56446376179997,"y":938.4323026615212},"selected":true,"data":{"label":"Get some experience with some ORM.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left","color":"#001eff"},"oldId":"lIC09zhXysTm3qlAJqWMI"},"zIndex":999,"width":360,"height":63,"positionAbsolute":{"x":-167.56446376179997,"y":938.4323026615212},"dragging":false,"style":{"width":360},"resizing":false,"selectable":true,"focusable":true},{"id":"lxFXAD1DAeq3bGovSEuXE","type":"paragraph","position":{"x":-167.56446376179997,"y":1073.4323026615211},"selected":true,"data":{"label":"Learn about differeng testing techniques and learn learn how to write automated tests.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left"},"oldId":"wMVGAEIHhVbL6ZXGZOb8Q"},"zIndex":999,"width":396,"height":96,"positionAbsolute":{"x":-167.56446376179997,"y":1073.4323026615211},"dragging":false,"style":{"width":396,"height":96},"resizing":false,"selectable":true,"focusable":true}],"edges":[{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"sourceHandle":"x2","target":"sVXZrBCsiSzWBBYWTm-nQ","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"PShueM-HfMGu2Jy1dt73g","selected":true,"type":"smoothstep","focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"STQQbPa7PE3gbjMdL6P-t","sourceHandle":"z2","target":"3OYm6b9f6WOrKi4KTOZYK","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-STQQbPa7PE3gbjMdL6P-tz2-3OYm6b9f6WOrKi4KTOZYKy1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"STQQbPa7PE3gbjMdL6P-t","sourceHandle":"z2","target":"381Kw1IMRv7CJp-Uf--qd","targetHandle":"y2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-STQQbPa7PE3gbjMdL6P-tz2-381Kw1IMRv7CJp-Uf--qdy2","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"STQQbPa7PE3gbjMdL6P-t","sourceHandle":"z2","target":"NAGisfq2CgeK3SsuRjnMw","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-STQQbPa7PE3gbjMdL6P-tz2-NAGisfq2CgeK3SsuRjnMwy1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"iogwMmOvub2ZF4zgg6WyF","sourceHandle":"x2","target":"2f0ZO6GJElfZ2Eis28Hzg","targetHandle":"w1","data":{"edgeStyle":"solid"},"selected":true,"id":"reactflow__edge-iogwMmOvub2ZF4zgg6WyFx2-2f0ZO6GJElfZ2Eis28Hzgw1","selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"2f0ZO6GJElfZ2Eis28Hzg","sourceHandle":"y2","target":"8-lO-v6jCYYoklEJXULxN","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-2f0ZO6GJElfZ2Eis28Hzgy2-8-lO-v6jCYYoklEJXULxNz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"2f0ZO6GJElfZ2Eis28Hzg","sourceHandle":"y2","target":"BdXbcz4-ar3XOX0wIKzBp","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-2f0ZO6GJElfZ2Eis28Hzgy2-BdXbcz4-ar3XOX0wIKzBpz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"2f0ZO6GJElfZ2Eis28Hzg","sourceHandle":"y2","target":"J_sVHsD72Yzyqb9KCIvAY","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-2f0ZO6GJElfZ2Eis28Hzgy2-J_sVHsD72Yzyqb9KCIvAYz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"2f0ZO6GJElfZ2Eis28Hzg","sourceHandle":"x2","target":"ezdqQW9wTUw93F6kjOzku","targetHandle":"w1","data":{"edgeStyle":"solid"},"selected":true,"focusable":true,"selectable":true,"id":"reactflow__edge-2f0ZO6GJElfZ2Eis28Hzgx2-ezdqQW9wTUw93F6kjOzkuw1"},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"ezdqQW9wTUw93F6kjOzku","sourceHandle":"y2","target":"_I1E__wCIVrhjMk6IMieE","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-ezdqQW9wTUw93F6kjOzkuy2-_I1E__wCIVrhjMk6IMieEz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"NvUcSDWBhzJZ31nzT4UlE","sourceHandle":"y2","target":"ptD8EVqwFUYr4W5A_tABY","targetHandle":"z1","data":{"edgeStyle":"dashed"},"selected":true,"focusable":true,"selectable":true,"id":"reactflow__edge-NvUcSDWBhzJZ31nzT4UlEy2-ptD8EVqwFUYr4W5A_tABYz1"},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"NvUcSDWBhzJZ31nzT4UlE","sourceHandle":"x2","target":"r45b461NxLN6wBODJ5CNP","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-NvUcSDWBhzJZ31nzT4UlEx2-r45b461NxLN6wBODJ5CNPw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"r45b461NxLN6wBODJ5CNP","sourceHandle":"z2","target":"FihTrMO56kj9jT8O_pO2T","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-r45b461NxLN6wBODJ5CNPz2-FihTrMO56kj9jT8O_pO2Ty1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"r45b461NxLN6wBODJ5CNP","sourceHandle":"x2","target":"EwvLPSI6AlZ4TnNIJTZA4","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-r45b461NxLN6wBODJ5CNPx2-EwvLPSI6AlZ4TnNIJTZA4w1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"EwvLPSI6AlZ4TnNIJTZA4","sourceHandle":"z2","target":"lfNFDZZNdrB0lbEaMtU71","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-EwvLPSI6AlZ4TnNIJTZA4z2-lfNFDZZNdrB0lbEaMtU71y1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"EwvLPSI6AlZ4TnNIJTZA4","sourceHandle":"z2","target":"sNceS4MpSIjRkWhNDmrFg","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-EwvLPSI6AlZ4TnNIJTZA4z2-sNceS4MpSIjRkWhNDmrFgy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"EwvLPSI6AlZ4TnNIJTZA4","sourceHandle":"z2","target":"PY9G7KQy8bF6eIdr1ydHf","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-EwvLPSI6AlZ4TnNIJTZA4z2-PY9G7KQy8bF6eIdr1ydHfy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"EwvLPSI6AlZ4TnNIJTZA4","sourceHandle":"x2","target":"ELj8af7Mi38kUbaPJfCUR","targetHandle":"w2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-EwvLPSI6AlZ4TnNIJTZA4x2-ELj8af7Mi38kUbaPJfCURw2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"ELj8af7Mi38kUbaPJfCUR","sourceHandle":"y2","target":"g8GjkJAhvnSxXTZks0V1g","targetHandle":"z2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-ELj8af7Mi38kUbaPJfCURy2-g8GjkJAhvnSxXTZks0V1gz2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"LJt27onEOeIBomiEMTyKd","sourceHandle":"y2","target":"Z7jp_Juj5PffSxV7UZcBb","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-LJt27onEOeIBomiEMTyKdy2-Z7jp_Juj5PffSxV7UZcBbz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"LJt27onEOeIBomiEMTyKd","sourceHandle":"y2","target":"qSAdfaGUfn8mtmDjHJi3z","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-LJt27onEOeIBomiEMTyKdy2-qSAdfaGUfn8mtmDjHJi3zz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"LJt27onEOeIBomiEMTyKd","sourceHandle":"y2","target":"rq_y_OBMD9AH_4aoecvAi","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-LJt27onEOeIBomiEMTyKdy2-rq_y_OBMD9AH_4aoecvAiz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"LJt27onEOeIBomiEMTyKd","sourceHandle":"y2","target":"bQnOAu863hsHdyNMNyJop","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-LJt27onEOeIBomiEMTyKdy2-bQnOAu863hsHdyNMNyJopz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"ELj8af7Mi38kUbaPJfCUR","sourceHandle":"x2","target":"LJt27onEOeIBomiEMTyKd","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-ELj8af7Mi38kUbaPJfCURx2-LJt27onEOeIBomiEMTyKdw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"LJt27onEOeIBomiEMTyKd","sourceHandle":"x2","target":"STQQbPa7PE3gbjMdL6P-t","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-LJt27onEOeIBomiEMTyKdx2-STQQbPa7PE3gbjMdL6P-tw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"STQQbPa7PE3gbjMdL6P-t","sourceHandle":"x2","target":"sVXZrBCsiSzWBBYWTm-nQ","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-STQQbPa7PE3gbjMdL6P-tx2-sVXZrBCsiSzWBBYWTm-nQw1","selected":true,"selectable":true,"focusable":true}]}
diff --git a/src/data/roadmaps/backend/content/architectural-patterns@tHiUpG9LN35E5RaHddMv5.md b/src/data/roadmaps/backend/content/architectural-patterns@tHiUpG9LN35E5RaHddMv5.md
index a13dc0377..822def728 100644
--- a/src/data/roadmaps/backend/content/architectural-patterns@tHiUpG9LN35E5RaHddMv5.md
+++ b/src/data/roadmaps/backend/content/architectural-patterns@tHiUpG9LN35E5RaHddMv5.md
@@ -5,4 +5,4 @@ An architectural pattern is a general, reusable solution to a commonly occurring
 Visit the following resources to learn more:
 
 - [@article@14 Architectural Patterns to know](https://www.redhat.com/architect/14-software-architecture-patterns)
-- [@article@Architectural Patterns in a nutshell](https://towardsdatascience.com/10-common-software-architectural-patterns-in-a-nutshell-a0b47a1e9013)
+- [@article@10 Common Software Architectural Patterns in a nutshell](https://theiotacademy.medium.com/10-common-software-architectural-patterns-in-a-nutshell-1b1f6cf5036b)
diff --git a/src/data/roadmaps/backend/content/mysql@VPxOdjJtKAqmM5V0LR5OC.md b/src/data/roadmaps/backend/content/mysql@VPxOdjJtKAqmM5V0LR5OC.md
index c8204d097..fcf473271 100644
--- a/src/data/roadmaps/backend/content/mysql@VPxOdjJtKAqmM5V0LR5OC.md
+++ b/src/data/roadmaps/backend/content/mysql@VPxOdjJtKAqmM5V0LR5OC.md
@@ -8,5 +8,5 @@ Visit the following resources to learn more:
 - [@article@W3Schools - MySQL Tutorial](https://www.w3schools.com/mySQl/default.asp)
 - [@article@MySQL for Developers](https://planetscale.com/courses/mysql-for-developers/introduction/course-introduction)
 - [@article@MySQL Tutorial](https://www.mysqltutorial.org/)
-- [@video@MySQL Full Course for free](https://www.youtube.com/watch?v=5OdVJbNCSso)
+- [@video@MySQL Complete Course](https://www.youtube.com/watch?v=5OdVJbNCSso)
 - [@feed@Explore top posts about MySQL](https://app.daily.dev/tags/mysql?ref=roadmapsh)
diff --git a/src/data/roadmaps/cloudflare/cloudflare.json b/src/data/roadmaps/cloudflare/cloudflare.json
new file mode 100644
index 000000000..9428eb6d4
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/cloudflare.json
@@ -0,0 +1,5472 @@
+{
+  "nodes": [
+    {
+      "id": "82oZ5FJok15X5aetL1UaA",
+      "type": "horizontal",
+      "position": {
+        "x": -8.952745032276027,
+        "y": 1189.4754953712302
+      },
+      "selected": false,
+      "data": {
+        "label": "horizontal node",
+        "style": {
+          "stroke": "#2B78E4",
+          "strokeWidth": 3.75
+        }
+      },
+      "zIndex": 999,
+      "width": 173,
+      "height": 20,
+      "style": {
+        "width": 173,
+        "height": 20
+      },
+      "positionAbsolute": {
+        "x": -8.952745032276027,
+        "y": 1189.4754953712302
+      },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "8BW3ScLDYa_4DkBksLlJM",
+      "type": "section",
+      "position": {
+        "x": -256.51237120830484,
+        "y": 1274.8942173748287
+      },
+      "selected": false,
+      "data": {
+        "label": "",
+        "style": {
+          "width": 150,
+          "height": 100,
+          "fontSize": 17
+        }
+      },
+      "zIndex": -999,
+      "width": 228,
+      "height": 104,
+      "style": {
+        "width": 228,
+        "height": 104
+      },
+      "resizing": false,
+      "dragging": false,
+      "positionAbsolute": {
+        "x": -256.51237120830484,
+        "y": 1274.8942173748287
+      },
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "kJXPzUulKPhawgbEK7n9l",
+      "type": "section",
+      "position": {
+        "x": 468.5985688843266,
+        "y": 413.00061202347564
+      },
+      "selected": false,
+      "data": {
+        "label": "",
+        "style": {
+          "width": 150,
+          "height": 100,
+          "fontSize": 17,
+          "backgroundColor": "#ffffff",
+          "borderColor": "#000000"
+        }
+      },
+      "zIndex": -999,
+      "width": 285,
+      "height": 431,
+      "style": {
+        "width": 285,
+        "height": 431
+      },
+      "resizing": false,
+      "positionAbsolute": {
+        "x": 468.5985688843266,
+        "y": 413.00061202347564
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "7kxbi3VJONZHcjRNhrnTH",
+      "type": "section",
+      "position": {
+        "x": 120.89946958507927,
+        "y": 80.88749407694564
+      },
+      "selected": false,
+      "data": {
+        "label": "",
+        "style": {
+          "width": 150,
+          "height": 100,
+          "fontSize": 17,
+          "backgroundColor": "#ffffff",
+          "borderColor": "#000000"
+        }
+      },
+      "zIndex": -999,
+      "width": 657,
+      "height": 276,
+      "style": {
+        "width": 657,
+        "height": 276
+      },
+      "positionAbsolute": {
+        "x": 120.89946958507927,
+        "y": 80.88749407694564
+      },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "c58fcsthBlVfzfr-MHdpF",
+      "type": "vertical",
+      "position": {
+        "x": 231.89029212267985,
+        "y": -109.59925177765109
+      },
+      "selected": false,
+      "data": {
+        "label": "vertical node",
+        "style": {
+          "strokeDasharray": "0.8 8",
+          "strokeLinecap": "round",
+          "strokeWidth": 3.5,
+          "stroke": "#2B78E4"
+        }
+      },
+      "zIndex": 999,
+      "width": 20,
+      "height": 66,
+      "positionAbsolute": {
+        "x": 231.89029212267985,
+        "y": -109.59925177765109
+      },
+      "dragging": false,
+      "style": {
+        "width": 20,
+        "height": 66
+      },
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "Ji35JsKgUQXN4DJGEgTAC",
+      "type": "title",
+      "position": {
+        "x": 157.39029212267985,
+        "y": -44.59925177765109
+      },
+      "selected": false,
+      "data": {
+        "label": "Cloudflare",
+        "style": {
+          "fontSize": 28,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 169,
+      "height": 68,
+      "positionAbsolute": {
+        "x": 157.39029212267985,
+        "y": -44.59925177765109
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true,
+      "style": {}
+    },
+    {
+      "id": "kpF15oUmlUmk1qVGEBB7Y",
+      "type": "paragraph",
+      "position": {
+        "x": 421.119142886761,
+        "y": -115.9573697023546
+      },
+      "selected": false,
+      "data": {
+        "label": "Find the detailed version of this roadmap along with other similar roadmaps",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "left",
+          "borderColor": "#000000",
+          "backgroundColor": "#FFFFFf"
+        },
+        "oldId": "yHmHXymPNWwu8p1vvqD3o"
+      },
+      "zIndex": 999,
+      "width": 354,
+      "height": 143,
+      "positionAbsolute": {
+        "x": 421.119142886761,
+        "y": -115.9573697023546
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true,
+      "style": {
+        "width": 354,
+        "height": 143
+      },
+      "resizing": false
+    },
+    {
+      "id": "2zqZkyVgigifcRS1H7F_b",
+      "type": "button",
+      "position": {
+        "x": 434.3225172995611,
+        "y": -33.971806284609315
+      },
+      "selected": false,
+      "data": {
+        "label": "roadmap.sh",
+        "href": "https://roadmap.sh",
+        "color": "#ffffff",
+        "backgroundColor": "#4136D6",
+        "style": {
+          "fontSize": 17
+        }
+      },
+      "zIndex": 999,
+      "width": 329,
+      "height": 49,
+      "dragging": false,
+      "style": {
+        "width": 329,
+        "height": 49
+      },
+      "resizing": false,
+      "positionAbsolute": {
+        "x": 434.3225172995611,
+        "y": -33.971806284609315
+      },
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "qnjDifLlSYoxWd5GmuQXd",
+      "type": "linksgroup",
+      "position": {
+        "x": -287,
+        "y": -107.59925177765109
+      },
+      "selected": false,
+      "data": {
+        "label": "Related Roadmaps",
+        "links": [
+          {
+            "id": "Ij2MtNkVSxBzg1qxg4b9b",
+            "label": "DevOps Roadmap",
+            "url": "https://roadmap.sh/devops"
+          },
+          {
+            "id": "AQAtTLgFlTE5U5YRVEeAe",
+            "label": "AWS Roadmap",
+            "url": "https://roadmap.sh/aws"
+          },
+          {
+            "id": "63hdFwOU9EHEykngaL1Wi",
+            "label": "Node.js Roadmap",
+            "url": "https://roadmap.sh/nodejs"
+          }
+        ]
+      },
+      "zIndex": 999,
+      "width": 295,
+      "height": 161,
+      "positionAbsolute": {
+        "x": -287,
+        "y": -107.59925177765109
+      },
+      "dragging": false,
+      "style": {
+        "width": 295,
+        "height": 161
+      },
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "PcYnYAAkKMbzoiCnBfjqO",
+      "type": "subtopic",
+      "position": {
+        "x": 133.39946958507926,
+        "y": 134.38749407694564
+      },
+      "selected": false,
+      "data": {
+        "label": "JavaScript Fundamentals",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 298,
+      "height": 49,
+      "style": {
+        "width": 298,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 133.39946958507926,
+        "y": 134.38749407694564
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "q9oQTt_NqhdWvJfA5XH1V",
+      "type": "subtopic",
+      "position": {
+        "x": 133.39946958507926,
+        "y": 187.38749407694564
+      },
+      "selected": false,
+      "data": {
+        "label": "Basic Command-line Knowledge",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 298,
+      "height": 49,
+      "style": {
+        "width": 298,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 133.39946958507926,
+        "y": 187.38749407694564
+      },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "9iSdASlRxyod9YwZ2IUry",
+      "type": "subtopic",
+      "position": {
+        "x": 133.39946958507926,
+        "y": 240.38749407694564
+      },
+      "selected": false,
+      "data": {
+        "label": "HTTP and Web Protocols",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 298,
+      "height": 49,
+      "style": {
+        "width": 298,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 133.39946958507926,
+        "y": 240.38749407694564
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "C08pIguX1N45Iw0kh0Fvu",
+      "type": "subtopic",
+      "position": {
+        "x": 133.39946958507926,
+        "y": 293.3874940769456
+      },
+      "selected": false,
+      "data": {
+        "label": "Git Basics",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 298,
+      "height": 49,
+      "style": {
+        "width": 298,
+        "height": 49
+      },
+      "dragging": false,
+      "positionAbsolute": {
+        "x": 133.39946958507926,
+        "y": 293.3874940769456
+      },
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "dSBYTGGkol3MAXyg7G7_J",
+      "type": "subtopic",
+      "position": {
+        "x": 442.39946958507926,
+        "y": 136.38749407694564
+      },
+      "selected": false,
+      "data": {
+        "label": "Node.js and NPM",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 323,
+      "height": 49,
+      "style": {
+        "width": 323,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 442.39946958507926,
+        "y": 136.38749407694564
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true,
+      "resizing": false
+    },
+    {
+      "id": "zR84MFLL6y0dygz9hXXPA",
+      "type": "subtopic",
+      "position": {
+        "x": 442.39946958507926,
+        "y": 189.38749407694564
+      },
+      "selected": false,
+      "data": {
+        "label": "TypeScript Fundamentals",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 323,
+      "height": 49,
+      "style": {
+        "width": 323,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 442.39946958507926,
+        "y": 189.38749407694564
+      },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "Isl5anwDvb1MacA-JH4ej",
+      "type": "subtopic",
+      "position": {
+        "x": 442.39946958507926,
+        "y": 242.38749407694564
+      },
+      "selected": false,
+      "data": {
+        "label": "Understand Serverless Architecture",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 323,
+      "height": 49,
+      "style": {
+        "width": 323,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 442.39946958507926,
+        "y": 242.38749407694564
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true,
+      "resizing": false
+    },
+    {
+      "id": "L3L2_HrESg8SuStKNID8l",
+      "type": "label",
+      "position": {
+        "x": 214.8994695850793,
+        "y": 93.38749407694564
+      },
+      "selected": false,
+      "data": {
+        "label": "Prerequisites",
+        "href": "",
+        "color": "#000000",
+        "style": {
+          "fontSize": 17
+        },
+        "oldId": "QifY92ONTomFx_FwRxPJI"
+      },
+      "zIndex": 999,
+      "width": 135,
+      "height": 36,
+      "style": {
+        "width": 135.2578125,
+        "height": 36
+      },
+      "positionAbsolute": {
+        "x": 214.8994695850793,
+        "y": 93.38749407694564
+      },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false
+    },
+    {
+      "id": "QifY92ONTomFx_FwRxPJI",
+      "type": "label",
+      "position": {
+        "x": 511.89946958507926,
+        "y": 93.38749407694564
+      },
+      "selected": false,
+      "data": {
+        "label": "Core Development Skills",
+        "href": "",
+        "color": "#000000",
+        "style": {
+          "fontSize": 17
+        }
+      },
+      "zIndex": 999,
+      "width": 204,
+      "height": 36,
+      "style": {},
+      "positionAbsolute": {
+        "x": 511.89946958507926,
+        "y": 93.38749407694564
+      },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false
+    },
+    {
+      "id": "7XrG-k9T12u84Pwp4YwaY",
+      "type": "paragraph",
+      "position": {
+        "x": 111.5,
+        "y": 460.64601177168015
+      },
+      "selected": false,
+      "data": {
+        "label": "Workers Core Concepts",
+        "style": {
+          "fontSize": 20,
+          "borderColor": "transparent",
+          "backgroundColor": "transparent",
+          "color": "#000000",
+          "textAlign": "left",
+          "justifyContent": "flex-start",
+          "padding": 16
+        }
+      },
+      "zIndex": 999,
+      "width": 264,
+      "height": 62,
+      "style": {
+        "width": 264,
+        "height": 62
+      },
+      "resizing": false,
+      "positionAbsolute": {
+        "x": 111.5,
+        "y": 460.64601177168015
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "TB6vGzDgGZ9yAd9MGR7vw",
+      "type": "subtopic",
+      "position": {
+        "x": -286.42440139623136,
+        "y": 224.9890672390103
+      },
+      "selected": false,
+      "data": {
+        "label": "Workers Runtime Environment",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 288,
+      "height": 49,
+      "style": {
+        "width": 288
+      },
+      "positionAbsolute": {
+        "x": -286.42440139623136,
+        "y": 224.9890672390103
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "aGWLomYHGkIfn7GFc0_Yl",
+      "type": "subtopic",
+      "position": {
+        "x": -286.42440139623136,
+        "y": 277.9890672390103
+      },
+      "selected": false,
+      "data": {
+        "label": "Edge Computing Fundamentals",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 288,
+      "height": 49,
+      "style": {
+        "width": 288
+      },
+      "positionAbsolute": {
+        "x": -286.42440139623136,
+        "y": 277.9890672390103
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "HNEXPU6r_T7UYvwLv2wnt",
+      "type": "subtopic",
+      "position": {
+        "x": -286.42440139623136,
+        "y": 330.9890672390103
+      },
+      "selected": false,
+      "data": {
+        "label": "Request/Response Handling",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 288,
+      "height": 49,
+      "style": {
+        "width": 288
+      },
+      "positionAbsolute": {
+        "x": -286.42440139623136,
+        "y": 330.9890672390103
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "_2UnRlbUplHvs5-Stj4O4",
+      "type": "subtopic",
+      "position": {
+        "x": -286.42440139623136,
+        "y": 383.9890672390103
+      },
+      "selected": false,
+      "data": {
+        "label": "Fetch API and Runtime APIs",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 288,
+      "height": 49,
+      "style": {
+        "width": 288
+      },
+      "positionAbsolute": {
+        "x": -286.42440139623136,
+        "y": 383.9890672390103
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "i6L9FI6fBDXr0XtMrc_uR",
+      "type": "subtopic",
+      "position": {
+        "x": -286.42440139623136,
+        "y": 436.9890672390103
+      },
+      "selected": false,
+      "data": {
+        "label": "Workers Lifecycle",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 288,
+      "height": 49,
+      "style": {
+        "width": 288
+      },
+      "positionAbsolute": {
+        "x": -286.42440139623136,
+        "y": 436.9890672390103
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "WZSi9inWPhqZQvDN-C8BV",
+      "type": "subtopic",
+      "position": {
+        "x": -286.42440139623136,
+        "y": 489.9890672390103
+      },
+      "selected": false,
+      "data": {
+        "label": "Service Bindings",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 288,
+      "height": 49,
+      "style": {
+        "width": 288
+      },
+      "positionAbsolute": {
+        "x": -286.42440139623136,
+        "y": 489.9890672390103
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "uBjcQ9PJUfwzu5N_2CNjN",
+      "type": "subtopic",
+      "position": {
+        "x": -286.42440139623136,
+        "y": 542.9890672390103
+      },
+      "selected": false,
+      "data": {
+        "label": "Caching Strategies",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 288,
+      "height": 49,
+      "style": {
+        "width": 288
+      },
+      "positionAbsolute": {
+        "x": -286.42440139623136,
+        "y": 542.9890672390103
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "aStbAF4zraqhJ-N3RH4ha",
+      "type": "subtopic",
+      "position": {
+        "x": -286.42440139623136,
+        "y": 595.9890672390103
+      },
+      "selected": false,
+      "data": {
+        "label": "Middleware Patterns",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 288,
+      "height": 49,
+      "style": {
+        "width": 288
+      },
+      "positionAbsolute": {
+        "x": -286.42440139623136,
+        "y": 595.9890672390103
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "9ef2VPCru8lCmRxxGe-Eo",
+      "type": "subtopic",
+      "position": {
+        "x": -286.42440139623136,
+        "y": 648.9890672390103
+      },
+      "selected": false,
+      "data": {
+        "label": "Bindings",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 288,
+      "height": 49,
+      "style": {
+        "width": 288
+      },
+      "positionAbsolute": {
+        "x": -286.42440139623136,
+        "y": 648.9890672390103
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "g4hjyQF8-SpjPi8mYtIsk",
+      "type": "vertical",
+      "position": {
+        "x": 233,
+        "y": 15.028193715390685
+      },
+      "selected": false,
+      "data": {
+        "label": "vertical node",
+        "style": {
+          "stroke": "#2B78E4",
+          "strokeWidth": 3.5
+        }
+      },
+      "zIndex": 999,
+      "width": 20,
+      "height": 66,
+      "style": {
+        "width": 20,
+        "height": 66
+      },
+      "positionAbsolute": {
+        "x": 233,
+        "y": 15.028193715390685
+      },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "imU-blmfZ__YCFynXZ8aI",
+      "type": "vertical",
+      "position": {
+        "x": 233.5,
+        "y": 356.88749407694564
+      },
+      "selected": false,
+      "data": {
+        "label": "vertical node",
+        "oldId": "g4hjyQF8-SpjPi8mYtIsk",
+        "style": {
+          "stroke": "#2B78E4",
+          "strokeWidth": 3.5
+        }
+      },
+      "zIndex": 999,
+      "width": 20,
+      "height": 104,
+      "style": {
+        "width": 20,
+        "height": 104
+      },
+      "positionAbsolute": {
+        "x": 233.5,
+        "y": 356.88749407694564
+      },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "IubwhdnyWtjpejkGOfnPy",
+      "type": "paragraph",
+      "position": {
+        "x": 111.5,
+        "y": 597.5006120234757
+      },
+      "selected": false,
+      "data": {
+        "label": "Frameworks and Tools",
+        "style": {
+          "fontSize": 20,
+          "borderColor": "transparent",
+          "backgroundColor": "transparent",
+          "color": "#000000",
+          "textAlign": "left",
+          "justifyContent": "flex-start",
+          "padding": 16
+        },
+        "oldId": "7XrG-k9T12u84Pwp4YwaY"
+      },
+      "zIndex": 999,
+      "width": 264,
+      "height": 62,
+      "style": {
+        "width": 264,
+        "height": 62
+      },
+      "resizing": false,
+      "positionAbsolute": {
+        "x": 111.5,
+        "y": 597.5006120234757
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "-8MsWNvuqwQCbLpOx_kov",
+      "type": "subtopic",
+      "position": {
+        "x": 493.52297244223314,
+        "y": 463.23202364103037
+      },
+      "selected": false,
+      "data": {
+        "label": "Hono",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 100,
+      "height": 49,
+      "style": {
+        "width": 100,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 493.52297244223314,
+        "y": 463.23202364103037
+      },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "15jl6CSCkqnh_eFfysLDM",
+      "type": "subtopic",
+      "position": {
+        "x": 598.5229724422331,
+        "y": 463.23202364103037
+      },
+      "selected": false,
+      "data": {
+        "label": "Itty Router",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 125,
+      "height": 49,
+      "style": {
+        "width": 125,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 598.5229724422331,
+        "y": 463.23202364103037
+      },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "Tzx93tvoGrc9_fKQqkorN",
+      "type": "subtopic",
+      "position": {
+        "x": 493.52297244223314,
+        "y": 652.7216082137738
+      },
+      "selected": false,
+      "data": {
+        "label": "Wrangler",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 117,
+      "height": 49,
+      "style": {
+        "width": 117,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 493.52297244223314,
+        "y": 652.7216082137738
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true,
+      "resizing": false
+    },
+    {
+      "id": "uoaOrypiMkyoikXvTHeVS",
+      "type": "subtopic",
+      "position": {
+        "x": 493.52297244223314,
+        "y": 707.1589098955067
+      },
+      "selected": false,
+      "data": {
+        "label": "DevTools Integration",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 242,
+      "height": 49,
+      "style": {
+        "width": 242,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 493.52297244223314,
+        "y": 707.1589098955067
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true,
+      "resizing": false
+    },
+    {
+      "id": "8Y6TIYoWIXrxtmzDVdS0b",
+      "type": "subtopic",
+      "position": {
+        "x": 493.52297244223314,
+        "y": 774.7087100899473
+      },
+      "selected": false,
+      "data": {
+        "label": "CI/CD Pipelines",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 242,
+      "height": 49,
+      "style": {
+        "width": 242,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 493.52297244223314,
+        "y": 774.7087100899473
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "ssvZh7zn9xUY2Wi-F_d4J",
+      "type": "label",
+      "position": {
+        "x": 549.3509487035327,
+        "y": 421.75533719211336
+      },
+      "selected": false,
+      "data": {
+        "label": "API Routers",
+        "href": "",
+        "color": "#000000",
+        "style": {
+          "fontSize": 17
+        }
+      },
+      "zIndex": 999,
+      "width": 108,
+      "height": 36,
+      "style": {},
+      "positionAbsolute": {
+        "x": 549.3509487035327,
+        "y": 421.75533719211336
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "LkvWKmUklK1-n8dQB4w2U",
+      "type": "label",
+      "position": {
+        "x": 522.5229724422331,
+        "y": 522.7553371921133
+      },
+      "selected": false,
+      "data": {
+        "label": "Frontend Frameworks",
+        "href": "",
+        "color": "#000000",
+        "style": {
+          "fontSize": 17
+        },
+        "oldId": "ssvZh7zn9xUY2Wi-F_d4J"
+      },
+      "zIndex": 999,
+      "width": 184,
+      "height": 36,
+      "style": {},
+      "positionAbsolute": {
+        "x": 522.5229724422331,
+        "y": 522.7553371921133
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "zSwio18XdBfqwSneAx_AP",
+      "type": "subtopic",
+      "position": {
+        "x": 493.52297244223314,
+        "y": 558.7553371921133
+      },
+      "selected": false,
+      "data": {
+        "label": "Any Frontend Framework",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 242,
+      "height": 49,
+      "style": {
+        "width": 242,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 493.52297244223314,
+        "y": 558.7553371921133
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true,
+      "resizing": false
+    },
+    {
+      "id": "diIGB553YTGIw2qYRSj0X",
+      "type": "label",
+      "position": {
+        "x": 530.30644608346,
+        "y": 616.7216082137738
+      },
+      "selected": false,
+      "data": {
+        "label": "Building / Deploying",
+        "href": "",
+        "color": "#000000",
+        "style": {
+          "fontSize": 17
+        },
+        "oldId": "LkvWKmUklK1-n8dQB4w2U"
+      },
+      "zIndex": 999,
+      "width": 171,
+      "height": 36,
+      "style": {},
+      "positionAbsolute": {
+        "x": 530.30644608346,
+        "y": 616.7216082137738
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "o4sBgniPmLqwej6TlIPcl",
+      "type": "subtopic",
+      "position": {
+        "x": 615.3833983689781,
+        "y": 652.7216082137738
+      },
+      "selected": false,
+      "data": {
+        "label": "Miniflare",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "Tzx93tvoGrc9_fKQqkorN"
+      },
+      "zIndex": 999,
+      "width": 118,
+      "height": 49,
+      "style": {
+        "width": 118,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 615.3833983689781,
+        "y": 652.7216082137738
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true,
+      "resizing": false
+    },
+    {
+      "id": "3BGY76hTLAE8PY7OXQtNR",
+      "type": "paragraph",
+      "position": {
+        "x": 138.5,
+        "y": 768.6355963444237
+      },
+      "selected": false,
+      "data": {
+        "label": "Storage Solutions",
+        "style": {
+          "fontSize": 20,
+          "borderColor": "transparent",
+          "backgroundColor": "transparent",
+          "color": "#000000",
+          "textAlign": "center",
+          "justifyContent": "center",
+          "padding": 16
+        },
+        "oldId": "IubwhdnyWtjpejkGOfnPy"
+      },
+      "zIndex": 999,
+      "width": 210,
+      "height": 67,
+      "style": {
+        "width": 210,
+        "height": 67
+      },
+      "resizing": false,
+      "positionAbsolute": {
+        "x": 138.5,
+        "y": 768.6355963444237
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "1dGFfQauOgHP7T4ReMpCU",
+      "type": "topic",
+      "position": {
+        "x": -255.0107846621675,
+        "y": 777.6355963444237
+      },
+      "selected": false,
+      "data": {
+        "label": "Workers KV",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 228,
+      "height": 49,
+      "style": {
+        "width": 228,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": -255.0107846621675,
+        "y": 777.6355963444237
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "EBTHbXOOZiqrcYJvKhcWV",
+      "type": "subtopic",
+      "position": {
+        "x": -255.0107846621675,
+        "y": 853.0363756231689
+      },
+      "selected": false,
+      "data": {
+        "label": "Key-value Operations",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 228,
+      "height": 49,
+      "style": {
+        "width": 228,
+        "height": 49
+      },
+      "dragging": false,
+      "resizing": false,
+      "positionAbsolute": {
+        "x": -255.0107846621675,
+        "y": 853.0363756231689
+      },
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "sQlRIYLnZcugATgpogJmw",
+      "type": "subtopic",
+      "position": {
+        "x": -255.0107846621675,
+        "y": 906.0363756231687
+      },
+      "selected": false,
+      "data": {
+        "label": "Metadata Handling",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 228,
+      "height": 49,
+      "style": {
+        "width": 228,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": -255.0107846621675,
+        "y": 906.0363756231687
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "i64-aCpZHygq76fBU6eXD",
+      "type": "subtopic",
+      "position": {
+        "x": -255.0107846621675,
+        "y": 959.0363756231687
+      },
+      "selected": false,
+      "data": {
+        "label": "Bulk Operations",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 228,
+      "height": 49,
+      "style": {
+        "width": 228,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": -255.0107846621675,
+        "y": 959.0363756231687
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "OgW-iIrJZ5-sOWKnFpIZd",
+      "type": "subtopic",
+      "position": {
+        "x": -255.0107846621675,
+        "y": 1012.0363756231689
+      },
+      "selected": false,
+      "data": {
+        "label": "Caching Patterns",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 228,
+      "height": 49,
+      "style": {
+        "width": 228,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": -255.0107846621675,
+        "y": 1012.0363756231689
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "gxLUlXGuaY5Q-0xmBgQwz",
+      "type": "topic",
+      "position": {
+        "x": 158.27909338877345,
+        "y": 991.6457010436021
+      },
+      "selected": false,
+      "data": {
+        "label": "R2 Storage",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 172,
+      "height": 50,
+      "style": {
+        "width": 172,
+        "height": 50
+      },
+      "resizing": false,
+      "positionAbsolute": {
+        "x": 158.27909338877345,
+        "y": 991.6457010436021
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "K9iW2H6riKwddWmpWJFJw",
+      "type": "subtopic",
+      "position": {
+        "x": 468.5985688843266,
+        "y": 885.6457010436021
+      },
+      "selected": false,
+      "data": {
+        "label": "Object Storage",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 285,
+      "height": 49,
+      "style": {
+        "width": 285,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 468.5985688843266,
+        "y": 885.6457010436021
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "BPahk1qH9Hk11tsE2hw3A",
+      "type": "subtopic",
+      "position": {
+        "x": 468.5985688843266,
+        "y": 938.6457010436021
+      },
+      "selected": false,
+      "data": {
+        "label": "Large File Handling",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 285,
+      "height": 49,
+      "style": {
+        "width": 285,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 468.5985688843266,
+        "y": 938.6457010436021
+      },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "3jU5753Uza2aS-gZo7w4k",
+      "type": "subtopic",
+      "position": {
+        "x": 468.5985688843266,
+        "y": 991.6457010436021
+      },
+      "selected": false,
+      "data": {
+        "label": "Asset Management",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 285,
+      "height": 49,
+      "style": {
+        "width": 285,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 468.5985688843266,
+        "y": 991.6457010436021
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "UNE6XK4su5r2jcxhY7hOG",
+      "type": "subtopic",
+      "position": {
+        "x": 468.5985688843266,
+        "y": 1044.645701043602
+      },
+      "selected": false,
+      "data": {
+        "label": "Bucket Operations",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 285,
+      "height": 49,
+      "style": {
+        "width": 285,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 468.5985688843266,
+        "y": 1044.645701043602
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "YvgmmF9sWfURgijFV7E31",
+      "type": "subtopic",
+      "position": {
+        "x": 468.5985688843266,
+        "y": 1097.645701043602
+      },
+      "selected": false,
+      "data": {
+        "label": "Bucket Lifecycle",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "UNE6XK4su5r2jcxhY7hOG"
+      },
+      "zIndex": 999,
+      "width": 285,
+      "height": 49,
+      "style": {
+        "width": 285,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 468.5985688843266,
+        "y": 1097.645701043602
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true,
+      "resizing": false
+    },
+    {
+      "id": "mKN0Ta3zSk7PCm_uHYKFN",
+      "type": "topic",
+      "position": {
+        "x": 158.27909338877345,
+        "y": 1174.9754953712302
+      },
+      "selected": false,
+      "data": {
+        "label": "D1",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "gxLUlXGuaY5Q-0xmBgQwz"
+      },
+      "zIndex": 999,
+      "width": 172,
+      "height": 50,
+      "style": {
+        "width": 172,
+        "height": 50
+      },
+      "resizing": false,
+      "positionAbsolute": {
+        "x": 158.27909338877345,
+        "y": 1174.9754953712302
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "PnhP47woPJb_JnLpMMiTw",
+      "type": "subtopic",
+      "position": {
+        "x": -256.51237120830484,
+        "y": 1114.6280432813637
+      },
+      "selected": false,
+      "data": {
+        "label": "Schema Management",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 228,
+      "height": 49,
+      "style": {
+        "width": 228,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": -256.51237120830484,
+        "y": 1114.6280432813637
+      },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false,
+      "resizing": false
+    },
+    {
+      "id": "M8rSSVFUHixgWZRfaBPHb",
+      "type": "subtopic",
+      "position": {
+        "x": -256.51237120830484,
+        "y": 1167.6280432813637
+      },
+      "selected": false,
+      "data": {
+        "label": "Migrations",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 228,
+      "height": 49,
+      "style": {
+        "width": 228,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": -256.51237120830484,
+        "y": 1167.6280432813637
+      },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false
+    },
+    {
+      "id": "65xDESm6jbHWkVO4NgHqx",
+      "type": "subtopic",
+      "position": {
+        "x": -256.51237120830484,
+        "y": 1220.6280432813637
+      },
+      "selected": false,
+      "data": {
+        "label": "Query Optimization",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 228,
+      "height": 49,
+      "style": {
+        "width": 228,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": -256.51237120830484,
+        "y": 1220.6280432813637
+      },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false
+    },
+    {
+      "id": "MpWO1sroeF106SEMU1V1a",
+      "type": "subtopic",
+      "position": {
+        "x": -245.87814569065125,
+        "y": 1285.958502239233
+      },
+      "selected": false,
+      "data": {
+        "label": "Drizzle",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 100,
+      "height": 49,
+      "style": {
+        "width": 100,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": -245.87814569065125,
+        "y": 1285.958502239233
+      },
+      "selectable": true,
+      "focusable": true,
+      "resizing": false,
+      "dragging": false
+    },
+    {
+      "id": "h3MHLZZwkYqqb5PSfMhpB",
+      "type": "subtopic",
+      "position": {
+        "x": -141.87814569065125,
+        "y": 1285.958502239233
+      },
+      "selected": false,
+      "data": {
+        "label": "Prisma",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 100,
+      "height": 49,
+      "style": {
+        "width": 100,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": -141.87814569065125,
+        "y": 1285.958502239233
+      },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false,
+      "resizing": false
+    },
+    {
+      "id": "brZctR1PMK6yErGIfRo_G",
+      "type": "label",
+      "position": {
+        "x": -197.51237120830484,
+        "y": 1337.3942173748287
+      },
+      "selected": false,
+      "data": {
+        "label": "Frameworks",
+        "href": "",
+        "color": "#000000",
+        "style": {
+          "fontSize": 17
+        }
+      },
+      "zIndex": 999,
+      "width": 110,
+      "height": 36,
+      "style": {},
+      "dragging": false,
+      "positionAbsolute": {
+        "x": -197.51237120830484,
+        "y": 1337.3942173748287
+      },
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "QmxWfOTVNW6WTEbPtEqev",
+      "type": "vertical",
+      "position": {
+        "x": -19.528343636044667,
+        "y": 1114.6280432813637
+      },
+      "selected": false,
+      "data": {
+        "label": "vertical node",
+        "style": {
+          "stroke": "#2B78E4",
+          "strokeWidth": 3.75
+        }
+      },
+      "zIndex": 999,
+      "width": 20,
+      "height": 207,
+      "style": {
+        "width": 20,
+        "height": 207
+      },
+      "positionAbsolute": {
+        "x": -19.528343636044667,
+        "y": 1114.6280432813637
+      },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "9MlFtF1q0eis4YmCEmIir",
+      "type": "paragraph",
+      "position": {
+        "x": 544.982416535137,
+        "y": 1174.9754953712302
+      },
+      "selected": false,
+      "data": {
+        "label": "Durable Execution",
+        "style": {
+          "fontSize": 20,
+          "borderColor": "transparent",
+          "backgroundColor": "transparent",
+          "color": "#000000",
+          "textAlign": "center",
+          "justifyContent": "center",
+          "padding": 16
+        }
+      },
+      "zIndex": 999,
+      "width": 205,
+      "height": 48,
+      "style": {
+        "width": 205,
+        "height": 48
+      },
+      "resizing": false,
+      "positionAbsolute": {
+        "x": 544.982416535137,
+        "y": 1174.9754953712302
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "zyRgTtlng6idboSgL9YTt",
+      "type": "topic",
+      "position": {
+        "x": 581.982416535137,
+        "y": 1288.4799140839043
+      },
+      "selected": false,
+      "data": {
+        "label": "Queues",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 131,
+      "height": 49,
+      "style": {
+        "width": 131,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 581.982416535137,
+        "y": 1288.4799140839043
+      },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "EFA8m0EdhygxcBWzwmbnT",
+      "type": "subtopic",
+      "position": {
+        "x": 541.982416535137,
+        "y": 1389.7759268553775
+      },
+      "selected": false,
+      "data": {
+        "label": "Message Processing",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 211,
+      "height": 50,
+      "style": {
+        "width": 211,
+        "height": 50
+      },
+      "resizing": false,
+      "positionAbsolute": {
+        "x": 541.982416535137,
+        "y": 1389.7759268553775
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "qgvDGyLjc6lMmVPjHozFM",
+      "type": "subtopic",
+      "position": {
+        "x": 541.982416535137,
+        "y": 1443.7759268553775
+      },
+      "selected": false,
+      "data": {
+        "label": "Background Jobs",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 211,
+      "height": 49,
+      "style": {
+        "width": 211,
+        "height": 49
+      },
+      "dragging": false,
+      "positionAbsolute": {
+        "x": 541.982416535137,
+        "y": 1443.7759268553775
+      },
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "MInAsLLJtIq6WQDSj5yGH",
+      "type": "subtopic",
+      "position": {
+        "x": 541.982416535137,
+        "y": 1496.7759268553775
+      },
+      "selected": false,
+      "data": {
+        "label": "Rate Limiting",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 211,
+      "height": 49,
+      "style": {
+        "width": 211,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 541.982416535137,
+        "y": 1496.7759268553775
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "Grl59SjY31Q3sgf9uX-xf",
+      "type": "subtopic",
+      "position": {
+        "x": 541.982416535137,
+        "y": 1549.7759268553775
+      },
+      "selected": false,
+      "data": {
+        "label": "Dead Letter Queues",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 211,
+      "height": 49,
+      "style": {
+        "width": 211,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 541.982416535137,
+        "y": 1549.7759268553775
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "G-xBbtaniYFRE9Dgs18px",
+      "type": "topic",
+      "position": {
+        "x": 159.9816756636405,
+        "y": 1288.4799140839043
+      },
+      "selected": false,
+      "data": {
+        "label": "Durable Objects",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 172,
+      "height": 49,
+      "style": {
+        "width": 172,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 159.9816756636405,
+        "y": 1288.4799140839043
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true,
+      "resizing": false
+    },
+    {
+      "id": "EQjhRlM7zpANNWkypScIl",
+      "type": "subtopic",
+      "position": {
+        "x": 124.98167566364049,
+        "y": 1394.4160042707758
+      },
+      "selected": false,
+      "data": {
+        "label": "State Management",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 242,
+      "height": 49,
+      "style": {
+        "width": 242
+      },
+      "positionAbsolute": {
+        "x": 124.98167566364049,
+        "y": 1394.4160042707758
+      },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false
+    },
+    {
+      "id": "RYm0oBFCxm-S-aCwZ21p6",
+      "type": "subtopic",
+      "position": {
+        "x": 124.98167566364049,
+        "y": 1447.4160042707758
+      },
+      "selected": false,
+      "data": {
+        "label": "Coordination",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 242,
+      "height": 49,
+      "style": {
+        "width": 242
+      },
+      "positionAbsolute": {
+        "x": 124.98167566364049,
+        "y": 1447.4160042707758
+      },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false
+    },
+    {
+      "id": "36w4Q73XkCwo5Cva0XsF8",
+      "type": "subtopic",
+      "position": {
+        "x": 124.98167566364049,
+        "y": 1500.4160042707758
+      },
+      "selected": false,
+      "data": {
+        "label": "Persistence",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 242,
+      "height": 49,
+      "style": {
+        "width": 242
+      },
+      "positionAbsolute": {
+        "x": 124.98167566364049,
+        "y": 1500.4160042707758
+      },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false
+    },
+    {
+      "id": "rxxibrJUo1rQ3XCuUIP59",
+      "type": "subtopic",
+      "position": {
+        "x": 124.98167566364049,
+        "y": 1553.4160042707758
+      },
+      "selected": false,
+      "data": {
+        "label": "Transactional Operations",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 242,
+      "height": 49,
+      "style": {
+        "width": 242,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 124.98167566364049,
+        "y": 1553.4160042707758
+      },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false,
+      "resizing": false
+    },
+    {
+      "id": "rAl7zXcODiqIpS__3qf1A",
+      "type": "topic",
+      "position": {
+        "x": -256.2583309760692,
+        "y": 1428.0801885474361
+      },
+      "selected": false,
+      "data": {
+        "label": "Workflows",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "G-xBbtaniYFRE9Dgs18px"
+      },
+      "zIndex": 999,
+      "width": 176,
+      "height": 49,
+      "style": {
+        "width": 176,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": -256.2583309760692,
+        "y": 1428.0801885474361
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true,
+      "resizing": false
+    },
+    {
+      "id": "yTtjbO_dji8ssSaOAKpCV",
+      "type": "paragraph",
+      "position": {
+        "x": -292.2583309760692,
+        "y": 1529.9764904620736
+      },
+      "selected": false,
+      "data": {
+        "label": "Advanced Features",
+        "style": {
+          "fontSize": 20,
+          "borderColor": "transparent",
+          "backgroundColor": "transparent",
+          "color": "#000000",
+          "textAlign": "center",
+          "justifyContent": "center",
+          "padding": 16
+        },
+        "oldId": "9MlFtF1q0eis4YmCEmIir"
+      },
+      "zIndex": 999,
+      "width": 248,
+      "height": 55,
+      "style": {
+        "width": 248,
+        "height": 55
+      },
+      "resizing": false,
+      "positionAbsolute": {
+        "x": -292.2583309760692,
+        "y": 1529.9764904620736
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "a0S0_JLwLLNGLUAHrqG4P",
+      "type": "topic",
+      "position": {
+        "x": -256.2583309760692,
+        "y": 1634.6916034998312
+      },
+      "selected": false,
+      "data": {
+        "label": "Workers AI",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 176,
+      "height": 49,
+      "style": {
+        "width": 176,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": -256.2583309760692,
+        "y": 1634.6916034998312
+      },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false
+    },
+    {
+      "id": "zMwmoCUp9429_aXU-Bz4H",
+      "type": "subtopic",
+      "position": {
+        "x": -277.7583309760692,
+        "y": 1721.8046659749807
+      },
+      "selected": false,
+      "data": {
+        "label": "Text Generation",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 219,
+      "height": 49,
+      "style": {
+        "width": 219,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": -277.7583309760692,
+        "y": 1721.8046659749807
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "S7laV14zsx31O0Tsj2SRL",
+      "type": "subtopic",
+      "position": {
+        "x": -277.7583309760692,
+        "y": 1774.8046659749807
+      },
+      "selected": false,
+      "data": {
+        "label": "Image Processing",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 219,
+      "height": 49,
+      "style": {
+        "width": 219,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": -277.7583309760692,
+        "y": 1774.8046659749807
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "HJbJ8OxjJzznYwLlIOSO2",
+      "type": "subtopic",
+      "position": {
+        "x": -277.7583309760692,
+        "y": 1827.8046659749807
+      },
+      "selected": false,
+      "data": {
+        "label": "Speech Rcognition",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 219,
+      "height": 49,
+      "style": {
+        "width": 219,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": -277.7583309760692,
+        "y": 1827.8046659749807
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "QxPoNHsL-Pj_z3aU6qEP4",
+      "type": "subtopic",
+      "position": {
+        "x": -277.7583309760692,
+        "y": 1880.8046659749807
+      },
+      "selected": false,
+      "data": {
+        "label": "AI Model Integration",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 219,
+      "height": 49,
+      "style": {
+        "width": 219,
+        "height": 49
+      },
+      "resizing": false,
+      "positionAbsolute": {
+        "x": -277.7583309760692,
+        "y": 1880.8046659749807
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "NWGVtH1vxQuO4lly0Omuy",
+      "type": "topic",
+      "position": {
+        "x": 79.83264623685739,
+        "y": 1634.6916034998312
+      },
+      "selected": false,
+      "data": {
+        "label": "Vectorize",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "vHQdMgaL2EEr2o_eJmOuV"
+      },
+      "zIndex": 999,
+      "width": 124,
+      "height": 49,
+      "style": {
+        "width": 124,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 79.83264623685739,
+        "y": 1634.6916034998312
+      },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false,
+      "resizing": false
+    },
+    {
+      "id": "UIWaR1ZdjSm0UAS69Kz_5",
+      "type": "subtopic",
+      "position": {
+        "x": 40.332646236857386,
+        "y": 1724.2807234618997
+      },
+      "selected": false,
+      "data": {
+        "label": "Vector Embeddings",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 203,
+      "height": 49,
+      "style": {
+        "width": 203,
+        "height": 49
+      },
+      "dragging": false,
+      "resizing": false,
+      "positionAbsolute": {
+        "x": 40.332646236857386,
+        "y": 1724.2807234618997
+      },
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "pg3GtykCegK411DYDN8sN",
+      "type": "subtopic",
+      "position": {
+        "x": 40.332646236857386,
+        "y": 1777.2807234618997
+      },
+      "selected": false,
+      "data": {
+        "label": "Similarity Search",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 203,
+      "height": 49,
+      "style": {
+        "width": 203,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 40.332646236857386,
+        "y": 1777.2807234618997
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "Ep9_oV_YnkbH1gHM-n3gO",
+      "type": "subtopic",
+      "position": {
+        "x": 40.332646236857386,
+        "y": 1830.2807234618997
+      },
+      "selected": false,
+      "data": {
+        "label": "AI-powered Search",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 203,
+      "height": 49,
+      "style": {
+        "width": 203,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 40.332646236857386,
+        "y": 1830.2807234618997
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "LoT3NtpNj9uAgQRV-MD_E",
+      "type": "topic",
+      "position": {
+        "x": 346.6978266236106,
+        "y": 1634.6916034998312
+      },
+      "selected": false,
+      "data": {
+        "label": "Stream",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "vHQdMgaL2EEr2o_eJmOuV"
+      },
+      "zIndex": 999,
+      "width": 124,
+      "height": 49,
+      "style": {
+        "width": 124,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 346.6978266236106,
+        "y": 1634.6916034998312
+      },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false,
+      "resizing": false
+    },
+    {
+      "id": "zQp7XfDKWJgMf2LexRJhN",
+      "type": "subtopic",
+      "position": {
+        "x": 312.1978266236106,
+        "y": 1721.3878759780328
+      },
+      "selected": false,
+      "data": {
+        "label": "Video Delivery",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 193,
+      "height": 49,
+      "style": {
+        "width": 193,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 312.1978266236106,
+        "y": 1721.3878759780328
+      },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false
+    },
+    {
+      "id": "RiQSPAV9uRFgwQFJckTFV",
+      "type": "subtopic",
+      "position": {
+        "x": 312.1978266236106,
+        "y": 1774.3878759780328
+      },
+      "selected": false,
+      "data": {
+        "label": "Live streaming",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 193,
+      "height": 49,
+      "style": {
+        "width": 193,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 312.1978266236106,
+        "y": 1774.3878759780328
+      },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false
+    },
+    {
+      "id": "3B6Z7F0D3Sf8ZBlV3kkGx",
+      "type": "subtopic",
+      "position": {
+        "x": 312.1978266236106,
+        "y": 1827.3878759780328
+      },
+      "selected": false,
+      "data": {
+        "label": "Video Processing",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 193,
+      "height": 49,
+      "style": {
+        "width": 193,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 312.1978266236106,
+        "y": 1827.3878759780328
+      },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false,
+      "resizing": false
+    },
+    {
+      "id": "8bOWuopxHtBWUSFaVT54P",
+      "type": "topic",
+      "position": {
+        "x": 561.482416535137,
+        "y": 1634.6916034998312
+      },
+      "selected": false,
+      "data": {
+        "label": "Images",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "vHQdMgaL2EEr2o_eJmOuV"
+      },
+      "zIndex": 999,
+      "width": 172,
+      "height": 49,
+      "style": {
+        "width": 172,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 561.482416535137,
+        "y": 1634.6916034998312
+      },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false,
+      "resizing": false
+    },
+    {
+      "id": "vHQdMgaL2EEr2o_eJmOuV",
+      "type": "topic",
+      "position": {
+        "x": 561.482416535137,
+        "y": 1753.2807234618997
+      },
+      "selected": false,
+      "data": {
+        "label": "Calls",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "a0S0_JLwLLNGLUAHrqG4P"
+      },
+      "zIndex": 999,
+      "width": 172,
+      "height": 49,
+      "style": {
+        "width": 172,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 561.482416535137,
+        "y": 1753.2807234618997
+      },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false,
+      "resizing": false
+    },
+    {
+      "id": "aKEH4ZxI6J1nwjp_AgH5r",
+      "type": "subtopic",
+      "position": {
+        "x": -286.42440139623136,
+        "y": 701.9890672390103
+      },
+      "selected": false,
+      "data": {
+        "label": "Logging and Monitoring",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "9ef2VPCru8lCmRxxGe-Eo"
+      },
+      "zIndex": 999,
+      "width": 288,
+      "height": 49,
+      "style": {
+        "width": 288
+      },
+      "positionAbsolute": {
+        "x": -286.42440139623136,
+        "y": 701.9890672390103
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "z-1Ye5hcNdr9r6Gwdw7mv",
+      "type": "topic",
+      "position": {
+        "x": 561.482416535137,
+        "y": 1956.3878759780328
+      },
+      "selected": false,
+      "data": {
+        "label": "Email Workers",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "vHQdMgaL2EEr2o_eJmOuV"
+      },
+      "zIndex": 999,
+      "width": 172,
+      "height": 49,
+      "style": {
+        "width": 172,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 561.482416535137,
+        "y": 1956.3878759780328
+      },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false,
+      "resizing": false
+    },
+    {
+      "id": "-lsYPD6JueIV94RybGH_Y",
+      "type": "subtopic",
+      "position": {
+        "x": 561.482416535137,
+        "y": 2047.265056764798
+      },
+      "selected": false,
+      "data": {
+        "label": "Routing",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 172,
+      "height": 49,
+      "style": {
+        "width": 172,
+        "height": 49
+      },
+      "resizing": false,
+      "positionAbsolute": {
+        "x": 561.482416535137,
+        "y": 2047.265056764798
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "6bNUqx5f_w5NuDL25BABN",
+      "type": "subtopic",
+      "position": {
+        "x": 561.482416535137,
+        "y": 2100.265056764798
+      },
+      "selected": false,
+      "data": {
+        "label": "Processing",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "-lsYPD6JueIV94RybGH_Y"
+      },
+      "zIndex": 999,
+      "width": 172,
+      "height": 49,
+      "style": {
+        "width": 172,
+        "height": 49
+      },
+      "resizing": false,
+      "positionAbsolute": {
+        "x": 561.482416535137,
+        "y": 2100.265056764798
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "kdIfqTCcOSvV4KDpjr7nu",
+      "type": "subtopic",
+      "position": {
+        "x": 561.482416535137,
+        "y": 2153.265056764798
+      },
+      "selected": false,
+      "data": {
+        "label": "Filtering",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "6bNUqx5f_w5NuDL25BABN"
+      },
+      "zIndex": 999,
+      "width": 172,
+      "height": 49,
+      "style": {
+        "width": 172,
+        "height": 49
+      },
+      "resizing": false,
+      "positionAbsolute": {
+        "x": 561.482416535137,
+        "y": 2153.265056764798
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "vu8yJsS1WccsdcEVUqwNd",
+      "type": "topic",
+      "position": {
+        "x": 361.39029212267985,
+        "y": 1956.3878759780328
+      },
+      "selected": false,
+      "data": {
+        "label": "AI Gateway",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 151,
+      "height": 49,
+      "style": {
+        "width": 151,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 361.39029212267985,
+        "y": 1956.3878759780328
+      },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "qkFRW_tJB8_1IYpYskQ5M",
+      "type": "topic",
+      "position": {
+        "x": 74.57806488778613,
+        "y": 1956.3878759780328
+      },
+      "selected": false,
+      "data": {
+        "label": "Browser Rendering",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "vu8yJsS1WccsdcEVUqwNd"
+      },
+      "zIndex": 999,
+      "width": 234,
+      "height": 50,
+      "style": {
+        "width": 234,
+        "height": 50
+      },
+      "positionAbsolute": {
+        "x": 74.57806488778613,
+        "y": 1956.3878759780328
+      },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "76xovsBrKOnlRBVjsqNq1",
+      "type": "topic",
+      "position": {
+        "x": 74.57806488778613,
+        "y": 2141.5338176098276
+      },
+      "selected": false,
+      "data": {
+        "label": "Security & Performance",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 234,
+      "height": 49,
+      "style": {
+        "width": 234,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 74.57806488778613,
+        "y": 2141.5338176098276
+      },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "8IF7jftushwZrn7JXpC_v",
+      "type": "subtopic",
+      "position": {
+        "x": -281.3575478619334,
+        "y": 1982.5338176098273
+      },
+      "selected": false,
+      "data": {
+        "label": "Workers Security Model",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 226,
+      "height": 49,
+      "style": {
+        "width": 226,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": -281.3575478619334,
+        "y": 1982.5338176098273
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "uNinrB9wm5ahjGXu5fc0g",
+      "type": "subtopic",
+      "position": {
+        "x": -281.3575478619334,
+        "y": 2035.5338176098276
+      },
+      "selected": false,
+      "data": {
+        "label": "Isolates Architecture",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 226,
+      "height": 49,
+      "style": {
+        "width": 226,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": -281.3575478619334,
+        "y": 2035.5338176098276
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "KWix4jeNUKJ07Iu95Mqj_",
+      "type": "subtopic",
+      "position": {
+        "x": -281.3575478619334,
+        "y": 2088.5338176098276
+      },
+      "selected": false,
+      "data": {
+        "label": "Web Security Headers",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 226,
+      "height": 49,
+      "style": {
+        "width": 226,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": -281.3575478619334,
+        "y": 2088.5338176098276
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "JP5U6c2fZjtkU-Xzwtapx",
+      "type": "subtopic",
+      "position": {
+        "x": -281.3575478619334,
+        "y": 2141.5338176098276
+      },
+      "selected": false,
+      "data": {
+        "label": "Rate Limiting",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 226,
+      "height": 49,
+      "style": {
+        "width": 226,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": -281.3575478619334,
+        "y": 2141.5338176098276
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "ui3pUfsGMxv4WRzHkgbF0",
+      "type": "subtopic",
+      "position": {
+        "x": -281.3575478619334,
+        "y": 2194.5338176098276
+      },
+      "selected": false,
+      "data": {
+        "label": "Cache API",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 226,
+      "height": 49,
+      "style": {
+        "width": 226,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": -281.3575478619334,
+        "y": 2194.5338176098276
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "INiqdtppBmCthOEXuHb-V",
+      "type": "subtopic",
+      "position": {
+        "x": -281.3575478619334,
+        "y": 2247.5338176098276
+      },
+      "selected": false,
+      "data": {
+        "label": "HTML Rewriting",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 226,
+      "height": 49,
+      "style": {
+        "width": 226,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": -281.3575478619334,
+        "y": 2247.5338176098276
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "sXBxaQtwJ-luGVXdqVXk1",
+      "type": "subtopic",
+      "position": {
+        "x": -281.3575478619334,
+        "y": 2300.5338176098276
+      },
+      "selected": false,
+      "data": {
+        "label": "Edge SSL/TLS",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 226,
+      "height": 49,
+      "style": {
+        "width": 226,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": -281.3575478619334,
+        "y": 2300.5338176098276
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "So-cKAVfbgsw2zzFREu7Q",
+      "type": "subtopic",
+      "position": {
+        "x": -281.3575478619334,
+        "y": 2353.5338176098276
+      },
+      "selected": false,
+      "data": {
+        "label": "Bot Management",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 226,
+      "height": 49,
+      "style": {
+        "width": 226,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": -281.3575478619334,
+        "y": 2353.5338176098276
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "wvurOKbemF4Tt2WZcmqDL",
+      "type": "topic",
+      "position": {
+        "x": 74.57806488778613,
+        "y": 2254.2760834530172
+      },
+      "selected": false,
+      "data": {
+        "label": "Integration & Workflows",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 234,
+      "height": 49,
+      "style": {
+        "width": 234,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 74.57806488778613,
+        "y": 2254.2760834530172
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "SaHqm7T4FFVrsgyfImo66",
+      "type": "subtopic",
+      "position": {
+        "x": 58.14668680870477,
+        "y": 2349.674307977968
+      },
+      "selected": false,
+      "data": {
+        "label": "Pages Functions",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 269,
+      "height": 49,
+      "style": {
+        "width": 269,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 58.14668680870477,
+        "y": 2349.674307977968
+      },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false
+    },
+    {
+      "id": "JfpVexcbuWCx_R3EjFmbo",
+      "type": "subtopic",
+      "position": {
+        "x": 58.14668680870477,
+        "y": 2402.674307977968
+      },
+      "selected": false,
+      "data": {
+        "label": "Service Bindings",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 269,
+      "height": 49,
+      "style": {
+        "width": 269,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 58.14668680870477,
+        "y": 2402.674307977968
+      },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false
+    },
+    {
+      "id": "jYAUIKozuhsNK5LbkeAJ6",
+      "type": "subtopic",
+      "position": {
+        "x": 58.14668680870477,
+        "y": 2455.674307977968
+      },
+      "selected": false,
+      "data": {
+        "label": "Inter Worker Communication",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 269,
+      "height": 49,
+      "style": {
+        "width": 269,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 58.14668680870477,
+        "y": 2455.674307977968
+      },
+      "selectable": true,
+      "focusable": true,
+      "resizing": false,
+      "dragging": false
+    },
+    {
+      "id": "4g5w6IAdzefdlRTxbRbdS",
+      "type": "subtopic",
+      "position": {
+        "x": 58.14668680870477,
+        "y": 2508.674307977968
+      },
+      "selected": false,
+      "data": {
+        "label": "External API Integration",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 269,
+      "height": 49,
+      "style": {
+        "width": 269,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 58.14668680870477,
+        "y": 2508.674307977968
+      },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false
+    },
+    {
+      "id": "uOUjI6CPrhZIlz6mRCtOW",
+      "type": "subtopic",
+      "position": {
+        "x": 58.14668680870477,
+        "y": 2561.674307977968
+      },
+      "selected": false,
+      "data": {
+        "label": "Webhook Handling",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 269,
+      "height": 49,
+      "style": {
+        "width": 269,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 58.14668680870477,
+        "y": 2561.674307977968
+      },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false
+    },
+    {
+      "id": "Z9Yywlf7rXFBtxTq5B2Y5",
+      "type": "subtopic",
+      "position": {
+        "x": 58.14668680870477,
+        "y": 2614.674307977968
+      },
+      "selected": false,
+      "data": {
+        "label": "Event-driven Architectures",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 269,
+      "height": 49,
+      "style": {
+        "width": 269,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 58.14668680870477,
+        "y": 2614.674307977968
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "gsCRhwwjXuyueaYHSPOVZ",
+      "type": "topic",
+      "position": {
+        "x": 552.5408714863938,
+        "y": 2254.2760834530172
+      },
+      "selected": false,
+      "data": {
+        "label": "Development Tools",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 192,
+      "height": 49,
+      "style": {},
+      "positionAbsolute": {
+        "x": 552.5408714863938,
+        "y": 2254.2760834530172
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "n0vIbHmUZHrF4WjEhYdb8",
+      "type": "subtopic",
+      "position": {
+        "x": 537.0408714863938,
+        "y": 2348.4410077281054
+      },
+      "selected": false,
+      "data": {
+        "label": "Wrangler",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 222,
+      "height": 49,
+      "style": {
+        "width": 222,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 537.0408714863938,
+        "y": 2348.4410077281054
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "vZHBp4S6WaS5sa5rfUOk-",
+      "type": "subtopic",
+      "position": {
+        "x": 537.0408714863938,
+        "y": 2401.4410077281054
+      },
+      "selected": false,
+      "data": {
+        "label": "Miniflare",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 222,
+      "height": 49,
+      "style": {
+        "width": 222,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 537.0408714863938,
+        "y": 2401.4410077281054
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "G6YQZUQh_x8Qxm1oBseLQ",
+      "type": "subtopic",
+      "position": {
+        "x": 537.0408714863938,
+        "y": 2454.4410077281054
+      },
+      "selected": false,
+      "data": {
+        "label": "DevTools",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 222,
+      "height": 49,
+      "style": {
+        "width": 222,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 537.0408714863938,
+        "y": 2454.4410077281054
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "jyWxaMx7_nojt5HsyAv7K",
+      "type": "subtopic",
+      "position": {
+        "x": 537.0408714863938,
+        "y": 2507.4410077281054
+      },
+      "selected": false,
+      "data": {
+        "label": "Testing Frameworks",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 222,
+      "height": 49,
+      "style": {
+        "width": 222,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 537.0408714863938,
+        "y": 2507.4410077281054
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "Cy2T8978yUAPGol-yzxv_",
+      "type": "subtopic",
+      "position": {
+        "x": 537.0408714863938,
+        "y": 2560.4410077281054
+      },
+      "selected": false,
+      "data": {
+        "label": "Monitoring Tools",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 222,
+      "height": 49,
+      "style": {
+        "width": 222,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 537.0408714863938,
+        "y": 2560.4410077281054
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "TmQC7fTL6b9EsBDYibv4g",
+      "type": "subtopic",
+      "position": {
+        "x": 537.0408714863938,
+        "y": 2613.4410077281054
+      },
+      "selected": false,
+      "data": {
+        "label": "Debugging Techniques",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 222,
+      "height": 49,
+      "style": {
+        "width": 222,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 537.0408714863938,
+        "y": 2613.4410077281054
+      },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "8WZpSKBHCeYfTEL9tBNKr",
+      "type": "topic",
+      "position": {
+        "x": 562.0408714863938,
+        "y": 1852.987126931784
+      },
+      "selected": false,
+      "data": {
+        "label": "Tunnels",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "vHQdMgaL2EEr2o_eJmOuV"
+      },
+      "zIndex": 999,
+      "width": 172,
+      "height": 49,
+      "style": {
+        "width": 172,
+        "height": 49
+      },
+      "positionAbsolute": {
+        "x": 562.0408714863938,
+        "y": 1852.987126931784
+      },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false,
+      "resizing": false
+    },
+    {
+      "id": "HKEkt3803YCZEiuKAK03p",
+      "type": "vertical",
+      "position": {
+        "x": 421.119142886761,
+        "y": 2279.0426302976457
+      },
+      "selected": false,
+      "data": {
+        "label": "vertical node",
+        "style": {
+          "stroke": "#2B78E4",
+          "strokeWidth": 3.85
+        }
+      },
+      "zIndex": 999,
+      "width": 20,
+      "height": 454,
+      "style": {
+        "width": 20,
+        "height": 454
+      },
+      "positionAbsolute": {
+        "x": 421.119142886761,
+        "y": 2279.0426302976457
+      },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "width": 409,
+      "height": 117,
+      "id": "0vLaVNJaJSHZ_bHli6Qzs",
+      "type": "paragraph",
+      "position": {
+        "x": 96.6731233760895,
+        "y": 2724.273088708159
+      },
+      "selected": false,
+      "data": {
+        "label": "Visit the following relevant tracks to learn more",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center",
+          "borderColor": "#000000",
+          "backgroundColor": "WHITe"
+        },
+        "oldId": "m9eO0jLGuR_9w2JJbe_g2"
+      },
+      "zIndex": 999,
+      "positionAbsolute": {
+        "x": 96.6731233760895,
+        "y": 2724.273088708159
+      },
+      "dragging": false,
+      "style": {
+        "width": 409,
+        "height": 117
+      },
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "width": 116,
+      "height": 49,
+      "id": "OIcmPSbdsuWapb6HZ4BEi",
+      "type": "button",
+      "position": {
+        "x": 118.45973607629605,
+        "y": 2778.4187461412685
+      },
+      "selected": false,
+      "data": {
+        "label": "AWS",
+        "href": "https://roadmap.sh/aws",
+        "color": "#FFf",
+        "backgroundColor": "#4136D6",
+        "style": {
+          "fontSize": 17
+        },
+        "borderColor": "#4136D6",
+        "oldId": "cmSSwPPiiHwYh9ct14N6A"
+      },
+      "zIndex": 999,
+      "dragging": false,
+      "positionAbsolute": {
+        "x": 118.45973607629605,
+        "y": 2778.4187461412685
+      },
+      "style": {
+        "width": 116,
+        "height": 49
+      },
+      "focusable": true,
+      "resizing": false,
+      "selectable": true
+    },
+    {
+      "width": 20,
+      "height": 85,
+      "id": "xi0QAi4kXm3-IFKgopnOP",
+      "type": "vertical",
+      "position": {
+        "x": 303.6803864110923,
+        "y": 2841.402758744258
+      },
+      "selected": false,
+      "data": {
+        "label": "vertical node",
+        "style": {
+          "strokeDasharray": "0.8 8",
+          "strokeLinecap": "round",
+          "strokeWidth": 3.5,
+          "stroke": "#2B78E4"
+        },
+        "oldId": "RLtk1C3gofHnLJ17x3o5b"
+      },
+      "zIndex": 999,
+      "positionAbsolute": {
+        "x": 303.6803864110923,
+        "y": 2841.402758744258
+      },
+      "dragging": false,
+      "focusable": true,
+      "style": {
+        "width": 20,
+        "height": 85
+      },
+      "resizing": false,
+      "selectable": true
+    },
+    {
+      "width": 118,
+      "height": 49,
+      "id": "CH_K6mmFX_GdSzi2n1ID7",
+      "type": "button",
+      "position": {
+        "x": 239.91830765534394,
+        "y": 2778.4187461412685
+      },
+      "selected": false,
+      "data": {
+        "label": "Node.js",
+        "href": "https://roadmap.sh/nodejs",
+        "color": "#FFFFFf",
+        "backgroundColor": "#4136D6",
+        "style": {
+          "fontSize": 17
+        },
+        "borderColor": "#4136D6",
+        "oldId": "-sFboM4eFUMVq1tlPl-fV"
+      },
+      "zIndex": 999,
+      "dragging": false,
+      "positionAbsolute": {
+        "x": 239.91830765534394,
+        "y": 2778.4187461412685
+      },
+      "style": {
+        "width": 118,
+        "height": 49
+      },
+      "focusable": true,
+      "resizing": false,
+      "selectable": true
+    },
+    {
+      "width": 126,
+      "height": 49,
+      "id": "-sFboM4eFUMVq1tlPl-fV",
+      "type": "button",
+      "position": {
+        "x": 363.3768792343918,
+        "y": 2778.4187461412685
+      },
+      "selected": false,
+      "data": {
+        "label": "TypeScript",
+        "href": "https://roadmap.sh/typescript",
+        "color": "#FFFFFf",
+        "backgroundColor": "#4136D6",
+        "style": {
+          "fontSize": 17
+        },
+        "borderColor": "#4136D6",
+        "oldId": "qXKNK_IsGS8-JgLK-Q9oU"
+      },
+      "zIndex": 999,
+      "dragging": false,
+      "positionAbsolute": {
+        "x": 363.3768792343918,
+        "y": 2778.4187461412685
+      },
+      "style": {},
+      "focusable": true,
+      "resizing": false,
+      "selectable": true
+    },
+    {
+      "id": "WO8APVjZM_WD_ke5qLyOz",
+      "type": "linksgroup",
+      "position": {
+        "x": -288.5107846621675,
+        "y": 63.989067239010296
+      },
+      "selected": false,
+      "data": {
+        "label": "Useful Links",
+        "links": [
+          {
+            "id": "63hdFwOU9EHEykngaL1Wi",
+            "label": "Cloudflare Docs",
+            "url": "https://developers.cloudflare.com/"
+          },
+          {
+            "id": "TT9VW8sY-2yU8X3dxuu-K",
+            "label": "Discord Community",
+            "url": "https://discord.gg/cloudflaredev"
+          }
+        ],
+        "oldId": "qnjDifLlSYoxWd5GmuQXd"
+      },
+      "zIndex": 999,
+      "width": 295,
+      "height": 133,
+      "positionAbsolute": {
+        "x": -288.5107846621675,
+        "y": 63.989067239010296
+      },
+      "dragging": false,
+      "style": {
+        "width": 295,
+        "height": 133
+      },
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    }
+  ],
+  "edges": [
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "iogwMmOvub2ZF4zgg6WyF",
+      "sourceHandle": "x2",
+      "target": "_hYN0gEi9BL24nptEtXWU",
+      "targetHandle": "w1",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "XX0I26JoVMVXIe_7bVMix",
+      "selected": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "_hYN0gEi9BL24nptEtXWU",
+      "sourceHandle": "z2",
+      "target": "idLHBxhvcIqZTqmh_E8Az",
+      "targetHandle": "y1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "dFn6kGOoJ-0BzJJEb9DSG",
+      "selected": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "_hYN0gEi9BL24nptEtXWU",
+      "sourceHandle": "z2",
+      "target": "os3Pa6W9SSNEzgmlBbglQ",
+      "targetHandle": "y2",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "arkF7QJJRbCBYWp0crqa2",
+      "selected": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "_hYN0gEi9BL24nptEtXWU",
+      "sourceHandle": "z2",
+      "target": "3oInpqvTSSC5_K6i7j8N7",
+      "targetHandle": "y1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "HNVw8OboycWKLEtEbG2bn",
+      "selected": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "_hYN0gEi9BL24nptEtXWU",
+      "sourceHandle": "z2",
+      "target": "YKhuRbcUFzo0hTvuTq-Yl",
+      "targetHandle": "y1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "auB7Png72XjmhcLr3IJA7",
+      "selected": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "jZ67HhVRelJaxjsCckSSI",
+      "sourceHandle": "x2",
+      "target": "hWA7RtuqltMTmHdcCnmES",
+      "targetHandle": "y1",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "2aoDIr80lXSJLW1hIGUkb",
+      "selected": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "sourceHandle": "z2",
+      "target": "NMznG9mo2wzNFnjhg990f",
+      "targetHandle": "y1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "m-_y7nLeYFkUKGiacxWA0",
+      "selected": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "sourceHandle": "z2",
+      "target": "gc_7cuIO2_joKlQRAPDfX",
+      "targetHandle": "y1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "G7pXuJfkyt2nWAOHU8yV0",
+      "selected": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "rrrvATyhXqRgJGWI3z0WF",
+      "sourceHandle": "x2",
+      "target": "AvbMQ5vY3ip1oX_6Yq4ie",
+      "targetHandle": "w2",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "2_6Yz3-Agx9_rEN5xW86c",
+      "selected": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "hWA7RtuqltMTmHdcCnmES",
+      "sourceHandle": "w2",
+      "target": "1AJv95mTLpR7L8KBoGym8",
+      "targetHandle": "x1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "kgMI98fg2-mKMgUs0wnjD",
+      "selected": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "hWA7RtuqltMTmHdcCnmES",
+      "sourceHandle": "y2",
+      "target": "0etAs56EeBfh_0IlAaSra",
+      "targetHandle": "w1",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "selected": false,
+      "id": "ts38Q2ceHs60TJscUBZVE",
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "jZ67HhVRelJaxjsCckSSI",
+      "sourceHandle": "y2",
+      "target": "h6ceO0kiBIxNRkPzN3hBY",
+      "targetHandle": "z1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "ZiMV7umyPdhy3JJDcopR-",
+      "selected": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "jZ67HhVRelJaxjsCckSSI",
+      "sourceHandle": "y2",
+      "target": "_JlT9oKQ6Yu4UX6l19G8P",
+      "targetHandle": "z2",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "WI-MhbxrehFcVwyGJ5CQJ",
+      "selected": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "_hYN0gEi9BL24nptEtXWU",
+      "sourceHandle": "x2",
+      "target": "jZ67HhVRelJaxjsCckSSI",
+      "targetHandle": "w1",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "qUrLBzvXvJOg53HBfjrOI",
+      "selected": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "Ji35JsKgUQXN4DJGEgTAC",
+      "sourceHandle": "x2",
+      "target": "t3Op8UcgDKVeMLNMDePrW",
+      "targetHandle": "w1",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-Ji35JsKgUQXN4DJGEgTACx2-t3Op8UcgDKVeMLNMDePrWw1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "t3Op8UcgDKVeMLNMDePrW",
+      "sourceHandle": "y2",
+      "target": "PcYnYAAkKMbzoiCnBfjqO",
+      "targetHandle": "z1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-t3Op8UcgDKVeMLNMDePrWy2-PcYnYAAkKMbzoiCnBfjqOz1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "7XrG-k9T12u84Pwp4YwaY",
+      "sourceHandle": "y2",
+      "target": "TB6vGzDgGZ9yAd9MGR7vw",
+      "targetHandle": "z1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-7XrG-k9T12u84Pwp4YwaYy2-TB6vGzDgGZ9yAd9MGR7vwz1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "7XrG-k9T12u84Pwp4YwaY",
+      "sourceHandle": "y2",
+      "target": "aGWLomYHGkIfn7GFc0_Yl",
+      "targetHandle": "z1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-7XrG-k9T12u84Pwp4YwaYy2-aGWLomYHGkIfn7GFc0_Ylz1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "7XrG-k9T12u84Pwp4YwaY",
+      "sourceHandle": "y2",
+      "target": "HNEXPU6r_T7UYvwLv2wnt",
+      "targetHandle": "z1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-7XrG-k9T12u84Pwp4YwaYy2-HNEXPU6r_T7UYvwLv2wntz1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "7XrG-k9T12u84Pwp4YwaY",
+      "sourceHandle": "y2",
+      "target": "_2UnRlbUplHvs5-Stj4O4",
+      "targetHandle": "z1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-7XrG-k9T12u84Pwp4YwaYy2-_2UnRlbUplHvs5-Stj4O4z1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "7XrG-k9T12u84Pwp4YwaY",
+      "sourceHandle": "y2",
+      "target": "i6L9FI6fBDXr0XtMrc_uR",
+      "targetHandle": "z1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-7XrG-k9T12u84Pwp4YwaYy2-i6L9FI6fBDXr0XtMrc_uRz1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "7XrG-k9T12u84Pwp4YwaY",
+      "sourceHandle": "y2",
+      "target": "WZSi9inWPhqZQvDN-C8BV",
+      "targetHandle": "z1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-7XrG-k9T12u84Pwp4YwaYy2-WZSi9inWPhqZQvDN-C8BVz1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "7XrG-k9T12u84Pwp4YwaY",
+      "sourceHandle": "y2",
+      "target": "uBjcQ9PJUfwzu5N_2CNjN",
+      "targetHandle": "z2",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-7XrG-k9T12u84Pwp4YwaYy2-uBjcQ9PJUfwzu5N_2CNjNz2",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "7XrG-k9T12u84Pwp4YwaY",
+      "sourceHandle": "y2",
+      "target": "aStbAF4zraqhJ-N3RH4ha",
+      "targetHandle": "z2",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-7XrG-k9T12u84Pwp4YwaYy2-aStbAF4zraqhJ-N3RH4haz2",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "7XrG-k9T12u84Pwp4YwaY",
+      "sourceHandle": "y2",
+      "target": "9ef2VPCru8lCmRxxGe-Eo",
+      "targetHandle": "z2",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-7XrG-k9T12u84Pwp4YwaYy2-9ef2VPCru8lCmRxxGe-Eoz2",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "7XrG-k9T12u84Pwp4YwaY",
+      "sourceHandle": "x2",
+      "target": "IubwhdnyWtjpejkGOfnPy",
+      "targetHandle": "w1",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-7XrG-k9T12u84Pwp4YwaYx2-IubwhdnyWtjpejkGOfnPyw1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "Ji35JsKgUQXN4DJGEgTAC",
+      "sourceHandle": "x2",
+      "target": "c2YZ7PPCX1jF_RU7C0AqN",
+      "targetHandle": "w2",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-Ji35JsKgUQXN4DJGEgTACx2-c2YZ7PPCX1jF_RU7C0AqNw2",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "IubwhdnyWtjpejkGOfnPy",
+      "sourceHandle": "z2",
+      "target": "kJXPzUulKPhawgbEK7n9l",
+      "targetHandle": "y1",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-IubwhdnyWtjpejkGOfnPyz2-kJXPzUulKPhawgbEK7n9ly1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "IubwhdnyWtjpejkGOfnPy",
+      "sourceHandle": "x2",
+      "target": "3BGY76hTLAE8PY7OXQtNR",
+      "targetHandle": "w1",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-IubwhdnyWtjpejkGOfnPyx2-3BGY76hTLAE8PY7OXQtNRw1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "1dGFfQauOgHP7T4ReMpCU",
+      "sourceHandle": "x2",
+      "target": "EBTHbXOOZiqrcYJvKhcWV",
+      "targetHandle": "w2",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-1dGFfQauOgHP7T4ReMpCUx2-EBTHbXOOZiqrcYJvKhcWVw2",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "3BGY76hTLAE8PY7OXQtNR",
+      "sourceHandle": "y2",
+      "target": "1dGFfQauOgHP7T4ReMpCU",
+      "targetHandle": "z1",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-3BGY76hTLAE8PY7OXQtNRy2-1dGFfQauOgHP7T4ReMpCUz1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "3BGY76hTLAE8PY7OXQtNR",
+      "sourceHandle": "x2",
+      "target": "gxLUlXGuaY5Q-0xmBgQwz",
+      "targetHandle": "w1",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-3BGY76hTLAE8PY7OXQtNRx2-gxLUlXGuaY5Q-0xmBgQwzw1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "gxLUlXGuaY5Q-0xmBgQwz",
+      "sourceHandle": "z2",
+      "target": "K9iW2H6riKwddWmpWJFJw",
+      "targetHandle": "y1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-gxLUlXGuaY5Q-0xmBgQwzz2-K9iW2H6riKwddWmpWJFJwy1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "gxLUlXGuaY5Q-0xmBgQwz",
+      "sourceHandle": "z2",
+      "target": "BPahk1qH9Hk11tsE2hw3A",
+      "targetHandle": "y1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-gxLUlXGuaY5Q-0xmBgQwzz2-BPahk1qH9Hk11tsE2hw3Ay1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "gxLUlXGuaY5Q-0xmBgQwz",
+      "sourceHandle": "z2",
+      "target": "3jU5753Uza2aS-gZo7w4k",
+      "targetHandle": "y1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-gxLUlXGuaY5Q-0xmBgQwzz2-3jU5753Uza2aS-gZo7w4ky1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "gxLUlXGuaY5Q-0xmBgQwz",
+      "sourceHandle": "z2",
+      "target": "UNE6XK4su5r2jcxhY7hOG",
+      "targetHandle": "y1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-gxLUlXGuaY5Q-0xmBgQwzz2-UNE6XK4su5r2jcxhY7hOGy1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "gxLUlXGuaY5Q-0xmBgQwz",
+      "sourceHandle": "z2",
+      "target": "YvgmmF9sWfURgijFV7E31",
+      "targetHandle": "y1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-gxLUlXGuaY5Q-0xmBgQwzz2-YvgmmF9sWfURgijFV7E31y1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "gxLUlXGuaY5Q-0xmBgQwz",
+      "sourceHandle": "x2",
+      "target": "mKN0Ta3zSk7PCm_uHYKFN",
+      "targetHandle": "w2",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-gxLUlXGuaY5Q-0xmBgQwzx2-mKN0Ta3zSk7PCm_uHYKFNw2",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "mKN0Ta3zSk7PCm_uHYKFN",
+      "sourceHandle": "z2",
+      "target": "9MlFtF1q0eis4YmCEmIir",
+      "targetHandle": "y1",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-mKN0Ta3zSk7PCm_uHYKFNz2-9MlFtF1q0eis4YmCEmIiry1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "zyRgTtlng6idboSgL9YTt",
+      "sourceHandle": "x2",
+      "target": "EFA8m0EdhygxcBWzwmbnT",
+      "targetHandle": "w2",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-zyRgTtlng6idboSgL9YTtx2-EFA8m0EdhygxcBWzwmbnTw2",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "9MlFtF1q0eis4YmCEmIir",
+      "sourceHandle": "x2",
+      "target": "zyRgTtlng6idboSgL9YTt",
+      "targetHandle": "w1",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-9MlFtF1q0eis4YmCEmIirx2-zyRgTtlng6idboSgL9YTtw1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "zyRgTtlng6idboSgL9YTt",
+      "sourceHandle": "y2",
+      "target": "G-xBbtaniYFRE9Dgs18px",
+      "targetHandle": "z1",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-zyRgTtlng6idboSgL9YTty2-G-xBbtaniYFRE9Dgs18pxz1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "G-xBbtaniYFRE9Dgs18px",
+      "sourceHandle": "y2",
+      "target": "rAl7zXcODiqIpS__3qf1A",
+      "targetHandle": "z1",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-G-xBbtaniYFRE9Dgs18pxy2-rAl7zXcODiqIpS__3qf1Az1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "rAl7zXcODiqIpS__3qf1A",
+      "sourceHandle": "x2",
+      "target": "yTtjbO_dji8ssSaOAKpCV",
+      "targetHandle": "w1",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-rAl7zXcODiqIpS__3qf1Ax2-yTtjbO_dji8ssSaOAKpCVw1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "yTtjbO_dji8ssSaOAKpCV",
+      "sourceHandle": "x2",
+      "target": "a0S0_JLwLLNGLUAHrqG4P",
+      "targetHandle": "w1",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-yTtjbO_dji8ssSaOAKpCVx2-a0S0_JLwLLNGLUAHrqG4Pw1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "a0S0_JLwLLNGLUAHrqG4P",
+      "sourceHandle": "x2",
+      "target": "zMwmoCUp9429_aXU-Bz4H",
+      "targetHandle": "w2",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-a0S0_JLwLLNGLUAHrqG4Px2-zMwmoCUp9429_aXU-Bz4Hw2",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "a0S0_JLwLLNGLUAHrqG4P",
+      "sourceHandle": "z2",
+      "target": "NWGVtH1vxQuO4lly0Omuy",
+      "targetHandle": "y2",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-a0S0_JLwLLNGLUAHrqG4Pz2-vHQdMgaL2EEr2o_eJmOuVy2",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "G-xBbtaniYFRE9Dgs18px",
+      "sourceHandle": "x2",
+      "target": "EQjhRlM7zpANNWkypScIl",
+      "targetHandle": "w1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-G-xBbtaniYFRE9Dgs18pxx2-EQjhRlM7zpANNWkypScIlw1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "NWGVtH1vxQuO4lly0Omuy",
+      "sourceHandle": "x2",
+      "target": "UIWaR1ZdjSm0UAS69Kz_5",
+      "targetHandle": "w2",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-vHQdMgaL2EEr2o_eJmOuVx2-UIWaR1ZdjSm0UAS69Kz_5w2",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "NWGVtH1vxQuO4lly0Omuy",
+      "sourceHandle": "z2",
+      "target": "LoT3NtpNj9uAgQRV-MD_E",
+      "targetHandle": "y2",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-NWGVtH1vxQuO4lly0Omuyz2-vHQdMgaL2EEr2o_eJmOuVy2",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "LoT3NtpNj9uAgQRV-MD_E",
+      "sourceHandle": "x2",
+      "target": "zQp7XfDKWJgMf2LexRJhN",
+      "targetHandle": "w2",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-vHQdMgaL2EEr2o_eJmOuVx2-zQp7XfDKWJgMf2LexRJhNw2",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "LoT3NtpNj9uAgQRV-MD_E",
+      "sourceHandle": "z2",
+      "target": "8bOWuopxHtBWUSFaVT54P",
+      "targetHandle": "y1",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-LoT3NtpNj9uAgQRV-MD_Ez2-8bOWuopxHtBWUSFaVT54Py1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "QxPoNHsL-Pj_z3aU6qEP4",
+      "sourceHandle": "x2",
+      "target": "SvGk66F2HtuWcMgZ8ILII",
+      "targetHandle": "w2",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-QxPoNHsL-Pj_z3aU6qEP4x2-SvGk66F2HtuWcMgZ8ILIIw2",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "7XrG-k9T12u84Pwp4YwaY",
+      "sourceHandle": "y2",
+      "target": "aKEH4ZxI6J1nwjp_AgH5r",
+      "targetHandle": "z2",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-7XrG-k9T12u84Pwp4YwaYy2-aKEH4ZxI6J1nwjp_AgH5rz2",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "8bOWuopxHtBWUSFaVT54P",
+      "sourceHandle": "x2",
+      "target": "vHQdMgaL2EEr2o_eJmOuV",
+      "targetHandle": "w2",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-8bOWuopxHtBWUSFaVT54Px2-vHQdMgaL2EEr2o_eJmOuVw2",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "z-1Ye5hcNdr9r6Gwdw7mv",
+      "sourceHandle": "x2",
+      "target": "-lsYPD6JueIV94RybGH_Y",
+      "targetHandle": "w1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-z-1Ye5hcNdr9r6Gwdw7mvx2--lsYPD6JueIV94RybGH_Yw1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "z-1Ye5hcNdr9r6Gwdw7mv",
+      "sourceHandle": "y2",
+      "target": "vu8yJsS1WccsdcEVUqwNd",
+      "targetHandle": "z2",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-z-1Ye5hcNdr9r6Gwdw7mvy2-vu8yJsS1WccsdcEVUqwNdz2",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "vu8yJsS1WccsdcEVUqwNd",
+      "sourceHandle": "y2",
+      "target": "qkFRW_tJB8_1IYpYskQ5M",
+      "targetHandle": "z2",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-vu8yJsS1WccsdcEVUqwNdy2-qkFRW_tJB8_1IYpYskQ5Mz2",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "qkFRW_tJB8_1IYpYskQ5M",
+      "sourceHandle": "x2",
+      "target": "76xovsBrKOnlRBVjsqNq1",
+      "targetHandle": "w1",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-qkFRW_tJB8_1IYpYskQ5Mx2-76xovsBrKOnlRBVjsqNq1w1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "76xovsBrKOnlRBVjsqNq1",
+      "sourceHandle": "y2",
+      "target": "8IF7jftushwZrn7JXpC_v",
+      "targetHandle": "z1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-76xovsBrKOnlRBVjsqNq1y2-8IF7jftushwZrn7JXpC_vz1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "76xovsBrKOnlRBVjsqNq1",
+      "sourceHandle": "y2",
+      "target": "uNinrB9wm5ahjGXu5fc0g",
+      "targetHandle": "z1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-76xovsBrKOnlRBVjsqNq1y2-uNinrB9wm5ahjGXu5fc0gz1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "76xovsBrKOnlRBVjsqNq1",
+      "sourceHandle": "y2",
+      "target": "KWix4jeNUKJ07Iu95Mqj_",
+      "targetHandle": "z1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-76xovsBrKOnlRBVjsqNq1y2-KWix4jeNUKJ07Iu95Mqj_z1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "76xovsBrKOnlRBVjsqNq1",
+      "sourceHandle": "y2",
+      "target": "JP5U6c2fZjtkU-Xzwtapx",
+      "targetHandle": "z1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-76xovsBrKOnlRBVjsqNq1y2-JP5U6c2fZjtkU-Xzwtapxz1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "76xovsBrKOnlRBVjsqNq1",
+      "sourceHandle": "y2",
+      "target": "ui3pUfsGMxv4WRzHkgbF0",
+      "targetHandle": "z1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-76xovsBrKOnlRBVjsqNq1y2-ui3pUfsGMxv4WRzHkgbF0z1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "76xovsBrKOnlRBVjsqNq1",
+      "sourceHandle": "y2",
+      "target": "INiqdtppBmCthOEXuHb-V",
+      "targetHandle": "z1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-76xovsBrKOnlRBVjsqNq1y2-INiqdtppBmCthOEXuHb-Vz1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "76xovsBrKOnlRBVjsqNq1",
+      "sourceHandle": "y2",
+      "target": "sXBxaQtwJ-luGVXdqVXk1",
+      "targetHandle": "z1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-76xovsBrKOnlRBVjsqNq1y2-sXBxaQtwJ-luGVXdqVXk1z1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "76xovsBrKOnlRBVjsqNq1",
+      "sourceHandle": "y2",
+      "target": "So-cKAVfbgsw2zzFREu7Q",
+      "targetHandle": "z1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-76xovsBrKOnlRBVjsqNq1y2-So-cKAVfbgsw2zzFREu7Qz1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "76xovsBrKOnlRBVjsqNq1",
+      "sourceHandle": "x2",
+      "target": "wvurOKbemF4Tt2WZcmqDL",
+      "targetHandle": "w1",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-76xovsBrKOnlRBVjsqNq1x2-wvurOKbemF4Tt2WZcmqDLw1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "wvurOKbemF4Tt2WZcmqDL",
+      "sourceHandle": "x2",
+      "target": "SaHqm7T4FFVrsgyfImo66",
+      "targetHandle": "w2",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-wvurOKbemF4Tt2WZcmqDLx2-SaHqm7T4FFVrsgyfImo66w2",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "wvurOKbemF4Tt2WZcmqDL",
+      "sourceHandle": "z2",
+      "target": "gsCRhwwjXuyueaYHSPOVZ",
+      "targetHandle": "y2",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-wvurOKbemF4Tt2WZcmqDLz2-gsCRhwwjXuyueaYHSPOVZy2",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "gsCRhwwjXuyueaYHSPOVZ",
+      "sourceHandle": "x2",
+      "target": "n0vIbHmUZHrF4WjEhYdb8",
+      "targetHandle": "w1",
+      "data": {
+        "edgeStyle": "dashed"
+      },
+      "id": "reactflow__edge-gsCRhwwjXuyueaYHSPOVZx2-n0vIbHmUZHrF4WjEhYdb8w1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "vHQdMgaL2EEr2o_eJmOuV",
+      "sourceHandle": "x2",
+      "target": "8WZpSKBHCeYfTEL9tBNKr",
+      "targetHandle": "w1",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-vHQdMgaL2EEr2o_eJmOuVx2-8WZpSKBHCeYfTEL9tBNKrw1",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "8WZpSKBHCeYfTEL9tBNKr",
+      "sourceHandle": "x2",
+      "target": "z-1Ye5hcNdr9r6Gwdw7mv",
+      "targetHandle": "w2",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-8WZpSKBHCeYfTEL9tBNKrx2-z-1Ye5hcNdr9r6Gwdw7mvw2",
+      "selected": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "KMA7NkxFbPoUDtFnGBFnj",
+      "sourceHandle": "x2",
+      "target": "0vLaVNJaJSHZ_bHli6Qzs",
+      "targetHandle": "w1",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-KMA7NkxFbPoUDtFnGBFnjx2-0vLaVNJaJSHZ_bHli6Qzsw1",
+      "selected": false,
+      "type": "simplebezier",
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "DYkdM_L7T2GcTPAoZNnUR",
+      "sourceHandle": "x2",
+      "target": "0vLaVNJaJSHZ_bHli6Qzs",
+      "targetHandle": "z1",
+      "data": {
+        "edgeStyle": "solid"
+      },
+      "id": "reactflow__edge-DYkdM_L7T2GcTPAoZNnURx2-0vLaVNJaJSHZ_bHli6Qzsz1",
+      "selected": false,
+      "type": "smoothstep",
+      "selectable": true,
+      "focusable": true
+    }
+  ]
+}
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/cloudflare.md b/src/data/roadmaps/cloudflare/cloudflare.md
new file mode 100644
index 000000000..29106d355
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/cloudflare.md
@@ -0,0 +1,62 @@
+---
+jsonUrl: '/jsons/roadmaps/cloudflare.json'
+pdfUrl: '/pdfs/roadmaps/cloudflare.pdf'
+order: 21
+briefTitle: 'Cloudflare'
+briefDescription: 'Learn to deploy your applications on Cloudflare'
+title: 'Cloudflare'
+description: 'Learn to deploy your applications on Cloudflare'
+isNew: true
+hasTopics: true
+renderer: editor
+dimensions:
+  width: 968
+  height: 2700
+schema:
+  headline: 'Cloudflare Roadmap'
+  description: 'Learn how to use Cloudflare with this interactive step by step guide in 2025. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place.'
+  imageUrl: 'https://roadmap.sh/roadmaps/cloudflare.png'
+  datePublished: '2025-02-12'
+  dateModified: '2025-02-12'
+seo:
+  title: 'Cloudflare Roadmap - roadmap.sh'
+  description: 'Step by step guide to learn Cloudflare in 2025. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place.'
+  keywords:
+    - 'cloudflare tutorial'
+    - 'step by step guide for cloudflare'
+    - 'how to learn cloudflare'
+    - 'use cloudflare in production'
+    - 'cloudflare roadmap 2024'
+    - 'guide to learning cloudflare'
+    - 'cloudflare for beginners'
+    - 'cloudflare roadmap'
+    - 'cloudflare learning path'
+    - 'cloudflare learning roadmap'
+    - 'cloudflare'
+    - 'cloudflare learning guide'
+    - 'cloudflare skills'
+    - 'cloudflare for development'
+    - 'cloudflare for development skills'
+    - 'cloudflare for development skills test'
+    - 'cloudflare quiz'
+    - 'cloudflare career path'
+    - 'cloudflare interview questions'
+    - 'learn cloudflare for development'
+    - 'become a cloudflare expert'
+    - 'what is cloudflare'
+relatedRoadmaps:
+  - 'devops'
+  - 'backend'
+  - 'full-stack'
+  - 'javascript'
+  - 'nodejs'
+  - 'aws'
+  - 'linux'
+sitemap:
+  priority: 1
+  changefreq: 'monthly'
+tags:
+  - 'roadmap'
+  - 'main-sitemap'
+  - 'skill-roadmap'
+---
diff --git a/src/data/roadmaps/cloudflare/content/ai-gateway@vu8yJsS1WccsdcEVUqwNd.md b/src/data/roadmaps/cloudflare/content/ai-gateway@vu8yJsS1WccsdcEVUqwNd.md
new file mode 100644
index 000000000..7206aa699
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/ai-gateway@vu8yJsS1WccsdcEVUqwNd.md
@@ -0,0 +1,8 @@
+# AI Gateway
+
+Cloudflare's AI Gateway acts as a central point for managing and optimizing your AI workloads. It provides features like caching, rate limiting, and observability for AI requests, helping you improve performance, reduce costs, and gain insights into how your AI models are being used.
+
+Visit the following resources to learn more:
+
+- [@official@Cloudflare + AI](https://ai.cloudflare.com/)
+- [@official@Cloudflare AI Gateway](https://www.cloudflare.com/developer-platform/products/ai-gateway/)
diff --git a/src/data/roadmaps/cloudflare/content/ai-model-integration@QxPoNHsL-Pj_z3aU6qEP4.md b/src/data/roadmaps/cloudflare/content/ai-model-integration@QxPoNHsL-Pj_z3aU6qEP4.md
new file mode 100644
index 000000000..e166b2aa1
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/ai-model-integration@QxPoNHsL-Pj_z3aU6qEP4.md
@@ -0,0 +1,8 @@
+# AI Model Integration
+
+Workers AI provides the ability to run AI models directly on Cloudflare's edge network for recognition tasks. This includes image recognition (identifying objects or scenes in images) and natural language understanding (analyzing text for sentiment, intent, or entities). By performing AI model recognition at the edge, you can reduce latency and improve the responsiveness of AI-powered applications.
+
+Visit the following resources to learn more:
+
+- [@official@Cloudflare + AI](https://ai.cloudflare.com/)
+- [@official@Cloudflare AI Model Integration](https://developers.cloudflare.com/ai-gateway/integrations/)
diff --git a/src/data/roadmaps/cloudflare/content/ai-powered-search@Ep9_oV_YnkbH1gHM-n3gO.md b/src/data/roadmaps/cloudflare/content/ai-powered-search@Ep9_oV_YnkbH1gHM-n3gO.md
new file mode 100644
index 000000000..1b753199e
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/ai-powered-search@Ep9_oV_YnkbH1gHM-n3gO.md
@@ -0,0 +1,14 @@
+# AI-powered Search
+
+You can build AI-powered search using Cloudflare Workers, Workers AI, and Vectorize.
+
+1. **Embed Data:** Use Workers AI to create vector embeddings of your data (e.g., text, images).
+2. **Store Embeddings:** Store these embeddings in Vectorize.
+3. **Search:** When a user searches, embed the search query using Workers AI and then use Vectorize to find the most similar embeddings in your database.
+4. **Return Results:** Return the corresponding data items as search results.
+
+Visit the following resources to learn more:
+
+- [@official@Cloudflare + AI](https://ai.cloudflare.com/)
+- [@official@Cloudflare Agents](https://developers.cloudflare.com/agents/)
+- [@article@How to use Cloudflare Workers AI for building an AI-powered Search](https://dev.to/charlestehio/how-to-use-cloudflare-workers-ai-for-building-an-ai-powered-search-bar-51jn)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/any-frontend-framework@zSwio18XdBfqwSneAx_AP.md b/src/data/roadmaps/cloudflare/content/any-frontend-framework@zSwio18XdBfqwSneAx_AP.md
new file mode 100644
index 000000000..57d048471
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/any-frontend-framework@zSwio18XdBfqwSneAx_AP.md
@@ -0,0 +1,20 @@
+# Any Frontend Framework
+
+Several frontend frameworks can be deployed on Cloudflare Pages or used with Cloudflare Workers. Popular choices include:
+
+- **React:** Deploy using Create React App or Next.js.
+- **Vue.js:** Deploy using Vue CLI or Nuxt.js.
+- **Angular:** Deploy using Angular CLI.
+- **Svelte:** Deploy using SvelteKit.
+- **Astro**: Deploy using Astro CLI.
+
+Cloudflare Pages offers optimized builds and deployments for these frameworks. For Workers, you can use these frameworks to render content dynamically at the edge.
+
+Visit the following resources to learn more:
+
+- [@official@React](https://react.dev/)
+- [@official@Vue.js](https://vuejs.org/)
+- [@official@Angular](https://angular.dev/)
+- [@official@Svelte](https://svelte.dev/)
+- [@official@Astro](https://astro.build/)
+- [@official@Framework Guide](https://developers.cloudflare.com/pages/framework-guides/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/asset-management@3jU5753Uza2aS-gZo7w4k.md b/src/data/roadmaps/cloudflare/content/asset-management@3jU5753Uza2aS-gZo7w4k.md
new file mode 100644
index 000000000..fd2f1e67a
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/asset-management@3jU5753Uza2aS-gZo7w4k.md
@@ -0,0 +1,8 @@
+# Asset Management
+
+Cloudflare R2 can be used for efficient asset management. You can store images, videos, and other static assets in R2 and serve them directly through Cloudflare's CDN. This reduces the load on your origin server and improves website performance. R2's integration with Cloudflare Workers allows you to perform on-the-fly image transformations or other asset processing tasks at the edge. Versioning support in R2 helps manage different versions of your assets.
+
+Visit the following resources to learn more:
+
+- [@official@Use R2 as Static Asset Storage with Cloudflare Pages](https://developers.cloudflare.com/pages/tutorials/use-r2-as-static-asset-storage-for-pages/)
+- [@official@Cloudflare R2 | Zero Egress Fee Object Storage](https://www.cloudflare.com/developer-platform/products/r2/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/background-jobs@qgvDGyLjc6lMmVPjHozFM.md b/src/data/roadmaps/cloudflare/content/background-jobs@qgvDGyLjc6lMmVPjHozFM.md
new file mode 100644
index 000000000..dda5e8116
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/background-jobs@qgvDGyLjc6lMmVPjHozFM.md
@@ -0,0 +1,8 @@
+# Background Jobs
+
+Cloudflare Queues are ideal for handling background jobs. Instead of performing time-consuming tasks directly within a request/response cycle, you can enqueue a message describing the task. A separate Worker, acting as a consumer, then processes these messages in the background. This improves the responsiveness of your application and allows you to handle tasks like image processing, sending emails, or data analysis without blocking user requests.
+
+Visit the following resources to learn more:
+
+- [@official@Cloudflare Queues](https://developers.cloudflare.com/queues/)
+- [@article@Dispatched | Background Jobs for Serverless Applications](https://dispatched.dev/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/basic-command-line-knowledge@q9oQTt_NqhdWvJfA5XH1V.md b/src/data/roadmaps/cloudflare/content/basic-command-line-knowledge@q9oQTt_NqhdWvJfA5XH1V.md
new file mode 100644
index 000000000..a3452d499
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/basic-command-line-knowledge@q9oQTt_NqhdWvJfA5XH1V.md
@@ -0,0 +1,9 @@
+# Basic Command-line Knowledge
+
+Knowing basic command-line commands is a must-have, not when working with Cloudflare but also as a developer. Learn the basics of navigating directories, file management, text editing, package management etc.
+
+Visit the following resources to learn more:
+
+- [@official@Cloudflare Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/)
+- [@article@Command-line Primer for Beginners](https://lifehacker.com/a-command-line-primer-for-beginners-5633909)
+- [@article@Command Line for Beginners](https://thelinuxcode.com/command-line-for-beginners-how-to-use-the-terminal-like-a-pro/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/bindings@9ef2VPCru8lCmRxxGe-Eo.md b/src/data/roadmaps/cloudflare/content/bindings@9ef2VPCru8lCmRxxGe-Eo.md
new file mode 100644
index 000000000..85a96ee8e
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/bindings@9ef2VPCru8lCmRxxGe-Eo.md
@@ -0,0 +1,17 @@
+# Bindings
+
+In Cloudflare Workers, Bindings are configurations that connect your Worker to external resources or services. These can include:
+
+- **KV Namespaces:** Binding to a KV namespace allows the Worker to read and write data.
+- **Durable Objects:** Bindings specify which Durable Object namespace the Worker can access.
+- **Service Bindings:** Connecting to other Workers or Cloudflare services like Queues.
+- **Secrets:** Storing sensitive data (API keys) securely.
+- **Environment Variables:** Configuring environment-specific settings.
+
+Bindings are defined in the `wrangler.toml` file and provide a secure and managed way for your Worker to interact with the outside world.
+
+Visit the following resources to learn more:
+
+- [@official@Bindings (env) · Cloudflare Workers](https://developers.cloudflare.com/workers/runtime-apis/bindings/)
+- [@official@Workers Bindings · Cloudflare Workers AI](https://developers.cloudflare.com/workers-ai/configuration/bindings/)
+- [@official@Configuration - Wrangler · Cloudflare Workers](https://developers.cloudflare.com/workers/wrangler/configuration/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/bot-management@So-cKAVfbgsw2zzFREu7Q.md b/src/data/roadmaps/cloudflare/content/bot-management@So-cKAVfbgsw2zzFREu7Q.md
new file mode 100644
index 000000000..4970fdf64
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/bot-management@So-cKAVfbgsw2zzFREu7Q.md
@@ -0,0 +1,8 @@
+# Bot Management
+
+Cloudflare Bot Management identifies and mitigates malicious bot traffic. It uses machine learning and behavioral analysis to distinguish between human and bot activity. Cloudflare can block, challenge, or allow bot traffic based on its behavior and characteristics. This helps prevent - Credential stuffing, Content scraping, Spam submissions, DDoS attacks. Effective bot management improves website performance, security, and resource utilization.
+
+Visit the following resources to learn more:
+
+- [@official@Cloudflare Bot Management & Protection](https://www.cloudflare.com/application-services/products/bot-management/)
+- [@official@What is Bot Management? | How Bot Managers work?](https://www.cloudflare.com/learning/bots/what-is-bot-management/)
diff --git a/src/data/roadmaps/cloudflare/content/browser-rendering@qkFRW_tJB8_1IYpYskQ5M.md b/src/data/roadmaps/cloudflare/content/browser-rendering@qkFRW_tJB8_1IYpYskQ5M.md
new file mode 100644
index 000000000..05a316376
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/browser-rendering@qkFRW_tJB8_1IYpYskQ5M.md
@@ -0,0 +1,8 @@
+# Browser Rendering
+
+Cloudflare Browser Rendering allows you to render web pages in a headless browser environment on Cloudflare's edge network. This is useful for tasks like generating PDFs, taking screenshots, or pre-rendering content for SEO purposes. By performing browser rendering at the edge, you can offload processing from your origin server and improve performance for certain types of web applications.
+
+Visit the following resources to learn more:
+
+- [@official@Browser Rendering](https://developers.cloudflare.com/browser-rendering/)
+- [@official@Browser Rendering API - Blog](https://blog.cloudflare.com/browser-rendering-api-ga-rolling-out-cloudflare-snippets-swr-and-bringing-workers-for-platforms-to-our-paygo-plans/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/bucket-lifecycle@YvgmmF9sWfURgijFV7E31.md b/src/data/roadmaps/cloudflare/content/bucket-lifecycle@YvgmmF9sWfURgijFV7E31.md
new file mode 100644
index 000000000..fddf0aeeb
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/bucket-lifecycle@YvgmmF9sWfURgijFV7E31.md
@@ -0,0 +1,8 @@
+# Bucket Lifecycle
+
+The lifecycle of an R2 bucket involves creation, usage (storing and retrieving objects), and eventual deletion. You create a bucket to house your data. Objects are then uploaded, accessed, and managed within the bucket. Cloudflare doesn't have built-in lifecycle rules like some other storage providers, so object expiration typically requires custom logic via Workers. Finally, when the bucket is no longer needed, and after ensuring it's empty, you can delete it.
+
+Visit the following resources to learn more:
+
+- [@official@Buckets · Cloudflare R2](https://developers.cloudflare.com/r2/buckets/)
+- [@official@Bucket Lifecycle · Cloudflare R2](https://developers.cloudflare.com/api/resources/r2/subresources/buckets/subresources/lifecycle/) 
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/bucket-operations@UNE6XK4su5r2jcxhY7hOG.md b/src/data/roadmaps/cloudflare/content/bucket-operations@UNE6XK4su5r2jcxhY7hOG.md
new file mode 100644
index 000000000..69b3b0f68
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/bucket-operations@UNE6XK4su5r2jcxhY7hOG.md
@@ -0,0 +1,15 @@
+# Bucket Operations
+
+In Cloudflare R2, buckets are containers for storing objects. You can perform various bucket operations, including:
+
+- **Creating Buckets:** Creating new buckets to organize your data.
+- **Listing Buckets:** Listing all the buckets in your account.
+- **Deleting Buckets:** Deleting buckets that are no longer needed (must be empty).
+- **Configuring Bucket Policies:** Setting access control policies for buckets.
+
+These operations are typically performed using the R2 API, the Cloudflare dashboard, or command-line tools like `wrangler`.
+
+Visit the following resources to learn more:
+
+- [@official@Buckets · Cloudflare R2](https://developers.cloudflare.com/r2/buckets/)
+- [@official@Create New Buckets · Cloudflare R2](https://developers.cloudflare.com/r2/buckets/create-buckets/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/bulk-operations@i64-aCpZHygq76fBU6eXD.md b/src/data/roadmaps/cloudflare/content/bulk-operations@i64-aCpZHygq76fBU6eXD.md
new file mode 100644
index 000000000..2022ad189
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/bulk-operations@i64-aCpZHygq76fBU6eXD.md
@@ -0,0 +1,8 @@
+# Bulk Operations
+
+Cloudflare Workers allow you to perform bulk operations on KV stores. You can use the `batch` method to perform multiple operations in a single request. This is useful for tasks like importing data from an external source or updating multiple records at once. Bulk operations are efficient and scalable, allowing you to handle large amounts of data with ease.
+
+Visit the following resources to learn more:
+
+- [@official@Workers KV](https://blog.cloudflare.com/workers-kv-is-ga/)
+- [@official@Workers KV Runtime API](https://developers.cloudflare.com/workers/runtime-apis/kv)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/cache-api@ui3pUfsGMxv4WRzHkgbF0.md b/src/data/roadmaps/cloudflare/content/cache-api@ui3pUfsGMxv4WRzHkgbF0.md
new file mode 100644
index 000000000..03b554c74
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/cache-api@ui3pUfsGMxv4WRzHkgbF0.md
@@ -0,0 +1,7 @@
+# Cache API
+
+Cloudflare's Cache API allows Workers to programmatically control caching behavior. You can store responses in Cloudflare's global cache and retrieve them later, reducing origin server load and improving performance. The Cache API offers fine-grained control over cache keys, expiration, and other parameters. This enables you to cache dynamic content, personalize responses, and optimize content delivery for specific users or devices. The Cache API is a powerful tool for building highly performant and scalable applications on Cloudflare.
+
+Visit the following resources to learn more:
+
+- [@official@Cloudflare API Cache · Cloudflare](https://developers.cloudflare.com/api-next/resources/cache//)
diff --git a/src/data/roadmaps/cloudflare/content/caching-patterns@OgW-iIrJZ5-sOWKnFpIZd.md b/src/data/roadmaps/cloudflare/content/caching-patterns@OgW-iIrJZ5-sOWKnFpIZd.md
new file mode 100644
index 000000000..6f1f10988
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/caching-patterns@OgW-iIrJZ5-sOWKnFpIZd.md
@@ -0,0 +1,15 @@
+# Caching Patterns
+
+Caching is a critical aspect of building performant and scalable applications. Cloudflare Workers provide several caching patterns that you can use to optimize your application's performance. These patterns include:
+
+- **Cache-First:** Serve from cache if available, otherwise fetch from origin.
+- **Network-First:** Always fetch from origin, caching the response for subsequent requests.
+- **Stale-While-Revalidate:** Serve from cache immediately, then update the cache in the background.
+
+You can also manipulate HTTP cache headers (Cache-Control, Expires) to control how Cloudflare's CDN caches content. Effective caching is crucial for improving performance and reducing origin server load.
+
+Visit the following resources to learn more:
+
+- [@official@How the Cache Works · Cloudflare Workers](https://developers.cloudflare.com/workers/reference/how-the-cache-works/)
+- [@article@Caching Strategies](https://docs.aws.amazon.com/whitepapers/latest/database-caching-strategies-using-redis/caching-patterns.html)
+- [@article@Caching Static and Dynamic Content](https://www.cloudflare.com/learning/cdn/caching-static-and-dynamic-content/)
diff --git a/src/data/roadmaps/cloudflare/content/caching-strategies@uBjcQ9PJUfwzu5N_2CNjN.md b/src/data/roadmaps/cloudflare/content/caching-strategies@uBjcQ9PJUfwzu5N_2CNjN.md
new file mode 100644
index 000000000..bf41dc5c2
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/caching-strategies@uBjcQ9PJUfwzu5N_2CNjN.md
@@ -0,0 +1,14 @@
+# Caching Strategies
+
+Cloudflare Workers allow fine-grained control over caching. You can use the Cache API to store and retrieve responses directly within your Worker, bypassing the origin server. Strategies include:
+
+- **Cache-First:** Serve from cache if available, otherwise fetch from origin.
+- **Network-First:** Always fetch from origin, caching the response for subsequent requests.
+- **Stale-While-Revalidate:** Serve from cache immediately, then update the cache in the background.
+
+You can also manipulate HTTP cache headers (Cache-Control, Expires) to control how Cloudflare's CDN caches content. Effective caching is critical for improving performance and reducing origin server load.
+
+Visit the following resources to learn more:
+
+- [@official@Cache · Cloudflare Workers](https://developers.cloudflare.com/workers/runtime-apis/cache/)
+- [@official@How the Cache Works · Cloudflare Workers ](https://developers.cloudflare.com/workers/reference/how-the-cache-works/)
diff --git a/src/data/roadmaps/cloudflare/content/calls@vHQdMgaL2EEr2o_eJmOuV.md b/src/data/roadmaps/cloudflare/content/calls@vHQdMgaL2EEr2o_eJmOuV.md
new file mode 100644
index 000000000..5a75b291a
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/calls@vHQdMgaL2EEr2o_eJmOuV.md
@@ -0,0 +1,8 @@
+# Calls
+
+Cloudflare Calls is a platform for building real-time audio and video applications directly on Cloudflare's edge network. It provides the infrastructure and APIs you need to create interactive experiences like video conferencing, live streaming, and voice chat, with low latency and global reach.
+
+Visit the following resources to learn more:
+
+- [@official@Cloudflare Calls](https://developers.cloudflare.com/calls/)
+- [@official@Introduction · Cloudflare Calls](https://developers.cloudflare.com/calls/introduction/)
diff --git a/src/data/roadmaps/cloudflare/content/cicd-pipelines@8Y6TIYoWIXrxtmzDVdS0b.md b/src/data/roadmaps/cloudflare/content/cicd-pipelines@8Y6TIYoWIXrxtmzDVdS0b.md
new file mode 100644
index 000000000..f0fdd5f1a
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/cicd-pipelines@8Y6TIYoWIXrxtmzDVdS0b.md
@@ -0,0 +1,10 @@
+# CI/CD Pipelines
+
+CI/CD (Continuous Integration/Continuous Deployment) pipelines automate the process of building, testing, and deploying Cloudflare Workers. Common CI/CD platforms like GitHub Actions, GitLab CI, and CircleCI can be used to create pipelines that automatically deploy Workers whenever code changes are pushed to a repository. These pipelines typically involve steps like linting, testing, building, and deploying using `wrangler`. Automating deployments ensures faster releases and reduces the risk of errors.
+
+Visit the following resources to learn more:
+
+- [@official@Automate your workflow - Github Actions](https://github.com/features/actions)
+- [@official@CI/CD Pipelines - Gitlab](https://docs.gitlab.com/ee/ci/pipelines/)
+- [@official@Continuous Integration and Delivery - CircleCI](https://circleci.com/)
+- [@official@Simple, Flexible, Trustworthy CI/CD Tools - Travis CI](https://www.travis-ci.com/)
diff --git a/src/data/roadmaps/cloudflare/content/coordination@RYm0oBFCxm-S-aCwZ21p6.md b/src/data/roadmaps/cloudflare/content/coordination@RYm0oBFCxm-S-aCwZ21p6.md
new file mode 100644
index 000000000..7a0533788
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/coordination@RYm0oBFCxm-S-aCwZ21p6.md
@@ -0,0 +1,8 @@
+# Coordination
+
+Durable Objects facilitate coordination between different clients or Workers. Because each object has a single, consistent view of its state, it can act as a central point for coordinating actions. Multiple clients can interact with the same Durable Object, and the object can ensure that actions are performed in a consistent and predictable order. This is useful for building collaborative applications where multiple users need to work on the same data.
+
+Visit the following resources to learn more:
+
+- [@official@Durable Objects](https://www.cloudflare.com/developer-platform/products/durable-objects/)
+- [@article@Durable Objects (DO)](https://www.lambrospetrou.com/articles/durable-objects-cloudflare/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/d1@mKN0Ta3zSk7PCm_uHYKFN.md b/src/data/roadmaps/cloudflare/content/d1@mKN0Ta3zSk7PCm_uHYKFN.md
new file mode 100644
index 000000000..84b3a9eae
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/d1@mKN0Ta3zSk7PCm_uHYKFN.md
@@ -0,0 +1,8 @@
+# D1
+
+Cloudflare D1 is a serverless SQL database designed to run on Cloudflare's edge network. It allows you to store and query data closer to your users, reducing latency and improving application performance. D1 is based on SQLite and is accessible directly from Cloudflare Workers, making it easy to build dynamic and data-driven applications without managing a traditional database server.
+
+Visit the following resources to learn more:
+
+- [@official@Cloudflare D1 Documentation](https://developers.cloudflare.com/d1/)
+- [@official@Getting Started with D1](https://developers.cloudflare.com/d1/get-started/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/dead-letter-queues@Grl59SjY31Q3sgf9uX-xf.md b/src/data/roadmaps/cloudflare/content/dead-letter-queues@Grl59SjY31Q3sgf9uX-xf.md
new file mode 100644
index 000000000..6c49bf979
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/dead-letter-queues@Grl59SjY31Q3sgf9uX-xf.md
@@ -0,0 +1,8 @@
+# Dead Letter Queues
+
+Dead Letter Queues (DLQs) are an important part of a robust message queuing system. In Cloudflare Queues, a DLQ is a separate queue where messages that cannot be processed successfully after multiple retries are sent. This allows you to isolate problematic messages and prevent them from causing continuous failures. You can then investigate the messages in the DLQ to identify and fix the underlying issues.
+
+Visit the following resources to learn more:
+
+- [@article@What is DLQ? - Dead-Letter Queue Explained - AWS](https://aws.amazon.com/what-is/dead-letter-queue/)
+- [@article@Dead Letter Queue](https://en.wikipedia.org/wiki/Dead_letter_queue)
diff --git a/src/data/roadmaps/cloudflare/content/debugging-techniques@TmQC7fTL6b9EsBDYibv4g.md b/src/data/roadmaps/cloudflare/content/debugging-techniques@TmQC7fTL6b9EsBDYibv4g.md
new file mode 100644
index 000000000..378821231
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/debugging-techniques@TmQC7fTL6b9EsBDYibv4g.md
@@ -0,0 +1,17 @@
+# Debugging Techniques
+
+Debugging Cloudflare Workers involves several techniques:
+
+- **Console Logging:** Using `console.log()` to output variables and track code execution.
+- **`wrangler tail`:** Viewing real-time logs from your Worker in the command line.
+- **Source Maps:** Mapping compiled code back to the original source for easier debugging.
+- **Try-Catch Blocks:** Handling errors gracefully and logging relevant information.
+- **Local Testing:** Using `wrangler dev` to test Workers locally before deployment.
+
+These techniques help identify and resolve issues in your Workers effectively.
+
+Visit the following resources to learn more:
+
+- [@official@Chrome DevTools](https://developer.chrome.com/docs/devtools)
+- [@official@Debugging Cloudflare Workers](https://developers.cloudflare.com/workers/playground/#devtools)
+- [@article@Debugging Cloudflare Workers](https://blog.cloudflare.com/debugging-cloudflare-workers/)
diff --git a/src/data/roadmaps/cloudflare/content/development-tools@gsCRhwwjXuyueaYHSPOVZ.md b/src/data/roadmaps/cloudflare/content/development-tools@gsCRhwwjXuyueaYHSPOVZ.md
new file mode 100644
index 000000000..0ef3f2188
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/development-tools@gsCRhwwjXuyueaYHSPOVZ.md
@@ -0,0 +1,7 @@
+# Development Tools
+
+- **Wrangler:** The command-line interface (CLI) is your primary tool for interacting with Cloudflare Workers. It handles project creation, local testing, deployment, secret management, and more. Wrangler simplifies the entire development lifecycle.
+- **Miniflare:** This local simulator replicates the Cloudflare Workers environment on your machine. It supports features like KV storage, Durable Objects, and the Cache API, enabling offline development and testing.
+- **Cloudflare Dashboard:** The web interface provides a visual way to manage your Cloudflare account, configure settings, monitor performance, and view analytics. It's useful for managing DNS, security rules, and other global settings.
+- **Workers Playground:** A browser-based environment for experimenting with Workers code. It's ideal for quick prototyping and testing small code snippets without setting up a local development environment.
+- **VS Code Extension:** This extension integrates with Visual Studio Code, providing features like syntax highlighting, code completion, and debugging support for Cloudflare Workers. It enhances the development experience within your preferred IDE.
diff --git a/src/data/roadmaps/cloudflare/content/devtools-integration@uoaOrypiMkyoikXvTHeVS.md b/src/data/roadmaps/cloudflare/content/devtools-integration@uoaOrypiMkyoikXvTHeVS.md
new file mode 100644
index 000000000..38b656776
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/devtools-integration@uoaOrypiMkyoikXvTHeVS.md
@@ -0,0 +1,8 @@
+# DevTools Integration
+
+Cloudflare Workers can be debugged using standard browser DevTools. When running Workers in a local environment (e.g., with Miniflare), you can use Chrome DevTools or similar tools to inspect code, set breakpoints, and step through execution. You can also use `console.log` statements to output information to the DevTools console. This integration makes debugging Workers more intuitive and efficient.
+
+Visit the following resources to learn more:
+
+- [@official@Debugging Cloudflare Workers](https://developers.cloudflare.com/workers/playground/#devtools)
+- [@official@Chrome DevTools](https://developer.chrome.com/docs/devtools)
diff --git a/src/data/roadmaps/cloudflare/content/devtools@G6YQZUQh_x8Qxm1oBseLQ.md b/src/data/roadmaps/cloudflare/content/devtools@G6YQZUQh_x8Qxm1oBseLQ.md
new file mode 100644
index 000000000..9a40465c0
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/devtools@G6YQZUQh_x8Qxm1oBseLQ.md
@@ -0,0 +1,9 @@
+# DevTools
+
+While you can't directly use traditional browser DevTools with Cloudflare Workers running on the edge, you can leverage similar debugging principles. Cloudflare offers tools like `wrangler tail` for real-time logging and the ability to inspect request/response headers. Using `console.log` strategically within your Worker code and analyzing the output via `wrangler tail` is the primary way to inspect variables and execution flow, emulating some DevTools functionality.
+
+Visit the following resources to learn more:
+
+- [@official@Chrome DevTools](https://developer.chrome.com/docs/devtools)
+- [@official@Overview | Chrome DevTools | Chrome for Developers](https://developer.chrome.com/docs/devtools/overview/)
+- [@official@Debugging Cloudflare Workers](https://developers.cloudflare.com/workers/playground/#devtools)
diff --git a/src/data/roadmaps/cloudflare/content/drizzle@MpWO1sroeF106SEMU1V1a.md b/src/data/roadmaps/cloudflare/content/drizzle@MpWO1sroeF106SEMU1V1a.md
new file mode 100644
index 000000000..8867eac51
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/drizzle@MpWO1sroeF106SEMU1V1a.md
@@ -0,0 +1,8 @@
+# Drizzle
+
+Drizzle ORM is a TypeScript ORM (Object-Relational Mapper) that can be used with Cloudflare D1 to provide a type-safe and more developer-friendly way to interact with your database. It allows you to define your database schema using TypeScript code and provides a query builder that helps you construct SQL queries in a type-safe manner. Drizzle can simplify database interactions, improve code maintainability, and reduce the risk of SQL injection vulnerabilities. It also supports migrations, making it easier to manage schema changes over time.
+
+Visit the following resources to learn more:
+
+- [@official@Drizzle](https://orm.drizzle.team/)
+- [@official@Drizzle Overview](https://orm.drizzle.team/docs/overview)
diff --git a/src/data/roadmaps/cloudflare/content/durable-objects@G-xBbtaniYFRE9Dgs18px.md b/src/data/roadmaps/cloudflare/content/durable-objects@G-xBbtaniYFRE9Dgs18px.md
new file mode 100644
index 000000000..8a6ba8f6e
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/durable-objects@G-xBbtaniYFRE9Dgs18px.md
@@ -0,0 +1,7 @@
+# Durable Objects
+
+Cloudflare Durable Objects provide a strongly consistent, single-actor execution environment on Cloudflare's edge network. Unlike Workers, which are stateless, Durable Objects maintain state, enabling you to build applications that require coordination and data consistency across multiple requests and users. They are ideal for building collaborative applications, real-time games, and other stateful services.
+
+Visit the following resources to learn more:
+
+- [@official@Cloudflare Durable Objects - Cloudflare Docs](https://developers.cloudflare.com/durable-objects/)
diff --git a/src/data/roadmaps/cloudflare/content/edge-computing-fundamentals@aGWLomYHGkIfn7GFc0_Yl.md b/src/data/roadmaps/cloudflare/content/edge-computing-fundamentals@aGWLomYHGkIfn7GFc0_Yl.md
new file mode 100644
index 000000000..60aeec7e2
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/edge-computing-fundamentals@aGWLomYHGkIfn7GFc0_Yl.md
@@ -0,0 +1,9 @@
+# Edge Computing Fundamentals
+
+Edge computing brings computation closer to the user, minimizing latency. Cloudflare Workers embodies this: your code runs on Cloudflare's global network of servers, near your users. This reduces network hops and improves response times. By executing logic at the edge, you can personalize content, filter requests, and optimize delivery without needing to route traffic back to a central server. Edge computing with Workers enables faster, more responsive applications and enhanced user experiences.
+
+Visit the following resources to learn more:
+
+- [@official@What is Edge Computing - Cloudflare Docs](https://www.cloudflare.com/learning/serverless/glossary/what-is-edge-computing/)
+- [@article@What is Edge Computing? Is It More Than a Buzzword?](https://www.howtogeek.com/devops/what-is-edge-computing-is-it-more-than-a-buzzword/)
+- [@course@What Is Edge Computing? - Coursera](https://www.udemy.com/course/edge-computing/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/edge-ssltls@sXBxaQtwJ-luGVXdqVXk1.md b/src/data/roadmaps/cloudflare/content/edge-ssltls@sXBxaQtwJ-luGVXdqVXk1.md
new file mode 100644
index 000000000..74a36715c
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/edge-ssltls@sXBxaQtwJ-luGVXdqVXk1.md
@@ -0,0 +1,14 @@
+# Edge SSL/TLS
+
+Cloudflare's Edge SSL/TLS terminates SSL/TLS connections at Cloudflare's edge network, close to the user. This reduces latency and improves performance compared to terminating connections at the origin server. Cloudflare offers various SSL/TLS options, including:
+
+- **Universal SSL:** Free SSL certificates for all Cloudflare users.
+- **Dedicated SSL:** Custom SSL certificates for specific domains.
+- **Origin CA:** Free certificates for securing communication between Cloudflare and your origin.
+
+Edge SSL/TLS ensures secure communication between users and your website while optimizing performance.
+
+Visit the following resources to learn more:
+
+- [@official@Get Started with SSL/TLS - Cloudflare Docs](https://developers.cloudflare.com/ssl/get-started/)
+- [@official@Edge Certificates · Cloudflare SSL/TLS](https://developers.cloudflare.com/ssl/edge-certificates/)
diff --git a/src/data/roadmaps/cloudflare/content/email-workers@z-1Ye5hcNdr9r6Gwdw7mv.md b/src/data/roadmaps/cloudflare/content/email-workers@z-1Ye5hcNdr9r6Gwdw7mv.md
new file mode 100644
index 000000000..04ed65d7c
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/email-workers@z-1Ye5hcNdr9r6Gwdw7mv.md
@@ -0,0 +1,9 @@
+# Email Workers
+
+Email Workers allow you to intercept and modify email traffic passing through Cloudflare's email routing service. You can use Email Workers to perform tasks like spam filtering, email authentication, and custom email processing logic, giving you greater control over your email flow.
+
+Visit the following resources to learn more:
+
+- [@official@Email Workers · Cloudflare Email Routing](https://developers.cloudflare.com/email-routing/email-workers/)
+- [@official@Route to Workers, Automate Your Email Processing](https://blog.cloudflare.com/announcing-route-to-workers/)
+- [@article@Implementing an Email Delivery Service with Cloudflare Workers](https://medium.com/@georgechmr/implementing-an-email-delivery-service-with-cloudflare-workers-c141422109d0)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/event-driven-architectures@Z9Yywlf7rXFBtxTq5B2Y5.md b/src/data/roadmaps/cloudflare/content/event-driven-architectures@Z9Yywlf7rXFBtxTq5B2Y5.md
new file mode 100644
index 000000000..79ba8cefb
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/event-driven-architectures@Z9Yywlf7rXFBtxTq5B2Y5.md
@@ -0,0 +1,13 @@
+# Event-driven Architectures
+
+Cloudflare Workers are well-suited for event-driven architectures. You can trigger Workers based on various events, such as:
+
+- Incoming HTTP requests
+- Scheduled tasks (using Cron Triggers)
+- Webhooks from external services
+
+This allows you to build reactive systems that respond to events in real-time. Workers can process events and trigger other actions, creating a chain reaction that automates complex tasks.
+
+Visit the following resources to learn more:
+
+- [@article@What Is Event-Driven Architecture? - IBM](https://www.ibm.com/think/topics/event-driven-architecture)
diff --git a/src/data/roadmaps/cloudflare/content/external-api-integration@4g5w6IAdzefdlRTxbRbdS.md b/src/data/roadmaps/cloudflare/content/external-api-integration@4g5w6IAdzefdlRTxbRbdS.md
new file mode 100644
index 000000000..24431a6ef
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/external-api-integration@4g5w6IAdzefdlRTxbRbdS.md
@@ -0,0 +1,14 @@
+# External API Integration
+
+Cloudflare Workers can integrate with external APIs to enrich functionality. You can use fetch() within a Worker to make requests to third-party services. This enables you to:
+
+- Retrieve data from external sources.
+- Send data to external systems.
+- Authenticate with external services using API keys or tokens.
+
+Integrating with external APIs allows you to build powerful applications that leverage the capabilities of other platforms.
+
+Visit the following resources to learn more:
+
+- [@official@APIs · Cloudflare Workers](https://developers.cloudflare.com/workers/configuration/integrations/apis/)
+- [@official@External Services · Cloudflare Workers](https://developers.cloudflare.com/workers/configuration/integrations/external-services/)
diff --git a/src/data/roadmaps/cloudflare/content/fetch-api-and-runtime-apis@_2UnRlbUplHvs5-Stj4O4.md b/src/data/roadmaps/cloudflare/content/fetch-api-and-runtime-apis@_2UnRlbUplHvs5-Stj4O4.md
new file mode 100644
index 000000000..ae542e857
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/fetch-api-and-runtime-apis@_2UnRlbUplHvs5-Stj4O4.md
@@ -0,0 +1,8 @@
+# Fetch API and Runtime APIs
+
+Within Cloudflare Workers, the Fetch API is your primary tool for making HTTP requests to external services or your origin server. It's similar to the Fetch API in browsers but adapted for the Workers environment. Runtime APIs provide access to Cloudflare-specific features like KV storage (for persistent data), Durable Objects (for stateful applications), and other services. These APIs allow Workers to interact with Cloudflare's infrastructure and build powerful applications that go beyond simple request/response handling.
+
+Visit the following resources to learn more:
+
+- [@official@Fetch API in Workers](https://developers.cloudflare.com/workers/runtime-apis/fetch)
+- [@article@Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)
diff --git a/src/data/roadmaps/cloudflare/content/filtering@kdIfqTCcOSvV4KDpjr7nu.md b/src/data/roadmaps/cloudflare/content/filtering@kdIfqTCcOSvV4KDpjr7nu.md
new file mode 100644
index 000000000..f803015db
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/filtering@kdIfqTCcOSvV4KDpjr7nu.md
@@ -0,0 +1,15 @@
+# Filtering
+
+In Cloudflare Email Workers, filtering is the process of selectively acting on emails based on specific criteria. It allows you to define rules that determine which emails your worker will process and how. Filtering can be based on various email attributes, including:
+
+- **Sender/Recipient:** Matching specific email addresses or domains.
+- **Subject Line:** Looking for keywords or patterns in the subject.
+- **Headers:** Examining specific header values.
+- **Content:** Analyzing the email body for certain keywords.
+
+By implementing filtering, you can ensure that your worker only processes relevant emails, optimizing performance and preventing unintended actions on unrelated messages.
+
+Visit the following resources to learn more:
+
+- [@official@Email Workers · Cloudflare Email Routing](https://developers.cloudflare.com/email-routing/email-workers/)
+- [@article@Implementing an Email Delivery Service with Cloudflare Workers](https://medium.com/@georgechmr/implementing-an-email-delivery-service-with-cloudflare-workers-c141422109d0)
diff --git a/src/data/roadmaps/cloudflare/content/git-basics@C08pIguX1N45Iw0kh0Fvu.md b/src/data/roadmaps/cloudflare/content/git-basics@C08pIguX1N45Iw0kh0Fvu.md
new file mode 100644
index 000000000..96baeef15
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/git-basics@C08pIguX1N45Iw0kh0Fvu.md
@@ -0,0 +1,10 @@
+# Git Basics
+
+Git is a distributed version control system designed to handle projects of any size with speed and efficiency. Created by Linus Torvalds in 2005, it tracks changes in source code during software development, allowing multiple developers to work together on non-linear development. Git maintains a complete history of all changes, enabling easy rollbacks and comparisons between versions. Its distributed nature means each developer has a full copy of the repository, allowing for offline work and backup. Git’s key features include branching and merging capabilities, staging area for commits, and support for collaborative workflows like pull requests. Its speed, flexibility, and robust branching and merging capabilities have made it the most widely used version control system in software development, particularly for open-source projects and team collaborations.
+
+Visit the following resources to learn more:
+
+- [@roadmap@Visit Dedicated Git & GitHub Roadmap](https://roadmap.sh/git-github)
+- [@official@Git Integration - Cloudflare Pages](https://developers.cloudflare.com/pages/configuration/git-integration/)
+- [@official@Git Documentation](https://git-scm.com/doc)
+- [@article@Git Cheat Sheet](https://cs.fyi/guide/git-cheatsheet)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/hono@-8MsWNvuqwQCbLpOx_kov.md b/src/data/roadmaps/cloudflare/content/hono@-8MsWNvuqwQCbLpOx_kov.md
new file mode 100644
index 000000000..0534eaad3
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/hono@-8MsWNvuqwQCbLpOx_kov.md
@@ -0,0 +1,13 @@
+# Hono
+
+Hono is a small, simple and ultra-fast web framework built on web standards. It works on any JavaScript runtime: Cloudflare Workers, Fastly Compute, Deno, Bun, Vercel, Netlify, AWS Lambda, Lambda@Edge, and Node.js. Hono is more known for supporting a lot more than the basics.
+
+Hono is a simple web application framework similar to the well known javascript framework Express, without a frontend. But it runs on CDN Edges and allows you to construct larger applications when combined with middleware. 
+
+Visit the following resources to learn more:
+
+- [@official@Hono Documentation](https://hono.dev/docs/)
+- [@article@Hono.js: A Small Framework with Big Potential](https://medium.com/@appvintechnologies/hono-js-a-small-framework-with-big-potential-15a093fc5c07)
+- [@opensource@Hono JS Examples](https://github.com/honojs/examples)
+- [@article@Quick Start with Hono: Simple Setup Guide](https://dev.to/koshirok096/quick-start-with-hono-simple-setup-guide-bite-sized-article-lhe)
+- [@video@Hono JS Tutorial](https://www.youtube.com/watch?v=gY-TK33G6kQ)
diff --git a/src/data/roadmaps/cloudflare/content/html-rewriting@INiqdtppBmCthOEXuHb-V.md b/src/data/roadmaps/cloudflare/content/html-rewriting@INiqdtppBmCthOEXuHb-V.md
new file mode 100644
index 000000000..05ef8c1c8
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/html-rewriting@INiqdtppBmCthOEXuHb-V.md
@@ -0,0 +1,15 @@
+# HTML Rewriting
+
+HTML rewriting with Cloudflare Workers enables you to modify HTML content on the fly. You can use Workers to parse HTML, manipulate elements, and inject new content. Common use cases include:
+
+- A/B testing: Dynamically changing content for different users.
+- Personalization: Tailoring the HTML based on user characteristics.
+- Content injection: Adding analytics scripts or ads.
+- Security enhancements: Removing potentially harmful code.
+
+HTML rewriting allows you to customize the user experience and optimize your website without modifying the origin server.
+
+Visit the following resources to learn more:
+
+- [@official@HTMLRewriter · Cloudflare Workers](https://developers.cloudflare.com/workers/runtime-apis/html-rewriter/)
+- [@official@Introducing the HTMLRewriter API to Cloudflare Workers](https://blog.cloudflare.com/introducing-htmlrewriter/)
diff --git a/src/data/roadmaps/cloudflare/content/http-and-web-protocols@9iSdASlRxyod9YwZ2IUry.md b/src/data/roadmaps/cloudflare/content/http-and-web-protocols@9iSdASlRxyod9YwZ2IUry.md
new file mode 100644
index 000000000..5567d51df
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/http-and-web-protocols@9iSdASlRxyod9YwZ2IUry.md
@@ -0,0 +1,8 @@
+# HTTP and Web Protocols
+
+Understanding HTTP and web protocols is crucial for leveraging Cloudflare's features. HTTP methods (GET, POST), status codes, headers, and caching mechanisms directly influence how Cloudflare interacts with your application. Cloudflare supports modern protocols like HTTP/2 and HTTP/3, improving performance. Familiarity with TLS/SSL is vital for secure communication, and concepts like CORS (Cross-Origin Resource Sharing) are relevant when handling API requests. Cloudflare's features, like caching rules and page rules, operate based on these protocols.
+
+Visit the following resources to learn more:
+
+- [@article@What is HTTP?](https://www.cloudflare.com/en-gb/learning/ddos/glossary/hypertext-transfer-protocol-http/)
+- [@article@Overview of HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/image-processing@S7laV14zsx31O0Tsj2SRL.md b/src/data/roadmaps/cloudflare/content/image-processing@S7laV14zsx31O0Tsj2SRL.md
new file mode 100644
index 000000000..c6ad1af5d
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/image-processing@S7laV14zsx31O0Tsj2SRL.md
@@ -0,0 +1,15 @@
+# Image Processing
+
+Workers AI allows you to run AI models directly within Cloudflare Workers, enabling powerful image processing capabilities at the edge. You can use Workers AI to perform tasks such as:
+
+- Image recognition
+- Object detection
+- Image classification
+- Image resizing and optimization
+
+This allows you to build intelligent applications that analyze and manipulate images in real-time, close to the user.
+
+Visit the following resources to learn more:
+
+- [@official@How to Build an Image Generator using Workers AI](https://developers.cloudflare.com/workers-ai/tutorials/image-generation-playground/)
+- [@official@Get Started with Cloudflare Images](https://developers.cloudflare.com/images/get-started/)
diff --git a/src/data/roadmaps/cloudflare/content/images@8bOWuopxHtBWUSFaVT54P.md b/src/data/roadmaps/cloudflare/content/images@8bOWuopxHtBWUSFaVT54P.md
new file mode 100644
index 000000000..f306e3d2b
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/images@8bOWuopxHtBWUSFaVT54P.md
@@ -0,0 +1,8 @@
+# Images
+
+Cloudflare Images provides comprehensive image optimization and delivery services. It automatically resizes, converts, and optimizes images for different devices and browsers, improving website performance and reducing bandwidth usage. You can also use Cloudflare Images to store and serve images directly, eliminating the need for a separate image hosting service.
+
+Visit the following resources to learn more:
+
+- [@official@Images · Cloudflare Docs](https://developers.cloudflare.com/images/)
+- [@official@Get Started with Cloudflare Images](https://developers.cloudflare.com/images/get-started/)
diff --git a/src/data/roadmaps/cloudflare/content/integration--workflows@wvurOKbemF4Tt2WZcmqDL.md b/src/data/roadmaps/cloudflare/content/integration--workflows@wvurOKbemF4Tt2WZcmqDL.md
new file mode 100644
index 000000000..7e31d9566
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/integration--workflows@wvurOKbemF4Tt2WZcmqDL.md
@@ -0,0 +1,16 @@
+# Integration & Workflows
+
+Workflows refers to the automated processes you can create to manage and respond to various events or conditions. This often involves chaining together different Cloudflare features and potentially integrating with external services. Workflows enable you to automate tasks such as:
+
+- Responding to security threats
+- Optimizing website performance
+- Managing user access
+- Enforcing compliance policies
+
+Cloudflare's strength lies in its ability to integrate various services and create automated workflows. You can connect Cloudflare with external platforms using webhooks or APIs. Workflows can automate tasks like responding to security events, optimizing performance based on real-time data, or managing user access. By integrating different components, you can build complex and efficient systems that leverage Cloudflare's global network.
+
+Visit the following resources to learn more:
+
+- [@official@CI/CD · Cloudflare Workers](https://developers.cloudflare.com/workers/ci-cd/)
+- [@official@Cloudflare Workflows](https://developers.cloudflare.com/workflows/)
+- [@official@Workers Builds: Integrated CI/CD built on the Workers platform](https://blog.cloudflare.com/workers-builds-integrated-ci-cd-built-on-the-workers-platform/)
diff --git a/src/data/roadmaps/cloudflare/content/inter-worker-communication@jYAUIKozuhsNK5LbkeAJ6.md b/src/data/roadmaps/cloudflare/content/inter-worker-communication@jYAUIKozuhsNK5LbkeAJ6.md
new file mode 100644
index 000000000..40b6c9a63
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/inter-worker-communication@jYAUIKozuhsNK5LbkeAJ6.md
@@ -0,0 +1,14 @@
+# Inter Worker Communication
+
+Inter-Worker communication enables different Cloudflare Workers to interact and share data. This can be achieved through:
+
+- **Durable Objects:** Workers can share persistent data and coordinate state using Durable Objects.
+- **KV Storage:** Workers can read and write data to a shared KV namespace.
+- **Webhooks:** One Worker can trigger another by sending a webhook request.
+
+These methods allow you to build complex applications where different Workers handle specific tasks and collaborate to achieve a common goal.
+
+Visit the following resources to learn more:
+
+- [@official@How Workers for Platforms works - Cloudflare Docs](https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/reference/how-workers-for-platforms-works/)
+- [@article@Cooperation between Cloudflare Workers](https://dev.to/chimame/cooperation-between-cloudflare-workers-has-become-amazing-thanks-to-rpc-support-4co9)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/isolates-architecture@uNinrB9wm5ahjGXu5fc0g.md b/src/data/roadmaps/cloudflare/content/isolates-architecture@uNinrB9wm5ahjGXu5fc0g.md
new file mode 100644
index 000000000..1aaea1603
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/isolates-architecture@uNinrB9wm5ahjGXu5fc0g.md
@@ -0,0 +1,8 @@
+# Isolates Architecture
+
+Cloudflare's isolated architecture for Workers relies on lightweight V8 isolates. Each Worker runs in its own isolate, providing strong isolation from other Workers and the underlying infrastructure. Isolates start quickly and consume minimal resources, enabling rapid scaling. This architecture prevents code from one Worker from impacting others, enhancing security and stability. The isolation ensures that even if a Worker contains vulnerabilities, it cannot compromise the entire Cloudflare network or other customers' applications.
+
+Visit the following resources to learn more:
+
+- [@official@Reference Architectures · Cloudflare Reference Architecture](https://developers.cloudflare.com/reference-architecture/)
+- [@official@Cloudflare Security Architecture](https://developers.cloudflare.com/reference-architecture/architectures/security/)
diff --git a/src/data/roadmaps/cloudflare/content/itty-router@15jl6CSCkqnh_eFfysLDM.md b/src/data/roadmaps/cloudflare/content/itty-router@15jl6CSCkqnh_eFfysLDM.md
new file mode 100644
index 000000000..bd1459aba
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/itty-router@15jl6CSCkqnh_eFfysLDM.md
@@ -0,0 +1,8 @@
+# Itty Router
+
+Itty Router is a lightweight router with the motto "less is more" that supports Cloudflare workers and pages. While other libraries may suffer from feature creep/bloat to please a wider audience, Itty Router painfully consider every single byte added to Itty. Our router options range from ~450 bytes to ~970 bytes for a batteries-included version with built-in defaults, error handling, formatting, etc. On top of that, the following concepts aim to keep YOUR code tiny (and readable) as well.
+
+Visit the following resources to learn more:
+
+- [@official@ITTy Documentation](https://itty.dev/itty-router/)
+- [@official@Getting Started with Itty Router](https://itty.dev/itty-router/getting-started)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/javascript-fundamentals@PcYnYAAkKMbzoiCnBfjqO.md b/src/data/roadmaps/cloudflare/content/javascript-fundamentals@PcYnYAAkKMbzoiCnBfjqO.md
new file mode 100644
index 000000000..d65c5736b
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/javascript-fundamentals@PcYnYAAkKMbzoiCnBfjqO.md
@@ -0,0 +1,11 @@
+# JavaScript Fundamentals
+
+JavaScript is a versatile, high-level programming language primarily used for adding interactivity and dynamic features to websites. It runs in the browser, allowing for client-side scripting that can manipulate HTML and CSS, respond to user events, and interact with web APIs.
+
+JavaScript is a core language for Cloudflare Workers, allowing you to write serverless functions that run on Cloudflare's edge network. You'll use it to intercept and modify HTTP requests and responses, customize website behavior, and build dynamic applications. Understanding JavaScript fundamentals like variables, functions, asynchronous programming (Promises, async/await), and DOM manipulation is crucial for effective Cloudflare Workers development. You can also use TypeScript, which compiles to JavaScript, offering static typing benefits.
+
+Visit the following resources to learn more:
+
+- [@roadmap@Visit Dedicated JavaScript Roadmap](https://roadmap.sh/javascript)
+- [@official@JavaScript · Cloudflare Workers](https://developers.cloudflare.com/workers/languages/javascript/)
+- [@article@JavaScript Fundamentals](https://developer.mozilla.org/en-US/curriculum/core/javascript-fundamentals/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/key-value-operations@EBTHbXOOZiqrcYJvKhcWV.md b/src/data/roadmaps/cloudflare/content/key-value-operations@EBTHbXOOZiqrcYJvKhcWV.md
new file mode 100644
index 000000000..c7069e586
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/key-value-operations@EBTHbXOOZiqrcYJvKhcWV.md
@@ -0,0 +1,9 @@
+# Key-value Operations
+
+Cloudflare Workers provide a simple API for reading and writing data to a Key-Value store. You can use the `put` method to store data, and the `get` method to retrieve it. The `delete` method allows you to remove data from the store. KV stores are ideal for storing configuration data, user sessions, and other data that needs to be accessed quickly.
+
+Visit the following resources to learn more:
+
+- [@official@Read Key Value Pairs](https://developers.cloudflare.com/kv/api/read-key-value-pairs/)
+- [@official@Cloudflare KV Binding API](https://developers.cloudflare.com/workers/runtime-apis/kv)
+- [@official@Cloudflare Workers KV — Cloudflare Docs](https://developers.cloudflare.com/workers/runtime-apis/kv/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/large-file-handling@BPahk1qH9Hk11tsE2hw3A.md b/src/data/roadmaps/cloudflare/content/large-file-handling@BPahk1qH9Hk11tsE2hw3A.md
new file mode 100644
index 000000000..92426b78b
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/large-file-handling@BPahk1qH9Hk11tsE2hw3A.md
@@ -0,0 +1,15 @@
+# Large File Handling
+
+Handling large files on Cloudflare requires strategies to avoid exceeding size limits and ensure efficient delivery. Techniques include:
+
+- **Streaming:** Processing files in chunks to reduce memory usage.
+- **Range Requests:** Serving only the requested portion of a file.
+- **Cloudflare Stream:** Using Cloudflare's video streaming service for large video files.
+- **R2 integration:** Storing large files in R2 and serving them via Workers.
+
+These methods allow you to handle large files effectively while leveraging Cloudflare's global network.
+
+Visit the following resources to learn more:
+
+- [@official@Resumable and Large Files · Cloudflare Stream](https://developers.cloudflare.com/stream/uploading-videos/resumable-uploads/)
+- [@official@Cloudflare R2 Limits](https://developers.cloudflare.com/r2/platform/limits/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/live-streaming@RiQSPAV9uRFgwQFJckTFV.md b/src/data/roadmaps/cloudflare/content/live-streaming@RiQSPAV9uRFgwQFJckTFV.md
new file mode 100644
index 000000000..fb3b5762d
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/live-streaming@RiQSPAV9uRFgwQFJckTFV.md
@@ -0,0 +1,8 @@
+# Live streaming
+
+Cloudflare Stream supports live streaming. You can use tools like OBS Studio or Wirecast to stream video to Cloudflare, and Stream will handle the encoding, distribution, and playback. This allows you to easily broadcast live events to a global audience.
+
+Visit the following resources to learn more:
+
+- [@official@Cloudflare Stream](https://www.cloudflare.com/developer-platform/products/cloudflare-stream/)
+- [@official@Serverless Live Streaming with Cloudflare Stream](https://blog.cloudflare.com/stream-live/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/logging-and-monitoring@aKEH4ZxI6J1nwjp_AgH5r.md b/src/data/roadmaps/cloudflare/content/logging-and-monitoring@aKEH4ZxI6J1nwjp_AgH5r.md
new file mode 100644
index 000000000..966019737
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/logging-and-monitoring@aKEH4ZxI6J1nwjp_AgH5r.md
@@ -0,0 +1,8 @@
+# Logging and Monitoring
+
+Effective logging and monitoring are crucial for understanding and debugging Cloudflare Workers. You can use `console.log` for basic logging during development. For production, consider using a dedicated logging service to collect and analyze logs from your Workers. Cloudflare provides metrics like request counts, CPU usage, and error rates that can be monitored in the Cloudflare dashboard. Setting up alerts based on these metrics helps you identify and address issues quickly.
+
+Visit the following resources to learn more:
+
+- [@article@Logging vs Monitoring: What's the Difference?](https://toxigon.com/logging-vs-monitoring-whats-the-difference)
+- [@official@Debugging and Logging · Cloudflare Pages](https://developers.cloudflare.com/pages/functions/debugging-and-logging/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/message-processing@EFA8m0EdhygxcBWzwmbnT.md b/src/data/roadmaps/cloudflare/content/message-processing@EFA8m0EdhygxcBWzwmbnT.md
new file mode 100644
index 000000000..95e27c68c
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/message-processing@EFA8m0EdhygxcBWzwmbnT.md
@@ -0,0 +1,9 @@
+# Message Processing
+
+With Cloudflare Queues, message processing involves sending messages to a queue from a producer (usually a Worker) and then consuming those messages from the queue by a consumer (another Worker or service). The consumer processes each message, performing tasks like data transformation, calling APIs, or updating databases. Queues guarantees at-least-once delivery, meaning a message will be delivered to a consumer at least once, even if there are failures. Consumers can acknowledge successful processing to remove messages from the queue.
+
+Visit the following resources to learn more:
+
+- [@official@Cloudflare Queues · Cloudflare Queues](https://developers.cloudflare.com/queues/)
+- [@official@How Does Queues Work?](https://developers.cloudflare.com/queues/reference/how-queues-works/)
+- [@article@Difference Between Stream Processing and Message Processing](https://stackoverflow.com/questions/41744506/difference-between-stream-processing-and-message-processing)
diff --git a/src/data/roadmaps/cloudflare/content/metadata-handling@sQlRIYLnZcugATgpogJmw.md b/src/data/roadmaps/cloudflare/content/metadata-handling@sQlRIYLnZcugATgpogJmw.md
new file mode 100644
index 000000000..0a5bbc184
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/metadata-handling@sQlRIYLnZcugATgpogJmw.md
@@ -0,0 +1,8 @@
+# Metadata Handling
+
+Cloudflare Workers allow you to access metadata about the request, including the request method, URL, headers, and more. You can use this metadata to customize your application's behavior or to implement features like caching, authentication, or rate limiting. Metadata is available in both the `fetch` event and the `scheduled` event. It's a powerful tool for building dynamic and adaptive applications.
+
+Visit the following resources to learn more:
+
+- [@official@Request and Response](https://developers.cloudflare.com/workers/runtime-apis/request)
+- [@official@Scheduled Event Handler](https://developers.cloudflare.com/workers/runtime-apis/scheduled-event)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/middleware-patterns@aStbAF4zraqhJ-N3RH4ha.md b/src/data/roadmaps/cloudflare/content/middleware-patterns@aStbAF4zraqhJ-N3RH4ha.md
new file mode 100644
index 000000000..6d579798a
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/middleware-patterns@aStbAF4zraqhJ-N3RH4ha.md
@@ -0,0 +1,8 @@
+# Middleware Patterns
+
+Middleware patterns in Cloudflare Workers allow you to chain functions to process requests or responses in a modular way. Each middleware function performs a specific task (e.g., authentication, logging, header modification) before passing the request/response to the next function in the chain. This promotes code reusability, separation of concerns, and easier maintenance. By composing middleware, you can build complex request processing pipelines.
+
+Visit the following resources to learn more:
+
+- [@official@Middleware · Cloudflare Pages](https://developers.cloudflare.com/pages/functions/middleware/)
+- [@article@A Middleware Architecture for Cloudflare Workers](https://boxesplusarrows.com/blog/a-middleware-architecture-for-cloudflare-workers/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/migrations@M8rSSVFUHixgWZRfaBPHb.md b/src/data/roadmaps/cloudflare/content/migrations@M8rSSVFUHixgWZRfaBPHb.md
new file mode 100644
index 000000000..74a4aa295
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/migrations@M8rSSVFUHixgWZRfaBPHb.md
@@ -0,0 +1,8 @@
+# Migrations
+
+As your application evolves, your database schema will likely need to change. Database migrations provide a structured way to apply these changes in a controlled and repeatable manner. In D1, you'll typically write SQL scripts that contain the necessary `ALTER TABLE` statements to modify your schema (e.g., adding new columns, renaming columns, changing data types). You can then use `wrangler` or a similar tool to execute these migration scripts against your D1 database. It's important to version your migration scripts and apply them in the correct order to avoid data inconsistencies or errors. Consider using a migration management tool to track and apply migrations more effectively.
+
+Visit the following resources to learn more:
+
+- [@article@Database Migrations: What are the Types of DB Migrations?](https://www.prisma.io/dataguide/types/relational/what-are-database-migrations)
+- [@article@Database Migrations in the Real World](https://blog.jetbrains.com/idea/2025/02/database-migrations-in-the-real-world/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/miniflare@o4sBgniPmLqwej6TlIPcl.md b/src/data/roadmaps/cloudflare/content/miniflare@o4sBgniPmLqwej6TlIPcl.md
new file mode 100644
index 000000000..18a42ad2a
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/miniflare@o4sBgniPmLqwej6TlIPcl.md
@@ -0,0 +1,8 @@
+# Miniflare
+
+Miniflare is a local simulator for Cloudflare Workers. It mimics the Cloudflare Workers runtime environment on your local machine, allowing you to test your Workers without deploying them to Cloudflare. Miniflare supports features like KV storage, Durable Objects, and Service Bindings, making it a valuable tool for local development and debugging. It speeds up development cycles by providing a fast and reliable local testing environment.
+
+Visit the following resources to learn more:
+
+- [@official@Miniflare - Cloudflare Workers](https://developers.cloudflare.com/workers/testing/miniflare/)
+- [@opensource@cloudflare/miniflare](https://github.com/cloudflare/miniflare)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/miniflare@vZHBp4S6WaS5sa5rfUOk-.md b/src/data/roadmaps/cloudflare/content/miniflare@vZHBp4S6WaS5sa5rfUOk-.md
new file mode 100644
index 000000000..9577eb91c
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/miniflare@vZHBp4S6WaS5sa5rfUOk-.md
@@ -0,0 +1,8 @@
+# Miniflare
+
+Miniflare is a simulator for Cloudflare Workers that allows you to test your Workers locally. It mimics the Cloudflare Workers runtime environment, including features like KV storage, Durable Objects, and the Cache API. Miniflare enables rapid iteration and debugging without deploying to Cloudflare's edge network. It's a valuable tool for developing and testing Workers offline or in a controlled environment.
+
+Visit the following resources to learn more:
+
+- [@official@Miniflare - Cloudflare Workers](https://developers.cloudflare.com/workers/testing/miniflare/)
+- [@opensource@cloudflare/miniflare](https://github.com/cloudflare/miniflare)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/monitoring-tools@Cy2T8978yUAPGol-yzxv_.md b/src/data/roadmaps/cloudflare/content/monitoring-tools@Cy2T8978yUAPGol-yzxv_.md
new file mode 100644
index 000000000..48ea1b2c1
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/monitoring-tools@Cy2T8978yUAPGol-yzxv_.md
@@ -0,0 +1,15 @@
+# Monitoring Tools
+
+Monitoring tools provide insights into the performance and health of your Cloudflare applications. Cloudflare offers built-in analytics, but you can also integrate with external monitoring services like Datadog, New Relic, or Prometheus. These tools allow you to track metrics such as:
+
+- Request latency
+- Error rates
+- Cache hit ratio
+- Resource usage
+
+By monitoring these metrics, you can identify performance bottlenecks, detect security threats, and ensure your applications are running smoothly.
+
+Visit the following resources to learn more:
+
+- [@official@Application Performance Monitoring Tools](https://www.cloudflare.com/application-services/solutions/app-performance-monitoring/)
+- [@official@Network Monitoring Tools](https://www.cloudflare.com/network-services/solutions/network-monitoring-tools/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/nodejs-and-npm@dSBYTGGkol3MAXyg7G7_J.md b/src/data/roadmaps/cloudflare/content/nodejs-and-npm@dSBYTGGkol3MAXyg7G7_J.md
new file mode 100644
index 000000000..b4179c15c
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/nodejs-and-npm@dSBYTGGkol3MAXyg7G7_J.md
@@ -0,0 +1,12 @@
+# Node.js and NPM
+
+Node.js is an open source, cross-platform runtime environment and library that is used for running web applications outside the client’s browser. It is used for server-side programming, and primarily deployed for non-blocking, event-driven servers, such as traditional web sites and back-end API services, but was originally designed with real-time, push-based architectures in mind. Every browser has its own version of a JS engine, and node.js is built on Google Chrome’s V8 JavaScript engine.
+
+npm (Node Package Manager) is the standard package manager for Node.js. It is two things: first and foremost, it is an online repository for the publishing of open-source Node.js projects; second, it is a command-line utility for interacting with said repository that aids in package installation, version management, and dependency management.
+
+Visit the following resources to learn more:
+
+- [@roadmap@Visit Dedicated Node.js Roadmap](https://roadmap.sh/nodejs)
+- [@official@Node.js Documentation](https://nodejs.org/en/)
+- [@official@NPM](https://www.docs.npmjs.com/)
+- [@official@An Introduction to NPM](https://nodejs.org/en/learn/getting-started/an-introduction-to-the-npm-package-manager)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/object-storage@K9iW2H6riKwddWmpWJFJw.md b/src/data/roadmaps/cloudflare/content/object-storage@K9iW2H6riKwddWmpWJFJw.md
new file mode 100644
index 000000000..69a12de7f
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/object-storage@K9iW2H6riKwddWmpWJFJw.md
@@ -0,0 +1,8 @@
+# Object Storage
+
+Cloudflare R2 is object storage that offers fast, reliable, and affordable storage without egress fees. It's designed to work seamlessly with Cloudflare Workers, allowing you to store and retrieve data close to your users. R2 is ideal for storing static assets, user-generated content, and other data that needs to be accessed quickly and frequently. Its lack of egress fees makes it a cost-effective alternative to traditional cloud storage providers.
+
+Visit the following resources to learn more:
+
+- [@official@What is Object Storage?](https://www.cloudflare.com/learning/cloud/what-is-object-storage/)
+- [@official@Cloudflare R2 | Zero Egress Fee Object Storage](https://www.cloudflare.com/developer-platform/products/r2/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/pages-functions@SaHqm7T4FFVrsgyfImo66.md b/src/data/roadmaps/cloudflare/content/pages-functions@SaHqm7T4FFVrsgyfImo66.md
new file mode 100644
index 000000000..7a21e424a
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/pages-functions@SaHqm7T4FFVrsgyfImo66.md
@@ -0,0 +1,7 @@
+# Pages Functions
+
+Pages Functions, (now part of Cloudflare Functions), allow you to run serverless code directly within your Cloudflare Pages projects. This lets you add dynamic functionality, like form handling or API endpoints, to your otherwise static sites. They're deployed alongside your static assets and execute on Cloudflare's edge network, ensuring low latency and high performance.
+
+Visit the following resources to learn more:
+
+- [@official@Functions · Cloudflare Pages](https://developers.cloudflare.com/pages/functions/)
diff --git a/src/data/roadmaps/cloudflare/content/persistence@36w4Q73XkCwo5Cva0XsF8.md b/src/data/roadmaps/cloudflare/content/persistence@36w4Q73XkCwo5Cva0XsF8.md
new file mode 100644
index 000000000..510b33e46
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/persistence@36w4Q73XkCwo5Cva0XsF8.md
@@ -0,0 +1,8 @@
+# Persistence
+
+Durable Objects offer built-in persistence. Data stored within a Durable Object is automatically persisted to Cloudflare's storage infrastructure. You don't need to explicitly save or load data; the Durable Object handles persistence automatically. This simplifies development and ensures that your application's state is durable and reliable, even in the face of server failures.
+
+Visit the following resources to learn more:
+
+- [@official@Access Durable Objects Storage - Cloudflare Docs](https://developers.cloudflare.com/durable-objects/best-practices/access-durable-objects-storage/)
+- [@official@In-memory State in a Durable Object](https://developers.cloudflare.com/durable-objects/reference/in-memory-state/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/prisma@h3MHLZZwkYqqb5PSfMhpB.md b/src/data/roadmaps/cloudflare/content/prisma@h3MHLZZwkYqqb5PSfMhpB.md
new file mode 100644
index 000000000..02dd8b339
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/prisma@h3MHLZZwkYqqb5PSfMhpB.md
@@ -0,0 +1,8 @@
+# Prisma
+
+Prisma is a popular open-source ORM that provides a type-safe database client and migration tools. While not directly compatible with Cloudflare D1 due to its reliance on specific database adapters, Prisma can be used in conjunction with a D1 adapter or a custom data access layer within your Cloudflare Workers. This approach allows you to leverage Prisma's type safety, query builder, and migration features while still using D1 as your database.
+
+Visit the following resources to learn more:
+
+- [@official@Prisma](https://www.prisma.io/)
+- [@official@Prisma Documentation](https://www.prisma.io/docs)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/processing@6bNUqx5f_w5NuDL25BABN.md b/src/data/roadmaps/cloudflare/content/processing@6bNUqx5f_w5NuDL25BABN.md
new file mode 100644
index 000000000..c5c96583f
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/processing@6bNUqx5f_w5NuDL25BABN.md
@@ -0,0 +1,15 @@
+# Processing
+
+With Cloudflare Email Workers, processing involves manipulating or analyzing incoming email content. After an email is routed to your worker, you can access and modify various aspects of the email, such as headers, body, and attachments. Processing can include tasks like:
+
+- **Content Modification:** Altering the email body, adding disclaimers, or translating content.
+- **Data Extraction:** Parsing information from the email to use in other applications.
+- **Spam Filtering:** Implementing custom spam detection logic.
+- **Attachment Handling:** Processing or storing attachments.
+
+Email Workers provide the flexibility to customize how emails are handled, enabling a wide range of email-based applications and integrations.
+
+Visit the following resources to learn more:
+
+- [@official@Email Workers · Cloudflare Email Routing](https://developers.cloudflare.com/email-routing/email-workers/)
+- [@official@Email Workers Routing - Runtime API](https://developers.cloudflare.com/email-routing/email-workers/runtime-api/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/query-optimization@65xDESm6jbHWkVO4NgHqx.md b/src/data/roadmaps/cloudflare/content/query-optimization@65xDESm6jbHWkVO4NgHqx.md
new file mode 100644
index 000000000..7e2a3094c
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/query-optimization@65xDESm6jbHWkVO4NgHqx.md
@@ -0,0 +1,13 @@
+# Query Optimization
+
+Optimizing your SQL queries is crucial for achieving good performance with Cloudflare D1, especially as your database grows. D1 leverages SQLite's query optimizer, which automatically attempts to find the most efficient way to execute your queries. However, you can significantly improve performance by following best practices:
+
+- **Use Indexes:** Indexes are essential for speeding up queries that filter or sort data. Create indexes on columns that are frequently used in `WHERE` clauses, `JOIN` conditions, and `ORDER BY` clauses.
+- **Avoid Full Table Scans:** Full table scans can be slow, especially on large tables. Ensure your queries are using indexes to narrow down the number of rows that need to be examined.
+- **Write Efficient SQL:** Use appropriate `JOIN` types, avoid using `SELECT *` (specify the columns you need), and use `WHERE` clauses to filter data as early as possible.
+- **Analyze Query Performance:** Use SQLite's `EXPLAIN QUERY PLAN` command to analyze how your queries are being executed. This can help you identify potential bottlenecks and areas for improvement.
+- **Consider Denormalization:** In some cases, denormalizing your database schema (adding redundant data to avoid joins) can improve query performance, but it comes at the cost of increased storage space and potential data inconsistencies. Weigh the trade-offs carefully.
+
+Visit the following resources to learn more:
+
+- [@official@Query Parameters and Cached Responses](https://developers.cloudflare.com/automatic-platform-optimization/reference/query-parameters/)
diff --git a/src/data/roadmaps/cloudflare/content/queues@zyRgTtlng6idboSgL9YTt.md b/src/data/roadmaps/cloudflare/content/queues@zyRgTtlng6idboSgL9YTt.md
new file mode 100644
index 000000000..0f288d46b
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/queues@zyRgTtlng6idboSgL9YTt.md
@@ -0,0 +1,8 @@
+# Queues
+
+Cloudflare Queues is a message queuing service that allows you to decouple different parts of your application. It enables you to reliably send and receive messages between Workers or other services. This asynchronous communication is useful for tasks like background processing, handling spikes in traffic, and building resilient applications. Queues ensures messages are delivered, even if the receiving service is temporarily unavailable.
+
+Visit the following resources to learn more:
+
+- [@official@Cloudflare Queues · Cloudflare Queues](https://developers.cloudflare.com/queues/)
+- [@official@How Does Queues Work?](https://developers.cloudflare.com/queues/reference/how-queues-works/)
diff --git a/src/data/roadmaps/cloudflare/content/r2-storage@gxLUlXGuaY5Q-0xmBgQwz.md b/src/data/roadmaps/cloudflare/content/r2-storage@gxLUlXGuaY5Q-0xmBgQwz.md
new file mode 100644
index 000000000..c0fb94e09
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/r2-storage@gxLUlXGuaY5Q-0xmBgQwz.md
@@ -0,0 +1,8 @@
+# R2 Storage
+
+Cloudflare R2 Storage is a distributed object storage service that offers fast, reliable, and affordable storage without egress fees. It's designed to compete with services like Amazon S3 and Google Cloud Storage. R2 allows you to store large amounts of unstructured data (images, videos, documents) and access it quickly from anywhere in the world via Cloudflare's global network. Its key advantage is the absence of egress bandwidth charges, making it cost-effective for applications with high data retrieval needs.
+
+Visit the following resources to learn more:
+
+- [@official@Cloudflare R2 | Zero Egress Fee Object Storage](https://www.cloudflare.com/developer-platform/products/r2/)
+- [@official@Cloudflare R2 Documentation](https://developers.cloudflare.com/r2/)
diff --git a/src/data/roadmaps/cloudflare/content/rate-limiting@JP5U6c2fZjtkU-Xzwtapx.md b/src/data/roadmaps/cloudflare/content/rate-limiting@JP5U6c2fZjtkU-Xzwtapx.md
new file mode 100644
index 000000000..8bbb0c1e7
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/rate-limiting@JP5U6c2fZjtkU-Xzwtapx.md
@@ -0,0 +1,8 @@
+# Rate Limiting
+
+Cloudflare Queues can be used to implement rate limiting. Instead of directly processing every request, you can enqueue them. A consumer Worker then processes messages from the queue at a controlled rate. This prevents your backend systems from being overwhelmed by sudden spikes in traffic. You can adjust the consumer's processing rate to match the capacity of your backend services.
+
+Visit the following resources to learn more:
+
+- [@official@Cloudflare Queues - Queues & Rate Limits](https://developers.cloudflare.com/queues/tutorials/handle-rate-limits/)
+- [@official@Rate Limiting Best Practices - Cloudflare Docs](https://developers.cloudflare.com/waf/rate-limiting-rules/best-practices/)
diff --git a/src/data/roadmaps/cloudflare/content/rate-limiting@MInAsLLJtIq6WQDSj5yGH.md b/src/data/roadmaps/cloudflare/content/rate-limiting@MInAsLLJtIq6WQDSj5yGH.md
new file mode 100644
index 000000000..8bbb0c1e7
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/rate-limiting@MInAsLLJtIq6WQDSj5yGH.md
@@ -0,0 +1,8 @@
+# Rate Limiting
+
+Cloudflare Queues can be used to implement rate limiting. Instead of directly processing every request, you can enqueue them. A consumer Worker then processes messages from the queue at a controlled rate. This prevents your backend systems from being overwhelmed by sudden spikes in traffic. You can adjust the consumer's processing rate to match the capacity of your backend services.
+
+Visit the following resources to learn more:
+
+- [@official@Cloudflare Queues - Queues & Rate Limits](https://developers.cloudflare.com/queues/tutorials/handle-rate-limits/)
+- [@official@Rate Limiting Best Practices - Cloudflare Docs](https://developers.cloudflare.com/waf/rate-limiting-rules/best-practices/)
diff --git a/src/data/roadmaps/cloudflare/content/requestresponse-handling@HNEXPU6r_T7UYvwLv2wnt.md b/src/data/roadmaps/cloudflare/content/requestresponse-handling@HNEXPU6r_T7UYvwLv2wnt.md
new file mode 100644
index 000000000..8e2289877
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/requestresponse-handling@HNEXPU6r_T7UYvwLv2wnt.md
@@ -0,0 +1,8 @@
+# Request/Response Handling
+
+Cloudflare Workers excel at intercepting and modifying HTTP requests and responses. When a request hits Cloudflare, a Worker can inspect the request details (headers, URL, method) and take actions: rewrite the URL, modify headers, or even serve a completely different response. Similarly, Workers can intercept responses from the origin server, modifying the content, adding headers for caching, or even serving a cached version directly. This level of control allows for powerful customization and optimization of web traffic.
+
+Visit the following resources to learn more:
+
+- [@official@Request and Response](https://developers.cloudflare.com/workers/runtime-apis/request)
+- [@article@Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)
diff --git a/src/data/roadmaps/cloudflare/content/routing@-lsYPD6JueIV94RybGH_Y.md b/src/data/roadmaps/cloudflare/content/routing@-lsYPD6JueIV94RybGH_Y.md
new file mode 100644
index 000000000..7cd7c66d9
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/routing@-lsYPD6JueIV94RybGH_Y.md
@@ -0,0 +1,7 @@
+# Routing
+
+In Cloudflare Email Workers, routing refers to directing incoming emails to the appropriate destination or processing logic. Email Workers intercept emails and use defined rules to determine their fate. You can route emails based on sender, recipient, subject, or other criteria. This allows you to forward emails, trigger custom logic, or even discard unwanted messages. Effective routing is critical for managing email flow, implementing custom email workflows, and building applications that react to incoming email.
+
+Visit the following resources to learn more:
+
+- [@official@Email Workers · Cloudflare Email Routing](https://developers.cloudflare.com/email-routing/email-workers/)
diff --git a/src/data/roadmaps/cloudflare/content/schema-management@PnhP47woPJb_JnLpMMiTw.md b/src/data/roadmaps/cloudflare/content/schema-management@PnhP47woPJb_JnLpMMiTw.md
new file mode 100644
index 000000000..fd8270153
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/schema-management@PnhP47woPJb_JnLpMMiTw.md
@@ -0,0 +1,8 @@
+# Schema Management
+
+Managing the structure of your database in Cloudflare D1 involves defining tables, columns, data types, primary keys, foreign keys, and indexes using standard SQL Data Definition Language (DDL) statements. Since D1 is based on SQLite, you'll use SQLite-compatible syntax. Tools like `wrangler` provide commands to execute SQL scripts, allowing you to create and modify your database schema. You'll typically start by designing your schema based on your application's data requirements and then translate that design into SQL DDL statements. Careful consideration should be given to data types to ensure data integrity and efficiency.
+
+Visit the following resources to learn more:
+
+- [@official@Schema Validation · Cloudflare API Shield](https://developers.cloudflare.com/api-shield/security/schema-validation/)
+- [@official@Configure Schema Validation · Cloudflare API Shield](https://developers.cloudflare.com/api-shield/security/schema-validation/configure/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/security--performance@76xovsBrKOnlRBVjsqNq1.md b/src/data/roadmaps/cloudflare/content/security--performance@76xovsBrKOnlRBVjsqNq1.md
new file mode 100644
index 000000000..daae3a617
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/security--performance@76xovsBrKOnlRBVjsqNq1.md
@@ -0,0 +1,24 @@
+# Security & Performance
+
+Cloudflare significantly enhances both security and performance through its global network. It provides robust protection against DDoS attacks, bot traffic, and other web threats, while also accelerating website loading times via its CDN and caching mechanisms. By terminating SSL/TLS connections at the edge and optimizing content delivery, Cloudflare ensures a secure and fast experience for users, reducing latency and improving overall website resilience.
+
+**Security:** Cloudflare Email Workers can enhance email security by:
+
+- **Spam and Phishing Detection:** Implementing custom filters to identify and block malicious emails before they reach the recipient.
+- **Content Sanitization:** Removing potentially harmful content from emails, such as malicious scripts or links.
+- **Authentication:** Verifying sender authenticity to prevent spoofing and phishing attacks.
+- **Data Loss Prevention (DLP):** Preventing sensitive information from being sent via email.
+
+**Performance:** Email Workers impact performance by:
+
+- **Reduced Latency:** Processing emails closer to the user, minimizing delays.
+- **Scalability:** Handling large volumes of email traffic without performance degradation.
+- **Custom Routing:** Efficiently directing emails to the appropriate destination.
+- **Optimized Processing:** Performing lightweight email processing tasks to avoid bottlenecks.
+
+Effectively leveraging Email Workers for security and performance requires careful planning and implementation of relevant filters, rules, and processing logic.
+
+Visit the following resources to learn more:
+
+- [@official@Application Security & Performance Solutions - Cloudflare](https://www.cloudflare.com/application-services/solutions/)
+- [@official@Cloudflare Security Architecture](https://developers.cloudflare.com/reference-architecture/architectures/security/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/service-bindings@JfpVexcbuWCx_R3EjFmbo.md b/src/data/roadmaps/cloudflare/content/service-bindings@JfpVexcbuWCx_R3EjFmbo.md
new file mode 100644
index 000000000..db5c3974a
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/service-bindings@JfpVexcbuWCx_R3EjFmbo.md
@@ -0,0 +1,7 @@
+# Service Bindings
+
+Service Bindings allow Cloudflare Workers to seamlessly integrate with other Cloudflare services. They provide a secure and efficient way for a Worker to access resources like KV storage, Durable Objects, R2 storage, and other Workers. Instead of using API keys or direct network calls, Service Bindings create a direct connection between your Worker and the bound service, simplifying configuration and improving performance. They're essential for building complex applications that leverage the full power of the Cloudflare ecosystem.
+
+Visit the following resources to learn more:
+
+- [@official@Service Bindings · Cloudflare](https://developers.cloudflare.com/workers/platform/service-bindings/)
diff --git a/src/data/roadmaps/cloudflare/content/service-bindings@WZSi9inWPhqZQvDN-C8BV.md b/src/data/roadmaps/cloudflare/content/service-bindings@WZSi9inWPhqZQvDN-C8BV.md
new file mode 100644
index 000000000..08d4deb8b
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/service-bindings@WZSi9inWPhqZQvDN-C8BV.md
@@ -0,0 +1,8 @@
+# Service Bindings
+
+Service Bindings allow Cloudflare Workers to seamlessly integrate with other Cloudflare services. They provide a secure and efficient way for a Worker to access resources like KV storage, Durable Objects, R2 storage, and other Workers. Instead of using API keys or direct network calls, Service Bindings create a direct connection between your Worker and the bound service, simplifying configuration and improving performance. They're essential for building complex applications that leverage the full power of the Cloudflare ecosystem.
+
+Visit the following resources to learn more:
+
+- [@official@Service Bindings - Runtime APIs](https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings/)
+- [@official@Service Bindings · Cloudflare](https://developers.cloudflare.com/workers/platform/service-bindings/)
diff --git a/src/data/roadmaps/cloudflare/content/similarity-search@pg3GtykCegK411DYDN8sN.md b/src/data/roadmaps/cloudflare/content/similarity-search@pg3GtykCegK411DYDN8sN.md
new file mode 100644
index 000000000..b8726d02e
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/similarity-search@pg3GtykCegK411DYDN8sN.md
@@ -0,0 +1,8 @@
+# Similarity Search
+
+Cloudflare offers Vectorize, a vector database, which enables similarity search. You can embed data (text, images, audio) as vectors and then use Vectorize to find the most similar vectors based on a query vector. This is used for recommendation systems, content discovery, and other applications where finding similar items is important.
+
+Visit the following resources to learn more:
+
+- [@official@Cloudflare Vectorize - Cloudflare](https://developers.cloudflare.com/vectorize/)
+- [@opensource@seemueller-io/hyphalbase](https://github.com/seemueller-io/hyphalbase)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/speech-rcognition@HJbJ8OxjJzznYwLlIOSO2.md b/src/data/roadmaps/cloudflare/content/speech-rcognition@HJbJ8OxjJzznYwLlIOSO2.md
new file mode 100644
index 000000000..d20a813af
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/speech-rcognition@HJbJ8OxjJzznYwLlIOSO2.md
@@ -0,0 +1,7 @@
+# Speech Recognition
+
+You can use Workers AI to run speech-to-text models directly on Cloudflare's edge network, enabling real-time transcription of audio data. This can be useful for applications like voice search, voice commands, and live captioning.
+
+Visit the following resources to learn more:
+
+- [@official@Whisper - Cloudflare Workers AI](https://developers.cloudflare.com/workers-ai/models/whisper/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/state-management@EQjhRlM7zpANNWkypScIl.md b/src/data/roadmaps/cloudflare/content/state-management@EQjhRlM7zpANNWkypScIl.md
new file mode 100644
index 000000000..7f25bdfec
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/state-management@EQjhRlM7zpANNWkypScIl.md
@@ -0,0 +1,8 @@
+# State Management
+
+Durable Objects excel at state management. Each Durable Object instance has its own persistent storage and can maintain state across multiple requests. You can store data within a Durable Object and access it consistently, regardless of which Cloudflare edge server handles the request. This eliminates the need for external databases or caching layers for managing application state.
+
+Visit the following resources to learn more:
+
+- [@official@What are Durable Objects? - Cloudflare Documentation](https://developers.cloudflare.com/durable-objects/what-are-durable-objects/)
+- [@official@Durable Object State · Cloudflare Durable Objects](https://developers.cloudflare.com/durable-objects/api/state/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/stream@LoT3NtpNj9uAgQRV-MD_E.md b/src/data/roadmaps/cloudflare/content/stream@LoT3NtpNj9uAgQRV-MD_E.md
new file mode 100644
index 000000000..86e10bc58
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/stream@LoT3NtpNj9uAgQRV-MD_E.md
@@ -0,0 +1,8 @@
+# Stream
+
+Cloudflare Stream is a video streaming platform that makes it easy to upload, encode, and deliver videos globally. It handles all the complexities of video streaming, including encoding for different devices and network conditions, providing a reliable and high-quality viewing experience. Stream integrates seamlessly with Cloudflare's CDN, ensuring fast and efficient video delivery to users around the world.
+
+Visit the following resources to learn more:
+
+- [@official@Cloudflare Stream - Cloudflare Documentation](https://www.cloudflare.com/developer-platform/products/cloudflare-stream/)
+- [@official@Cloudflare Stream - Cloudflare Blog](https://blog.cloudflare.com/tag/cloudflare-stream/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/testing-frameworks@jyWxaMx7_nojt5HsyAv7K.md b/src/data/roadmaps/cloudflare/content/testing-frameworks@jyWxaMx7_nojt5HsyAv7K.md
new file mode 100644
index 000000000..2d1e62b9d
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/testing-frameworks@jyWxaMx7_nojt5HsyAv7K.md
@@ -0,0 +1,9 @@
+# Testing Frameworks
+
+Testing frameworks are crucial for ensuring Cloudflare Workers function correctly. Popular options include Jest, Mocha, and Chai. These frameworks allow you to write unit tests, integration tests, and end-to-end tests for your Workers. You can simulate Cloudflare's environment and test how your Worker responds to different requests and events. Thorough testing helps identify and fix bugs early in the development process, ensuring the reliability of your Workers.
+
+Visit the following resources to learn more:
+
+- [@official@Testing - Cloudflare Workers Docs](https://developers.cloudflare.com/workers/testing/)
+- [@article@Jest - Delightful JavaScript Testing](https://jestjs.io/)
+- [@article@Vitest - A Fast JavaScript Test Runner](https://vitest.dev/)
diff --git a/src/data/roadmaps/cloudflare/content/text-generation@zMwmoCUp9429_aXU-Bz4H.md b/src/data/roadmaps/cloudflare/content/text-generation@zMwmoCUp9429_aXU-Bz4H.md
new file mode 100644
index 000000000..5e56d22c5
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/text-generation@zMwmoCUp9429_aXU-Bz4H.md
@@ -0,0 +1,8 @@
+# Text Generation
+
+Workers AI allows you to perform text generation tasks directly on Cloudflare's edge network. You can use pre-trained models or fine-tune your own models to generate text for various purposes, such as content creation, chatbot responses, or language translation. Running text generation at the edge reduces latency and improves the responsiveness of your AI-powered applications.
+
+Visit the following resources to learn more:
+
+- [@official@Choose the Right Text Generation Model](https://developers.cloudflare.com/workers-ai/tutorials/how-to-choose-the-right-text-generation-model/)
+- [@official@Prompting · Cloudflare Workers AI](https://developers.cloudflare.com/workers-ai/guides/prompting/)
diff --git a/src/data/roadmaps/cloudflare/content/transactional-operations@rxxibrJUo1rQ3XCuUIP59.md b/src/data/roadmaps/cloudflare/content/transactional-operations@rxxibrJUo1rQ3XCuUIP59.md
new file mode 100644
index 000000000..8a3ed69aa
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/transactional-operations@rxxibrJUo1rQ3XCuUIP59.md
@@ -0,0 +1,8 @@
+# Transactional Operations
+
+Durable Objects support transactional operations. You can perform multiple operations within a single transaction, ensuring that either all operations succeed or none of them do. This helps maintain data consistency and prevents partial updates. If an error occurs during a transaction, the Durable Object automatically rolls back all changes, leaving the data in a consistent state.
+
+Visit the following resources to learn more:
+
+- [@official@Durable Object Storage · Cloudflare Durable Objects](https://developers.cloudflare.com/durable-objects/api/storage-api/)
+- [@official@Transactional Storage · Cloudflare Durable Objects](https://developers.cloudflare.com:2096/durable-objects/api/transactional-storage-api/)
diff --git a/src/data/roadmaps/cloudflare/content/tunnels@8WZpSKBHCeYfTEL9tBNKr.md b/src/data/roadmaps/cloudflare/content/tunnels@8WZpSKBHCeYfTEL9tBNKr.md
new file mode 100644
index 000000000..fc43a9680
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/tunnels@8WZpSKBHCeYfTEL9tBNKr.md
@@ -0,0 +1,8 @@
+# Tunnels
+
+Cloudflare Tunnel creates a secure, outbound-only connection between your origin server and Cloudflare's network, without opening any inbound ports. This protects your origin from direct attacks and simplifies network configuration. You can use Cloudflare Tunnel to securely expose web applications, APIs, and other services to the internet, without compromising security.
+
+Visit the following resources to learn more:
+
+- [@official@Cloudflare Tunnel · Cloudflare Zero Trust](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/)
+- [@official@Ridiculously easy to use Tunnels - The Cloudflare Blog](https://blog.cloudflare.com/ridiculously-easy-to-use-tunnels/)
diff --git a/src/data/roadmaps/cloudflare/content/typescript-fundamentals@zR84MFLL6y0dygz9hXXPA.md b/src/data/roadmaps/cloudflare/content/typescript-fundamentals@zR84MFLL6y0dygz9hXXPA.md
new file mode 100644
index 000000000..cd886ab84
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/typescript-fundamentals@zR84MFLL6y0dygz9hXXPA.md
@@ -0,0 +1,9 @@
+# TypeScript Fundamentals
+
+TypeScript is a superset of JavaScript that adds static typing. It enhances code maintainability and reduces errors by catching type-related issues during development. For Cloudflare Workers, TypeScript can improve the development experience. You define types for variables, function parameters, and return values, making code more predictable. TypeScript code compiles to JavaScript before deployment to Cloudflare Workers. Using TypeScript allows for better tooling, autocompletion, and refactoring, leading to more robust and scalable serverless applications.
+
+Visit the following resources to learn more:
+
+- [@roadmap@Visit Dedicated TypeScript Roadmap](https://roadmap.sh/typescript)
+- [@official@TypeScript Documentation](https://www.typescriptlang.org/docs/)
+- [@official@TypeScript Handbook](https://www.typescriptlang.org/docs/handbook/)
diff --git a/src/data/roadmaps/cloudflare/content/understand-serverless-architecture@Isl5anwDvb1MacA-JH4ej.md b/src/data/roadmaps/cloudflare/content/understand-serverless-architecture@Isl5anwDvb1MacA-JH4ej.md
new file mode 100644
index 000000000..d895b34df
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/understand-serverless-architecture@Isl5anwDvb1MacA-JH4ej.md
@@ -0,0 +1,8 @@
+# Understand Serverless Architecture
+
+Serverless architecture allows you to run code without managing servers, and Cloudflare Workers is a key implementation of this. With Cloudflare Workers, you deploy JavaScript/TypeScript functions to Cloudflare's edge network, where they execute in response to HTTP requests. Serverless means you don't provision or maintain servers; Cloudflare handles scaling and infrastructure. This model enables faster deployments, pay-per-use pricing, and reduced operational overhead. You focus on code, while Cloudflare handles the underlying infrastructure, making it ideal for building performant and scalable applications.
+
+Visit the following resources to learn more:
+
+- [@article@What is Serverless Architecture?](https://cloud.google.com/discover/what-is-serverless-architecture)
+- [@article@What is Serverless Computing? - Serverless Computing Explain@](https://aws.amazon.com/what-is/serverless-computing/)
diff --git a/src/data/roadmaps/cloudflare/content/vector-embeddings@UIWaR1ZdjSm0UAS69Kz_5.md b/src/data/roadmaps/cloudflare/content/vector-embeddings@UIWaR1ZdjSm0UAS69Kz_5.md
new file mode 100644
index 000000000..1967eaa96
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/vector-embeddings@UIWaR1ZdjSm0UAS69Kz_5.md
@@ -0,0 +1,8 @@
+# Vector Embeddings
+
+Cloudflare Vectorize allows you to store and query high-dimensional vectors, often used in machine learning for tasks like similarity search and recommendation engines. By using Vectorize with Workers AI, you can build applications that perform real-time AI-powered searches and recommendations directly on Cloudflare's edge network.
+
+Visit the following resources to learn more:
+
+- [@official@Vector Database - Cloudflare Docs](https://developers.cloudflare.com/vectorize/reference/what-is-a-vector-database/)
+- [@official@Cloudflare Vectorize](https://developers.cloudflare.com/vectorize/)
diff --git a/src/data/roadmaps/cloudflare/content/vectorize@NWGVtH1vxQuO4lly0Omuy.md b/src/data/roadmaps/cloudflare/content/vectorize@NWGVtH1vxQuO4lly0Omuy.md
new file mode 100644
index 000000000..cf853a8be
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/vectorize@NWGVtH1vxQuO4lly0Omuy.md
@@ -0,0 +1,8 @@
+# Vectorize
+
+Cloudflare Vectorize is a vector database that lets you store and query high-dimensional vectors, often used in machine learning for tasks like similarity search and recommendation engines. By using Vectorize with Workers AI, you can build applications that perform real-time AI-powered searches and recommendations directly on Cloudflare's edge network.
+
+Visit the following resources to learn more:
+
+- [@official@Introduction to Vectorize - Cloudflare Docs](https://developers.cloudflare.com/vectorize/get-started/intro/)
+- [@official@Cloudflare Vectorize](https://developers.cloudflare.com/vectorize/)
diff --git a/src/data/roadmaps/cloudflare/content/video-delivery@zQp7XfDKWJgMf2LexRJhN.md b/src/data/roadmaps/cloudflare/content/video-delivery@zQp7XfDKWJgMf2LexRJhN.md
new file mode 100644
index 000000000..3d379ee40
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/video-delivery@zQp7XfDKWJgMf2LexRJhN.md
@@ -0,0 +1,16 @@
+# Video Delivery
+
+Cloudflare Stream provides a comprehensive solution for video delivery:
+
+- **Encoding:** Automatically encodes videos for different devices and bandwidths.
+- **Storage:** Stores your videos securely.
+- **CDN:** Delivers videos globally via Cloudflare's CDN for fast playback.
+- **Player:** Provides a customizable video player.
+
+This simplifies the process of delivering high-quality video experiences.
+
+Visit the following resources to learn more:
+
+- [@official@Delivering Videos with Cloudflare](https://developers.cloudflare.com/support/more-dashboard-apps/cloudflare-stream/delivering-videos-with-cloudflare/)
+- [@official@Stream Delivery - Cloudflare Stream](https://www.cloudflare.com/application-services/solutions/stream-delivery/)
+- [@official@Cloudflare Stream - Cloudflare](https://www.cloudflare.com/developer-platform/products/cloudflare-stream/)
diff --git a/src/data/roadmaps/cloudflare/content/video-processing@3B6Z7F0D3Sf8ZBlV3kkGx.md b/src/data/roadmaps/cloudflare/content/video-processing@3B6Z7F0D3Sf8ZBlV3kkGx.md
new file mode 100644
index 000000000..9027b5459
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/video-processing@3B6Z7F0D3Sf8ZBlV3kkGx.md
@@ -0,0 +1,13 @@
+# Video Processing
+
+Cloudflare offers video processing capabilities through Stream and Workers:
+
+- **Stream:** Handles encoding, transcoding, and adaptive bitrate streaming automatically.
+- **Workers:** You can use Workers to intercept video requests and perform custom processing, such as adding watermarks or modifying metadata.
+
+This allows you to customize your video delivery pipeline.
+
+Visit the following resources to learn more:
+
+- [@official@Cloudflare Stream - Cloudflare](https://www.cloudflare.com/developer-platform/products/cloudflare-stream/)
+- [@official@VOD Platform | Video-on-demand Streaming Software](https://www.cloudflare.com/developer-platform/solutions/video-on-demand/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/web-security-headers@KWix4jeNUKJ07Iu95Mqj_.md b/src/data/roadmaps/cloudflare/content/web-security-headers@KWix4jeNUKJ07Iu95Mqj_.md
new file mode 100644
index 000000000..fef15a5d5
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/web-security-headers@KWix4jeNUKJ07Iu95Mqj_.md
@@ -0,0 +1,16 @@
+# Web Security Headers
+
+Web security headers are HTTP response headers that enhance website security. Cloudflare allows you to easily configure these headers to protect against common attacks. Key headers include:
+
+- **Content Security Policy (CSP):** Controls resources the browser can load.
+- **Strict-Transport-Security (HSTS):** Enforces HTTPS connections.
+- **X-Frame-Options:** Prevents clickjacking attacks.
+- **X-XSS-Protection:** Enables XSS filtering in browsers.
+- **Referrer-Policy:** Controls referrer information sent with requests.
+
+Cloudflare simplifies setting these headers, improving website security with minimal effort.
+
+Visit the following resources to learn more:
+
+- [@official@Configure HTTP Headers - Cloudflare](https://developers.cloudflare.com/fundamentals/reference/http-headers/)
+- [@article@Quick Reference to Security Headers](https://web.dev/articles/security-headers)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/webhook-handling@uOUjI6CPrhZIlz6mRCtOW.md b/src/data/roadmaps/cloudflare/content/webhook-handling@uOUjI6CPrhZIlz6mRCtOW.md
new file mode 100644
index 000000000..1b5e7382b
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/webhook-handling@uOUjI6CPrhZIlz6mRCtOW.md
@@ -0,0 +1,7 @@
+# Webhook Handling
+
+Cloudflare can handle webhooks to trigger actions based on external events. You can configure Cloudflare Workers to receive webhook requests and process the data. This allows you to integrate Cloudflare with other services like GitHub, Slack, or monitoring tools. When an event occurs in the external service, it sends a webhook to your Cloudflare Worker, which can then perform actions such as updating DNS records, purging the cache, or sending notifications.
+
+Visit the following resources to learn more:
+
+- [@official@Configure Webhooks - Cloudflare](https://developers.cloudflare.com/notifications/get-started/configure-webhooks/)
diff --git a/src/data/roadmaps/cloudflare/content/workers-ai@a0S0_JLwLLNGLUAHrqG4P.md b/src/data/roadmaps/cloudflare/content/workers-ai@a0S0_JLwLLNGLUAHrqG4P.md
new file mode 100644
index 000000000..1ca3fe1ef
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/workers-ai@a0S0_JLwLLNGLUAHrqG4P.md
@@ -0,0 +1,8 @@
+# Workers AI
+
+Cloudflare Workers AI allows you to run AI inference directly on Cloudflare's global network, close to your users. This eliminates the need to send data to centralized AI servers, reducing latency and improving performance for AI-powered applications. You can use Workers AI to perform tasks like image recognition, natural language processing, and sentiment analysis at the edge.
+
+Visit the following resources to learn more:
+
+- [@official@Workers AI - Cloudflare Docs](https://developers.cloudflare.com/workers-ai/)
+- [@official@Models · Cloudflare Workers AI](https://developers.cloudflare.com/workers-ai/models/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/workers-kv@1dGFfQauOgHP7T4ReMpCU.md b/src/data/roadmaps/cloudflare/content/workers-kv@1dGFfQauOgHP7T4ReMpCU.md
new file mode 100644
index 000000000..29f52274f
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/workers-kv@1dGFfQauOgHP7T4ReMpCU.md
@@ -0,0 +1,8 @@
+# Workers KV
+
+Workers KV is a data storage that allows you to store and retrieve data globally. With Workers KV, you can build dynamic and performant APIs and websites that support high read volumes with low latency.
+
+Visit the following resources to learn more:
+
+- [@official@Cloudflare Workers KV Documentation](https://developers.cloudflare.com/kv/)
+- [@official@How to Use Cloudflare Workers and KV Storage](https://www.youtube.com/watch?v=NGk2HxV0Xkg)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/workers-lifecycle@i6L9FI6fBDXr0XtMrc_uR.md b/src/data/roadmaps/cloudflare/content/workers-lifecycle@i6L9FI6fBDXr0XtMrc_uR.md
new file mode 100644
index 000000000..8305d3cfc
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/workers-lifecycle@i6L9FI6fBDXr0XtMrc_uR.md
@@ -0,0 +1,9 @@
+# Workers Lifecycle
+
+A Cloudflare Worker's lifecycle is short and stateless. Each invocation starts when a request hits the Cloudflare edge. The Worker executes its code to handle the request. Once the response is sent (or an error occurs), the Worker instance terminates. There's no persistent state between requests unless you use services like KV or Durable Objects. This stateless nature ensures scalability and quick response times. Understanding this lifecycle is crucial for designing efficient Workers that can handle a high volume of requests.
+
+Visit the following resources to learn more:
+
+- [@official@Workers RPC - Lifecycle](https://developers.cloudflare.com/workers/runtime-apis/rpc/lifecycle/)
+- [@official@How Workers Works · Cloudflare](https://developers.cloudflare.com/workers/reference/how-workers-works/)
+- [@official@Introducing workerd: the Open Source Workers Runtime](https://blog.cloudflare.com/workerd-open-source-workers-runtime/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/workers-runtime-environment@TB6vGzDgGZ9yAd9MGR7vw.md b/src/data/roadmaps/cloudflare/content/workers-runtime-environment@TB6vGzDgGZ9yAd9MGR7vw.md
new file mode 100644
index 000000000..1279fc2b8
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/workers-runtime-environment@TB6vGzDgGZ9yAd9MGR7vw.md
@@ -0,0 +1,8 @@
+# Workers Runtime Environment
+
+The Workers runtime environment is a lightweight JavaScript execution environment running on Cloudflare's edge network. It's based on V8, the same engine that powers Chrome and Node.js, but optimized for speed and security. Workers have limited access to global variables and APIs compared to a traditional Node.js environment, focusing on handling HTTP requests and responses. It provides APIs for caching, KV storage, and accessing request information, enabling performant and globally distributed serverless functions.
+
+Visit the following resources to learn more:
+
+- [@official@How Workers Works · Cloudflare](https://developers.cloudflare.com/workers/reference/how-workers-works/)
+- [@official@Introducing workerd: the Open Source Workers Runtime](https://blog.cloudflare.com/workerd-open-source-workers-runtime/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/workers-security-model@8IF7jftushwZrn7JXpC_v.md b/src/data/roadmaps/cloudflare/content/workers-security-model@8IF7jftushwZrn7JXpC_v.md
new file mode 100644
index 000000000..c2dc13f1a
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/workers-security-model@8IF7jftushwZrn7JXpC_v.md
@@ -0,0 +1,8 @@
+# Workers Security Model
+
+Cloudflare Workers operate within a secure, isolated environment. The Workers runtime enforces strict security boundaries, preventing Workers from accessing sensitive data or interfering with other processes. Workers have limited access to the outside world and must explicitly request resources. Cloudflare's global network provides inherent DDoS protection and mitigates common web vulnerabilities. This secure execution environment ensures that Workers can safely process requests without compromising the overall security of the platform.
+
+Visit the following resources to learn more:
+
+- [@official@Security Model · Cloudflare](https://developers.cloudflare.com/workers/reference/security-model/)
+- [@official@Workers RPC — Visibility and Security Model - Cloudflare Docs](https://developers.cloudflare.com/workers/runtime-apis/rpc/visibility/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/workflows@rAl7zXcODiqIpS__3qf1A.md b/src/data/roadmaps/cloudflare/content/workflows@rAl7zXcODiqIpS__3qf1A.md
new file mode 100644
index 000000000..ad7db741e
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/workflows@rAl7zXcODiqIpS__3qf1A.md
@@ -0,0 +1,8 @@
+# Workflows
+
+Cloudflare Workflow allows you to automate tasks and orchestrate different Cloudflare services through a visual, no-code/low-code interface. You can create workflows that trigger based on various events (e.g., HTTP requests, scheduled triggers) and perform actions such as modifying HTTP headers, routing traffic, or integrating with external APIs. It's designed to simplify complex configurations and automate repetitive tasks without requiring extensive coding knowledge.
+
+Visit the following resources to learn more:
+
+- [@official@Cloudflare Workflows · Cloudflare](https://developers.cloudflare.com/workflows/)
+- [@opensource@Cloudflare Workflows Starter](https://github.com/cloudflare/workflows-starter)
\ No newline at end of file
diff --git a/src/data/roadmaps/cloudflare/content/wrangler@Tzx93tvoGrc9_fKQqkorN.md b/src/data/roadmaps/cloudflare/content/wrangler@Tzx93tvoGrc9_fKQqkorN.md
new file mode 100644
index 000000000..6d1428faa
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/wrangler@Tzx93tvoGrc9_fKQqkorN.md
@@ -0,0 +1,16 @@
+# Wrangler
+
+`Wrangler` is the command-line interface (CLI) for Cloudflare Workers. It simplifies the process of developing, testing, and deploying Workers. With `wrangler`, you can:
+
+- Create new Worker projects.
+- Develop Workers locally.
+- Deploy Workers to Cloudflare.
+- Manage secrets and environment variables.
+- Configure bindings to other Cloudflare services.
+
+`Wrangler` streamlines the entire Workers workflow, making it an essential tool for any Cloudflare Workers developer.
+
+Visit the following resources to learn more:
+
+- [@official@Wrangler Documentation](https://developers.cloudflare.com/workers/wrangler/)
+- [@official@Wrangler Commands](https://developers.cloudflare.com/workers/wrangler/commands//)
diff --git a/src/data/roadmaps/cloudflare/content/wrangler@n0vIbHmUZHrF4WjEhYdb8.md b/src/data/roadmaps/cloudflare/content/wrangler@n0vIbHmUZHrF4WjEhYdb8.md
new file mode 100644
index 000000000..6be2318fa
--- /dev/null
+++ b/src/data/roadmaps/cloudflare/content/wrangler@n0vIbHmUZHrF4WjEhYdb8.md
@@ -0,0 +1,8 @@
+# Wrangler
+
+Wrangler is the command-line interface (CLI) tool for building, deploying, and managing Cloudflare Workers. It simplifies the development workflow by providing commands for creating new projects, testing Workers locally, deploying code to Cloudflare's edge network, and managing secrets. Wrangler automates many tasks, making it easier to develop and deploy serverless applications on Cloudflare.
+
+Visit the following resources to learn more:
+
+- [@official@Wrangler Documentation](https://developers.cloudflare.com/workers/wrangler/)
+- [@official@Wrangler Commands](https://developers.cloudflare.com/workers/wrangler/commands//)
diff --git a/src/data/roadmaps/cloudflare/faqs.astro b/src/data/roadmaps/cloudflare/faqs.astro
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/computer-science/content/adjacency-matrix@HZ1kk0TQ13FLC9t13BZl5.md b/src/data/roadmaps/computer-science/content/adjacency-matrix@HZ1kk0TQ13FLC9t13BZl5.md
index cd9f7a399..2a3ab4c6d 100644
--- a/src/data/roadmaps/computer-science/content/adjacency-matrix@HZ1kk0TQ13FLC9t13BZl5.md
+++ b/src/data/roadmaps/computer-science/content/adjacency-matrix@HZ1kk0TQ13FLC9t13BZl5.md
@@ -1 +1,7 @@
-# Adjacency Matrix
\ No newline at end of file
+# Adjacency Matrix
+
+An adjacency matrix is a square matrix used to represent a finite graph. It is used to represent the connections between vertices in a graph. The matrix is filled with 0s and 1s, where a 1 represents a connection between two vertices and a 0 represents no connection.
+
+Visit the following resources to learn more:
+
+- [@article@Adjacency Matrix](https://en.wikipedia.org/wiki/Adjacency_matrix)
\ No newline at end of file
diff --git a/src/data/roadmaps/computer-science/content/b-tree@s0Pi6CemUUsmZSEu2j2gH.md b/src/data/roadmaps/computer-science/content/b-tree@s0Pi6CemUUsmZSEu2j2gH.md
index 365dafe00..45e3dd912 100644
--- a/src/data/roadmaps/computer-science/content/b-tree@s0Pi6CemUUsmZSEu2j2gH.md
+++ b/src/data/roadmaps/computer-science/content/b-tree@s0Pi6CemUUsmZSEu2j2gH.md
@@ -11,5 +11,4 @@ Visit the following resources to learn more:
 - [@video@Introduction to B-Trees](https://www.youtube.com/watch?v=I22wEC1tTGo&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6&index=6)
 - [@video@B-Tree Definition and Insertion](https://www.youtube.com/watch?v=s3bCdZGrgpA&index=7&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6)
 - [@video@B-Tree Deletion](https://www.youtube.com/watch?v=svfnVhJOfMc&index=8&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6)
-- [@video@MIT 6.851 - Memory Hierarchy Models](https://www.youtube.com/watch?v=V3omVLzI0WE&index=7&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf)
 - [@video@B-Trees (playlist) in 26 minutes](https://www.youtube.com/playlist?list=PL9xmBV_5YoZNFPPv98DjTdD9X6UI9KMHz)
diff --git a/src/data/roadmaps/computer-science/content/base@q3nRhTYS5wg9tYnQe2sCF.md b/src/data/roadmaps/computer-science/content/base@q3nRhTYS5wg9tYnQe2sCF.md
index b278da770..2ebe4eed3 100644
--- a/src/data/roadmaps/computer-science/content/base@q3nRhTYS5wg9tYnQe2sCF.md
+++ b/src/data/roadmaps/computer-science/content/base@q3nRhTYS5wg9tYnQe2sCF.md
@@ -5,6 +5,3 @@ The rise in popularity of NoSQL databases provided a flexible and fluidity with
 - **B**asically **A**vailable
 - **S**oft state
 - **E**ventual consistency
-
-Visit the following resources to learn more:
-
diff --git a/src/data/roadmaps/computer-science/content/bubble-sort@4wGBYFZpcdTt97WTbSazx.md b/src/data/roadmaps/computer-science/content/bubble-sort@4wGBYFZpcdTt97WTbSazx.md
index df25cdf08..d8259aece 100644
--- a/src/data/roadmaps/computer-science/content/bubble-sort@4wGBYFZpcdTt97WTbSazx.md
+++ b/src/data/roadmaps/computer-science/content/bubble-sort@4wGBYFZpcdTt97WTbSazx.md
@@ -4,6 +4,6 @@ Bubble sort is a simple sorting algorithm that repeatedly steps through the list
 
 Visit the following resources to learn more:
 
+- [@article@Bubble Sort Algorithm](https://www.programiz.com/dsa/bubble-sort)
 - [@video@Bubble Sort](https://www.youtube.com/watch?v=P00xJgWzz2c&index=1&list=PL89B61F78B552C1AB)
-- [@video@Analyzing Bubble Sort](https://www.youtube.com/watch?v=ni_zk257Nqo&index=7&list=PL89B61F78B552C1AB)
 - [@video@Bubble sort in 2 minutes](https://youtu.be/xli_FI7CuzA)
diff --git a/src/data/roadmaps/computer-science/content/c@1kQJs-3Aw8Bi7d_Xh67zS.md b/src/data/roadmaps/computer-science/content/c@1kQJs-3Aw8Bi7d_Xh67zS.md
index 2306b10e1..61fe1d913 100644
--- a/src/data/roadmaps/computer-science/content/c@1kQJs-3Aw8Bi7d_Xh67zS.md
+++ b/src/data/roadmaps/computer-science/content/c@1kQJs-3Aw8Bi7d_Xh67zS.md
@@ -4,10 +4,10 @@ C++ is a powerful general-purpose programming language. It can be used to develo
 
 Visit the following resources to learn more:
 
+- [@roadmap@C++ Roadmap](https://roadmap.sh/cpp)
 - [@article@Learn C++](https://learncpp.com/)
 - [@article@Cpp Reference](https://en.cppreference.com/)
 - [@article@CPlusPlus](https://cplusplus.com/)
 - [@article@C++ TutorialsPoint](https://www.tutorialspoint.com/cplusplus/index.htm)
 - [@article@W3Schools C++](https://www.w3schools.com/cpp/default.asp)
-- [@roadmap.sh@C++ Roadmap](https://roadmap.sh/cpp)
 - [@feed@Explore top posts about C++ Programming](https://app.daily.dev/tags/c++?ref=roadmapsh)
diff --git a/src/data/roadmaps/computer-science/content/cdn@r8V9bZpc98SrLvXc070bZ.md b/src/data/roadmaps/computer-science/content/cdn@r8V9bZpc98SrLvXc070bZ.md
index 98bbb1dd7..993306e91 100644
--- a/src/data/roadmaps/computer-science/content/cdn@r8V9bZpc98SrLvXc070bZ.md
+++ b/src/data/roadmaps/computer-science/content/cdn@r8V9bZpc98SrLvXc070bZ.md
@@ -4,5 +4,6 @@ A CDN is a network of servers that are distributed geographically. The servers a
 
 Visit the following resources to learn more:
 
+- [@article@What is a CDN?](https://www.cloudflare.com/learning/cdn/what-is-a-cdn/)
 - [@article@Content Delivery Network (CDN) - System Design](https://dev.to/karanpratapsingh/system-design-the-complete-course-10fo#content-delivery-network-cdn)
 - [@video@Content Delivery Networks](https://www.youtube.com/watch?v=6DXEPcXKQNY)
diff --git a/src/data/roadmaps/computer-science/content/class-diagrams@FZ8znJSz8PvQlnEyRLXmQ.md b/src/data/roadmaps/computer-science/content/class-diagrams@FZ8znJSz8PvQlnEyRLXmQ.md
index 6e1a97aa7..36d91cca3 100644
--- a/src/data/roadmaps/computer-science/content/class-diagrams@FZ8znJSz8PvQlnEyRLXmQ.md
+++ b/src/data/roadmaps/computer-science/content/class-diagrams@FZ8znJSz8PvQlnEyRLXmQ.md
@@ -4,5 +4,5 @@ Class Diagrams are used to model the static structure of a system. They are used
 
 Visit the following resources to learn more:
 
+- [@article@Class Diagrams](https://www.visual-paradigm.com/guide/uml-unified-modeling-language/uml-class-diagram-tutorial/)
 - [@video@UML Class Diagram Tutorial](https://www.youtube.com/watch?v=UI6lqHOVHic)
-- [@video@UML Class Diagram Tutorial](https://www.youtube.com/watch?v=3cmzqZzwNDM&list=PLfoY2ARMh0hC2FcJKP5voAKCpk6PZXSd5&index=2)
diff --git a/src/data/roadmaps/computer-science/content/co-np@pLBfkzi0qfgVRqi_4AmMI.md b/src/data/roadmaps/computer-science/content/co-np@pLBfkzi0qfgVRqi_4AmMI.md
index 28509c6f7..1d0824f6c 100644
--- a/src/data/roadmaps/computer-science/content/co-np@pLBfkzi0qfgVRqi_4AmMI.md
+++ b/src/data/roadmaps/computer-science/content/co-np@pLBfkzi0qfgVRqi_4AmMI.md
@@ -13,7 +13,3 @@ Visit the following resources to learn more:
 - [@video@NP Completeness II & Reductions](https://www.youtube.com/watch?v=e0tGC6ZQdQE&index=16&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
 - [@video@NP Completeness III](https://www.youtube.com/watch?v=fCX1BGT3wjE&index=17&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
 - [@video@NP Completeness IV](https://www.youtube.com/watch?v=NKLDp3Rch3M&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=18)
-- [@video@CSE373 2020 - Lecture 23 - NP-Completeness](https://www.youtube.com/watch?v=ItHp5laE1VE&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=23)
-- [@video@CSE373 2020 - Lecture 24 - Satisfiability](https://www.youtube.com/watch?v=inaFJeCzGxU&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=24)
-- [@video@CSE373 2020 - Lecture 25 - More NP-Completeness](https://www.youtube.com/watch?v=B-bhKxjZLlc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=25)
-- [@video@CSE373 2020 - Lecture 26 - NP-Completeness Challenge](https://www.youtube.com/watch?v=_EzetTkG_Cc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=26)
diff --git a/src/data/roadmaps/computer-science/content/common-algorithms@7a6-AnBI-3tAU1dkOvPkx.md b/src/data/roadmaps/computer-science/content/common-algorithms@7a6-AnBI-3tAU1dkOvPkx.md
index bde386d34..47a6315cf 100644
--- a/src/data/roadmaps/computer-science/content/common-algorithms@7a6-AnBI-3tAU1dkOvPkx.md
+++ b/src/data/roadmaps/computer-science/content/common-algorithms@7a6-AnBI-3tAU1dkOvPkx.md
@@ -1,6 +1,6 @@
 # Common Algorithms
 
-Here are some common algorithms that you should know. You can find more information about them in the [Algorithms](https://www.khanacademy.org/computing/computer-science/algorithms) section of the Computer Science course.
+Here are some common algorithms that you should know. You can find more information about them in the Algorithms section of the Computer Science course.
 
 - Sorting
 - Recursion
@@ -13,3 +13,7 @@ Here are some common algorithms that you should know. You can find more informat
 - Substring Search
 - Suffix Arrays
 - Dynamic Programming
+
+Visit the following resources to learn more:
+
+- [@article@Top Algorithms and Data Structures](https://towardsdatascience.com/top-algorithms-and-data-structures-you-really-need-to-know-ab9a2a91c7b5)
diff --git a/src/data/roadmaps/computer-science/content/complete-binary-tree@Jx1WWCjm8jkfAGtHv15n1.md b/src/data/roadmaps/computer-science/content/complete-binary-tree@Jx1WWCjm8jkfAGtHv15n1.md
index ef00407c7..8eabb5ef2 100644
--- a/src/data/roadmaps/computer-science/content/complete-binary-tree@Jx1WWCjm8jkfAGtHv15n1.md
+++ b/src/data/roadmaps/computer-science/content/complete-binary-tree@Jx1WWCjm8jkfAGtHv15n1.md
@@ -5,3 +5,4 @@ A complete binary tree is a special type of binary tree where all the levels of
 Visit the following resources to learn more:
 
 - [@article@Complete Binary Tree - Programiz](https://www.programiz.com/dsa/complete-binary-tree)
+- [@article@Complete Binary Trees](https://www.wscubetech.com/resources/dsa/complete-binary-tree)
\ No newline at end of file
diff --git a/src/data/roadmaps/computer-science/content/complexity-classes@YLCmZvoLkhOk9wlgYW2Ms.md b/src/data/roadmaps/computer-science/content/complexity-classes@YLCmZvoLkhOk9wlgYW2Ms.md
index c4b77494c..0d33cd275 100644
--- a/src/data/roadmaps/computer-science/content/complexity-classes@YLCmZvoLkhOk9wlgYW2Ms.md
+++ b/src/data/roadmaps/computer-science/content/complexity-classes@YLCmZvoLkhOk9wlgYW2Ms.md
@@ -13,7 +13,3 @@ Visit the following resources to learn more:
 - [@video@NP Completeness II & Reductions](https://www.youtube.com/watch?v=e0tGC6ZQdQE&index=16&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
 - [@video@NP Completeness III](https://www.youtube.com/watch?v=fCX1BGT3wjE&index=17&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
 - [@video@NP Completeness IV](https://www.youtube.com/watch?v=NKLDp3Rch3M&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=18)
-- [@video@CSE373 2020 - Lecture 23 - NP-Completeness](https://www.youtube.com/watch?v=ItHp5laE1VE&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=23)
-- [@video@CSE373 2020 - Lecture 24 - Satisfiability](https://www.youtube.com/watch?v=inaFJeCzGxU&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=24)
-- [@video@CSE373 2020 - Lecture 25 - More NP-Completeness](https://www.youtube.com/watch?v=B-bhKxjZLlc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=25)
-- [@video@CSE373 2020 - Lecture 26 - NP-Completeness Challenge](https://www.youtube.com/watch?v=_EzetTkG_Cc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=26)
diff --git a/src/data/roadmaps/computer-science/content/concurrency-in-multiple-cores@xUo5Ox_HTgGyeQMDIkVyK.md b/src/data/roadmaps/computer-science/content/concurrency-in-multiple-cores@xUo5Ox_HTgGyeQMDIkVyK.md
index 243597d8b..4e0707e4a 100644
--- a/src/data/roadmaps/computer-science/content/concurrency-in-multiple-cores@xUo5Ox_HTgGyeQMDIkVyK.md
+++ b/src/data/roadmaps/computer-science/content/concurrency-in-multiple-cores@xUo5Ox_HTgGyeQMDIkVyK.md
@@ -1,6 +1,9 @@
 # Concurrency in Multiple Cores
 
+Concurrency or Parallelism is simultaneous execution of processes on a multiple cores per CPU or multiple CPUs (on a single motherboard). Concurrency is when Parallelism is achieved on a single core/CPU by using scheduling algorithms that divides the CPU's time (time-slice).
+
 Visit the following resources to learn more:
 
-- [@article@What is the difference between multicore and concurrent programming?](https://stackoverflow.com/questions/5372861/what-is-the-difference-between-multicore-and-concurrent-programming)
+- [@article@Difference between Multi-core and concurrent Programming?](https://stackoverflow.com/questions/5372861/what-is-the-difference-between-multicore-and-concurrent-programming)
 - [@article@Concurrency in Multicore systems](https://cs.stackexchange.com/questions/140793/concurrency-in-multiple-core)
+- [@article@Mastering Concurrency](https://www.harrisonclarke.com/blog/mastering-concurrency-a-guide-for-software-engineers)
\ No newline at end of file
diff --git a/src/data/roadmaps/computer-science/content/cpu-cache@DjTQjMbika4_yTzrBpcmB.md b/src/data/roadmaps/computer-science/content/cpu-cache@DjTQjMbika4_yTzrBpcmB.md
index a88099351..3618fa85e 100644
--- a/src/data/roadmaps/computer-science/content/cpu-cache@DjTQjMbika4_yTzrBpcmB.md
+++ b/src/data/roadmaps/computer-science/content/cpu-cache@DjTQjMbika4_yTzrBpcmB.md
@@ -1,7 +1,10 @@
 # CPU Cache
 
+A CPU cache is a hardware cache used by the central processing unit of a computer to reduce the average cost to access data from the main memory. A cache is a smaller, faster memory, located closer to a processor core, which stores copies of the data from frequently used main memory locations.
+
 Visit the following resources to learn more:
 
+- [@article@What is CPU Cache](https://www.howtogeek.com/854138/what-is-cpu-cache/)
 - [@video@MIT 6.004 L15: The Memory Hierarchy](https://www.youtube.com/watch?v=vjYF_fAZI5E\&list=PLrRW1w6CGAcXbMtDFj205vALOGmiRc82-\&index=24)
 - [@video@MIT 6.004 L16: Cache Issues](https://www.youtube.com/watch?v=ajgC3-pyGlk\&index=25\&list=PLrRW1w6CGAcXbMtDFj205vALOGmiRc82-)
 - [@feed@Explore top posts about Computing](https://app.daily.dev/tags/computing?ref=roadmapsh)
diff --git a/src/data/roadmaps/computer-science/content/cpu-interrupts@cpQvB0qMDL3-NWret7oeA.md b/src/data/roadmaps/computer-science/content/cpu-interrupts@cpQvB0qMDL3-NWret7oeA.md
index 4c78b1fe9..01245d850 100644
--- a/src/data/roadmaps/computer-science/content/cpu-interrupts@cpQvB0qMDL3-NWret7oeA.md
+++ b/src/data/roadmaps/computer-science/content/cpu-interrupts@cpQvB0qMDL3-NWret7oeA.md
@@ -4,5 +4,5 @@ CPU Interrupts are a way for the CPU to communicate with the rest of the compute
 
 Visit the following resources to learn more:
 
-- [@video@Video on Interrupts](https://youtu.be/iKlAWIKEyuw)
+- [@video@Interrupts](https://youtu.be/iKlAWIKEyuw)
 - [@feed@Explore top posts about Computing](https://app.daily.dev/tags/computing?ref=roadmapsh)
diff --git a/src/data/roadmaps/computer-science/content/data-structures@NM7q5REW1sJgMhxJhPpLT.md b/src/data/roadmaps/computer-science/content/data-structures@NM7q5REW1sJgMhxJhPpLT.md
index 1deb00610..d7228e83d 100644
--- a/src/data/roadmaps/computer-science/content/data-structures@NM7q5REW1sJgMhxJhPpLT.md
+++ b/src/data/roadmaps/computer-science/content/data-structures@NM7q5REW1sJgMhxJhPpLT.md
@@ -4,6 +4,7 @@ As the name indicates itself, a **Data Structure** is a way of organizing the da
 
 Visit the following resources to learn more:
 
+- [@roadmap@Visit Dedicated DSA Roadmap](https://roadmap.sh/datastructures-and-algorithms)
 - [@article@Data Structures and Algorithms](https://www.javatpoint.com/data-structure-tutorial)
 - [@course@Data Structures and Algorithms By Google](https://techdevguide.withgoogle.com/paths/data-structures-and-algorithms/)
 - [@video@Data Structures Illustrated](https://www.youtube.com/watch?v=9rhT3P1MDHk\&list=PLkZYeFmDuaN2-KUIv-mvbjfKszIGJ4FaY)
diff --git a/src/data/roadmaps/computer-science/content/databases@zvlTQ0A-My4QDrslp_lru.md b/src/data/roadmaps/computer-science/content/databases@zvlTQ0A-My4QDrslp_lru.md
index 58d0e0951..39c109718 100644
--- a/src/data/roadmaps/computer-science/content/databases@zvlTQ0A-My4QDrslp_lru.md
+++ b/src/data/roadmaps/computer-science/content/databases@zvlTQ0A-My4QDrslp_lru.md
@@ -4,7 +4,7 @@ A database is a collection of useful data of one or more related organizations s
 
 Visit the following resources to learn more:
 
-- [@article@Oracle: What is a Database?](https://www.oracle.com/database/what-is-database/)
-- [@article@Prisma.io: What are Databases?](https://www.prisma.io/dataguide/intro/what-are-databases)
+- [@article@What is a Database?](https://www.oracle.com/database/what-is-database/)
+- [@article@What are Databases?](https://www.prisma.io/dataguide/intro/what-are-databases)
 - [@video@DBMS by Stanford](https://www.youtube.com/watch?v=D-k-h0GuFmE\&list=PL9ysvtVnryGpnIj9rcIqNDxakUn6v72Hm)
 - [@feed@Explore top posts about Backend Development](https://app.daily.dev/tags/backend?ref=roadmapsh)
diff --git a/src/data/roadmaps/computer-science/content/dcl@4bUmfuP2qgcli8I2Vm9zh.md b/src/data/roadmaps/computer-science/content/dcl@4bUmfuP2qgcli8I2Vm9zh.md
index 2ec36390c..14a994f6f 100644
--- a/src/data/roadmaps/computer-science/content/dcl@4bUmfuP2qgcli8I2Vm9zh.md
+++ b/src/data/roadmaps/computer-science/content/dcl@4bUmfuP2qgcli8I2Vm9zh.md
@@ -1,6 +1,7 @@
-# DCL (Data Control Language):
+# DCL (Data Control Language)
 
 DCL includes commands such as GRANT and REVOKE which mainly deal with the rights, permissions, and other controls of the database system.
 
 Visit the following resources to learn more:
 
+- [@article@DCL](https://en.wikipedia.org/wiki/Data_Control_Language)
\ No newline at end of file
diff --git a/src/data/roadmaps/computer-science/content/ddl@ii1vF74u3yrFNlw_21b3B.md b/src/data/roadmaps/computer-science/content/ddl@ii1vF74u3yrFNlw_21b3B.md
index 88d234310..79b040af4 100644
--- a/src/data/roadmaps/computer-science/content/ddl@ii1vF74u3yrFNlw_21b3B.md
+++ b/src/data/roadmaps/computer-science/content/ddl@ii1vF74u3yrFNlw_21b3B.md
@@ -4,3 +4,4 @@ DDL or Data Definition Language actually consists of the SQL commands that can b
 
 Visit the following resources to learn more:
 
+- [@article@DDL](https://en.wikipedia.org/wiki/Data_definition_language)
\ No newline at end of file
diff --git a/src/data/roadmaps/computer-science/content/depth-first-search@Yf5gOIe7oiL19MjEVcpdw.md b/src/data/roadmaps/computer-science/content/depth-first-search@Yf5gOIe7oiL19MjEVcpdw.md
index 859313b11..08fd3150a 100644
--- a/src/data/roadmaps/computer-science/content/depth-first-search@Yf5gOIe7oiL19MjEVcpdw.md
+++ b/src/data/roadmaps/computer-science/content/depth-first-search@Yf5gOIe7oiL19MjEVcpdw.md
@@ -4,3 +4,4 @@ Depth first search is a graph traversal algorithm that starts at a root node and
 
 Visit the following resources to learn more:
 
+- [@wiki@Depth-first Search](https://en.wikipedia.org/wiki/Depth-first_search)
\ No newline at end of file
diff --git a/src/data/roadmaps/computer-science/content/dml@tcQSH-eAvJUZuePTDjAIb.md b/src/data/roadmaps/computer-science/content/dml@tcQSH-eAvJUZuePTDjAIb.md
index f9615dcab..a7052207b 100644
--- a/src/data/roadmaps/computer-science/content/dml@tcQSH-eAvJUZuePTDjAIb.md
+++ b/src/data/roadmaps/computer-science/content/dml@tcQSH-eAvJUZuePTDjAIb.md
@@ -1,6 +1,8 @@
 # DML (Data Manipulation Language)
 
-The SQL commands that deals with the manipulation of data present in the database belong to DML or Data Manipulation Language and this includes most of the SQL statements. It is the component of the SQL statement that controls access to data and to the database. Basically, DCL statements are grouped with DML statements.
+The SQL commands that manipulate data in the database belong to DML, or Data Manipulation Language, and this includes most of the SQL statements. DCL is the component of the SQL statement that controls access to data and to the database. Basically, DCL statements are grouped with DML statements.
 
 Visit the following resources to learn more:
 
+- [@article@DML: Data Manipulation Language](https://satoricyber.com/glossary/dml-data-manipulation-language)
+- [@article@Difference Between DDL and DML](https://appmaster.io/blog/difference-between-ddl-and-dml)
diff --git a/src/data/roadmaps/computer-science/content/dql@05lkb3B86Won7Rkf-8DeD.md b/src/data/roadmaps/computer-science/content/dql@05lkb3B86Won7Rkf-8DeD.md
index 3b4a6a691..baac2997d 100644
--- a/src/data/roadmaps/computer-science/content/dql@05lkb3B86Won7Rkf-8DeD.md
+++ b/src/data/roadmaps/computer-science/content/dql@05lkb3B86Won7Rkf-8DeD.md
@@ -4,3 +4,4 @@ DQL statements are used for performing queries on the data within schema objects
 
 Visit the following resources to learn more:
 
+- [@article@Data Query Language](https://en.wikipedia.org/wiki/Data_query_language)
\ No newline at end of file
diff --git a/src/data/roadmaps/computer-science/content/finding-hamiltonian-paths@aBjBHpq_OajgQjxdCobXD.md b/src/data/roadmaps/computer-science/content/finding-hamiltonian-paths@aBjBHpq_OajgQjxdCobXD.md
index 5455354a8..f44acecf9 100644
--- a/src/data/roadmaps/computer-science/content/finding-hamiltonian-paths@aBjBHpq_OajgQjxdCobXD.md
+++ b/src/data/roadmaps/computer-science/content/finding-hamiltonian-paths@aBjBHpq_OajgQjxdCobXD.md
@@ -1,9 +1,10 @@
 # Finding Hamiltonian Paths
 
-Hamiltonian paths are paths that visit every node in a graph exactly once. They are named after the famous mathematician [Hamilton](https://en.wikipedia.org/wiki/William_Rowan_Hamilton). Hamiltonian paths are a special case of [Hamiltonian cycles](https://en.wikipedia.org/wiki/Hamiltonian_cycle), which are cycles that visit every node in a graph exactly once.
+Hamiltonian paths are paths that visit every node in a graph exactly once. They are named after the famous mathematician Hamilton. Hamiltonian paths are a special case of Hamiltonian cycles, which are cycles that visit every node in a graph exactly once.
 
 Visit the following resources to learn more:
 
+- [@article@Hamiltonian Cycles](https://en.wikipedia.org/wiki/Hamiltonian_cycle)
 - [@article@Hamiltonian Path](https://www.hackerearth.com/practice/algorithms/graphs/hamiltonian-path/tutorial/)
 - [@article@Hamiltonian Paths and Cycles](https://medium.com/stamatics-iit-kanpur/hamiltonian-paths-and-cycles-4f233bfbc53a)
 - [@article@Hamiltonian Paths - Lecture 7](https://people.csail.mit.edu/virgi/6.s078/lecture17.pdf)
diff --git a/src/data/roadmaps/computer-science/content/graphql@DeE_dZecLmKCjePovTfFS.md b/src/data/roadmaps/computer-science/content/graphql@DeE_dZecLmKCjePovTfFS.md
index fbe3c9d40..69abb658e 100644
--- a/src/data/roadmaps/computer-science/content/graphql@DeE_dZecLmKCjePovTfFS.md
+++ b/src/data/roadmaps/computer-science/content/graphql@DeE_dZecLmKCjePovTfFS.md
@@ -4,5 +4,6 @@ GraphQL is a query language for APIs and a runtime for fulfilling those queries
 
 Visit the following resources to learn more:
 
+- [@roadmap@Visit Dedicated GraphQL Roadmap](https://roadmap.sh/graphql)
 - [@article@Apollo GraphQL Tutorials](https://www.apollographql.com/tutorials/)
 - [@feed@Explore top posts about GraphQL](https://app.daily.dev/tags/graphql?ref=roadmapsh)
diff --git a/src/data/roadmaps/computer-science/content/how-computers-calculate@GDLKJkKgB-i7n0YcV2NDa.md b/src/data/roadmaps/computer-science/content/how-computers-calculate@GDLKJkKgB-i7n0YcV2NDa.md
index 5b6c1c333..d8e41f626 100644
--- a/src/data/roadmaps/computer-science/content/how-computers-calculate@GDLKJkKgB-i7n0YcV2NDa.md
+++ b/src/data/roadmaps/computer-science/content/how-computers-calculate@GDLKJkKgB-i7n0YcV2NDa.md
@@ -1,5 +1,7 @@
 # How Computers Calculate?
 
+Computers calculate using the binary system, where all data is represented as 0s and 1s. These binary states correspond to the ON/OFF positions of transistors, which are the building blocks of logic gates (AND, OR, NOT). Numbers, characters, and instructions are broken into binary sequences (bits), and grouped into bytes (8 bits). Arithmetic operations like addition are performed through logic gates, which combine binary values. The CPU executes these calculations by following a fetch-decode-execute cycle. Complex calculations, such as handling decimals, use floating-point representation. Programs written in high-level languages are compiled into machine code for the CPU to execute.
+
 Visit the following resources to learn more:
 
 - [@video@How computers calculate - ALU](https://youtu.be/1I5ZMmrOfnA)
diff --git a/src/data/roadmaps/computer-science/content/how-cpu-executes-programs@1eglba39q426Nh0E0qcdj.md b/src/data/roadmaps/computer-science/content/how-cpu-executes-programs@1eglba39q426Nh0E0qcdj.md
index bd65b54c8..d4a960e2f 100644
--- a/src/data/roadmaps/computer-science/content/how-cpu-executes-programs@1eglba39q426Nh0E0qcdj.md
+++ b/src/data/roadmaps/computer-science/content/how-cpu-executes-programs@1eglba39q426Nh0E0qcdj.md
@@ -1,6 +1,8 @@
 # How CPU Executes Programs?
 
+The CPU executes programs by repeatedly fetching instructions from memory, decoding them to understand the operation, and then executing those operations. This cycle, called the fetch-decode-execute cycle, continues for each instruction in the program, with the CPU using registers for temporary storage and a program counter to keep track of the next instruction. Modern CPUs use techniques like pipelining and caches to speed up this process, enabling them to execute complex programs efficiently.
+
 Visit the following resources to learn more:
 
-- [@video@How CPU executes a program](https://www.youtube.com/watch?v=XM4lGflQFvA)
+- [@video@How CPU Executes a Program](https://www.youtube.com/watch?v=XM4lGflQFvA)
 - [@feed@Explore top posts about Computing](https://app.daily.dev/tags/computing?ref=roadmapsh)
diff --git a/src/data/roadmaps/computer-science/content/instructions-and-programs@AxiGqbteK7ZSXEUt_zckH.md b/src/data/roadmaps/computer-science/content/instructions-and-programs@AxiGqbteK7ZSXEUt_zckH.md
index 9c91e1443..b99e1d6fe 100644
--- a/src/data/roadmaps/computer-science/content/instructions-and-programs@AxiGqbteK7ZSXEUt_zckH.md
+++ b/src/data/roadmaps/computer-science/content/instructions-and-programs@AxiGqbteK7ZSXEUt_zckH.md
@@ -1,5 +1,8 @@
 # Instructions and Programs
 
+Instructions are the most basic commands a CPU can understand, directing it to perform specific actions like adding numbers or moving data. A program, on the other hand, is a collection of these instructions, organized in a sequence to accomplish a particular task.  Think of instructions as individual words and a program as a complete sentence or story; the CPU executes these instructions one by one, following the program's logic, to achieve the desired outcome.
+
 Visit the following resources to learn more:
 
-- [@video@Instructions and Programs](https://youtu.be/zltgXvg6r3k)
+- [@article@Instruction and Programs](https://nerdfighteria.info/v/zltgXvg6r3k/)
+- [@video@Instructions and Programs](https://youtu.be/zltgXvg6r3k)
\ No newline at end of file
diff --git a/src/data/roadmaps/computer-science/content/linear-search@XwyqBK9rgP1MMcJrdIzm5.md b/src/data/roadmaps/computer-science/content/linear-search@XwyqBK9rgP1MMcJrdIzm5.md
index 774fa4a18..4c49cc233 100644
--- a/src/data/roadmaps/computer-science/content/linear-search@XwyqBK9rgP1MMcJrdIzm5.md
+++ b/src/data/roadmaps/computer-science/content/linear-search@XwyqBK9rgP1MMcJrdIzm5.md
@@ -4,3 +4,4 @@ Linear search is a very simple algorithm that is used to search for a value in a
 
 Visit the following resources to learn more:
 
+- [@article@Linear Search](https://www.programiz.com/dsa/linear-search)
\ No newline at end of file
diff --git a/src/data/roadmaps/computer-science/content/long-polling@XeJi6TwpI5Uaszj00Uv_2.md b/src/data/roadmaps/computer-science/content/long-polling@XeJi6TwpI5Uaszj00Uv_2.md
index c4203ccf3..aecb5b955 100644
--- a/src/data/roadmaps/computer-science/content/long-polling@XeJi6TwpI5Uaszj00Uv_2.md
+++ b/src/data/roadmaps/computer-science/content/long-polling@XeJi6TwpI5Uaszj00Uv_2.md
@@ -4,5 +4,5 @@ Long polling is a technique used to implement server push functionality over HTT
 
 Visit the following resources to learn more:
 
-- [@article@Long polling](https://javascript.info/long-polling)
+- [@article@Long Polling](https://javascript.info/long-polling)
 - [@article@What are Long-Polling, Websockets, Server-Sent Events (SSE) and Comet?](https://stackoverflow.com/questions/11077857/what-are-long-polling-websockets-server-sent-events-sse-and-comet)
diff --git a/src/data/roadmaps/computer-science/content/np-complete@Lwkz7qozXRlVNA20zJbSw.md b/src/data/roadmaps/computer-science/content/np-complete@Lwkz7qozXRlVNA20zJbSw.md
index 6c8b6c66d..e1ef4851c 100644
--- a/src/data/roadmaps/computer-science/content/np-complete@Lwkz7qozXRlVNA20zJbSw.md
+++ b/src/data/roadmaps/computer-science/content/np-complete@Lwkz7qozXRlVNA20zJbSw.md
@@ -14,7 +14,3 @@ Visit the following resources to learn more:
 - [@video@NP Completeness II & Reductions](https://www.youtube.com/watch?v=e0tGC6ZQdQE&index=16&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
 - [@video@NP Completeness III](https://www.youtube.com/watch?v=fCX1BGT3wjE&index=17&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
 - [@video@NP Completeness IV](https://www.youtube.com/watch?v=NKLDp3Rch3M&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=18)
-- [@video@CSE373 2020 - Lecture 23 - NP-Completeness](https://www.youtube.com/watch?v=ItHp5laE1VE&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=23)
-- [@video@CSE373 2020 - Lecture 24 - Satisfiability](https://www.youtube.com/watch?v=inaFJeCzGxU&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=24)
-- [@video@CSE373 2020 - Lecture 25 - More NP-Completeness](https://www.youtube.com/watch?v=B-bhKxjZLlc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=25)
-- [@video@CSE373 2020 - Lecture 26 - NP-Completeness Challenge](https://www.youtube.com/watch?v=_EzetTkG_Cc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=26)
diff --git a/src/data/roadmaps/computer-science/content/np-hard@mJJ8DGUpBuHEJ7I6UTy1T.md b/src/data/roadmaps/computer-science/content/np-hard@mJJ8DGUpBuHEJ7I6UTy1T.md
index efc5a832b..92ecf051a 100644
--- a/src/data/roadmaps/computer-science/content/np-hard@mJJ8DGUpBuHEJ7I6UTy1T.md
+++ b/src/data/roadmaps/computer-science/content/np-hard@mJJ8DGUpBuHEJ7I6UTy1T.md
@@ -13,7 +13,3 @@ Visit the following resources to learn more:
 - [@video@NP Completeness II & Reductions](https://www.youtube.com/watch?v=e0tGC6ZQdQE&index=16&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
 - [@video@NP Completeness III](https://www.youtube.com/watch?v=fCX1BGT3wjE&index=17&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
 - [@video@NP Completeness IV](https://www.youtube.com/watch?v=NKLDp3Rch3M&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=18)
-- [@video@CSE373 2020 - Lecture 23 - NP-Completeness](https://www.youtube.com/watch?v=ItHp5laE1VE&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=23)
-- [@video@CSE373 2020 - Lecture 24 - Satisfiability](https://www.youtube.com/watch?v=inaFJeCzGxU&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=24)
-- [@video@CSE373 2020 - Lecture 25 - More NP-Completeness](https://www.youtube.com/watch?v=B-bhKxjZLlc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=25)
-- [@video@CSE373 2020 - Lecture 26 - NP-Completeness Challenge](https://www.youtube.com/watch?v=_EzetTkG_Cc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=26)
diff --git a/src/data/roadmaps/computer-science/content/np@ewXUHpOnjm8YrLhce1dAQ.md b/src/data/roadmaps/computer-science/content/np@ewXUHpOnjm8YrLhce1dAQ.md
index e2278c5b0..b602b7028 100644
--- a/src/data/roadmaps/computer-science/content/np@ewXUHpOnjm8YrLhce1dAQ.md
+++ b/src/data/roadmaps/computer-science/content/np@ewXUHpOnjm8YrLhce1dAQ.md
@@ -13,7 +13,3 @@ Visit the following resources to learn more:
 - [@video@NP Completeness II & Reductions](https://www.youtube.com/watch?v=e0tGC6ZQdQE&index=16&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
 - [@video@NP Completeness III](https://www.youtube.com/watch?v=fCX1BGT3wjE&index=17&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
 - [@video@NP Completeness IV](https://www.youtube.com/watch?v=NKLDp3Rch3M&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=18)
-- [@video@CSE373 2020 - Lecture 23 - NP-Completeness](https://www.youtube.com/watch?v=ItHp5laE1VE&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=23)
-- [@video@CSE373 2020 - Lecture 24 - Satisfiability](https://www.youtube.com/watch?v=inaFJeCzGxU&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=24)
-- [@video@CSE373 2020 - Lecture 25 - More NP-Completeness](https://www.youtube.com/watch?v=B-bhKxjZLlc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=25)
-- [@video@CSE373 2020 - Lecture 26 - NP-Completeness Challenge](https://www.youtube.com/watch?v=_EzetTkG_Cc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=26)
diff --git a/src/data/roadmaps/computer-science/content/owasp-top-10@3rPSp135TdSCyvXzEzn4p.md b/src/data/roadmaps/computer-science/content/owasp-top-10@3rPSp135TdSCyvXzEzn4p.md
index 3438c93ee..81154919d 100644
--- a/src/data/roadmaps/computer-science/content/owasp-top-10@3rPSp135TdSCyvXzEzn4p.md
+++ b/src/data/roadmaps/computer-science/content/owasp-top-10@3rPSp135TdSCyvXzEzn4p.md
@@ -4,7 +4,8 @@ OWASP or Open Web Application Security Project is an online community that produ
 
 Visit the following resources to learn more:
 
-- [@article@Wikipedia - OWASP](https://en.wikipedia.org/wiki/OWASP)
+- [@official@OWASP](https://owasp.org/)
+- [@article@OWASP - Wiki](https://en.wikipedia.org/wiki/OWASP)
 - [@opensource@OWASP Web Application Security Testing Checklist](https://github.com/0xRadi/OWASP-Web-Checklist)
 - [@article@OWASP Top 10 Security Risks](https://sucuri.net/guides/owasp-top-10-security-vulnerabilities-2021/)
 - [@article@OWASP Cheatsheets](https://cheatsheetseries.owasp.org/cheatsheets/AJAX_Security_Cheat_Sheet.html)
diff --git a/src/data/roadmaps/computer-science/content/p--np@0btHNkzWL1w_-pUgU_k2y.md b/src/data/roadmaps/computer-science/content/p--np@0btHNkzWL1w_-pUgU_k2y.md
index 8c893f44b..274b0a158 100644
--- a/src/data/roadmaps/computer-science/content/p--np@0btHNkzWL1w_-pUgU_k2y.md
+++ b/src/data/roadmaps/computer-science/content/p--np@0btHNkzWL1w_-pUgU_k2y.md
@@ -1,6 +1,12 @@
 # P = NP
 
-The P = NP problem is one of the most famous problems in computer science. It asks if the problem of determining if a given input belongs to a certain class of problems is as hard as the problem of solving the given input. In other words, it asks if the problem of determining if a given input belongs to a certain class of problems is as hard as the problem of determining if a given input belongs to a certain class of problems. This problem is also known as the Halting Problem.
+The P = NP problem is one of the most famous problems in computer science. It asks whether a problem that can be solved in polynomial time on a non-deterministic machine (i.e., the problem is in NP) can also be solved in polynomial time on a deterministic machine (i.e., the problem is in P).
+
+If you can find a polynomial-time solution to an NP-complete problem, then all problems in NP can be solved in polynomial time. This shows that P = NP.
+
+If you can prove for any single NP-complete problem that it is only solvable in exponential time, then all NP-complete problems are only solvable in exponential time. This shows that P ≠ NP.
+
+So far, we don't know whether P = NP or P ≠ NP.
 
 Visit the following resources to learn more:
 
diff --git a/src/data/roadmaps/computer-science/content/p@3aM17dPKNi8tRJsW8lesI.md b/src/data/roadmaps/computer-science/content/p@3aM17dPKNi8tRJsW8lesI.md
index aeb8970f2..b74cc70dc 100644
--- a/src/data/roadmaps/computer-science/content/p@3aM17dPKNi8tRJsW8lesI.md
+++ b/src/data/roadmaps/computer-science/content/p@3aM17dPKNi8tRJsW8lesI.md
@@ -13,7 +13,3 @@ Visit the following resources to learn more:
 - [@video@NP Completeness II & Reductions](https://www.youtube.com/watch?v=e0tGC6ZQdQE&index=16&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
 - [@video@NP Completeness III](https://www.youtube.com/watch?v=fCX1BGT3wjE&index=17&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
 - [@video@NP Completeness IV](https://www.youtube.com/watch?v=NKLDp3Rch3M&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=18)
-- [@video@CSE373 2020 - Lecture 23 - NP-Completeness](https://www.youtube.com/watch?v=ItHp5laE1VE&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=23)
-- [@video@CSE373 2020 - Lecture 24 - Satisfiability](https://www.youtube.com/watch?v=inaFJeCzGxU&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=24)
-- [@video@CSE373 2020 - Lecture 25 - More NP-Completeness](https://www.youtube.com/watch?v=B-bhKxjZLlc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=25)
-- [@video@CSE373 2020 - Lecture 26 - NP-Completeness Challenge](https://www.youtube.com/watch?v=_EzetTkG_Cc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=26)
diff --git a/src/data/roadmaps/computer-science/content/public-key-cryptography@bDZ34BPm3lX06ERSE10cY.md b/src/data/roadmaps/computer-science/content/public-key-cryptography@bDZ34BPm3lX06ERSE10cY.md
index 23ecb1725..d4cbb024b 100644
--- a/src/data/roadmaps/computer-science/content/public-key-cryptography@bDZ34BPm3lX06ERSE10cY.md
+++ b/src/data/roadmaps/computer-science/content/public-key-cryptography@bDZ34BPm3lX06ERSE10cY.md
@@ -4,7 +4,7 @@ Public-key cryptography, or asymmetric cryptography, is the field of cryptograph
 
 Visit the following resources to learn more:
 
-- [@article@Public-key cryptography - Wikipedia](https://en.wikipedia.org/wiki/Public-key_cryptography)
+- [@article@Public-key Cryptography](https://en.wikipedia.org/wiki/Public-key_cryptography)
 - [@video@Public Key Cryptography - Computerphile](https://www.youtube.com/watch?v=GSIDS_lvRv4)
 - [@video@Public Key Cryptography: RSA Encryption Algorithm](https://www.youtube.com/watch?v=wXB-V_Keiu8)
 - [@feed@Explore top posts about Cryptography](https://app.daily.dev/tags/cryptography?ref=roadmapsh)
diff --git a/src/data/roadmaps/computer-science/content/python@RlKZzs44biQPgxD0tK1qx.md b/src/data/roadmaps/computer-science/content/python@RlKZzs44biQPgxD0tK1qx.md
index 2f71db3ce..356981241 100644
--- a/src/data/roadmaps/computer-science/content/python@RlKZzs44biQPgxD0tK1qx.md
+++ b/src/data/roadmaps/computer-science/content/python@RlKZzs44biQPgxD0tK1qx.md
@@ -5,8 +5,8 @@ Python is a well known programming language which is both a strongly typed and a
 Visit the following resources to learn more:
 
 - [@roadmap@Visit Dedicated Python Roadmap](https://roadmap.sh/python)
-- [@official@Python Website](https://www.python.org/)
-- [@official@Python Getting Started](https://www.python.org/about/gettingstarted/)
+- [@official@Python](https://www.python.org/)
+- [@official@Getting Started with Python](https://www.python.org/about/gettingstarted/)
 - [@article@Automate the Boring Stuff](https://automatetheboringstuff.com/)
 - [@article@Python principles - Python basics](https://pythonprinciples.com/)
 - [@article@W3Schools - Python Tutorial ](https://www.w3schools.com/python/)
diff --git a/src/data/roadmaps/computer-science/content/rust@1bDjg-KBDKRmE6f1MWY8l.md b/src/data/roadmaps/computer-science/content/rust@1bDjg-KBDKRmE6f1MWY8l.md
index e2541010f..b3a9e16b3 100644
--- a/src/data/roadmaps/computer-science/content/rust@1bDjg-KBDKRmE6f1MWY8l.md
+++ b/src/data/roadmaps/computer-science/content/rust@1bDjg-KBDKRmE6f1MWY8l.md
@@ -4,6 +4,7 @@ Rust is a modern systems programming language focusing on safety, speed, and con
 
 Visit the following resources to learn more:
 
+- [@roadmap@Visit Dedicated Rust Roadmap](https://roadmap.sh/rust)
 - [@article@The Rust Programming Language - online book](https://doc.rust-lang.org/book/)
 - [@article@Rust by Example - collection of runnable examples](https://doc.rust-lang.org/stable/rust-by-example/index.html)
 - [@article@Rust vs. Go: Why They’re Better Together](https://thenewstack.io/rust-vs-go-why-theyre-better-together/)
diff --git a/src/data/roadmaps/computer-science/content/scheduling-algorithms@Ge2nagN86ofa2y-yYR1lv.md b/src/data/roadmaps/computer-science/content/scheduling-algorithms@Ge2nagN86ofa2y-yYR1lv.md
index ec06e2d2a..35a026358 100644
--- a/src/data/roadmaps/computer-science/content/scheduling-algorithms@Ge2nagN86ofa2y-yYR1lv.md
+++ b/src/data/roadmaps/computer-science/content/scheduling-algorithms@Ge2nagN86ofa2y-yYR1lv.md
@@ -13,9 +13,3 @@ Here is the list of some of the most commonly used scheduling algorithms:
 - **Multi-level Feedback Queue Scheduling:** The processes are divided into different queues based on their priority. The process with the highest priority is allocated the CPU first. If a process is preempted, it is moved to the next queue. It is a preemptive algorithm.
 - **Highest Response Ratio Next(HRRN):** CPU is allotted to the next process which has the highest response ratio and not to the process having less burst time. It is a Non-Preemptive algorithm.
 - **Lottery Scheduling:** The process is allocated the CPU based on a lottery system. It is a preemptive algorithm.
-
-Visit the following resources to learn more : 
-- [@video@Introduction to CPU Scheduling](https://youtu.be/EWkQl0n0w5M?si=Lb-PxN_t-rDfn4JL)
-- [@article@CPU Scheduling in Operating Systems - geeksforgeeks](https://www.geeksforgeeks.org/cpu-scheduling-in-operating-systems/)
-- [@article@Lottery Scheduling for Operating Systems - geeksforgeeks](https://www.geeksforgeeks.org/lottery-process-scheduling-in-operating-system/)
-- [@article@Program for Round Robin Scheduling for the same Arrival time - geeksforgeeks](https://www.geeksforgeeks.org/program-for-round-robin-scheduling-for-the-same-arrival-time/)
diff --git a/src/data/roadmaps/computer-science/content/web-sockets@bVjI14VismTHNCyA0mEBP.md b/src/data/roadmaps/computer-science/content/web-sockets@bVjI14VismTHNCyA0mEBP.md
index f8a70b844..a8f0e3fa4 100644
--- a/src/data/roadmaps/computer-science/content/web-sockets@bVjI14VismTHNCyA0mEBP.md
+++ b/src/data/roadmaps/computer-science/content/web-sockets@bVjI14VismTHNCyA0mEBP.md
@@ -4,3 +4,5 @@ Web sockets are a bidirectional communication protocol between a client and a se
 
 Visit the following resources to learn more:
 
+- [@article@WebSockets](https://en.wikipedia.org/wiki/WebSocket)
+- [@article@Web Sockets API](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API)
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/105-pointers-and-references/raw-pointers/100-new-delete-operators.md b/src/data/roadmaps/cpp/content/105-pointers-and-references/raw-pointers/100-new-delete-operators.md
deleted file mode 100644
index d810f0f0c..000000000
--- a/src/data/roadmaps/cpp/content/105-pointers-and-references/raw-pointers/100-new-delete-operators.md
+++ /dev/null
@@ -1,47 +0,0 @@
-# Raw Pointers and `new` and `delete` operators
-
-Raw pointers in C++ are low-level constructs that directly hold a memory address. They can be used for manually allocating memory, creating dynamic arrays, and passing values efficiently, among other things.
-
-## `new` Operator
-
-The `new` operator is used to allocate memory on the heap. The memory allocated using `new` remains available until you explicitly deallocate it using the corresponding `delete` operator.
-
-Here's an example of using the `new` operator:
-
-```cpp
-int* ptr = new int; // Dynamically allocates an int on the heap
-*ptr = 42; // Assigns the value 42 to the allocated int
-```
-
-## `delete` Operator
-
-The `delete` operator is used to deallocate memory that has been allocated using `new`. After memory is deallocated, it's available to be reallocated for other purposes. Failing to properly deallocate memory can lead to memory leaks.
-
-Here's an example of using the `delete` operator:
-
-```cpp
-int* ptr = new int; // Dynamically allocates an int on the heap
-*ptr = 42; // Assigns the value 42 to the allocated int
-
-delete ptr; // Deallocates the memory assigned to ptr
-```
-
-## `new[]` and `delete[]` Operators
-
-The `new[]` and `delete[]` operators are used for allocating and deallocating memory for an array of objects. The syntax for `new[]` and `delete[]` is very similar to that of `new` and `delete`.
-
-Here's an example of using the `new[]` and `delete[]` operators:
-
-```cpp
-int n = 10;
-int* arr = new int[n]; // Dynamically allocates an array of 10 integers on the heap
-
-// Set some values in the array
-for (int i = 0; i < n; i++) {
-  arr[i] = i;
-}
-
-delete[] arr; // Deallocates the memory assigned to the array
-```
-
-In summary, raw pointers, and `new` and `delete` operators allow manual memory management in C++, providing control over allocation and deallocation. Make sure to always deallocate memory allocated with `new` or `new[]`, to avoid memory leaks in your programs.
diff --git a/src/data/roadmaps/cpp/content/105-pointers-and-references/raw-pointers/101-memory-leakage.md b/src/data/roadmaps/cpp/content/105-pointers-and-references/raw-pointers/101-memory-leakage.md
deleted file mode 100644
index c14976913..000000000
--- a/src/data/roadmaps/cpp/content/105-pointers-and-references/raw-pointers/101-memory-leakage.md
+++ /dev/null
@@ -1,28 +0,0 @@
-# Memory Leakage
-
-Memory leakage occurs when a program allocates memory in the heap but does not release the memory back to the operating system when it is no longer needed. Over time, this leads to exhaustion of available memory, resulting in low system performance or crashes.
-
-In C++, when you use raw pointers, you need to manage the memory allocation and deallocation manually. In many cases, you will use the `new` keyword to allocate memory for an object in the heap and use `delete` keyword to deallocate that memory when it's no longer needed. Forgetting to do this can cause memory leaks.
-
-Here's an example:
-
-```cpp
-void create_memory_leak() {
-    int* ptr = new int[100]; // Allocating memory in the heap for an array of integers
-    // Some code...
-    // Code to deallocate the memory is missing: delete[] ptr;
-} // ptr goes out of scope, memory block allocated is not deallocated, causing a memory leak.
-```
-
-To avoid memory leaks, you should always ensure that memory is deallocated before a pointer goes out of scope or is reassigned. Some ways to achieve this include using the C++ smart pointers (`std::unique_ptr`, `std::shared_ptr`), RAII (Resource Acquisition Is Initialization) techniques, and containers from the C++ standard library that manage memory allocation internally (e.g., `std::vector`, `std::string`).
-
-For example, this code will not have a memory leak:
-
-```cpp
-#include <memory>
-
-void no_memory_leak() {
-    std::shared_ptr<int[]> ptr = std::make_shared<int[]>(100); // Allocating memory in the heap for an array of integers using shared_ptr
-    // Some code...
-} // shared_ptr goes out of scope and it will automatically deallocate the memory block assigned to it.
-```
diff --git a/src/data/roadmaps/cpp/content/105-pointers-and-references/raw-pointers/index.md b/src/data/roadmaps/cpp/content/105-pointers-and-references/raw-pointers/index.md
deleted file mode 100644
index b51d70e7f..000000000
--- a/src/data/roadmaps/cpp/content/105-pointers-and-references/raw-pointers/index.md
+++ /dev/null
@@ -1 +0,0 @@
-# Raw pointers
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/105-pointers-and-references/smart-pointers/100-weak-ptr.md b/src/data/roadmaps/cpp/content/105-pointers-and-references/smart-pointers/100-weak-ptr.md
deleted file mode 100644
index 5f87a575c..000000000
--- a/src/data/roadmaps/cpp/content/105-pointers-and-references/smart-pointers/100-weak-ptr.md
+++ /dev/null
@@ -1,52 +0,0 @@
-# Weak Pointer
-
-A `weak_ptr` is a type of smart pointer in C++ that adds a level of indirection and safety to a raw pointer. It is mainly used to break reference cycles in cases where two objects have shared pointers to each other, or when you need a non-owning reference to an object that is managed by a `shared_ptr`.
-
-A `weak_ptr` does not increase the *ownership* reference count of the object it points to, which is a key difference between `weak_ptr` and `shared_ptr`. The control block associated with the object maintains two counts: one for the number of `shared_ptr`s (ownership count) and another for the number of `weak_ptr`s (weak count). The existence of `weak_ptr`s does not prevent the object from being deleted; the object is destroyed once the last `shared_ptr` that owns it is destroyed or reset, even if `weak_ptr`s are still referencing the object. However, the control block itself is not deallocated until both the ownership count reaches zero and the weak count also reaches zero, allowing `weak_ptr`s to safely detect whether the object has already been deleted.
-
-To use a `weak_ptr`, you must convert it to a `shared_ptr` using the `lock()` function, which tries to create a new `shared_ptr` that shares ownership of the object. If successful, the object's reference count is increased and you can use the returned `shared_ptr` to safely access the object.
-
-Here's an example of using `weak_ptr`:
-
-```cpp
-#include <iostream>
-#include <memory>
-
-class MyClass {
-public:
-    void DoSomething() {
-        std::cout << "Doing something...\n";
-    }
-};
-
-int main() {
-    std::weak_ptr<MyClass> weak;
-
-    {
-        std::shared_ptr<MyClass> shared = std::make_shared<MyClass>();
-        weak = shared;
-
-        if(auto sharedFromWeak = weak.lock()) {
-            sharedFromWeak->DoSomething(); // Safely use the object
-            std::cout << "Shared uses count: " << sharedFromWeak.use_count() << '\n'; // 2
-        }
-    }
-
-    // shared goes out of scope and the MyClass object is destroyed
-
-    if(auto sharedFromWeak = weak.lock()) {
-        // This block will not be executed because the object is destroyed
-    }
-    else {
-        std::cout << "Object has been destroyed\n";
-    }
-
-    return 0;
-}
-```
-
-In this example, we create a `shared_ptr` named `shared` that manages a `MyClass` object. By assigning it to a `weak_ptr` named `weak`, we store a non-owning reference to the object. Inside the inner scope, we create a new `shared_ptr` named `sharedFromWeak` using `weak.lock()` to safely use the object. After the inner scope, the `MyClass` object is destroyed since `shared` goes out of scope, and any further attempt to create a `shared_ptr` from `weak` will fail as the object is already destroyed.
-
-Learn more from the following resources:
-
-- [@article@CPP Reference](https://en.cppreference.com/w/cpp/memory/weak_ptr)
diff --git a/src/data/roadmaps/cpp/content/105-pointers-and-references/smart-pointers/101-shared-ptr.md b/src/data/roadmaps/cpp/content/105-pointers-and-references/smart-pointers/101-shared-ptr.md
deleted file mode 100644
index 7f9962a83..000000000
--- a/src/data/roadmaps/cpp/content/105-pointers-and-references/smart-pointers/101-shared-ptr.md
+++ /dev/null
@@ -1,50 +0,0 @@
-# Shared Pointer
-
-A `shared_ptr` is a type of smart pointer in C++ that allows multiple pointers to share ownership of a dynamically allocated object. The object will be automatically deallocated only when the last `shared_ptr` that points to it is destroyed.
-
-When using a `shared_ptr`, the reference counter is automatically incremented every time a new pointer is created, and decremented when each pointer goes out of scope. Once the reference counter reaches zero, the system will clean up the memory.
-
-## Code Example
-
-Here's an example of how to use `shared_ptr`:
-
-```cpp
-#include <iostream>
-#include <memory>
-
-class MyClass {
-public:
-    MyClass() { std::cout << "Constructor is called." << std::endl; }
-    ~MyClass() { std::cout << "Destructor is called." << std::endl; }
-};
-
-int main() {
-    // create a shared pointer to manage the MyClass object
-    std::shared_ptr<MyClass> ptr1(new MyClass());
-    
-    {
-        // create another shared pointer and initialize it with the previously created pointer
-        std::shared_ptr<MyClass> ptr2 = ptr1;
-
-        std::cout << "Inside the inner scope." << std::endl;
-        // both pointers share the same object, and the reference counter has been increased to 2
-    }
-
-    std::cout << "Outside the inner scope." << std::endl;
-    // leaving the inner scope will destroy ptr2, and the reference counter is decremented to 1
-    
-    // the main function returns, ptr1 goes out of scope, and the reference counter becomes 0
-    // this causes the MyClass object to be deleted and the destructor is called
-}
-```
-
-Output:
-
-```
-Constructor is called.
-Inside the inner scope.
-Outside the inner scope.
-Destructor is called.
-```
-
-In this example, `ptr1` and `ptr2` share ownership of the same object. The object is only destroyed when both pointers go out of scope and the reference counter becomes zero.
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/105-pointers-and-references/smart-pointers/102-uniqe-ptr.md b/src/data/roadmaps/cpp/content/105-pointers-and-references/smart-pointers/102-uniqe-ptr.md
deleted file mode 100644
index 709f19c26..000000000
--- a/src/data/roadmaps/cpp/content/105-pointers-and-references/smart-pointers/102-uniqe-ptr.md
+++ /dev/null
@@ -1,66 +0,0 @@
-# Unique Pointer (`unique_ptr`)
-
-`std::unique_ptr` is a smart pointer provided by the C++ Standard Library. It is a template class that is used for managing single objects or arrays.
-
-`unique_ptr` works on the concept of *exclusive ownership* - meaning only one `unique_ptr` is allowed to own an object at a time. This ownership can be transferred or moved, but it cannot be shared or copied.
-
-This concept helps to prevent issues like dangling pointers, reduce memory leaks, and eliminates the need for manual memory management. When the `unique_ptr` goes out of scope, it automatically deletes the object it owns.
-
-Let's take a look at some basic examples of using `unique_ptr`:
-
-## Creating a unique_ptr
-
-```cpp
-#include <iostream>
-#include <memory>
-
-int main() {
-    std::unique_ptr<int> p1(new int(5)); // Initialize with pointer to a new integer
-    std::unique_ptr<int> p2 = std::make_unique<int>(10); // Preferred method (C++14 onwards)
-
-    std::cout << *p1 << ", " << *p2 << std::endl;
-    return 0;
-}
-```
-
-## Transferring Ownership
-
-```cpp
-#include <iostream>
-#include <memory>
-
-int main() {
-    std::unique_ptr<int> p1(new int(5));
-
-    std::unique_ptr<int> p2 = std::move(p1); // Ownership is transferred from p1 to p2
-
-    if (p1) {
-        std::cout << "p1 owns the object" << std::endl;
-    } else if (p2) {
-        std::cout << "p2 owns the object" << std::endl;
-    }
-
-    return 0;
-}
-```
-
-## Using unique_ptr with Custom Deleters
-
-```cpp
-#include <iostream>
-#include <memory>
-
-struct MyDeleter {
-    void operator()(int* ptr) {
-        std::cout << "Custom Deleter: Deleting pointer" << std::endl;
-        delete ptr;
-    }
-};
-
-int main() {
-    std::unique_ptr<int, MyDeleter> p1(new int(5), MyDeleter());
-    return 0; // Custom Deleter will be called when p1 goes out of scope
-}
-```
-
-Remember that since unique_ptr has exclusive ownership, you cannot use it when you need shared access to an object. For such cases, you can use `std::shared_ptr`.
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/105-pointers-and-references/smart-pointers/index.md b/src/data/roadmaps/cpp/content/105-pointers-and-references/smart-pointers/index.md
deleted file mode 100644
index 13048aff1..000000000
--- a/src/data/roadmaps/cpp/content/105-pointers-and-references/smart-pointers/index.md
+++ /dev/null
@@ -1 +0,0 @@
-# Smart pointers
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/107-structures-and-classes/101-oop/100-static-polymorphism/overloading-functions.md b/src/data/roadmaps/cpp/content/107-structures-and-classes/101-oop/100-static-polymorphism/overloading-functions.md
deleted file mode 100644
index 8fdbf507a..000000000
--- a/src/data/roadmaps/cpp/content/107-structures-and-classes/101-oop/100-static-polymorphism/overloading-functions.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# Function Overloading
-
-Function overloading is a type of static polymorphism in C++ where multiple functions with the same name but different sets of parameters are defined in the same scope. This allows you to use the same function name for multiple tasks by providing different arguments while calling the function. The appropriate function to call is determined during compile-time based on the number and types of the arguments passed.
-
-To overload a function, simply define another function with the same name but a different set of parameters. The compiler will automatically choose the correct function to call based on the provided arguments.
-
-## Examples
-
-Here's an example illustrating function overloading:
-
-```cpp
-#include <iostream>
-
-void print(int num) {
-    std::cout << "Printing int: " << num << std::endl;
-}
-
-void print(double num) {
-    std::cout << "Printing double: " << num << std::endl;
-}
-
-void print(char const *str) {
-    std::cout << "Printing string: " << str << std::endl;
-}
-
-int main() {
-    print(5);
-    print(3.14);
-    print("Hello, world!");
-
-    return 0;
-}
-```
-
-In this example, three overloaded functions named `print` are defined. They each take a different type of argument: `int`, `double`, and `char const *`. When calling `print()` with different arguments like `5`, `3.14`, or `"Hello, world!"`, the appropriate function is chosen based on the type of the provided argument.
-
-The output of this program would be:
-
-```
-Printing int: 5
-Printing double: 3.14
-Printing string: Hello, world!
-```
-
-Keep in mind that the number of parameters and their types should be different for two functions to be overloaded.
diff --git a/src/data/roadmaps/cpp/content/107-structures-and-classes/101-oop/101-dynamic-polymorphism/virtual-methods.md b/src/data/roadmaps/cpp/content/107-structures-and-classes/101-oop/101-dynamic-polymorphism/virtual-methods.md
deleted file mode 100644
index 372952d81..000000000
--- a/src/data/roadmaps/cpp/content/107-structures-and-classes/101-oop/101-dynamic-polymorphism/virtual-methods.md
+++ /dev/null
@@ -1,65 +0,0 @@
-# Virtual Methods
-
-Virtual methods are a key aspect of dynamic polymorphism in C++. They allow subclass methods to override the methods of their base class, so the appropriate method is called depending on the actual type of an object at runtime.
-
-To declare a method as virtual, simply use the `virtual` keyword in the method's declaration in the base class. This tells the compiler that the method should be treated as a virtual method, allowing it to be overridden by derived classes.
-
-## Code Example
-
-Here's an example demonstrating virtual methods:
-
-```cpp
-#include <iostream>
-
-// Base class
-class Shape {
-public:
-    virtual double area() const {
-        return 0;
-    }
-};
-
-// Derived class
-class Circle : public Shape {
-public:
-    Circle(double r) : radius(r) {}
-
-    // Override the base class method
-    double area() const override {
-        return 3.14 * radius * radius;
-    }
-
-private:
-    double radius;
-};
-
-// Derived class
-class Rectangle : public Shape {
-public:
-    Rectangle(double w, double h) : width(w), height(h) {}
-
-    // Override the base class method
-    double area() const override {
-        return width * height;
-    }
-
-private:
-    double width;
-    double height;
-};
-
-int main() {
-    Circle c(5);
-    Rectangle r(4, 6);
-
-    Shape* shape = &c;
-    std::cout << "Circle's area: " << shape->area() << std::endl;
-
-    shape = &r;
-    std::cout << "Rectangle's area: " << shape->area() << std::endl;
-
-    return 0;
-}
-```
-
-In this example, we define a base class `Shape` that has a virtual method `area`. This method is then overridden by the derived classes `Circle` and `Rectangle`. By using a virtual method and a base class pointer to the derived objects, we can invoke the appropriate `area` method based on the actual object type at runtime.
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/107-structures-and-classes/101-oop/101-dynamic-polymorphism/virtual-tables.md b/src/data/roadmaps/cpp/content/107-structures-and-classes/101-oop/101-dynamic-polymorphism/virtual-tables.md
deleted file mode 100644
index b89591e63..000000000
--- a/src/data/roadmaps/cpp/content/107-structures-and-classes/101-oop/101-dynamic-polymorphism/virtual-tables.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# Virtual Tables
-
-Virtual Tables (or Vtable) are a mechanism used by C++ compilers to support dynamic polymorphism. In dynamic polymorphism, the appropriate function is called at runtime, depending on the actual object type.
-
-When a class contains a virtual function, the compiler creates a virtual table for that class. This table contains function pointers to the virtual functions defined in the class. Each object of that class has a pointer to its virtual table (_vptr_, virtual pointer), which is automatically initialized by the compiler during object construction.
-
-## Example
-
-Let's consider the following example:
-
-```cpp
-class Base {
-public:
-    virtual void function1() {
-        std::cout << "Base::function1" << std::endl;
-    }
-
-    virtual void function2() {
-        std::cout << "Base::function2" << std::endl;
-    }
-};
-
-class Derived : public Base {
-public:
-    void function1() override {
-        std::cout << "Derived::function1" << std::endl;
-    }
-
-    void function3() {
-        std::cout << "Derived::function3" << std::endl;
-    }
-};
-
-int main() {
-    Base* obj = new Derived(); // create a Derived object and assign a pointer of type Base*
-    obj->function1(); // calls Derived::function1, due to dynamic polymorphism
-    obj->function2(); // calls Base::function2
-
-    delete obj;
-    return 0;
-}
-```
-
-In this example, when a `Derived` object is created, the compiler generates a Vtable for `Derived` class, containing pointers to its virtual functions:
-
-- `Derived::function1` (overridden from `Base`)
-- `Base::function2` (inherits from Base)
-
-The `_vptr_` pointer in the `Derived` object points to this Vtable. When the `function1` is called on the `Base` pointer pointing to the `Derived` object, the function pointer in the Vtable is used to call the correct function (in this case, `Derived::function1`). Similarly, the call to `function2` calls `Base::function2`, since it's the function pointer stored in the Vtable for `Derived` class.
-
-Note that `function3` is not part of the Vtable, as it is not a virtual function.
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/108-exception-handling/100-exceptions/100-access-violations.md b/src/data/roadmaps/cpp/content/access-violations@y4-P4UNC--rE1vni8HdTn.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/108-exception-handling/100-exceptions/100-access-violations.md
rename to src/data/roadmaps/cpp/content/access-violations@y4-P4UNC--rE1vni8HdTn.md
diff --git a/src/data/roadmaps/cpp/content/110-stl/102-algorithms.md b/src/data/roadmaps/cpp/content/algorithms@whyj6Z4RXFsVQYRfYYn7B.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/110-stl/102-algorithms.md
rename to src/data/roadmaps/cpp/content/algorithms@whyj6Z4RXFsVQYRfYYn7B.md
diff --git a/src/data/roadmaps/cpp/content/109-language-concepts/103-adl.md b/src/data/roadmaps/cpp/content/argument-dependent-lookup-adl@YSWN7nS8vA9nMldSUrZRT.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/109-language-concepts/103-adl.md
rename to src/data/roadmaps/cpp/content/argument-dependent-lookup-adl@YSWN7nS8vA9nMldSUrZRT.md
diff --git a/src/data/roadmaps/cpp/content/102-basic-operations/100-arithmetic-operators.md b/src/data/roadmaps/cpp/content/arithmetic-operators@8aOSpZLWwZv_BEYiurhyR.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/102-basic-operations/100-arithmetic-operators.md
rename to src/data/roadmaps/cpp/content/arithmetic-operators@8aOSpZLWwZv_BEYiurhyR.md
diff --git a/src/data/roadmaps/cpp/content/109-language-concepts/100-auto.md b/src/data/roadmaps/cpp/content/auto-automatic-type-deduction@CG01PTVgHtjfKvsJkJLGl.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/109-language-concepts/100-auto.md
rename to src/data/roadmaps/cpp/content/auto-automatic-type-deduction@CG01PTVgHtjfKvsJkJLGl.md
diff --git a/src/data/roadmaps/cpp/content/102-basic-operations/index.md b/src/data/roadmaps/cpp/content/basic-operations@kl2JI_Wl47c5r8SYzxvCq.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/102-basic-operations/index.md
rename to src/data/roadmaps/cpp/content/basic-operations@kl2JI_Wl47c5r8SYzxvCq.md
diff --git a/src/data/roadmaps/cpp/content/102-basic-operations/103-bitwise.md b/src/data/roadmaps/cpp/content/bitwise-operators@zE4iPSq2KsrDSByQ0sGK_.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/102-basic-operations/103-bitwise.md
rename to src/data/roadmaps/cpp/content/bitwise-operators@zE4iPSq2KsrDSByQ0sGK_.md
diff --git a/src/data/roadmaps/cpp/content/boost@1d7h5P1Q0RVHryKPVogQy.md b/src/data/roadmaps/cpp/content/boost@1d7h5P1Q0RVHryKPVogQy.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/cpp/content/116-build-systems/index.md b/src/data/roadmaps/cpp/content/build-systems@jVXFCo6puMxJ_ifn_uwim.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/116-build-systems/index.md
rename to src/data/roadmaps/cpp/content/build-systems@jVXFCo6puMxJ_ifn_uwim.md
diff --git a/src/data/roadmaps/cpp/content/113-standards/104-cpp0x.md b/src/data/roadmaps/cpp/content/c-0x@PPg0V5EzGBeJsysg1215V.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/113-standards/104-cpp0x.md
rename to src/data/roadmaps/cpp/content/c-0x@PPg0V5EzGBeJsysg1215V.md
diff --git a/src/data/roadmaps/cpp/content/113-standards/100-cpp11-14.md b/src/data/roadmaps/cpp/content/c-11--14@T6rCTv9Dxkm-tEA-l9XEv.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/113-standards/100-cpp11-14.md
rename to src/data/roadmaps/cpp/content/c-11--14@T6rCTv9Dxkm-tEA-l9XEv.md
diff --git a/src/data/roadmaps/cpp/content/113-standards/101-cpp17.md b/src/data/roadmaps/cpp/content/c-17@R2-qWGUxsTOeSHRuUzhd2.md
similarity index 96%
rename from src/data/roadmaps/cpp/content/113-standards/101-cpp17.md
rename to src/data/roadmaps/cpp/content/c-17@R2-qWGUxsTOeSHRuUzhd2.md
index 549c39db7..41eea2ef4 100644
--- a/src/data/roadmaps/cpp/content/113-standards/101-cpp17.md
+++ b/src/data/roadmaps/cpp/content/c-17@R2-qWGUxsTOeSHRuUzhd2.md
@@ -5,7 +5,7 @@ C++17, also known as C++1z, is the version of the C++ programming language publi
 ## Key Features:
 - If-init-statement: Introduces a new syntax for writing conditions with scope inside if and switch statements.
 ```cpp
-if(auto it = map.find(key); it != map.end())
+if (auto it = map.find(key); it != map.end())
 {
     // Use it
 }
diff --git a/src/data/roadmaps/cpp/content/113-standards/102-cpp20.md b/src/data/roadmaps/cpp/content/c-20@o3no4a5_iMFzEAGs56-BJ.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/113-standards/102-cpp20.md
rename to src/data/roadmaps/cpp/content/c-20@o3no4a5_iMFzEAGs56-BJ.md
diff --git a/src/data/roadmaps/cpp/content/100-introduction/102-c-vs-cpp.md b/src/data/roadmaps/cpp/content/c-vs-c@2Ag0t3LPryTF8khHLRfy-.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/100-introduction/102-c-vs-cpp.md
rename to src/data/roadmaps/cpp/content/c-vs-c@2Ag0t3LPryTF8khHLRfy-.md
diff --git a/src/data/roadmaps/cpp/content/catch2@s13jQuaC6gw0Lab3Cbyy6.md b/src/data/roadmaps/cpp/content/catch2@s13jQuaC6gw0Lab3Cbyy6.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/cpp/content/116-build-systems/100-cmake.md b/src/data/roadmaps/cpp/content/cmake@ysnXvSHGBMMozBJyXpHl5.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/116-build-systems/100-cmake.md
rename to src/data/roadmaps/cpp/content/cmake@ysnXvSHGBMMozBJyXpHl5.md
diff --git a/src/data/roadmaps/cpp/content/101-setting-up/101-code-editors.md b/src/data/roadmaps/cpp/content/code-editors--ides@ew0AfyadpXPRO0ZY3Z19k.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/101-setting-up/101-code-editors.md
rename to src/data/roadmaps/cpp/content/code-editors--ides@ew0AfyadpXPRO0ZY3Z19k.md
diff --git a/src/data/roadmaps/cpp/content/115-compilers/100-stages.md b/src/data/roadmaps/cpp/content/compiler-stages@DVckzBUMgk_lWThVkLyAT.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/115-compilers/100-stages.md
rename to src/data/roadmaps/cpp/content/compiler-stages@DVckzBUMgk_lWThVkLyAT.md
diff --git a/src/data/roadmaps/cpp/content/115-compilers/101-features.md b/src/data/roadmaps/cpp/content/compilers-and-features@hSG6Aux39X0cXi6ADy2al.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/115-compilers/101-features.md
rename to src/data/roadmaps/cpp/content/compilers-and-features@hSG6Aux39X0cXi6ADy2al.md
diff --git a/src/data/roadmaps/cpp/content/115-compilers/index.md b/src/data/roadmaps/cpp/content/compilers@FTMHsUiE8isD_OVZr62Xc.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/115-compilers/index.md
rename to src/data/roadmaps/cpp/content/compilers@FTMHsUiE8isD_OVZr62Xc.md
diff --git a/src/data/roadmaps/cpp/content/117-package-managers/102-conan.md b/src/data/roadmaps/cpp/content/conan@ky_UqizToTZHC_b77qFi2.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/117-package-managers/102-conan.md
rename to src/data/roadmaps/cpp/content/conan@ky_UqizToTZHC_b77qFi2.md
diff --git a/src/data/roadmaps/cpp/content/109-language-concepts/101-type-casting/101-const-cast.md b/src/data/roadmaps/cpp/content/const_cast@5g22glc97siQOcTkHbwan.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/109-language-concepts/101-type-casting/101-const-cast.md
rename to src/data/roadmaps/cpp/content/const_cast@5g22glc97siQOcTkHbwan.md
diff --git a/src/data/roadmaps/cpp/content/110-stl/105-ccontainers.md b/src/data/roadmaps/cpp/content/containers@1pydf-SR0QUfVNuBEyvzc.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/110-stl/105-ccontainers.md
rename to src/data/roadmaps/cpp/content/containers@1pydf-SR0QUfVNuBEyvzc.md
diff --git a/src/data/roadmaps/cpp/content/control-flow--statements@s5Gs4yF9TPh-psYmtPzks.md b/src/data/roadmaps/cpp/content/control-flow--statements@s5Gs4yF9TPh-psYmtPzks.md
new file mode 100644
index 000000000..8b772289d
--- /dev/null
+++ b/src/data/roadmaps/cpp/content/control-flow--statements@s5Gs4yF9TPh-psYmtPzks.md
@@ -0,0 +1 @@
+# Control Flow & Statements
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/112-idioms/105-copy-swap.md b/src/data/roadmaps/cpp/content/copy-and-swap@lxAzI42jQdaofzQ5MXebG.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/112-idioms/105-copy-swap.md
rename to src/data/roadmaps/cpp/content/copy-and-swap@lxAzI42jQdaofzQ5MXebG.md
diff --git a/src/data/roadmaps/cpp/content/112-idioms/106-copy-write.md b/src/data/roadmaps/cpp/content/copy-on-write@O2Du5gHHxFxAI2u5uO8wu.md
similarity index 97%
rename from src/data/roadmaps/cpp/content/112-idioms/106-copy-write.md
rename to src/data/roadmaps/cpp/content/copy-on-write@O2Du5gHHxFxAI2u5uO8wu.md
index 9aa6e53ac..df24f912c 100644
--- a/src/data/roadmaps/cpp/content/112-idioms/106-copy-write.md
+++ b/src/data/roadmaps/cpp/content/copy-on-write@O2Du5gHHxFxAI2u5uO8wu.md
@@ -20,7 +20,7 @@ public:
     // Make a copy only if we want to modify the data.
     void write(const std::string &str) {
         // Check if there's more than one reference.
-        if(!data.unique()) {
+        if (data.use_count() > 1) {
             data = std::make_shared<std::string>(*data);
             std::cout << "Copy is actually made for writing." << std::endl;
         }
diff --git a/src/data/roadmaps/cpp/content/112-idioms/102-crtp.md b/src/data/roadmaps/cpp/content/crtp@ttt-yeIi4BPWrgvW324W7.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/112-idioms/102-crtp.md
rename to src/data/roadmaps/cpp/content/crtp@ttt-yeIi4BPWrgvW324W7.md
diff --git a/src/data/roadmaps/cpp/content/104-data-types/index.md b/src/data/roadmaps/cpp/content/data-types@MwznA4qfpNlv6sqSNjPZi.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/104-data-types/index.md
rename to src/data/roadmaps/cpp/content/data-types@MwznA4qfpNlv6sqSNjPZi.md
diff --git a/src/data/roadmaps/cpp/content/110-stl/103-date-time.md b/src/data/roadmaps/cpp/content/date--time@yGvE6eHKlPMBB6rde0llR.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/110-stl/103-date-time.md
rename to src/data/roadmaps/cpp/content/date--time@yGvE6eHKlPMBB6rde0llR.md
diff --git a/src/data/roadmaps/cpp/content/114-debuggers/index.md b/src/data/roadmaps/cpp/content/debuggers@qmHs6_BzND_xpMmls5YUH.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/114-debuggers/index.md
rename to src/data/roadmaps/cpp/content/debuggers@qmHs6_BzND_xpMmls5YUH.md
diff --git a/src/data/roadmaps/cpp/content/114-debuggers/101-debugger-symbols.md b/src/data/roadmaps/cpp/content/debugging-symbols@sR_FxGZHoMCV9Iv7z2_SX.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/114-debuggers/101-debugger-symbols.md
rename to src/data/roadmaps/cpp/content/debugging-symbols@sR_FxGZHoMCV9Iv7z2_SX.md
diff --git a/src/data/roadmaps/cpp/content/107-structures-and-classes/102-multiple-inheritance/100-diamond-inheritance.md b/src/data/roadmaps/cpp/content/diamond-inheritance@ofwdZm05AUqCIWmfgGHk8.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/107-structures-and-classes/102-multiple-inheritance/100-diamond-inheritance.md
rename to src/data/roadmaps/cpp/content/diamond-inheritance@ofwdZm05AUqCIWmfgGHk8.md
diff --git a/src/data/roadmaps/cpp/content/107-structures-and-classes/101-oop/101-dynamic-polymorphism/index.md b/src/data/roadmaps/cpp/content/dynamic-polymorphism@7h1VivjCPDwriL7FirtFv.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/107-structures-and-classes/101-oop/101-dynamic-polymorphism/index.md
rename to src/data/roadmaps/cpp/content/dynamic-polymorphism@7h1VivjCPDwriL7FirtFv.md
diff --git a/src/data/roadmaps/cpp/content/104-data-types/101-dynamic-typing/index.md b/src/data/roadmaps/cpp/content/dynamic-typing@i0EAFEUB-F0wBJWOtrl1A.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/104-data-types/101-dynamic-typing/index.md
rename to src/data/roadmaps/cpp/content/dynamic-typing@i0EAFEUB-F0wBJWOtrl1A.md
diff --git a/src/data/roadmaps/cpp/content/109-language-concepts/101-type-casting/102-dynamic-cast.md b/src/data/roadmaps/cpp/content/dynamic_cast@4BdFcuQ5KNW94cu2jz-vE.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/109-language-concepts/101-type-casting/102-dynamic-cast.md
rename to src/data/roadmaps/cpp/content/dynamic_cast@4BdFcuQ5KNW94cu2jz-vE.md
diff --git a/src/data/roadmaps/cpp/content/112-idioms/104-erase-remove.md b/src/data/roadmaps/cpp/content/erase-remove@YvmjrZSAOmjhVPo05MJqN.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/112-idioms/104-erase-remove.md
rename to src/data/roadmaps/cpp/content/erase-remove@YvmjrZSAOmjhVPo05MJqN.md
diff --git a/src/data/roadmaps/cpp/content/108-exception-handling/index.md b/src/data/roadmaps/cpp/content/exception-handling@B2SGBENzUMl0SAjG4j91V.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/108-exception-handling/index.md
rename to src/data/roadmaps/cpp/content/exception-handling@B2SGBENzUMl0SAjG4j91V.md
diff --git a/src/data/roadmaps/cpp/content/108-exception-handling/100-exceptions/index.md b/src/data/roadmaps/cpp/content/exceptions@NJud5SXBAUZ6Sr78kZ7jx.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/108-exception-handling/100-exceptions/index.md
rename to src/data/roadmaps/cpp/content/exceptions@NJud5SXBAUZ6Sr78kZ7jx.md
diff --git a/src/data/roadmaps/cpp/content/108-exception-handling/101-exit-codes.md b/src/data/roadmaps/cpp/content/exit-codes@oWygnpwHq2poXQMTTSCpl.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/108-exception-handling/101-exit-codes.md
rename to src/data/roadmaps/cpp/content/exit-codes@oWygnpwHq2poXQMTTSCpl.md
diff --git a/src/data/roadmaps/cpp/content/fmt@1CqQgmHDeo1HlPdpUJS7H.md b/src/data/roadmaps/cpp/content/fmt@1CqQgmHDeo1HlPdpUJS7H.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/cpp/content/102-basic-operations/102-loops.md b/src/data/roadmaps/cpp/content/for--while--do-while-loops@_IP_e1K9LhNHilYTDh7L5.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/102-basic-operations/102-loops.md
rename to src/data/roadmaps/cpp/content/for--while--do-while-loops@_IP_e1K9LhNHilYTDh7L5.md
diff --git a/src/data/roadmaps/cpp/content/106-structuring-codebase/101-code-splitting/100-forward-declaration.md b/src/data/roadmaps/cpp/content/forward-declaration@ZHjU60uzJTezADRhDTESG.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/106-structuring-codebase/101-code-splitting/100-forward-declaration.md
rename to src/data/roadmaps/cpp/content/forward-declaration@ZHjU60uzJTezADRhDTESG.md
diff --git a/src/data/roadmaps/cpp/content/frameworks/100-gtest.md b/src/data/roadmaps/cpp/content/frameworks/100-gtest.md
deleted file mode 100644
index ceb766e8f..000000000
--- a/src/data/roadmaps/cpp/content/frameworks/100-gtest.md
+++ /dev/null
@@ -1,75 +0,0 @@
-# Google Test (gtest)
-
-Google Test, also known as gtest or googletest, is a C++ testing framework developed by Google. It provides a user-friendly API for writing test cases and is designed for use in a range of applications, from simple unit tests to complex system-level tests. 
-
-## Getting Started with Google Test
-
-To use Google Test in your project, follow these steps:
-
-- Download the source code from the [GoogleTest GitHub repository](https://github.com/google/googletest).
-- Build and install Google Test on your system. Instructions for various platforms can be found in the [README](https://github.com/google/googletest/blob/main/googletest/README.md) file.
-- Include the necessary headers and link against the Google Test library in your project.
-
-## Writing a Test with Google Test
-
-Here's an example of how to write a simple test using Google Test:
-
-- **Include the necessary headers**
-   ```cpp
-   #include "gtest/gtest.h"
-   ```
-
-- **Write the functions you want to test**
-
-   Suppose we have a simple function to test:
-   ```cpp
-   int add(int a, int b) {
-      return a + b;
-   }
-   ```
-
-- **Write the test cases**
-
-   To create a test case, use the `TEST()` macro, which takes two arguments: the test suite name and the test case name.
-
-   ```cpp
-   // Test the 'add' function.
-   TEST(AdditionTest, PositiveNumbers) {
-      EXPECT_EQ(3, add(1, 2));
-      EXPECT_EQ(5, add(2, 3));
-   }
-
-   TEST(AdditionTest, NegativeNumbers) {
-      EXPECT_EQ(-3, add(-1, -2));
-      EXPECT_EQ(-5, add(-2, -3));
-   }
-   ```
-
-- **Write a `main()` function**
-
-   In order to run the tests, include a `main()` function that initializes Google Test and runs the tests.
-
-   ```cpp
-   int main(int argc, char **argv) {
-      ::testing::InitGoogleTest(&argc, argv);
-      return RUN_ALL_TESTS();
-   }
-   ```
-
-- **Compile and run the tests**
-
-   Compile your test program with the Google Test library and run the test executable.
-
-## More Features
-
-Google Test offers a wide range of features to make testing easier, such as:
-
-- **Test Fixtures**: Test fixtures allow you to reuse the same set of objects for multiple tests. You can define a test fixture by creating a class that inherits from `::testing::Test` and writing setup and teardown methods.
-
-- **Assertions**: Google Test provides a variety of assertion macros to help you verify your code's behavior. Some common ones include `EXPECT_EQ`, `EXPECT_TRUE`, `EXPECT_FALSE`, `ASSERT_EQ`, `ASSERT_TRUE`, and `ASSERT_FALSE`.
-
-- **Parameterized Tests**: Google Test supports parameterized tests, allowing you to run the same test with different inputs easily.
-
-- **Death Tests**: Google Test allows you to write tests that verify if your code terminates correctly or with the expected error message.
-
-For more information about Google Test and its features, refer to the [official documentation](https://github.com/google/googletest/blob/main/docs/primer.md).
diff --git a/src/data/roadmaps/cpp/content/frameworks/101-qt.md b/src/data/roadmaps/cpp/content/frameworks/101-qt.md
deleted file mode 100644
index bdf74781e..000000000
--- a/src/data/roadmaps/cpp/content/frameworks/101-qt.md
+++ /dev/null
@@ -1,37 +0,0 @@
-# Qt Framework
-
-Qt is an open-source, cross-platform framework for creating high-performance applications with interactive user interfaces. It is mainly used for developing GUI applications but can also be used for creating non-GUI applications like console tools and servers.
-
-Qt provides a wide range of C++ libraries and seamless integration with popular IDEs, making it easier for developers to create feature-rich applications. It offers a comprehensive development environment, including tools for designing, coding, debugging, and profiling applications.
-
-## Key Features
-
-- **Cross-platform**: Qt can create applications that run on different platforms (e.g., Windows, macOS, Linux, Android, iOS) without any platform-specific code.
-- **Modular Libraries**: Qt consists of several modular libraries, including QtCore (core non-GUI functionality), QtGui (GUI-related classes), QtWidgets (GUI widgets), and QtNetwork (networking support).
-- **Signals and Slots**: Qt provides a unique mechanism to handle events called "signals and slots", which allows safe and flexible inter-object communication.
-- **OpenGL Integration**: Qt supports rendering 2D and 3D graphics using OpenGL, making it suitable for game development and other graphical applications.
-
-## Code Example
-
-Here's a simple example of a "Hello, World!" application using Qt:
-
-```cpp
-#include <QApplication>
-#include <QLabel>
-
-int main(int argc, char *argv[])
-{
-    QApplication app(argc, argv);
-
-    QLabel label("Hello, World!");
-    label.show();
-
-    return app.exec();
-}
-```
-
-In this example, we include the necessary header files, create QApplication and QLabel objects, display the label with a "Hello, World!" message, and execute the application.
-
-To compile and run this example, you need to install the Qt library and configure your development environment to use it.
-
-For more information and tutorials about Qt, you can refer to the [official Qt documentation](https://doc.qt.io/qt-5/index.html).
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/frameworks/102-catch2.md b/src/data/roadmaps/cpp/content/frameworks/102-catch2.md
deleted file mode 100644
index f94d5f1f6..000000000
--- a/src/data/roadmaps/cpp/content/frameworks/102-catch2.md
+++ /dev/null
@@ -1,96 +0,0 @@
-# Catch2
-
-Catch2 is a modern, C++-native, test framework for unit tests, TDD, and BDD. It is a single-header library, meaning you only need to include one header file (`catch.hpp`) to start using it. Catch2 is fast, easy to use, and supports various test styles.
-
-## Features
-
-- **Single-header:** Just `#include "catch.hpp"` and start writing tests.
-- **Test cases:** Declare test cases using the `TEST_CASE` macro.
-- **Sections:** Divide test cases into sections using `SECTION` macro.
-- **BDD:** Behavior-Driven Development style supported with `SCENARIO`, `GIVEN`, `WHEN`, `THEN`.
-- **Matchers:** Use rich built-in matchers for more expressive assertions.
-- **Test discovery:** Catch2 automatically discovers your test cases and sections.
-
-## Code examples
-
-## Basic test case
-
-```cpp
-#define CATCH_CONFIG_MAIN  // Tells Catch to provide a main() function
-#include "catch.hpp"
-
-int add(int a, int b) {
-    return a + b;
-}
-
-TEST_CASE("Addition") {
-    REQUIRE(add(2, 3) == 5);
-}
-```
-
-## Sections
-
-```cpp
-TEST_CASE("Sections example") {
-    int a = 1;
-
-    SECTION("incrementing a") {
-        a++;
-        REQUIRE(a == 2);
-    }
-
-    SECTION("decrementing a") {
-        a--;
-        REQUIRE(a == 0);
-    }
-}
-```
-
-## BDD style
-
-```cpp
-SCENARIO("vector can be sized and resized", "[vector]") {
-    std::vector<int> v;
-
-    GIVEN("A vector with some items") {
-        v.push_back(1);
-        v.push_back(2);
-        v.push_back(3);
-
-        REQUIRE(v.size() == 3);
-
-        WHEN("the size is increased") {
-            v.resize(5);
-
-            THEN("the size and contents change") {
-                REQUIRE(v.size() == 5);
-                REQUIRE(v[3] == 0);
-                REQUIRE(v[4] == 0);
-            }
-        }
-        WHEN("the size is reduced") {
-            v.resize(2);
-
-            THEN("the size changes but not the contents") {
-                REQUIRE(v.size() == 2);
-                REQUIRE(v[0] == 1);
-                REQUIRE(v[1] == 2);
-            }
-        }
-    }
-}
-```
-
-## Matchers
-
-```cpp
-TEST_CASE("Matchers example") {
-    std::string str = "Hello, world!";
-
-    CHECK_THAT(str, Catch::Matchers::StartsWith("Hello"));
-    CHECK_THAT(str, Catch::Matchers::EndsWith("world!"));
-    CHECK_THAT(str, Catch::Matchers::Contains("lo, wo"));
-}
-```
-
-For more information, visit the [Catch2 GitHub repository](https://github.com/catchorg/Catch2).
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/frameworks/103-orbit-profiler.md b/src/data/roadmaps/cpp/content/frameworks/103-orbit-profiler.md
deleted file mode 100644
index d498b54f0..000000000
--- a/src/data/roadmaps/cpp/content/frameworks/103-orbit-profiler.md
+++ /dev/null
@@ -1,69 +0,0 @@
-# Orbit Profiler
-
-Orbit Profiler is a performance profiler for C++ applications. It is designed to provide developers with real-time feedback on their application's performance and help them identify performance bottlenecks. It supports both Windows and Linux platforms, profiling both local and remote processes.
-
-**Major features of Orbit Profiler:**
-
-- Sampling-based profiling
-- Instrumentation-based profiling
-- Callstacks collection
-- Frame-based measurements using scopes macros
-
-## Usage
-
-- **Include OrbitProfiler.h**: First, you need to include the `OrbitProfiler.h` header file in your project:
-
-   ```cpp
-   #include "OrbitProfiler.h"
-   ```
-
-- **Starting and Stopping the profiler**: Use `ORBET_START` and `ORBIT_STOP` to start and stop the profiler.
-
-   ```cpp
-   ORBIT_START();
-   // Your application code here
-   ORBIT_STOP();
-   ```
-
-- **Instrumenting scopes**: Use the `ORBET_SCOPE` macro to annotate the scope of the function you want to measure:
-
-   ```cpp
-   void ExampleFunction() {
-     ORBIT_SCOPE("Example Function");
-     // Function content here
-   }
-   ```
-
-- **Visualizing the captured data**: Orbit Profiler provides a **Session View** that displays the captured data and allows you to navigate through the timeline, analyze data, and identify performance bottlenecks.
-
-## Example
-
-For demonstration purposes, consider the following example of a simple C++ application:
-
-```cpp
-#include "OrbitProfiler.h"
-
-void FunctionA() {
-  ORBIT_SCOPE("Function A");
-  // Function A code here
-}
-
-void FunctionB() {
-  ORBIT_SCOPE("Function B");
-  // Function B code here
-}
-
-int main() {
-  ORBIT_START();
-
-  FunctionA();
-  FunctionB();
-
-  ORBIT_STOP();
-  return 0;
-}
-```
-
-By using Orbit Profiler, we are able to pinpoint performance issues in FunctionA and FunctionB and optimize our application accordingly.
-
-For more information, refer to the [official Orbit Profiler GitHub repository](https://github.com/google/orbit).
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/frameworks/104-pytorch-cpp.md b/src/data/roadmaps/cpp/content/frameworks/104-pytorch-cpp.md
deleted file mode 100644
index 88a71f34d..000000000
--- a/src/data/roadmaps/cpp/content/frameworks/104-pytorch-cpp.md
+++ /dev/null
@@ -1,71 +0,0 @@
-# PyTorch C++
-
-PyTorch C++ is the C++ API (Application Programming Interface) for PyTorch. It is also known as LibTorch, which is a library that provides almost all the functionality of PyTorch accessible through C++ language. The main goal of providing a C++ API is to enable high-performance integration with other deep learning platforms and enable seamless operation in enterprise and production-level systems.
-
-## Installation
-
-To use the PyTorch C++ API, you need to install the LibTorch distribution. Follow the instructions on the [official PyTorch C++ API page](https://pytorch.org/cppdocs/installing.html) to install the library based on your platform and requirements.
-
-## Example: Tensors
-
-```cpp
-#include <iostream>
-#include <torch/torch.h>
-
-int main() {
-  // Create a 3x3 matrix with zeros.
-  torch::Tensor a = torch::zeros({3, 3});
-  std::cout << a << std::endl;
-
-  // Create a 2x2 matrix with ones and convert to float.
-  torch::Tensor b = torch::ones({2, 2}).to(torch::kFloat);
-  std::cout << b << std::endl;
-
-  // Create a random tensor size 2x2 and specify its type.
-  torch::Tensor c = torch::randint(0, 10, {2, 2}, torch::kInt);
-  std::cout << c << std::endl;
-
-  // Perform element-wise addition.
-  auto sum = b + c.to(torch::kFloat);
-  std::cout << sum << std::endl;
-}
-```
-
-## Example: Creating a Custom Module
-
-```cpp
-#include <iostream>
-#include <torch/torch.h>
-
-// Define a custom module.
-struct Net : torch::nn::Module {
-  Net() {
-    fc1 = register_module("fc1", torch::nn::Linear(784, 64));
-    fc2 = register_module("fc2", torch::nn::Linear(64, 10));
-  }
-
-  torch::Tensor forward(torch::Tensor x) {
-    x = x.view({-1, 784});
-    x = torch::relu(fc1->forward(x));
-    x = torch::log_softmax(fc2->forward(x), 1);
-    return x;
-  }
-
-  torch::nn::Linear fc1{nullptr};
-  torch::nn::Linear fc2{nullptr};
-};
-
-int main() {
-  // Create an instance of the custom module.
-  Net net;
-
-  // Use the custom module.
-  torch::Tensor input = torch::randn({2, 1, 28, 28});
-  torch::Tensor output = net.forward(input);
-  std::cout << output << std::endl;
-
-  return 0;
-}
-```
-
-In these examples, we demonstrated how to use various tensor operations and how to create a custom neural network module with PyTorch C++. For more detailed information and tutorials, visit the [official PyTorch C++ documentation](https://pytorch.org/cppdocs/).
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/111-templates/101-template-specialization/100-full.md b/src/data/roadmaps/cpp/content/full-template-specialization@6hTcmJwNnQstbWWzNCfTe.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/111-templates/101-template-specialization/100-full.md
rename to src/data/roadmaps/cpp/content/full-template-specialization@6hTcmJwNnQstbWWzNCfTe.md
diff --git a/src/data/roadmaps/cpp/content/function-overloading@sgfqb22sdN4VRJYkhAVaf.md b/src/data/roadmaps/cpp/content/function-overloading@sgfqb22sdN4VRJYkhAVaf.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/cpp/content/103-functions/index.md b/src/data/roadmaps/cpp/content/functions@oYi3YOc1GC2Nfp71VOkJt.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/103-functions/index.md
rename to src/data/roadmaps/cpp/content/functions@oYi3YOc1GC2Nfp71VOkJt.md
diff --git a/src/data/roadmaps/cpp/content/114-debuggers/103-gdb.md b/src/data/roadmaps/cpp/content/gdb@BmWsoL9c_Aag5nVlMsKm2.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/114-debuggers/103-gdb.md
rename to src/data/roadmaps/cpp/content/gdb@BmWsoL9c_Aag5nVlMsKm2.md
diff --git a/src/data/roadmaps/cpp/content/grpc@621J9W4xCofumNZGo4TZT.md b/src/data/roadmaps/cpp/content/grpc@621J9W4xCofumNZGo4TZT.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/cpp/content/gtest--gmock@MrAM-viRaF8DSxB6sVdD9.md b/src/data/roadmaps/cpp/content/gtest--gmock@MrAM-viRaF8DSxB6sVdD9.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/cpp/content/106-structuring-codebase/101-code-splitting/index.md b/src/data/roadmaps/cpp/content/headers--cpp-files@CK7yf8Bo7kfbV6x2tZTrh.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/106-structuring-codebase/101-code-splitting/index.md
rename to src/data/roadmaps/cpp/content/headers--cpp-files@CK7yf8Bo7kfbV6x2tZTrh.md
diff --git a/src/data/roadmaps/cpp/content/112-idioms/index.md b/src/data/roadmaps/cpp/content/idioms@fb3bnfKXjSIjPAk4b95lg.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/112-idioms/index.md
rename to src/data/roadmaps/cpp/content/idioms@fb3bnfKXjSIjPAk4b95lg.md
diff --git a/src/data/roadmaps/cpp/content/if-else--switch--goto@bjpFWxiCKGz28E-ukhZBp.md b/src/data/roadmaps/cpp/content/if-else--switch--goto@bjpFWxiCKGz28E-ukhZBp.md
new file mode 100644
index 000000000..508114a8b
--- /dev/null
+++ b/src/data/roadmaps/cpp/content/if-else--switch--goto@bjpFWxiCKGz28E-ukhZBp.md
@@ -0,0 +1 @@
+# if else / switch / goto
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/index.md b/src/data/roadmaps/cpp/content/index.md
deleted file mode 100644
index 4e768b56d..000000000
--- a/src/data/roadmaps/cpp/content/index.md
+++ /dev/null
@@ -1 +0,0 @@
-# 
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/101-setting-up/100-installing.md b/src/data/roadmaps/cpp/content/installing-c@0J_ltQEJh2g28OE2ZEYJj.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/101-setting-up/100-installing.md
rename to src/data/roadmaps/cpp/content/installing-c@0J_ltQEJh2g28OE2ZEYJj.md
diff --git a/src/data/roadmaps/cpp/content/100-introduction/index.md b/src/data/roadmaps/cpp/content/introduction-to-language@NvODRFR0DLINB0RlPSsvt.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/100-introduction/index.md
rename to src/data/roadmaps/cpp/content/introduction-to-language@NvODRFR0DLINB0RlPSsvt.md
diff --git a/src/data/roadmaps/cpp/content/110-stl/101-iostream.md b/src/data/roadmaps/cpp/content/iostream@VeVxZ230xkesQsIDig8zQ.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/110-stl/101-iostream.md
rename to src/data/roadmaps/cpp/content/iostream@VeVxZ230xkesQsIDig8zQ.md
diff --git a/src/data/roadmaps/cpp/content/110-stl/100-iterators.md b/src/data/roadmaps/cpp/content/iterators@Ebu8gzbyyXEeJryeE0SpG.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/110-stl/100-iterators.md
rename to src/data/roadmaps/cpp/content/iterators@Ebu8gzbyyXEeJryeE0SpG.md
diff --git a/src/data/roadmaps/cpp/content/103-functions/100-lambda.md b/src/data/roadmaps/cpp/content/lambdas@xjiFBVe-VGqCqWfkPVGKf.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/103-functions/100-lambda.md
rename to src/data/roadmaps/cpp/content/lambdas@xjiFBVe-VGqCqWfkPVGKf.md
diff --git a/src/data/roadmaps/cpp/content/109-language-concepts/index.md b/src/data/roadmaps/cpp/content/language-concepts@-6fwJQOfsorgHkoQGp4T3.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/109-language-concepts/index.md
rename to src/data/roadmaps/cpp/content/language-concepts@-6fwJQOfsorgHkoQGp4T3.md
diff --git a/src/data/roadmaps/cpp/content/libraries/100-boost.md b/src/data/roadmaps/cpp/content/libraries/100-boost.md
deleted file mode 100644
index bd0d66fa4..000000000
--- a/src/data/roadmaps/cpp/content/libraries/100-boost.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# Boost C++ Libraries
-
-Boost is a collection of high-quality and widely-used C++ libraries that are designed to help developers write efficient and portable code. They are modular and can be included in your projects as needed. Boost libraries provide various functionalities, including support for parallelism, multithreading, memory management, string manipulation, and advanced data structures.
-
-## Notable Components
-
-Here's a list of some popular Boost libraries:
-
-- **Boost.Asio**: Provides network and low-level I/O services.
-- **Boost.Bimap**: A bidirectional map data structure.
-- **Boost.Filesystem**: Offers portable file system operations.
-- **Boost.Graph**: Implements various graph algorithms and data structures.
-- **Boost.Multithreading**: Offers multithreading, synchronization, and thread management tools.
-
-## Usage
-
-- First, download and install the Boost libraries according to the [documentation](https://www.boost.org/doc/libs/1_76_0/more/getting_started/index.html).
-- After installation, include necessary headers in your C++ code and start using Boost facilities.
-
-Here's an example using `boost::filesystem` (*NOTE: Boost.Filesystem is now part of the C++17 standard library*):
-
-```cpp
-#include <iostream>
-#include <boost/filesystem.hpp>
-
-int main() {
-    boost::filesystem::path path("directory_path");
-  
-    if (boost::filesystem::exists(path)) {
-        std::cout << "Path: " << path << " exists!" << std::endl;
-      
-        if (boost::filesystem::is_directory(path)) {
-            std::cout << "Path: " << path << " is a directory." << std::endl;
-        } else if (boost::filesystem::is_regular_file(path)) {
-            std::cout << "Path: " << path << " is a regular file." << std::endl;
-        }
-    } else {
-        std::cout << "Path: " << path << " does not exist!" << std::endl;
-    }
-
-    return 0;
-}
-```
-
-For a more detailed guide, refer to the [official Boost documentation](https://www.boost.org/doc/libs/).
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/libraries/101-open-cv.md b/src/data/roadmaps/cpp/content/libraries/101-open-cv.md
deleted file mode 100644
index f763ef007..000000000
--- a/src/data/roadmaps/cpp/content/libraries/101-open-cv.md
+++ /dev/null
@@ -1,57 +0,0 @@
-# OpenCV
-
-**OpenCV (Open Source Computer Vision Library)** is an open-source computer vision and machine learning software library. It was built to provide a common infrastructure for computer vision applications and to accelerate the use of machine perception in commercial products. OpenCV contains over 2,500 optimized algorithms for real-time computer vision and is actively used by a large community of programmers, researchers, and industries worldwide.
-
-The library has interfaces for C++, Python, Java, and MATLAB/Octave, and is widely used in various computer vision fields, such as:
-
-- 2D and 3D image processing
-- Facial recognition and face detection
-- Object detection and recognition
-- Machine learning
-
-Here's a simple example using OpenCV in C++ to read and display an image:
-
-**Prerequisite**: Install OpenCV for C++ on your system (e.g., by following the [official installation guide](https://docs.opencv.org/master/d7/d9f/tutorial_linux_install.html)).
-
-```cpp
-#include <opencv2/opencv.hpp>
-#include <opencv2/highgui/highgui.hpp>
-#include <iostream>
-
-int main(int argc, char** argv) {
-    if(argc != 2) {
-        std::cout << "Usage: display_image ImageToLoadAndDisplay" << std::endl;
-        return -1;
-    }
-
-    cv::Mat image;
-    image = cv::imread(argv[1], cv::IMREAD_COLOR);
-
-    if(!image.data) {
-        std::cout << "Could not open or find the image" << std::endl;
-        return -1;
-    }
-
-    cv::namedWindow("Display window", cv::WINDOW_AUTOSIZE);
-    cv::imshow("Display window", image);
-    cv::waitKey(0);
-
-    return 0;
-}
-```
-
-This example reads an image from the given input path (`argv[1]`) and displays it in a window. The `cv::imread()` function is used to read the image, and the `cv::imshow()` function displays it in the created window.
-
-Remember to compile the code, linking the necessary libraries:
-
-```
-g++ -o display_image display_image.cpp `pkg-config --cflags --libs opencv4`
-```
-
-And run the executable with an image path as an argument:
-
-```
-./display_image path/to/image.jpg
-```
-
-For more advanced examples and detailed documentation on how to use OpenCV, please visit the [official OpenCV documentation](https://docs.opencv.org/master/).
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/libraries/102-poco.md b/src/data/roadmaps/cpp/content/libraries/102-poco.md
deleted file mode 100644
index 2edfc1657..000000000
--- a/src/data/roadmaps/cpp/content/libraries/102-poco.md
+++ /dev/null
@@ -1,76 +0,0 @@
-# Poco
-
-Poco (also known as POCO C++ Libraries) is a collection of open-source class libraries, which simplifies the creation of network-centric, portable, and maintainable software in C++. 
-
-## Overview
-
-Poco library provides functionality for various areas, such as:
-
-- Networking: HTTP, FTP, SMTP, POP3, and other internet protocols
-- File handling: FileSystem, Path, File, and Directory classes
-- XML processing: XML parsing and DOM manipulation
-- Logging: Loggers, levels, channels, patterns, etc.
-- Data manipulation: Stream, ByteBuffer, Buffer, etc.
-- Multithreading and synchronization: Threads, Mutex, Event, and Condition
-
-## Code Example
-
-Here's an example demonstrating an HTTP client using the Poco library:
-
-```cpp
-#include <Poco/Net/HTTPClientSession.h>
-#include <Poco/Net/HTTPRequest.h>
-#include <Poco/Net/HTTPResponse.h>
-#include <Poco/Net/HTTPMessage.h>
-#include <Poco/StreamCopier.h>
-#include <iostream>
-#include <string>
-
-using namespace Poco::Net;
-using namespace Poco;
-
-int main()
-{
-  try
-  {
-    // Prepare the request
-    URI uri("http://example.com");
-    HTTPClientSession session(uri.getHost(), uri.getPort());
-
-    HTTPRequest request(HTTPRequest::HTTP_GET, uri.getPath(), HTTPMessage::HTTP_1_1);
-    request.setContentType("application/json");
-
-    session.sendRequest(request);
-
-    // Process the response
-    HTTPResponse response;
-    std::istream& responseStream = session.receiveResponse(response);
-    if (response.getStatus() == HTTPResponse::HTTP_OK)
-    {
-      // Successful
-      std::string responseBody;
-      StreamCopier::copyToString(responseStream, responseBody);
-
-      std::cout << "Response: " << responseBody << std::endl;
-    }
-    else
-    {
-      // Error
-      std::cout << "Error: " << response.getStatus() << " " << response.getReason() << std::endl;
-    }
-  }
-  catch(const Exception& e)
-  {
-    std::cerr << "Error: " << e.displayText() << std::endl;
-    return -1;
-  }
-
-  return 0;
-}
-```
-
-In the above example, Poco is used to send an HTTP GET request and process the response. It manages tasks like connecting to the server, handling exceptions, and managing HTTP headers.
-
-Learn more from the following resources:
-
-- [@article@Official Docs for Poco Library](https://docs.pocoproject.org/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/libraries/103-protobuf.md b/src/data/roadmaps/cpp/content/libraries/103-protobuf.md
deleted file mode 100644
index db0027be9..000000000
--- a/src/data/roadmaps/cpp/content/libraries/103-protobuf.md
+++ /dev/null
@@ -1,79 +0,0 @@
-# Protocol Buffers (protobuf)
-
-Protocol Buffers, or protobuf, is a language and platform-neutral data serialization format developed by Google. It is used to efficiently serialize structured data for use in communications protocols, data storage, and more. It is extensible, as it allows you to define your own custom data structures called "messages" with various scalar and complex field types.
-
-Here is a brief summary of protobuf and how to use it in C++:
-
-- **Define your `.proto` file:** Create a `.proto` file that defines the structure of your messages.
-
-   *Example:*
-
-   ```
-   syntax = "proto3";
-   
-   message Person {
-       string name = 1;
-       int32 age = 2;
-       string email = 3;
-   }
-   ```
-
-- **Compile the `.proto` file:** You need to compile your `.proto` file to generate C++ classes for serialization and deserialization.
-
-   *Example:*
-
-   ```sh
-   protoc --cpp_out=. person.proto
-   ```
-
-   This will generate two files: `person.pb.cc` and `person.pb.h` that contains the C++ class definitions.
-
-- **Include protobuf library and generated files into your C++ code:** You'll need to include the protobuf library and the generated files in your main C++ code.
-
-   *Example:*
-
-   ```cpp
-   #include <iostream>
-   #include <fstream>
-   #include "person.pb.h"
-
-   int main () {
-       GOOGLE_PROTOBUF_VERIFY_VERSION; // Verify that protobuf library headers match library version
-
-       // Serialize a Person message
-       Person person;
-       person.set_name("Sam");
-       person.set_age(35);
-       person.set_email("sam@example.com");
-
-       // Save the data to a file
-       std::ofstream output("person.bin", ios::binary);
-       person.SerializeToOstream(&output);
-       output.close();
-
-       // Deserialize the message from the file
-       Person input_person;
-       std::ifstream input("person.bin", ios::binary);
-       input_person.ParseFromIstream(&input);
-       input.close();
-
-       // Print the deserialized message
-       std::cout << "Name: " << input_person.name() << std::endl;
-       std::cout << "Age: " << input_person.age() << std::endl;
-       std::cout << "Email: " << input_person.email() << std::endl;
-
-       google::protobuf::ShutdownProtobufLibrary();
-
-       return 0;
-   }
-   ```
-
-- **Compile and link your C++ code:** Finally, compile your C++ code and link it to the protobuf library.
-
-   *Example:*
-
-   ```sh
-   g++ -std=c++11 -o main main.cpp person.pb.cc -lprotobuf
-   ```
-
-For more information and examples, you can refer to the [official protobuf C++ tutorial](https://developers.google.com/protocol-buffers/docs/cpptutorial).
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/libraries/104-grpc.md b/src/data/roadmaps/cpp/content/libraries/104-grpc.md
deleted file mode 100644
index f31b5239c..000000000
--- a/src/data/roadmaps/cpp/content/libraries/104-grpc.md
+++ /dev/null
@@ -1,129 +0,0 @@
-# gRPC
-
-gRPC (gRPC Remote Procedure Calls) is an open-source Remote Procedure Call (RPC) framework that runs on various programming languages, including C++. gRPC is designed to be high-performance, efficient, and scalable, making it ideal for microservice architectures and other applications with high performance requirements.
-
-gRPC uses the Protocol Buffers (Protobuf) serialization format for message exchange and method definition. Protocol Buffers enable more efficient and smaller serialization compared to other formats like JSON or XML.
-
-## Protocol Buffers
-
-In gRPC, you start by defining service definitions and message structures in `.proto` files. You can define data structures and service interfaces using a compact, language-neutral, platform-neutral binary format.
-
-Here's an example of how that might look:
-
-```proto
-syntax = "proto3";
-
-package example;
-
-// The gRPC service definition
-service Greeter {
-  rpc SayHello (HelloRequest) returns (HelloReply) {}
-}
-
-// The Request message definition
-message HelloRequest {
-  string name = 1;
-}
-
-// The Reply message definition
-message HelloReply {
-  string message = 1;
-}
-```
-
-After defining the `.proto` file, you use the `protoc` compiler to generate the corresponding C++ code for your application.
-
-## gRPC C++ Server
-
-To create a gRPC server in C++, you first need to implement the service interface generated by the `protoc` compiler. Here's an example implementation for the `Greeter` service:
-
-```cpp
-#include <grpcpp/grpcpp.h>
-#include "example.grpc.pb.h"
-
-using grpc::Server;
-using grpc::ServerBuilder;
-using grpc::ServerContext;
-using grpc::Status;
-using example::HelloRequest;
-using example::HelloReply;
-using example::Greeter;
-
-class GreeterServiceImpl final : public Greeter::Service {
-  Status SayHello(ServerContext* context, const HelloRequest* request, HelloReply* reply) override {
-    std::string prefix("Hello ");
-    reply->set_message(prefix + request->name());
-    return Status::OK;
-  }
-};
-
-void RunServer() {
-  std::string server_address("0.0.0.0:50051");
-  GreeterServiceImpl service;
-
-  ServerBuilder builder;
-  builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
-  builder.RegisterService(&service);
-
-  std::unique_ptr<Server> server(builder.BuildAndStart());
-  std::cout << "Server listening on " << server_address << std::endl;
-  server->Wait();
-}
-
-int main(int argc, char** argv) {
-  RunServer();
-  return 0;
-}
-```
-
-## gRPC C++ Client
-
-Similarly, to create a gRPC C++ client, you use the generated code from `protoc` compiler and connect to a server:
-
-```cpp
-#include <grpcpp/grpcpp.h>
-#include "example.grpc.pb.h"
-
-using grpc::Channel;
-using grpc::ClientContext;
-using grpc::Status;
-using example::HelloRequest;
-using example::HelloReply;
-using example::Greeter;
-
-class GreeterClient {
- public:
-  GreeterClient(std::shared_ptr<Channel> channel) : stub_(Greeter::NewStub(channel)) {}
-
-  std::string SayHello(const std::string& user) {
-    HelloRequest request;
-    request.set_name(user);
-
-    HelloReply reply;
-    ClientContext context;
-
-    Status status = stub_->SayHello(&context, request, &reply);
-
-    if (status.ok()) {
-      return reply.message();
-    } else {
-      std::cout << "RPC failed" << std::endl;
-      return "RPC failed";
-    }
-  }
-
- private:
-  std::unique_ptr<Greeter::Stub> stub_;
-};
-
-int main(int argc, char** argv) {
-  GreeterClient greeter(grpc::CreateChannel("localhost:50051", grpc::InsecureChannelCredentials()));
-  std::string user("world");
-  std::string reply = greeter.SayHello(user);
-  std::cout << "Greeter received: " << reply << std::endl;
-
-  return 0;
-}
-```
-
-This is a basic example demonstrating the client-server communication using gRPC in C++. More advanced features like bi-directional streaming, error handling, and authentication can also be used in gRPC. For more information, you can refer to the [gRPC C++ documentation](https://grpc.io/docs/languages/cpp/).
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/libraries/105-tensorflow.md b/src/data/roadmaps/cpp/content/libraries/105-tensorflow.md
deleted file mode 100644
index de769e31c..000000000
--- a/src/data/roadmaps/cpp/content/libraries/105-tensorflow.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# TensorFlow
-
-TensorFlow is an open-source machine learning library developed by researchers and engineers from the Google Brain team. It is designed for building, training, and deploying deep learning models. TensorFlow provides a set of tools for ML, deep learning, and numerical computation using data flow graphs. TensorFlow can process computations on GPUs and TPUs, which speed up training time and ensures efficient model deployment.
-
-You can visit TensorFlow's official website (https://www.tensorflow.org/) and their GitHub repository (https://github.com/tensorflow/tensorflow) for more information, tutorials, and resources.
diff --git a/src/data/roadmaps/cpp/content/libraries/106-pybind11.md b/src/data/roadmaps/cpp/content/libraries/106-pybind11.md
deleted file mode 100644
index 5ed1d0be6..000000000
--- a/src/data/roadmaps/cpp/content/libraries/106-pybind11.md
+++ /dev/null
@@ -1,70 +0,0 @@
-# Pybind11
-
-Pybind11 is a lightweight header-only library that seamlessly integrates C++ code with Python, allowing users to easily expose C++11 code to the Python ecosystem. This is achieved by providing `Python` bindings that can interact with functions and classes written in `C++`. It offers an API similar to the Boost.Python library but requires less code, thus leading to better performance.
-
-Pybind11 helps in creating library extensions, bringing high-performance C++ code into Python programs, and using Python's flexibility for rapid development while still benefiting from the efficiency of C++.
-
-### Code Examples
-
-Here are a few examples of Pybind11 for understanding the concept better:
-
-- Exposing a C++ function to Python:
-
-```cpp
-#include <pybind11/pybind11.h>
-
-int add(int a, int b) {
-    return a + b;
-}
-
-PYBIND11_MODULE(example, m) {
-    m.def("add", &add, "A function that adds two numbers");
-}
-```
-
-Running the above example will create a Python module named `example`, containing a single function `add`. You can use this new function in Python as follows:
-
-```python
-import example
-
-result = example.add(1, 2)
-print(result)  # Output: 3
-```
-
-- Exposing a C++ class to Python:
-
-```cpp
-#include <pybind11/pybind11.h>
-
-namespace py = pybind11;
-
-class MyTestClass {
-public:
-    MyTestClass(const std::string &name) : name_(name) { }
-
-    const std::string &name() const { return name_; }
-    void setName(const std::string &name) { name_ = name; }
-
-private:
-    std::string name_;
-};
-
-PYBIND11_MODULE(example, m) {
-    py::class_<MyTestClass>(m, "MyTestClass")
-        .def(py::init<const std::string &>())
-        .def("name", &MyTestClass::name)
-        .def("setName", &MyTestClass::setName);
-}
-```
-
-After compiling the code and importing it into Python, you can create `MyTestClass` instances and call their `name()` and `setName(string)` methods:
-
-```python
-import example
-
-obj = example.MyTestClass("some_name")
-print(obj.name())  # Output: some_name
-
-obj.setName("new_name")
-print(obj.name())  # Output: new_name
-```
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/libraries/107-spdlog.md b/src/data/roadmaps/cpp/content/libraries/107-spdlog.md
deleted file mode 100644
index c700ce21e..000000000
--- a/src/data/roadmaps/cpp/content/libraries/107-spdlog.md
+++ /dev/null
@@ -1,59 +0,0 @@
-# Spdlog
-
-`spdlog` is a fast, header-only, C++ logging library. It provides a simple and efficient way to add diagnostic logging to your C++ application.
-
-## Features:
-- Header-only, no need to build or link a library
-- Highly configurable, including support for custom log sinks (e.g. writing to a file or a database)
-- Asynchronous and synchronous logging modes
-- Preprocessor-based format string checks to catch bugs at compile-time
-- Easy to extend with custom formatters, sinks, and levels
-
-## Usage example:
-
-Include the `spdlog` header, create a logger object, and use it to log messages:
-
-```cpp
-#include "spdlog/spdlog.h"
-
-int main() {
-    // Create a logger with the name "example_logger"
-    auto logger = spdlog::stdout_color_mt("example_logger");
-
-    // Log messages with various severity levels
-    logger->info("Welcome to spdlog!");
-    logger->warn("Warning message");
-    logger->error("Error message");
-
-    return 0;
-}
-```
-
-## Custom sink example:
-
-Here's an example of creating a logger with a custom sink that writes to a text file:
-
-```cpp
-#include "spdlog/spdlog.h"
-#include "spdlog/sinks/basic_file_sink.h"
-
-int main() {
-    // Create a file sink to write logs to "logs.txt"
-    auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("logs.txt");
-
-    // Create a logger with the file sink and the name "example_logger"
-    auto logger = std::make_shared<spdlog::logger>("example_logger", file_sink);
-
-    // Register the logger
-    spdlog::register_logger(logger);
-
-    // Log messages
-    logger->info("Welcome to spdlog!");
-    logger->warn("Warning message");
-    logger->error("Error message");
-
-    return 0;
-}
-```
-
-For more examples and detailed documentation, visit the [spdlog GitHub repository](https://github.com/gabime/spdlog).
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/libraries/108-opencl.md b/src/data/roadmaps/cpp/content/libraries/108-opencl.md
deleted file mode 100644
index f1b8680a4..000000000
--- a/src/data/roadmaps/cpp/content/libraries/108-opencl.md
+++ /dev/null
@@ -1,59 +0,0 @@
-# OpenCL
-
-OpenCL (Open Computing Language) is a framework for writing programs that enables you to execute code on heterogeneous platforms consisting of CPUs, GPUs, and other processors. It is primarily used for parallel programming, and it can be employed to improve the performance of various applications, including gaming, image and video rendering, and scientific computing.
-
-## Overview
-
-OpenCL provides a standardized programming interface, allowing you to target different devices such as graphics cards from different vendors. You can program in C with OpenCL C or C++ with OpenCL C++ kernel language, which are based on the ISO C99 and C++14 respectively, with specific extensions, built-ins, and features to exploit device parallelism.
-
-## Key Concepts
-
-- Platform: A collection of devices and software features provided by a vendor.
-- Device: A processing unit that can execute OpenCL code, e.g., a CPU or a GPU.
-- Command queue: A sequence of instructions to be executed on a device.
-- Kernel: A parallelized function that is executed on OpenCL devices.
-- Buffer: A memory object that stores a specific amount of data (e.g., an array of integers or floats) that is accessible by both the host and devices.
-
-## Sample Code
-
-Here is a simple OpenCL code example that illustrates how to implement vector addition:
-
-```cpp
-#include <CL/cl.h>
-#include <iostream>
-#include <vector>
-
-const char *kernelSource = "__kernel void vector_add(__global int *A, __global int *B, __global int *C, const int N){"
-                            "  int i = get_global_id(0);"
-                            "  if(i < N){"
-                            "    C[i] = A[i] + B[i];"
-                            "  }"
-                            "}";
-
-int main(){
-    // Initialize data vectors
-    std::vector<int> A = {1, 2, 3};
-    std::vector<int> B = {4, 5, 6};
-    std::vector<int> C(A.size());
-
-    // Set up OpenCL environment, devices, and context
-    // ... omitted for brevity ...
-
-    // Create memory buffers for A, B, and C
-    // ... omitted for brevity ...
-
-    // Create kernel from source and set kernel arguments
-    // ... omitted for brevity ...
-
-    // Execute kernel using command queue and read output buffer
-    // ... omitted for brevity ...
-
-    // Output results
-    for (size_t i = 0; i < A.size(); ++i) {
-        std::cout << A[i] << " + " << B[i] << " = " << C[i] << std::endl;
-    }
-    return 0;
-}
-```
-
-This code snippet demonstrates the basic structure of an OpenCL program in C++. There are additional details required in order to set up the environment, devices, and context, as well as creating the memory buffers, kernel, and command queue. You can find complete examples and more information in the [official OpenCL Programming Guide](https://www.khronos.org/files/opencl22-reference-guide.pdf).
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/libraries/109-fmt.md b/src/data/roadmaps/cpp/content/libraries/109-fmt.md
deleted file mode 100644
index 2fab03e1f..000000000
--- a/src/data/roadmaps/cpp/content/libraries/109-fmt.md
+++ /dev/null
@@ -1,69 +0,0 @@
-# fmt
-
-`fmt` is a modern C++ formatting library that provides an easy and efficient way to format text and print it to various outputs. The library offers a high level of compatibility with C++ standards, making it suitable for various applications and platforms. `fmt` emphasizes simplicity, extensibility, and type safety.
-
-## Features
-
-- Supports positional and named arguments for better readability in complex formatting tasks
-- Supports format string syntax similar to Python's `str.format()`
-- Provides compile-time format string checks for type safety
-- Extensive documentation and user-friendly API
-
-## Example Usage
-
-Here are some examples of how to use the `fmt` library:
-
-## Basic Usage
-
-```cpp
-#include <fmt/core.h>
-
-int main() {
-    fmt::print("Hello, world!\n");
-    return 0;
-}
-```
-
-## Formatting with Positional Arguments
-
-```cpp
-#include <fmt/core.h>
-
-int main() {
-    fmt::print("The answer is {}.\n", 42);
-    fmt::print("{1}, {0}!\n", "world", "Hello");
-    return 0;
-}
-```
-
-## Formatting with Named Arguments
-
-```cpp
-#include <fmt/core.h>
-
-int main() {
-    fmt::print("Hello, {name}!\n", fmt::arg("name", "world"));
-    return 0;
-}
-```
-
-## Using Format String Syntax
-
-```cpp
-#include <fmt/core.h>
-
-int main() {
-    fmt::print("{:<30}", "left-aligned");
-    fmt::print("{:>30}", "right-aligned");
-    fmt::print("{:^30}", "center-aligned");
-    fmt::print("{:*^30}", "center-aligned");
-
-    fmt::print("int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}", 42);
-    fmt::print("{:.2f}", 3.1415926);
-    fmt::print("{:010.2f}", 3.1415926);
-
-    return 0;
-}
-```
-
-For more information, you can refer to the official [fmt documentation](https://fmt.dev/latest/index.html).
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/libraries/110-ranges-v3.md b/src/data/roadmaps/cpp/content/libraries/110-ranges-v3.md
deleted file mode 100644
index 817156c55..000000000
--- a/src/data/roadmaps/cpp/content/libraries/110-ranges-v3.md
+++ /dev/null
@@ -1,84 +0,0 @@
-# Ranges v3
-
-Ranges v3 is a C++ library designed to work with ranges of values, rather than individual values. It provides a set of utilities and algorithms to manipulate and transform ranges of values in an efficient and expressive way. The library is inspired by the Range concept proposed for inclusion in the C++ standard library for C++20.
-
----
-
-## Overview
-
-Ranges v3 includes three main components:
-
-- **Range adaptors:** These are composable algorithms that transform a range into a new range. They help to create lazy views over the data without actually modifying it.
-
-- **Action adaptors:** These are algorithms that modify a range in-place. For example, sorting or filtering elements in a container directly.
-
-- **Trait concepts and utility functions:** Provide tools for working with range types, like determining if a type is a range, getting the iterator type for a range, etc.
-
----
-
-## Code examples
-
-Here are some code examples of using the Ranges v3 library:
-
-## Including the library
-
-First, you need to include the appropriate header files from the library. To use the entire Ranges v3 library, you can simply include the `range/v3/all.hpp` header file:
-
-```cpp
-#include <range/v3/all.hpp>
-```
-
-## Using range adaptors
-
-You can use range adaptors to manipulate and transform ranges. For example, you can use the `view::filter` and `view::transform` adaptors to create a new range containing only even numbers and then square them:
-
-```cpp
-#include <iostream>
-#include <range/v3/all.hpp>
-
-using namespace ranges;
-
-int main() {
-    std::vector<int> numbers = {1, 2, 3, 4, 5, 6};
-
-    // Create a new range containing only even numbers, and then square them.
-    auto even_squares = numbers | view::filter([](int n) { return n % 2 == 0; })
-                                 | view::transform([](int n) { return n * n; });
-
-    // Print the even_squares range.
-    for (auto n : even_squares) {
-        std::cout << n << ' ';
-    }
-    // Output: 4 16 36
-
-    return 0;
-}
-```
-
-## Using action adaptors
-
-Action adaptors are used to modify ranges in-place. For example, you can use the `action::sort` and `action::unique` adaptors to sort and remove duplicate elements from a container:
-
-```cpp
-#include <iostream>
-#include <range/v3/all.hpp>
-
-using namespace ranges;
-
-int main() {
-    std::vector<int> numbers = {5, 3, 1, 4, 4, 2, 2};
-
-    // Sort the numbers and remove duplicates.
-    numbers |= action::sort | action::unique;
-
-    // Print the modified numbers vector.
-    for (auto n : numbers) {
-        std::cout << n << ' ';
-    }
-    // Output: 1 2 3 4 5
-
-    return 0;
-}
-```
-
-Ranges v3 provides a wide range of adaptors and actions to work with ranges in a more expressive and efficient way. You can explore more in the [official documentation](https://github.com/ericniebler/range-v3/blob/master/doc/index.md).
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/libraries/index.md b/src/data/roadmaps/cpp/content/libraries/index.md
deleted file mode 100644
index eb26dd23a..000000000
--- a/src/data/roadmaps/cpp/content/libraries/index.md
+++ /dev/null
@@ -1 +0,0 @@
-# Libraries
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/118-working-with-libs/100-inclusion.md b/src/data/roadmaps/cpp/content/library-inclusion@5mNqH_AEiLxUmgurNW1Fq.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/118-working-with-libs/100-inclusion.md
rename to src/data/roadmaps/cpp/content/library-inclusion@5mNqH_AEiLxUmgurNW1Fq.md
diff --git a/src/data/roadmaps/cpp/content/118-working-with-libs/101-licensing.md b/src/data/roadmaps/cpp/content/licensing@sLVs95EOeHZldoKY0L_dH.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/118-working-with-libs/101-licensing.md
rename to src/data/roadmaps/cpp/content/licensing@sLVs95EOeHZldoKY0L_dH.md
diff --git a/src/data/roadmaps/cpp/content/105-pointers-and-references/101-memory-model/100-object-lifetime.md b/src/data/roadmaps/cpp/content/lifetime-of-objects@9aA_-IfQ9WmbPgwic0mFN.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/105-pointers-and-references/101-memory-model/100-object-lifetime.md
rename to src/data/roadmaps/cpp/content/lifetime-of-objects@9aA_-IfQ9WmbPgwic0mFN.md
diff --git a/src/data/roadmaps/cpp/content/102-basic-operations/101-logical-operators.md b/src/data/roadmaps/cpp/content/logical-operators@Y9gq8WkDA_XGe68JkY2UZ.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/102-basic-operations/101-logical-operators.md
rename to src/data/roadmaps/cpp/content/logical-operators@Y9gq8WkDA_XGe68JkY2UZ.md
diff --git a/src/data/roadmaps/cpp/content/109-language-concepts/105-macros.md b/src/data/roadmaps/cpp/content/macros@zKdlfZTRHwjtmRUGW9z9-.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/109-language-concepts/105-macros.md
rename to src/data/roadmaps/cpp/content/macros@zKdlfZTRHwjtmRUGW9z9-.md
diff --git a/src/data/roadmaps/cpp/content/116-build-systems/101-makefile.md b/src/data/roadmaps/cpp/content/makefile@t6rZLH7l8JQm99ax_fEJ9.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/116-build-systems/101-makefile.md
rename to src/data/roadmaps/cpp/content/makefile@t6rZLH7l8JQm99ax_fEJ9.md
diff --git a/src/data/roadmaps/cpp/content/memory-leakage@6w0WExQ4lGIGgok6Thq0s.md b/src/data/roadmaps/cpp/content/memory-leakage@6w0WExQ4lGIGgok6Thq0s.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/cpp/content/105-pointers-and-references/101-memory-model/index.md b/src/data/roadmaps/cpp/content/memory-model@mSFwsTYvmg-GwG4_DEIEf.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/105-pointers-and-references/101-memory-model/index.md
rename to src/data/roadmaps/cpp/content/memory-model@mSFwsTYvmg-GwG4_DEIEf.md
diff --git a/src/data/roadmaps/cpp/content/107-structures-and-classes/102-multiple-inheritance/index.md b/src/data/roadmaps/cpp/content/multiple-inheritance@WjHpueZDK-d3oDNMVZi9w.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/107-structures-and-classes/102-multiple-inheritance/index.md
rename to src/data/roadmaps/cpp/content/multiple-inheritance@WjHpueZDK-d3oDNMVZi9w.md
diff --git a/src/data/roadmaps/cpp/content/110-stl/104-multithreading.md b/src/data/roadmaps/cpp/content/multithreading@OXQUPqxzs1-giAACwl3X1.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/110-stl/104-multithreading.md
rename to src/data/roadmaps/cpp/content/multithreading@OXQUPqxzs1-giAACwl3X1.md
diff --git a/src/data/roadmaps/cpp/content/109-language-concepts/104-name-mangling.md b/src/data/roadmaps/cpp/content/name-mangling@Lt7ss59KZw9Jwqj234jm2.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/109-language-concepts/104-name-mangling.md
rename to src/data/roadmaps/cpp/content/name-mangling@Lt7ss59KZw9Jwqj234jm2.md
diff --git a/src/data/roadmaps/cpp/content/106-structuring-codebase/100-scope/100-namespaces.md b/src/data/roadmaps/cpp/content/namespaces@iIdC7V8sojwyEqK1xMuHn.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/106-structuring-codebase/100-scope/100-namespaces.md
rename to src/data/roadmaps/cpp/content/namespaces@iIdC7V8sojwyEqK1xMuHn.md
diff --git a/src/data/roadmaps/cpp/content/newdelete-operators@Gld0nRs0sM8kRe8XmYolu.md b/src/data/roadmaps/cpp/content/newdelete-operators@Gld0nRs0sM8kRe8XmYolu.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/cpp/content/113-standards/103-newest.md b/src/data/roadmaps/cpp/content/newest@sxbbKtg7kMNbkx7fXhjR9.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/113-standards/103-newest.md
rename to src/data/roadmaps/cpp/content/newest@sxbbKtg7kMNbkx7fXhjR9.md
diff --git a/src/data/roadmaps/cpp/content/116-build-systems/102-ninja.md b/src/data/roadmaps/cpp/content/ninja@HkUCD5A_M9bJxJRElkK0x.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/116-build-systems/102-ninja.md
rename to src/data/roadmaps/cpp/content/ninja@HkUCD5A_M9bJxJRElkK0x.md
diff --git a/src/data/roadmaps/cpp/content/112-idioms/103-non-copyable.md b/src/data/roadmaps/cpp/content/non-copyable--non-moveable@xjUaIp8gGxkN-cp8emJ2M.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/112-idioms/103-non-copyable.md
rename to src/data/roadmaps/cpp/content/non-copyable--non-moveable@xjUaIp8gGxkN-cp8emJ2M.md
diff --git a/src/data/roadmaps/cpp/content/117-package-managers/103-nuget.md b/src/data/roadmaps/cpp/content/nuget@g0s0F4mLV16eNvMBflN2e.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/117-package-managers/103-nuget.md
rename to src/data/roadmaps/cpp/content/nuget@g0s0F4mLV16eNvMBflN2e.md
diff --git a/src/data/roadmaps/cpp/content/107-structures-and-classes/101-oop/index.md b/src/data/roadmaps/cpp/content/object-oriented-programming@b3-QYKNcW3LYCNOza3Olf.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/107-structures-and-classes/101-oop/index.md
rename to src/data/roadmaps/cpp/content/object-oriented-programming@b3-QYKNcW3LYCNOza3Olf.md
diff --git a/src/data/roadmaps/cpp/content/opencl@GGZJaYpRENaqloJzt0VtY.md b/src/data/roadmaps/cpp/content/opencl@GGZJaYpRENaqloJzt0VtY.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/cpp/content/opencv@Eq3TKSFJ2F2mrTHAaU2J4.md b/src/data/roadmaps/cpp/content/opencv@Eq3TKSFJ2F2mrTHAaU2J4.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/cpp/content/103-functions/101-operators.md b/src/data/roadmaps/cpp/content/operator-overloading@llCBeut_uc9IAe2oi4KZ9.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/103-functions/101-operators.md
rename to src/data/roadmaps/cpp/content/operator-overloading@llCBeut_uc9IAe2oi4KZ9.md
diff --git a/src/data/roadmaps/cpp/content/orbit-profiler@O0lVEMTAV1pq9sYCKQvh_.md b/src/data/roadmaps/cpp/content/orbit-profiler@O0lVEMTAV1pq9sYCKQvh_.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/cpp/content/117-package-managers/index.md b/src/data/roadmaps/cpp/content/package-managers@h29eJG1hWHa7vMhSqtfV2.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/117-package-managers/index.md
rename to src/data/roadmaps/cpp/content/package-managers@h29eJG1hWHa7vMhSqtfV2.md
diff --git a/src/data/roadmaps/cpp/content/111-templates/101-template-specialization/101-partial.md b/src/data/roadmaps/cpp/content/partial-template-specialization@1NYJtbdcdOB4-vIrnq4yX.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/111-templates/101-template-specialization/101-partial.md
rename to src/data/roadmaps/cpp/content/partial-template-specialization@1NYJtbdcdOB4-vIrnq4yX.md
diff --git a/src/data/roadmaps/cpp/content/112-idioms/101-pimpl.md b/src/data/roadmaps/cpp/content/pimpl@MEoWt8NKjPLVTeGgYf3cR.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/112-idioms/101-pimpl.md
rename to src/data/roadmaps/cpp/content/pimpl@MEoWt8NKjPLVTeGgYf3cR.md
diff --git a/src/data/roadmaps/cpp/content/poco@nOkniNXfXwPPlOEJHJoGl.md b/src/data/roadmaps/cpp/content/poco@nOkniNXfXwPPlOEJHJoGl.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/cpp/content/105-pointers-and-references/index.md b/src/data/roadmaps/cpp/content/pointers-and-references@DWw8NxkLpIpiOSUaZZ1oA.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/105-pointers-and-references/index.md
rename to src/data/roadmaps/cpp/content/pointers-and-references@DWw8NxkLpIpiOSUaZZ1oA.md
diff --git a/src/data/roadmaps/cpp/content/protobuf@jpMCIWQko7p3ndezYHL4D.md b/src/data/roadmaps/cpp/content/protobuf@jpMCIWQko7p3ndezYHL4D.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/cpp/content/pybind11@tEkvlJPAkD5fji-MMODL7.md b/src/data/roadmaps/cpp/content/pybind11@tEkvlJPAkD5fji-MMODL7.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/cpp/content/pytorch-c@88pr5aN7cctZfDVVo-2ns.md b/src/data/roadmaps/cpp/content/pytorch-c@88pr5aN7cctZfDVVo-2ns.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/cpp/content/qt@gAZ9Dqgj1_UkaLzVgzx1t.md b/src/data/roadmaps/cpp/content/qt@gAZ9Dqgj1_UkaLzVgzx1t.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/cpp/content/112-idioms/100-raii.md b/src/data/roadmaps/cpp/content/raii@OmHDlLxCnH8RDdu5vx9fl.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/112-idioms/100-raii.md
rename to src/data/roadmaps/cpp/content/raii@OmHDlLxCnH8RDdu5vx9fl.md
diff --git a/src/data/roadmaps/cpp/content/ranges_v3@et-dXKPYuyVW6eV2K3CM8.md b/src/data/roadmaps/cpp/content/ranges_v3@et-dXKPYuyVW6eV2K3CM8.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/cpp/content/raw-pointers@uEGEmbxegATIrvGfobJb9.md b/src/data/roadmaps/cpp/content/raw-pointers@uEGEmbxegATIrvGfobJb9.md
new file mode 100644
index 000000000..d339da434
--- /dev/null
+++ b/src/data/roadmaps/cpp/content/raw-pointers@uEGEmbxegATIrvGfobJb9.md
@@ -0,0 +1 @@
+# Raw Pointers
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/105-pointers-and-references/100-references.md b/src/data/roadmaps/cpp/content/references@uUzRKa9wGzdUwwmAg3FWr.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/105-pointers-and-references/100-references.md
rename to src/data/roadmaps/cpp/content/references@uUzRKa9wGzdUwwmAg3FWr.md
diff --git a/src/data/roadmaps/cpp/content/109-language-concepts/101-type-casting/103-reinterpret-cast.md b/src/data/roadmaps/cpp/content/reinterpret_cast@ZMyFDJrpCauGrY5NZkOwg.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/109-language-concepts/101-type-casting/103-reinterpret-cast.md
rename to src/data/roadmaps/cpp/content/reinterpret_cast@ZMyFDJrpCauGrY5NZkOwg.md
diff --git a/src/data/roadmaps/cpp/content/104-data-types/101-dynamic-typing/100-rtti.md b/src/data/roadmaps/cpp/content/rtti@r0yD1gfn03wTpEBi6zNsu.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/104-data-types/101-dynamic-typing/100-rtti.md
rename to src/data/roadmaps/cpp/content/rtti@r0yD1gfn03wTpEBi6zNsu.md
diff --git a/src/data/roadmaps/cpp/content/107-structures-and-classes/100-rule-of-zero-five-three.md b/src/data/roadmaps/cpp/content/rule-of-zero-five-three@7sdEzZCIoarzznwO4XcCv.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/107-structures-and-classes/100-rule-of-zero-five-three.md
rename to src/data/roadmaps/cpp/content/rule-of-zero-five-three@7sdEzZCIoarzznwO4XcCv.md
diff --git a/src/data/roadmaps/cpp/content/101-setting-up/102-first-program.md b/src/data/roadmaps/cpp/content/running-your-first-program@SEq0D2Zg5WTsIDtd1hW9f.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/101-setting-up/102-first-program.md
rename to src/data/roadmaps/cpp/content/running-your-first-program@SEq0D2Zg5WTsIDtd1hW9f.md
diff --git a/src/data/roadmaps/cpp/content/106-structuring-codebase/100-scope/index.md b/src/data/roadmaps/cpp/content/scope@dKCYmxDNZubCVcR5rf8b-.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/106-structuring-codebase/100-scope/index.md
rename to src/data/roadmaps/cpp/content/scope@dKCYmxDNZubCVcR5rf8b-.md
diff --git a/src/data/roadmaps/cpp/content/101-setting-up/index.md b/src/data/roadmaps/cpp/content/setting-up-your-environment@Zc_TTzmM36yWsu3GvOy9x.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/101-setting-up/index.md
rename to src/data/roadmaps/cpp/content/setting-up-your-environment@Zc_TTzmM36yWsu3GvOy9x.md
diff --git a/src/data/roadmaps/cpp/content/111-templates/103-finae.md b/src/data/roadmaps/cpp/content/sfinae@3C5UfejDX-1Z8ZF6C53xD.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/111-templates/103-finae.md
rename to src/data/roadmaps/cpp/content/sfinae@3C5UfejDX-1Z8ZF6C53xD.md
diff --git a/src/data/roadmaps/cpp/content/shared_ptr@b5jZIZD_U_CPg-_bdndjz.md b/src/data/roadmaps/cpp/content/shared_ptr@b5jZIZD_U_CPg-_bdndjz.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/cpp/content/smart-pointers@ulvwm4rRPgkpgaqGgyH5a.md b/src/data/roadmaps/cpp/content/smart-pointers@ulvwm4rRPgkpgaqGgyH5a.md
new file mode 100644
index 000000000..e7e5f80d0
--- /dev/null
+++ b/src/data/roadmaps/cpp/content/smart-pointers@ulvwm4rRPgkpgaqGgyH5a.md
@@ -0,0 +1 @@
+# Smart Pointers
\ No newline at end of file
diff --git a/src/data/roadmaps/cpp/content/117-package-managers/101-spack.md b/src/data/roadmaps/cpp/content/spack@3ehBc2sKVlPj7dn4RVZCH.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/117-package-managers/101-spack.md
rename to src/data/roadmaps/cpp/content/spack@3ehBc2sKVlPj7dn4RVZCH.md
diff --git a/src/data/roadmaps/cpp/content/spdlog@q64qFxoCrR38RPsN2lC8x.md b/src/data/roadmaps/cpp/content/spdlog@q64qFxoCrR38RPsN2lC8x.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/cpp/content/110-stl/index.md b/src/data/roadmaps/cpp/content/standard-library--stl@DHdNBP7_ixjr6h-dIQ7g6.md
similarity index 97%
rename from src/data/roadmaps/cpp/content/110-stl/index.md
rename to src/data/roadmaps/cpp/content/standard-library--stl@DHdNBP7_ixjr6h-dIQ7g6.md
index 3df82ffec..8876a95e8 100644
--- a/src/data/roadmaps/cpp/content/110-stl/index.md
+++ b/src/data/roadmaps/cpp/content/standard-library--stl@DHdNBP7_ixjr6h-dIQ7g6.md
@@ -77,7 +77,7 @@ For example, to iterate through a vector and print its elements, you can use the
 
 ```cpp
 std::vector<int> my_vec = {1, 2, 3, 4, 5};
-for(auto it = my_vec.begin(); it != my_vec.end(); ++it) {
+for (auto it = my_vec.begin(); it != my_vec.end(); ++it) {
     std::cout << *it << " ";
 }
 ```
diff --git a/src/data/roadmaps/cpp/content/113-standards/index.md b/src/data/roadmaps/cpp/content/standardds@vvE1aUsWbF1OFcmMUHbJa.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/113-standards/index.md
rename to src/data/roadmaps/cpp/content/standardds@vvE1aUsWbF1OFcmMUHbJa.md
diff --git a/src/data/roadmaps/cpp/content/107-structures-and-classes/101-oop/100-static-polymorphism/index.md b/src/data/roadmaps/cpp/content/static-polymorphism@obZIxRp0eMWdG7gplNIBc.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/107-structures-and-classes/101-oop/100-static-polymorphism/index.md
rename to src/data/roadmaps/cpp/content/static-polymorphism@obZIxRp0eMWdG7gplNIBc.md
diff --git a/src/data/roadmaps/cpp/content/104-data-types/100-static-typing.md b/src/data/roadmaps/cpp/content/static-typing@f1djN0GxoeVPr_0cl6vMq.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/104-data-types/100-static-typing.md
rename to src/data/roadmaps/cpp/content/static-typing@f1djN0GxoeVPr_0cl6vMq.md
diff --git a/src/data/roadmaps/cpp/content/109-language-concepts/101-type-casting/100-static-cast.md b/src/data/roadmaps/cpp/content/static_cast@_XB2Imyf23-6AOeoNLhYQ.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/109-language-concepts/101-type-casting/100-static-cast.md
rename to src/data/roadmaps/cpp/content/static_cast@_XB2Imyf23-6AOeoNLhYQ.md
diff --git a/src/data/roadmaps/cpp/content/107-structures-and-classes/index.md b/src/data/roadmaps/cpp/content/structures-and-classes@CMlWNQwpywNhO9B6Yj6Me.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/107-structures-and-classes/index.md
rename to src/data/roadmaps/cpp/content/structures-and-classes@CMlWNQwpywNhO9B6Yj6Me.md
diff --git a/src/data/roadmaps/cpp/content/106-structuring-codebase/index.md b/src/data/roadmaps/cpp/content/structuring-codebase@Zw2AOTK5uc9BoKEpY7W1C.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/106-structuring-codebase/index.md
rename to src/data/roadmaps/cpp/content/structuring-codebase@Zw2AOTK5uc9BoKEpY7W1C.md
diff --git a/src/data/roadmaps/cpp/content/111-templates/101-template-specialization/index.md b/src/data/roadmaps/cpp/content/template-specialization@sObOuccY0PDeGG-9GrFDF.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/111-templates/101-template-specialization/index.md
rename to src/data/roadmaps/cpp/content/template-specialization@sObOuccY0PDeGG-9GrFDF.md
diff --git a/src/data/roadmaps/cpp/content/111-templates/index.md b/src/data/roadmaps/cpp/content/templates@-6AOrbuOE7DJCmxlcgCay.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/111-templates/index.md
rename to src/data/roadmaps/cpp/content/templates@-6AOrbuOE7DJCmxlcgCay.md
diff --git a/src/data/roadmaps/cpp/content/tensorflow@j_eNHhs0J08Dt7HVbo4Q2.md b/src/data/roadmaps/cpp/content/tensorflow@j_eNHhs0J08Dt7HVbo4Q2.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/cpp/content/109-language-concepts/101-type-casting/index.md b/src/data/roadmaps/cpp/content/type-casting@PiMhw1oP9-NZEa6I9u4lX.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/109-language-concepts/101-type-casting/index.md
rename to src/data/roadmaps/cpp/content/type-casting@PiMhw1oP9-NZEa6I9u4lX.md
diff --git a/src/data/roadmaps/cpp/content/111-templates/102-type-traits.md b/src/data/roadmaps/cpp/content/type-traits@WptReUOwVth3C9-AVmMHF.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/111-templates/102-type-traits.md
rename to src/data/roadmaps/cpp/content/type-traits@WptReUOwVth3C9-AVmMHF.md
diff --git a/src/data/roadmaps/cpp/content/109-language-concepts/102-undefined-behavior.md b/src/data/roadmaps/cpp/content/undefined-behavior-ub@IDOlquv6jlfecwQoBwkGZ.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/109-language-concepts/102-undefined-behavior.md
rename to src/data/roadmaps/cpp/content/undefined-behavior-ub@IDOlquv6jlfecwQoBwkGZ.md
diff --git a/src/data/roadmaps/cpp/content/114-debuggers/100-debugger-messages.md b/src/data/roadmaps/cpp/content/understanding-debugger-messages@VtPb8-AJKzhTB0QbMtoU4.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/114-debuggers/100-debugger-messages.md
rename to src/data/roadmaps/cpp/content/understanding-debugger-messages@VtPb8-AJKzhTB0QbMtoU4.md
diff --git a/src/data/roadmaps/cpp/content/unique_ptr@k9c5seRkhgm_yHPpiz2X0.md b/src/data/roadmaps/cpp/content/unique_ptr@k9c5seRkhgm_yHPpiz2X0.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/cpp/content/111-templates/100-variadic-templates.md b/src/data/roadmaps/cpp/content/variadic-templates@w4EIf58KP-Pq-yc0HlGxc.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/111-templates/100-variadic-templates.md
rename to src/data/roadmaps/cpp/content/variadic-templates@w4EIf58KP-Pq-yc0HlGxc.md
diff --git a/src/data/roadmaps/cpp/content/117-package-managers/100-vcpkg.md b/src/data/roadmaps/cpp/content/vcpkg@PKG5pACLfRS2ogfzBX47_.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/117-package-managers/100-vcpkg.md
rename to src/data/roadmaps/cpp/content/vcpkg@PKG5pACLfRS2ogfzBX47_.md
diff --git a/src/data/roadmaps/cpp/content/virtual-methods@hNBErGNiegLsUJn_vgcOR.md b/src/data/roadmaps/cpp/content/virtual-methods@hNBErGNiegLsUJn_vgcOR.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/cpp/content/virtual-tables@s99ImazcwCgAESxZd8ksa.md b/src/data/roadmaps/cpp/content/virtual-tables@s99ImazcwCgAESxZd8ksa.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/cpp/content/weak_ptr@vUwSS-uX36OWZouO0wOcy.md b/src/data/roadmaps/cpp/content/weak_ptr@vUwSS-uX36OWZouO0wOcy.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/cpp/content/100-introduction/100-what-is-cpp.md b/src/data/roadmaps/cpp/content/what-is-c@x_28LiDVshqWns_aIBsdx.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/100-introduction/100-what-is-cpp.md
rename to src/data/roadmaps/cpp/content/what-is-c@x_28LiDVshqWns_aIBsdx.md
diff --git a/src/data/roadmaps/cpp/content/100-introduction/101-why-cpp.md b/src/data/roadmaps/cpp/content/why-use-c@tl6VCQ5IEGDVyFcgj7jDm.md
similarity index 96%
rename from src/data/roadmaps/cpp/content/100-introduction/101-why-cpp.md
rename to src/data/roadmaps/cpp/content/why-use-c@tl6VCQ5IEGDVyFcgj7jDm.md
index a748cb5c1..97490e21c 100644
--- a/src/data/roadmaps/cpp/content/100-introduction/101-why-cpp.md
+++ b/src/data/roadmaps/cpp/content/why-use-c@tl6VCQ5IEGDVyFcgj7jDm.md
@@ -42,7 +42,7 @@ int main() {
 
     // High-level programming
     std::vector<int> myVector = {1, 2, 3};
-    for(const auto &i: myVector) {
+    for (const auto &i: myVector) {
         std::cout << i << std::endl;
     }
 }
diff --git a/src/data/roadmaps/cpp/content/114-debuggers/102-win-dbg.md b/src/data/roadmaps/cpp/content/windbg@y8VCbGDUco9bzGRfIBD8R.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/114-debuggers/102-win-dbg.md
rename to src/data/roadmaps/cpp/content/windbg@y8VCbGDUco9bzGRfIBD8R.md
diff --git a/src/data/roadmaps/cpp/content/118-working-with-libs/index.md b/src/data/roadmaps/cpp/content/working-with-libraries@4kkX5g_-plX9zVqr0ZoiR.md
similarity index 100%
rename from src/data/roadmaps/cpp/content/118-working-with-libs/index.md
rename to src/data/roadmaps/cpp/content/working-with-libraries@4kkX5g_-plX9zVqr0ZoiR.md
diff --git a/src/data/roadmaps/cpp/cpp.json b/src/data/roadmaps/cpp/cpp.json
index 3bb030b43..404e1ad89 100644
--- a/src/data/roadmaps/cpp/cpp.json
+++ b/src/data/roadmaps/cpp/cpp.json
@@ -1,16070 +1,5505 @@
 {
-  "mockup": {
-    "controls": {
-      "control": [
-        {
-          "ID": "4511",
-          "typeID": "Arrow",
-          "zOrder": "0",
-          "w": "1",
-          "h": "147",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1100",
-          "y": "3336",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.4784172661870499,
-              "y": -0.0014388489208635442
-            },
-            "p2": {
-              "x": 0,
-              "y": 146.67245707612938
-            }
-          }
-        },
-        {
-          "ID": "4512",
-          "typeID": "Arrow",
-          "zOrder": "1",
-          "w": "1053",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "475",
-          "y": "2981",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": -0.14599859981393593,
-              "y": 1
-            },
-            "p1": {
-              "x": 0.5094183863981452,
-              "y": 0.00090101782394456
-            },
-            "p2": {
-              "x": 1052.4781385743524,
-              "y": 1
-            }
-          }
-        },
-        {
-          "ID": "4513",
-          "typeID": "Arrow",
-          "zOrder": "2",
-          "w": "1",
-          "h": "68",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1522",
-          "y": "2983",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.3738002047268765,
-              "y": 0.389598287314584
-            },
-            "p1": {
-              "x": 0.5094183863981457,
-              "y": 0.0009010178239445603
-            },
-            "p2": {
-              "x": -0.3738002047268765,
-              "y": 68.41890188219668
-            }
-          }
-        },
-        {
-          "ID": "4514",
-          "typeID": "Arrow",
-          "zOrder": "3",
-          "w": "1",
-          "h": "147",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1522",
-          "y": "2836",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.4784172661870499,
-              "y": -0.0014388489208635442
-            },
-            "p2": {
-              "x": 0,
-              "y": 146.67245707612938
-            }
-          }
-        },
-        {
-          "ID": "4515",
-          "typeID": "Arrow",
-          "zOrder": "4",
-          "w": "1",
-          "h": "101",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1558",
-          "y": "2729",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.3738002047268765,
-              "y": 0.389598287314584
-            },
-            "p1": {
-              "x": 0.5094183863981457,
-              "y": 0.0009010178239445605
-            },
-            "p2": {
-              "x": -0.3738002047268765,
-              "y": 101.56508807523778
-            }
-          }
-        },
-        {
-          "ID": "4516",
-          "typeID": "Arrow",
-          "zOrder": "5",
-          "w": "1",
-          "h": "101",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1459",
-          "y": "2729",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.3738002047268765,
-              "y": 0.389598287314584
-            },
-            "p1": {
-              "x": 0.5094183863981457,
-              "y": 0.0009010178239445605
-            },
-            "p2": {
-              "x": -0.3738002047268765,
-              "y": 101.56508807523778
-            }
-          }
-        },
-        {
-          "ID": "4517",
-          "typeID": "Arrow",
-          "zOrder": "6",
-          "w": "1",
-          "h": "116",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1159",
-          "y": "2729",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": -0.3738002047268765,
-              "y": 0.389598287314584
-            },
-            "p1": {
-              "x": 0.5094183863981456,
-              "y": 0.0009010178239445603
-            },
-            "p2": {
-              "x": -0.3738002047268765,
-              "y": 116.6863074097705
-            },
-            "stroke": "dotted"
-          }
-        },
-        {
-          "ID": "4518",
-          "typeID": "TextArea",
-          "zOrder": "7",
-          "w": "151",
-          "h": "209",
-          "measuredW": "200",
-          "measuredH": "140",
-          "x": "669",
-          "y": "2560",
-          "properties": {
-            "size": "12"
-          }
-        },
-        {
-          "ID": "4519",
-          "typeID": "Arrow",
-          "zOrder": "8",
-          "w": "1",
-          "h": "190",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "819",
-          "y": "2396",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": -0.3738002047268765,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5094183863981455,
-              "y": 0.0009010178239445601
-            },
-            "p2": {
-              "x": -0.3738002047268765,
-              "y": 189.73287212529976
-            },
-            "stroke": "dotted"
-          }
-        },
-        {
-          "ID": "4520",
-          "typeID": "Arrow",
-          "zOrder": "9",
-          "w": "653",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "477",
-          "y": "2497",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0.29177514116184966,
-              "y": 1
-            },
-            "p1": {
-              "x": 0.5094183863981455,
-              "y": 0.0009010178239445598
-            },
-            "p2": {
-              "x": 652.9300411642978,
-              "y": 1
-            }
-          }
-        },
-        {
-          "ID": "4521",
-          "typeID": "Arrow",
-          "zOrder": "10",
-          "w": "135",
-          "h": "97",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1212",
-          "y": "2513",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.31135115406141267,
-              "y": 0.46279090838925185
-            },
-            "p1": {
-              "x": 0.4839784419402247,
-              "y": 0.14091131798138176
-            },
-            "p2": {
-              "x": 134.9965025128497,
-              "y": 97.37039981288308
-            }
-          }
-        },
-        {
-          "ID": "4522",
-          "typeID": "Arrow",
-          "zOrder": "11",
-          "w": "103",
-          "h": "46",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1240",
-          "y": "2512",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.23388253332245768,
-              "y": -0.17971093744972677
-            },
-            "p1": {
-              "x": 0.5905743740795274,
-              "y": 0.13549337260677535
-            },
-            "p2": {
-              "x": 103.71149882117197,
-              "y": 45.810340746038946
-            }
-          }
-        },
-        {
-          "ID": "4523",
-          "typeID": "Arrow",
-          "zOrder": "12",
-          "w": "118",
-          "h": "3",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1230",
-          "y": "2497",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.3788714582890407,
-              "y": 0.3952706041613965
-            },
-            "p1": {
-              "x": 0.5093283582089555,
-              "y": 0.0008582089552239446
-            },
-            "p2": {
-              "x": 118.63900435868845,
-              "y": 3.6802742958393537
-            }
-          }
-        },
-        {
-          "ID": "4524",
-          "typeID": "Arrow",
-          "zOrder": "13",
-          "w": "1",
-          "h": "177",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1159",
-          "y": "2313",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": -0.0699588357022094,
-              "y": 177.46776506664492
-            },
-            "p1": {
-              "x": 0.5094183863981457,
-              "y": 0.0009010178239445597
-            },
-            "p2": {
-              "x": -0.0699588357022094,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4525",
-          "typeID": "Arrow",
-          "zOrder": "14",
-          "w": "251",
-          "h": "204",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1166",
-          "y": "2107",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.49995145234674965,
-              "y": 203.613812947287
-            },
-            "p1": {
-              "x": 0.48407889648059815,
-              "y": -0.07206394224571401
-            },
-            "p2": {
-              "x": 250.8028309610022,
-              "y": -0.056415936734083516
-            }
-          }
-        },
-        {
-          "ID": "4526",
-          "typeID": "Arrow",
-          "zOrder": "15",
-          "w": "218",
-          "h": "138",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1200",
-          "y": "2163",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.007412689730244892,
-              "y": 137.75880187225403
-            },
-            "p1": {
-              "x": 0.468185744252046,
-              "y": -0.07469255130999888
-            },
-            "p2": {
-              "x": 218.44533280684095,
-              "y": -0.2113531782119935
-            }
-          }
-        },
-        {
-          "ID": "4527",
-          "typeID": "Arrow",
-          "zOrder": "16",
-          "w": "209",
-          "h": "89",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1210",
-          "y": "2214",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.15240161469705527,
-              "y": 88.40130371809255
-            },
-            "p1": {
-              "x": 0.50082595424561,
-              "y": -0.06635119086251119
-            },
-            "p2": {
-              "x": 208.44533280684095,
-              "y": -0.2937959572068394
-            }
-          }
-        },
-        {
-          "ID": "4528",
-          "typeID": "Arrow",
-          "zOrder": "17",
-          "w": "191",
-          "h": "43",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1226",
-          "y": "2263",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.2726168436918215,
-              "y": 42.68630740977051
-            },
-            "p1": {
-              "x": 0.5486967074016806,
-              "y": -0.05138415466209874
-            },
-            "p2": {
-              "x": 190.8028309610022,
-              "y": -0.01874058204020912
-            }
-          }
-        },
-        {
-          "ID": "4529",
-          "typeID": "Arrow",
-          "zOrder": "18",
-          "w": "181",
-          "h": "3",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1244",
-          "y": "2317",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.34013714791967686,
-              "y": 3.4688240223204048
-            },
-            "p1": {
-              "x": 0.5093283582089555,
-              "y": 0.000858208955223941
-            },
-            "p2": {
-              "x": 181.01534019019664,
-              "y": 0.18382033064290226
-            }
-          }
-        },
-        {
-          "ID": "4530",
-          "typeID": "Arrow",
-          "zOrder": "19",
-          "w": "332",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "827",
-          "y": "2177",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0.28965722981035924,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5094183863981457,
-              "y": 0.0009010178239445598
-            },
-            "p2": {
-              "x": 331.9300411642978,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4531",
-          "typeID": "Arrow",
-          "zOrder": "20",
-          "w": "105",
-          "h": "98",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "647",
-          "y": "2057",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.09556796253320954,
-              "y": -0.35634210317903126
-            },
-            "p1": {
-              "x": 0.5082179448571936,
-              "y": -0.1619513449521908
-            },
-            "p2": {
-              "x": 104.58958339625508,
-              "y": 97.57613759259357
-            }
-          }
-        },
-        {
-          "ID": "4532",
-          "typeID": "Arrow",
-          "zOrder": "21",
-          "w": "123",
-          "h": "42",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "637",
-          "y": "2117",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.09556796253320954,
-              "y": -0.35634210317903126
-            },
-            "p1": {
-              "x": 0.4632734799449753,
-              "y": -0.11318366133437698
-            },
-            "p2": {
-              "x": 122.80209262544952,
-              "y": 40.86114128427107
-            }
-          }
-        },
-        {
-          "ID": "4533",
-          "typeID": "Arrow",
-          "zOrder": "22",
-          "w": "99",
-          "h": "99",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "648",
-          "y": "2179",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.11196710840556534,
-              "y": 98.76377603050969
-            },
-            "p1": {
-              "x": 0.4535196131112306,
-              "y": 0.16469639978506187
-            },
-            "p2": {
-              "x": 98.66207785873837,
-              "y": 0.2136652801764285
-            }
-          }
-        },
-        {
-          "ID": "4534",
-          "typeID": "Arrow",
-          "zOrder": "23",
-          "w": "90",
-          "h": "46",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "643",
-          "y": "2179",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.18446157088885684,
-              "y": 46.203716963665556
-            },
-            "p1": {
-              "x": 0.4015719251962475,
-              "y": 0.16354484698292773
-            },
-            "p2": {
-              "x": 90.52206309202734,
-              "y": 0.2136652801764285
-            }
-          }
-        },
-        {
-          "ID": "4535",
-          "typeID": "Arrow",
-          "zOrder": "24",
-          "w": "133",
-          "h": "3",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "617",
-          "y": "2170",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.09556796253320954,
-              "y": 2.6436578968209687
-            },
-            "p1": {
-              "x": 0.5093283582089554,
-              "y": 0.0008582089552239398
-            },
-            "p2": {
-              "x": 132.81818181818176,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4536",
-          "typeID": "Arrow",
-          "zOrder": "25",
-          "w": "1",
-          "h": "108",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1161",
-          "y": "2050",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": -0.3738002047268765,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5094183863981457,
-              "y": 0.0009010178239445601
-            },
-            "p2": {
-              "x": -0.3738002047268765,
-              "y": 107.89490143638523
-            }
-          }
-        },
-        {
-          "ID": "4537",
-          "typeID": "Arrow",
-          "zOrder": "26",
-          "w": "88",
-          "h": "47",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "645",
-          "y": "1895",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.377247085476597,
-              "y": 0.2453785840434648
-            },
-            "p1": {
-              "x": 0.39353169469599014,
-              "y": -0.14954721862871956
-            },
-            "p2": {
-              "x": 88.75678897330613,
-              "y": 47.4067401960549
-            }
-          }
-        },
-        {
-          "ID": "4538",
-          "typeID": "Arrow",
-          "zOrder": "27",
-          "w": "132",
-          "h": "4",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "613",
-          "y": "1951",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.20182257713042873,
-              "y": 0.4421559398138015
-            },
-            "p1": {
-              "x": 0.5093283582089555,
-              "y": 0.0008582089552239413
-            },
-            "p2": {
-              "x": 131.81818181818176,
-              "y": 4
-            }
-          }
-        },
-        {
-          "ID": "4539",
-          "typeID": "Arrow",
-          "zOrder": "28",
-          "w": "176",
-          "h": "140",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "916",
-          "y": "1889",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.4065014011649737,
-              "y": 0.31208948961398164
-            },
-            "p1": {
-              "x": 0.5646685303960005,
-              "y": -0.1042652665453224
-            },
-            "p2": {
-              "x": 175.27003031855452,
-              "y": 140.4203934280083
-            }
-          }
-        },
-        {
-          "ID": "4540",
-          "typeID": "Arrow",
-          "zOrder": "29",
-          "w": "156",
-          "h": "96",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "909",
-          "y": "1942",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.023491215479452876,
-              "y": -0.12785144354165823
-            },
-            "p1": {
-              "x": 0.46550407345571637,
-              "y": -0.07990517527983494
-            },
-            "p2": {
-              "x": 156.1158220740574,
-              "y": 95.67961708416533
-            }
-          }
-        },
-        {
-          "ID": "4541",
-          "typeID": "Arrow",
-          "zOrder": "30",
-          "w": "160",
-          "h": "48",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "902",
-          "y": "1998",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.393939393939263,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.4982118911346556,
-              "y": -0.04637376912783025
-            },
-            "p2": {
-              "x": 160.36274752200507,
-              "y": 47.93884074032235
-            }
-          }
-        },
-        {
-          "ID": "4542",
-          "typeID": "Arrow",
-          "zOrder": "31",
-          "w": "159",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "902",
-          "y": "2057",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.393939393939263,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5093283582089556,
-              "y": 0.0008582089552239403
-            },
-            "p2": {
-              "x": 158.98621024597878,
-              "y": 0.4449898444270275
-            }
-          }
-        },
-        {
-          "ID": "4543",
-          "typeID": "Arrow",
-          "zOrder": "32",
-          "w": "96",
-          "h": "41",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1345",
-          "y": "1905",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.33333333333325754,
-              "y": 41
-            },
-            "p1": {
-              "x": 0.43118692069457804,
-              "y": 0.1239510438908394
-            },
-            "p2": {
-              "x": 95.66666666666674,
-              "y": -0.33333333333325754
-            }
-          }
-        },
-        {
-          "ID": "4544",
-          "typeID": "Arrow",
-          "zOrder": "33",
-          "w": "107",
-          "h": "39",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1339",
-          "y": "1841",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.33333333333325754,
-              "y": 0.33333333333325754
-            },
-            "p1": {
-              "x": 0.5200174349604124,
-              "y": -0.10336215208054722
-            },
-            "p2": {
-              "x": 107,
-              "y": 39
-            }
-          }
-        },
-        {
-          "ID": "4545",
-          "typeID": "Arrow",
-          "zOrder": "34",
-          "w": "142",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1294",
-          "y": "1892",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0.393939393939263,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5093283582089555,
-              "y": 0.0008582089552239402
-            },
-            "p2": {
-              "x": 142.81818181818176,
-              "y": 0
-            },
-            "stroke": "dotted"
-          }
-        },
-        {
-          "ID": "4546",
-          "typeID": "Arrow",
-          "zOrder": "35",
-          "w": "343",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1276",
-          "y": "1746",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0.36363636363637397,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5094183863981457,
-              "y": 0.0009010178239445597
-            },
-            "p2": {
-              "x": 343.05666933709745,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4547",
-          "typeID": "Arrow",
-          "zOrder": "36",
-          "w": "182",
-          "h": "200",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "902",
-          "y": "1524",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.393939393939263,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5676904598651433,
-              "y": -0.07934213880133886
-            },
-            "p2": {
-              "x": 182.66666666666674,
-              "y": 200
-            }
-          }
-        },
-        {
-          "ID": "4548",
-          "typeID": "Arrow",
-          "zOrder": "37",
-          "w": "169",
-          "h": "147",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "902",
-          "y": "1581",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.393939393939263,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5295305168083262,
-              "y": -0.08532055409150152
-            },
-            "p2": {
-              "x": 169.33333333333326,
-              "y": 147
-            }
-          }
-        },
-        {
-          "ID": "4549",
-          "typeID": "Arrow",
-          "zOrder": "38",
-          "w": "145",
-          "h": "39",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "893",
-          "y": "1688",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.393939393939263,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5016338931758112,
-              "y": -0.07799721657724405
-            },
-            "p2": {
-              "x": 145,
-              "y": 38.66666666666674
-            }
-          }
-        },
-        {
-          "ID": "4550",
-          "typeID": "Arrow",
-          "zOrder": "39",
-          "w": "145",
-          "h": "85",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "902",
-          "y": "1635",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0,
-              "y": -0.33333333333325754
-            },
-            "p1": {
-              "x": 0.5593457052347596,
-              "y": -0.09606994031820805
-            },
-            "p2": {
-              "x": 145.33333333333326,
-              "y": 85
-            }
-          }
-        },
-        {
-          "ID": "4551",
-          "typeID": "Arrow",
-          "zOrder": "40",
-          "w": "142",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "895",
-          "y": "1739",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0.393939393939263,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5093283582089555,
-              "y": 0.0008582089552239402
-            },
-            "p2": {
-              "x": 142.81818181818176,
-              "y": 0
-            },
-            "stroke": "dotted"
-          }
-        },
-        {
-          "ID": "4552",
-          "typeID": "Arrow",
-          "zOrder": "41",
-          "w": "67",
-          "h": "45",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1395",
-          "y": "1522",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.33333333333325754,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.48318584070796416,
-              "y": -0.14778761061947046
-            },
-            "p2": {
-              "x": 67,
-              "y": 44.66666666666674
-            }
-          }
-        },
-        {
-          "ID": "4553",
-          "typeID": "Arrow",
-          "zOrder": "42",
-          "w": "332",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1286",
-          "y": "1725",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5094183863981456,
-              "y": 0.0009010178239445595
-            },
-            "p2": {
-              "x": 332,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4554",
-          "typeID": "Arrow",
-          "zOrder": "43",
-          "w": "108",
-          "h": "74",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "534",
-          "y": "1592",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.3636363636362603,
-              "y": 74.24242424242425
-            },
-            "p1": {
-              "x": 0.48447653429602944,
-              "y": 0.13140794223826668
-            },
-            "p2": {
-              "x": 107.93939393939377,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4555",
-          "typeID": "Arrow",
-          "zOrder": "44",
-          "w": "103",
-          "h": "30",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "536",
-          "y": "1587",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.12121212121223834,
-              "y": 30.75757575757575
-            },
-            "p1": {
-              "x": 0.3988125298095009,
-              "y": 0.09582877423336884
-            },
-            "p2": {
-              "x": 102.90909090909076,
-              "y": 0.4545454545452685
-            }
-          }
-        },
-        {
-          "ID": "4556",
-          "typeID": "Arrow",
-          "zOrder": "45",
-          "w": "91",
-          "h": "21",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "536",
-          "y": "1554",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.12121212121223834,
-              "y": 0.12121212121201097
-            },
-            "p1": {
-              "x": 0.479452054794521,
-              "y": -0.054794520547945855
-            },
-            "p2": {
-              "x": 90.78787878787875,
-              "y": 21.333333333333258
-            }
-          }
-        },
-        {
-          "ID": "4557",
-          "typeID": "Arrow",
-          "zOrder": "46",
-          "w": "106",
-          "h": "58",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "536",
-          "y": "1509",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.12121212121223834,
-              "y": -0.3333333333334849
-            },
-            "p1": {
-              "x": 0.5537436216802392,
-              "y": -0.10931033790023838
-            },
-            "p2": {
-              "x": 105.93939393939377,
-              "y": 57.24242424242425
-            }
-          }
-        },
-        {
-          "ID": "4558",
-          "typeID": "Arrow",
-          "zOrder": "47",
-          "w": "1",
-          "h": "71",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1311",
-          "y": "1449",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.09090909090900823,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5093283582089554,
-              "y": 0.0008582089552239402
-            },
-            "p2": {
-              "x": 0.09090909090900823,
-              "y": 70.74029870271806
-            }
-          }
-        },
-        {
-          "ID": "4559",
-          "typeID": "Arrow",
-          "zOrder": "48",
-          "w": "144",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1371",
-          "y": "1576",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.09090909090900823,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5093283582089554,
-              "y": 0.0008582089552239402
-            },
-            "p2": {
-              "x": 144.36363636363626,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4560",
-          "typeID": "Arrow",
-          "zOrder": "49",
-          "w": "317",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1301",
-          "y": "1329",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5094183863981456,
-              "y": 0.0009010178239445595
-            },
-            "p2": {
-              "x": 317,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4561",
-          "typeID": "Arrow",
-          "zOrder": "50",
-          "w": "1",
-          "h": "79",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1072",
-          "y": "1404",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0,
-              "y": -0.36165903546771005
-            },
-            "p1": {
-              "x": 0.4583333333333334,
-              "y": -0.0053333333333334815
-            },
-            "p2": {
-              "x": 0,
-              "y": 78.939393939394
-            }
-          }
-        },
-        {
-          "ID": "4562",
-          "typeID": "Arrow",
-          "zOrder": "51",
-          "w": "1",
-          "h": "182",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1138",
-          "y": "1225",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 1,
-              "y": 0.12121212121212466
-            },
-            "p1": {
-              "x": 0.45833333333333337,
-              "y": -0.005333333333333482
-            },
-            "p2": {
-              "x": 1,
-              "y": 181.939393939394
-            }
-          }
-        },
-        {
-          "ID": "4563",
-          "typeID": "Arrow",
-          "zOrder": "52",
-          "w": "142",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1012",
-          "y": "1320",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0.393939393939263,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5093283582089555,
-              "y": 0.0008582089552239402
-            },
-            "p2": {
-              "x": 142.81818181818176,
-              "y": 0
-            },
-            "stroke": "dotted"
-          }
-        },
-        {
-          "ID": "4564",
-          "typeID": "Arrow",
-          "zOrder": "53",
-          "w": "81",
-          "h": "29",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "694",
-          "y": "1284",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.0833624645489408,
-              "y": -0.15886623034634795
-            },
-            "p1": {
-              "x": 0.48412676520757086,
-              "y": -0.1636924252691052
-            },
-            "p2": {
-              "x": 81,
-              "y": 26
-            }
-          }
-        },
-        {
-          "ID": "4565",
-          "typeID": "Arrow",
-          "zOrder": "54",
-          "w": "90",
-          "h": "32",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "691",
-          "y": "1325",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.22138807875808197,
-              "y": 31.54564572240747
-            },
-            "p1": {
-              "x": 0.4836642440208913,
-              "y": 0.09966211979014447
-            },
-            "p2": {
-              "x": 90,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4566",
-          "typeID": "Arrow",
-          "zOrder": "55",
-          "w": "317",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1299",
-          "y": "1122",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5094183863981456,
-              "y": 0.0009010178239445595
-            },
-            "p2": {
-              "x": 317,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4567",
-          "typeID": "Arrow",
-          "zOrder": "56",
-          "w": "1",
-          "h": "191",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1617",
-          "y": "1121",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 1,
-              "y": -0.0471924829330419
-            },
-            "p1": {
-              "x": 0.47172764625317937,
-              "y": -0.006652318528664226
-            },
-            "p2": {
-              "x": 1,
-              "y": 190.66666666666674
-            }
-          }
-        },
-        {
-          "ID": "4568",
-          "typeID": "Arrow",
-          "zOrder": "57",
-          "w": "812",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "690",
-          "y": "759",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0.060606060606005485,
-              "y": 1
-            },
-            "p1": {
-              "x": 0.5093283582089554,
-              "y": 0.0008582089552239402
-            },
-            "p2": {
-              "x": 812.181818181818,
-              "y": 1
-            }
-          }
-        },
-        {
-          "ID": "4569",
-          "typeID": "Arrow",
-          "zOrder": "58",
-          "w": "144",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1372",
-          "y": "1046",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.09090909090900823,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5093283582089554,
-              "y": 0.0008582089552239402
-            },
-            "p2": {
-              "x": 144.36363636363626,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4570",
-          "typeID": "Arrow",
-          "zOrder": "59",
-          "w": "1",
-          "h": "92",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1344",
-          "y": "1029",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0,
-              "y": 0.24242424242424931
-            },
-            "p1": {
-              "x": 0.4583333333333333,
-              "y": -0.005333333333333485
-            },
-            "p2": {
-              "x": 0,
-              "y": 92.66666666666652
-            }
-          }
-        },
-        {
-          "ID": "4571",
-          "typeID": "Arrow",
-          "zOrder": "60",
-          "w": "1",
-          "h": "195",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "898",
-          "y": "928",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 1,
-              "y": 0.48484848484849863
-            },
-            "p1": {
-              "x": 0.47172764625317914,
-              "y": -0.006652318528664224
-            },
-            "p2": {
-              "x": 1,
-              "y": 195.18181818181824
-            }
-          }
-        },
-        {
-          "ID": "4572",
-          "typeID": "Arrow",
-          "zOrder": "61",
-          "w": "259",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "899",
-          "y": "1123",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0.15721761739848716,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5093283582089556,
-              "y": 0.0008582089552239404
-            },
-            "p2": {
-              "x": 258.72727272727275,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4573",
-          "typeID": "Arrow",
-          "zOrder": "62",
-          "w": "127",
-          "h": "38",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "554",
-          "y": "883",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 0.01671894307094135,
-              "y": -0.33883642656917345
-            },
-            "p1": {
-              "x": 0.44088976580194206,
-              "y": -0.11520512326000698
-            },
-            "p2": {
-              "x": 127.21212121212113,
-              "y": 36.90909090909088
-            }
-          }
-        },
-        {
-          "ID": "4574",
-          "typeID": "Arrow",
-          "zOrder": "63",
-          "w": "1",
-          "h": "87",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "476",
-          "y": "812",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.09090909090912191,
-              "y": -0.42424242424249314
-            },
-            "p1": {
-              "x": 0.5087719298245618,
-              "y": 0.00318979266347666
-            },
-            "p2": {
-              "x": -0.09090909090912191,
-              "y": 86.42424242424238
-            }
-          }
-        },
-        {
-          "ID": "4575",
-          "typeID": "Arrow",
-          "zOrder": "64",
-          "w": "141",
-          "h": "42",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "547",
-          "y": "935",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0.36614780684760717,
-              "y": 42.09927370780258
-            },
-            "p1": {
-              "x": 0.4579017707985299,
-              "y": 0.07066488473103895
-            },
-            "p2": {
-              "x": 141.78787878787875,
-              "y": 0.060606060606005485
-            },
-            "stroke": "dotted"
-          }
-        },
-        {
-          "ID": "4576",
-          "typeID": "Arrow",
-          "zOrder": "65",
-          "w": "1",
-          "h": "80",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "760",
-          "y": "849",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.09090909090900823,
-              "y": 0.27272727272725206
-            },
-            "p1": {
-              "x": 0.5087719298245617,
-              "y": 0.003189792663476659
-            },
-            "p2": {
-              "x": -0.09090909090912191,
-              "y": 80.42424242424238
-            }
-          }
-        },
-        {
-          "ID": "4577",
-          "typeID": "Arrow",
-          "zOrder": "66",
-          "w": "621",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "909",
-          "y": "928",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0.15721761739848716,
-              "y": 1
-            },
-            "p1": {
-              "x": 0.5093283582089556,
-              "y": 0.00085820895522394
-            },
-            "p2": {
-              "x": 621.181818181818,
-              "y": 1
-            }
-          }
-        },
-        {
-          "ID": "4578",
-          "typeID": "Arrow",
-          "zOrder": "67",
-          "w": "1",
-          "h": "98",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "476",
-          "y": "954",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.09090909090912191,
-              "y": -0.42424242424249314
-            },
-            "p1": {
-              "x": 0.5087719298245618,
-              "y": 0.00318979266347666
-            },
-            "p2": {
-              "x": -0.09090909090912191,
-              "y": 97.42424242424238
-            }
-          }
-        },
-        {
-          "ID": "4579",
-          "typeID": "Arrow",
-          "zOrder": "68",
-          "w": "1",
-          "h": "80",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1530",
-          "y": "530",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0.5454545454545041,
-              "y": 80.24242424242425
-            },
-            "p1": {
-              "x": 0.49760487146592863,
-              "y": 0.003674908633655258
-            },
-            "p2": {
-              "x": 0.5454545454545041,
-              "y": -0.21212121212124657
-            },
-            "stroke": "dotted"
-          }
-        },
-        {
-          "ID": "4580",
-          "typeID": "Arrow",
-          "zOrder": "69",
-          "w": "1",
-          "h": "93",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1530",
-          "y": "673",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": -0.4545454545454959,
-              "y": 92.36363636363637
-            },
-            "p1": {
-              "x": 0.49821572147706117,
-              "y": -0.0021313722235241192
-            },
-            "p2": {
-              "x": -0.4545454545454959,
-              "y": -0.21212121212124657
-            },
-            "stroke": "dotted"
-          }
-        },
-        {
-          "ID": "4581",
-          "typeID": "Arrow",
-          "zOrder": "70",
-          "w": "1",
-          "h": "155",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1530",
-          "y": "772",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 1,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.4717276462531793,
-              "y": -0.006652318528664224
-            },
-            "p2": {
-              "x": 1,
-              "y": 154.96969696969688
-            }
-          }
-        },
-        {
-          "ID": "4582",
-          "typeID": "Arrow",
-          "zOrder": "71",
-          "w": "142",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1324",
-          "y": "994",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0.393939393939263,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5093283582089555,
-              "y": 0.0008582089552239402
-            },
-            "p2": {
-              "x": 142.81818181818176,
-              "y": 0
-            },
-            "stroke": "dotted"
-          }
-        },
-        {
-          "ID": "4583",
-          "typeID": "Arrow",
-          "zOrder": "72",
-          "w": "1",
-          "h": "122",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1259",
-          "y": "642",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 1,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.47299999999999986,
-              "y": -0.011000000000000005
-            },
-            "p2": {
-              "x": 1,
-              "y": 122.42424242424238
-            }
-          }
-        },
-        {
-          "ID": "4584",
-          "typeID": "Arrow",
-          "zOrder": "73",
-          "w": "1",
-          "h": "122",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "963",
-          "y": "639",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 1,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.47299999999999986,
-              "y": -0.011000000000000005
-            },
-            "p2": {
-              "x": 1,
-              "y": 122.42424242424238
-            }
-          }
-        },
-        {
-          "ID": "4585",
-          "typeID": "Arrow",
-          "zOrder": "74",
-          "w": "1",
-          "h": "122",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "485",
-          "y": "455",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 1,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.47299999999999986,
-              "y": -0.011000000000000005
-            },
-            "p2": {
-              "x": 1,
-              "y": 122.42424242424238
-            }
-          }
-        },
-        {
-          "ID": "4586",
-          "typeID": "Arrow",
-          "zOrder": "75",
-          "w": "1",
-          "h": "137",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "760",
-          "y": "933",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": -0.09090909090912191,
-              "y": -0.21212121212124657
-            },
-            "p1": {
-              "x": 0.5087719298245617,
-              "y": 0.003189792663476659
-            },
-            "p2": {
-              "x": -0.09090909090912191,
-              "y": 136.42424242424238
-            }
-          }
-        },
-        {
-          "ID": "4587",
-          "typeID": "Arrow",
-          "zOrder": "76",
-          "w": "1",
-          "h": "174",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "689",
-          "y": "586",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 1,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.4796409522570575,
-              "y": -0.006374398334851107
-            },
-            "p2": {
-              "x": 1,
-              "y": 173.5454545454545
-            }
-          }
-        },
-        {
-          "ID": "4588",
-          "typeID": "Arrow",
-          "zOrder": "77",
-          "w": "217",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "691",
-          "y": "380",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0.060606060606005485,
-              "y": 1
-            },
-            "p1": {
-              "x": 0.5087719298245612,
-              "y": 0.003189792663476693
-            },
-            "p2": {
-              "x": 217,
-              "y": 1
-            }
-          }
-        },
-        {
-          "ID": "4589",
-          "typeID": "Arrow",
-          "zOrder": "78",
-          "w": "131",
-          "h": "53",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1168",
-          "y": "392",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 131,
-              "y": 53
-            },
-            "p1": {
-              "x": 0.46820230345518277,
-              "y": -0.10065097646469705
-            },
-            "p2": {
-              "x": 0,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4590",
-          "typeID": "Arrow",
-          "zOrder": "79",
-          "w": "122",
-          "h": "47",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1178",
-          "y": "324",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 122,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.42135134205487473,
-              "y": 0.09461458201956036
-            },
-            "p2": {
-              "x": 0,
-              "y": 47
-            }
-          }
-        },
-        {
-          "ID": "4591",
-          "typeID": "Arrow",
-          "zOrder": "80",
-          "w": "129",
-          "h": "2",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1183",
-          "y": "382",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 129,
-              "y": -0.5
-            },
-            "p1": {
-              "x": 0.4487910725356478,
-              "y": 0.0035337879727238685
-            },
-            "p2": {
-              "x": 0,
-              "y": 1
-            }
-          }
-        },
-        {
-          "ID": "4592",
-          "typeID": "Label",
-          "zOrder": "81",
-          "measuredW": "66",
-          "measuredH": "40",
-          "x": "1002",
-          "y": "188",
-          "properties": {
-            "size": "32",
-            "text": "C++"
-          }
-        },
-        {
-          "ID": "4593",
-          "typeID": "Arrow",
-          "zOrder": "82",
-          "w": "1",
-          "h": "113",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1035",
-          "y": "257",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 1,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.4729999999999999,
-              "y": -0.011000000000000003
-            },
-            "p2": {
-              "x": 1,
-              "y": 113
-            }
-          }
-        },
-        {
-          "ID": "4594",
-          "typeID": "__group__",
-          "zOrder": "83",
-          "measuredW": "312",
-          "measuredH": "50",
-          "w": "312",
-          "h": "50",
-          "x": "884",
-          "y": "356",
-          "properties": {
-            "controlName": "100-introduction"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "302",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "223",
-                  "measuredH": "25",
-                  "x": "49",
-                  "y": "12",
-                  "properties": {
-                    "size": "17",
-                    "text": "Introduction to the Language"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4606",
-          "typeID": "__group__",
-          "zOrder": "86",
-          "measuredW": "220",
-          "measuredH": "47",
-          "w": "220",
-          "h": "47",
-          "x": "1292",
-          "y": "306",
-          "properties": {
-            "controlName": "100-introduction:what-is-cpp"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "210",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "105",
-                  "measuredH": "25",
-                  "x": "52",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "What is C++?"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "196",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4607",
-          "typeID": "__group__",
-          "zOrder": "87",
-          "measuredW": "220",
-          "measuredH": "47",
-          "w": "220",
-          "h": "47",
-          "x": "1292",
-          "y": "359",
-          "properties": {
-            "controlName": "101-introduction:why-cpp"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "210",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "112",
-                  "measuredH": "25",
-                  "x": "49",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Why use C++?"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "196",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4608",
-          "typeID": "__group__",
-          "zOrder": "88",
-          "measuredW": "220",
-          "measuredH": "47",
-          "w": "220",
-          "h": "47",
-          "x": "1292",
-          "y": "413",
-          "properties": {
-            "controlName": "102-introduction:c-vs-cpp"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "210",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "73",
-                  "measuredH": "25",
-                  "x": "68",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "C vs C++"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "196",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4609",
-          "typeID": "Arrow",
-          "zOrder": "89",
-          "w": "1",
-          "h": "102",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1034",
-          "y": "68",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "p0": {
-              "x": 1,
-              "y": 0.21592451307655836
-            },
-            "p1": {
-              "x": 0.47299999999999986,
-              "y": -0.01100000000000001
-            },
-            "p2": {
-              "x": 1,
-              "y": 102
-            }
-          }
-        },
-        {
-          "ID": "4610",
-          "typeID": "Arrow",
-          "zOrder": "90",
-          "w": "1",
-          "h": "194",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "689",
-          "y": "381",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 1,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.4637713110681927,
-              "y": -0.004076038643122147
-            },
-            "p2": {
-              "x": 1,
-              "y": 193.69696969696963
-            }
-          }
-        },
-        {
-          "ID": "4611",
-          "typeID": "__group__",
-          "zOrder": "91",
-          "measuredW": "376",
-          "measuredH": "50",
-          "w": "376",
-          "h": "50",
-          "x": "342",
-          "y": "554",
-          "properties": {
-            "controlName": "101-setting-up"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "368",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "8",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "217",
-                  "measuredH": "25",
-                  "x": "87",
-                  "y": "12",
-                  "properties": {
-                    "size": "17",
-                    "text": "Setting up your Environment"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4612",
-          "typeID": "__group__",
-          "zOrder": "92",
-          "measuredW": "280",
-          "measuredH": "47",
-          "w": "280",
-          "h": "47",
-          "x": "343",
-          "y": "353",
-          "properties": {
-            "controlName": "100-setting-up:installing"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "272",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "8",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "109",
-                  "measuredH": "25",
-                  "x": "89",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Installing C++"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4613",
-          "typeID": "__group__",
-          "zOrder": "93",
-          "measuredW": "280",
-          "measuredH": "47",
-          "w": "280",
-          "h": "47",
-          "x": "343",
-          "y": "404",
-          "properties": {
-            "controlName": "101-setting-up:code-editors"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "272",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "8",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "155",
-                  "measuredH": "25",
-                  "x": "66",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Code Editors / IDEs"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4614",
-          "typeID": "__group__",
-          "zOrder": "94",
-          "measuredW": "280",
-          "measuredH": "47",
-          "w": "280",
-          "h": "47",
-          "x": "343",
-          "y": "455",
-          "properties": {
-            "controlName": "102-setting-up:first-program"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "272",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "8",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "210",
-                  "measuredH": "25",
-                  "x": "39",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Running your First Program"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4615",
-          "typeID": "__group__",
-          "zOrder": "95",
-          "measuredW": "240",
-          "measuredH": "47",
-          "w": "240",
-          "h": "47",
-          "x": "839",
-          "y": "467",
-          "properties": {
-            "controlName": "100-basic-operations:arithmetic-operators"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "230",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "160",
-                  "measuredH": "25",
-                  "x": "45",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Arithmetic Operators"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4616",
-          "typeID": "__group__",
-          "zOrder": "96",
-          "measuredW": "239",
-          "measuredH": "47",
-          "w": "239",
-          "h": "47",
-          "x": "840",
-          "y": "519",
-          "properties": {
-            "controlName": "101-basic-operations:logical-operators"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "230",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "138",
-                  "measuredH": "25",
-                  "x": "55",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Logical Operators"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4617",
-          "typeID": "__group__",
-          "zOrder": "97",
-          "measuredW": "239",
-          "measuredH": "47",
-          "w": "239",
-          "h": "47",
-          "x": "840",
-          "y": "570",
-          "properties": {
-            "controlName": "102-basic-operations:loops"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "230",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "122",
-                  "measuredH": "25",
-                  "x": "63",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Loops: for/while"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4618",
-          "typeID": "__group__",
-          "zOrder": "98",
-          "measuredW": "239",
-          "measuredH": "47",
-          "w": "239",
-          "h": "47",
-          "x": "840",
-          "y": "621",
-          "properties": {
-            "controlName": "103-basic-operations:bitwise"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "230",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "137",
-                  "measuredH": "25",
-                  "x": "55",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Bitwise Operators"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4619",
-          "typeID": "__group__",
-          "zOrder": "99",
-          "measuredW": "180",
-          "measuredH": "50",
-          "w": "180",
-          "h": "50",
-          "x": "1165",
-          "y": "734",
-          "properties": {
-            "controlName": "103-functions"
+  "nodes": [
+    {
+      "id": "b5EyLVAnEsPBiwy2dMr6F",
+      "type": "horizontal",
+      "position": { "x": 132.993752405053, "y": 2903.0129376580285 },
+      "selected": true,
+      "data": {
+        "label": "horizontal node",
+        "style": { "stroke": "#2B78E4", "strokeWidth": 3.5 }
+      },
+      "zIndex": 999,
+      "width": 127,
+      "height": 20,
+      "style": { "width": 127, "height": 20 },
+      "positionAbsolute": { "x": 132.993752405053, "y": 2903.0129376580285 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "I1aDakZmYpe7pKczou0qC",
+      "type": "section",
+      "position": { "x": 258.0179751445827, "y": 2688.244194339027 },
+      "selected": true,
+      "data": {
+        "label": "",
+        "style": {
+          "width": 150,
+          "height": 100,
+          "fontSize": 17,
+          "backgroundColor": "#ffffff",
+          "borderColor": "#000000"
+        }
+      },
+      "zIndex": -999,
+      "width": 195,
+      "height": 278,
+      "style": { "width": 195, "height": 278 },
+      "resizing": false,
+      "positionAbsolute": { "x": 258.0179751445827, "y": 2688.244194339027 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "goX6oPqweGg7J9yXJjDsR",
+      "type": "horizontal",
+      "position": { "x": 441.5179751445827, "y": 2530.0128020469147 },
+      "selected": true,
+      "data": {
+        "label": "horizontal node",
+        "style": { "stroke": "#2B78E4", "strokeWidth": 3.5 }
+      },
+      "zIndex": 999,
+      "width": 91,
+      "height": 20,
+      "style": { "width": 91, "height": 20 },
+      "positionAbsolute": { "x": 441.5179751445827, "y": 2530.0128020469147 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "iisl6B61awdQDJVGaBqtI",
+      "type": "section",
+      "position": { "x": 532.5179751445827, "y": 2381.244194339027 },
+      "selected": true,
+      "data": {
+        "label": "",
+        "style": {
+          "width": 150,
+          "height": 100,
+          "fontSize": 17,
+          "backgroundColor": "#ffffff",
+          "borderColor": "#000000"
+        }
+      },
+      "zIndex": -999,
+      "width": 239,
+      "height": 385,
+      "style": { "width": 239, "height": 385 },
+      "positionAbsolute": { "x": 532.5179751445827, "y": 2381.244194339027 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "SNEm8ibYyywxb0prHdlMA",
+      "type": "vertical",
+      "position": { "x": 118.26444711909286, "y": 2545.23808936492 },
+      "selected": true,
+      "data": {
+        "label": "vertical node",
+        "style": {
+          "strokeDasharray": "0.8 8",
+          "strokeLinecap": "round",
+          "strokeWidth": 3.5,
+          "stroke": "#2B78E4"
+        },
+        "oldId": "REVHzbbcSWfylibdGZG5A"
+      },
+      "zIndex": 999,
+      "width": 20,
+      "height": 86,
+      "style": { "width": 20, "height": 86 },
+      "positionAbsolute": { "x": 118.26444711909286, "y": 2545.23808936492 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "REVHzbbcSWfylibdGZG5A",
+      "type": "vertical",
+      "position": { "x": 12.144083619869434, "y": 2545.23808936492 },
+      "selected": true,
+      "data": {
+        "label": "vertical node",
+        "style": {
+          "strokeDasharray": "0.8 8",
+          "strokeLinecap": "round",
+          "strokeWidth": 3.5,
+          "stroke": "#2B78E4"
+        }
+      },
+      "zIndex": 999,
+      "width": 20,
+      "height": 86,
+      "style": { "width": 20, "height": 86 },
+      "positionAbsolute": { "x": 12.144083619869434, "y": 2545.23808936492 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "Tm2kjpCnwZhAw0vwqn_PK",
+      "type": "section",
+      "position": { "x": -31.733089516576577, "y": 2235.2284032315606 },
+      "selected": true,
+      "data": {
+        "label": "",
+        "style": {
+          "width": 150,
+          "height": 100,
+          "fontSize": 17,
+          "backgroundColor": "#ffffff",
+          "borderColor": "#000000"
+        }
+      },
+      "zIndex": -999,
+      "width": 185,
+      "height": 212,
+      "style": { "width": 185, "height": 212 },
+      "positionAbsolute": { "x": -31.733089516576577, "y": 2235.2284032315606 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "_sUz-qKSggnUjAO281ROC",
+      "type": "vertical",
+      "position": { "x": -233.429978402122, "y": 1962.677896706502 },
+      "selected": true,
+      "data": {
+        "label": "vertical node",
+        "style": {
+          "strokeDasharray": "0.8 8",
+          "strokeLinecap": "round",
+          "strokeWidth": 3.5,
+          "stroke": "#2B78E4"
+        }
+      },
+      "zIndex": 999,
+      "width": 20,
+      "height": 97,
+      "style": { "width": 20, "height": 97 },
+      "positionAbsolute": { "x": -233.429978402122, "y": 1962.677896706502 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "wGg3UBe3OqaXWxPxYiBQz",
+      "type": "vertical",
+      "position": { "x": 594.833180361922, "y": 1673.789165472234 },
+      "selected": true,
+      "data": {
+        "label": "vertical node",
+        "style": {
+          "strokeDasharray": "0.8 8",
+          "strokeLinecap": "round",
+          "strokeWidth": 3.5,
+          "stroke": "#2B78E4"
+        }
+      },
+      "zIndex": 999,
+      "width": 20,
+      "height": 103,
+      "style": { "width": 20, "height": 103 },
+      "positionAbsolute": { "x": 594.833180361922, "y": 1673.789165472234 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "3SsQBuq6ie73yAMvRcqtR",
+      "type": "section",
+      "position": { "x": 466.39833855329164, "y": 1470.7730008603658 },
+      "selected": true,
+      "data": {
+        "label": "",
+        "style": {
+          "width": 150,
+          "height": 100,
+          "fontSize": 17,
+          "backgroundColor": "#ffffff",
+          "borderColor": "#000000"
+        }
+      },
+      "zIndex": -999,
+      "width": 302,
+      "height": 174,
+      "style": { "width": 302, "height": 174 },
+      "positionAbsolute": { "x": 466.39833855329164, "y": 1470.7730008603658 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "ra0ZEvbILayGotRDlRwjF",
+      "type": "vertical",
+      "position": { "x": 309.993752405053, "y": 1671.789165472234 },
+      "selected": true,
+      "data": {
+        "label": "vertical node",
+        "style": {
+          "strokeDasharray": "0.8 8",
+          "strokeLinecap": "round",
+          "strokeWidth": 3.5,
+          "stroke": "#2B78E4"
+        }
+      },
+      "zIndex": 999,
+      "width": 20,
+      "height": 107,
+      "style": { "width": 20, "height": 107 },
+      "positionAbsolute": { "x": 309.993752405053, "y": 1671.789165472234 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "XUHjmFhEsTjGRLlmDgl_w",
+      "type": "vertical",
+      "position": { "x": 159.993752405053, "y": 1671.789165472234 },
+      "selected": true,
+      "data": {
+        "label": "vertical node",
+        "style": {
+          "strokeDasharray": "0.8 8",
+          "strokeLinecap": "round",
+          "strokeWidth": 3.5,
+          "stroke": "#2B78E4"
+        },
+        "oldId": "ra0ZEvbILayGotRDlRwjF"
+      },
+      "zIndex": 999,
+      "width": 20,
+      "height": 107,
+      "style": { "width": 20, "height": 107 },
+      "positionAbsolute": { "x": 159.993752405053, "y": 1671.789165472234 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "mnUWOqBFgcuNsXUr18fJI",
+      "type": "section",
+      "position": { "x": -286.929978402122, "y": 1484.789165472234 },
+      "selected": true,
+      "data": {
+        "label": "",
+        "style": {
+          "width": 150,
+          "height": 100,
+          "fontSize": 17,
+          "backgroundColor": "#ffffff"
+        }
+      },
+      "zIndex": -999,
+      "width": 321,
+      "height": 128,
+      "style": { "width": 321, "height": 128 },
+      "resizing": false,
+      "positionAbsolute": { "x": -286.929978402122, "y": 1484.789165472234 },
+      "dragging": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "l5xm8tzFqMKwGdK3MYaXm",
+      "type": "vertical",
+      "position": { "x": 500.31370390738084, "y": 1150.9555450086277 },
+      "selected": true,
+      "data": {
+        "label": "vertical node",
+        "style": {
+          "strokeDasharray": "0.8 8",
+          "strokeLinecap": "round",
+          "strokeWidth": 3.5,
+          "stroke": "#2B78E4"
+        }
+      },
+      "zIndex": 999,
+      "width": 20,
+      "height": 199,
+      "style": { "width": 20, "height": 199 },
+      "positionAbsolute": { "x": 500.31370390738084, "y": 1150.9555450086277 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "fG1lGRwUDPc-aiETFyEE7",
+      "type": "vertical",
+      "position": { "x": 588.119142886761, "y": 1045.9498696738276 },
+      "selected": true,
+      "data": {
+        "label": "vertical node",
+        "style": {
+          "strokeDasharray": "0.8 8",
+          "strokeLinecap": "round",
+          "strokeWidth": 3.5,
+          "stroke": "#2B78E4"
+        }
+      },
+      "zIndex": 999,
+      "width": 20,
+      "height": 196,
+      "style": { "width": 20, "height": 196 },
+      "positionAbsolute": { "x": 588.119142886761, "y": 1045.9498696738276 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "ofwdZm05AUqCIWmfgGHk8",
+      "type": "subtopic",
+      "position": { "x": 539.0885117402935, "y": 1257.538589268166 },
+      "selected": true,
+      "data": {
+        "label": "Diamond Inheritance",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 231,
+      "height": 49,
+      "style": { "width": 231, "height": 49 },
+      "positionAbsolute": { "x": 539.0885117402935, "y": 1257.538589268166 },
+      "dragging": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "ZHjU60uzJTezADRhDTESG",
+      "type": "subtopic",
+      "position": { "x": 66.99375240505299, "y": 877.9725710130274 },
+      "selected": true,
+      "data": {
+        "label": "Forward Declaration",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 223,
+      "height": 49,
+      "style": { "width": 223, "height": 49 },
+      "positionAbsolute": { "x": 66.99375240505299, "y": 877.9725710130274 },
+      "dragging": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "J7Jwh6hrrEyni5eGmuCqc",
+      "type": "horizontal",
+      "position": { "x": -44.467176049532384, "y": 1130.9555450086277 },
+      "selected": true,
+      "data": {
+        "label": "horizontal node",
+        "style": { "stroke": "#2B78E4", "strokeWidth": 3.75 }
+      },
+      "zIndex": 999,
+      "width": 223,
+      "height": 20,
+      "style": { "width": 223, "height": 20 },
+      "positionAbsolute": { "x": -44.467176049532384, "y": 1130.9555450086277 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "Qk3hqX1Wj68FD8jXHS5NU",
+      "type": "section",
+      "position": { "x": -284.4671760495324, "y": 822.073069776383 },
+      "width": 241,
+      "height": 234,
+      "style": { "width": 241, "height": 234 },
+      "selected": true,
+      "data": {
+        "style": { "backgroundColor": "#ffffff", "borderColor": "#000000" }
+      },
+      "positionAbsolute": { "x": -284.4671760495324, "y": 822.073069776383 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "zybofouGIVxcKvr47F3Yy",
+      "type": "section",
+      "position": { "x": -284.4671760495324, "y": 1051.9498696738276 },
+      "width": 241,
+      "height": 175,
+      "style": { "width": 241, "height": 175 },
+      "selected": true,
+      "data": {
+        "style": { "backgroundColor": "#ffffff", "borderColor": "#000000" }
+      },
+      "dragging": false,
+      "positionAbsolute": { "x": -284.4671760495324, "y": 1051.9498696738276 },
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "c58fcsthBlVfzfr-MHdpF",
+      "type": "vertical",
+      "position": { "x": 256.89029212267985, "y": -124.59925177765109 },
+      "selected": true,
+      "data": {
+        "label": "vertical node",
+        "style": {
+          "strokeDasharray": "0.8 8",
+          "strokeLinecap": "round",
+          "strokeWidth": 3.5,
+          "stroke": "#2B78E4"
+        }
+      },
+      "zIndex": 999,
+      "width": 20,
+      "height": 66,
+      "positionAbsolute": { "x": 256.89029212267985, "y": -124.59925177765109 },
+      "dragging": false,
+      "style": { "width": 20, "height": 66 },
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "Ji35JsKgUQXN4DJGEgTAC",
+      "type": "title",
+      "position": { "x": 218.39029212267985, "y": -59.09925177765109 },
+      "selected": true,
+      "data": {
+        "label": "C++",
+        "style": {
+          "fontSize": 28,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        }
+      },
+      "zIndex": 999,
+      "width": 97,
+      "height": 68,
+      "positionAbsolute": { "x": 218.39029212267985, "y": -59.09925177765109 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true,
+      "style": {}
+    },
+    {
+      "id": "kpF15oUmlUmk1qVGEBB7Y",
+      "type": "paragraph",
+      "position": { "x": 421.119142886761, "y": -125.95736970235458 },
+      "selected": true,
+      "data": {
+        "label": "Find the detailed version of this roadmap along with other similar roadmaps",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "left",
+          "borderColor": "#000000",
+          "backgroundColor": "#FFFFFf"
+        },
+        "oldId": "yHmHXymPNWwu8p1vvqD3o"
+      },
+      "zIndex": 999,
+      "width": 354,
+      "height": 143,
+      "positionAbsolute": { "x": 421.119142886761, "y": -125.95736970235458 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true,
+      "style": { "width": 354, "height": 143 },
+      "resizing": false
+    },
+    {
+      "id": "if9eTna5NRTMStVwpSwDP",
+      "type": "button",
+      "position": { "x": 433.619142886761, "y": -44.09925177765109 },
+      "selected": true,
+      "data": {
+        "label": "roadmap.sh",
+        "href": "https://roadmap.sh",
+        "color": "#ffffff",
+        "backgroundColor": "#4136D6",
+        "style": { "fontSize": 17 },
+        "oldId": "2zqZkyVgigifcRS1H7F_b"
+      },
+      "zIndex": 999,
+      "width": 329,
+      "height": 49,
+      "dragging": false,
+      "style": { "width": 329, "height": 49 },
+      "resizing": false,
+      "positionAbsolute": { "x": 433.619142886761, "y": -44.09925177765109 },
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "g4hjyQF8-SpjPi8mYtIsk",
+      "type": "vertical",
+      "position": { "x": 256.89029212267985, "y": 15.028193715390685 },
+      "selected": true,
+      "data": {
+        "label": "vertical node",
+        "style": { "stroke": "#2B78E4", "strokeWidth": 3.5 }
+      },
+      "zIndex": 999,
+      "width": 20,
+      "height": 139,
+      "style": { "width": 20, "height": 139 },
+      "positionAbsolute": { "x": 256.89029212267985, "y": 15.028193715390685 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "width": 411,
+      "height": 121,
+      "id": "0vLaVNJaJSHZ_bHli6Qzs",
+      "type": "paragraph",
+      "position": { "x": -278.006247594947, "y": 2846.2883869394877 },
+      "selected": true,
+      "data": {
+        "label": "Keep learning with following relevant tracks",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center",
+          "borderColor": "#000000",
+          "backgroundColor": "WHITe"
+        },
+        "oldId": "m9eO0jLGuR_9w2JJbe_g2"
+      },
+      "zIndex": 999,
+      "positionAbsolute": { "x": -278.006247594947, "y": 2846.2883869394877 },
+      "dragging": false,
+      "style": { "width": 411, "height": 121 },
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "width": 20,
+      "height": 85,
+      "id": "xi0QAi4kXm3-IFKgopnOP",
+      "type": "vertical",
+      "position": { "x": -82.50624759494701, "y": 2967.2883869394877 },
+      "selected": true,
+      "data": {
+        "label": "vertical node",
+        "style": {
+          "strokeDasharray": "0.8 8",
+          "strokeLinecap": "round",
+          "strokeWidth": 3.5,
+          "stroke": "#2B78E4"
+        },
+        "oldId": "RLtk1C3gofHnLJ17x3o5b"
+      },
+      "zIndex": 999,
+      "positionAbsolute": { "x": -82.50624759494701, "y": 2967.2883869394877 },
+      "dragging": false,
+      "focusable": true,
+      "style": { "width": 20, "height": 85 },
+      "resizing": false,
+      "selectable": true
+    },
+    {
+      "width": 377,
+      "height": 49,
+      "id": "-sFboM4eFUMVq1tlPl-fV",
+      "type": "button",
+      "position": { "x": -261.006247594947, "y": 2903.0129376580285 },
+      "selected": true,
+      "data": {
+        "label": "Backend Roadmap",
+        "href": "https://roadmap.sh/backend",
+        "color": "#FFFFFf",
+        "backgroundColor": "#4136D6",
+        "style": { "fontSize": 17 },
+        "borderColor": "#4136D6",
+        "oldId": "qXKNK_IsGS8-JgLK-Q9oU"
+      },
+      "zIndex": 999,
+      "dragging": false,
+      "positionAbsolute": { "x": -261.006247594947, "y": 2903.0129376580285 },
+      "style": { "width": 377, "height": 49 },
+      "focusable": true,
+      "resizing": false,
+      "selectable": true
+    },
+    {
+      "id": "NvODRFR0DLINB0RlPSsvt",
+      "type": "topic",
+      "position": { "x": 128.89029212267985, "y": 150.76582156925141 },
+      "selected": true,
+      "data": {
+        "label": "Introduction to Language",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 276,
+      "height": 49,
+      "style": { "width": 276, "height": 49 },
+      "positionAbsolute": { "x": 128.89029212267985, "y": 150.76582156925141 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "q2z_1wnPUnWM7MYIIUyBg",
+      "type": "legend",
+      "position": { "x": -285.20291471146976, "y": -130.55580566097228 },
+      "selected": true,
+      "data": {
+        "label": "",
+        "legends": [
+          {
+            "id": "FURC-X3vopFKhZ0F5BdYH",
+            "color": "#6d7500",
+            "label": "Beginner Topics / Start here"
           },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "170",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "75",
-                  "measuredH": "25",
-                  "x": "57",
-                  "y": "12",
-                  "properties": {
-                    "size": "17",
-                    "text": "Functions"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "13",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4620",
-          "typeID": "__group__",
-          "zOrder": "100",
-          "measuredW": "180",
-          "measuredH": "47",
-          "w": "180",
-          "h": "47",
-          "x": "1165",
-          "y": "570",
-          "properties": {
-            "controlName": "101-functions:operators"
+          {
+            "id": "sRAiZODQQ8xrMiVpCdnI7",
+            "label": "Intermediate Topics / Pick Next",
+            "color": "#2b78e4"
           },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "170",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "78",
-                  "measuredH": "25",
-                  "x": "56",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Operators"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4621",
-          "typeID": "__group__",
-          "zOrder": "101",
-          "measuredW": "180",
-          "measuredH": "47",
-          "w": "180",
-          "h": "47",
-          "x": "1165",
-          "y": "621",
-          "properties": {
-            "controlName": "100-functions:lambda"
+          {
+            "id": "zgW3oGPdbclWTlKJdidiB",
+            "label": "Advanced Topics / Pick Later",
+            "color": "#000000"
           },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "170",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "63",
-                  "measuredH": "25",
-                  "x": "63",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Lambda"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4622",
-          "typeID": "__group__",
-          "zOrder": "102",
-          "measuredW": "223",
-          "measuredH": "50",
-          "w": "223",
-          "h": "50",
-          "x": "1424",
-          "y": "734",
-          "properties": {
-            "controlName": "104-data-types"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "213",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "86",
-                  "measuredH": "25",
-                  "x": "64",
-                  "y": "12",
-                  "properties": {
-                    "size": "17",
-                    "text": "Data Types"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "199",
-                  "y": "14",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4623",
-          "typeID": "__group__",
-          "zOrder": "103",
-          "measuredW": "178",
-          "measuredH": "47",
-          "w": "178",
-          "h": "47",
-          "x": "1438",
-          "y": "657",
-          "properties": {
-            "controlName": "100-data-types:static-typing"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "170",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "8",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "98",
-                  "measuredH": "25",
-                  "x": "44",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Static Typing"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4624",
-          "typeID": "__group__",
-          "zOrder": "104",
-          "measuredW": "179",
-          "measuredH": "47",
-          "w": "179",
-          "h": "47",
-          "x": "1437",
-          "y": "606",
-          "properties": {
-            "controlName": "101-data-types:dynamic-typing"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "170",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "121",
-                  "measuredH": "25",
-                  "x": "33",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Dynamic Typing"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4625",
-          "typeID": "__group__",
-          "zOrder": "105",
-          "measuredW": "114",
-          "measuredH": "47",
-          "w": "114",
-          "h": "47",
-          "x": "1468",
-          "y": "519",
-          "properties": {
-            "controlName": "100-data-types:dynamic-typing:rtti"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "103",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "38",
-                  "measuredH": "25",
-                  "x": "44",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "RTTI"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4626",
-          "typeID": "__group__",
-          "zOrder": "106",
-          "measuredW": "274",
-          "measuredH": "50",
-          "w": "274",
-          "h": "50",
-          "x": "668",
-          "y": "903",
-          "properties": {
-            "controlName": "105-pointers-and-references"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "263",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "191",
-                  "measuredH": "25",
-                  "x": "36",
-                  "y": "12",
-                  "properties": {
-                    "size": "17",
-                    "text": "Pointers and References"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "250",
-                  "y": "13",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4627",
-          "typeID": "__group__",
-          "zOrder": "107",
-          "measuredW": "193",
-          "measuredH": "47",
-          "w": "193",
-          "h": "47",
-          "x": "659",
-          "y": "830",
-          "properties": {
-            "controlName": "100-pointers-and-references:references"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "183",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "90",
-                  "measuredH": "25",
-                  "x": "57",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "References"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "10",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4628",
-          "typeID": "TextArea",
-          "zOrder": "108",
-          "w": "176",
-          "h": "216",
-          "measuredW": "200",
-          "measuredH": "140",
-          "x": "389",
-          "y": "699"
-        },
-        {
-          "ID": "4629",
-          "typeID": "Label",
-          "zOrder": "109",
-          "measuredW": "114",
-          "measuredH": "25",
-          "x": "420",
-          "y": "876",
-          "properties": {
-            "size": "17",
-            "text": "Smart Pointers"
-          }
-        },
-        {
-          "ID": "4630",
-          "typeID": "__group__",
-          "zOrder": "110",
-          "measuredW": "195",
-          "measuredH": "47",
-          "w": "195",
-          "h": "47",
-          "x": "657",
-          "y": "985",
-          "properties": {
-            "controlName": "101-pointers-and-references:memory-model"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "183",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "12",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "115",
-                  "measuredH": "25",
-                  "x": "46",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Memory Model"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4631",
-          "typeID": "TextArea",
-          "zOrder": "111",
-          "w": "173",
-          "h": "168",
-          "measuredW": "200",
-          "measuredH": "140",
-          "x": "391",
-          "y": "937"
-        },
-        {
-          "ID": "4632",
-          "typeID": "Label",
-          "zOrder": "112",
-          "measuredW": "101",
-          "measuredH": "25",
-          "x": "426",
-          "y": "949",
-          "properties": {
-            "size": "17",
-            "text": "Raw Pointers"
-          }
-        },
-        {
-          "ID": "4633",
-          "typeID": "__group__",
-          "zOrder": "113",
-          "measuredW": "232",
-          "measuredH": "47",
-          "w": "232",
-          "h": "47",
-          "x": "356",
-          "y": "819",
-          "properties": {
-            "controlName": "102-pointers-and-references:smart-pointers:uniqe-ptr"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "222",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "85",
-                  "measuredH": "25",
-                  "x": "78",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "unique_ptr"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4634",
-          "typeID": "__group__",
-          "zOrder": "114",
-          "measuredW": "231",
-          "measuredH": "47",
-          "w": "231",
-          "h": "47",
-          "x": "357",
-          "y": "767",
-          "properties": {
-            "controlName": "101-pointers-and-references:smart-pointers:shared-ptr"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "222",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "85",
-                  "measuredH": "25",
-                  "x": "77",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "shared_ptr"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4635",
-          "typeID": "__group__",
-          "zOrder": "115",
-          "measuredW": "231",
-          "measuredH": "47",
-          "w": "231",
-          "h": "47",
-          "x": "357",
-          "y": "716",
-          "properties": {
-            "controlName": "100-pointers-and-references:smart-pointers:weak-ptr"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "222",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "71",
-                  "measuredH": "25",
-                  "x": "84",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "weak_ptr"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4636",
-          "typeID": "__group__",
-          "zOrder": "116",
-          "measuredW": "194",
-          "measuredH": "47",
-          "w": "194",
-          "h": "47",
-          "x": "658",
-          "y": "1066",
-          "properties": {
-            "controlName": "100-pointers-and-references:memory-model:object-lifetime"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "183",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "145",
-                  "measuredH": "25",
-                  "x": "31",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Lifetime of Objects"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4637",
-          "typeID": "__group__",
-          "zOrder": "117",
-          "measuredW": "231",
-          "measuredH": "47",
-          "w": "231",
-          "h": "47",
-          "x": "356",
-          "y": "989",
-          "properties": {
-            "controlName": "100-pointers-and-references:raw-pointers:new-delete-operators"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "220",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "172",
-                  "measuredH": "25",
-                  "x": "35",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "New/delete Operators"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4638",
-          "typeID": "__group__",
-          "zOrder": "118",
-          "measuredW": "231",
-          "measuredH": "47",
-          "w": "231",
-          "h": "47",
-          "x": "356",
-          "y": "1040",
-          "properties": {
-            "controlName": "101-pointers-and-references:raw-pointers:memory-leakage"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "220",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "133",
-                  "measuredH": "25",
-                  "x": "54",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Memory Leakage"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4639",
-          "typeID": "__group__",
-          "zOrder": "119",
-          "measuredW": "242",
-          "measuredH": "50",
-          "w": "242",
-          "h": "50",
-          "x": "838",
-          "y": "734",
-          "properties": {
-            "controlName": "102-basic-operations"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "233",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "133",
-                  "measuredH": "25",
-                  "x": "59",
-                  "y": "12",
-                  "properties": {
-                    "size": "17",
-                    "text": "Basic Operations"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "14",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4640",
-          "typeID": "__group__",
-          "zOrder": "120",
-          "measuredW": "250",
-          "measuredH": "50",
-          "w": "250",
-          "h": "50",
-          "x": "1125",
-          "y": "1097",
-          "properties": {
-            "controlName": "106-structuring-codebase"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "240",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "168",
-                  "measuredH": "25",
-                  "x": "36",
-                  "y": "12",
-                  "properties": {
-                    "size": "17",
-                    "text": "Structuring Codebase"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "226",
-                  "y": "13",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4641",
-          "typeID": "__group__",
-          "zOrder": "121",
-          "measuredW": "336",
-          "measuredH": "47",
-          "w": "336",
-          "h": "47",
-          "x": "1070",
-          "y": "970",
-          "properties": {
-            "controlName": "101-structuring-codebase:code-splitting"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "327",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "274",
-                  "measuredH": "25",
-                  "x": "27",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Code Splitting: Headers / CPP Files"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "312",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4642",
-          "typeID": "__group__",
-          "zOrder": "122",
-          "measuredW": "118",
-          "measuredH": "47",
-          "w": "118",
-          "h": "47",
-          "x": "1288",
-          "y": "1023",
-          "properties": {
-            "controlName": "100-structuring-codebase:scope"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "112",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "49",
-                  "measuredH": "25",
-                  "x": "31",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Scope"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "94",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4643",
-          "typeID": "__group__",
-          "zOrder": "123",
-          "measuredW": "226",
-          "measuredH": "47",
-          "w": "226",
-          "h": "47",
-          "x": "1433",
-          "y": "1023",
-          "properties": {
-            "controlName": "100-structuring-codebase:scope:namespaces"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "217",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "102",
-                  "measuredH": "25",
-                  "x": "58",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Namespaces"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "202",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4644",
-          "typeID": "__group__",
-          "zOrder": "124",
-          "measuredW": "227",
-          "measuredH": "47",
-          "w": "227",
-          "h": "47",
-          "x": "1433",
-          "y": "970",
-          "properties": {
-            "controlName": "100-structuring-codebase:code-splitting:forward-declaration"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "217",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "155",
-                  "measuredH": "25",
-                  "x": "21",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Forward Declaration"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "203",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4645",
-          "typeID": "Arrow",
-          "zOrder": "125",
-          "w": "317",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1301",
-          "y": "1311",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5094183863981456,
-              "y": 0.0009010178239445595
-            },
-            "p2": {
-              "x": 317,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4646",
-          "typeID": "__group__",
-          "zOrder": "126",
-          "measuredW": "261",
-          "measuredH": "50",
-          "w": "261",
-          "h": "50",
-          "x": "1104",
-          "y": "1295",
-          "properties": {
-            "controlName": "107-structures-and-classes"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "251",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "178",
-                  "measuredH": "25",
-                  "x": "47",
-                  "y": "12",
-                  "properties": {
-                    "size": "17",
-                    "text": "Structures and Classes"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "13",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4647",
-          "typeID": "__group__",
-          "zOrder": "127",
-          "measuredW": "308",
-          "measuredH": "47",
-          "w": "308",
-          "h": "47",
-          "x": "763",
-          "y": "1296",
-          "properties": {
-            "controlName": "101-structures-and-classes:oop"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "299",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "231",
-                  "measuredH": "25",
-                  "x": "36",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Object Oriented Programming"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "284",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4648",
-          "typeID": "__group__",
-          "zOrder": "128",
-          "measuredW": "238",
-          "measuredH": "77",
-          "w": "238",
-          "h": "77",
-          "x": "477",
-          "y": "1239",
-          "properties": {
-            "controlName": "100-structures-and-classes:oop:static-polymorphism"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "229",
-                  "h": "77",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0"
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "155",
-                  "measuredH": "25",
-                  "x": "37",
-                  "y": "37",
-                  "properties": {
-                    "size": "17",
-                    "text": "Static Polymorphism"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "214",
-                  "y": "46",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4649",
-          "typeID": "__group__",
-          "zOrder": "129",
-          "measuredW": "239",
-          "measuredH": "72",
-          "w": "239",
-          "h": "72",
-          "x": "477",
-          "y": "1329",
-          "properties": {
-            "controlName": "101-structures-and-classes:oop:dynamic-polymorphism"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "229",
-                  "h": "72",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0"
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "w": "178",
-                  "measuredW": "178",
-                  "measuredH": "25",
-                  "x": "26",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Dynamic Polymorphism"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "215",
-                  "y": "7",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4650",
-          "typeID": "__group__",
-          "zOrder": "130",
-          "measuredW": "326",
-          "measuredH": "47",
-          "w": "326",
-          "h": "47",
-          "x": "428",
-          "y": "1222",
-          "properties": {
-            "controlName": "100-structures-and-classes:oop:static-polymorphism:overloading-functions"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "316",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "193",
-                  "measuredH": "25",
-                  "x": "71",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Overloading of Functions"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "9",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4651",
-          "typeID": "__group__",
-          "zOrder": "131",
-          "measuredW": "174",
-          "measuredH": "47",
-          "w": "174",
-          "h": "47",
-          "x": "428",
-          "y": "1371",
-          "properties": {
-            "controlName": "100-structures-and-classes:oop:dynamic-polymorphism:virtual-methods"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "164",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "w": "121",
-                  "measuredW": "121",
-                  "measuredH": "25",
-                  "x": "34",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Virtual Methods"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4652",
-          "typeID": "__group__",
-          "zOrder": "132",
-          "measuredW": "149",
-          "measuredH": "47",
-          "w": "149",
-          "h": "47",
-          "x": "614",
-          "y": "1371",
-          "properties": {
-            "controlName": "100-structures-and-classes:oop:dynamic-polymorphism:virtual-tables"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "140",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "103",
-                  "measuredH": "25",
-                  "x": "15",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Virtual Tables"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "125",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4653",
-          "typeID": "__group__",
-          "zOrder": "133",
-          "measuredW": "269",
-          "measuredH": "47",
-          "w": "269",
-          "h": "47",
-          "x": "915",
-          "y": "1212",
-          "properties": {
-            "controlName": "100-structures-and-classes:rule-of-zero-five-three"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "259",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "186",
-                  "measuredH": "25",
-                  "x": "37",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Rule of Zero, Five, Three"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "245",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4654",
-          "typeID": "__group__",
-          "zOrder": "134",
-          "measuredW": "213",
-          "measuredH": "47",
-          "w": "213",
-          "h": "47",
-          "x": "972",
-          "y": "1382",
-          "properties": {
-            "controlName": "102-structures-and-classes:multiple-inheritance"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "202",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "154",
-                  "measuredH": "25",
-                  "x": "17",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Multiple Inheritance"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "189",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4655",
-          "typeID": "__group__",
-          "zOrder": "135",
-          "measuredW": "213",
-          "measuredH": "47",
-          "w": "213",
-          "h": "47",
-          "x": "972",
-          "y": "1455",
-          "properties": {
-            "controlName": "100-structures-and-classes:multiple-inheritance:diamond-inheritance"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "202",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "162",
-                  "measuredH": "25",
-                  "x": "20",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Diamond Inheritance"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "189",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4656",
-          "typeID": "Arrow",
-          "zOrder": "136",
-          "w": "1",
-          "h": "392",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1617",
-          "y": "1331",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 1,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.47841726618705027,
-              "y": -0.001438848920863544
-            },
-            "p2": {
-              "x": 1,
-              "y": 392.3688638189676
-            }
-          }
-        },
-        {
-          "ID": "4657",
-          "typeID": "__group__",
-          "zOrder": "137",
-          "measuredW": "219",
-          "measuredH": "50",
-          "w": "219",
-          "h": "50",
-          "x": "1448",
-          "y": "1551",
-          "properties": {
-            "controlName": "108-exception-handling"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "208",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "149",
-                  "measuredH": "25",
-                  "x": "29",
-                  "y": "12",
-                  "properties": {
-                    "size": "17",
-                    "text": "Exception Handling"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "195",
-                  "y": "14",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4658",
-          "typeID": "__group__",
-          "zOrder": "138",
-          "measuredW": "191",
-          "measuredH": "47",
-          "w": "191",
-          "h": "47",
-          "x": "1219",
-          "y": "1500",
-          "properties": {
-            "controlName": "100-exception-handling:exceptions"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "180",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "85",
-                  "measuredH": "25",
-                  "x": "47",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Exceptions"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "167",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4659",
-          "typeID": "__group__",
-          "zOrder": "139",
-          "measuredW": "191",
-          "measuredH": "47",
-          "w": "191",
-          "h": "47",
-          "x": "1219",
-          "y": "1438",
-          "properties": {
-            "controlName": "100-exception-handling:exceptions:access-violations"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "180",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "134",
-                  "measuredH": "25",
-                  "x": "23",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Access Violations"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "167",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4660",
-          "typeID": "__group__",
-          "zOrder": "140",
-          "measuredW": "191",
-          "measuredH": "47",
-          "w": "191",
-          "h": "47",
-          "x": "1219",
-          "y": "1553",
-          "properties": {
-            "controlName": "101-exception-handling:exit-codes"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "182",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "83",
-                  "measuredH": "25",
-                  "x": "49",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Exit Codes"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "167",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4661",
-          "typeID": "__group__",
-          "zOrder": "141",
-          "measuredW": "282",
-          "measuredH": "60",
-          "w": "282",
-          "h": "60",
-          "x": "1012",
-          "y": "1702",
-          "properties": {
-            "controlName": "109-language-concepts"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "282",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "10",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "156",
-                  "measuredH": "25",
-                  "x": "63",
-                  "y": "22",
-                  "properties": {
-                    "size": "17",
-                    "text": "Language Concepts"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "252",
-                  "y": "0",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4662",
-          "typeID": "__group__",
-          "zOrder": "142",
-          "measuredW": "314",
-          "measuredH": "47",
-          "w": "314",
-          "h": "47",
-          "x": "612",
-          "y": "1500",
-          "properties": {
-            "controlName": "100-language-concepts:auto"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "303",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "252",
-                  "measuredH": "25",
-                  "x": "16",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "auto (Automatic Type Deduction)"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "290",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4663",
-          "typeID": "__group__",
-          "zOrder": "143",
-          "measuredW": "315",
-          "measuredH": "47",
-          "w": "315",
-          "h": "47",
-          "x": "612",
-          "y": "1554",
-          "properties": {
-            "controlName": "101-language-concepts:type-casting"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "303",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "100",
-                  "measuredH": "25",
-                  "x": "102",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Type Casting"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "291",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4664",
-          "typeID": "__group__",
-          "zOrder": "144",
-          "measuredW": "164",
-          "measuredH": "47",
-          "w": "164",
-          "h": "47",
-          "x": "380",
-          "y": "1535",
-          "properties": {
-            "controlName": "101-language-concepts:type-casting:const-cast"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "153",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "85",
-                  "measuredH": "25",
-                  "x": "45",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "const_cast"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4665",
-          "typeID": "__group__",
-          "zOrder": "145",
-          "measuredW": "164",
-          "measuredH": "47",
-          "w": "164",
-          "h": "47",
-          "x": "380",
-          "y": "1485",
-          "properties": {
-            "controlName": "100-language-concepts:type-casting:static-cast"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "153",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "85",
-                  "measuredH": "25",
-                  "x": "45",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "static_cast"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4666",
-          "typeID": "__group__",
-          "zOrder": "146",
-          "measuredW": "164",
-          "measuredH": "47",
-          "w": "164",
-          "h": "47",
-          "x": "380",
-          "y": "1586",
-          "properties": {
-            "controlName": "102-language-concepts:type-casting:dynamic-cast"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "153",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "107",
-                  "measuredH": "25",
-                  "x": "34",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "dynamic_cast"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4667",
-          "typeID": "__group__",
-          "zOrder": "147",
-          "measuredW": "164",
-          "measuredH": "47",
-          "w": "164",
-          "h": "47",
-          "x": "380",
-          "y": "1637",
-          "properties": {
-            "controlName": "103-language-concepts:type-casting:reinterpret-cast"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "153",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "125",
-                  "measuredH": "25",
-                  "x": "25",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "reinterpret_cast"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4668",
-          "typeID": "__group__",
-          "zOrder": "148",
-          "measuredW": "315",
-          "measuredH": "47",
-          "w": "315",
-          "h": "47",
-          "x": "612",
-          "y": "1608",
-          "properties": {
-            "controlName": "102-language-concepts:undefined-behavior"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "303",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "194",
-                  "measuredH": "25",
-                  "x": "55",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Undefined Behavior (UB)"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "291",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4669",
-          "typeID": "__group__",
-          "zOrder": "149",
-          "measuredW": "314",
-          "measuredH": "47",
-          "w": "314",
-          "h": "47",
-          "x": "613",
-          "y": "1662",
-          "properties": {
-            "controlName": "103-language-concepts:adl"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "303",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "276",
-                  "measuredH": "25",
-                  "x": "12",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Argument Dependent Lookup (ADL)"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "290",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4670",
-          "typeID": "__group__",
-          "zOrder": "150",
-          "measuredW": "117",
-          "measuredH": "47",
-          "w": "117",
-          "h": "47",
-          "x": "810",
-          "y": "1716",
-          "properties": {
-            "controlName": "105-language-concepts:macros"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "105",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "58",
-                  "measuredH": "25",
-                  "x": "23",
-                  "y": "12",
-                  "properties": {
-                    "size": "17",
-                    "text": "Macros"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "93",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4671",
-          "typeID": "__group__",
-          "zOrder": "151",
-          "measuredW": "200",
-          "measuredH": "47",
-          "w": "200",
-          "h": "47",
-          "x": "602",
-          "y": "1716",
-          "properties": {
-            "controlName": "104-language-concepts:name-mangling"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "189",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "122",
-                  "measuredH": "25",
-                  "x": "45",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Name Mangling"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4672",
-          "typeID": "Arrow",
-          "zOrder": "152",
-          "w": "1",
-          "h": "299",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1618",
-          "y": "1748",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.47841726618704994,
-              "y": -0.001438848920863544
-            },
-            "p2": {
-              "x": 0,
-              "y": 299.33333333333326
-            }
-          }
-        },
-        {
-          "ID": "4673",
-          "typeID": "__group__",
-          "zOrder": "153",
-          "measuredW": "254",
-          "measuredH": "50",
-          "w": "254",
-          "h": "50",
-          "x": "1411",
-          "y": "1867",
-          "properties": {
-            "controlName": "110-stl"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "242",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "177",
-                  "measuredH": "25",
-                  "x": "33",
-                  "y": "12",
-                  "properties": {
-                    "size": "17",
-                    "text": "Standard Library + STL"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "230",
-                  "y": "13",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4674",
-          "typeID": "__group__",
-          "zOrder": "154",
-          "measuredW": "156",
-          "measuredH": "47",
-          "w": "156",
-          "h": "47",
-          "x": "1195",
-          "y": "1819",
-          "properties": {
-            "controlName": "101-stl:iostream"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "150",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "6",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "67",
-                  "measuredH": "25",
-                  "x": "47",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "iostream"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4675",
-          "typeID": "__group__",
-          "zOrder": "155",
-          "measuredW": "156",
-          "measuredH": "47",
-          "w": "156",
-          "h": "47",
-          "x": "1195",
-          "y": "1869",
-          "properties": {
-            "controlName": "103-stl:date-time"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "150",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "6",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "91",
-                  "measuredH": "25",
-                  "x": "35",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Date / Time"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4676",
-          "typeID": "__group__",
-          "zOrder": "156",
-          "measuredW": "157",
-          "measuredH": "47",
-          "w": "157",
-          "h": "47",
-          "x": "1194",
-          "y": "1920",
-          "properties": {
-            "controlName": "105-stl:ccontainers"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "150",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "7",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "85",
-                  "measuredH": "25",
-                  "x": "39",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Containers"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4677",
-          "typeID": "__group__",
-          "zOrder": "157",
-          "measuredW": "163",
-          "measuredH": "47",
-          "w": "163",
-          "h": "47",
-          "x": "1032",
-          "y": "1819",
-          "properties": {
-            "controlName": "100-stl:iterators"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "152",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "w": "66",
-                  "measuredW": "66",
-                  "measuredH": "25",
-                  "x": "54",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Iterators"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4678",
-          "typeID": "__group__",
-          "zOrder": "158",
-          "measuredW": "162",
-          "measuredH": "47",
-          "w": "162",
-          "h": "47",
-          "x": "1033",
-          "y": "1869",
-          "properties": {
-            "controlName": "102-stl:algorithms"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "152",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "81",
-                  "measuredH": "25",
-                  "x": "45",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Algorithms"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4679",
-          "typeID": "__group__",
-          "zOrder": "159",
-          "measuredW": "162",
-          "measuredH": "47",
-          "w": "162",
-          "h": "47",
-          "x": "1033",
-          "y": "1919",
-          "properties": {
-            "controlName": "104-stl:multithreading"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "152",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "10",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "111",
-                  "measuredH": "25",
-                  "x": "30",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Multithreading"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4680",
-          "typeID": "Arrow",
-          "zOrder": "160",
-          "w": "537",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1078",
-          "y": "2047",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": -0.3738002047268765,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5094183863981457,
-              "y": 0.0009010178239445598
-            },
-            "p2": {
-              "x": 537.0566693370974,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4681",
-          "typeID": "__group__",
-          "zOrder": "161",
-          "measuredW": "230",
-          "measuredH": "50",
-          "w": "230",
-          "h": "50",
-          "x": "1051",
-          "y": "2022",
-          "properties": {
-            "controlName": "111-templates"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "219",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "80",
-                  "measuredH": "25",
-                  "x": "58",
-                  "y": "12",
-                  "properties": {
-                    "size": "17",
-                    "text": "Templates"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "206",
-                  "y": "13",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4682",
-          "typeID": "__group__",
-          "zOrder": "162",
-          "measuredW": "226",
-          "measuredH": "47",
-          "w": "226",
-          "h": "47",
-          "x": "700",
-          "y": "1869",
-          "properties": {
-            "controlName": "100-templates:variadic-templates"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "217",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "145",
-                  "measuredH": "25",
-                  "x": "45",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Variadic Templates"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4683",
-          "typeID": "__group__",
-          "zOrder": "163",
-          "measuredW": "226",
-          "measuredH": "47",
-          "w": "226",
-          "h": "47",
-          "x": "700",
-          "y": "1922",
-          "properties": {
-            "controlName": "101-templates:template-specialization"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "217",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "182",
-                  "measuredH": "25",
-                  "x": "27",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Template Specialization"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "10",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4684",
-          "typeID": "__group__",
-          "zOrder": "164",
-          "measuredW": "226",
-          "measuredH": "47",
-          "w": "226",
-          "h": "47",
-          "x": "700",
-          "y": "1975",
-          "properties": {
-            "controlName": "102-templates:type-traits"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "217",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "83",
-                  "measuredH": "25",
-                  "x": "76",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Type Traits"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4685",
-          "typeID": "__group__",
-          "zOrder": "165",
-          "measuredW": "226",
-          "measuredH": "47",
-          "w": "226",
-          "h": "47",
-          "x": "700",
-          "y": "2028",
-          "properties": {
-            "controlName": "103-templates:finae"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "217",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "61",
-                  "measuredH": "25",
-                  "x": "87",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "SFINAE"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4686",
-          "typeID": "__group__",
-          "zOrder": "166",
-          "measuredW": "282",
-          "measuredH": "47",
-          "w": "282",
-          "h": "47",
-          "x": "368",
-          "y": "1875",
-          "properties": {
-            "controlName": "100-templates:template-specialization:full"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "273",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "213",
-                  "measuredH": "25",
-                  "x": "45",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Full Template Specialization"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "9",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4687",
-          "typeID": "__group__",
-          "zOrder": "167",
-          "measuredW": "282",
-          "measuredH": "47",
-          "w": "282",
-          "h": "47",
-          "x": "368",
-          "y": "1926",
-          "properties": {
-            "controlName": "101-templates:template-specialization:partial"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "273",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "235",
-                  "measuredH": "25",
-                  "x": "34",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Partial Template Specialization"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4688",
-          "typeID": "Arrow",
-          "zOrder": "168",
-          "w": "343",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "817",
-          "y": "2158",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0.28965722981035924,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5094183863981457,
-              "y": 0.0009010178239445598
-            },
-            "p2": {
-              "x": 343.05666933709745,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4689",
-          "typeID": "__group__",
-          "zOrder": "169",
-          "measuredW": "217",
-          "measuredH": "59",
-          "w": "217",
-          "h": "59",
-          "x": "709",
-          "y": "2134",
-          "properties": {
-            "controlName": "112-idioms"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "217",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "9",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "52",
-                  "measuredH": "25",
-                  "x": "83",
-                  "y": "21",
-                  "properties": {
-                    "size": "17",
-                    "text": "Idioms"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "184",
-                  "y": "0",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4690",
-          "typeID": "__group__",
-          "zOrder": "170",
-          "measuredW": "83",
-          "measuredH": "47",
-          "w": "83",
-          "h": "47",
-          "x": "380",
-          "y": "2040",
-          "properties": {
-            "controlName": "100-idioms:raii"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "74",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "34",
-                  "measuredH": "25",
-                  "x": "28",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "RAII"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "10",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4691",
-          "typeID": "__group__",
-          "zOrder": "171",
-          "measuredW": "90",
-          "measuredH": "47",
-          "w": "90",
-          "h": "47",
-          "x": "464",
-          "y": "2040",
-          "properties": {
-            "controlName": "101-idioms:pimpl"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "85",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "5",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "43",
-                  "measuredH": "25",
-                  "x": "32",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Pimpl"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "10",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4692",
-          "typeID": "__group__",
-          "zOrder": "172",
-          "measuredW": "274",
-          "measuredH": "47",
-          "w": "274",
-          "h": "47",
-          "x": "380",
-          "y": "2093",
-          "properties": {
-            "controlName": "103-idioms:non-copyable"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "266",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "8",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "232",
-                  "measuredH": "25",
-                  "x": "28",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Non-Copyable/Non-Moveable"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4693",
-          "typeID": "__group__",
-          "zOrder": "173",
-          "measuredW": "274",
-          "measuredH": "47",
-          "w": "274",
-          "h": "47",
-          "x": "380",
-          "y": "2144",
-          "properties": {
-            "controlName": "104-idioms:erase-remove"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "266",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "8",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "116",
-                  "measuredH": "25",
-                  "x": "83",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Erase-Remove"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4694",
-          "typeID": "__group__",
-          "zOrder": "174",
-          "measuredW": "274",
-          "measuredH": "47",
-          "w": "274",
-          "h": "47",
-          "x": "380",
-          "y": "2196",
-          "properties": {
-            "controlName": "105-idioms:copy-swap"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "266",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "8",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "117",
-                  "measuredH": "25",
-                  "x": "82",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Copy and Swap"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4695",
-          "typeID": "__group__",
-          "zOrder": "175",
-          "measuredW": "274",
-          "measuredH": "47",
-          "w": "274",
-          "h": "47",
-          "x": "380",
-          "y": "2247",
-          "properties": {
-            "controlName": "106-idioms:copy-write"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "266",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "8",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "107",
-                  "measuredH": "25",
-                  "x": "87",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Copy on Write"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4696",
-          "typeID": "__group__",
-          "zOrder": "176",
-          "measuredW": "100",
-          "measuredH": "47",
-          "w": "100",
-          "h": "47",
-          "x": "554",
-          "y": "2040",
-          "properties": {
-            "controlName": "102-idioms:crtp"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "94",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "6",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "46",
-                  "measuredH": "25",
-                  "x": "34",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "CRTP"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4697",
-          "typeID": "Arrow",
-          "zOrder": "177",
-          "w": "1",
-          "h": "127",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1159",
-          "y": "2179",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": -0.3738002047268765,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5094183863981456,
-              "y": 0.0009010178239445602
-            },
-            "p2": {
-              "x": -0.3738002047268765,
-              "y": 126.6863074097705
-            }
-          }
-        },
-        {
-          "ID": "4698",
-          "typeID": "__group__",
-          "zOrder": "178",
-          "measuredW": "228",
-          "measuredH": "50",
-          "w": "228",
-          "h": "50",
-          "x": "1042",
-          "y": "2290",
-          "properties": {
-            "controlName": "113-standards"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "219",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "78",
-                  "measuredH": "25",
-                  "x": "68",
-                  "y": "12",
-                  "properties": {
-                    "size": "17",
-                    "text": "Standards"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4699",
-          "typeID": "__group__",
-          "zOrder": "179",
-          "measuredW": "158",
-          "measuredH": "47",
-          "w": "158",
-          "h": "47",
-          "x": "1405",
-          "y": "2087",
-          "properties": {
-            "controlName": "100-standards:cpp11-14"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "150",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "73",
-                  "measuredH": "25",
-                  "x": "38",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "C++11/14"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "134",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4700",
-          "typeID": "__group__",
-          "zOrder": "180",
-          "measuredW": "158",
-          "measuredH": "47",
-          "w": "158",
-          "h": "47",
-          "x": "1405",
-          "y": "2138",
-          "properties": {
-            "controlName": "101-standards:cpp17"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "150",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "50",
-                  "measuredH": "25",
-                  "x": "50",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "C++17"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "134",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4701",
-          "typeID": "__group__",
-          "zOrder": "181",
-          "measuredW": "158",
-          "measuredH": "47",
-          "w": "158",
-          "h": "47",
-          "x": "1405",
-          "y": "2190",
-          "properties": {
-            "controlName": "102-standards:cpp20"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "150",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "55",
-                  "measuredH": "25",
-                  "x": "47",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "C++20"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "134",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4702",
-          "typeID": "__group__",
-          "zOrder": "182",
-          "measuredW": "158",
-          "measuredH": "47",
-          "w": "158",
-          "h": "47",
-          "x": "1405",
-          "y": "2241",
-          "properties": {
-            "controlName": "103-standards:newest"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "150",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "58",
-                  "measuredH": "25",
-                  "x": "46",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Newest"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "134",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4703",
-          "typeID": "__group__",
-          "zOrder": "183",
-          "measuredW": "158",
-          "measuredH": "47",
-          "w": "158",
-          "h": "47",
-          "x": "1405",
-          "y": "2293",
-          "properties": {
-            "controlName": "104-standards:cpp0x"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "150",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "53",
-                  "measuredH": "25",
-                  "x": "46",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "C++0x"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "134",
-                  "y": "10",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4704",
-          "typeID": "TextArea",
-          "zOrder": "184",
-          "w": "242",
-          "h": "46",
-          "measuredW": "200",
-          "measuredH": "140",
-          "x": "1029",
-          "y": "2380",
-          "properties": {
-            "borderColor": "16777215"
-          }
-        },
-        {
-          "ID": "4705",
-          "typeID": "Label",
-          "zOrder": "185",
-          "measuredW": "143",
-          "measuredH": "28",
-          "x": "1078",
-          "y": "2389",
-          "properties": {
-            "size": "20",
-            "text": "Language Tools"
-          }
-        },
-        {
-          "ID": "4706",
-          "typeID": "__group__",
-          "zOrder": "186",
-          "measuredW": "217",
-          "measuredH": "59",
-          "w": "217",
-          "h": "59",
-          "x": "1051",
-          "y": "2465",
-          "properties": {
-            "controlName": "114-debuggers"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "217",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "9",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "86",
-                  "measuredH": "25",
-                  "x": "66",
-                  "y": "21",
-                  "properties": {
-                    "size": "17",
-                    "text": "Debuggers"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "185",
-                  "y": "0",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4707",
-          "typeID": "__group__",
-          "zOrder": "187",
-          "measuredW": "314",
-          "measuredH": "55",
-          "w": "314",
-          "h": "55",
-          "x": "1333",
-          "y": "2469",
-          "properties": {
-            "controlName": "100-debuggers:debugger-messages"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "310",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "8",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "w": "280",
-                  "measuredW": "280",
-                  "measuredH": "25",
-                  "x": "15",
-                  "y": "19",
-                  "properties": {
-                    "size": "17",
-                    "text": "Understanding Debugger Messages"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "290",
-                  "y": "0",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4708",
-          "typeID": "__group__",
-          "zOrder": "188",
-          "measuredW": "316",
-          "measuredH": "49",
-          "w": "316",
-          "h": "49",
-          "x": "1333",
-          "y": "2528",
-          "properties": {
-            "controlName": "101-debuggers:debugger-symbols"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "310",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "2",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "153",
-                  "measuredH": "25",
-                  "x": "78",
-                  "y": "13",
-                  "properties": {
-                    "size": "17",
-                    "text": "Debugging Symbols"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "292",
-                  "y": "0",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4709",
-          "typeID": "__group__",
-          "zOrder": "189",
-          "measuredW": "155",
-          "measuredH": "47",
-          "w": "155",
-          "h": "47",
-          "x": "1322",
-          "y": "2582",
-          "properties": {
-            "controlName": "102-debuggers:win-dbg"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "144",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "63",
-                  "measuredH": "25",
-                  "x": "51",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "WinDBg"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4710",
-          "typeID": "__group__",
-          "zOrder": "190",
-          "measuredW": "168",
-          "measuredH": "47",
-          "w": "168",
-          "h": "47",
-          "x": "1482",
-          "y": "2582",
-          "properties": {
-            "controlName": "103-debuggers:gdb"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "161",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "37",
-                  "measuredH": "25",
-                  "x": "62",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "GDB"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "144",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4711",
-          "typeID": "__group__",
-          "zOrder": "191",
-          "measuredW": "228",
-          "measuredH": "50",
-          "w": "228",
-          "h": "50",
-          "x": "700",
-          "y": "2473",
-          "properties": {
-            "controlName": "115-compilers"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "217",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "78",
-                  "measuredH": "25",
-                  "x": "81",
-                  "y": "12",
-                  "properties": {
-                    "size": "17",
-                    "text": "Compilers"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4712",
-          "typeID": "__group__",
-          "zOrder": "192",
-          "measuredW": "338",
-          "measuredH": "47",
-          "w": "338",
-          "h": "47",
-          "x": "645",
-          "y": "2386",
-          "properties": {
-            "controlName": "100-compilers:stages"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "327",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "223",
-                  "measuredH": "25",
-                  "x": "63",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Understand Compiler Stages"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "8",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4713",
-          "typeID": "__group__",
-          "zOrder": "193",
-          "measuredW": "359",
-          "measuredH": "47",
-          "w": "359",
-          "h": "47",
-          "x": "634",
-          "y": "2549",
-          "properties": {
-            "controlName": "101-compilers:features"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "348",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "294",
-                  "measuredH": "25",
-                  "x": "38",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Different Compilers and their Features"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4714",
-          "typeID": "Label",
-          "zOrder": "194",
-          "measuredW": "119",
-          "measuredH": "25",
-          "x": "684",
-          "y": "2608",
-          "properties": {
-            "size": "17",
-            "text": "Clang++/LLVM"
-          }
-        },
-        {
-          "ID": "4715",
-          "typeID": "Label",
-          "zOrder": "195",
-          "measuredW": "74",
-          "measuredH": "25",
-          "x": "684",
-          "y": "2637",
-          "properties": {
-            "size": "17",
-            "text": "Intel C++"
-          }
-        },
-        {
-          "ID": "4716",
-          "typeID": "Label",
-          "zOrder": "196",
-          "measuredW": "86",
-          "measuredH": "25",
-          "x": "684",
-          "y": "2666",
-          "properties": {
-            "size": "17",
-            "text": "MSVS C++"
-          }
-        },
-        {
-          "ID": "4717",
-          "typeID": "Label",
-          "zOrder": "197",
-          "measuredW": "37",
-          "measuredH": "25",
-          "x": "684",
-          "y": "2695",
-          "properties": {
-            "size": "17",
-            "text": "GCC"
-          }
-        },
-        {
-          "ID": "4718",
-          "typeID": "Label",
-          "zOrder": "198",
-          "measuredW": "57",
-          "measuredH": "25",
-          "x": "684",
-          "y": "2724",
-          "properties": {
-            "size": "17",
-            "text": "MinGW"
-          }
-        },
-        {
-          "ID": "4719",
-          "typeID": "Arrow",
-          "zOrder": "199",
-          "w": "1",
-          "h": "331",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "476",
-          "y": "2498",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": -0.3738002047268765,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5094183863981455,
-              "y": 0.0009010178239445601
-            },
-            "p2": {
-              "x": -0.3738002047268765,
-              "y": 330.8231453094545
-            }
-          }
-        },
-        {
-          "ID": "4720",
-          "typeID": "Arrow",
-          "zOrder": "200",
-          "w": "1025",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "476",
-          "y": "2829",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0.29177514116184966,
-              "y": 1
-            },
-            "p1": {
-              "x": 0.5094183863981455,
-              "y": 0.0009010178239445597
-            },
-            "p2": {
-              "x": 1025.4781385743524,
-              "y": 1
-            }
-          }
-        },
-        {
-          "ID": "4721",
-          "typeID": "__group__",
-          "zOrder": "201",
-          "measuredW": "227",
-          "measuredH": "50",
-          "w": "227",
-          "h": "50",
-          "x": "1051",
-          "y": "2805",
-          "properties": {
-            "controlName": "116-build-systems"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "217",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "107",
-                  "measuredH": "25",
-                  "x": "55",
-                  "y": "12",
-                  "properties": {
-                    "size": "17",
-                    "text": "Build Systems"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "203",
-                  "y": "13",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4722",
-          "typeID": "__group__",
-          "zOrder": "202",
-          "measuredW": "171",
-          "measuredH": "47",
-          "w": "171",
-          "h": "47",
-          "x": "1079",
-          "y": "2616",
-          "properties": {
-            "controlName": "100-build-systems:cmake"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "161",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "60",
-                  "measuredH": "25",
-                  "x": "51",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "CMAKE"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "147",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4723",
-          "typeID": "__group__",
-          "zOrder": "203",
-          "measuredW": "171",
-          "measuredH": "47",
-          "w": "171",
-          "h": "47",
-          "x": "1079",
-          "y": "2667",
-          "properties": {
-            "controlName": "101-build-systems:makefile"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "161",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "65",
-                  "measuredH": "25",
-                  "x": "48",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Makefile"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "147",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4724",
-          "typeID": "__group__",
-          "zOrder": "204",
-          "measuredW": "171",
-          "measuredH": "47",
-          "w": "171",
-          "h": "47",
-          "x": "1079",
-          "y": "2719",
-          "properties": {
-            "controlName": "102-build-systems:ninja"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "161",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "41",
-                  "measuredH": "25",
-                  "x": "60",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Ninja"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "147",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4725",
-          "typeID": "__group__",
-          "zOrder": "205",
-          "measuredW": "229",
-          "measuredH": "50",
-          "w": "229",
-          "h": "50",
-          "x": "1399",
-          "y": "2805",
-          "properties": {
-            "controlName": "117-package-managers"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "217",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "149",
-                  "measuredH": "25",
-                  "x": "34",
-                  "y": "12",
-                  "properties": {
-                    "size": "17",
-                    "text": "Package Managers"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "205",
-                  "y": "13",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4726",
-          "typeID": "__group__",
-          "zOrder": "206",
-          "measuredW": "108",
-          "measuredH": "47",
-          "w": "108",
-          "h": "47",
-          "x": "1395",
-          "y": "2713",
-          "properties": {
-            "controlName": "102-package-managers:conan"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "96",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "12",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "51",
-                  "measuredH": "25",
-                  "x": "36",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Conan"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4727",
-          "typeID": "__group__",
-          "zOrder": "207",
-          "measuredW": "107",
-          "measuredH": "47",
-          "w": "107",
-          "h": "47",
-          "x": "1509",
-          "y": "2713",
-          "properties": {
-            "controlName": "103-package-managers:nuget"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "96",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "51",
-                  "measuredH": "25",
-                  "x": "20",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "NuGet"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "83",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4728",
-          "typeID": "__group__",
-          "zOrder": "208",
-          "measuredW": "108",
-          "measuredH": "47",
-          "w": "108",
-          "h": "47",
-          "x": "1395",
-          "y": "2662",
-          "properties": {
-            "controlName": "100-package-managers:vcpkg"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "96",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "12",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "45",
-                  "measuredH": "25",
-                  "x": "36",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "vcpkg"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4729",
-          "typeID": "__group__",
-          "zOrder": "209",
-          "measuredW": "106",
-          "measuredH": "47",
-          "w": "106",
-          "h": "47",
-          "x": "1509",
-          "y": "2662",
-          "properties": {
-            "controlName": "101-package-managers:spack"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "96",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "48",
-                  "measuredH": "25",
-                  "x": "21",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Spack"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "82",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4730",
-          "typeID": "__group__",
-          "zOrder": "210",
-          "measuredW": "229",
-          "measuredH": "50",
-          "w": "229",
-          "h": "50",
-          "x": "1399",
-          "y": "2957",
-          "properties": {
-            "controlName": "118-working-with-libs"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "217",
-                  "h": "50",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "169",
-                  "measuredH": "25",
-                  "x": "24",
-                  "y": "12",
-                  "properties": {
-                    "size": "17",
-                    "text": "Working with Libraries"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "205",
-                  "y": "14",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4731",
-          "typeID": "__group__",
-          "zOrder": "211",
-          "measuredW": "228",
-          "measuredH": "47",
-          "w": "228",
-          "h": "47",
-          "x": "1399",
-          "y": "3041",
-          "properties": {
-            "controlName": "100-working-with-libs:inclusion"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "217",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "126",
-                  "measuredH": "25",
-                  "x": "46",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Library Inclusion"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "204",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4732",
-          "typeID": "__group__",
-          "zOrder": "212",
-          "measuredW": "228",
-          "measuredH": "47",
-          "w": "228",
-          "h": "47",
-          "x": "1399",
-          "y": "3092",
-          "properties": {
-            "controlName": "101-working-with-libs:licensing"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "217",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "75",
-                  "measuredH": "25",
-                  "x": "71",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Licensing"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "204",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4733",
-          "typeID": "TextArea",
-          "zOrder": "213",
-          "w": "217",
-          "h": "363",
-          "measuredW": "200",
-          "measuredH": "140",
-          "x": "1051",
-          "y": "2910"
-        },
-        {
-          "ID": "4734",
-          "typeID": "Label",
-          "zOrder": "214",
-          "measuredW": "72",
-          "measuredH": "26",
-          "x": "1066",
-          "y": "2924",
-          "properties": {
-            "size": "18",
-            "text": "Libraries"
-          }
-        },
-        {
-          "ID": "4735",
-          "typeID": "__group__",
-          "zOrder": "215",
-          "measuredW": "99",
-          "measuredH": "47",
-          "w": "99",
-          "h": "47",
-          "x": "1054",
-          "y": "2960",
-          "properties": {
-            "controlName": "100-libraries:boost"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "88",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "45",
-                  "measuredH": "25",
-                  "x": "32",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Boost"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4736",
-          "typeID": "__group__",
-          "zOrder": "216",
-          "measuredW": "105",
-          "measuredH": "47",
-          "w": "105",
-          "h": "47",
-          "x": "1158",
-          "y": "2960",
-          "properties": {
-            "controlName": "101-libraries:open-cv"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "94",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "66",
-                  "measuredH": "25",
-                  "x": "12",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "OpenCV"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "81",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4737",
-          "typeID": "__group__",
-          "zOrder": "217",
-          "measuredW": "99",
-          "measuredH": "47",
-          "w": "99",
-          "h": "47",
-          "x": "1054",
-          "y": "3011",
-          "properties": {
-            "controlName": "102-libraries:poco"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "88",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "49",
-                  "measuredH": "25",
-                  "x": "30",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "POCO"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4738",
-          "typeID": "__group__",
-          "zOrder": "218",
-          "measuredW": "105",
-          "measuredH": "47",
-          "w": "105",
-          "h": "47",
-          "x": "1158",
-          "y": "3012",
-          "properties": {
-            "controlName": "103-libraries:protobuf"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "94",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "65",
-                  "measuredH": "25",
-                  "x": "12",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "protobuf"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "81",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4739",
-          "typeID": "__group__",
-          "zOrder": "219",
-          "measuredW": "87",
-          "measuredH": "47",
-          "w": "87",
-          "h": "47",
-          "x": "1054",
-          "y": "3062",
-          "properties": {
-            "controlName": "104-libraries:grpc"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "76",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "45",
-                  "measuredH": "25",
-                  "x": "26",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "gRPC"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4740",
-          "typeID": "__group__",
-          "zOrder": "220",
-          "measuredW": "103",
-          "measuredH": "47",
-          "w": "103",
-          "h": "47",
-          "x": "1160",
-          "y": "3164",
-          "properties": {
-            "controlName": "109-libraries:fmt"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "92",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "25",
-                  "measuredH": "25",
-                  "x": "40",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "fmt"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "79",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4741",
-          "typeID": "__group__",
-          "zOrder": "221",
-          "measuredW": "110",
-          "measuredH": "47",
-          "w": "110",
-          "h": "47",
-          "x": "1054",
-          "y": "3113",
-          "properties": {
-            "controlName": "106-libraries:pybind11"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "99",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "64",
-                  "measuredH": "25",
-                  "x": "33",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "pybind11"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4742",
-          "typeID": "__group__",
-          "zOrder": "222",
-          "measuredW": "94",
-          "measuredH": "47",
-          "w": "94",
-          "h": "47",
-          "x": "1169",
-          "y": "3113",
-          "properties": {
-            "controlName": "107-libraries:spdlog"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "83",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "52",
-                  "measuredH": "25",
-                  "x": "13",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "spdlog"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "70",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4743",
-          "typeID": "__group__",
-          "zOrder": "223",
-          "measuredW": "198",
-          "measuredH": "47",
-          "w": "198",
-          "h": "47",
-          "x": "1054",
-          "y": "3216",
-          "properties": {
-            "controlName": "110-libraries:ranges-v3"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "187",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "83",
-                  "measuredH": "25",
-                  "x": "63",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "ranges_v3"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4744",
-          "typeID": "__group__",
-          "zOrder": "224",
-          "measuredW": "118",
-          "measuredH": "47",
-          "w": "118",
-          "h": "47",
-          "x": "1145",
-          "y": "3062",
-          "properties": {
-            "controlName": "105-libraries:tensorflow"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "107",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "78",
-                  "measuredH": "25",
-                  "x": "12",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "tensorflow"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "94",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4745",
-          "typeID": "__group__",
-          "zOrder": "225",
-          "measuredW": "102",
-          "measuredH": "47",
-          "w": "102",
-          "h": "47",
-          "x": "1054",
-          "y": "3164",
-          "properties": {
-            "controlName": "108-libraries:opencl"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "91",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "11",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "53",
-                  "measuredH": "25",
-                  "x": "31",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "opencl"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "12",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4746",
-          "typeID": "TextArea",
-          "zOrder": "226",
-          "w": "217",
-          "h": "324",
-          "measuredW": "200",
-          "measuredH": "140",
-          "x": "710",
-          "y": "2910"
-        },
-        {
-          "ID": "4747",
-          "typeID": "Label",
-          "zOrder": "227",
-          "measuredW": "100",
-          "measuredH": "26",
-          "x": "725",
-          "y": "2924",
-          "properties": {
-            "size": "18",
-            "text": "Frameworks"
-          }
-        },
-        {
-          "ID": "4748",
-          "typeID": "__group__",
-          "zOrder": "228",
-          "measuredW": "196",
-          "measuredH": "47",
-          "w": "196",
-          "h": "47",
-          "x": "715",
-          "y": "2961",
-          "properties": {
-            "controlName": "100-frameworks:gtest"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "187",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "97",
-                  "measuredH": "25",
-                  "x": "54",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "gtest/gmock"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4749",
-          "typeID": "__group__",
-          "zOrder": "229",
-          "measuredW": "196",
-          "measuredH": "47",
-          "w": "196",
-          "h": "47",
-          "x": "715",
-          "y": "3013",
-          "properties": {
-            "controlName": "101-frameworks:qt"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "187",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "19",
-                  "measuredH": "25",
-                  "x": "93",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Qt"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "10",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4750",
-          "typeID": "__group__",
-          "zOrder": "230",
-          "measuredW": "196",
-          "measuredH": "47",
-          "w": "196",
-          "h": "47",
-          "x": "715",
-          "y": "3065",
-          "properties": {
-            "controlName": "102-frameworks:catch2"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "187",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "56",
-                  "measuredH": "25",
-                  "x": "75",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Catch2"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "10",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4751",
-          "typeID": "__group__",
-          "zOrder": "231",
-          "measuredW": "196",
-          "measuredH": "47",
-          "w": "196",
-          "h": "47",
-          "x": "715",
-          "y": "3117",
-          "properties": {
-            "controlName": "103-frameworks:orbit-profiler"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "187",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "97",
-                  "measuredH": "25",
-                  "x": "54",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "Orbit Profiler"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4752",
-          "typeID": "__group__",
-          "zOrder": "232",
-          "measuredW": "196",
-          "measuredH": "47",
-          "w": "196",
-          "h": "47",
-          "x": "715",
-          "y": "3169",
-          "properties": {
-            "controlName": "104-frameworks:pytorch-cpp"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "187",
-                  "h": "47",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "9",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "101",
-                  "measuredH": "25",
-                  "x": "52",
-                  "y": "11",
-                  "properties": {
-                    "size": "17",
-                    "text": "PyTorch C++"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "__group__",
-                  "zOrder": "2",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "0",
-                  "y": "11",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4753",
-          "typeID": "Arrow",
-          "zOrder": "233",
-          "w": "1",
-          "h": "354",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "475",
-          "y": "2982",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": -0.3738002047268765,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5094183863981455,
-              "y": 0.0009010178239445601
-            },
-            "p2": {
-              "x": -0.3738002047268765,
-              "y": 353.8988374933642
-            }
-          }
-        },
-        {
-          "ID": "4754",
-          "typeID": "Arrow",
-          "zOrder": "234",
-          "w": "624",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "475",
-          "y": "3336",
-          "properties": {
-            "color": "2848996",
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "p0": {
-              "x": 0.29177514116184966,
-              "y": 1
-            },
-            "p1": {
-              "x": 0.5094183863981455,
-              "y": 0.0009010178239445597
-            },
-            "p2": {
-              "x": 624.2630351748503,
-              "y": 1
-            }
-          }
-        },
-        {
-          "ID": "4755",
-          "typeID": "Arrow",
-          "zOrder": "235",
-          "w": "1",
-          "h": "81",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1099",
-          "y": "3533",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 0,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.49999999999999994,
-              "y": 0
-            },
-            "p2": {
-              "x": 0,
-              "y": 81.09090909090901
-            }
-          }
-        },
-        {
-          "ID": "4756",
-          "typeID": "TextArea",
-          "zOrder": "236",
-          "w": "420",
-          "h": "118",
-          "measuredW": "200",
-          "measuredH": "140",
-          "x": "890",
-          "y": "3447"
-        },
-        {
-          "ID": "4757",
-          "typeID": "Label",
-          "zOrder": "237",
-          "measuredW": "366",
-          "measuredH": "25",
-          "x": "917",
-          "y": "3466",
-          "properties": {
-            "size": "17",
-            "text": "Continue Learning with following relevant tracks"
-          }
-        },
-        {
-          "ID": "4758",
-          "typeID": "__group__",
-          "zOrder": "238",
-          "measuredW": "366",
-          "measuredH": "44",
-          "w": "366",
-          "h": "44",
-          "x": "917",
-          "y": "3499",
-          "properties": {
-            "controlName": "ext_link:roadmap.sh/backend"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "TextArea",
-                  "zOrder": "0",
-                  "w": "366",
-                  "h": "44",
-                  "measuredW": "200",
-                  "measuredH": "140",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "147",
-                  "measuredH": "25",
-                  "x": "109",
-                  "y": "9",
-                  "properties": {
-                    "size": "17",
-                    "text": "Backend Roadmap"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4764",
-          "typeID": "__group__",
-          "zOrder": "239",
-          "measuredW": "24",
-          "measuredH": "24",
-          "w": "24",
-          "h": "24",
-          "x": "1239",
-          "y": "2900",
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Icon",
-                  "zOrder": "0",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16777215",
-                    "icon": {
-                      "ID": "circle",
-                      "size": "small"
-                    }
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Icon",
-                  "zOrder": "1",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "icon": {
-                      "ID": "check-circle",
-                      "size": "small"
-                    },
-                    "color": "3700253"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4765",
-          "typeID": "__group__",
-          "zOrder": "240",
-          "measuredW": "24",
-          "measuredH": "24",
-          "w": "24",
-          "h": "24",
-          "x": "893",
-          "y": "2900",
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Icon",
-                  "zOrder": "0",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16777215",
-                    "icon": {
-                      "ID": "circle",
-                      "size": "small"
-                    }
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Icon",
-                  "zOrder": "1",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "icon": {
-                      "ID": "check-circle",
-                      "size": "small"
-                    },
-                    "color": "3700253"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4766",
-          "typeID": "Arrow",
-          "zOrder": "241",
-          "w": "194",
-          "h": "2",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "1003",
-          "y": "3666",
-          "properties": {
-            "curvature": "-1",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "16777215",
-            "p0": {
-              "x": 0,
-              "y": 0.21592451307655836
-            },
-            "p1": {
-              "x": 0.473,
-              "y": -0.01100000000000001
-            },
-            "p2": {
-              "x": 193.57438070328567,
-              "y": 0.21592451307651572
-            }
-          }
-        },
-        {
-          "ID": "4767",
-          "typeID": "__group__",
-          "zOrder": "85",
-          "measuredW": "420",
-          "measuredH": "272",
-          "w": "420",
-          "h": "272",
-          "x": "343",
-          "y": "38",
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "420",
-                  "h": "168",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0"
-                },
-                {
-                  "ID": "1",
-                  "typeID": "__group__",
-                  "zOrder": "1",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "23",
-                  "y": "23",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "3700253"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "Label",
-                  "zOrder": "2",
-                  "measuredW": "245",
-                  "measuredH": "24",
-                  "x": "59",
-                  "y": "23",
-                  "properties": {
-                    "size": "16",
-                    "text": "Beginner Topics / Start with these"
-                  }
-                },
-                {
-                  "ID": "3",
-                  "typeID": "Label",
-                  "zOrder": "3",
-                  "measuredW": "286",
-                  "measuredH": "24",
-                  "x": "60",
-                  "y": "88",
-                  "properties": {
-                    "size": "16",
-                    "text": "Advanced Topics / Pick them in the end"
-                  }
-                },
-                {
-                  "ID": "4",
-                  "typeID": "__group__",
-                  "zOrder": "4",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "23",
-                  "y": "88",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                },
-                {
-                  "ID": "5",
-                  "typeID": "Label",
-                  "zOrder": "5",
-                  "measuredW": "266",
-                  "measuredH": "24",
-                  "x": "59",
-                  "y": "56",
-                  "properties": {
-                    "size": "16",
-                    "text": "Intermediate Topics / Pick them next"
-                  }
-                },
-                {
-                  "ID": "6",
-                  "typeID": "__group__",
-                  "zOrder": "6",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "23",
-                  "y": "55",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Icon",
-                          "zOrder": "2",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10027263"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                },
-                {
-                  "ID": "7",
-                  "typeID": "Canvas",
-                  "zOrder": "7",
-                  "w": "420",
-                  "h": "112",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "160"
-                },
-                {
-                  "ID": "8",
-                  "typeID": "Label",
-                  "zOrder": "8",
-                  "measuredW": "318",
-                  "measuredH": "28",
-                  "x": "27",
-                  "y": "182",
-                  "properties": {
-                    "size": "20",
-                    "text": "References / Additional Resources"
-                  }
-                },
-                {
-                  "ID": "9",
-                  "typeID": "__group__",
-                  "zOrder": "9",
-                  "measuredW": "229",
-                  "measuredH": "27",
-                  "w": "229",
-                  "h": "27",
-                  "x": "29",
-                  "y": "220",
-                  "properties": {
-                    "controlName": "ext_link:salmer.github.io/CppDeveloperRoadmap/"
-                  },
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Label",
-                          "zOrder": "0",
-                          "measuredW": "196",
-                          "measuredH": "26",
-                          "x": "33",
-                          "y": "0",
-                          "properties": {
-                            "size": "18",
-                            "text": "Salmer’s C++ Roadmap"
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "__group__",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "w": "24",
-                          "h": "24",
-                          "x": "0",
-                          "y": "3",
-                          "children": {
-                            "controls": {
-                              "control": [
-                                {
-                                  "ID": "0",
-                                  "typeID": "Icon",
-                                  "zOrder": "0",
-                                  "measuredW": "24",
-                                  "measuredH": "24",
-                                  "x": "0",
-                                  "y": "0",
-                                  "properties": {
-                                    "color": "16777215",
-                                    "icon": {
-                                      "ID": "circle",
-                                      "size": "small"
-                                    }
-                                  }
-                                },
-                                {
-                                  "ID": "1",
-                                  "typeID": "Icon",
-                                  "zOrder": "1",
-                                  "measuredW": "24",
-                                  "measuredH": "24",
-                                  "x": "0",
-                                  "y": "0",
-                                  "properties": {
-                                    "color": "10066329",
-                                    "icon": {
-                                      "ID": "check-circle",
-                                      "size": "small"
-                                    }
-                                  }
-                                }
-                              ]
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                },
-                {
-                  "ID": "10",
-                  "typeID": "Label",
-                  "zOrder": "10",
-                  "measuredW": "199",
-                  "measuredH": "24",
-                  "x": "60",
-                  "y": "120",
-                  "properties": {
-                    "size": "16",
-                    "text": "Optional / Learn if you want"
-                  }
-                },
-                {
-                  "ID": "11",
-                  "typeID": "__group__",
-                  "zOrder": "11",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "w": "24",
-                  "h": "24",
-                  "x": "23",
-                  "y": "120",
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Icon",
-                          "zOrder": "0",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "color": "16777215",
-                            "icon": {
-                              "ID": "circle",
-                              "size": "small"
-                            }
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Icon",
-                          "zOrder": "1",
-                          "measuredW": "24",
-                          "measuredH": "24",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "icon": {
-                              "ID": "check-circle",
-                              "size": "small"
-                            },
-                            "color": "10066329"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4768",
-          "typeID": "__group__",
-          "zOrder": "84",
-          "measuredW": "350",
-          "measuredH": "141",
-          "w": "350",
-          "h": "141",
-          "x": "1297",
-          "y": "91",
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "350",
-                  "h": "141",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0"
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "314",
-                  "measuredH": "25",
-                  "x": "14",
-                  "y": "17",
-                  "properties": {
-                    "size": "17",
-                    "text": "Find the detailed version of this roadmap"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "Label",
-                  "zOrder": "2",
-                  "measuredW": "319",
-                  "measuredH": "25",
-                  "x": "14",
-                  "y": "45",
-                  "properties": {
-                    "size": "17",
-                    "text": "along with resources and other roadmaps"
-                  }
-                },
-                {
-                  "ID": "3",
-                  "typeID": "__group__",
-                  "zOrder": "3",
-                  "measuredW": "320",
-                  "measuredH": "45",
-                  "w": "320",
-                  "h": "45",
-                  "x": "15",
-                  "y": "81",
-                  "properties": {
-                    "controlName": "ext_link:roadmap.sh"
-                  },
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Canvas",
-                          "zOrder": "0",
-                          "w": "320",
-                          "h": "45",
-                          "measuredW": "100",
-                          "measuredH": "70",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "borderColor": "4273622",
-                            "color": "4273622"
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "__group__",
-                          "zOrder": "1",
-                          "measuredW": "181",
-                          "measuredH": "29",
-                          "w": "181",
-                          "h": "29",
-                          "x": "65",
-                          "y": "8",
-                          "children": {
-                            "controls": {
-                              "control": [
-                                {
-                                  "ID": "0",
-                                  "typeID": "Label",
-                                  "zOrder": "0",
-                                  "measuredW": "105",
-                                  "measuredH": "28",
-                                  "x": "76",
-                                  "y": "0",
-                                  "properties": {
-                                    "color": "16777215",
-                                    "size": "20",
-                                    "text": "roadmap.sh"
-                                  }
-                                },
-                                {
-                                  "ID": "1",
-                                  "typeID": "Label",
-                                  "zOrder": "1",
-                                  "measuredW": "45",
-                                  "measuredH": "28",
-                                  "x": "0",
-                                  "y": "0",
-                                  "properties": {
-                                    "color": "16777215",
-                                    "size": "20",
-                                    "text": "https"
-                                  }
-                                },
-                                {
-                                  "ID": "2",
-                                  "typeID": "Label",
-                                  "zOrder": "2",
-                                  "measuredW": "5",
-                                  "measuredH": "28",
-                                  "x": "48",
-                                  "y": "0",
-                                  "properties": {
-                                    "bold": "true",
-                                    "color": "16777215",
-                                    "size": "20",
-                                    "text": ":"
-                                  }
-                                },
-                                {
-                                  "ID": "3",
-                                  "typeID": "Label",
-                                  "zOrder": "3",
-                                  "measuredW": "10",
-                                  "measuredH": "28",
-                                  "x": "55",
-                                  "y": "1",
-                                  "properties": {
-                                    "color": "16777215",
-                                    "size": "20",
-                                    "text": "/"
-                                  }
-                                },
-                                {
-                                  "ID": "4",
-                                  "typeID": "Label",
-                                  "zOrder": "4",
-                                  "measuredW": "10",
-                                  "measuredH": "28",
-                                  "x": "63",
-                                  "y": "1",
-                                  "properties": {
-                                    "color": "16777215",
-                                    "size": "20",
-                                    "text": "/"
-                                  }
-                                }
-                              ]
-                            }
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
+          {
+            "id": "WbquXSrbKyKZuwVeLZfnw",
+            "label": "Optional / Learn if you want",
+            "color": "#999999"
+          }
+        ]
+      },
+      "zIndex": 999,
+      "width": 351,
+      "height": 156,
+      "positionAbsolute": {
+        "x": -285.20291471146976,
+        "y": -130.55580566097228
+      },
+      "dragging": false,
+      "style": { "width": 351 },
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "x_28LiDVshqWns_aIBsdx",
+      "type": "subtopic",
+      "position": { "x": 519.3983385532916, "y": 95.44419433902749 },
+      "selected": true,
+      "data": {
+        "label": "What is C++?",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 251,
+      "height": 49,
+      "style": { "width": 251, "height": 49 },
+      "positionAbsolute": { "x": 519.3983385532916, "y": 95.44419433902749 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "tl6VCQ5IEGDVyFcgj7jDm",
+      "type": "subtopic",
+      "position": { "x": 520.3137039073808, "y": 149.4441943390275 },
+      "selected": true,
+      "data": {
+        "label": "Why use C++",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 251,
+      "height": 49,
+      "style": { "width": 251, "height": 49 },
+      "positionAbsolute": { "x": 520.3137039073808, "y": 149.4441943390275 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "2Ag0t3LPryTF8khHLRfy-",
+      "type": "subtopic",
+      "position": { "x": 520.3137039073808, "y": 202.4441943390275 },
+      "selected": true,
+      "data": {
+        "label": "C vs C++",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 251,
+      "height": 49,
+      "style": { "width": 251, "height": 49 },
+      "positionAbsolute": { "x": 520.3137039073808, "y": 202.4441943390275 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "Zc_TTzmM36yWsu3GvOy9x",
+      "type": "topic",
+      "position": { "x": -281.68629609261916, "y": 282.9441943390275 },
+      "selected": true,
+      "data": {
+        "label": "Setting up your Environment",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 282,
+      "height": 49,
+      "style": { "width": 282, "height": 49 },
+      "positionAbsolute": { "x": -281.68629609261916, "y": 282.9441943390275 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "0J_ltQEJh2g28OE2ZEYJj",
+      "type": "subtopic",
+      "position": { "x": -281.68629609261916, "y": 364.4441943390275 },
+      "selected": true,
+      "data": {
+        "label": "Installing C++",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 282,
+      "height": 49,
+      "style": { "width": 282, "height": 49 },
+      "positionAbsolute": { "x": -281.68629609261916, "y": 364.4441943390275 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "ew0AfyadpXPRO0ZY3Z19k",
+      "type": "subtopic",
+      "position": { "x": -281.68629609261916, "y": 417.4441943390275 },
+      "selected": true,
+      "data": {
+        "label": "Code Editors / IDEs",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 282,
+      "height": 49,
+      "style": { "width": 282, "height": 49 },
+      "positionAbsolute": { "x": -281.68629609261916, "y": 417.4441943390275 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "SEq0D2Zg5WTsIDtd1hW9f",
+      "type": "subtopic",
+      "position": { "x": -281.68629609261916, "y": 470.4441943390275 },
+      "selected": true,
+      "data": {
+        "label": "Running your First Program",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 282,
+      "height": 49,
+      "style": { "width": 282, "height": 49 },
+      "positionAbsolute": { "x": -281.68629609261916, "y": 470.4441943390275 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "kl2JI_Wl47c5r8SYzxvCq",
+      "type": "topic",
+      "position": { "x": 127.76444711909286, "y": 282.9441943390275 },
+      "selected": true,
+      "data": {
+        "label": "Basic Operations",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "MwznA4qfpNlv6sqSNjPZi",
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 205,
+      "height": 49,
+      "style": { "width": 205, "height": 49 },
+      "positionAbsolute": { "x": 127.76444711909286, "y": 282.9441943390275 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "8aOSpZLWwZv_BEYiurhyR",
+      "type": "subtopic",
+      "position": { "x": 127.76444711909286, "y": 367.4441943390275 },
+      "selected": true,
+      "data": {
+        "label": "Arithmetic Operators",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 205,
+      "height": 49,
+      "style": { "width": 205, "height": 49 },
+      "positionAbsolute": { "x": 127.76444711909286, "y": 367.4441943390275 },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false
+    },
+    {
+      "id": "Y9gq8WkDA_XGe68JkY2UZ",
+      "type": "subtopic",
+      "position": { "x": 127.76444711909286, "y": 420.4441943390275 },
+      "selected": true,
+      "data": {
+        "label": "Logical Operators",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 205,
+      "height": 49,
+      "style": { "width": 205, "height": 49 },
+      "positionAbsolute": { "x": 127.76444711909286, "y": 420.4441943390275 },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false
+    },
+    {
+      "id": "zE4iPSq2KsrDSByQ0sGK_",
+      "type": "subtopic",
+      "position": { "x": 127.76444711909286, "y": 473.4441943390275 },
+      "selected": true,
+      "data": {
+        "label": "Bitwise Operators",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 205,
+      "height": 49,
+      "style": { "width": 205, "height": 49 },
+      "positionAbsolute": { "x": 127.76444711909286, "y": 473.4441943390275 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "s5Gs4yF9TPh-psYmtPzks",
+      "type": "topic",
+      "position": { "x": 518.9836543599333, "y": 461.1708336969881 },
+      "selected": true,
+      "data": {
+        "label": "Control Flow & Statements",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "MwznA4qfpNlv6sqSNjPZi",
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 251,
+      "height": 49,
+      "style": { "width": 251, "height": 49 },
+      "positionAbsolute": { "x": 518.9836543599333, "y": 461.1708336969881 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true,
+      "resizing": false
+    },
+    {
+      "id": "_IP_e1K9LhNHilYTDh7L5",
+      "type": "subtopic",
+      "position": { "x": 518.9836543599333, "y": 347.2028070104984 },
+      "selected": true,
+      "data": {
+        "label": "for / while / do while loops",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "bjpFWxiCKGz28E-ukhZBp",
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 251,
+      "height": 49,
+      "style": { "width": 251, "height": 49 },
+      "positionAbsolute": { "x": 518.9836543599333, "y": 347.2028070104984 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "bjpFWxiCKGz28E-ukhZBp",
+      "type": "subtopic",
+      "position": { "x": 518.9836543599333, "y": 294.7028070104984 },
+      "selected": true,
+      "data": {
+        "label": "if else / switch / goto",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 251,
+      "height": 49,
+      "style": { "width": 251, "height": 49 },
+      "positionAbsolute": { "x": 518.9836543599333, "y": 294.7028070104984 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "oYi3YOc1GC2Nfp71VOkJt",
+      "type": "topic",
+      "position": { "x": 517.4836543599333, "y": 569.015602149086 },
+      "selected": true,
+      "data": {
+        "label": "Functions",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "MwznA4qfpNlv6sqSNjPZi",
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 254,
+      "height": 49,
+      "style": { "width": 254, "height": 49 },
+      "positionAbsolute": { "x": 517.4836543599333, "y": 569.015602149086 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true,
+      "resizing": false
+    },
+    {
+      "id": "obZIxRp0eMWdG7gplNIBc",
+      "type": "subtopic",
+      "position": { "x": 518.4590437918661, "y": 765.6954620911321 },
+      "selected": true,
+      "data": {
+        "label": "Static Polymorphism",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center",
+          "colorType": "h"
+        },
+        "oldId": "xjiFBVe-VGqCqWfkPVGKf",
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 254,
+      "height": 49,
+      "style": { "width": 254, "height": 49 },
+      "positionAbsolute": { "x": 518.4590437918661, "y": 765.6954620911321 },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false,
+      "resizing": false
+    },
+    {
+      "id": "sgfqb22sdN4VRJYkhAVaf",
+      "type": "subtopic",
+      "position": { "x": 518.4590437918661, "y": 809.6954620911321 },
+      "selected": true,
+      "data": {
+        "label": "Function Overloading",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center",
+          "colorType": "c"
+        },
+        "oldId": "xjiFBVe-VGqCqWfkPVGKf",
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 254,
+      "height": 49,
+      "style": { "width": 254, "height": 49 },
+      "positionAbsolute": { "x": 518.4590437918661, "y": 809.6954620911321 },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false,
+      "resizing": false
+    },
+    {
+      "id": "llCBeut_uc9IAe2oi4KZ9",
+      "type": "subtopic",
+      "position": { "x": 518.4590437918661, "y": 658.0698136821208 },
+      "selected": true,
+      "data": {
+        "label": "Operator Overloading",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center",
+          "colorType": "c"
+        },
+        "oldId": "xjiFBVe-VGqCqWfkPVGKf",
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 254,
+      "height": 49,
+      "style": { "width": 254, "height": 49 },
+      "positionAbsolute": { "x": 518.4590437918661, "y": 658.0698136821208 },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false,
+      "resizing": false
+    },
+    {
+      "id": "xjiFBVe-VGqCqWfkPVGKf",
+      "type": "subtopic",
+      "position": { "x": 518.4590437918661, "y": 711.0698136821208 },
+      "selected": true,
+      "data": {
+        "label": "Lambdas",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center",
+          "colorType": "c"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 254,
+      "height": 49,
+      "style": { "width": 254, "height": 49 },
+      "positionAbsolute": { "x": 518.4590437918661, "y": 711.0698136821208 },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false,
+      "resizing": false
+    },
+    {
+      "id": "MwznA4qfpNlv6sqSNjPZi",
+      "type": "topic",
+      "position": { "x": 128.06739090002304, "y": 569.015602149086 },
+      "selected": true,
+      "data": {
+        "label": "Data Types",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 213,
+      "height": 49,
+      "style": { "width": 213, "height": 49 },
+      "positionAbsolute": { "x": 128.06739090002304, "y": 569.015602149086 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true,
+      "resizing": false
+    },
+    {
+      "id": "f1djN0GxoeVPr_0cl6vMq",
+      "type": "subtopic",
+      "position": { "x": 128.06739090002304, "y": 656.9515973902295 },
+      "selected": true,
+      "data": {
+        "label": "Static Typing",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 213,
+      "height": 49,
+      "style": { "width": 213, "height": 49 },
+      "positionAbsolute": { "x": 128.06739090002304, "y": 656.9515973902295 },
+      "dragging": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "i0EAFEUB-F0wBJWOtrl1A",
+      "type": "subtopic",
+      "position": { "x": 128.06739090002304, "y": 709.9515973902295 },
+      "selected": true,
+      "data": {
+        "label": "Dynamic Typing",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 213,
+      "height": 49,
+      "style": { "width": 213, "height": 49 },
+      "positionAbsolute": { "x": 128.06739090002304, "y": 709.9515973902295 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "r0yD1gfn03wTpEBi6zNsu",
+      "type": "subtopic",
+      "position": { "x": 128.06739090002304, "y": 783.5772457992408 },
+      "selected": true,
+      "data": {
+        "label": "RTTI",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 213,
+      "height": 49,
+      "style": { "width": 213, "height": 49 },
+      "positionAbsolute": { "x": 128.06739090002304, "y": 783.5772457992408 },
+      "dragging": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "DWw8NxkLpIpiOSUaZZ1oA",
+      "type": "topic",
+      "position": { "x": -281.9671760495324, "y": 569.015602149086 },
+      "selected": true,
+      "data": {
+        "label": "Pointers and References",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 236,
+      "height": 49,
+      "style": {},
+      "positionAbsolute": { "x": -281.9671760495324, "y": 569.015602149086 },
+      "dragging": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "uUzRKa9wGzdUwwmAg3FWr",
+      "type": "subtopic",
+      "position": { "x": -284.4671760495324, "y": 661.0205568938326 },
+      "selected": true,
+      "data": {
+        "label": "References",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 241,
+      "height": 49,
+      "style": { "width": 241, "height": 49 },
+      "positionAbsolute": { "x": -284.4671760495324, "y": 661.0205568938326 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "mSFwsTYvmg-GwG4_DEIEf",
+      "type": "subtopic",
+      "position": { "x": -284.4671760495324, "y": 714.0205568938326 },
+      "selected": true,
+      "data": {
+        "label": "Memory Model",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 241,
+      "height": 49,
+      "style": { "width": 241, "height": 49 },
+      "positionAbsolute": { "x": -284.4671760495324, "y": 714.0205568938326 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "9aA_-IfQ9WmbPgwic0mFN",
+      "type": "subtopic",
+      "position": { "x": -284.4671760495324, "y": 767.0205568938326 },
+      "selected": true,
+      "data": {
+        "label": "Lifetime of Objects",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 241,
+      "height": 50,
+      "style": { "width": 241, "height": 50 },
+      "positionAbsolute": { "x": -284.4671760495324, "y": 767.0205568938326 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "ulvwm4rRPgkpgaqGgyH5a",
+      "type": "subtopic",
+      "position": { "x": -275.9671760495324, "y": 834.0632184187253 },
+      "selected": true,
+      "data": {
+        "label": "Smart Pointers",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center",
+          "colorType": "h"
+        }
+      },
+      "zIndex": 999,
+      "width": 224,
+      "height": 49,
+      "style": { "width": 224, "height": 49 },
+      "positionAbsolute": { "x": -275.9671760495324, "y": 834.0632184187253 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "vUwSS-uX36OWZouO0wOcy",
+      "type": "subtopic",
+      "position": { "x": -275.9671760495324, "y": 887.0632184187253 },
+      "selected": true,
+      "data": {
+        "label": "weak_ptr",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 224,
+      "height": 49,
+      "style": { "width": 224, "height": 49 },
+      "positionAbsolute": { "x": -275.9671760495324, "y": 887.0632184187253 },
+      "dragging": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "b5jZIZD_U_CPg-_bdndjz",
+      "type": "subtopic",
+      "position": { "x": -275.9671760495324, "y": 940.0632184187253 },
+      "selected": true,
+      "data": {
+        "label": "shared_ptr",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
         }
-      ]
-    },
-    "attributes": {
-      "name": "New Wireframe 1 copy",
-      "order": 1000010.2336643032,
-      "parentID": null,
-      "notes": ""
-    },
-    "branchID": "Master",
-    "resourceID": "D5E1AC09-3023-4145-A52A-4D904363A065",
-    "mockupH": "3630",
-    "mockupW": "1325",
-    "measuredW": "1667",
-    "measuredH": "3668",
-    "version": "1.0"
-  },
-  "groupOffset": {
-    "x": 0,
-    "y": 0
-  },
-  "dependencies": [],
-  "projectID": "file:///Users/kamrify/Desktop/New%20Roadmaps/New%20Project%201.bmpr"
-}
\ No newline at end of file
+      },
+      "zIndex": 999,
+      "width": 224,
+      "height": 49,
+      "style": { "width": 224, "height": 49 },
+      "positionAbsolute": { "x": -275.9671760495324, "y": 940.0632184187253 },
+      "dragging": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "k9c5seRkhgm_yHPpiz2X0",
+      "type": "subtopic",
+      "position": { "x": -275.9671760495324, "y": 993.0632184187253 },
+      "selected": true,
+      "data": {
+        "label": "unique_ptr",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 224,
+      "height": 49,
+      "style": { "width": 224, "height": 49 },
+      "positionAbsolute": { "x": -275.9671760495324, "y": 993.0632184187253 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "uEGEmbxegATIrvGfobJb9",
+      "type": "subtopic",
+      "position": { "x": -275.9671760495324, "y": 1060.9498696738276 },
+      "selected": true,
+      "data": {
+        "label": "Raw Pointers",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center",
+          "colorType": "h"
+        }
+      },
+      "zIndex": 999,
+      "width": 224,
+      "height": 49,
+      "style": { "width": 224, "height": 49 },
+      "positionAbsolute": { "x": -275.9671760495324, "y": 1060.9498696738276 },
+      "dragging": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "Gld0nRs0sM8kRe8XmYolu",
+      "type": "subtopic",
+      "position": { "x": -275.9671760495324, "y": 1113.9498696738276 },
+      "selected": true,
+      "data": {
+        "label": "New/Delete Operators",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 224,
+      "height": 49,
+      "style": { "width": 224, "height": 49 },
+      "positionAbsolute": { "x": -275.9671760495324, "y": 1113.9498696738276 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "6w0WExQ4lGIGgok6Thq0s",
+      "type": "subtopic",
+      "position": { "x": -275.9671760495324, "y": 1166.9498696738276 },
+      "selected": true,
+      "data": {
+        "label": "Memory Leakage",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 224,
+      "height": 49,
+      "style": { "width": 224, "height": 49 },
+      "positionAbsolute": { "x": -275.9671760495324, "y": 1166.9498696738276 },
+      "dragging": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "Zw2AOTK5uc9BoKEpY7W1C",
+      "type": "topic",
+      "position": { "x": 66.99375240505299, "y": 1116.4555450086277 },
+      "selected": true,
+      "data": {
+        "label": "Structuring Codebase",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 223,
+      "height": 49,
+      "style": { "width": 223, "height": 49 },
+      "positionAbsolute": { "x": 66.99375240505299, "y": 1116.4555450086277 },
+      "dragging": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "dKCYmxDNZubCVcR5rf8b-",
+      "type": "subtopic",
+      "position": { "x": 66.99375240505299, "y": 1025.0759762139076 },
+      "selected": true,
+      "data": {
+        "label": "Scope",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center",
+          "colorType": "h"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 223,
+      "height": 49,
+      "style": { "width": 223, "height": 49 },
+      "positionAbsolute": { "x": 66.99375240505299, "y": 1025.0759762139076 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "iIdC7V8sojwyEqK1xMuHn",
+      "type": "subtopic",
+      "position": { "x": 66.99375240505299, "y": 980.0759762139076 },
+      "selected": true,
+      "data": {
+        "label": "Namespaces",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 223,
+      "height": 49,
+      "style": { "width": 223, "height": 49 },
+      "positionAbsolute": { "x": 66.99375240505299, "y": 980.0759762139076 },
+      "dragging": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "CK7yf8Bo7kfbV6x2tZTrh",
+      "type": "subtopic",
+      "position": { "x": 66.99375240505299, "y": 921.9725710130274 },
+      "selected": true,
+      "data": {
+        "label": "Headers / CPP Files",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center",
+          "colorType": "h"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 223,
+      "height": 49,
+      "style": { "width": 223, "height": 49 },
+      "positionAbsolute": { "x": 66.99375240505299, "y": 921.9725710130274 },
+      "dragging": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "CMlWNQwpywNhO9B6Yj6Me",
+      "type": "topic",
+      "position": { "x": 418.86058049826306, "y": 1116.4555450086277 },
+      "selected": true,
+      "data": {
+        "label": "Structures and Classes",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 236,
+      "height": 49,
+      "style": { "width": 236, "height": 49 },
+      "positionAbsolute": { "x": 418.86058049826306, "y": 1116.4555450086277 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "7sdEzZCIoarzznwO4XcCv",
+      "type": "subtopic",
+      "position": { "x": 486.0885117402935, "y": 1335.826261482708 },
+      "selected": true,
+      "data": {
+        "label": "Rule of Zero, Five, Three",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "WjHpueZDK-d3oDNMVZi9w",
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 284,
+      "height": 49,
+      "style": { "width": 284, "height": 49 },
+      "positionAbsolute": { "x": 486.0885117402935, "y": 1335.826261482708 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "WjHpueZDK-d3oDNMVZi9w",
+      "type": "subtopic",
+      "position": { "x": 539.0885117402935, "y": 1213.538589268166 },
+      "selected": true,
+      "data": {
+        "label": "Multiple Inheritance",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center",
+          "colorType": "h"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 231,
+      "height": 49,
+      "style": { "width": 231, "height": 49 },
+      "positionAbsolute": { "x": 539.0885117402935, "y": 1213.538589268166 },
+      "dragging": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "b3-QYKNcW3LYCNOza3Olf",
+      "type": "subtopic",
+      "position": { "x": 468.86058049826306, "y": 1022.9612203434276 },
+      "selected": true,
+      "data": {
+        "label": "Object Oriented Programming",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 306,
+      "height": 49,
+      "style": { "width": 306, "height": 49 },
+      "positionAbsolute": { "x": 468.86058049826306, "y": 1022.9612203434276 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "hNBErGNiegLsUJn_vgcOR",
+      "type": "subtopic",
+      "position": { "x": 468.86058049826306, "y": 921.9725710130272 },
+      "selected": true,
+      "data": {
+        "label": "Virtual Methods",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 166,
+      "height": 49,
+      "style": { "width": 166, "height": 49 },
+      "positionAbsolute": { "x": 468.86058049826306, "y": 921.9725710130272 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "s99ImazcwCgAESxZd8ksa",
+      "type": "subtopic",
+      "position": { "x": 626.8605804982631, "y": 921.9725710130272 },
+      "selected": true,
+      "data": {
+        "label": "Virtual Tables",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 148,
+      "height": 49,
+      "style": {},
+      "positionAbsolute": { "x": 626.8605804982631, "y": 921.9725710130272 },
+      "dragging": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "7h1VivjCPDwriL7FirtFv",
+      "type": "subtopic",
+      "position": { "x": 468.86058049826306, "y": 968.6623554103876 },
+      "selected": true,
+      "data": {
+        "label": "Dynamic Polymorphism",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center",
+          "colorType": "h"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 306,
+      "height": 49,
+      "style": { "width": 306, "height": 49 },
+      "dragging": false,
+      "positionAbsolute": { "x": 468.86058049826306, "y": 968.6623554103876 },
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "B2SGBENzUMl0SAjG4j91V",
+      "type": "topic",
+      "position": { "x": 178.53282395046762, "y": 1286.826261482708 },
+      "selected": true,
+      "data": {
+        "label": "Exception Handling",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "-6fwJQOfsorgHkoQGp4T3",
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 198,
+      "height": 49,
+      "style": { "width": 198, "height": 49 },
+      "positionAbsolute": { "x": 178.53282395046762, "y": 1286.826261482708 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "oWygnpwHq2poXQMTTSCpl",
+      "type": "subtopic",
+      "position": { "x": 178.53282395046762, "y": 1384.826261482708 },
+      "selected": true,
+      "data": {
+        "label": "Exit Codes",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "NJud5SXBAUZ6Sr78kZ7jx",
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 198,
+      "height": 49,
+      "style": { "width": 198, "height": 49 },
+      "positionAbsolute": { "x": 178.53282395046762, "y": 1384.826261482708 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "NJud5SXBAUZ6Sr78kZ7jx",
+      "type": "subtopic",
+      "position": { "x": 180.4684674563091, "y": 1438.7934586483889 },
+      "selected": true,
+      "data": {
+        "label": "Exceptions",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 198,
+      "height": 49,
+      "style": { "width": 198, "height": 49 },
+      "positionAbsolute": { "x": 180.4684674563091, "y": 1438.7934586483889 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "y4-P4UNC--rE1vni8HdTn",
+      "type": "subtopic",
+      "position": { "x": 180.4684674563091, "y": 1492.7934586483889 },
+      "selected": true,
+      "data": {
+        "label": "Access Violations",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 198,
+      "height": 49,
+      "style": { "width": 198, "height": 49 },
+      "positionAbsolute": { "x": 180.4684674563091, "y": 1492.7934586483889 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "-6fwJQOfsorgHkoQGp4T3",
+      "type": "topic",
+      "position": { "x": -286.929978402122, "y": 1286.826261482708 },
+      "selected": true,
+      "data": {
+        "label": "Language Concepts",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 321,
+      "height": 49,
+      "style": { "width": 321, "height": 49 },
+      "positionAbsolute": { "x": -286.929978402122, "y": 1286.826261482708 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "CG01PTVgHtjfKvsJkJLGl",
+      "type": "subtopic",
+      "position": { "x": -286.929978402122, "y": 1389.7934586483889 },
+      "selected": true,
+      "data": {
+        "label": "auto (Automatic Type Deduction)",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 321,
+      "height": 49,
+      "style": { "width": 321, "height": 49 },
+      "positionAbsolute": { "x": -286.929978402122, "y": 1389.7934586483889 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "PiMhw1oP9-NZEa6I9u4lX",
+      "type": "subtopic",
+      "position": { "x": -286.929978402122, "y": 1444.7147615325937 },
+      "selected": true,
+      "data": {
+        "label": "Type Casting",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center",
+          "colorType": "h"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 321,
+      "height": 49,
+      "style": { "width": 321, "height": 49 },
+      "positionAbsolute": { "x": -286.929978402122, "y": 1444.7147615325937 },
+      "dragging": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "_XB2Imyf23-6AOeoNLhYQ",
+      "type": "subtopic",
+      "position": { "x": -278.29496924274974, "y": 1500.2090861977936 },
+      "selected": true,
+      "data": {
+        "label": "static_cast",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 140,
+      "height": 49,
+      "style": { "width": 140, "height": 49 },
+      "positionAbsolute": { "x": -278.29496924274974, "y": 1500.2090861977936 },
+      "dragging": false,
+      "resizing": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "5g22glc97siQOcTkHbwan",
+      "type": "subtopic",
+      "position": { "x": -130.52203293340202, "y": 1500.2090861977936 },
+      "selected": true,
+      "data": {
+        "label": "const_cast",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 155,
+      "height": 49,
+      "style": { "width": 155, "height": 49 },
+      "positionAbsolute": { "x": -130.52203293340202, "y": 1500.2090861977936 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "4BdFcuQ5KNW94cu2jz-vE",
+      "type": "subtopic",
+      "position": { "x": -278.29496924274974, "y": 1553.301140729074 },
+      "selected": true,
+      "data": {
+        "label": "dynamic_cast",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 140,
+      "height": 49,
+      "style": { "width": 140, "height": 49 },
+      "positionAbsolute": { "x": -278.29496924274974, "y": 1553.301140729074 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "ZMyFDJrpCauGrY5NZkOwg",
+      "type": "subtopic",
+      "position": { "x": -130.52203293340202, "y": 1553.301140729074 },
+      "selected": true,
+      "data": {
+        "label": "reinterpret_cast",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 155,
+      "height": 49,
+      "style": { "width": 155, "height": 49 },
+      "positionAbsolute": { "x": -130.52203293340202, "y": 1553.301140729074 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "IDOlquv6jlfecwQoBwkGZ",
+      "type": "subtopic",
+      "position": { "x": -286.929978402122, "y": 1618.893819847594 },
+      "selected": true,
+      "data": {
+        "label": "Undefined Behavior (UB)",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 321,
+      "height": 49,
+      "style": { "width": 321, "height": 49 },
+      "positionAbsolute": { "x": -286.929978402122, "y": 1618.893819847594 },
+      "dragging": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "YSWN7nS8vA9nMldSUrZRT",
+      "type": "subtopic",
+      "position": { "x": -286.929978402122, "y": 1672.893819847594 },
+      "selected": true,
+      "data": {
+        "label": "Argument Dependent Lookup (ADL)",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 321,
+      "height": 49,
+      "style": { "width": 321, "height": 49 },
+      "positionAbsolute": { "x": -286.929978402122, "y": 1672.893819847594 },
+      "dragging": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "Lt7ss59KZw9Jwqj234jm2",
+      "type": "subtopic",
+      "position": { "x": -286.929978402122, "y": 1726.893819847594 },
+      "selected": true,
+      "data": {
+        "label": "Name Mangling",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 185,
+      "height": 49,
+      "style": { "width": 185, "height": 49 },
+      "positionAbsolute": { "x": -286.929978402122, "y": 1726.893819847594 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "zKdlfZTRHwjtmRUGW9z9-",
+      "type": "subtopic",
+      "position": { "x": -97.929978402122, "y": 1726.893819847594 },
+      "selected": true,
+      "data": {
+        "label": "Macros",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "zgW3oGPdbclWTlKJdidiB",
+          "label": "Advanced Topics / Pick Later",
+          "color": "#000000",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 132,
+      "height": 49,
+      "style": { "width": 132, "height": 49 },
+      "positionAbsolute": { "x": -97.929978402122, "y": 1726.893819847594 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "V2SeVMoQJXI2btIHr8e-u",
+      "type": "vertical",
+      "position": { "x": 122.76444711909286, "y": 1310.789165472234 },
+      "selected": true,
+      "data": {
+        "label": "vertical node",
+        "style": { "stroke": "#2B78E4", "strokeWidth": 3.75 }
+      },
+      "zIndex": 999,
+      "width": 20,
+      "height": 365,
+      "style": { "width": 20, "height": 365 },
+      "positionAbsolute": { "x": 122.76444711909286, "y": 1310.789165472234 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true,
+      "resizing": false
+    },
+    {
+      "id": "DHdNBP7_ixjr6h-dIQ7g6",
+      "type": "topic",
+      "position": { "x": 93.99375240505299, "y": 1658.893819847594 },
+      "selected": true,
+      "data": {
+        "label": "Standard Library + STL",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 296,
+      "height": 49,
+      "style": { "width": 296, "height": 49 },
+      "positionAbsolute": { "x": 93.99375240505299, "y": 1658.893819847594 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "Ebu8gzbyyXEeJryeE0SpG",
+      "type": "subtopic",
+      "position": { "x": 93.99375240505299, "y": 1745.4441943390277 },
+      "selected": true,
+      "data": {
+        "label": "Iterators",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 152,
+      "height": 49,
+      "style": { "width": 152, "height": 49 },
+      "positionAbsolute": { "x": 93.99375240505299, "y": 1745.4441943390277 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "VeVxZ230xkesQsIDig8zQ",
+      "type": "subtopic",
+      "position": { "x": 250.993752405053, "y": 1746.4441943390277 },
+      "selected": true,
+      "data": {
+        "label": "iostream",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 139,
+      "height": 49,
+      "style": { "width": 139, "height": 49 },
+      "positionAbsolute": { "x": 250.993752405053, "y": 1746.4441943390277 },
+      "dragging": false,
+      "resizing": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "whyj6Z4RXFsVQYRfYYn7B",
+      "type": "subtopic",
+      "position": { "x": 93.99375240505299, "y": 1798.4441943390277 },
+      "selected": true,
+      "data": {
+        "label": "Algorithms",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 152,
+      "height": 49,
+      "style": { "width": 152, "height": 49 },
+      "positionAbsolute": { "x": 93.99375240505299, "y": 1798.4441943390277 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "yGvE6eHKlPMBB6rde0llR",
+      "type": "subtopic",
+      "position": { "x": 250.993752405053, "y": 1799.4441943390277 },
+      "selected": true,
+      "data": {
+        "label": "Date / Time",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 139,
+      "height": 49,
+      "style": { "width": 139, "height": 49 },
+      "positionAbsolute": { "x": 250.993752405053, "y": 1799.4441943390277 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "OXQUPqxzs1-giAACwl3X1",
+      "type": "subtopic",
+      "position": { "x": 93.99375240505299, "y": 1851.4441943390277 },
+      "selected": true,
+      "data": {
+        "label": "Multithreading",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 152,
+      "height": 49,
+      "style": { "width": 152, "height": 49 },
+      "positionAbsolute": { "x": 93.99375240505299, "y": 1851.4441943390277 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "1pydf-SR0QUfVNuBEyvzc",
+      "type": "subtopic",
+      "position": { "x": 250.993752405053, "y": 1852.4441943390277 },
+      "selected": true,
+      "data": {
+        "label": "Containers",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 139,
+      "height": 49,
+      "style": { "width": 139, "height": 49 },
+      "positionAbsolute": { "x": 250.993752405053, "y": 1852.4441943390277 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "-6AOrbuOE7DJCmxlcgCay",
+      "type": "topic",
+      "position": { "x": 526.0040411704451, "y": 1751.4441943390277 },
+      "selected": true,
+      "data": {
+        "label": "Templates",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 160,
+      "height": 49,
+      "style": { "width": 160, "height": 49 },
+      "positionAbsolute": { "x": 526.0040411704451, "y": 1751.4441943390277 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "w4EIf58KP-Pq-yc0HlGxc",
+      "type": "subtopic",
+      "position": { "x": 466.39833855329164, "y": 1639.7730008603658 },
+      "selected": true,
+      "data": {
+        "label": "Variadic Templates",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 302,
+      "height": 49,
+      "style": { "width": 302, "height": 49 },
+      "positionAbsolute": { "x": 466.39833855329164, "y": 1639.7730008603658 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "sObOuccY0PDeGG-9GrFDF",
+      "type": "subtopic",
+      "position": { "x": 466.39833855329164, "y": 1470.7730008603658 },
+      "selected": true,
+      "data": {
+        "label": "Template Specialization",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center",
+          "colorType": "h"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 302,
+      "height": 49,
+      "style": { "width": 302, "height": 49 },
+      "positionAbsolute": { "x": 466.39833855329164, "y": 1470.7730008603658 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "WptReUOwVth3C9-AVmMHF",
+      "type": "subtopic",
+      "position": { "x": 466.39833855329164, "y": 1417.117522069225 },
+      "selected": true,
+      "data": {
+        "label": "Type Traits",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "zgW3oGPdbclWTlKJdidiB",
+          "label": "Advanced Topics / Pick Later",
+          "color": "#000000",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 171,
+      "height": 49,
+      "style": { "width": 171, "height": 49 },
+      "positionAbsolute": { "x": 466.39833855329164, "y": 1417.117522069225 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "3C5UfejDX-1Z8ZF6C53xD",
+      "type": "subtopic",
+      "position": { "x": 642.3983385532916, "y": 1417.117522069225 },
+      "selected": true,
+      "data": {
+        "label": "SFINAE",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "zgW3oGPdbclWTlKJdidiB",
+          "label": "Advanced Topics / Pick Later",
+          "color": "#000000",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 128,
+      "height": 49,
+      "style": { "width": 128, "height": 49 },
+      "positionAbsolute": { "x": 642.3983385532916, "y": 1417.117522069225 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "6hTcmJwNnQstbWWzNCfTe",
+      "type": "subtopic",
+      "position": { "x": 478.39833855329164, "y": 1529.9677661061605 },
+      "selected": true,
+      "data": {
+        "label": "Full Template Specialization",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "1NYJtbdcdOB4-vIrnq4yX",
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 278,
+      "height": 49,
+      "style": { "width": 278, "height": 49 },
+      "positionAbsolute": { "x": 478.39833855329164, "y": 1529.9677661061605 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "1NYJtbdcdOB4-vIrnq4yX",
+      "type": "subtopic",
+      "position": { "x": 477.39833855329164, "y": 1582.9677661061605 },
+      "selected": true,
+      "data": {
+        "label": "Partial Template Specialization",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 280,
+      "height": 49,
+      "style": { "width": 280, "height": 49 },
+      "positionAbsolute": { "x": 477.39833855329164, "y": 1582.9677661061605 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "fb3bnfKXjSIjPAk4b95lg",
+      "type": "topic",
+      "position": { "x": 526.0040411704451, "y": 2041.110352538959 },
+      "selected": true,
+      "data": {
+        "label": "Idioms",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "qmHs6_BzND_xpMmls5YUH",
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 160,
+      "height": 49,
+      "style": { "width": 160, "height": 49 },
+      "positionAbsolute": { "x": 526.0040411704451, "y": 2041.110352538959 },
+      "dragging": false,
+      "focusable": true,
+      "resizing": false,
+      "selectable": true
+    },
+    {
+      "id": "xjUaIp8gGxkN-cp8emJ2M",
+      "type": "subtopic",
+      "position": { "x": 446.00404117044513, "y": 2138.738988313017 },
+      "selected": true,
+      "data": {
+        "label": "Non-Copyable / Non-Moveable",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 320,
+      "height": 49,
+      "style": { "width": 320, "height": 49 },
+      "positionAbsolute": { "x": 446.00404117044513, "y": 2138.738988313017 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "YvmjrZSAOmjhVPo05MJqN",
+      "type": "subtopic",
+      "position": { "x": 446.00404117044513, "y": 2191.738988313017 },
+      "selected": true,
+      "data": {
+        "label": "Erase-Remove",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 320,
+      "height": 49,
+      "style": { "width": 320, "height": 49 },
+      "resizing": false,
+      "positionAbsolute": { "x": 446.00404117044513, "y": 2191.738988313017 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "lxAzI42jQdaofzQ5MXebG",
+      "type": "subtopic",
+      "position": { "x": 446.00404117044513, "y": 2244.738988313017 },
+      "selected": true,
+      "data": {
+        "label": "Copy and Swap",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 162,
+      "height": 49,
+      "style": { "width": 162, "height": 49 },
+      "resizing": false,
+      "positionAbsolute": { "x": 446.00404117044513, "y": 2244.738988313017 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "O2Du5gHHxFxAI2u5uO8wu",
+      "type": "subtopic",
+      "position": { "x": 612.0040411704451, "y": 2244.738988313017 },
+      "selected": true,
+      "data": {
+        "label": "Copy on Write",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 153,
+      "height": 49,
+      "style": { "width": 153, "height": 49 },
+      "resizing": false,
+      "positionAbsolute": { "x": 612.0040411704451, "y": 2244.738988313017 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "OmHDlLxCnH8RDdu5vx9fl",
+      "type": "subtopic",
+      "position": { "x": 446.833180361922, "y": 2298.6609277564776 },
+      "selected": true,
+      "data": {
+        "label": "RAII",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 100,
+      "height": 49,
+      "style": { "width": 100, "height": 49 },
+      "positionAbsolute": { "x": 446.833180361922, "y": 2298.6609277564776 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "MEoWt8NKjPLVTeGgYf3cR",
+      "type": "subtopic",
+      "position": { "x": 550.333180361922, "y": 2298.6609277564776 },
+      "selected": true,
+      "data": {
+        "label": "Pimpl",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 109,
+      "height": 49,
+      "style": { "width": 109, "height": 49 },
+      "positionAbsolute": { "x": 550.333180361922, "y": 2298.6609277564776 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "ttt-yeIi4BPWrgvW324W7",
+      "type": "subtopic",
+      "position": { "x": 665.0040411704451, "y": 2298.6609277564776 },
+      "selected": true,
+      "data": {
+        "label": "CRTP",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 100,
+      "height": 49,
+      "style": { "width": 100, "height": 49 },
+      "positionAbsolute": { "x": 665.0040411704451, "y": 2298.6609277564776 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "vvE1aUsWbF1OFcmMUHbJa",
+      "type": "topic",
+      "position": { "x": 227.76444711909286, "y": 2041.110352538959 },
+      "selected": true,
+      "data": {
+        "label": "Standardds",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "qmHs6_BzND_xpMmls5YUH",
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 155,
+      "height": 49,
+      "style": { "width": 155, "height": 49 },
+      "positionAbsolute": { "x": 227.76444711909286, "y": 2041.110352538959 },
+      "dragging": false,
+      "focusable": true,
+      "resizing": false,
+      "selectable": true
+    },
+    {
+      "id": "T6rCTv9Dxkm-tEA-l9XEv",
+      "type": "subtopic",
+      "position": { "x": 227.76444711909286, "y": 1939.0246296702257 },
+      "selected": true,
+      "data": {
+        "label": "C++ 11 / 14",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 155,
+      "height": 49,
+      "style": { "width": 155, "height": 49 },
+      "positionAbsolute": { "x": 227.76444711909286, "y": 1939.0246296702257 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "R2-qWGUxsTOeSHRuUzhd2",
+      "type": "subtopic",
+      "position": { "x": 227.76444711909286, "y": 2136.9142315942822 },
+      "selected": true,
+      "data": {
+        "label": "C++ 17",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 155,
+      "height": 49,
+      "style": { "width": 155, "height": 49 },
+      "positionAbsolute": { "x": 227.76444711909286, "y": 2136.9142315942822 },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false
+    },
+    {
+      "id": "o3no4a5_iMFzEAGs56-BJ",
+      "type": "subtopic",
+      "position": { "x": 227.76444711909286, "y": 2189.9142315942822 },
+      "selected": true,
+      "data": {
+        "label": "C++ 20",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 155,
+      "height": 49,
+      "style": { "width": 155, "height": 49 },
+      "positionAbsolute": { "x": 227.76444711909286, "y": 2189.9142315942822 },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false
+    },
+    {
+      "id": "sxbbKtg7kMNbkx7fXhjR9",
+      "type": "subtopic",
+      "position": { "x": 227.76444711909286, "y": 2242.9142315942822 },
+      "selected": true,
+      "data": {
+        "label": "Newest",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "zgW3oGPdbclWTlKJdidiB",
+          "label": "Advanced Topics / Pick Later",
+          "color": "#000000",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 155,
+      "height": 49,
+      "style": { "width": 155, "height": 49 },
+      "positionAbsolute": { "x": 227.76444711909286, "y": 2242.9142315942822 },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false
+    },
+    {
+      "id": "PPg0V5EzGBeJsysg1215V",
+      "type": "subtopic",
+      "position": { "x": 227.76444711909286, "y": 2295.9142315942822 },
+      "selected": true,
+      "data": {
+        "label": "C++ 0x",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 155,
+      "height": 49,
+      "style": { "width": 155, "height": 49 },
+      "positionAbsolute": { "x": 227.76444711909286, "y": 2295.9142315942822 },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false
+    },
+    {
+      "id": "qmHs6_BzND_xpMmls5YUH",
+      "type": "topic",
+      "position": { "x": -286.929978402122, "y": 2041.110352538959 },
+      "selected": true,
+      "data": {
+        "label": "Debuggers",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 153,
+      "height": 49,
+      "style": { "width": 153, "height": 49 },
+      "positionAbsolute": { "x": -286.929978402122, "y": 2041.110352538959 },
+      "dragging": false,
+      "focusable": true,
+      "resizing": false,
+      "selectable": true
+    },
+    {
+      "id": "Kb2Pbz0Sq7YlO1vCwYxnX",
+      "type": "paragraph",
+      "position": { "x": -39.10970787732015, "y": 2041.110352538959 },
+      "selected": true,
+      "data": {
+        "label": "Language Tools",
+        "style": {
+          "fontSize": 17,
+          "borderColor": "#000000",
+          "backgroundColor": "#ffffff",
+          "color": "#000000",
+          "textAlign": "center",
+          "justifyContent": "center",
+          "padding": 16
+        }
+      },
+      "zIndex": 999,
+      "width": 168,
+      "height": 49,
+      "style": { "width": 168, "height": 49 },
+      "resizing": false,
+      "dragging": false,
+      "positionAbsolute": { "x": -39.10970787732015, "y": 2041.110352538959 },
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "VtPb8-AJKzhTB0QbMtoU4",
+      "type": "subtopic",
+      "position": { "x": -288.0831925975956, "y": 1934.0246296702257 },
+      "selected": true,
+      "data": {
+        "label": "Understanding Debugger Messages",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 328,
+      "height": 49,
+      "style": { "width": 328, "height": 49 },
+      "positionAbsolute": { "x": -288.0831925975956, "y": 1934.0246296702257 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "sR_FxGZHoMCV9Iv7z2_SX",
+      "type": "subtopic",
+      "position": { "x": -288.0831925975956, "y": 1880.9389202464117 },
+      "selected": true,
+      "data": {
+        "label": "Debugging Symbols",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 328,
+      "height": 49,
+      "style": { "width": 328, "height": 49 },
+      "positionAbsolute": { "x": -288.0831925975956, "y": 1880.9389202464117 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "y8VCbGDUco9bzGRfIBD8R",
+      "type": "subtopic",
+      "position": { "x": -288.0831925975956, "y": 1826.1637109984486 },
+      "selected": true,
+      "data": {
+        "label": "WinDBg",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 176,
+      "height": 49,
+      "style": { "width": 176, "height": 49 },
+      "positionAbsolute": { "x": -288.0831925975956, "y": 1826.1637109984486 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "BmWsoL9c_Aag5nVlMsKm2",
+      "type": "subtopic",
+      "position": { "x": -106.91368596678642, "y": 1825.2532448559004 },
+      "selected": true,
+      "data": {
+        "label": "GDB",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 146,
+      "height": 49,
+      "style": { "width": 146, "height": 49 },
+      "positionAbsolute": { "x": -106.91368596678642, "y": 1825.2532448559004 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "FTMHsUiE8isD_OVZr62Xc",
+      "type": "topic",
+      "position": { "x": -286.929978402122, "y": 2165.7752999047043 },
+      "selected": true,
+      "data": {
+        "label": "Compilers",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "h29eJG1hWHa7vMhSqtfV2",
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 153,
+      "height": 49,
+      "style": { "width": 153, "height": 49 },
+      "positionAbsolute": { "x": -286.929978402122, "y": 2165.7752999047043 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "DVckzBUMgk_lWThVkLyAT",
+      "type": "subtopic",
+      "position": { "x": -38.85702534893973, "y": 2138.927677033192 },
+      "selected": true,
+      "data": {
+        "label": "Compiler Stages",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 235,
+      "height": 49,
+      "style": { "width": 235, "height": 49 },
+      "positionAbsolute": { "x": -38.85702534893973, "y": 2138.927677033192 },
+      "dragging": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "hSG6Aux39X0cXi6ADy2al",
+      "type": "subtopic",
+      "position": { "x": -38.85702534893973, "y": 2191.927677033192 },
+      "selected": true,
+      "data": {
+        "label": "Compilers and Features",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 235,
+      "height": 49,
+      "style": { "width": 235, "height": 49 },
+      "positionAbsolute": { "x": -38.85702534893973, "y": 2191.927677033192 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "hurj4ktZD6sDbMg7lz3Dn",
+      "type": "label",
+      "position": { "x": -15.825412667929704, "y": 2248.415195613617 },
+      "selected": true,
+      "data": {
+        "label": "C/lang++ / LLVM",
+        "href": "",
+        "color": "#000000",
+        "style": { "fontSize": 17 }
+      },
+      "zIndex": 999,
+      "width": 151,
+      "height": 36,
+      "style": {},
+      "positionAbsolute": { "x": -15.825412667929704, "y": 2248.415195613617 },
+      "dragging": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "hVi9vzLaVfcXhhd7m8-ei",
+      "type": "label",
+      "position": { "x": -15.825412667929704, "y": 2285.415195613617 },
+      "selected": true,
+      "data": {
+        "label": "Intel C++",
+        "href": "",
+        "color": "#000000",
+        "style": { "fontSize": 17 }
+      },
+      "zIndex": 999,
+      "width": 89,
+      "height": 36,
+      "style": {},
+      "dragging": false,
+      "positionAbsolute": { "x": -15.825412667929704, "y": 2285.415195613617 },
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "7byy5GiTl4SPpVN39UFbC",
+      "type": "label",
+      "position": { "x": -15.825412667929704, "y": 2322.415195613617 },
+      "selected": true,
+      "data": {
+        "label": "MSVS C++",
+        "href": "",
+        "color": "#000000",
+        "style": { "fontSize": 17 }
+      },
+      "zIndex": 999,
+      "width": 101,
+      "height": 36,
+      "style": {},
+      "dragging": false,
+      "positionAbsolute": { "x": -15.825412667929704, "y": 2322.415195613617 },
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "2oTFuzQ6j0AmdAc9U_UwQ",
+      "type": "label",
+      "position": { "x": -15.825412667929704, "y": 2359.415195613617 },
+      "selected": true,
+      "data": {
+        "label": "GCC",
+        "href": "",
+        "color": "#000000",
+        "style": { "fontSize": 17 }
+      },
+      "zIndex": 999,
+      "width": 53,
+      "height": 36,
+      "style": {},
+      "dragging": false,
+      "positionAbsolute": { "x": -15.825412667929704, "y": 2359.415195613617 },
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "9DDS861RQhuFgpaR2_KeO",
+      "type": "label",
+      "position": { "x": -15.825412667929704, "y": 2396.415195613617 },
+      "selected": true,
+      "data": {
+        "label": "MinGW",
+        "href": "",
+        "color": "#000000",
+        "style": { "fontSize": 17 }
+      },
+      "zIndex": 999,
+      "width": 72,
+      "height": 36,
+      "style": {},
+      "dragging": false,
+      "positionAbsolute": { "x": -15.825412667929704, "y": 2396.415195613617 },
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "jVXFCo6puMxJ_ifn_uwim",
+      "type": "topic",
+      "position": { "x": -286.929978402122, "y": 2515.5128020469147 },
+      "selected": true,
+      "data": {
+        "label": "Build Systems",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "h29eJG1hWHa7vMhSqtfV2",
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 153,
+      "height": 49,
+      "style": { "width": 153, "height": 49 },
+      "positionAbsolute": { "x": -286.929978402122, "y": 2515.5128020469147 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "ysnXvSHGBMMozBJyXpHl5",
+      "type": "subtopic",
+      "position": { "x": -286.929978402122, "y": 2614.6661606275225 },
+      "selected": true,
+      "data": {
+        "label": "CMAKE",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 153,
+      "height": 49,
+      "style": { "width": 153, "height": 49 },
+      "positionAbsolute": { "x": -286.929978402122, "y": 2614.6661606275225 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "t6rZLH7l8JQm99ax_fEJ9",
+      "type": "subtopic",
+      "position": { "x": -286.929978402122, "y": 2667.6661606275225 },
+      "selected": true,
+      "data": {
+        "label": "Makefile",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 153,
+      "height": 49,
+      "style": { "width": 153, "height": 49 },
+      "positionAbsolute": { "x": -286.929978402122, "y": 2667.6661606275225 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "HkUCD5A_M9bJxJRElkK0x",
+      "type": "subtopic",
+      "position": { "x": -286.929978402122, "y": 2720.6661606275225 },
+      "selected": true,
+      "data": {
+        "label": "Ninja",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 153,
+      "height": 49,
+      "style": { "width": 153, "height": 49 },
+      "positionAbsolute": { "x": -286.929978402122, "y": 2720.6661606275225 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "h29eJG1hWHa7vMhSqtfV2",
+      "type": "topic",
+      "position": { "x": -30.235552880907136, "y": 2515.5128020469147 },
+      "selected": true,
+      "data": {
+        "label": "Package Managers",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 210,
+      "height": 49,
+      "style": { "width": 210, "height": 49 },
+      "positionAbsolute": { "x": -30.235552880907136, "y": 2515.5128020469147 },
+      "dragging": false,
+      "resizing": false,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "id": "PKG5pACLfRS2ogfzBX47_",
+      "type": "subtopic",
+      "position": { "x": -25.855916380130566, "y": 2608.8378646515134 },
+      "selected": true,
+      "data": {
+        "label": "vcpkg",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "g0s0F4mLV16eNvMBflN2e",
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 96,
+      "height": 49,
+      "style": { "width": 96, "height": 49 },
+      "positionAbsolute": { "x": -25.855916380130566, "y": 2608.8378646515134 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "g0s0F4mLV16eNvMBflN2e",
+      "type": "subtopic",
+      "position": { "x": 76.76444711909286, "y": 2660.9355066535127 },
+      "selected": true,
+      "data": {
+        "label": "NuGet",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 103,
+      "height": 49,
+      "style": { "width": 103, "height": 49 },
+      "positionAbsolute": { "x": 76.76444711909286, "y": 2660.9355066535127 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "ky_UqizToTZHC_b77qFi2",
+      "type": "subtopic",
+      "position": { "x": -25.855916380130566, "y": 2661.8378646515134 },
+      "selected": true,
+      "data": {
+        "label": "Conan",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "PKG5pACLfRS2ogfzBX47_",
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 96,
+      "height": 49,
+      "style": { "width": 96, "height": 49 },
+      "positionAbsolute": { "x": -25.855916380130566, "y": 2661.8378646515134 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "3ehBc2sKVlPj7dn4RVZCH",
+      "type": "subtopic",
+      "position": { "x": 76.76444711909286, "y": 2607.9355066535127 },
+      "selected": true,
+      "data": {
+        "label": "Spack",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "g0s0F4mLV16eNvMBflN2e",
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 103,
+      "height": 49,
+      "style": { "width": 103, "height": 49 },
+      "positionAbsolute": { "x": 76.76444711909286, "y": 2607.9355066535127 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "4kkX5g_-plX9zVqr0ZoiR",
+      "type": "topic",
+      "position": { "x": 245.31805846187558, "y": 2515.5128020469147 },
+      "selected": true,
+      "data": {
+        "label": "Working with Libraries",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 221,
+      "height": 49,
+      "style": { "width": 221, "height": 49 },
+      "positionAbsolute": { "x": 245.31805846187558, "y": 2515.5128020469147 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "5mNqH_AEiLxUmgurNW1Fq",
+      "type": "subtopic",
+      "position": { "x": 245.31805846187558, "y": 2432.907835806348 },
+      "selected": true,
+      "data": {
+        "label": "Library Inclusion",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 221,
+      "height": 49,
+      "style": { "width": 221, "height": 49 },
+      "positionAbsolute": { "x": 245.31805846187558, "y": 2432.907835806348 },
+      "dragging": false,
+      "resizing": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "sLVs95EOeHZldoKY0L_dH",
+      "type": "subtopic",
+      "position": { "x": 245.31805846187558, "y": 2379.907835806348 },
+      "selected": true,
+      "data": {
+        "label": "Licensing",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "FURC-X3vopFKhZ0F5BdYH",
+          "color": "#6d7500",
+          "label": "Beginner Topics / Start here",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 221,
+      "height": 49,
+      "style": { "width": 221, "height": 49 },
+      "resizing": false,
+      "positionAbsolute": { "x": 245.31805846187558, "y": 2379.907835806348 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "1d7h5P1Q0RVHryKPVogQy",
+      "type": "subtopic",
+      "position": { "x": 543.5766878818748, "y": 2436.6661606275225 },
+      "selected": true,
+      "data": {
+        "label": "Boost",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 102,
+      "height": 49,
+      "style": { "width": 102, "height": 49 },
+      "dragging": false,
+      "positionAbsolute": { "x": 543.5766878818748, "y": 2436.6661606275225 },
+      "selectable": true,
+      "focusable": true,
+      "resizing": false
+    },
+    {
+      "id": "Eq3TKSFJ2F2mrTHAaU2J4",
+      "type": "subtopic",
+      "position": { "x": 649.5179751445827, "y": 2437.6661606275225 },
+      "selected": true,
+      "data": {
+        "label": "OpenCV",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 110,
+      "height": 49,
+      "style": { "width": 110, "height": 49 },
+      "positionAbsolute": { "x": 649.5179751445827, "y": 2437.6661606275225 },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false
+    },
+    {
+      "id": "nOkniNXfXwPPlOEJHJoGl",
+      "type": "subtopic",
+      "position": { "x": 543.5766878818748, "y": 2489.6661606275225 },
+      "selected": true,
+      "data": {
+        "label": "POCO",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 102,
+      "height": 49,
+      "style": { "width": 102, "height": 49 },
+      "positionAbsolute": { "x": 543.5766878818748, "y": 2489.6661606275225 },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false,
+      "resizing": false
+    },
+    {
+      "id": "jpMCIWQko7p3ndezYHL4D",
+      "type": "subtopic",
+      "position": { "x": 543.5766878818748, "y": 2542.6661606275225 },
+      "selected": true,
+      "data": {
+        "label": "protobuf",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 102,
+      "height": 49,
+      "style": { "width": 102, "height": 49 },
+      "positionAbsolute": { "x": 543.5766878818748, "y": 2542.6661606275225 },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false,
+      "resizing": false
+    },
+    {
+      "id": "621J9W4xCofumNZGo4TZT",
+      "type": "subtopic",
+      "position": { "x": 543.5766878818748, "y": 2595.6661606275225 },
+      "selected": true,
+      "data": {
+        "label": "gRPC",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 102,
+      "height": 49,
+      "style": { "width": 102, "height": 49 },
+      "positionAbsolute": { "x": 543.5766878818748, "y": 2595.6661606275225 },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false,
+      "resizing": false
+    },
+    {
+      "id": "j_eNHhs0J08Dt7HVbo4Q2",
+      "type": "subtopic",
+      "position": { "x": 649.5179751445827, "y": 2490.6661606275225 },
+      "selected": true,
+      "data": {
+        "label": "Tensorflow",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 110,
+      "height": 49,
+      "style": { "width": 110, "height": 49 },
+      "positionAbsolute": { "x": 649.5179751445827, "y": 2490.6661606275225 },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false,
+      "resizing": false
+    },
+    {
+      "id": "tEkvlJPAkD5fji-MMODL7",
+      "type": "subtopic",
+      "position": { "x": 649.5179751445827, "y": 2596.6661606275225 },
+      "selected": true,
+      "data": {
+        "label": "pybind11",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 110,
+      "height": 49,
+      "style": { "width": 110, "height": 49 },
+      "positionAbsolute": { "x": 649.5179751445827, "y": 2596.6661606275225 },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false,
+      "resizing": false
+    },
+    {
+      "id": "q64qFxoCrR38RPsN2lC8x",
+      "type": "subtopic",
+      "position": { "x": 649.5179751445827, "y": 2543.6661606275225 },
+      "selected": true,
+      "data": {
+        "label": "spdlog",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 110,
+      "height": 49,
+      "style": { "width": 110, "height": 49 },
+      "positionAbsolute": { "x": 649.5179751445827, "y": 2543.6661606275225 },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false,
+      "resizing": false
+    },
+    {
+      "id": "GGZJaYpRENaqloJzt0VtY",
+      "type": "subtopic",
+      "position": { "x": 649.5179751445827, "y": 2649.6661606275225 },
+      "selected": true,
+      "data": {
+        "label": "opencl",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 110,
+      "height": 49,
+      "style": { "width": 110, "height": 49 },
+      "positionAbsolute": { "x": 649.5179751445827, "y": 2649.6661606275225 },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false
+    },
+    {
+      "id": "1CqQgmHDeo1HlPdpUJS7H",
+      "type": "subtopic",
+      "position": { "x": 543.5766878818748, "y": 2648.6661606275225 },
+      "selected": true,
+      "data": {
+        "label": "fmt",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 102,
+      "height": 49,
+      "style": { "width": 102, "height": 49 },
+      "positionAbsolute": { "x": 543.5766878818748, "y": 2648.6661606275225 },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false
+    },
+    {
+      "id": "et-dXKPYuyVW6eV2K3CM8",
+      "type": "subtopic",
+      "position": { "x": 543.5766878818748, "y": 2703.6661606275225 },
+      "selected": true,
+      "data": {
+        "label": "ranges_v3",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 215,
+      "height": 49,
+      "style": { "width": 215, "height": 49 },
+      "positionAbsolute": { "x": 543.5766878818748, "y": 2703.6661606275225 },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false,
+      "resizing": false
+    },
+    {
+      "id": "YkaqIkt2bGBsrRwOFQpV4",
+      "type": "label",
+      "position": { "x": 609.5766878818748, "y": 2392.9355066535127 },
+      "selected": true,
+      "data": {
+        "label": "Libraries",
+        "href": "",
+        "color": "#000000",
+        "style": { "fontSize": 17 }
+      },
+      "zIndex": 999,
+      "width": 83,
+      "height": 36,
+      "style": {},
+      "positionAbsolute": { "x": 609.5766878818748, "y": 2392.9355066535127 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "MrAM-viRaF8DSxB6sVdD9",
+      "type": "subtopic",
+      "position": { "x": 273.5766878818748, "y": 2700.6661606275225 },
+      "selected": true,
+      "data": {
+        "label": "gtest / gmock",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "88pr5aN7cctZfDVVo-2ns",
+        "legend": {
+          "id": "sRAiZODQQ8xrMiVpCdnI7",
+          "label": "Intermediate Topics / Pick Next",
+          "color": "#2b78e4",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 169,
+      "height": 49,
+      "style": { "width": 169, "height": 49 },
+      "positionAbsolute": { "x": 273.5766878818748, "y": 2700.6661606275225 },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false,
+      "resizing": false
+    },
+    {
+      "id": "gAZ9Dqgj1_UkaLzVgzx1t",
+      "type": "subtopic",
+      "position": { "x": 273.5766878818748, "y": 2753.6661606275225 },
+      "selected": true,
+      "data": {
+        "label": "Qt",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 63,
+      "height": 49,
+      "style": {},
+      "positionAbsolute": { "x": 273.5766878818748, "y": 2753.6661606275225 },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false
+    },
+    {
+      "id": "s13jQuaC6gw0Lab3Cbyy6",
+      "type": "subtopic",
+      "position": { "x": 342.86058049826306, "y": 2753.6661606275225 },
+      "selected": true,
+      "data": {
+        "label": "Catch2",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "right-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 100,
+      "height": 49,
+      "style": {},
+      "positionAbsolute": { "x": 342.86058049826306, "y": 2753.6661606275225 },
+      "selectable": true,
+      "focusable": true,
+      "resizing": false,
+      "dragging": false
+    },
+    {
+      "id": "O0lVEMTAV1pq9sYCKQvh_",
+      "type": "subtopic",
+      "position": { "x": 273.5766878818748, "y": 2806.6661606275225 },
+      "selected": true,
+      "data": {
+        "label": "Orbit Profiler",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "oldId": "88pr5aN7cctZfDVVo-2ns",
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 169,
+      "height": 49,
+      "style": { "width": 169, "height": 49 },
+      "positionAbsolute": { "x": 273.5766878818748, "y": 2806.6661606275225 },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false,
+      "resizing": false
+    },
+    {
+      "id": "88pr5aN7cctZfDVVo-2ns",
+      "type": "subtopic",
+      "position": { "x": 273.5766878818748, "y": 2859.6661606275225 },
+      "selected": true,
+      "data": {
+        "label": "PyTorch C++",
+        "style": {
+          "fontSize": 17,
+          "justifyContent": "flex-start",
+          "textAlign": "center"
+        },
+        "legend": {
+          "id": "WbquXSrbKyKZuwVeLZfnw",
+          "label": "Optional / Learn if you want",
+          "color": "#999999",
+          "position": "left-center"
+        }
+      },
+      "zIndex": 999,
+      "width": 169,
+      "height": 49,
+      "style": { "width": 169, "height": 49 },
+      "positionAbsolute": { "x": 273.5766878818748, "y": 2859.6661606275225 },
+      "selectable": true,
+      "focusable": true,
+      "dragging": false,
+      "resizing": false
+    },
+    {
+      "id": "1Bm9i2IdUeDkWg4ZGEylB",
+      "type": "label",
+      "position": { "x": 300.5179751445827, "y": 2919.244194339027 },
+      "selected": true,
+      "data": {
+        "label": "Frameworks",
+        "href": "",
+        "color": "#000000",
+        "style": { "fontSize": 17 }
+      },
+      "zIndex": 999,
+      "width": 110,
+      "height": 36,
+      "style": {},
+      "positionAbsolute": { "x": 300.5179751445827, "y": 2919.244194339027 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "id": "Wm2VPi1Tn_Y7dqPowny69",
+      "type": "linksgroup",
+      "position": { "x": -285.20291471146976, "y": 20.444194339027717 },
+      "selected": true,
+      "data": {
+        "label": "References",
+        "links": [
+          {
+            "id": "29I4Uf1Z74ihhM4cpfaP7",
+            "label": "Salmer's C++ Roadmap",
+            "href": "",
+            "url": "https://salmer.github.io/CppDeveloperRoadmap/"
+          }
+        ]
+      },
+      "zIndex": 999,
+      "width": 351,
+      "height": 96,
+      "positionAbsolute": { "x": -285.20291471146976, "y": 20.444194339027717 },
+      "dragging": false,
+      "selectable": true,
+      "focusable": true,
+      "style": { "width": 351, "height": 96 }
+    }
+  ],
+  "edges": [
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "iogwMmOvub2ZF4zgg6WyF",
+      "sourceHandle": "x2",
+      "target": "_hYN0gEi9BL24nptEtXWU",
+      "targetHandle": "w1",
+      "data": { "edgeStyle": "solid" },
+      "id": "XX0I26JoVMVXIe_7bVMix",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "_hYN0gEi9BL24nptEtXWU",
+      "sourceHandle": "z2",
+      "target": "idLHBxhvcIqZTqmh_E8Az",
+      "targetHandle": "y1",
+      "data": { "edgeStyle": "dashed" },
+      "id": "dFn6kGOoJ-0BzJJEb9DSG",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "_hYN0gEi9BL24nptEtXWU",
+      "sourceHandle": "z2",
+      "target": "os3Pa6W9SSNEzgmlBbglQ",
+      "targetHandle": "y2",
+      "data": { "edgeStyle": "dashed" },
+      "id": "arkF7QJJRbCBYWp0crqa2",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "_hYN0gEi9BL24nptEtXWU",
+      "sourceHandle": "z2",
+      "target": "3oInpqvTSSC5_K6i7j8N7",
+      "targetHandle": "y1",
+      "data": { "edgeStyle": "dashed" },
+      "id": "HNVw8OboycWKLEtEbG2bn",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "_hYN0gEi9BL24nptEtXWU",
+      "sourceHandle": "z2",
+      "target": "YKhuRbcUFzo0hTvuTq-Yl",
+      "targetHandle": "y1",
+      "data": { "edgeStyle": "dashed" },
+      "id": "auB7Png72XjmhcLr3IJA7",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "jZ67HhVRelJaxjsCckSSI",
+      "sourceHandle": "x2",
+      "target": "hWA7RtuqltMTmHdcCnmES",
+      "targetHandle": "y1",
+      "data": { "edgeStyle": "solid" },
+      "id": "2aoDIr80lXSJLW1hIGUkb",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "sourceHandle": "z2",
+      "target": "NMznG9mo2wzNFnjhg990f",
+      "targetHandle": "y1",
+      "data": { "edgeStyle": "dashed" },
+      "id": "m-_y7nLeYFkUKGiacxWA0",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "sourceHandle": "z2",
+      "target": "gc_7cuIO2_joKlQRAPDfX",
+      "targetHandle": "y1",
+      "data": { "edgeStyle": "dashed" },
+      "id": "G7pXuJfkyt2nWAOHU8yV0",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "rrrvATyhXqRgJGWI3z0WF",
+      "sourceHandle": "x2",
+      "target": "AvbMQ5vY3ip1oX_6Yq4ie",
+      "targetHandle": "w2",
+      "data": { "edgeStyle": "dashed" },
+      "id": "2_6Yz3-Agx9_rEN5xW86c",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "hWA7RtuqltMTmHdcCnmES",
+      "sourceHandle": "w2",
+      "target": "1AJv95mTLpR7L8KBoGym8",
+      "targetHandle": "x1",
+      "data": { "edgeStyle": "dashed" },
+      "id": "kgMI98fg2-mKMgUs0wnjD",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "hWA7RtuqltMTmHdcCnmES",
+      "sourceHandle": "y2",
+      "target": "0etAs56EeBfh_0IlAaSra",
+      "targetHandle": "w1",
+      "data": { "edgeStyle": "solid" },
+      "selected": true,
+      "id": "ts38Q2ceHs60TJscUBZVE",
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "jZ67HhVRelJaxjsCckSSI",
+      "sourceHandle": "y2",
+      "target": "h6ceO0kiBIxNRkPzN3hBY",
+      "targetHandle": "z1",
+      "data": { "edgeStyle": "dashed" },
+      "id": "ZiMV7umyPdhy3JJDcopR-",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "jZ67HhVRelJaxjsCckSSI",
+      "sourceHandle": "y2",
+      "target": "_JlT9oKQ6Yu4UX6l19G8P",
+      "targetHandle": "z2",
+      "data": { "edgeStyle": "dashed" },
+      "id": "WI-MhbxrehFcVwyGJ5CQJ",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "_hYN0gEi9BL24nptEtXWU",
+      "sourceHandle": "x2",
+      "target": "jZ67HhVRelJaxjsCckSSI",
+      "targetHandle": "w1",
+      "data": { "edgeStyle": "solid" },
+      "id": "qUrLBzvXvJOg53HBfjrOI",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "Ji35JsKgUQXN4DJGEgTAC",
+      "sourceHandle": "x2",
+      "target": "t3Op8UcgDKVeMLNMDePrW",
+      "targetHandle": "w1",
+      "data": { "edgeStyle": "solid" },
+      "id": "reactflow__edge-Ji35JsKgUQXN4DJGEgTACx2-t3Op8UcgDKVeMLNMDePrWw1",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "Ji35JsKgUQXN4DJGEgTAC",
+      "sourceHandle": "x2",
+      "target": "c2YZ7PPCX1jF_RU7C0AqN",
+      "targetHandle": "w2",
+      "data": { "edgeStyle": "solid" },
+      "id": "reactflow__edge-Ji35JsKgUQXN4DJGEgTACx2-c2YZ7PPCX1jF_RU7C0AqNw2",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "KMA7NkxFbPoUDtFnGBFnj",
+      "sourceHandle": "x2",
+      "target": "0vLaVNJaJSHZ_bHli6Qzs",
+      "targetHandle": "w1",
+      "data": { "edgeStyle": "solid" },
+      "id": "reactflow__edge-KMA7NkxFbPoUDtFnGBFnjx2-0vLaVNJaJSHZ_bHli6Qzsw1",
+      "selected": true,
+      "type": "simplebezier",
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "DYkdM_L7T2GcTPAoZNnUR",
+      "sourceHandle": "x2",
+      "target": "0vLaVNJaJSHZ_bHli6Qzs",
+      "targetHandle": "z1",
+      "data": { "edgeStyle": "solid" },
+      "id": "reactflow__edge-DYkdM_L7T2GcTPAoZNnURx2-0vLaVNJaJSHZ_bHli6Qzsz1",
+      "selected": true,
+      "type": "smoothstep",
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "Z-zHIbLBy7cqcDu_QEJIn",
+      "sourceHandle": "y2",
+      "target": "WSrbHa0mKIQs33vEJHp15",
+      "targetHandle": "x2",
+      "data": { "edgeStyle": "dashed" },
+      "id": "reactflow__edge-Z-zHIbLBy7cqcDu_QEJIny2-WSrbHa0mKIQs33vEJHp15x2",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "NvODRFR0DLINB0RlPSsvt",
+      "sourceHandle": "z2",
+      "target": "x_28LiDVshqWns_aIBsdx",
+      "targetHandle": "y1",
+      "data": { "edgeStyle": "dashed" },
+      "id": "reactflow__edge-NvODRFR0DLINB0RlPSsvtz2-x_28LiDVshqWns_aIBsdxy1",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "NvODRFR0DLINB0RlPSsvt",
+      "sourceHandle": "z2",
+      "target": "tl6VCQ5IEGDVyFcgj7jDm",
+      "targetHandle": "y1",
+      "data": { "edgeStyle": "dashed" },
+      "id": "reactflow__edge-NvODRFR0DLINB0RlPSsvtz2-tl6VCQ5IEGDVyFcgj7jDmy1",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "NvODRFR0DLINB0RlPSsvt",
+      "sourceHandle": "z2",
+      "target": "2Ag0t3LPryTF8khHLRfy-",
+      "targetHandle": "y2",
+      "data": { "edgeStyle": "dashed" },
+      "id": "reactflow__edge-NvODRFR0DLINB0RlPSsvtz2-2Ag0t3LPryTF8khHLRfy-y2",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "NvODRFR0DLINB0RlPSsvt",
+      "sourceHandle": "y2",
+      "target": "Zc_TTzmM36yWsu3GvOy9x",
+      "targetHandle": "w2",
+      "data": { "edgeStyle": "solid" },
+      "id": "reactflow__edge-NvODRFR0DLINB0RlPSsvty2-Zc_TTzmM36yWsu3GvOy9xw2",
+      "selected": true,
+      "type": "smoothstep",
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "Zc_TTzmM36yWsu3GvOy9x",
+      "sourceHandle": "x2",
+      "target": "0J_ltQEJh2g28OE2ZEYJj",
+      "targetHandle": "w2",
+      "data": { "edgeStyle": "dashed" },
+      "id": "reactflow__edge-Zc_TTzmM36yWsu3GvOy9xx2-0J_ltQEJh2g28OE2ZEYJjw2",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "Zc_TTzmM36yWsu3GvOy9x",
+      "sourceHandle": "z2",
+      "target": "kl2JI_Wl47c5r8SYzxvCq",
+      "targetHandle": "y1",
+      "data": { "edgeStyle": "solid" },
+      "id": "reactflow__edge-Zc_TTzmM36yWsu3GvOy9xz2-MwznA4qfpNlv6sqSNjPZiy1",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "kl2JI_Wl47c5r8SYzxvCq",
+      "sourceHandle": "x2",
+      "target": "8aOSpZLWwZv_BEYiurhyR",
+      "targetHandle": "w2",
+      "data": { "edgeStyle": "dashed" },
+      "id": "reactflow__edge-MwznA4qfpNlv6sqSNjPZix2-8aOSpZLWwZv_BEYiurhyRw2",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "kl2JI_Wl47c5r8SYzxvCq",
+      "sourceHandle": "z2",
+      "target": "s5Gs4yF9TPh-psYmtPzks",
+      "targetHandle": "y1",
+      "data": { "edgeStyle": "solid" },
+      "id": "reactflow__edge-kl2JI_Wl47c5r8SYzxvCqz2-MwznA4qfpNlv6sqSNjPZiy1",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "s5Gs4yF9TPh-psYmtPzks",
+      "sourceHandle": "w2",
+      "target": "_IP_e1K9LhNHilYTDh7L5",
+      "targetHandle": "x1",
+      "data": { "edgeStyle": "dashed" },
+      "id": "reactflow__edge-MwznA4qfpNlv6sqSNjPZiw2-_IP_e1K9LhNHilYTDh7L5x1",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "s5Gs4yF9TPh-psYmtPzks",
+      "sourceHandle": "x2",
+      "target": "oYi3YOc1GC2Nfp71VOkJt",
+      "targetHandle": "w1",
+      "data": { "edgeStyle": "solid" },
+      "id": "reactflow__edge-s5Gs4yF9TPh-psYmtPzksx2-MwznA4qfpNlv6sqSNjPZiw1",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "oYi3YOc1GC2Nfp71VOkJt",
+      "sourceHandle": "x2",
+      "target": "llCBeut_uc9IAe2oi4KZ9",
+      "targetHandle": "w2",
+      "data": { "edgeStyle": "dashed" },
+      "id": "reactflow__edge-MwznA4qfpNlv6sqSNjPZix2-llCBeut_uc9IAe2oi4KZ9w2",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "oYi3YOc1GC2Nfp71VOkJt",
+      "sourceHandle": "y2",
+      "target": "MwznA4qfpNlv6sqSNjPZi",
+      "targetHandle": "z1",
+      "data": { "edgeStyle": "solid" },
+      "id": "reactflow__edge-oYi3YOc1GC2Nfp71VOkJty2-MwznA4qfpNlv6sqSNjPZiz1",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "i0EAFEUB-F0wBJWOtrl1A",
+      "sourceHandle": "x2",
+      "target": "r0yD1gfn03wTpEBi6zNsu",
+      "targetHandle": "w2",
+      "data": { "edgeStyle": "dashed" },
+      "id": "reactflow__edge-i0EAFEUB-F0wBJWOtrl1Ax2-r0yD1gfn03wTpEBi6zNsuw2",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "MwznA4qfpNlv6sqSNjPZi",
+      "sourceHandle": "y2",
+      "target": "DWw8NxkLpIpiOSUaZZ1oA",
+      "targetHandle": "z1",
+      "data": { "edgeStyle": "solid" },
+      "id": "reactflow__edge-MwznA4qfpNlv6sqSNjPZiy2-DWw8NxkLpIpiOSUaZZ1oAz1",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "MwznA4qfpNlv6sqSNjPZi",
+      "sourceHandle": "x2",
+      "target": "f1djN0GxoeVPr_0cl6vMq",
+      "targetHandle": "w1",
+      "data": { "edgeStyle": "dashed" },
+      "id": "reactflow__edge-MwznA4qfpNlv6sqSNjPZix2-f1djN0GxoeVPr_0cl6vMqw1",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "DWw8NxkLpIpiOSUaZZ1oA",
+      "sourceHandle": "x2",
+      "target": "uUzRKa9wGzdUwwmAg3FWr",
+      "targetHandle": "w1",
+      "data": { "edgeStyle": "dashed" },
+      "id": "reactflow__edge-DWw8NxkLpIpiOSUaZZ1oAx2-uUzRKa9wGzdUwwmAg3FWrw1",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "Zw2AOTK5uc9BoKEpY7W1C",
+      "sourceHandle": "w2",
+      "target": "dKCYmxDNZubCVcR5rf8b-",
+      "targetHandle": "x1",
+      "data": { "edgeStyle": "dashed" },
+      "id": "reactflow__edge-Zw2AOTK5uc9BoKEpY7W1Cw2-dKCYmxDNZubCVcR5rf8b-x1",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "Zw2AOTK5uc9BoKEpY7W1C",
+      "sourceHandle": "z2",
+      "target": "CMlWNQwpywNhO9B6Yj6Me",
+      "targetHandle": "y2",
+      "data": { "edgeStyle": "solid" },
+      "id": "reactflow__edge-Zw2AOTK5uc9BoKEpY7W1Cz2-CMlWNQwpywNhO9B6Yj6Mey2",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "CMlWNQwpywNhO9B6Yj6Me",
+      "sourceHandle": "y2",
+      "target": "B2SGBENzUMl0SAjG4j91V",
+      "targetHandle": "w2",
+      "data": { "edgeStyle": "solid" },
+      "selected": true,
+      "id": "reactflow__edge-CMlWNQwpywNhO9B6Yj6Mey2--6fwJQOfsorgHkoQGp4T3w2",
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "B2SGBENzUMl0SAjG4j91V",
+      "sourceHandle": "x2",
+      "target": "oWygnpwHq2poXQMTTSCpl",
+      "targetHandle": "w1",
+      "data": { "edgeStyle": "dashed" },
+      "id": "reactflow__edge--6fwJQOfsorgHkoQGp4T3x2-oWygnpwHq2poXQMTTSCplw1",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "B2SGBENzUMl0SAjG4j91V",
+      "sourceHandle": "y2",
+      "target": "-6fwJQOfsorgHkoQGp4T3",
+      "targetHandle": "z1",
+      "data": { "edgeStyle": "solid" },
+      "id": "reactflow__edge-B2SGBENzUMl0SAjG4j91Vy2--6fwJQOfsorgHkoQGp4T3z1",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "-6fwJQOfsorgHkoQGp4T3",
+      "sourceHandle": "x2",
+      "target": "CG01PTVgHtjfKvsJkJLGl",
+      "targetHandle": "w1",
+      "data": { "edgeStyle": "dashed" },
+      "id": "reactflow__edge--6fwJQOfsorgHkoQGp4T3x2-CG01PTVgHtjfKvsJkJLGlw1",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "DHdNBP7_ixjr6h-dIQ7g6",
+      "sourceHandle": "z2",
+      "target": "-6AOrbuOE7DJCmxlcgCay",
+      "targetHandle": "y2",
+      "data": { "edgeStyle": "solid" },
+      "id": "reactflow__edge-DHdNBP7_ixjr6h-dIQ7g6z2--6AOrbuOE7DJCmxlcgCayy2",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "-6AOrbuOE7DJCmxlcgCay",
+      "sourceHandle": "x2",
+      "target": "fb3bnfKXjSIjPAk4b95lg",
+      "targetHandle": "w2",
+      "data": { "edgeStyle": "solid" },
+      "id": "reactflow__edge--6AOrbuOE7DJCmxlcgCayx2-qmHs6_BzND_xpMmls5YUHw2",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "fb3bnfKXjSIjPAk4b95lg",
+      "sourceHandle": "x2",
+      "target": "xjUaIp8gGxkN-cp8emJ2M",
+      "targetHandle": "w1",
+      "data": { "edgeStyle": "dashed" },
+      "id": "reactflow__edge-qmHs6_BzND_xpMmls5YUHx2-xjUaIp8gGxkN-cp8emJ2Mw1",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "fb3bnfKXjSIjPAk4b95lg",
+      "sourceHandle": "y2",
+      "target": "vvE1aUsWbF1OFcmMUHbJa",
+      "targetHandle": "z1",
+      "data": { "edgeStyle": "solid" },
+      "id": "reactflow__edge-fb3bnfKXjSIjPAk4b95lgy2-qmHs6_BzND_xpMmls5YUHz1",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "vvE1aUsWbF1OFcmMUHbJa",
+      "sourceHandle": "y2",
+      "target": "Kb2Pbz0Sq7YlO1vCwYxnX",
+      "targetHandle": "z2",
+      "data": { "edgeStyle": "solid" },
+      "id": "reactflow__edge-vvE1aUsWbF1OFcmMUHbJay2-Kb2Pbz0Sq7YlO1vCwYxnXz2",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "Kb2Pbz0Sq7YlO1vCwYxnX",
+      "sourceHandle": "y2",
+      "target": "qmHs6_BzND_xpMmls5YUH",
+      "targetHandle": "z2",
+      "data": { "edgeStyle": "solid" },
+      "id": "reactflow__edge-Kb2Pbz0Sq7YlO1vCwYxnXy2-qmHs6_BzND_xpMmls5YUHz2",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "vvE1aUsWbF1OFcmMUHbJa",
+      "sourceHandle": "w2",
+      "target": "T6rCTv9Dxkm-tEA-l9XEv",
+      "targetHandle": "x1",
+      "data": { "edgeStyle": "dashed" },
+      "id": "reactflow__edge-vvE1aUsWbF1OFcmMUHbJaw2-T6rCTv9Dxkm-tEA-l9XEvx1",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "vvE1aUsWbF1OFcmMUHbJa",
+      "sourceHandle": "x2",
+      "target": "R2-qWGUxsTOeSHRuUzhd2",
+      "targetHandle": "w1",
+      "data": { "edgeStyle": "dashed" },
+      "id": "reactflow__edge-vvE1aUsWbF1OFcmMUHbJax2-R2-qWGUxsTOeSHRuUzhd2w1",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "qmHs6_BzND_xpMmls5YUH",
+      "sourceHandle": "x2",
+      "target": "FTMHsUiE8isD_OVZr62Xc",
+      "targetHandle": "w1",
+      "data": { "edgeStyle": "solid" },
+      "id": "reactflow__edge-qmHs6_BzND_xpMmls5YUHx2-h29eJG1hWHa7vMhSqtfV2w1",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "FTMHsUiE8isD_OVZr62Xc",
+      "sourceHandle": "z2",
+      "target": "DVckzBUMgk_lWThVkLyAT",
+      "targetHandle": "y1",
+      "data": { "edgeStyle": "dashed" },
+      "id": "reactflow__edge-h29eJG1hWHa7vMhSqtfV2z2-DVckzBUMgk_lWThVkLyATy1",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "FTMHsUiE8isD_OVZr62Xc",
+      "sourceHandle": "z2",
+      "target": "hSG6Aux39X0cXi6ADy2al",
+      "targetHandle": "y1",
+      "data": { "edgeStyle": "dashed" },
+      "id": "reactflow__edge-h29eJG1hWHa7vMhSqtfV2z2-hSG6Aux39X0cXi6ADy2aly1",
+      "selected": true,
+      "focusable": true,
+      "selectable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "FTMHsUiE8isD_OVZr62Xc",
+      "sourceHandle": "x2",
+      "target": "jVXFCo6puMxJ_ifn_uwim",
+      "targetHandle": "w1",
+      "data": { "edgeStyle": "solid" },
+      "id": "reactflow__edge-FTMHsUiE8isD_OVZr62Xcx2-h29eJG1hWHa7vMhSqtfV2w1",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "jVXFCo6puMxJ_ifn_uwim",
+      "sourceHandle": "x2",
+      "target": "ysnXvSHGBMMozBJyXpHl5",
+      "targetHandle": "w2",
+      "data": { "edgeStyle": "dashed" },
+      "id": "reactflow__edge-h29eJG1hWHa7vMhSqtfV2x2-ysnXvSHGBMMozBJyXpHl5w2",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "jVXFCo6puMxJ_ifn_uwim",
+      "sourceHandle": "z2",
+      "target": "h29eJG1hWHa7vMhSqtfV2",
+      "targetHandle": "y1",
+      "data": { "edgeStyle": "solid" },
+      "id": "reactflow__edge-jVXFCo6puMxJ_ifn_uwimz2-h29eJG1hWHa7vMhSqtfV2y1",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "h29eJG1hWHa7vMhSqtfV2",
+      "sourceHandle": "z2",
+      "target": "4kkX5g_-plX9zVqr0ZoiR",
+      "targetHandle": "y2",
+      "data": { "edgeStyle": "solid" },
+      "id": "reactflow__edge-h29eJG1hWHa7vMhSqtfV2z2-4kkX5g_-plX9zVqr0ZoiRy2",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0.8 8",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "4kkX5g_-plX9zVqr0ZoiR",
+      "sourceHandle": "w2",
+      "target": "5mNqH_AEiLxUmgurNW1Fq",
+      "targetHandle": "x2",
+      "data": { "edgeStyle": "dashed" },
+      "id": "reactflow__edge-4kkX5g_-plX9zVqr0ZoiRw2-5mNqH_AEiLxUmgurNW1Fqx2",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    },
+    {
+      "style": {
+        "strokeDasharray": "0",
+        "strokeLinecap": "round",
+        "strokeWidth": 3.5,
+        "stroke": "#2b78e4"
+      },
+      "source": "4kkX5g_-plX9zVqr0ZoiR",
+      "sourceHandle": "x2",
+      "target": "I1aDakZmYpe7pKczou0qC",
+      "targetHandle": "w1",
+      "data": { "edgeStyle": "solid" },
+      "id": "reactflow__edge-4kkX5g_-plX9zVqr0ZoiRx2-I1aDakZmYpe7pKczou0qCw1",
+      "selected": true,
+      "selectable": true,
+      "focusable": true
+    }
+  ]
+}
diff --git a/src/data/roadmaps/cpp/cpp.md b/src/data/roadmaps/cpp/cpp.md
index 4620776fd..69b3f06a9 100644
--- a/src/data/roadmaps/cpp/cpp.md
+++ b/src/data/roadmaps/cpp/cpp.md
@@ -7,10 +7,11 @@ briefDescription: 'Step by step guide to becoming a C++ Developer in 2025'
 title: 'C++ Developer Roadmap'
 description: 'Step by step guide to becoming a C++ developer in 2025'
 isNew: false
+renderer: editor
 hasTopics: true
 dimensions:
   width: 1000
-  height: 2639.34
+  height: 2975
 schema:
   headline: 'C++ Developer Roadmap'
   description: 'Learn how to become a C++ Developer with this interactive step by step guide in 2025. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place.'
diff --git a/src/data/roadmaps/cpp/migration-mapping.json b/src/data/roadmaps/cpp/migration-mapping.json
new file mode 100644
index 000000000..72584f07b
--- /dev/null
+++ b/src/data/roadmaps/cpp/migration-mapping.json
@@ -0,0 +1,125 @@
+{
+  "introduction": "NvODRFR0DLINB0RlPSsvt",
+  "introduction:what-is-cpp": "x_28LiDVshqWns_aIBsdx",
+  "introduction:why-cpp": "tl6VCQ5IEGDVyFcgj7jDm",
+  "introduction:c-vs-cpp": "2Ag0t3LPryTF8khHLRfy-",
+  "setting-up": "Zc_TTzmM36yWsu3GvOy9x",
+  "setting-up:installing": "0J_ltQEJh2g28OE2ZEYJj",
+  "setting-up:code-editors": "ew0AfyadpXPRO0ZY3Z19k",
+  "setting-up:first-program": "SEq0D2Zg5WTsIDtd1hW9f",
+  "basic-operations": "kl2JI_Wl47c5r8SYzxvCq",
+  "basic-operations:arithmetic-operators": "8aOSpZLWwZv_BEYiurhyR",
+  "basic-operations:logical-operators": "Y9gq8WkDA_XGe68JkY2UZ",
+  "basic-operations:bitwise": "zE4iPSq2KsrDSByQ0sGK_",
+  "functions": "oYi3YOc1GC2Nfp71VOkJt",
+  "functions:lambda": "xjiFBVe-VGqCqWfkPVGKf",
+  "functions:operators": "llCBeut_uc9IAe2oi4KZ9",
+  "data-types": "MwznA4qfpNlv6sqSNjPZi",
+  "data-types:static-typing": "f1djN0GxoeVPr_0cl6vMq",
+  "data-types:dynamic-typing": "i0EAFEUB-F0wBJWOtrl1A",
+  "data-types:dynamic-typing:rtti": "r0yD1gfn03wTpEBi6zNsu",
+  "basic-operations:loops": "_IP_e1K9LhNHilYTDh7L5",
+  "pointers-and-references": "DWw8NxkLpIpiOSUaZZ1oA",
+  "pointers-and-references:references": "uUzRKa9wGzdUwwmAg3FWr",
+  "pointers-and-references:smart-pointers:weak-ptr": "vUwSS-uX36OWZouO0wOcy",
+  "pointers-and-references:smart-pointers:shared-ptr": "b5jZIZD_U_CPg-_bdndjz",
+  "pointers-and-references:smart-pointers:uniqe-ptr": "k9c5seRkhgm_yHPpiz2X0",
+  "pointers-and-references:raw-pointers:memory-leakage": "6w0WExQ4lGIGgok6Thq0s",
+  "pointers-and-references:raw-pointers:new-delete-operators": "Gld0nRs0sM8kRe8XmYolu",
+  "pointers-and-references:memory-model": "mSFwsTYvmg-GwG4_DEIEf",
+  "pointers-and-references:memory-model:object-lifetime": "9aA_-IfQ9WmbPgwic0mFN",
+  "structuring-codebase": "Zw2AOTK5uc9BoKEpY7W1C",
+  "structuring-codebase:code-splitting": "CK7yf8Bo7kfbV6x2tZTrh",
+  "structuring-codebase:code-splitting:forward-declaration": "ZHjU60uzJTezADRhDTESG",
+  "structuring-codebase:scope": "dKCYmxDNZubCVcR5rf8b-",
+  "structuring-codebase:scope:namespaces": "iIdC7V8sojwyEqK1xMuHn",
+  "structures-and-classes": "CMlWNQwpywNhO9B6Yj6Me",
+  "structures-and-classes:rule-of-zero-five-three": "7sdEzZCIoarzznwO4XcCv",
+  "structures-and-classes:oop": "b3-QYKNcW3LYCNOza3Olf",
+  "structures-and-classes:oop:static-polymorphism:overloading-functions": "sgfqb22sdN4VRJYkhAVaf",
+  "structures-and-classes:oop:static-polymorphism": "obZIxRp0eMWdG7gplNIBc",
+  "structures-and-classes:oop:dynamic-polymorphism:virtual-methods": "hNBErGNiegLsUJn_vgcOR",
+  "structures-and-classes:oop:dynamic-polymorphism:virtual-tables": "s99ImazcwCgAESxZd8ksa",
+  "structures-and-classes:oop:dynamic-polymorphism": "7h1VivjCPDwriL7FirtFv",
+  "structures-and-classes:multiple-inheritance": "WjHpueZDK-d3oDNMVZi9w",
+  "structures-and-classes:multiple-inheritance:diamond-inheritance": "ofwdZm05AUqCIWmfgGHk8",
+  "exception-handling": "B2SGBENzUMl0SAjG4j91V",
+  "exception-handling:exit-codes": "oWygnpwHq2poXQMTTSCpl",
+  "exception-handling:exceptions": "NJud5SXBAUZ6Sr78kZ7jx",
+  "exception-handling:exceptions:access-violations": "y4-P4UNC--rE1vni8HdTn",
+  "language-concepts": "-6fwJQOfsorgHkoQGp4T3",
+  "language-concepts:auto": "CG01PTVgHtjfKvsJkJLGl",
+  "language-concepts:type-casting": "PiMhw1oP9-NZEa6I9u4lX",
+  "language-concepts:type-casting:static-cast": "_XB2Imyf23-6AOeoNLhYQ",
+  "language-concepts:type-casting:const-cast": "5g22glc97siQOcTkHbwan",
+  "language-concepts:type-casting:dynamic-cast": "4BdFcuQ5KNW94cu2jz-vE",
+  "language-concepts:type-casting:reinterpret-cast": "ZMyFDJrpCauGrY5NZkOwg",
+  "language-concepts:undefined-behavior": "IDOlquv6jlfecwQoBwkGZ",
+  "language-concepts:adl": "YSWN7nS8vA9nMldSUrZRT",
+  "language-concepts:name-mangling": "Lt7ss59KZw9Jwqj234jm2",
+  "language-concepts:macros": "zKdlfZTRHwjtmRUGW9z9-",
+  "stl": "DHdNBP7_ixjr6h-dIQ7g6",
+  "stl:iterators": "Ebu8gzbyyXEeJryeE0SpG",
+  "stl:iostream": "VeVxZ230xkesQsIDig8zQ",
+  "stl:algorithms": "whyj6Z4RXFsVQYRfYYn7B",
+  "stl:date-time": "yGvE6eHKlPMBB6rde0llR",
+  "stl:multithreading": "OXQUPqxzs1-giAACwl3X1",
+  "stl:ccontainers": "1pydf-SR0QUfVNuBEyvzc",
+  "templates": "-6AOrbuOE7DJCmxlcgCay",
+  "templates:variadic-templates": "w4EIf58KP-Pq-yc0HlGxc",
+  "templates:template-specialization": "sObOuccY0PDeGG-9GrFDF",
+  "templates:template-specialization:full": "6hTcmJwNnQstbWWzNCfTe",
+  "templates:template-specialization:partial": "1NYJtbdcdOB4-vIrnq4yX",
+  "templates:type-traits": "WptReUOwVth3C9-AVmMHF",
+  "templates:finae": "3C5UfejDX-1Z8ZF6C53xD",
+  "idioms": "fb3bnfKXjSIjPAk4b95lg",
+  "idioms:raii": "OmHDlLxCnH8RDdu5vx9fl",
+  "idioms:pimpl": "MEoWt8NKjPLVTeGgYf3cR",
+  "idioms:crtp": "ttt-yeIi4BPWrgvW324W7",
+  "idioms:non-copyable": "xjUaIp8gGxkN-cp8emJ2M",
+  "idioms:erase-remove": "YvmjrZSAOmjhVPo05MJqN",
+  "idioms:copy-swap": "lxAzI42jQdaofzQ5MXebG",
+  "idioms:copy-write": "O2Du5gHHxFxAI2u5uO8wu",
+  "standards": "vvE1aUsWbF1OFcmMUHbJa",
+  "standards:cpp11-14": "T6rCTv9Dxkm-tEA-l9XEv",
+  "standards:cpp17": "R2-qWGUxsTOeSHRuUzhd2",
+  "standards:cpp20": "o3no4a5_iMFzEAGs56-BJ",
+  "standards:newest": "sxbbKtg7kMNbkx7fXhjR9",
+  "standards:cpp0x": "PPg0V5EzGBeJsysg1215V",
+  "debuggers": "qmHs6_BzND_xpMmls5YUH",
+  "debuggers:debugger-messages": "VtPb8-AJKzhTB0QbMtoU4",
+  "debuggers:debugger-symbols": "sR_FxGZHoMCV9Iv7z2_SX",
+  "debuggers:win-dbg": "y8VCbGDUco9bzGRfIBD8R",
+  "debuggers:gdb": "BmWsoL9c_Aag5nVlMsKm2",
+  "compilers": "FTMHsUiE8isD_OVZr62Xc",
+  "compilers:stages": "DVckzBUMgk_lWThVkLyAT",
+  "compilers:features": "hSG6Aux39X0cXi6ADy2al",
+  "build-systems": "jVXFCo6puMxJ_ifn_uwim",
+  "build-systems:cmake": "ysnXvSHGBMMozBJyXpHl5",
+  "build-systems:makefile": "t6rZLH7l8JQm99ax_fEJ9",
+  "build-systems:ninja": "HkUCD5A_M9bJxJRElkK0x",
+  "package-managers": "h29eJG1hWHa7vMhSqtfV2",
+  "package-managers:vcpkg": "PKG5pACLfRS2ogfzBX47_",
+  "package-managers:spack": "3ehBc2sKVlPj7dn4RVZCH",
+  "package-managers:conan": "ky_UqizToTZHC_b77qFi2",
+  "package-managers:nuget": "g0s0F4mLV16eNvMBflN2e",
+  "working-with-libs": "4kkX5g_-plX9zVqr0ZoiR",
+  "working-with-libs:inclusion": "5mNqH_AEiLxUmgurNW1Fq",
+  "working-with-libs:licensing": "sLVs95EOeHZldoKY0L_dH",
+  "libraries:boost": "1d7h5P1Q0RVHryKPVogQy",
+  "libraries:open-cv": "Eq3TKSFJ2F2mrTHAaU2J4",
+  "libraries:poco": "nOkniNXfXwPPlOEJHJoGl",
+  "libraries:protobuf": "jpMCIWQko7p3ndezYHL4D",
+  "libraries:grpc": "621J9W4xCofumNZGo4TZT",
+  "libraries:tensorflow": "j_eNHhs0J08Dt7HVbo4Q2",
+  "libraries:pybind11": "tEkvlJPAkD5fji-MMODL7",
+  "libraries:spdlog": "q64qFxoCrR38RPsN2lC8x",
+  "libraries:fmt": "1CqQgmHDeo1HlPdpUJS7H",
+  "libraries:opencl": "GGZJaYpRENaqloJzt0VtY",
+  "libraries:ranges-v3": "et-dXKPYuyVW6eV2K3CM8",
+  "frameworks:gtest": "MrAM-viRaF8DSxB6sVdD9",
+  "frameworks:qt": "gAZ9Dqgj1_UkaLzVgzx1t",
+  "frameworks:catch2": "s13jQuaC6gw0Lab3Cbyy6",
+  "frameworks:orbit-profiler": "O0lVEMTAV1pq9sYCKQvh_",
+  "frameworks:pytorch-cpp": "88pr5aN7cctZfDVVo-2ns"
+}
\ No newline at end of file
diff --git a/src/data/roadmaps/cyber-security/content/dns-poisoning@urtsyYWViEzbqYLoNfQAh.md b/src/data/roadmaps/cyber-security/content/dns-poisoning@urtsyYWViEzbqYLoNfQAh.md
index 11996189a..f46313fe9 100644
--- a/src/data/roadmaps/cyber-security/content/dns-poisoning@urtsyYWViEzbqYLoNfQAh.md
+++ b/src/data/roadmaps/cyber-security/content/dns-poisoning@urtsyYWViEzbqYLoNfQAh.md
@@ -7,5 +7,4 @@ Visit the following resources to learn more:
 - [@article@What is DNS cache poisoning? | DNS spoofing](https://www.cloudflare.com/learning/dns/dns-cache-poisoning/)
 
 - [@article@What Is DNS Poisoning?](https://www.fortinet.com/resources/cyberglossary/dns-poisoning)
-- [@article@DNS Spoofing or DNS Cache poisoning](https://www.geeksforgeeks.org/dns-spoofing-or-dns-cache-poisoning/)
 - [@article@DNS Poisoning (DNS Spoofing): Definition, Technique & Defense](https://www.okta.com/identity-101/dns-poisoning/)
diff --git a/src/data/roadmaps/cyber-security/content/loopback@W_oloLu2Euz5zRSy7v_T8.md b/src/data/roadmaps/cyber-security/content/loopback@W_oloLu2Euz5zRSy7v_T8.md
index f2a2d223d..0402b583c 100644
--- a/src/data/roadmaps/cyber-security/content/loopback@W_oloLu2Euz5zRSy7v_T8.md
+++ b/src/data/roadmaps/cyber-security/content/loopback@W_oloLu2Euz5zRSy7v_T8.md
@@ -4,5 +4,4 @@
 
 Learn more from the following resources:
 
-- [@article@What is a loopback address?](https://www.geeksforgeeks.org/what-is-a-loopback-address/)
 - [@article@Understanding the loopback address and loopback interfaces](https://study-ccna.com/loopback-interface-loopback-address/)
\ No newline at end of file
diff --git a/src/data/roadmaps/cyber-security/content/networking-knowledge@gSLr-Lc119eX9Ig-kDzJ2.md b/src/data/roadmaps/cyber-security/content/networking-knowledge@gSLr-Lc119eX9Ig-kDzJ2.md
index 6501cf92e..a8f0e407a 100644
--- a/src/data/roadmaps/cyber-security/content/networking-knowledge@gSLr-Lc119eX9Ig-kDzJ2.md
+++ b/src/data/roadmaps/cyber-security/content/networking-knowledge@gSLr-Lc119eX9Ig-kDzJ2.md
@@ -14,4 +14,3 @@ This knowledge is essential for designing, implementing, and maintaining effecti
 Learn more from the following resources:
 
 - [@article@What are Network Protocols?](https://www.solarwinds.com/resources/it-glossary/network-protocols)
-- [@article@Types of Network Topology](https://www.geeksforgeeks.org/types-of-network-topology/)
diff --git a/src/data/roadmaps/cyber-security/content/operating-systems@UY6xdt_V3YMkZxZ1hZLvW.md b/src/data/roadmaps/cyber-security/content/operating-systems@UY6xdt_V3YMkZxZ1hZLvW.md
index bef60333e..841e99ef7 100644
--- a/src/data/roadmaps/cyber-security/content/operating-systems@UY6xdt_V3YMkZxZ1hZLvW.md
+++ b/src/data/roadmaps/cyber-security/content/operating-systems@UY6xdt_V3YMkZxZ1hZLvW.md
@@ -4,5 +4,4 @@
 
 Learn more from the following resources:
 
-- [@article@What is an operating system?](https://www.geeksforgeeks.org/what-is-an-operating-system/)
 - [@video@What is an operating system as fast as possible](https://www.youtube.com/watch?v=pVzRTmdd9j0)
diff --git a/src/data/roadmaps/cyber-security/content/port-blocking@W7bcydXdwlubXF2PHKOuq.md b/src/data/roadmaps/cyber-security/content/port-blocking@W7bcydXdwlubXF2PHKOuq.md
index 9d8c58403..687cc4b5d 100644
--- a/src/data/roadmaps/cyber-security/content/port-blocking@W7bcydXdwlubXF2PHKOuq.md
+++ b/src/data/roadmaps/cyber-security/content/port-blocking@W7bcydXdwlubXF2PHKOuq.md
@@ -1,7 +1,3 @@
 # Port Blocking
 
-Port blocking is an essential practice in hardening the security of your network and devices. It involves restricting, filtering, or entirely denying access to specific network ports to minimize exposure to potential cyber threats. By limiting access to certain ports, you can effectively safeguard your systems against unauthorized access and reduce the likelihood of security breaches.
-
-Learn more from the following resources:
-
-- [@article@What is port blocking with LAN?](https://www.geeksforgeeks.org/what-is-port-blocking-within-lan/)
+Port blocking is an essential practice in hardening the security of your network and devices. It involves restricting, filtering, or entirely denying access to specific network ports to minimize exposure to potential cyber threats. By limiting access to certain ports, you can effectively safeguard your systems against unauthorized access and reduce the likelihood of security breaches.
\ No newline at end of file
diff --git a/src/data/roadmaps/cyber-security/content/protocol-analyzers@K05mEAsjImyPge0hDtsU0.md b/src/data/roadmaps/cyber-security/content/protocol-analyzers@K05mEAsjImyPge0hDtsU0.md
index 76fd6dde5..104ad38c6 100644
--- a/src/data/roadmaps/cyber-security/content/protocol-analyzers@K05mEAsjImyPge0hDtsU0.md
+++ b/src/data/roadmaps/cyber-security/content/protocol-analyzers@K05mEAsjImyPge0hDtsU0.md
@@ -4,5 +4,4 @@
 
 Learn more from the following resources:
 
-- [@article@What is a protocol analyzer?](https://www.geeksforgeeks.org/what-is-protocol-analyzer/)
 - [@video@Protocol Analyzers](https://www.youtube.com/watch?v=hTMhlB-o0Ow)
diff --git a/src/data/roadmaps/cyber-security/content/route@xFuWk7M-Vctk_xb7bHbWs.md b/src/data/roadmaps/cyber-security/content/route@xFuWk7M-Vctk_xb7bHbWs.md
index a32397be9..93eabb5af 100644
--- a/src/data/roadmaps/cyber-security/content/route@xFuWk7M-Vctk_xb7bHbWs.md
+++ b/src/data/roadmaps/cyber-security/content/route@xFuWk7M-Vctk_xb7bHbWs.md
@@ -1,7 +1,3 @@
 # route
 
-The `route` command is a network utility used to view and manipulate the IP routing table on Unix-like and Windows systems. It allows users to display the current routes that data packets take, as well as add, modify, or delete routes for network traffic. This command is often used in network troubleshooting and configuration to control how data flows between different networks and subnets. By specifying routes manually, administrators can define specific paths for network traffic, bypassing default routes and optimizing performance or security.
-
-Learn more from the following resources:
-
-- [@article@How to check the routing table in Linux](https://www.geeksforgeeks.org/route-command-in-linux-with-examples/)
+The `route` command is a network utility used to view and manipulate the IP routing table on Unix-like and Windows systems. It allows users to display the current routes that data packets take, as well as add, modify, or delete routes for network traffic. This command is often used in network troubleshooting and configuration to control how data flows between different networks and subnets. By specifying routes manually, administrators can define specific paths for network traffic, bypassing default routes and optimizing performance or security.
\ No newline at end of file
diff --git a/src/data/roadmaps/cyber-security/content/star@P0ZhAXd_H-mTOMr13Ag31.md b/src/data/roadmaps/cyber-security/content/star@P0ZhAXd_H-mTOMr13Ag31.md
index 5c4e49bdc..00d43bda1 100644
--- a/src/data/roadmaps/cyber-security/content/star@P0ZhAXd_H-mTOMr13Ag31.md
+++ b/src/data/roadmaps/cyber-security/content/star@P0ZhAXd_H-mTOMr13Ag31.md
@@ -4,5 +4,4 @@ A star network topology is a configuration where all devices (nodes) are connect
 
 Learn more from the following resources:
 
-- [@article@Advantages and Disadvantages of Star Topology](https://www.geeksforgeeks.org/advantages-and-disadvantages-of-star-topology/)
 - [@video@Star Topology](https://www.youtube.com/watch?v=EQ3rW22-Py0)
\ No newline at end of file
diff --git a/src/data/roadmaps/cyber-security/content/understand-handshakes@zQx_VUS1zRmF4zCGjJD5-.md b/src/data/roadmaps/cyber-security/content/understand-handshakes@zQx_VUS1zRmF4zCGjJD5-.md
index 39e4612fa..e6abc4328 100644
--- a/src/data/roadmaps/cyber-security/content/understand-handshakes@zQx_VUS1zRmF4zCGjJD5-.md
+++ b/src/data/roadmaps/cyber-security/content/understand-handshakes@zQx_VUS1zRmF4zCGjJD5-.md
@@ -4,5 +4,4 @@ In networking and cybersecurity, a handshake is a process of establishing a secu
 
 Learn more from the following resources:
 
-- [@article@TCP 3-Way Handshake Process](https://www.geeksforgeeks.org/tcp-3-way-handshake-process/)
 - [@video@TLS Handshake Explained](https://www.youtube.com/watch?v=86cQJ0MMses)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/analaysis--reporting-with-excel@sgXIjVTbwdwdYoaxN3XBM.md b/src/data/roadmaps/data-analyst/content/analaysis--reporting-with-excel@sgXIjVTbwdwdYoaxN3XBM.md
index d720f00ac..06b5a5e02 100644
--- a/src/data/roadmaps/data-analyst/content/analaysis--reporting-with-excel@sgXIjVTbwdwdYoaxN3XBM.md
+++ b/src/data/roadmaps/data-analyst/content/analaysis--reporting-with-excel@sgXIjVTbwdwdYoaxN3XBM.md
@@ -2,5 +2,7 @@
 
 Excel is a powerful tool utilized by data analysts worldwide to store, manipulate, and analyze data. It offers a vast array of features such as pivot tables, graphs and a powerful suite of formulas and functions to help sift through large sets of data. A data analyst uses Excel to perform a wide range of tasks, from simple data entry and cleaning, to more complex statistical analysis and predictive modeling. Proficiency in Excel is often a key requirement for a data analyst, as its versatility and ubiquity make it an indispensable tool in the field of data analysis.
 
+Learn more from the following resources:
+
 - [@article@W3Schools - Excel](https://www.w3schools.com/excel/index.php)
 - [@course@Microsoft Excel Course](https://support.microsoft.com/en-us/office/excel-video-training-9bc05390-e94c-46af-a5b3-d7c22f6990bb)
diff --git a/src/data/roadmaps/data-analyst/content/apis@4DFcXSSHxg5wv0uXLIRij.md b/src/data/roadmaps/data-analyst/content/apis@4DFcXSSHxg5wv0uXLIRij.md
index 77b7cd064..c838cdc55 100644
--- a/src/data/roadmaps/data-analyst/content/apis@4DFcXSSHxg5wv0uXLIRij.md
+++ b/src/data/roadmaps/data-analyst/content/apis@4DFcXSSHxg5wv0uXLIRij.md
@@ -5,4 +5,4 @@ Application Programming Interfaces, better known as APIs, play a fundamental rol
 Learn more from the following resources:
 
 - [@article@What is an API?](https://aws.amazon.com/what-is/api/)
-- [@article@A beginners guide to APIs](https://www.postman.com/what-is-an-api/)
\ No newline at end of file
+- [@article@A Beginner's Guide to APIs](https://www.postman.com/what-is-an-api/)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/average@yn1sstYMO9du3rpfQqNs9.md b/src/data/roadmaps/data-analyst/content/average@yn1sstYMO9du3rpfQqNs9.md
index 54b3587d1..84b09a2fe 100644
--- a/src/data/roadmaps/data-analyst/content/average@yn1sstYMO9du3rpfQqNs9.md
+++ b/src/data/roadmaps/data-analyst/content/average@yn1sstYMO9du3rpfQqNs9.md
@@ -1,8 +1,8 @@
-# Average 
+# Average
 
 When focusing on data analysis, understanding key statistical concepts is crucial. Amongst these, central tendency is a foundational element. Central Tendency refers to the measure that determines the center of a distribution. The average is a commonly used statistical tool by which data analysts discern trends and patterns. As one of the most recognized forms of central tendency, figuring out the "average" involves summing all values in a data set and dividing by the number of values. This provides analysts with a 'typical' value, around which the remaining data tends to cluster, facilitating better decision-making based on existing data.
 
 Learn more from the following resources:
 
-- [@article@How to calculate the average](https://support.microsoft.com/en-gb/office/calculate-the-average-of-a-group-of-numbers-e158ef61-421c-4839-8290-34d7b1e68283#:~:text=Average%20This%20is%20the%20arithmetic,by%206%2C%20which%20is%205.)
+- [@article@How to Calculate the Average](https://support.microsoft.com/en-gb/office/calculate-the-average-of-a-group-of-numbers-e158ef61-421c-4839-8290-34d7b1e68283#:~:text=Average%20This%20is%20the%20arithmetic,by%206%2C%20which%20is%205.)
 - [@article@Average Formula](https://www.cuemath.com/average-formula/)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/bar-charts@EVk1H-QLtTlpG7lVEenDt.md b/src/data/roadmaps/data-analyst/content/bar-charts@EVk1H-QLtTlpG7lVEenDt.md
index 1c1c81af7..0590008da 100644
--- a/src/data/roadmaps/data-analyst/content/bar-charts@EVk1H-QLtTlpG7lVEenDt.md
+++ b/src/data/roadmaps/data-analyst/content/bar-charts@EVk1H-QLtTlpG7lVEenDt.md
@@ -4,5 +4,5 @@ As a vital tool in the data analyst's arsenal, bar charts are essential for anal
 
 Learn more from the following resources:
 
-- [@article@A complete guide to bar charts](https://www.atlassian.com/data/charts/bar-chart-complete-guide)
-- [@video@What is a bar chart?](https://www.youtube.com/watch?v=WTVdncVCvKo)
\ No newline at end of file
+- [@article@A Complete Guide to Bar Charts](https://www.atlassian.com/data/charts/bar-chart-complete-guide)
+- [@video@What is a Bar Chart?](https://www.youtube.com/watch?v=WTVdncVCvKo)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/big-data-technologies@_aUQZWUhFRvNu0MZ8CPit.md b/src/data/roadmaps/data-analyst/content/big-data-technologies@_aUQZWUhFRvNu0MZ8CPit.md
index 7deab6dff..31ce91065 100644
--- a/src/data/roadmaps/data-analyst/content/big-data-technologies@_aUQZWUhFRvNu0MZ8CPit.md
+++ b/src/data/roadmaps/data-analyst/content/big-data-technologies@_aUQZWUhFRvNu0MZ8CPit.md
@@ -1,3 +1,7 @@
 # Big Data and Data Analyst
 
-In the modern digitized world, Big Data refers to extremely large datasets that are challenging to manage and analyze using traditional data processing applications. These datasets often come from numerous different sources and are not only voluminous but also diverse in nature, including structured and unstructured data. The role of a data analyst in the context of big data is crucial. Data analysts are responsible for inspecting, cleaning, transforming, and modeling big data to discover useful information, conclude and support decision-making. They leverage their analytical skills and various big data tools and technologies to extract insights that can benefit the organization and drive strategic business initiatives.
\ No newline at end of file
+In the modern digitized world, Big Data refers to extremely large datasets that are challenging to manage and analyze using traditional data processing applications. These datasets often come from numerous different sources and are not only voluminous but also diverse in nature, including structured and unstructured data. The role of a data analyst in the context of big data is crucial. Data analysts are responsible for inspecting, cleaning, transforming, and modeling big data to discover useful information, conclude and support decision-making. They leverage their analytical skills and various big data tools and technologies to extract insights that can benefit the organization and drive strategic business initiatives.
+
+Learn more from the following resources:
+
+- [@article@Big Data Analytics](https://www.ibm.com/think/topics/big-data-analytics)
diff --git a/src/data/roadmaps/data-analyst/content/cleanup@nC7tViln4UyQFYP_-fyjB.md b/src/data/roadmaps/data-analyst/content/cleanup@nC7tViln4UyQFYP_-fyjB.md
index 898a2432e..ce921a9bb 100644
--- a/src/data/roadmaps/data-analyst/content/cleanup@nC7tViln4UyQFYP_-fyjB.md
+++ b/src/data/roadmaps/data-analyst/content/cleanup@nC7tViln4UyQFYP_-fyjB.md
@@ -4,5 +4,5 @@ The Cleanup of Data is a critical component of a Data Analyst's role. It involve
 
 Learn more from the following resources:
 
-- [@article@Top 10 ways to clean your data](https://support.microsoft.com/en-gb/office/top-ten-ways-to-clean-your-data-2844b620-677c-47a7-ac3e-c2e157d1db19)
+- [@article@Top 10 Ways to Clean Your Data](https://support.microsoft.com/en-gb/office/top-ten-ways-to-clean-your-data-2844b620-677c-47a7-ac3e-c2e157d1db19)
 - [@video@Master Data Cleaning Essentials on Excel in Just 10 Minutes](https://www.youtube.com/watch?v=jxq4-KSB_OA)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/data-cleanup@E6cpb6kvluJM8OGuDcFBT.md b/src/data/roadmaps/data-analyst/content/data-cleanup@E6cpb6kvluJM8OGuDcFBT.md
index 05a485e75..ef04e3932 100644
--- a/src/data/roadmaps/data-analyst/content/data-cleanup@E6cpb6kvluJM8OGuDcFBT.md
+++ b/src/data/roadmaps/data-analyst/content/data-cleanup@E6cpb6kvluJM8OGuDcFBT.md
@@ -1,3 +1,7 @@
 # Data Cleaning
 
-Data cleaning, which is often referred as data cleansing or data scrubbing, is one of the most important and initial steps in the data analysis process. As a data analyst, the bulk of your work often revolves around understanding, cleaning, and standardizing raw data before analysis. Data cleaning involves identifying, correcting or removing any errors or inconsistencies in datasets in order to improve their quality. The process is crucial because it directly determines the accuracy of the insights you generate - garbage in, garbage out. Even the most sophisticated models and visualizations would not be of much use if they're based on dirty data. Therefore, mastering data cleaning techniques is essential for any data analyst.
\ No newline at end of file
+Data cleaning, which is often referred as data cleansing or data scrubbing, is one of the most important and initial steps in the data analysis process. As a data analyst, the bulk of your work often revolves around understanding, cleaning, and standardizing raw data before analysis. Data cleaning involves identifying, correcting or removing any errors or inconsistencies in datasets in order to improve their quality. The process is crucial because it directly determines the accuracy of the insights you generate - garbage in, garbage out. Even the most sophisticated models and visualizations would not be of much use if they're based on dirty data. Therefore, mastering data cleaning techniques is essential for any data analyst.
+
+Learn more from the following resources:
+
+- [@article@Data Cleaning](https://www.tableau.com/learn/articles/what-is-data-cleaning#:~:text=tools%20and%20software-,What%20is%20data%20cleaning%3F,to%20be%20duplicated%20or%20mislabeled.)
diff --git a/src/data/roadmaps/data-analyst/content/data-collection@_sjXCLHHTbZromJYn6fnu.md b/src/data/roadmaps/data-analyst/content/data-collection@_sjXCLHHTbZromJYn6fnu.md
index 84cdc070e..e089711b4 100644
--- a/src/data/roadmaps/data-analyst/content/data-collection@_sjXCLHHTbZromJYn6fnu.md
+++ b/src/data/roadmaps/data-analyst/content/data-collection@_sjXCLHHTbZromJYn6fnu.md
@@ -1,3 +1,7 @@
 # Data Collection
 
-In the context of the Data Analyst role, data collection is a foundational process that entails gathering relevant data from various sources. This data can be quantitative or qualitative and may be sourced from databases, online platforms, customer feedback, among others. The gathered information is then cleaned, processed, and interpreted to extract meaningful insights. A data analyst performs this whole process carefully, as the quality of data is paramount to ensuring accurate analysis, which in turn informs business decisions and strategies. This highlights the importance of an excellent understanding, proper tools, and precise techniques when it comes to data collection in data analysis.
\ No newline at end of file
+Data collection is a foundational process that entails gathering relevant data from various sources. This data can be quantitative or qualitative and may be sourced from databases, online platforms, customer feedback, among others. The gathered information is then cleaned, processed, and interpreted to extract meaningful insights. A data analyst performs this whole process carefully, as the quality of data is paramount to ensuring accurate analysis, which in turn informs business decisions and strategies. This highlights the importance of an excellent understanding, proper tools, and precise techniques when it comes to data collection in data analysis.
+
+Learn more from the following resources:
+
+- [@article@Data Collection](https://en.wikipedia.org/wiki/Data_collection)
diff --git a/src/data/roadmaps/data-analyst/content/data-manipulation-libraries@M1QtGTLyygIjePoCfvjve.md b/src/data/roadmaps/data-analyst/content/data-manipulation-libraries@M1QtGTLyygIjePoCfvjve.md
index 67bcc376d..6fe90c059 100644
--- a/src/data/roadmaps/data-analyst/content/data-manipulation-libraries@M1QtGTLyygIjePoCfvjve.md
+++ b/src/data/roadmaps/data-analyst/content/data-manipulation-libraries@M1QtGTLyygIjePoCfvjve.md
@@ -1,3 +1,9 @@
 # Data Manipulation Libraries
 
-Data manipulation libraries are essential tools in data science and analytics, enabling efficient handling, transformation, and analysis of large datasets. Python, a popular language for data science, offers several powerful libraries for this purpose. Pandas is a highly versatile library that provides data structures like DataFrames, which allow for easy manipulation and analysis of tabular data. NumPy, another fundamental library, offers support for large, multi-dimensional arrays and matrices, along with a collection of mathematical functions to operate on these arrays. Together, Pandas and NumPy form the backbone of data manipulation in Python, facilitating tasks such as data cleaning, merging, reshaping, and statistical analysis, thus streamlining the data preparation process for machine learning and other data-driven applications.
\ No newline at end of file
+Data manipulation libraries are essential tools in data science and analytics, enabling efficient handling, transformation, and analysis of large datasets. Python, a popular language for data science, offers several powerful libraries for this purpose. Pandas is a highly versatile library that provides data structures like DataFrames, which allow for easy manipulation and analysis of tabular data. NumPy, another fundamental library, offers support for large, multi-dimensional arrays and matrices, along with a collection of mathematical functions to operate on these arrays. Together, Pandas and NumPy form the backbone of data manipulation in Python, facilitating tasks such as data cleaning, merging, reshaping, and statistical analysis, thus streamlining the data preparation process for machine learning and other data-driven applications.
+
+Learn more from the following resources:
+
+- [@article@Pandas](https://pandas.pydata.org/)
+- [@article@NumPy](https://numpy.org/)
+- [@article@Top Python Libraries for Data Science](https://www.simplilearn.com/top-python-libraries-for-data-science-article)
diff --git a/src/data/roadmaps/data-analyst/content/data-storage-solutions@iTmtpXe7dR4XKslgpsk2q.md b/src/data/roadmaps/data-analyst/content/data-storage-solutions@iTmtpXe7dR4XKslgpsk2q.md
index 7457deca6..01a777d36 100644
--- a/src/data/roadmaps/data-analyst/content/data-storage-solutions@iTmtpXe7dR4XKslgpsk2q.md
+++ b/src/data/roadmaps/data-analyst/content/data-storage-solutions@iTmtpXe7dR4XKslgpsk2q.md
@@ -4,5 +4,5 @@ As a business enterprise expands, so does its data. For data analysts, the surge
 
 Learn more from the following resources:
 
-- [@official@SQL Roadmap](https://roadmap.sh/sql)
-- [@official@PostgreSQL Roadmap](https://roadmap.sh/postgresql-dba)
\ No newline at end of file
+- [@roadmap@Visit Dedicated SQL Roadmap](https://roadmap.sh/sql)
+- [@roadmap@Visit Dedicated PostgreSQL Roadmap](https://roadmap.sh/postgresql-dba)
diff --git a/src/data/roadmaps/data-analyst/content/data-transformation@t_BRtEharsrOZxoyX0OzV.md b/src/data/roadmaps/data-analyst/content/data-transformation@t_BRtEharsrOZxoyX0OzV.md
index 6f5ced344..fed65dd76 100644
--- a/src/data/roadmaps/data-analyst/content/data-transformation@t_BRtEharsrOZxoyX0OzV.md
+++ b/src/data/roadmaps/data-analyst/content/data-transformation@t_BRtEharsrOZxoyX0OzV.md
@@ -2,5 +2,7 @@
 
 Data Transformation, also known as Data Wrangling, is an essential part of a Data Analyst's role. This process involves the conversion of data from a raw format into another format to make it more appropriate and valuable for a variety of downstream purposes such as analytics. Data Analysts transform data to make the data more suitable for analysis, ensure accuracy, and to improve data quality. The right transformation techniques can give the data a structure, multiply its value, and enhance the accuracy of the analytics performed by serving meaningful results.
 
+Learn more from the following resources:
+
 - [@article@What is data transformation?](https://www.qlik.com/us/data-management/data-transformation)
 - [@feed@Explore top posts about Data Analysis](https://app.daily.dev/tags/data-analysis?ref=roadmapsh)
diff --git a/src/data/roadmaps/data-analyst/content/data-visualisation-libraries@l1SnPc4EMqGdaIAhIQfrT.md b/src/data/roadmaps/data-analyst/content/data-visualisation-libraries@l1SnPc4EMqGdaIAhIQfrT.md
index 9c28a83ea..cad2c533e 100644
--- a/src/data/roadmaps/data-analyst/content/data-visualisation-libraries@l1SnPc4EMqGdaIAhIQfrT.md
+++ b/src/data/roadmaps/data-analyst/content/data-visualisation-libraries@l1SnPc4EMqGdaIAhIQfrT.md
@@ -1,3 +1,5 @@
-# Data Visualisation Libraries
+# Data Visualization Libraries
 
-Data visualization libraries are crucial in data science for transforming complex datasets into clear and interpretable visual representations, facilitating better understanding and communication of data insights. In Python, several libraries are widely used for this purpose. Matplotlib is a foundational library that offers comprehensive tools for creating static, animated, and interactive plots. Seaborn, built on top of Matplotlib, provides a high-level interface for drawing attractive and informative statistical graphics with minimal code. Plotly is another powerful library that allows for the creation of interactive and dynamic visualizations, which can be easily embedded in web applications. Additionally, libraries like Bokeh and Altair offer capabilities for creating interactive plots and dashboards, enhancing exploratory data analysis and the presentation of data findings. Together, these libraries enable data scientists to effectively visualize trends, patterns, and outliers in their data, making the analysis more accessible and actionable.
\ No newline at end of file
+Data visualization libraries are crucial in data science for transforming complex datasets into clear and interpretable visual representations, facilitating better understanding and communication of data insights. In Python, several libraries are widely used for this purpose. Matplotlib is a foundational library that offers comprehensive tools for creating static, animated, and interactive plots. Seaborn, built on top of Matplotlib, provides a high-level interface for drawing attractive and informative statistical graphics with minimal code. Plotly is another powerful library that allows for the creation of interactive and dynamic visualizations, which can be easily embedded in web applications. Additionally, libraries like Bokeh and Altair offer capabilities for creating interactive plots and dashboards, enhancing exploratory data analysis and the presentation of data findings. Together, these libraries enable data scientists to effectively visualize trends, patterns, and outliers in their data, making the analysis more accessible and actionable.
+
+Learn more from the following resources:
diff --git a/src/data/roadmaps/data-analyst/content/data-visualisation@2g19zjEASJw2ve57hxpr0.md b/src/data/roadmaps/data-analyst/content/data-visualisation@2g19zjEASJw2ve57hxpr0.md
index 1a1b59ed5..0cd3f4518 100644
--- a/src/data/roadmaps/data-analyst/content/data-visualisation@2g19zjEASJw2ve57hxpr0.md
+++ b/src/data/roadmaps/data-analyst/content/data-visualisation@2g19zjEASJw2ve57hxpr0.md
@@ -1,3 +1,7 @@
 # Data Visualization
 
-Data Visualization is a fundamental fragment of the responsibilities of a data analyst. It involves the presentation of data in a graphical or pictorial format which allows decision-makers to see analytics visually. This practice can help them comprehend difficult concepts or establish new patterns. With interactive visualization, data analysts can take the data analysis process to a whole new level — drill down into charts and graphs for more detail, and interactively changing what data is presented or how it’s processed. Thereby it forms a crucial link in the chain of converting raw data to actionable insights which is one of the primary roles of a Data Analyst.
\ No newline at end of file
+Data Visualization is a fundamental fragment of the responsibilities of a data analyst. It involves the presentation of data in a graphical or pictorial format which allows decision-makers to see analytics visually. This practice can help them comprehend difficult concepts or establish new patterns. With interactive visualization, data analysts can take the data analysis process to a whole new level — drill down into charts and graphs for more detail, and interactively changing what data is presented or how it’s processed. Thereby it forms a crucial link in the chain of converting raw data to actionable insights which is one of the primary roles of a Data Analyst.
+
+Learn more from the following resources:
+
+- [@article@What is Data Visualization?](https://www.ibm.com/think/topics/data-visualization)
diff --git a/src/data/roadmaps/data-analyst/content/databases@tYPeLCxbqvMFlTkCGjdHg.md b/src/data/roadmaps/data-analyst/content/databases@tYPeLCxbqvMFlTkCGjdHg.md
index 68787c059..d532dccff 100644
--- a/src/data/roadmaps/data-analyst/content/databases@tYPeLCxbqvMFlTkCGjdHg.md
+++ b/src/data/roadmaps/data-analyst/content/databases@tYPeLCxbqvMFlTkCGjdHg.md
@@ -4,5 +4,5 @@ Behind every strong data analyst, there's not just a rich assortment of data, bu
 
 Learn more from the following resources:
 
-- [@official@PostgreSQL Roadmap](https://roadmap.sh/postgresql-dba)
-- [@official@MongoDB Roadmap](https://roadmap.sh/mongodb)
\ No newline at end of file
+- [@roadmap@Visit Dedicated SQL Roadmap](https://roadmap.sh/sql)
+- [@roadmap@Visit Dedicated PostgreSQL Roadmap](https://roadmap.sh/postgresql-dba)
diff --git a/src/data/roadmaps/data-analyst/content/datedif@yBlJrNo9eO470dLp6OaQZ.md b/src/data/roadmaps/data-analyst/content/datedif@yBlJrNo9eO470dLp6OaQZ.md
index 8b613e6bf..49dffdf7f 100644
--- a/src/data/roadmaps/data-analyst/content/datedif@yBlJrNo9eO470dLp6OaQZ.md
+++ b/src/data/roadmaps/data-analyst/content/datedif@yBlJrNo9eO470dLp6OaQZ.md
@@ -2,7 +2,7 @@
 
 The `DATEDIF` function is an incredibly valuable tool for a Data Analyst in Excel or Google Sheets, by providing the ability to calculate the difference between two dates. This function takes in three parameters: start date, end date and the type of difference required (measured in years, months, days, etc.). In Data Analysis, particularly when dealing with time-series data or when you need to uncover trends over specific periods, the `DATEDIF` function is a necessary asset. Recognizing its functionality will enable a data analyst to manipulate or shape data progressively and efficiently.
 
-* `DATEDIF` is technically still supported, but wont show as an option. For additional information, see Excel "Help" page.
+`DATEDIF` is technically still supported, but wont show as an option. For additional information, see Excel "Help" page.
 
 Learn more from the following resources:
 
diff --git a/src/data/roadmaps/data-analyst/content/deep-learning-optional@SiYUdtYMDImRPmV2_XPkH.md b/src/data/roadmaps/data-analyst/content/deep-learning-optional@SiYUdtYMDImRPmV2_XPkH.md
index a9af1484c..ee63c6640 100644
--- a/src/data/roadmaps/data-analyst/content/deep-learning-optional@SiYUdtYMDImRPmV2_XPkH.md
+++ b/src/data/roadmaps/data-analyst/content/deep-learning-optional@SiYUdtYMDImRPmV2_XPkH.md
@@ -1,3 +1,7 @@
 # Deep Learning and Data Analysis 
 
-Deep learning, a subset of machine learning technique, is increasingly becoming a critical tool for data analysts. Deep learning algorithms utilize multiple layers of neural networks to understand and interpret intricate structures in large data, a skill that is integral to the daily functions of a data analyst. With the ability to learn from unstructured or unlabeled data, deep learning opens a whole new range of possibilities for data analysts in terms of data processing, prediction, and categorization. It has applications in a variety of industries from healthcare to finance to e-commerce and beyond. A deeper understanding of deep learning methodologies can augment a data analyst's capability to evaluate and interpret complex datasets and provide valuable insights for decision making.
\ No newline at end of file
+Deep learning, a subset of machine learning technique, is increasingly becoming a critical tool for data analysts. Deep learning algorithms utilize multiple layers of neural networks to understand and interpret intricate structures in large data, a skill that is integral to the daily functions of a data analyst. With the ability to learn from unstructured or unlabeled data, deep learning opens a whole new range of possibilities for data analysts in terms of data processing, prediction, and categorization. It has applications in a variety of industries from healthcare to finance to e-commerce and beyond. A deeper understanding of deep learning methodologies can augment a data analyst's capability to evaluate and interpret complex datasets and provide valuable insights for decision making.
+
+Learn more from the following resources:
+
+- [@article@Deep Learning for Data Analysis](https://www.ibm.com/think/topics/deep-learning)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/dplyr@v8TfY-b4W5ygOv7r-syHq.md b/src/data/roadmaps/data-analyst/content/dplyr@v8TfY-b4W5ygOv7r-syHq.md
index d1be37cfc..a3e5688cf 100644
--- a/src/data/roadmaps/data-analyst/content/dplyr@v8TfY-b4W5ygOv7r-syHq.md
+++ b/src/data/roadmaps/data-analyst/content/dplyr@v8TfY-b4W5ygOv7r-syHq.md
@@ -4,5 +4,5 @@ Data cleaning plays a crucial role in the data analysis pipeline, where it recti
 
 Learn more from the following resources:
 
-- [@official@dplyr website](https://dplyr.tidyverse.org/)
+- [@official@dplyr](https://dplyr.tidyverse.org/)
 - [@video@Dplyr Essentials](https://www.youtube.com/watch?v=Gvhkp-Yw65U)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/dplyr@y__UHXe2DD-IB7bvMF1-X.md b/src/data/roadmaps/data-analyst/content/dplyr@y__UHXe2DD-IB7bvMF1-X.md
index 57ede3dec..3e575b264 100644
--- a/src/data/roadmaps/data-analyst/content/dplyr@y__UHXe2DD-IB7bvMF1-X.md
+++ b/src/data/roadmaps/data-analyst/content/dplyr@y__UHXe2DD-IB7bvMF1-X.md
@@ -4,5 +4,5 @@ Dplyr is a powerful and popular toolkit for data manipulation in R. As a data an
 
 Learn more from the following resources:
 
-- [@official@dplyr website](https://dplyr.tidyverse.org/)
+- [@official@dplyr](https://dplyr.tidyverse.org/)
 - [@video@Dplyr Essentials](https://www.youtube.com/watch?v=Gvhkp-Yw65U)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/finding-outliers@-rQ8h_6NFxEOhxXgo7LHo.md b/src/data/roadmaps/data-analyst/content/finding-outliers@-rQ8h_6NFxEOhxXgo7LHo.md
index 3cac6dd7f..00fd255cd 100644
--- a/src/data/roadmaps/data-analyst/content/finding-outliers@-rQ8h_6NFxEOhxXgo7LHo.md
+++ b/src/data/roadmaps/data-analyst/content/finding-outliers@-rQ8h_6NFxEOhxXgo7LHo.md
@@ -4,4 +4,4 @@ In the field of data analysis, data cleaning is an essential and preliminary ste
 
 Visit the following resources to learn more:
 
-- [@article@Outliers]([https://www.mathsisfun.com/data/outliers.html)
+- [@article@Outliers](https://www.mathsisfun.com/data/outliers.html)
diff --git a/src/data/roadmaps/data-analyst/content/ggplot2@E0hIgQEeZlEidr4HtUFrL.md b/src/data/roadmaps/data-analyst/content/ggplot2@E0hIgQEeZlEidr4HtUFrL.md
index e5c96fa9b..20cd3eb37 100644
--- a/src/data/roadmaps/data-analyst/content/ggplot2@E0hIgQEeZlEidr4HtUFrL.md
+++ b/src/data/roadmaps/data-analyst/content/ggplot2@E0hIgQEeZlEidr4HtUFrL.md
@@ -1,8 +1,8 @@
-# ggplot2 
+# ggplot2
 
 When it comes to data visualization in R programming, ggplot2 stands tall as one of the primary tools for data analysts. This data visualization library, which forms part of the tidyverse suite of packages, facilitates the creation of complex and sophisticated visual narratives. With its grammar of graphics philosophy, ggplot2 enables analysts to build graphs and charts layer by layer, thereby offering detailed control over graphical features and design. Its versatility in creating tailored and aesthetically pleasing graphics is a vital asset for any data analyst tackling exploratory data analysis, reporting, or dashboard building.
 
 Learn more from the following resources:
 
-- [@article@ggplot2 website](https://ggplot2.tidyverse.org/)
+- [@official@ggplot2](https://ggplot2.tidyverse.org/)
 - [@video@Make beautiful graphs in R](https://www.youtube.com/watch?v=qnw1xDnt_Ec)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/hadoop@wECWIRMlWNoTxz5eKwaSf.md b/src/data/roadmaps/data-analyst/content/hadoop@wECWIRMlWNoTxz5eKwaSf.md
index cecdeccab..4f007ce6f 100644
--- a/src/data/roadmaps/data-analyst/content/hadoop@wECWIRMlWNoTxz5eKwaSf.md
+++ b/src/data/roadmaps/data-analyst/content/hadoop@wECWIRMlWNoTxz5eKwaSf.md
@@ -1,8 +1,8 @@
-# Hadoop 
+# Hadoop
 
 Hadoop is a critical element in the realm of data processing frameworks, offering an effective solution for storing, managing, and analyzing massive amounts of data. Unraveling meaningful insights from a large deluge of data is a challenging pursuit faced by many data analysts. Regular data processing tools fail to handle large-scale data, paving the way for advanced frameworks like Hadoop. This open-source platform by Apache Software Foundation excels at storing and processing vast data across clusters of computers. Notably, Hadoop comprises two key modules - the Hadoop Distributed File System (HDFS) for storage and MapReduce for processing. Hadoop’s ability to handle both structured and unstructured data further broadens its capacity. For any data analyst, a thorough understanding of Hadoop can unlock powerful ways to manage data effectively and construct meaningful analytics.
 
 Learn more from the following resources:
 
-- [@official@Apache Hadoop Website](https://hadoop.apache.org/)
+- [@official@Apache Hadoop](https://hadoop.apache.org/)
 - [@article@What Is Hadoop?](https://www.databricks.com/glossary/hadoop)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/heatmap@G8resQXEVEHCaQfDlt3nj.md b/src/data/roadmaps/data-analyst/content/heatmap@G8resQXEVEHCaQfDlt3nj.md
index f54dbe442..986371acc 100644
--- a/src/data/roadmaps/data-analyst/content/heatmap@G8resQXEVEHCaQfDlt3nj.md
+++ b/src/data/roadmaps/data-analyst/content/heatmap@G8resQXEVEHCaQfDlt3nj.md
@@ -4,5 +4,5 @@ Heatmaps are a crucial component of data visualization that Data Analysts regula
 
 Learn more from the following resources:
 
-- [@article@A complete guide to heatmaps](https://www.hotjar.com/heatmaps/)
-- [@article@What is a heatmap?](https://www.atlassian.com/data/charts/heatmap-complete-guide)
\ No newline at end of file
+- [@article@A Complete Guide to Heatmaps](https://www.hotjar.com/heatmaps/)
+- [@article@What is a Heatmap?](https://www.atlassian.com/data/charts/heatmap-complete-guide)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/image-recognition@bHPJ6yOHtUq5EjJBSrJUE.md b/src/data/roadmaps/data-analyst/content/image-recognition@bHPJ6yOHtUq5EjJBSrJUE.md
index 3c7896d62..11bf2b190 100644
--- a/src/data/roadmaps/data-analyst/content/image-recognition@bHPJ6yOHtUq5EjJBSrJUE.md
+++ b/src/data/roadmaps/data-analyst/content/image-recognition@bHPJ6yOHtUq5EjJBSrJUE.md
@@ -4,5 +4,5 @@ Image Recognition has become a significant domain because of its diverse applica
 
 Learn more from the following resources:
 
-- [@article@What is image recognition?](https://www.techtarget.com/searchenterpriseai/definition/image-recognition)
+- [@article@What is Image Recognition?](https://www.techtarget.com/searchenterpriseai/definition/image-recognition)
 - [@article@Image Recognition: Definition, Algorithms & Uses](https://www.v7labs.com/blog/image-recognition-guide)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/matplotlib@tvDdXwaRPsUSTqJGaLS3P.md b/src/data/roadmaps/data-analyst/content/matplotlib@tvDdXwaRPsUSTqJGaLS3P.md
index 8fb1af9ee..b7932c55f 100644
--- a/src/data/roadmaps/data-analyst/content/matplotlib@tvDdXwaRPsUSTqJGaLS3P.md
+++ b/src/data/roadmaps/data-analyst/content/matplotlib@tvDdXwaRPsUSTqJGaLS3P.md
@@ -1,8 +1,8 @@
-# Matplotlib 
+# Matplotlib
 
 For a Data Analyst, understanding data and being able to represent it in a visually insightful form is a crucial part of effective decision-making in any organization. Matplotlib, a plotting library for the Python programming language, is an extremely useful tool for this purpose. It presents a versatile framework for generating line plots, scatter plots, histogram, bar charts and much more in a very straightforward manner. This library also allows for comprehensive customizations, offering a high level of control over the look and feel of the graphics it produces, which ultimately enhances the quality of data interpretation and communication.
 
 Learn more from the following resources:
 
-- [@video@Learn Matplotlib in 6 minutes](https://www.youtube.com/watch?v=nzKy9GY12yo)
-- [@article@Matplotlib Website](https://matplotlib.org/)
\ No newline at end of file
+- [@official@Matplotlib](https://matplotlib.org/)
+- [@video@Learn Matplotlib in 6 minutes](https://www.youtube.com/watch?v=nzKy9GY12yo)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/matplotlib@uGkXxdMXUMY-3fQFS1jK8.md b/src/data/roadmaps/data-analyst/content/matplotlib@uGkXxdMXUMY-3fQFS1jK8.md
index 64c64e65a..d4d612457 100644
--- a/src/data/roadmaps/data-analyst/content/matplotlib@uGkXxdMXUMY-3fQFS1jK8.md
+++ b/src/data/roadmaps/data-analyst/content/matplotlib@uGkXxdMXUMY-3fQFS1jK8.md
@@ -4,5 +4,5 @@ Matplotlib is a paramount data visualization library used extensively by data an
 
 Learn more from the following resources:
 
-- [@video@Learn Matplotlib in 6 minutes](https://www.youtube.com/watch?v=nzKy9GY12yo)
-- [@article@Matplotlib Website](https://matplotlib.org/)
\ No newline at end of file
+- [@official@Matplotlib](https://matplotlib.org/)
+- [@video@Learn Matplotlib in 6 minutes](https://www.youtube.com/watch?v=nzKy9GY12yo)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/mode@fY8zVG2tVbmtx5OhY7hj-.md b/src/data/roadmaps/data-analyst/content/mode@fY8zVG2tVbmtx5OhY7hj-.md
index 8cf1b0abc..c31de880b 100644
--- a/src/data/roadmaps/data-analyst/content/mode@fY8zVG2tVbmtx5OhY7hj-.md
+++ b/src/data/roadmaps/data-analyst/content/mode@fY8zVG2tVbmtx5OhY7hj-.md
@@ -2,7 +2,7 @@
 
 The concept of central tendency is fundamental in statistics and has numerous applications in data analysis. From a data analyst's perspective, the central tendencies like mean, median, and mode can be highly informative about the nature of data. Among these, the "Mode" is often underappreciated, yet it plays an essential role in interpreting datasets.
 
-The mode, in essence, represents the most frequently occurring value in a dataset. While it may appear simplistic, the mode's ability to identify the most common value can be instrumental in a wide range of scenarios, like market research, customer behavior analysis, or trend identification. For instance, a data analyst can use the mode to determine the most popular product in a sales dataset or identify the most commonly reported bug in a software bug log. 
+The mode, in essence, represents the most frequently occurring value in a dataset. While it may appear simplistic, the mode's ability to identify the most common value can be instrumental in a wide range of scenarios, like market research, customer behavior analysis, or trend identification. For instance, a data analyst can use the mode to determine the most popular product in a sales dataset or identify the most commonly reported bug in a software bug log.
 
 Beyond these, utilizing the mode along with the other measures of central tendency (mean and median) can provide a more rounded view of your data. This approach personifies the diversity that's often required in data analytic strategies to account for different data distributions and outliers. The mode, therefore, forms an integral part of the data analyst's toolkit for statistical data interpretation.
 
diff --git a/src/data/roadmaps/data-analyst/content/model-evaluation-techniques@7ikA373qH88HBx5irCgIH.md b/src/data/roadmaps/data-analyst/content/model-evaluation-techniques@7ikA373qH88HBx5irCgIH.md
index 81f7145c0..455de0591 100644
--- a/src/data/roadmaps/data-analyst/content/model-evaluation-techniques@7ikA373qH88HBx5irCgIH.md
+++ b/src/data/roadmaps/data-analyst/content/model-evaluation-techniques@7ikA373qH88HBx5irCgIH.md
@@ -4,5 +4,5 @@ As a data analyst, it's crucial to understand various model evaluation technique
 
 Learn more from the following resources:
 
-- [@article@What is model evaluation](https://domino.ai/data-science-dictionary/model-evaluation)
-- [@article@Model evaluation metrics](https://www.markovml.com/blog/model-evaluation-metrics)
\ No newline at end of file
+- [@article@What is Model Evaluation](https://domino.ai/data-science-dictionary/model-evaluation)
+- [@article@Model Evaluation Metrics](https://www.markovml.com/blog/model-evaluation-metrics)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/neural-networks@gGHsKcS92StK5FolzmVvm.md b/src/data/roadmaps/data-analyst/content/neural-networks@gGHsKcS92StK5FolzmVvm.md
index 3eb852182..6d8e9d4d5 100644
--- a/src/data/roadmaps/data-analyst/content/neural-networks@gGHsKcS92StK5FolzmVvm.md
+++ b/src/data/roadmaps/data-analyst/content/neural-networks@gGHsKcS92StK5FolzmVvm.md
@@ -4,5 +4,5 @@ Neural Networks play a pivotal role in the landscape of deep learning, offering
 
 Learn more from the following resources:
 
-- [@article@What is a neural network?](https://aws.amazon.com/what-is/neural-network/)
+- [@article@What is a Neural Network?](https://aws.amazon.com/what-is/neural-network/)
 - [@article@Explained: Neural networks](https://news.mit.edu/2017/explained-neural-networks-deep-learning-0414)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/pandas@8OXmF2Gn6TYJotBRvDjqA.md b/src/data/roadmaps/data-analyst/content/pandas@8OXmF2Gn6TYJotBRvDjqA.md
index 11434323b..aa0054af8 100644
--- a/src/data/roadmaps/data-analyst/content/pandas@8OXmF2Gn6TYJotBRvDjqA.md
+++ b/src/data/roadmaps/data-analyst/content/pandas@8OXmF2Gn6TYJotBRvDjqA.md
@@ -4,5 +4,5 @@ Pandas is a widely acknowledged and highly useful data manipulation library in t
 
 Learn more from the following resources:
 
-- [@official@Pandas Website](https://pandas.pydata.org/)
+- [@official@Pandas](https://pandas.pydata.org/)
 - [@video@NumPy vs Pandas](https://www.youtube.com/watch?v=KHoEbRH46Zk)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/pandas@TucngXKNptbeo3PtdJHX8.md b/src/data/roadmaps/data-analyst/content/pandas@TucngXKNptbeo3PtdJHX8.md
index c55ac6d4e..169d59896 100644
--- a/src/data/roadmaps/data-analyst/content/pandas@TucngXKNptbeo3PtdJHX8.md
+++ b/src/data/roadmaps/data-analyst/content/pandas@TucngXKNptbeo3PtdJHX8.md
@@ -4,5 +4,5 @@ In the realms of data analysis, data cleaning is a crucial preliminary process,
 
 Learn more from the following resources:
 
-- [@official@Pandas Website](https://pandas.pydata.org/)
+- [@official@Pandas](https://pandas.pydata.org/)
 - [@video@NumPy vs Pandas](https://www.youtube.com/watch?v=KHoEbRH46Zk)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/pie-charts@K9xwm_Vpdup9ujYqlD9F3.md b/src/data/roadmaps/data-analyst/content/pie-charts@K9xwm_Vpdup9ujYqlD9F3.md
index 0cd9a1b24..f11cb736d 100644
--- a/src/data/roadmaps/data-analyst/content/pie-charts@K9xwm_Vpdup9ujYqlD9F3.md
+++ b/src/data/roadmaps/data-analyst/content/pie-charts@K9xwm_Vpdup9ujYqlD9F3.md
@@ -1,8 +1,8 @@
-# Pie Chart 
+# Pie Chart
 
 As a data analyst, understanding and efficiently using various forms of data visualization is crucial. Among these, Pie Charts represent a significant tool. Essentially, pie charts are circular statistical graphics divided into slices to illustrate numerical proportions. Each slice of the pie corresponds to a particular category. The pie chart's beauty lies in its simplicity and visual appeal, making it an effective way to convey relative proportions or percentages at a glance. For a data analyst, it's particularly useful when you want to show a simple distribution of categorical data. Like any tool, though, it's important to use pie charts wisely—ideally, when your data set has fewer than seven categories, and the proportions between categories are distinct.
 
 Learn more from the following resources:
 
-- [@video@What is a a pie chart](https://www.youtube.com/watch?v=GjJdZaQrItg)
-- [@article@A complete guide to pie charts](https://www.atlassian.com/data/charts/pie-chart-complete-guide)
\ No newline at end of file
+- [@video@What is a Pie Chart](https://www.youtube.com/watch?v=GjJdZaQrItg)
+- [@article@A Complete Guide to Pie Charts](https://www.atlassian.com/data/charts/pie-chart-complete-guide)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/pivot-tables@2DDJUFr0AJTVR2Whj8zub.md b/src/data/roadmaps/data-analyst/content/pivot-tables@2DDJUFr0AJTVR2Whj8zub.md
index d0a3cb959..96e669754 100644
--- a/src/data/roadmaps/data-analyst/content/pivot-tables@2DDJUFr0AJTVR2Whj8zub.md
+++ b/src/data/roadmaps/data-analyst/content/pivot-tables@2DDJUFr0AJTVR2Whj8zub.md
@@ -4,6 +4,6 @@ Data Analysts recurrently find the need to summarize, investigate, and analyze t
 
 Learn more from the following resources:
 
-- [@articles@Create a pivot table](https://support.microsoft.com/en-gb/office/create-a-pivottable-to-analyze-worksheet-data-a9a84538-bfe9-40a9-a8e9-f99134456576)
-- [@article@Pivot tables in excel](https://www.excel-easy.com/data-analysis/pivot-tables.html)
-- [@video@How to create a pivot table in excel](https://www.youtube.com/watch?v=PdJzy956wo4)
\ No newline at end of file
+- [@articles@Create a Pivot Table](https://support.microsoft.com/en-gb/office/create-a-pivottable-to-analyze-worksheet-data-a9a84538-bfe9-40a9-a8e9-f99134456576)
+- [@article@Pivot Tables in Excel](https://www.excel-easy.com/data-analysis/pivot-tables.html)
+- [@video@How to Create a Pivot Table in Excel](https://www.youtube.com/watch?v=PdJzy956wo4)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/power-bi@SJLeose5vZU8w_18C8_t0.md b/src/data/roadmaps/data-analyst/content/power-bi@SJLeose5vZU8w_18C8_t0.md
index d716d307d..0dfdb062e 100644
--- a/src/data/roadmaps/data-analyst/content/power-bi@SJLeose5vZU8w_18C8_t0.md
+++ b/src/data/roadmaps/data-analyst/content/power-bi@SJLeose5vZU8w_18C8_t0.md
@@ -4,5 +4,5 @@ PowerBI, an interactive data visualization and business analytics tool developed
 
 Learn more from the following resources:
 
-- [@official@Power BI Website](https://www.microsoft.com/en-us/power-platform/products/power-bi)
+- [@official@Power BI](https://www.microsoft.com/en-us/power-platform/products/power-bi)
 - [@video@Power BI for beginners](https://www.youtube.com/watch?v=NNSHu0rkew8)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/predictive-analytics@3WZORRCwme3HsaKew23Z5.md b/src/data/roadmaps/data-analyst/content/predictive-analytics@3WZORRCwme3HsaKew23Z5.md
index a60c7d208..2b2016787 100644
--- a/src/data/roadmaps/data-analyst/content/predictive-analytics@3WZORRCwme3HsaKew23Z5.md
+++ b/src/data/roadmaps/data-analyst/content/predictive-analytics@3WZORRCwme3HsaKew23Z5.md
@@ -4,5 +4,5 @@ Predictive analysis is a crucial type of data analytics that any competent data
 
 Learn more from the following resources:
 
-- [@video@What is predictive analytics?](https://www.youtube.com/watch?v=cVibCHRSxB0)
-- [@article@What is predictive analytics? - Google](https://cloud.google.com/learn/what-is-predictive-analytics)
\ No newline at end of file
+- [@video@What is Predictive Analytics?](https://www.youtube.com/watch?v=cVibCHRSxB0)
+- [@article@What is Predictive Analytics? - Google](https://cloud.google.com/learn/what-is-predictive-analytics)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/pytorch@LJSqfz6aYJbCe_bK8EWI1.md b/src/data/roadmaps/data-analyst/content/pytorch@LJSqfz6aYJbCe_bK8EWI1.md
index 36e838043..62c8a7b35 100644
--- a/src/data/roadmaps/data-analyst/content/pytorch@LJSqfz6aYJbCe_bK8EWI1.md
+++ b/src/data/roadmaps/data-analyst/content/pytorch@LJSqfz6aYJbCe_bK8EWI1.md
@@ -4,5 +4,6 @@ PyTorch, an open-source machine learning library, has gained considerable popula
 
 Learn more from the following resources:
 
-- [@official@PyTorch Website](https://pytorch.org/)
+- [@official@PyTorch](https://pytorch.org/)
+- [@official@PyTorch Documentation](https://pytorch.org/docs/stable/index.html)
 - [@video@PyTorch in 100 seconds](https://www.youtube.com/watch?v=ORMx45xqWkA)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/range@tSxtyJhL5wjU0XJcjsJmm.md b/src/data/roadmaps/data-analyst/content/range@tSxtyJhL5wjU0XJcjsJmm.md
index 5f8c24d01..de8f7dd18 100644
--- a/src/data/roadmaps/data-analyst/content/range@tSxtyJhL5wjU0XJcjsJmm.md
+++ b/src/data/roadmaps/data-analyst/content/range@tSxtyJhL5wjU0XJcjsJmm.md
@@ -4,4 +4,4 @@ The concept of Range refers to the spread of a dataset, primarily in the realm o
 
 Learn more from the following resources:
 
-- [@article@How to find the range of a data set](https://www.scribbr.co.uk/stats/range-statistics/)
\ No newline at end of file
+- [@article@How to Find the Range of a Data Set](https://www.scribbr.co.uk/stats/range-statistics/)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/replace--substitute@dke_pySrqYZZ7K3rprnIT.md b/src/data/roadmaps/data-analyst/content/replace--substitute@dke_pySrqYZZ7K3rprnIT.md
index 6ff262270..3403da549 100644
--- a/src/data/roadmaps/data-analyst/content/replace--substitute@dke_pySrqYZZ7K3rprnIT.md
+++ b/src/data/roadmaps/data-analyst/content/replace--substitute@dke_pySrqYZZ7K3rprnIT.md
@@ -8,5 +8,5 @@ The REPLACE function is used to replace part of a text string with another text
 
 Learn more from the following resources:
 
-- [@article@Replace Function](https://support.microsoft.com/en-us/office/replace-function-6acf209b-01b7-4078-b4b8-e0a4ef67d181)
+- [@article@Replace Function](https://support.microsoft.com/en-us/office/replace-function-8d799074-2425-4a8a-84bc-82472868878a)
 - [@article@Substitute Function](https://support.microsoft.com/en-us/office/substitute-function-6434944e-a904-4336-a9b0-1e58df3bc332)
diff --git a/src/data/roadmaps/data-analyst/content/rnn@Gocm98_tRg5BGxKcP-7zg.md b/src/data/roadmaps/data-analyst/content/rnn@Gocm98_tRg5BGxKcP-7zg.md
index 267a9e499..8d1965fc3 100644
--- a/src/data/roadmaps/data-analyst/content/rnn@Gocm98_tRg5BGxKcP-7zg.md
+++ b/src/data/roadmaps/data-analyst/content/rnn@Gocm98_tRg5BGxKcP-7zg.md
@@ -6,5 +6,5 @@ A data analyst leveraging RNNs can effectively charter the intrinsic complexity
 
 Learn more from the following resources:
 
-- [@article@What is a recurrent neural network (RNN)?](https://www.ibm.com/topics/recurrent-neural-networks)
-- [@article@Recurrent Neural Networks cheatsheet](https://stanford.edu/~shervine/teaching/cs-230/cheatsheet-recurrent-neural-networks)
\ No newline at end of file
+- [@article@What is a Recurrent Neural Network (RNN)?](https://www.ibm.com/topics/recurrent-neural-networks)
+- [@article@Recurrent Neural Networks Cheat-sheet](https://stanford.edu/~shervine/teaching/cs-230/cheatsheet-recurrent-neural-networks)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/scatter-plot@A5YQv7D4qRcskdZ64XldH.md b/src/data/roadmaps/data-analyst/content/scatter-plot@A5YQv7D4qRcskdZ64XldH.md
index a8bddcefd..5b7f12bbd 100644
--- a/src/data/roadmaps/data-analyst/content/scatter-plot@A5YQv7D4qRcskdZ64XldH.md
+++ b/src/data/roadmaps/data-analyst/content/scatter-plot@A5YQv7D4qRcskdZ64XldH.md
@@ -4,5 +4,5 @@ A scatter plot, a crucial aspect of data visualization, is a mathematical diagra
 
 Learn more from the following resources:
 
-- [@article@Mastering scatter plots](https://www.atlassian.com/data/charts/what-is-a-scatter-plot)
+- [@article@Mastering Scatter Plots](https://www.atlassian.com/data/charts/what-is-a-scatter-plot)
 - [@video@Scatter Graphs: What are they and how to plot them](https://www.youtube.com/watch?v=Vyg9qmBsgAc)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/seaborn@-cJb8gEBvdVFf7FlgG3Ud.md b/src/data/roadmaps/data-analyst/content/seaborn@-cJb8gEBvdVFf7FlgG3Ud.md
index 05c9d1ae1..f0d09f5e3 100644
--- a/src/data/roadmaps/data-analyst/content/seaborn@-cJb8gEBvdVFf7FlgG3Ud.md
+++ b/src/data/roadmaps/data-analyst/content/seaborn@-cJb8gEBvdVFf7FlgG3Ud.md
@@ -4,5 +4,5 @@ Seaborn is a robust, comprehensive Python library focused on the creation of inf
 
 Learn more from the following resources:
 
-- [@official@Seaborn Website](https://seaborn.pydata.org/)
+- [@official@Seaborn](https://seaborn.pydata.org/)
 - [@video@Seaborn Tutorial : Seaborn Full Course](https://www.youtube.com/watch?v=6GUZXDef2U0)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/spark@vaiigToDh4522rtWamuSM.md b/src/data/roadmaps/data-analyst/content/spark@vaiigToDh4522rtWamuSM.md
index 63cfa6f38..a626ac638 100644
--- a/src/data/roadmaps/data-analyst/content/spark@vaiigToDh4522rtWamuSM.md
+++ b/src/data/roadmaps/data-analyst/content/spark@vaiigToDh4522rtWamuSM.md
@@ -4,5 +4,5 @@ As a big data processing framework, Apache Spark showcases immense importance in
 
 Learn more from the following resources:
 
-- [@official@Apache Spark Website](https://spark.apache.org/)
+- [@official@Apache Spark](https://spark.apache.org/)
 - [@opensource@apache/spark](https://github.com/apache/spark)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/stacked-charts@329BrtmXjXNLfi1SFfdeo.md b/src/data/roadmaps/data-analyst/content/stacked-charts@329BrtmXjXNLfi1SFfdeo.md
index 52252d4dc..626482a47 100644
--- a/src/data/roadmaps/data-analyst/content/stacked-charts@329BrtmXjXNLfi1SFfdeo.md
+++ b/src/data/roadmaps/data-analyst/content/stacked-charts@329BrtmXjXNLfi1SFfdeo.md
@@ -4,5 +4,5 @@ A stacked chart is an essential tool for a data analyst in the field of data vis
 
 Learn more from the following resources:
 
-- [@article@What is a stacked chart?](https://www.spotfire.com/glossary/what-is-a-stacked-chart)
+- [@article@What is a Stacked Chart?](https://www.spotfire.com/glossary/what-is-a-stacked-chart)
 - [@article@A Complete Guide to Stacked Bar Charts](https://www.atlassian.com/data/charts/stacked-bar-chart-complete-guide)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/statistical-analysis@TeewVruErSsD4VLXcaDxp.md b/src/data/roadmaps/data-analyst/content/statistical-analysis@TeewVruErSsD4VLXcaDxp.md
index 468dcbfa5..83c0a33fa 100644
--- a/src/data/roadmaps/data-analyst/content/statistical-analysis@TeewVruErSsD4VLXcaDxp.md
+++ b/src/data/roadmaps/data-analyst/content/statistical-analysis@TeewVruErSsD4VLXcaDxp.md
@@ -2,4 +2,7 @@
 
 Statistical analysis is a core component of a data analyst's toolkit. As professionals dealing with vast amount of structured and unstructured data, data analysts often turn to statistical methods to extract insights and make informed decisions. The role of statistical analysis in data analytics involves gathering, reviewing, and interpreting data for various applications, enabling businesses to understand their performance, trends, and growth potential. Data analysts use a range of statistical techniques from modeling, machine learning, and data mining, to convey vital information that supports strategic company actions.
 
-Learn more from the following resources:
\ No newline at end of file
+Learn more from the following resources:
+
+- [@article@Understanding Statistical Analysis](https://www.simplilearn.com/what-is-statistical-analysis-article)
+- [@video@Statistical Analysis](https://www.youtube.com/watch?v=XjMBZE1DuBY)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/supervised-learning@FIYCkGXofKMsXmsqHSMh9.md b/src/data/roadmaps/data-analyst/content/supervised-learning@FIYCkGXofKMsXmsqHSMh9.md
index 0adf84126..08fbed5fc 100644
--- a/src/data/roadmaps/data-analyst/content/supervised-learning@FIYCkGXofKMsXmsqHSMh9.md
+++ b/src/data/roadmaps/data-analyst/content/supervised-learning@FIYCkGXofKMsXmsqHSMh9.md
@@ -4,5 +4,5 @@ Supervised machine learning forms an integral part of the toolset for a Data Ana
 
 Learn more from the following resources:
 
-- [@article@What is supervised learning?](https://cloud.google.com/discover/what-is-supervised-learning)
+- [@article@What is Supervised Learning?](https://cloud.google.com/discover/what-is-supervised-learning)
 - [@article@Supervised Machine Learning](https://www.datacamp.com/blog/supervised-machine-learning)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/tableau@Sz2Y8HLbSmDjSKAJztDql.md b/src/data/roadmaps/data-analyst/content/tableau@Sz2Y8HLbSmDjSKAJztDql.md
index 9a309fb99..2a83ad586 100644
--- a/src/data/roadmaps/data-analyst/content/tableau@Sz2Y8HLbSmDjSKAJztDql.md
+++ b/src/data/roadmaps/data-analyst/content/tableau@Sz2Y8HLbSmDjSKAJztDql.md
@@ -4,5 +4,5 @@ Tableau is a powerful data visualization tool utilized extensively by data analy
 
 Learn more from the following resources:
 
-- [@official@Tableau Website](https://www.tableau.com/en-gb)
+- [@official@Tableau](https://www.tableau.com/en-gb)
 - [@video@What is Tableau?](https://www.youtube.com/watch?v=NLCzpPRCc7U)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/tensorflow@FJ4Sx477FWxyDsQr0R8rl.md b/src/data/roadmaps/data-analyst/content/tensorflow@FJ4Sx477FWxyDsQr0R8rl.md
index 90d31555b..1ed8ff766 100644
--- a/src/data/roadmaps/data-analyst/content/tensorflow@FJ4Sx477FWxyDsQr0R8rl.md
+++ b/src/data/roadmaps/data-analyst/content/tensorflow@FJ4Sx477FWxyDsQr0R8rl.md
@@ -4,5 +4,6 @@ TensorFlow, developed by Google Brain Team, has become a crucial tool in the rea
 
 Learn more from the following resources:
 
-- [@official@Tensorflow Website](https://www.tensorflow.org/)
+- [@official@Tensorflow](https://www.tensorflow.org/)
+- [@official@Tensorflow Documentation](https://www.tensorflow.org/learn)
 - [@video@Tensorflow in 100 seconds](https://www.youtube.com/watch?v=i8NETqtGHms)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/types-of-data-analytics@Lsapbmg-eMIYJAHpV97nO.md b/src/data/roadmaps/data-analyst/content/types-of-data-analytics@Lsapbmg-eMIYJAHpV97nO.md
index fa4eb4e6a..3e6069cb6 100644
--- a/src/data/roadmaps/data-analyst/content/types-of-data-analytics@Lsapbmg-eMIYJAHpV97nO.md
+++ b/src/data/roadmaps/data-analyst/content/types-of-data-analytics@Lsapbmg-eMIYJAHpV97nO.md
@@ -1,20 +1,16 @@
 # Introduction to Types of Data Analytics
 
-Data Analytics has proven to be a critical part of decision-making in modern business ventures. It is responsible for discovering, interpreting, and transforming data into valuable information. Different types of data analytics look at past, present, or predictive views of business operations. 
+Data Analytics has proven to be a critical part of decision-making in modern business ventures. It is responsible for discovering, interpreting, and transforming data into valuable information. Different types of data analytics look at past, present, or predictive views of business operations.
+
+Data Analysts, as ambassadors of this domain, employ these types, to answer various questions:
 
-Data Analysts, as ambassadors of this domain, employ these types, to answer various questions: 
 - Descriptive Analytics *(what happened in the past?)*
 - Diagnostic Analytics *(why did it happened in the past?)*
 - Predictive Analytics *(what will happen in the future?)*
 - Prescriptive Analytics *(how can we make it happen?)*
 
-Understanding these types gives data analysts the power to transform raw datasets into strategic insights.
-
 Visit the following resources to learn more:
 
-- [@article@Data Analytics and its type](https://www.geeksforgeeks.org/data-analytics-and-its-type/)
 - [@article@The 4 Types of Data Analysis: Ultimate Guide](https://careerfoundry.com/en/blog/data-analytics/different-types-of-data-analysis/)
 - [@video@Descriptive vs Diagnostic vs Predictive vs Prescriptive Analytics: What's the Difference?](https://www.youtube.com/watch?v=QoEpC7jUb9k)
 - [@video@Types of Data Analytics](https://www.youtube.com/watch?v=lsZnSgxMwBA)
-
-
diff --git a/src/data/roadmaps/data-analyst/content/unsupervised-learning@FntL9E2yVAYwIrlANDNKE.md b/src/data/roadmaps/data-analyst/content/unsupervised-learning@FntL9E2yVAYwIrlANDNKE.md
index 0e549e365..0fc84ff5e 100644
--- a/src/data/roadmaps/data-analyst/content/unsupervised-learning@FntL9E2yVAYwIrlANDNKE.md
+++ b/src/data/roadmaps/data-analyst/content/unsupervised-learning@FntL9E2yVAYwIrlANDNKE.md
@@ -4,5 +4,5 @@ Unsupervised learning, as a fundamental aspect of Machine Learning, holds great
 
 Learn more from the following resources:
 
-- [@article@What is unsupervised learning?](https://cloud.google.com/discover/what-is-unsupervised-learning)
-- [@article@Introduction to unsupervised learning](https://www.datacamp.com/blog/introduction-to-unsupervised-learning)
\ No newline at end of file
+- [@article@What is Unsupervised Learning?](https://cloud.google.com/discover/what-is-unsupervised-learning)
+- [@article@Introduction to Unsupervised Learning](https://www.datacamp.com/blog/introduction-to-unsupervised-learning)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/variance@ict4JkoVM-AzPbp9bDztg.md b/src/data/roadmaps/data-analyst/content/variance@ict4JkoVM-AzPbp9bDztg.md
index 31b3dab16..1cba7b6e0 100644
--- a/src/data/roadmaps/data-analyst/content/variance@ict4JkoVM-AzPbp9bDztg.md
+++ b/src/data/roadmaps/data-analyst/content/variance@ict4JkoVM-AzPbp9bDztg.md
@@ -4,5 +4,5 @@ Data analysts heavily rely on statistical concepts to analyze and interpret data
 
 Learn more from the following resources:
 
-- [@article@What is variance?](https://www.investopedia.com/terms/v/variance.asp)
-- [@article@How to calculate variance](https://www.scribbr.co.uk/stats/variance-meaning/)
\ No newline at end of file
+- [@article@What is Variance?](https://www.investopedia.com/terms/v/variance.asp)
+- [@article@How to Calculate Variance](https://www.scribbr.co.uk/stats/variance-meaning/)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/visualisation@jowh4CFLQiFzKaaElyCuQ.md b/src/data/roadmaps/data-analyst/content/visualisation@jowh4CFLQiFzKaaElyCuQ.md
index d05387efe..0e74649a8 100644
--- a/src/data/roadmaps/data-analyst/content/visualisation@jowh4CFLQiFzKaaElyCuQ.md
+++ b/src/data/roadmaps/data-analyst/content/visualisation@jowh4CFLQiFzKaaElyCuQ.md
@@ -5,4 +5,4 @@ The visualization of data is an essential skill in the toolkit of every data ana
 Learn more from the following resources:
 
 - [@video@Data Visualization in 2024](https://www.youtube.com/watch?v=loYuxWSsLNc)
-- [@article@Data visualization beginner's guide](https://www.tableau.com/en-gb/learn/articles/data-visualization)
+- [@article@Data Visualization Beginner's Guide](https://www.tableau.com/en-gb/learn/articles/data-visualization)
diff --git a/src/data/roadmaps/data-analyst/content/visualizing-distributions@mCUW07rx74_dUNi7OGVlj.md b/src/data/roadmaps/data-analyst/content/visualizing-distributions@mCUW07rx74_dUNi7OGVlj.md
index e0fb92951..060c12c6c 100644
--- a/src/data/roadmaps/data-analyst/content/visualizing-distributions@mCUW07rx74_dUNi7OGVlj.md
+++ b/src/data/roadmaps/data-analyst/content/visualizing-distributions@mCUW07rx74_dUNi7OGVlj.md
@@ -1,6 +1,6 @@
 # Visualising Distributions 
 
-Visualising Distributions, from a data analyst's perspective, plays a key role in understanding the overall distribution and identifying patterns within data. It aids in summarising, structuring, and plotting structured data graphically to provide essential insights. This includes using different chart types like bar graphs, histograms, and scatter plots for interval data, and pie or bar graphs for categorical data. Ultimately, the aim is to provide a straightforward and effective manner to comprehend the data's characteristics and underlying structure. A data analyst uses these visualisation techniques to make initial conclusions, detect anomalies, and decide on further analysis paths.
+Visualising Distributions, from a data analyst's perspective, plays a key role in understanding the overall distribution and identifying patterns within data. It aids in summarizing, structuring, and plotting structured data graphically to provide essential insights. This includes using different chart types like bar graphs, histograms, and scatter plots for interval data, and pie or bar graphs for categorical data. Ultimately, the aim is to provide a straightforward and effective manner to comprehend the data's characteristics and underlying structure. A data analyst uses these visualisation techniques to make initial conclusions, detect anomalies, and decide on further analysis paths.
 
 Learn more from the following resources:
 
diff --git a/src/data/roadmaps/data-analyst/content/vlookup--hlookup@9sIP-jpNjtA1JPCBjTf-H.md b/src/data/roadmaps/data-analyst/content/vlookup--hlookup@9sIP-jpNjtA1JPCBjTf-H.md
index e2f920a2d..bae508007 100644
--- a/src/data/roadmaps/data-analyst/content/vlookup--hlookup@9sIP-jpNjtA1JPCBjTf-H.md
+++ b/src/data/roadmaps/data-analyst/content/vlookup--hlookup@9sIP-jpNjtA1JPCBjTf-H.md
@@ -1,6 +1,6 @@
 # vlookup and hlookup
 
-Data Analysts often deal with large and complex datasets that require efficient tools for data manipulation and extraction. This is where basic functions like vlookup and hlookup in Excel become extremely useful. These functions are versatile lookup and reference functions that can find specified data in a vast array, providing ease and convenience in data retrieval tasks. 
+Data Analysts often deal with large and complex datasets that require efficient tools for data manipulation and extraction. This is where basic functions like vlookup and hlookup in Excel become extremely useful. These functions are versatile lookup and reference functions that can find specified data in a vast array, providing ease and convenience in data retrieval tasks.
 
 The Vertical Lookup (vlookup) is used to find data in a table sorted vertically, while the Horizontal Lookup (hlookup) is used on data organized horizontally. Mastering these functions is crucial for any data analyst's toolbox, as they can dramatically speed up data access, reduce errors in data extraction, and simplify the overall process of analysis. In essence, these two functions are not just basic functions; they serve as essential tools for efficient data analysis.
 
diff --git a/src/data/roadmaps/data-analyst/content/web-scraping@qQ64ZhSlbbWu9pP8KTE67.md b/src/data/roadmaps/data-analyst/content/web-scraping@qQ64ZhSlbbWu9pP8KTE67.md
index 5a175f568..f72e0a809 100644
--- a/src/data/roadmaps/data-analyst/content/web-scraping@qQ64ZhSlbbWu9pP8KTE67.md
+++ b/src/data/roadmaps/data-analyst/content/web-scraping@qQ64ZhSlbbWu9pP8KTE67.md
@@ -4,5 +4,5 @@ Web scraping plays a significant role in collecting unique datasets for data ana
 
 Learn more from the following resources:
 
-- [@article@What is web scraping what is it used for?](https://www.parsehub.com/blog/what-is-web-scraping/)
-- [@video@What is web scraping?](https://www.youtube.com/watch?v=dlj_QL-ENJM)
\ No newline at end of file
+- [@article@What is Web Scraping & What is it used for?](https://www.parsehub.com/blog/what-is-web-scraping/)
+- [@video@What is Web Scraping?](https://www.youtube.com/watch?v=dlj_QL-ENJM)
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/what-is-data-analytics@yCnn-NfSxIybUQ2iTuUGq.md b/src/data/roadmaps/data-analyst/content/what-is-data-analytics@yCnn-NfSxIybUQ2iTuUGq.md
index cfec2d850..740ed100a 100644
--- a/src/data/roadmaps/data-analyst/content/what-is-data-analytics@yCnn-NfSxIybUQ2iTuUGq.md
+++ b/src/data/roadmaps/data-analyst/content/what-is-data-analytics@yCnn-NfSxIybUQ2iTuUGq.md
@@ -1,3 +1,7 @@
 # Introduction to Data Analytics
 
-Data Analytics is a core component of a Data Analyst's role. The field involves extracting meaningful insights from raw data to drive decision-making processes. It includes a wide range of techniques and disciplines ranging from the simple data compilation to advanced algorithms and statistical analysis. As a data analyst, you are expected to understand and interpret complex digital data, such as the usage statistics of a website, the sales figures of a company, or client engagement over social media, etc. This knowledge enables data analysts to support businesses in identifying trends, making informed decisions, predicting potential outcomes - hence playing a crucial role in shaping business strategies.
\ No newline at end of file
+Data Analytics is a core component of a Data Analyst's role. The field involves extracting meaningful insights from raw data to drive decision-making processes. It includes a wide range of techniques and disciplines ranging from the simple data compilation to advanced algorithms and statistical analysis. As a data analyst, you are expected to understand and interpret complex digital data, such as the usage statistics of a website, the sales figures of a company, or client engagement over social media, etc. This knowledge enables data analysts to support businesses in identifying trends, making informed decisions, predicting potential outcomes - hence playing a crucial role in shaping business strategies.
+
+Learn more from the following resources:
+
+- [@course@Introduction to Data Analytics](https://www.coursera.org/learn/introduction-to-data-analytics)
diff --git a/src/data/roadmaps/datastructures-and-algorithms/content/102-data-structures/101-importance-of-datastructures.md b/src/data/roadmaps/datastructures-and-algorithms/content/102-data-structures/101-importance-of-datastructures.md
index b35ed3cf6..4bcb846db 100644
--- a/src/data/roadmaps/datastructures-and-algorithms/content/102-data-structures/101-importance-of-datastructures.md
+++ b/src/data/roadmaps/datastructures-and-algorithms/content/102-data-structures/101-importance-of-datastructures.md
@@ -4,5 +4,4 @@ Data structures are crucial in the field of computer science and coding because
 
 Learn more from the following links:
 
-- [@article@Why Data Structures and Algorithms Are Important to Learn?](https://www.geeksforgeeks.org/why-data-structures-and-algorithms-are-important-to-learn/)
 - [@video@What are Data Structures? Why is it Important?](https://www.youtube.com/watch?v=18V8Avz2OH8)
diff --git a/src/data/roadmaps/datastructures-and-algorithms/content/105-sorting-algorithms/105-heap-sort.md b/src/data/roadmaps/datastructures-and-algorithms/content/105-sorting-algorithms/105-heap-sort.md
index 62f9383ce..3ddaa5e5e 100644
--- a/src/data/roadmaps/datastructures-and-algorithms/content/105-sorting-algorithms/105-heap-sort.md
+++ b/src/data/roadmaps/datastructures-and-algorithms/content/105-sorting-algorithms/105-heap-sort.md
@@ -4,6 +4,5 @@ Heap Sort is an efficient, comparison-based sorting algorithm. It utilizes a dat
 
 Learn more from the following resources:
 
-- [@article@Heap Sort - W3Schools](https://www.geeksforgeeks.org/heap-sort/)
 - [@article@Heap Sort Visualize](https://www.hackerearth.com/practice/algorithms/sorting/heap-sort/tutorial/)
 - [@video@Heap sort in 4 minutes](https://www.youtube.com/watch?v=2DmK_H7IdTo)
diff --git a/src/data/roadmaps/datastructures-and-algorithms/content/106-search-algorithms/100-linear-search.md b/src/data/roadmaps/datastructures-and-algorithms/content/106-search-algorithms/100-linear-search.md
index 195d5e690..374916f6a 100644
--- a/src/data/roadmaps/datastructures-and-algorithms/content/106-search-algorithms/100-linear-search.md
+++ b/src/data/roadmaps/datastructures-and-algorithms/content/106-search-algorithms/100-linear-search.md
@@ -5,5 +5,4 @@ Linear search is one of the simplest search algorithms. In this method, every el
 Learn more from the following resources:
 
 - [@article@DSA Linear Search - W3Schools](https://www.w3schools.com/dsa/dsa_algo_linearsearch.php)
-- [@article@Linear Search - GeeksForGeeks](https://www.geeksforgeeks.org/linear-search/)
 - [@video@Learn Linear Search in 3 minutes](https://www.youtube.com/watch?v=246V51AWwZM)
diff --git a/src/data/roadmaps/datastructures-and-algorithms/content/107-tree-data-structure/102-avl-trees.md b/src/data/roadmaps/datastructures-and-algorithms/content/107-tree-data-structure/102-avl-trees.md
index 09d558f9f..b508b1d01 100644
--- a/src/data/roadmaps/datastructures-and-algorithms/content/107-tree-data-structure/102-avl-trees.md
+++ b/src/data/roadmaps/datastructures-and-algorithms/content/107-tree-data-structure/102-avl-trees.md
@@ -4,5 +4,4 @@ An **AVL tree** is a type of binary search tree that is self-balancing, which me
 
 Learn more from the following links:
 
-- [@article@AVL Tree Data Structure](https://www.geeksforgeeks.org/introduction-to-avl-tree/)
 - [@video@AVL trees in 5 minutes — Intro & Search](https://www.youtube.com/watch?v=DB1HFCEdLxA)
diff --git a/src/data/roadmaps/datastructures-and-algorithms/content/107-tree-data-structure/103-b-trees.md b/src/data/roadmaps/datastructures-and-algorithms/content/107-tree-data-structure/103-b-trees.md
index 8393a2b66..32161c0cc 100644
--- a/src/data/roadmaps/datastructures-and-algorithms/content/107-tree-data-structure/103-b-trees.md
+++ b/src/data/roadmaps/datastructures-and-algorithms/content/107-tree-data-structure/103-b-trees.md
@@ -4,5 +4,4 @@ B-Tree is a self-balanced search tree data structure that maintains sorted data
 
 Learn more from the following links:
 
-- [@article@Introduction of B-Tree](https://www.geeksforgeeks.org/introduction-of-b-tree-2/)
 - [@video@B-trees in 4 minutes — Intro](https://www.youtube.com/watch?v=FgWbADOG44s)
diff --git a/src/data/roadmaps/datastructures-and-algorithms/content/110-complex-data-structures/100-b-bplus-trees.md b/src/data/roadmaps/datastructures-and-algorithms/content/110-complex-data-structures/100-b-bplus-trees.md
index 522637cee..8322446fc 100644
--- a/src/data/roadmaps/datastructures-and-algorithms/content/110-complex-data-structures/100-b-bplus-trees.md
+++ b/src/data/roadmaps/datastructures-and-algorithms/content/110-complex-data-structures/100-b-bplus-trees.md
@@ -4,6 +4,4 @@
 
 Learn more from the following resources:
 
-- [@article@Introduction of B Tree](https://www.geeksforgeeks.org/introduction-of-b-tree-2/)
-- [@article@Introduction of B+ Tree](https://www.geeksforgeeks.org/introduction-of-b-tree/)
 - [@video@B Trees and B+ Trees. How they are useful in Databases](https://www.youtube.com/watch?v=aZjYr87r1b8)
diff --git a/src/data/roadmaps/datastructures-and-algorithms/content/110-complex-data-structures/101-skip-list.md b/src/data/roadmaps/datastructures-and-algorithms/content/110-complex-data-structures/101-skip-list.md
index 9d70dec4f..d22c15fc4 100644
--- a/src/data/roadmaps/datastructures-and-algorithms/content/110-complex-data-structures/101-skip-list.md
+++ b/src/data/roadmaps/datastructures-and-algorithms/content/110-complex-data-structures/101-skip-list.md
@@ -4,5 +4,4 @@ A **Skip List** is a probabilistic data structure that allows efficient search,
 
 Learn more from the following resources:
 
-- [@article@Skip List – Efficient Search, Insert and Delete in Linked List](https://www.geeksforgeeks.org/skip-list/)
 - [@video@Skip Lists](https://www.youtube.com/watch?v=NDGpsfwAaqo)
diff --git a/src/data/roadmaps/datastructures-and-algorithms/content/110-complex-data-structures/102-isam.md b/src/data/roadmaps/datastructures-and-algorithms/content/110-complex-data-structures/102-isam.md
index 0896668cc..0bf9d32ac 100644
--- a/src/data/roadmaps/datastructures-and-algorithms/content/110-complex-data-structures/102-isam.md
+++ b/src/data/roadmaps/datastructures-and-algorithms/content/110-complex-data-structures/102-isam.md
@@ -4,5 +4,4 @@ ISAM, which stands for Indexed Sequential Access Method, is a type of disk stora
 
 Learn more from the following resources:
 
-- [@article@ISAM in Database](https://www.geeksforgeeks.org/isam-in-database/)
 - [@video@DBMS - Index Sequential Access Method (ISAM)](https://www.youtube.com/watch?v=EiW1VVPor10)
diff --git a/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/101-backtracking.md b/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/101-backtracking.md
index 1e562c47f..087676732 100644
--- a/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/101-backtracking.md
+++ b/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/101-backtracking.md
@@ -4,5 +4,4 @@ Backtracking is a powerful algorithmic technique that aims to solve a problem in
 
 Learn more from the following links:
 
-- [@article@Backtracking Algorithm](https://www.geeksforgeeks.org/backtracking-algorithms/)
 - [@video@What is backtracking?](https://www.youtube.com/watch?v=Peo7k2osVVs)
diff --git a/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/102-greedy-algorithms.md b/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/102-greedy-algorithms.md
index 2fe93c845..14c65e495 100644
--- a/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/102-greedy-algorithms.md
+++ b/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/102-greedy-algorithms.md
@@ -4,5 +4,4 @@ Greedy algorithms follow the problem-solving heuristic of making the locally opt
 
 Learn more from the following links:
 
-- [@article@Greedy Algorithm Tutorial – Examples, Application and Practice Problem](https://www.geeksforgeeks.org/introduction-to-greedy-algorithm-data-structures-and-algorithm-tutorials/)
 - [@video@Greedy Algorithms Tutorial ](https://www.youtube.com/watch?v=bC7o8P_Ste4)
diff --git a/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/103-randomised-algorithms.md b/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/103-randomised-algorithms.md
index bbcf340ad..4d6326737 100644
--- a/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/103-randomised-algorithms.md
+++ b/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/103-randomised-algorithms.md
@@ -4,5 +4,4 @@ Randomised algorithms are a type of algorithm that employs a degree of randomnes
 
 Learn more from the following links:
 
-- [@article@Randomized Algorithms](https://www.geeksforgeeks.org/randomized-algorithms/)
 - [@video@Algorithm Classification Randomized Algorithm](https://www.youtube.com/watch?v=J_EVG6yCOz0)
diff --git a/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/104-divide-and-conquer.md b/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/104-divide-and-conquer.md
index 2c79279a9..84acc08cf 100644
--- a/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/104-divide-and-conquer.md
+++ b/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/104-divide-and-conquer.md
@@ -4,5 +4,4 @@ Divide and conquer is a powerful algorithm design technique that solves a proble
 
 Learn more from the following links:
 
-- [@article@Introduction to Divide and Conquer Algorithm](https://www.geeksforgeeks.org/introduction-to-divide-and-conquer-algorithm/)
 - [@video@Divide & Conquer Algorithm In 3 Minutes](https://www.youtube.com/watch?v=YOh6hBtX5l0)
diff --git a/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/105-recursion.md b/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/105-recursion.md
index ed60e3ba5..6a51c19e5 100644
--- a/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/105-recursion.md
+++ b/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/105-recursion.md
@@ -4,5 +4,4 @@ Recursion is a method where the solution to a problem depends on solutions to sh
 
 Learn more from the following links:
 
-- [@article@Introduction to Recursion](https://www.geeksforgeeks.org/introduction-to-recursion-2/)
 - [@video@Recursion in 100 Seconds](https://www.youtube.com/watch?v=rf60MejMz3E)
diff --git a/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/106-dynamic-programming.md b/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/106-dynamic-programming.md
index 901916ea4..686948180 100644
--- a/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/106-dynamic-programming.md
+++ b/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/106-dynamic-programming.md
@@ -4,7 +4,6 @@
 
 Learn more from the following links:
 
-- [@article@Dynamic Programming (DP) Tutorial with Problems](https://www.geeksforgeeks.org/introduction-to-dynamic-programming-data-structures-and-algorithm-tutorials/)
 - [@article@Getting Started with Dynamic Programming in Data Structures and Algorithms](https://medium.com/@PythonicPioneer/getting-started-with-dynamic-programming-in-data-structures-and-algorithms-126c7a16775c)
 - [@video@What Is Dynamic Programming and How To Use It](https://www.youtube.com/watch?v=vYquumk4nWw&t=4s)
 - [@video@5 Simple Steps for Solving Dynamic Programming Problems](https://www.youtube.com/watch?v=aPQY__2H3tE)
diff --git a/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/107-two-pointer-techniques.md b/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/107-two-pointer-techniques.md
index 29055ccb5..c7d705e2b 100644
--- a/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/107-two-pointer-techniques.md
+++ b/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/107-two-pointer-techniques.md
@@ -4,7 +4,6 @@ The **two-pointer technique** is a strategy that can be used to solve certain ty
 
 Learn more from the following links:
 
-- [@article@Two Pointers Technique](https://www.geeksforgeeks.org/two-pointers-technique/)
 - [@article@Two Pointers Technique](https://medium.com/@johnnyJK/data-structures-and-algorithms-907a63d691c1)
 - [@article@Mastering the Two Pointers Technique: An In-Depth Guide](https://lordkonadu.medium.com/mastering-the-two-pointers-technique-an-in-depth-guide-3c2167584ccc)
 - [@video@Visual introduction Two Pointer Algorithm](https://www.youtube.com/watch?v=On03HWe2tZM)
diff --git a/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/108-sliding-window-technique.md b/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/108-sliding-window-technique.md
index 90efe43b7..3c36d6b94 100644
--- a/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/108-sliding-window-technique.md
+++ b/src/data/roadmaps/datastructures-and-algorithms/content/112-problem-solving-techniques/108-sliding-window-technique.md
@@ -4,6 +4,5 @@ The **Sliding Window Technique** is an algorithmic paradigm that manages a subse
 
 Learn more from the following links:
 
-- [@article@Sliding Window Technique](https://www.geeksforgeeks.org/window-sliding-technique/)
 - [@article@Mastering Sliding Window Techniques](https://medium.com/@rishu__2701/mastering-sliding-window-techniques-48f819194fd7)
 - [@video@Sliding window technique](https://www.youtube.com/watch?v=p-ss2JNynmw)
diff --git a/src/data/roadmaps/devops/content/envoy@epLLYArR16HlhAS4c33b4.md b/src/data/roadmaps/devops/content/envoy@epLLYArR16HlhAS4c33b4.md
index 5c0002e8f..c9ff5d8da 100644
--- a/src/data/roadmaps/devops/content/envoy@epLLYArR16HlhAS4c33b4.md
+++ b/src/data/roadmaps/devops/content/envoy@epLLYArR16HlhAS4c33b4.md
@@ -4,7 +4,7 @@ Originally created at Lyft, Envoy is a high-performance data plane designed for
 
 Visit the following resources to learn more:
 
-- [@official@Envoy Website](https://www.envoyproxy.io/)
-- [@opensourece@envoyproxy/envoy](https://github.com/envoyproxy/envoy)
+- [@official@Envoy](https://www.envoyproxy.io/)
+- [@opensource@envoyproxy/envoy](https://github.com/envoyproxy/envoy)
 - [@article@What is Envoy?](https://www.envoyproxy.io/docs/envoy/latest/intro/what_is_envoy)
 - [@feed@Explore top posts about Envoy](https://app.daily.dev/tags/envoy?ref=roadmapsh)
diff --git a/src/data/roadmaps/devops/devops.md b/src/data/roadmaps/devops/devops.md
index 91328d6c1..25aed6d77 100644
--- a/src/data/roadmaps/devops/devops.md
+++ b/src/data/roadmaps/devops/devops.md
@@ -13,12 +13,32 @@ tnsBannerLink: 'https://thenewstack.io?utm_source=roadmap.sh&utm_medium=Referral
 question:
   title: 'What is DevOps?'
   description: |
-    DevOps is a cultural and collaborative mindset that emphasizes communication, collaboration, integration, and [automation](https://roadmap.sh/devops/automation) between development and operations teams in order to achieve faster and more reliable software delivery.
+    DevOps is a cultural and collaborative mindset that emphasizes communication, collaboration, integration, and [automation](https://roadmap.sh/devops/automation) between development and operations teams to achieve faster and more reliable software delivery.
 
-    DevOps is not a specific job title or role, but rather a set of [principles and practices](https://roadmap.sh/devops/principles) that can be applied across a variety of roles in software development and IT operations. Anyone involved in the software development and delivery process can adopt a DevOps mindset and apply DevOps practices in their work, including developers, testers, operations engineers, product managers, and others.
+    DevOps is not a specific job title or role, but rather a set of principles and practices that can be applied across a variety of roles in software development and IT operations. Anyone involved in the software development and delivery process can adopt a DevOps mindset and apply DevOps practices in their work, including developers, testers, operations engineers, product managers, and others.
 
     ## What is a DevOps Engineer?
-    While DevOps is not a specific job title or role, organizations often hire for a "DevOps Engineer" role. A [DevOps Engineer](https://roadmap.sh/devops/devops-engineer) is a software engineer who specializes in the practices and [tools](https://roadmap.sh/devops/tools) that enable the continuous delivery of software. DevOps Engineers are responsible for the design and implementation of applications, software, and services for their organization, and they work closely with developers, testers, and operations staff to oversee the code releases.
+    While DevOps is not a specific job title or role, organizations often hire for a "DevOps Engineer" role. A DevOps Engineer is a software engineer who specializes in the practices and [tools](https://roadmap.sh/devops/tools) that enable the continuous delivery of software.
+
+    DevOps Engineers (usually part of a bigger DevOps team) are responsible for bridging the gap between the development and operations teams,  they work closely with developers, testers, and operations staff to oversee the code releases and provide the tools required to automate and expedite the team’s time-to-market while maintaining the quality of the deliverables.
+
+    ## What Does a DevOps Engineer Do?
+    A DevOps Engineer plays a key role in simplifying the software development lifecycle by promoting collaboration between dev and ops teams. In other words, by implementing the DevOps approach.
+
+    In the end, these engineers are constantly trying to improve the speed, efficiency, and reliability of software delivery by automating tasks, adding continuous integration and deployment (CI/CD) to simplify code promotion activities, simplify infrastructure management, and least (but definitely not last) set up monitoring and alerting rules.
+
+    They work with developers to ensure that code is efficiently built, tested, and deployed, while also maintaining the underlying infrastructure to keep applications running smoothly. This often involves configuring cloud environments, implementing security best practices, optimizing deployment pipelines, and setting up observability tools to monitor performance.
+
+    Ultimately, a DevOps Engineer helps organizations build and maintain scalable, resilient systems while reducing manual processes and helping minimize downtime.
+
+    ## How do you become a DevOps Engineer?
+    To become a DevOps Engineer, you need to have technical skills in areas such as development, automation, containerization, cloud, CI/CD pipelines etc. While being an expert on all of them is hardly ever possible, what ends up happening is that different DevOps engineers specialize in different aspects of the DevOps culture. 
+
+    A few example DevOps tools and technologies to learn may include programming languages like Python or JavaScript for scripting, AWS, Ansible for configuration management, Terraform for managing your infrastructure as code, Docker, Kubernetes, Jenkins, and Git for source control, and monitoring and logging tools. 
+
+    Slowly start gaining experience by working on DevOps projects, developing a DevOps mindset, getting certified, and applying for DevOps Engineer positions by highlighting your skills and experience in your resume. 
+
+    Start your [career path in DevOps engineering](https://roadmap.sh/devops/career-path) by working on some [DevOps projects](https://roadmap.sh/devops/projects).
 dimensions:
   width: 968
   height: 2850
diff --git a/src/data/roadmaps/devops/faqs.astro b/src/data/roadmaps/devops/faqs.astro
index 89c0bd8c1..1fd87e2ec 100644
--- a/src/data/roadmaps/devops/faqs.astro
+++ b/src/data/roadmaps/devops/faqs.astro
@@ -3,62 +3,124 @@ import type { FAQType } from '../../../components/FAQs/FAQs.astro';
 
 export const faqs: FAQType[] = [
   {
-    question: 'How do Agile and DevOps interrelate?',
+    question: 'What skills are required to become a DevOps Engineer?',
     answer: [
-      'Agile and DevOps both prioritize collaboration, continuous improvement, and delivering working software. They can be used together to create a more efficient software development process. Agile emphasizes iterative development and customer satisfaction, while DevOps emphasizes automating processes and integrating development and operations teams. When used together, Agile and DevOps can improve software development and delivery by streamlining processes and enhancing collaboration.',
+      'To become a DevOps Engineer, you need to have a combination of technical and soft skills. Technical skills include knowledge of programming languages, [automation tools](https://roadmap.sh/devops/automation-tools), containerization, cloud platforms, CI/CD pipelines, configuration management tools, and monitoring and logging tools.',
+      "Soft skills include communication, collaboration, problem-solving, and adaptability. After all, you'll be dealing with multiple actors, both from the different dev teams you interact with and from ops teams looking to ensure smooth operations and robust performance.",
+      'Gain experience by working on DevOps projects, develop a DevOps mindset, get certified, and apply for DevOps Engineer positions by highlighting your [DevOps skills](https://roadmap.sh/devops/skills) and experience in your resume.',
     ],
   },
   {
-    question: 'What are some misconceptions about DevOps?',
+    question: 'Does a DevOps Engineer know how to code?',
     answer: [
-      'Some common misconceptions about DevOps include:',
-      "**DevOps is just automation**: While automation is an important part of DevOps, it's not the only thing. DevOps is a culture that emphasizes collaboration, communication, and integration between development and operations teams to improve the quality and speed of software delivery.",
-      '**DevOps is just a job title**: DevOps is a mindset and set of practices, not a specific job title. Anyone involved in the software development and delivery process can adopt a DevOps mindset and apply DevOps practices in their work, including developers, testers, operations engineers, and others.',
-      '**DevOps eliminates the need for IT operations**: DevOps does not eliminate the need for IT operations. Instead, it changes the way that operations teams work by promoting collaboration with development teams and introducing new tools and processes for deployment, monitoring, and maintenance.',
+      'A DevOps Engineer usually knows how to code, and not only that but they typically have great coding skills. After all, they use code on pretty much everything they do.',
+      "Mind you, they may not always write application code like a software developer (that's not their job after all), however, they frequently script and automate tasks using languages like Python, Bash, Go, or Ruby.",
+      'DevOps Engineers also write infrastructure-as-code (IaC) using tools like Terraform or CloudFormation, build CI/CD pipelines with scripting languages, and automate system configurations with Ansible, Chef, or Puppet. The list of [DevOps tools](https://roadmap.sh/devops/tools) available is quite extensive, and most of them require some sort of coding skills.',
+      "And while it's not always the case, in some situations they might also need to understand and modify application code when troubleshooting deployments or optimizing performance (tasks that can also be done in conjunction with the dev team).",
+      "In short, coding is a big part of a DevOps Engineer's toolkit, but the focus is on automation, efficiency, and system reliability rather than pure application development.",
     ],
   },
   {
-    question: 'How to become a DevOps Engineer?',
+    question: 'How are DevOps Engineers different from developers?',
     answer: [
-      'To [become a DevOps Engineer](https://roadmap.sh/devops/how-to-become-devops-engineer), you need to have technical skills in areas such as development, automation, containerization, cloud, CI/CD pipelines etc. Some sample tools and technologies to learn may include any programming language, AWS, Ansible, Terraform, Docker, Kubernetes, Jenkins, Git, and monitoring and logging tools. Gain experience by working on DevOps projects, develop a DevOps mindset, get certified, and apply for DevOps Engineer positions by highlighting your skills and experience in your resume. Start your [career path in DevOps engineering](https://roadmap.sh/devops/career-path) by working on some [DevOps projects](https://roadmap.sh/devops/projects).',
+      'DevOps Engineers and developers are different from each other, however, their roles complement themselves nicely in the context of software development. Developers focus on writing application code, implementing features, and optimizing performance, while DevOps Engineers ensure that the software runs smoothly in production by managing deployment pipelines, automating infrastructure, and maintaining system reliability.',
+      "A key difference is that developers primarily work on building and improving applications, whereas DevOps Engineers handle the processes and tools that enable continuous integration, automated testing, and efficient deployments. If you're curious about a more detailed comparison, [this guide on DevOps vs. Developers](https://roadmap.sh/devops/vs-developer) breaks it down further. Similarly, if you’re wondering [how DevOps compares to full-stack development, this resource](https://roadmap.sh/devops/vs-full-stack) provides a helpful perspective.",
+      'While both roles require coding skills, **DevOps is more focused on automation, scalability, and system stability**, ensuring that developers can ship code faster and with fewer problems.',
     ],
   },
   {
-    question: 'What skills are required to become a DevOps Engineer?',
+    question: 'How do I prepare for a DevOps interview?',
     answer: [
-      'To become a DevOps Engineer, you need to have a combination of technical and soft skills. Technical skills include knowledge of programming languages, [automation tools](https://roadmap.sh/devops/automation-tools), containerization, cloud platforms, CI/CD pipelines, and monitoring and logging tools. Soft skills include communication, collaboration, problem-solving, and adaptability. Some sample tools and technologies to learn may include any programming language, AWS, Ansible, Terraform, Docker, Kubernetes, Jenkins, Git, and monitoring and logging tools. Gain experience by working on DevOps projects, develop a DevOps mindset, get certified, and apply for DevOps Engineer positions by highlighting your [DevOps skills](https://roadmap.sh/devops/skills) and experience in your resume.',
+      'A great way to prepare for a DevOps interview is by working on [hands-on DevOps projects](https://roadmap.sh/devops/projects) that showcase your skills in automation, CI/CD, cloud infrastructure, and monitoring. Setting up a **home lab** where you can play around and test new techniques or deploy applications using DevOps tools like Docker, Kubernetes, Terraform, and Jenkins can help demonstrate your practical experience and give you a competitive advantage over other candidates.',
+      'Apart from that, another great idea is to review [common DevOps interview questions](https://roadmap.sh/questions/devops). Doing so can help you identify gaps in your understanding. Topics like infrastructure as code (IaC), container orchestration, logging and monitoring, and security best practices often come up during interviews.',
+      'Another useful step is to study real-world expectations by going through a [DevOps Engineer job description](https://roadmap.sh/devops/job-description). This can give you a clearer idea of what employers are looking for and help tailor your study program.',
+      'Finally, soft skills matter too—be ready to discuss how you collaborate with developers, handle incidents, and optimize deployment processes. DevOps is as much about culture and teamwork as it is about technical expertise, so showing you have a problem-solving mindset and an understanding of [DevOps principles](https://roadmap.sh/devops/principles) will set you apart in the interview.',
     ],
   },
   {
-    question: 'What is the difference between SRE and DevOps?',
+    question: 'What is a DevOps Lifecycle?',
     answer: [
-      'The difference between [DevOps Engineer vs SRE](https://roadmap.sh/devops/devops-vs-sre) lies in focus: DevOps Engineers improve software delivery and infrastructure automation, bridging development and operations, while Site Reliability Engineers (SREs) ensure system reliability and performance, applying software engineering to operations. DevOps emphasizes CI/CD and collaboration, whereas SREs prioritize monitoring, incident response, and scalability.',
+      'A [DevOps lifecycle](https://roadmap.sh/devops/lifecycle) is a set of practices and processes that help organizations deliver software more quickly and reliably. The DevOps lifecycle typically includes planning, development, testing, deployment, monitoring, and feedback. ',
+      'It starts with **planning**, where teams define objectives, outline features, and create a roadmap for **development**. Agile methodologies and tools like Jira help facilitate this process. In the development phase, developers get to write and commit code using version control systems like Git. During this stage, testing is also involved (although without being the main focus of it) through the use of unit testing suits like Jasmine or JUnit.',
+      'Once the code is ready, it moves to **testing**, where automated and manual tests validate functionality, security, and performance. This ensures that the application is stable before deployment. The **deployment** phase follows, where CI/CD pipelines automate the release process, making it easier to push updates to staging or production environments with minimal risk while ensuring the quality and security of the delivery (through automated tests and validations).',
+      'After deployment, **monitoring** tools track system health and application performance, providing real-time insights into potential issues. After all of this, during the **feedback stage**, teams are able to analyze monitoring data, user reports, and incident responses to iterate and refine their processes and improve future iterations.',
+      'Through the DevOps lifecycle, companies automate and integrate these stages allowing them to improve collaboration between development and operations teams, increasing the speed of software delivery, and enhancing the overall quality of software products.',
     ],
   },
   {
-    question: 'How do I prepare for a DevOps interview?',
+    question: 'What is DevOps automation?',
     answer: [
-      'A great way to prepare for a DevOps interview is by building [DevOps projects](https://roadmap.sh/devops/projects) to validate your skills as well as reviewing common [devops interview questions](https://roadmap.sh/questions/devops) to ensure you capture any gaps in your understanding.',
+      "DevOps automation is about leveraging various tools and scripts to minimize manual tasks throughout the dev lifecycle. In essence, it's a strategy for addressing challenges by automating key aspects of the project.",
+      "Although it won't remove every problem, a well-executed automation plan can **enhance efficiency, reduce mistakes, and speed up delivery**. This is done by simplifying key steps with a focus on: integrating code, running tests, provisioning infrastructure, managing configurations, deploying applications, and monitoring system performance.",
+      'A significant area in this practice is **Continuous Integration/Continuous Deployment (CI/CD)**, which automatically tests and deploys code changes with minimal human input.',
+      'On top of it, Infrastructure as Code (IaC) allows teams to manage and define infrastructure through code, resulting in more reliable, scalable, and faster deployments. Tools for configuration management automate the setup of systems and software installations, while monitoring and logging solutions offer real-time insights into system health.',
+      'Selecting the right set of tools is vital for success. If you’re interested in exploring effective solutions, consider reviewing this comprehensive list of [top DevOps automation tools](https://roadmap.sh/devops/automation-tools) to determine which ones best complement your workflow.',
     ],
   },
   {
-    question: 'What is shift-left?',
+    question: 'What is a pipeline in DevOps?',
     answer: [
-      'Shift left is a software development practice that involves moving tasks and processes earlier in the development lifecycle. By shifting tasks left, teams can identify and address issues earlier in the development process, reducing the cost and effort required to fix them. [Shift left](https://roadmap.sh/devops/shift-left-testing) practices include implementing automated testing, code reviews, and security checks early in the development process to catch and fix issues before they become more costly to address.',
+      'In DevOps, a pipeline is an automated sequence of processes that takes code from development to production. Often referred to as a CI/CD (Continuous Integration/Continuous Deployment) pipeline, it simplifies the workflow by introducing automation. The main tasks inside a pipeline are:',
+      '**Building:** Compiling code and preparing it for testing. In some situations the compiling step might be optional or not even required, however, it can be replaced by linting.',
+      '**Testing:** Running automated tests to catch issues early. If a test fails, the whole pipeline will usually fail, preventing the code from moving forward into production.',
+      '**Deployment:** Releasing the code to staging or production environments.',
+      '**Monitoring:** Checking the performance and stability of the deployed application.',
+      'A well-defined pipeline ensures that software is consistently built, tested, and deployed, which, in turn, helps reduce human error, increases efficiency, and supports the rapid delivery of high-quality software.',
     ],
   },
   {
-    question: 'What is a DevOps Lifecycle?',
+    question: 'What metrics are used in DevOps to measure success?',
+    answer: [
+      'In DevOps, being such a complex practice, measuring success is not straightforward. Instead, success is measured using a combination of metrics that tackle both the development process and operational performance.',
+      'Some of the key metrics include:',
+      '**Deployment Frequency:** Measures how often new releases are deployed to production. A higher frequency often indicates a streamlined, efficient process.',
+      "**Lead Time for Changes:** The duration from when code is committed to when it's successfully deployed. Shorter lead times suggest that the existing pipelines provide the flexibility required to quickly put ideas into production.",
+      "**Mean Time to Recovery (MTTR):** The average time it takes to restore service after a failure or outage. Lower MTTR values reflect a team's ability to promptly resolve issues and maintain system reliability. It can also signal a strong and mature infrastructure.",
+      '**Change Failure Rate:** The percentage of deployments that result in failures, such as outages or the need for rollbacks. A lower change failure rate signals a more stable and reliable deployment practice.',
+      '**Automated Test Coverage and Quality Metrics:** These include the percentage of code covered by automated tests, as well as other quality indicators like code complexity and defect density. They help ensure that the software is robust and maintainable.',
+      '**System Performance and Uptime:** Operational metrics like uptime, response time, and error rates monitor the health and performance of the application in production, ensuring a good user experience.',
+      '**Cycle Time:** The total time it takes for a new feature or bug fix to move from initial concept to production. Shorter cycle times indicate a more efficient process.',
+      'As you can see, together these metrics target not only the technical aspects of the DevOps practice but also the operational agility available.',
+    ],
+  },
+  {
+    question: 'What are some misconceptions about DevOps?',
     answer: [
-      'A [DevOps lifecycle](https://roadmap.sh/devops/lifecycle) is a set of practices and processes that help organizations deliver software more quickly and reliably. The DevOps lifecycle typically includes planning, development, testing, deployment, monitoring, and feedback. By automating and integrating these stages, organizations can improve collaboration between development and operations teams, increase the speed of software delivery, and enhance the quality of software products.',
+      'Some common misconceptions about DevOps include:',
+      "**DevOps is just automation:** While automation is an important part of DevOps, it's not the only thing. DevOps is a culture that emphasizes collaboration, communication, and continuous integration between dev and ops teams to improve the quality and speed of software delivery.",
+      '**DevOps is just a job title:** DevOps is a mindset and set of practices, not a specific job title. Anyone involved in the software development and delivery process can adopt a DevOps mindset and apply DevOps practices in their work, including developers, testers, operations engineers, and others.',
+      '**DevOps eliminates the need for IT operations:** DevOps does not eliminate the need for IT operations. Instead, it changes the way that operations teams work by promoting collaboration with development teams and introducing new tools and processes for deployment, monitoring, and maintenance.',
     ],
   },
   {
-    question: 'Should I become a DevOps engineer or a software developer?',
-    answer:[
-        "Choosing between becoming a DevOps engineer or a software developer really depends on what suits your interests. DevOps tend to focus more on system-level challenges, while software developers mainly work on writing and optimizing code. If you picture yourself enjoying coding, building software, and focusing on application development, software development may be the right path for you. But if you're more keen on streamlining workflows, automating processes, and managing IT systems, going for a career in DevOps may be a better choice.",
-        "More info here: [DevOps Vs. Developer: What Are The Key Differences?](https://roadmap.sh/devops/vs-developer)"
-    ]
-  }
+    question: 'How do Agile and DevOps interrelate?',
+    answer: [
+      '[Agile and DevOps](https://roadmap.sh/devops/vs-agile) both prioritize collaboration, continuous improvement, and delivering working software. They can be used together to create a more efficient software development process. Agile emphasizes iterative development and customer satisfaction, while DevOps emphasizes automating processes and integrating developers and ops teams. When used together, Agile and DevOps can improve software development and delivery by streamlining processes and enhancing collaboration.',
+    ],
+  },
+  {
+    question: 'What is the difference between SRE and DevOps?',
+    answer: [
+      'The difference between [DevOps vs SRE](https://roadmap.sh/devops/devops-vs-sre) lies in focus: DevOps Engineers improve software delivery and infrastructure automation, bridging development and operations, while Site Reliability Engineers (SREs) ensure system reliability and performance, applying software engineering to operations. DevOps emphasizes CI/CD and collaboration, whereas SREs prioritize monitoring, incident response, and scalability.',
+    ],
+  },
+  {
+    question: 'What is the difference between DevSecOps and DevOps?',
+    answer: [
+      "The main difference between DevSecOps and DevOps is in their names, one of them includes security in their focus while the other doesn't. However, there's more to that story, so let's dive a little deeper.",
+      'On one hand, DevOps primarily focuses on simplifying the software delivery process by automating processes and fostering close collaboration between devs and ops teams. The goal is to quickly and reliably deliver code to production.',
+      'Now, on the other hand, DevSecOps builds on top of the above by embedding security measures into every stage of the development process. Instead of treating security as an afterthought, security teams are now involved in all activities, helping in the process of building secure software.',
+      'This extended practice now makes sure that vulnerability assessments, compliance checks, and code scanning are core activities of the workflow from the very beginning.',
+      'While this shift might cause some unease among developers at first, in the long run, it helps mitigate risks by making security a shared responsibility. In a DevOps environment, speed and efficiency are the most important things, but with DevSecOps, having a secure pipeline becomes a priority as well.',
+      "If you're curious about the finer points and practical differences between these approaches, a detailed discussion can be found in this comprehensive comparison: [DevOps vs DevSecOps](https://roadmap.sh/devops/vs-devsecops).",
+    ],
+  },
+  {
+    question: 'What is shift-left in DevOps?',
+    answer: [
+      'Shift-left is a software development practice that involves moving tasks and processes earlier in the development lifecycle. By shifting tasks left, teams can identify and address issues earlier in development, reducing the cost and effort required to fix them.',
+      '[Shift-left practices](https://roadmap.sh/devops/shift-left-testing) include implementing automated testing, code reviews, and security checks early on to catch and fix issues before they become more costly to address.',
+    ],
+  },
 ];
 ---
diff --git a/src/data/roadmaps/docker/content/100-introduction/102-bare-metal-vm-containers.md b/src/data/roadmaps/docker/content/100-introduction/102-bare-metal-vm-containers.md
index 267bfdb80..b02e18163 100644
--- a/src/data/roadmaps/docker/content/100-introduction/102-bare-metal-vm-containers.md
+++ b/src/data/roadmaps/docker/content/100-introduction/102-bare-metal-vm-containers.md
@@ -1,6 +1,6 @@
 # Bare Metal vs VM vs Containers
 
-Bare metal is a term used to describe a computer that is running directly on the hardware without any virtualization. This is the most performant way to run an application, but it is also the least flexible. You can only run one application per server, and you cannot easily move the application to another server. Virtual machines (VMs) are a way to run multiple applications on a single server. Each VM runs on top of a hypervisor, which is a piece of software that emulates the hardware of a computer. The hypervisor allows you to run multiple operating systems on a single server, and it also provides isolation between applications running on different VMs. Containers are a way to run multiple applications on a single server without the overhead of a hypervisor. Each container runs on top of a container engine, which is a piece of software that emulates the operating system of a computer.
+Bare metal is a term used to describe a computer that is running directly on the hardware without any virtualization. This is the most performant way to run an application, but it is also the least flexible. You can only run one application per server, and you cannot easily move the application to another server. Virtual machines (VMs) are a way to run multiple applications on a single server. Each VM runs on top of a **hypervisor**, which is a piece of software that emulates the hardware of a computer. The hypervisor allows you to run multiple operating systems on a single server, and it also provides isolation between applications running on different VMs. Containers are a way to run multiple applications on a single server without the overhead of a hypervisor. Each container runs on top of a **container engine** (software that manages the lifecycle of containers), which oversees and isolates processes using the host operating system’s kernel features.
 
 You can learn more from the following resources:
 
diff --git a/src/data/roadmaps/docker/content/104-data-persistence/100-ephemeral-container-fs.md b/src/data/roadmaps/docker/content/104-data-persistence/100-ephemeral-container-fs.md
index cf90a4eea..11a23688f 100644
--- a/src/data/roadmaps/docker/content/104-data-persistence/100-ephemeral-container-fs.md
+++ b/src/data/roadmaps/docker/content/104-data-persistence/100-ephemeral-container-fs.md
@@ -1,6 +1,6 @@
 # Ephemeral FS
 
-By default, the storage within a Docker container is ephemeral, meaning that any data changes or modifications made inside a container will only persist as long as the container is running. Once the container is stopped and removed, all the associated data will be lost. This is because Docker containers are designed to be stateless by nature. This temporary or short-lived storage is called the "ephemeral container file system". It is an essential feature of Docker, as it enables fast and consistent deployment of applications across different environments without worrying about the state of a container.
+By default, the storage within a Docker container is ephemeral, meaning that any data changes or modifications made inside a container will only persist until the container is stopped and removed. Once the container is stopped and removed, all the associated data will be lost. This is because Docker containers are designed to be stateless by nature. This temporary or short-lived storage is called the "ephemeral container file system". It is an essential feature of Docker, as it enables fast and consistent deployment of applications across different environments without worrying about the state of a container.
 
 Visit the following resources to learn more:
 
diff --git a/src/data/roadmaps/docker/content/104-data-persistence/102-bind-mounts.md b/src/data/roadmaps/docker/content/104-data-persistence/102-bind-mounts.md
index 21eae9cef..eb81f5773 100644
--- a/src/data/roadmaps/docker/content/104-data-persistence/102-bind-mounts.md
+++ b/src/data/roadmaps/docker/content/104-data-persistence/102-bind-mounts.md
@@ -5,4 +5,3 @@ Bind mounts have limited functionality compared to volumes. When you use a bind
 Visit the following resources to learn more:
 
 - [@official@Docker Bind Mounts](https://docs.docker.com/storage/bind-mounts/)
-- [@article@How to Use Bind Mount in Docker?](https://www.geeksforgeeks.org/how-to-use-bind-mount-in-docker/)
diff --git a/src/data/roadmaps/docker/content/108-running-containers/101-docker-compose.md b/src/data/roadmaps/docker/content/108-running-containers/101-docker-compose.md
index 89e6803e8..626865b3e 100644
--- a/src/data/roadmaps/docker/content/108-running-containers/101-docker-compose.md
+++ b/src/data/roadmaps/docker/content/108-running-containers/101-docker-compose.md
@@ -6,3 +6,4 @@ Visit the following resources to learn more:
 
 - [@official@Docker Compose documentation](https://docs.docker.com/compose/)
 - [@video@Docker Compose Tutorial](https://www.youtube.com/watch?v=DM65_JyGxCo)
+- [@opensource@Curated Docker Compose Samples](https://github.com/docker/awesome-compose?tab=readme-ov-file)
diff --git a/src/data/roadmaps/docker/content/110-docker-cli/101-containers.md b/src/data/roadmaps/docker/content/110-docker-cli/101-containers.md
index 75f6787e7..421a42de0 100644
--- a/src/data/roadmaps/docker/content/110-docker-cli/101-containers.md
+++ b/src/data/roadmaps/docker/content/110-docker-cli/101-containers.md
@@ -5,4 +5,4 @@ Containers are isolated, lightweight environments that run applications using a
 Visit the following resources to learn more:
 
 - [@official@Docker CLI Commands](https://docs.docker.com/engine/reference/commandline/cli/)
-- [@article@Docker CLI Commands Cheat Sheet](https://www.docker.com/blog/docker-cli-commands-cheat-sheet/)
+- [@article@Docker CLI Commands Cheat Sheet](https://docs.docker.com/get-started/docker_cheatsheet.pdf)
diff --git a/src/data/roadmaps/docker/docker.json b/src/data/roadmaps/docker/docker.json
index 93ff0b273..f786d18d3 100644
--- a/src/data/roadmaps/docker/docker.json
+++ b/src/data/roadmaps/docker/docker.json
@@ -2496,7 +2496,7 @@
                   "y": "10",
                   "properties": {
                     "size": "17",
-                    "text": "Others (ghcr, ecr, gcr, act, etc)"
+                    "text": "Others (ghcr, ecr, gcr, acr, etc)"
                   }
                 }
               ]
diff --git a/src/data/roadmaps/engineering-manager/content/trust--influence-building@7PBmYoSmIgZT21a2Ip3_S.md b/src/data/roadmaps/engineering-manager/content/trust--influence-building@7PBmYoSmIgZT21a2Ip3_S.md
index 6b42b5e34..b6fbe7673 100644
--- a/src/data/roadmaps/engineering-manager/content/trust--influence-building@7PBmYoSmIgZT21a2Ip3_S.md
+++ b/src/data/roadmaps/engineering-manager/content/trust--influence-building@7PBmYoSmIgZT21a2Ip3_S.md
@@ -4,4 +4,8 @@ Building trust and influence is crucial for any Engineering Manager. This involv
 
 One challenge in this area is building trust between team members of varying experiences and skills. Managers must not only show the team they're competent, but also that they value everyone's inputs. They can achieve this by promoting inclusivity and praising team contributions regularly.
 
-Being patient, communicate clearly, and showing empathy are critical skills that can help an Engineering Manager in trust and influence building. By embodying these traits, managers can build a stronger, united, and more effective engineering team.
\ No newline at end of file
+Being patient, communicate clearly, and showing empathy are critical skills that can help an Engineering Manager in trust and influence building. By embodying these traits, managers can build a stronger, united, and more effective engineering team.
+
+Visit the following resources to learn more:
+
+- [@article@Understanding The Trust Equation](https://trustedadvisor.com/why-trust-matters/understanding-trust/understanding-the-trust-equation)
diff --git a/src/data/roadmaps/flutter/content/100-dart-basics/101-variables.md b/src/data/roadmaps/flutter/content/100-dart-basics/101-variables.md
index 47806b934..3c35db35c 100644
--- a/src/data/roadmaps/flutter/content/100-dart-basics/101-variables.md
+++ b/src/data/roadmaps/flutter/content/100-dart-basics/101-variables.md
@@ -1,11 +1,6 @@
 # Variables
 
-In Flutter, variables are used to store values. There are two types of variables in Flutter:
-
-- local variables: These are declared within a function and are only accessible within that function
-- Instance variables: They are declared within a class and are accessible throughout the entire class.
-
-Variables in Flutter can store values of different data types, such as numbers, strings, booleans, and more.
+In Flutter, variables are used to store values. There are three types of variables in Flutter namely local, global and instance variables.Variables in Flutter can store values of different data types, such as numbers, strings, booleans, and more.
 
 Visit the following resources to learn more:
 
diff --git a/src/data/roadmaps/flutter/content/100-dart-basics/102-built-in-types.md b/src/data/roadmaps/flutter/content/100-dart-basics/102-built-in-types.md
index 2a8a6a93f..e6f92b4f9 100644
--- a/src/data/roadmaps/flutter/content/100-dart-basics/102-built-in-types.md
+++ b/src/data/roadmaps/flutter/content/100-dart-basics/102-built-in-types.md
@@ -1,19 +1,8 @@
 # Built-in Types
 
-There are several built-in data types, including:
-
-- int: used to store integers
-- double: used to store floating-point numbers
-- String: used to store text
-- bool: used to store true or false values
-- List: used to store ordered collections of objects
-- Sets: used to store unordered collection of unique items
-- Map: used to store unordered collections of key-value pairs
-
-Additionally, there are other complex data types like dynamic, var, and Object in Dart programming language which is used in Flutter.
+There are several built-in data types, including int, double, String, bool, List, Sets and Map. Additionally, there are other complex data types like dynamic, var, and Object in Dart programming language which is used in Flutter.
 
 Visit the following resources to learn more:
 
-- [@article@Built-in types](https://dart.dev/guides/language/language-tour#built-in-types)
-- [@article@Overview of Built-in Types](https://dart.dev/guides/language/coming-from/js-to-dart#built-in-types)
-- [@article@Collections | Dart](https://dart.dev/language/collections)
+- [@official@Built-in types](https://dart.dev/guides/language/language-tour#built-in-types)
+- [@official@Overview of Built-in Types](https://dart.dev/guides/language/coming-from/js-to-dart#built-in-types)
diff --git a/src/data/roadmaps/flutter/content/100-dart-basics/103-functions.md b/src/data/roadmaps/flutter/content/100-dart-basics/103-functions.md
index 0edac7a04..2637b9360 100644
--- a/src/data/roadmaps/flutter/content/100-dart-basics/103-functions.md
+++ b/src/data/roadmaps/flutter/content/100-dart-basics/103-functions.md
@@ -4,5 +4,4 @@ Dart is a true object-oriented language, so even functions are objects and have
 
 Visit the following resources to learn more:
 
-- [@article@Functions](https://dart.dev/guides/language/language-tour#functions)
-- [@article@Dart Function](https://www.javatpoint.com/dart-function)
+- [@official@Functions](https://dart.dev/guides/language/language-tour#functions)
diff --git a/src/data/roadmaps/flutter/content/100-dart-basics/104-operators.md b/src/data/roadmaps/flutter/content/100-dart-basics/104-operators.md
index d4ee9c2ef..c563ead62 100644
--- a/src/data/roadmaps/flutter/content/100-dart-basics/104-operators.md
+++ b/src/data/roadmaps/flutter/content/100-dart-basics/104-operators.md
@@ -1,15 +1,7 @@
 # Operators
 
-Operators are symbols or keywords used to perform operations on values. There are several types of operators available in Flutter:
-
-- Arithmetic operators: used to perform mathematical operations like addition (+), subtraction (-), multiplication (\*), division (/), and more.
-- Relational operators: used to compare values and return a boolean result (==, !=, >, <, >=, <=).
-- Logical operators: used to perform logical operations like AND (&&), OR (||), and NOT (!).
-- Assignment operators: used to assign values to variables (=, +=, -=, \*=, /=, %=).
-- Ternary operator: a shorthand way of writing simple if-else statements (condition ? if_true : if_false).
-
-These operators can be used to perform operations on values, variables, and expressions in Flutter.
+Flutter, and Dart, utilize various operators to manipulate data: arithmetic operators for math, relational operators for comparisons, logical operators for boolean logic, assignment operators for value assignment, and the ternary operator for concise conditional expressions, enabling diverse operations on values and variables.
 
 Visit the following resources to learn more:
 
-- [@article@Operators](https://dart.dev/guides/language/language-tour#operators)
+- [@official@Operators](https://dart.dev/guides/language/language-tour#operators)
diff --git a/src/data/roadmaps/flutter/content/100-dart-basics/105-control-flow-statements.md b/src/data/roadmaps/flutter/content/100-dart-basics/105-control-flow-statements.md
index 6e0b0ffad..3ef6ccc49 100644
--- a/src/data/roadmaps/flutter/content/100-dart-basics/105-control-flow-statements.md
+++ b/src/data/roadmaps/flutter/content/100-dart-basics/105-control-flow-statements.md
@@ -1,18 +1,8 @@
 # Control Flow Statements
 
-In Dart, control flow statements are used to control the flow of execution of a program. The following are the main types of control flow statements in Dart:
-
-- if-else: used to conditionally execute code based on a boolean expression.
-- for loop: used to repeat a block of code a specific number of times.
-- while loop: used to repeat a block of code as long as a given condition is true.
-- do-while loop: similar to the while loop, but the block of code is executed at least once before the condition is evaluated.
-- switch-case: used to select one of several code blocks to execute based on a value.
-- break: used to exit a loop early.
-- continue: used to skip the current iteration of a loop and continue with the next one.
-
-These control flow statements can be used to create complex logic and control the flow of execution in Dart programs.
+Dart's control flow statements manage program execution: `if-else` for conditional logic, `for`, `while`, and `do-while` loops for repetition, `switch-case` for multi-way selection, and `break` and `continue` to alter loop behavior, enabling complex program logic.
 
 Visit the following resources to learn more:
 
-- [@article@Branches in Dart](https://dart.dev/language/branches)
-- [@article@Loops in Dart](https://dart.dev/language/loops)
+- [@official@Branches](https://dart.dev/language/branches)
+- [@official@Loops](https://dart.dev/language/loops)
diff --git a/src/data/roadmaps/flutter/content/101-setup-development-environment/100-flutter-cli.md b/src/data/roadmaps/flutter/content/101-setup-development-environment/100-flutter-cli.md
index d8b4ca673..4cde0f5bc 100644
--- a/src/data/roadmaps/flutter/content/101-setup-development-environment/100-flutter-cli.md
+++ b/src/data/roadmaps/flutter/content/101-setup-development-environment/100-flutter-cli.md
@@ -8,10 +8,9 @@ Flutter CLI (Command Line Interface) is a command-line tool that is used to deve
 - Updating the Flutter framework and packages
 - Analyzing the performance of Flutter apps
 
-By using the Flutter CLI, developers can streamline the development process and automate repetitive tasks. The Flutter CLI is included in the Flutter SDK and is available for Windows, macOS, and Linux.
 Visit the following resources to learn more:
 
-- [@article@The Flutter command-line tool](https://docs.flutter.dev/reference/flutter-cli)
-- [@article@CLI Packages in Flutter](https://dart.dev/server/libraries#command-line-packages)
-- [@article@Get started with Flutter CLI](https://dart.dev/tutorials/server/get-started)
+- [@official@The Flutter CLI](https://docs.flutter.dev/reference/flutter-cli)
+- [@official@CLI Packages in Flutter](https://dart.dev/server/libraries#command-line-packages)
+- [@official@Get Started with Flutter CLI](https://dart.dev/tutorials/server/get-started)
 - [@feed@Explore top posts about CLI](https://app.daily.dev/tags/cli?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/101-setup-development-environment/101-ides/100-vs-code.md b/src/data/roadmaps/flutter/content/101-setup-development-environment/101-ides/100-vs-code.md
index 37dfe0636..f29627412 100644
--- a/src/data/roadmaps/flutter/content/101-setup-development-environment/101-ides/100-vs-code.md
+++ b/src/data/roadmaps/flutter/content/101-setup-development-environment/101-ides/100-vs-code.md
@@ -1,16 +1,3 @@
 # VS Code
 
 To use VS Code for Flutter development, you must install the Flutter and Dart plugins for VS Code. These plugins support Flutter-specific features such as syntax highlighting, debugging, and hot reloading.
-
-Here are the steps to set up VS Code for Flutter development:
-
-- Install VS Code from the official website: https://code.visualstudio.com/
-- Open VS Code and click the Extensions icon on the left-hand side of the window.
-- In the search box, type "Flutter" and press Enter. This will display a list of Flutter-related plugins.
-- Install the "Flutter" and "Dart" plugins by clicking the Install button next to each one.
-- Once the plugins are installed, you will need to restart VS Code for the changes to take effect.
-- To create a new Flutter project, click the File menu, then select New > New Project. This will open the New Project dialog box.
-- Select the Flutter application template, enter the project's name and location and click Create. This will create a new Flutter project in the specified location.
-- To run the project, open the command palette (Ctrl + Shift + P on Windows or Cmd + Shift + P on Mac) and type "flutter run". This will run the project on the default emulator or device.
-
-That's it! You should now be able to use VS Code for Flutter development.
diff --git a/src/data/roadmaps/flutter/content/101-setup-development-environment/101-ides/101-android-studio.md b/src/data/roadmaps/flutter/content/101-setup-development-environment/101-ides/101-android-studio.md
index fe468c4c4..748ef77d7 100644
--- a/src/data/roadmaps/flutter/content/101-setup-development-environment/101-ides/101-android-studio.md
+++ b/src/data/roadmaps/flutter/content/101-setup-development-environment/101-ides/101-android-studio.md
@@ -12,6 +12,6 @@ By providing a rich set of tools and features for Flutter development, Android S
 
 Learn more from the following links:
 
-- [@article@Android Studio for Flutter](https://docs.flutter.dev/development/tools/android-studio)
-- [@article@Get started with Android Studio](https://dart.dev/tools/jetbrains-plugin)
+- [@official@Android Studio for Flutter](https://docs.flutter.dev/development/tools/android-studio)
+- [@official@Get started with Android Studio](https://dart.dev/tools/jetbrains-plugin)
 - [@feed@Explore top posts about Android](https://app.daily.dev/tags/android?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/101-setup-development-environment/101-ides/102-intellij-idea.md b/src/data/roadmaps/flutter/content/101-setup-development-environment/101-ides/102-intellij-idea.md
index 15930841d..a7a014f6d 100644
--- a/src/data/roadmaps/flutter/content/101-setup-development-environment/101-ides/102-intellij-idea.md
+++ b/src/data/roadmaps/flutter/content/101-setup-development-environment/101-ides/102-intellij-idea.md
@@ -1,8 +1,10 @@
 # IntelliJ IDEA
 
+IntelliJ IDEA is a powerful Integrated Development Environment (IDE) created by JetBrains. Essentially, it's a software application that provides comprehensive facilities to computer programmers for software development.
+
 Learn more from the following:
 
+- [@official@IntelliJ IDEA](https://www.jetbrains.com/idea/)
 - [@article@IntelliJ IDEA for Flutter](https://docs.flutter.dev/development/tools/android-studio)
 - [@article@Get started with IntelliJ](https://dart.dev/tools/jetbrains-plugin)
-- [@article@IntelliJ IDEA](https://www.jetbrains.com/idea/)
 - [@feed@Explore top posts about DevTools](https://app.daily.dev/tags/devtools?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/101-setup-development-environment/101-ides/index.md b/src/data/roadmaps/flutter/content/101-setup-development-environment/101-ides/index.md
index ef6ecda5e..d62265c49 100644
--- a/src/data/roadmaps/flutter/content/101-setup-development-environment/101-ides/index.md
+++ b/src/data/roadmaps/flutter/content/101-setup-development-environment/101-ides/index.md
@@ -1,11 +1,6 @@
 # IDEs
 
-An IDE (Integrated Development Environment) is a software application that provides a comprehensive environment for coding, debugging, testing, and deploying software. There are several IDEs that support Flutter development, including:
-
-- Android Studio: Google's official IDE for Android development, which also supports Flutter development.
-- Visual Studio Code: a popular, free, and open-source code editor that can be extended with plugins, including the Flutter extension.
-- IntelliJ IDEA: a commercial Java IDE that also supports Flutter development.
-- Xcode: Apple's official IDE for iOS development, which also supports Flutter development for macOS and iOS.
+An IDE (Integrated Development Environment) is a software application that provides a comprehensive environment for coding, debugging, testing, and deploying software.
 
 These IDEs provide a variety of features and tools to assist in the development of Flutter apps, including code completion, debugging, testing, and more. Developers can choose the IDE that works best for their needs and preferences.
 
diff --git a/src/data/roadmaps/flutter/content/101-setup-development-environment/102-fvm.md b/src/data/roadmaps/flutter/content/101-setup-development-environment/102-fvm.md
index 8d387d25c..1e105a48f 100644
--- a/src/data/roadmaps/flutter/content/101-setup-development-environment/102-fvm.md
+++ b/src/data/roadmaps/flutter/content/101-setup-development-environment/102-fvm.md
@@ -2,12 +2,7 @@
 
 Flutter version manager is a tool used to manage different versions of Flutter SDK on a developer's machine. Flutter is a popular open-source mobile application development framework, and its SDK is updated frequently with new features, bug fixes, and improvements. However, sometimes developers need to work with older versions of Flutter due to various reasons like compatibility issues or project requirements.
 
-Flutter version manager allows developers to easily switch between different versions of the Flutter SDK on their machine without having to uninstall or manually install each version. It provides a command-line interface (CLI) that enables developers to install, list, and switch between different Flutter SDK versions.
+Visit the following resources to learn more:
 
-Flutter version manager also allows developers to easily manage their Flutter channel, which determines the frequency of SDK updates they receive. For example, developers can switch between the stable, beta, or dev channel based on their preferences.
-
-Using Flutter version manager can help developers ensure that their project works with the desired version of Flutter SDK and minimize the time and effort required to manage multiple Flutter SDK versions.
-
-Here are some of the links
-
-- [@official@Flutter Version Manager - Official Website](https://fvm.app/)
+- [@official@Flutter Version Manager](https://fvm.app/)
+- [@official@Flutter Version Manager - Documentation](https://fvm.app/documentation/getting-started)
\ No newline at end of file
diff --git a/src/data/roadmaps/flutter/content/101-setup-development-environment/index.md b/src/data/roadmaps/flutter/content/101-setup-development-environment/index.md
index 3bd96597c..d3d2d7433 100644
--- a/src/data/roadmaps/flutter/content/101-setup-development-environment/index.md
+++ b/src/data/roadmaps/flutter/content/101-setup-development-environment/index.md
@@ -2,15 +2,15 @@
 
 To set up a development environment for Flutter, you need to install the following software:
 
-- Flutter SDK: Download and install the latest version of the Flutter SDK from the official website (https://flutter.dev/docs/get-started/install).
+- Flutter SDK: Download and install the latest version of the Flutter SDK from the official website.
 - Integrated Development Environment (IDE): You can use Android Studio, Visual Studio Code, IntelliJ IDEA or any other IDE of your choice.
 - Emulator or a physical device: You can use an emulator or a physical device to run and test your Flutter apps. You can use the Android emulator provided by Android Studio or use a physical Android or iOS device.
-- Git: Git is used for version control and is recommended for Flutter development. You can download and install Git from https://git-scm.com/.
+- Git: Git is used for version control and is recommended for Flutter development. You can download and install Git.
 - Dart SDK: Dart is the programming language used by Flutter, and the Dart SDK is required to develop Flutter apps. The Dart SDK is included in the Flutter SDK.
 
 Once you have installed all the required software, you can create a new Flutter project using the Flutter CLI or your IDE, and start building your app.
 
 Learn more from the following links:
 
-- [@article@Get started with Flutter](https://docs.flutter.dev/get-started/install)
-- [@article@Installing Dart SDK](https://dart.dev/get-dart)
+- [@official@Get Started with Flutter](https://docs.flutter.dev/get-started/install)
+- [@official@Installing Dart SDK](https://dart.dev/get-dart)
diff --git a/src/data/roadmaps/flutter/content/102-widgets/100-stateless-widgets.md b/src/data/roadmaps/flutter/content/102-widgets/100-stateless-widgets.md
index b2d9f65af..38801e4b7 100644
--- a/src/data/roadmaps/flutter/content/102-widgets/100-stateless-widgets.md
+++ b/src/data/roadmaps/flutter/content/102-widgets/100-stateless-widgets.md
@@ -4,5 +4,5 @@ Stateless widgets in Flutter are widgets that don't maintain any mutable state.
 
 Visit the following resources to learn more:
 
-- [@article@StatelessWidget class](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html)
+- [@official@StatelessWidget Class](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html)
 - [@article@How to Create Stateless Widgets](https://medium.com/flutter/how-to-create-stateless-widgets-6f33931d859)
diff --git a/src/data/roadmaps/flutter/content/102-widgets/101-stateful-widgets.md b/src/data/roadmaps/flutter/content/102-widgets/101-stateful-widgets.md
index 8cb453a59..05edfe20a 100644
--- a/src/data/roadmaps/flutter/content/102-widgets/101-stateful-widgets.md
+++ b/src/data/roadmaps/flutter/content/102-widgets/101-stateful-widgets.md
@@ -4,5 +4,5 @@ A stateful widget is dynamic: for example, it can change its appearance in respo
 
 Visit the following resources to learn more:
 
-- [@article@StatefulWidget class](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)
+- [@official@StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)
 - [@video@Flutter Tutorial - Stateful Widgets](https://www.youtube.com/watch?v=p5dkB3Mrxdo)
diff --git a/src/data/roadmaps/flutter/content/102-widgets/102-styled-widgets/100-material-widgets.md b/src/data/roadmaps/flutter/content/102-widgets/102-styled-widgets/100-material-widgets.md
index 63cbd78ff..dc88910e9 100644
--- a/src/data/roadmaps/flutter/content/102-widgets/102-styled-widgets/100-material-widgets.md
+++ b/src/data/roadmaps/flutter/content/102-widgets/102-styled-widgets/100-material-widgets.md
@@ -1,20 +1,11 @@
 # Material Widgets
 
-Material Widgets are a set of Flutter widgets that implement Material Design, Google's visual language for design. They are designed to provide a consistent look and feel on both Android and iOS devices. Some common Material Widgets include:
-
-- ElevatedButton
-- Scaffold
-- AppBar
-- TextField
-- Drawer
-- SnackBar
-- BottomNavigationBar
-- IconButton
+Material Widgets are a set of Flutter widgets that implement Material Design, Google's visual language for design. They are designed to provide a consistent look and feel on both Android and iOS devices.
 
 These widgets are commonly used in Flutter apps to provide a familiar look and feel that follows Material Design guidelines.
 
 Visit the following resources to learn more:
 
-- [@article@Material Components widgets](https://docs.flutter.dev/development/ui/widgets/material)
-- [@article@Widget catalog in Flutter](https://docs.flutter.dev/development/ui/widgets)
-- [@article@Material Designs Guidlines](https://m2.material.io/design/guidelines-overview)
+- [@official@Material Components Widgets](https://docs.flutter.dev/development/ui/widgets/material)
+- [@official@Widget catalog in Flutter](https://docs.flutter.dev/development/ui/widgets)
+- [@article@Material Designs Guidelines](https://m2.material.io/design/guidelines-overview)
diff --git a/src/data/roadmaps/flutter/content/102-widgets/102-styled-widgets/101-cupertino-widgets.md b/src/data/roadmaps/flutter/content/102-widgets/102-styled-widgets/101-cupertino-widgets.md
index 9db0c7ced..079436112 100644
--- a/src/data/roadmaps/flutter/content/102-widgets/102-styled-widgets/101-cupertino-widgets.md
+++ b/src/data/roadmaps/flutter/content/102-widgets/102-styled-widgets/101-cupertino-widgets.md
@@ -1,9 +1,9 @@
-# Cupertino widgets
+# Cupertino Widgets
 
 Cupertino widgets are a set of Flutter widgets that mimic the look and feel of Apple's iOS user interface. They are designed to provide a consistent look and feel on both iOS and Android devices, and include widgets such as CupertinoButton, CupertinoAlertDialog, and CupertinoSlider. These widgets are useful for building cross-platform apps that need to conform to the iOS design aesthetic.s
 
 Visit the following resources to learn more:
 
-- [@article@Cupertino (iOS-style) widgets](https://docs.flutter.dev/development/ui/widgets/cupertino)
+- [@official@Cupertino (iOS-style) Widgets](https://docs.flutter.dev/development/ui/widgets/cupertino)
 - [@article@Flutter Cupertino Tutorial](https://blog.logrocket.com/flutter-cupertino-tutorial-build-ios-apps-native/)
 - [@video@Flutter Cupertino Widgets](https://www.youtube.com/watch?v=L-TY_5NZ7z4)
diff --git a/src/data/roadmaps/flutter/content/102-widgets/102-styled-widgets/index.md b/src/data/roadmaps/flutter/content/102-widgets/102-styled-widgets/index.md
index f75cdc8ef..3ada8d3ff 100644
--- a/src/data/roadmaps/flutter/content/102-widgets/102-styled-widgets/index.md
+++ b/src/data/roadmaps/flutter/content/102-widgets/102-styled-widgets/index.md
@@ -1,13 +1,8 @@
 # Styled Widgets
 
-Styled Widgets are Flutter widgets that are decorated with custom styles, such as colors, fonts, and shapes. They can be created by wrapping existing widgets with other widgets, such as Container, Theme, or BoxDecoration. For example:
-
-- Container widget can be used to set a fixed width, height, padding, and margin.
-- Theme widget can be used to specify a color scheme and typography for an entire app or a section of it.
-- BoxDecoration can be used to add a border, background color, and a border radius to a widget.
-- Styled Widgets allow developers to easily customize the look and feel of their Flutter app and create a consistent visual style.
+Styled Widgets are Flutter widgets that are decorated with custom styles, such as colors, fonts, and shapes. They can be created by wrapping existing widgets with other widgets, such as Container, Theme, or BoxDecoration.
 
 Learn more from the following links:
 
-- [@article@Styling widgets in Flutter](https://docs.flutter.dev/development/ui/widgets/styling)
+- [@official@Styling Widgets](https://docs.flutter.dev/development/ui/widgets/styling)
 - [@video@Style Your Flutter Widgets](https://www.youtube.com/watch?v=kcq8AbVyMbk)
diff --git a/src/data/roadmaps/flutter/content/102-widgets/103-inherited-widgets.md b/src/data/roadmaps/flutter/content/102-widgets/103-inherited-widgets.md
index 4a817b892..585812531 100644
--- a/src/data/roadmaps/flutter/content/102-widgets/103-inherited-widgets.md
+++ b/src/data/roadmaps/flutter/content/102-widgets/103-inherited-widgets.md
@@ -1,3 +1,7 @@
 # Inherited Widgets
 
-- [@article@InheritedWidget Official Guide](https://api.flutter.dev/flutter/widgets/InheritedWidget-class.html)
+Inherited widgets in Flutter are a powerful mechanism for efficiently propagating data down the widget tree. They essentially create a shared data scope that descendant widgets can access without needing to explicitly pass the data through constructors. When a widget needs to access data from an ancestor, it can simply look up the nearest inherited widget of the desired type.
+
+Visit the following resources to learn more:
+
+- [@official@Inherited Widgets](https://api.flutter.dev/flutter/widgets/InheritedWidget-class.html)
diff --git a/src/data/roadmaps/flutter/content/102-widgets/104-responsive-widgets.md b/src/data/roadmaps/flutter/content/102-widgets/104-responsive-widgets.md
index ed252de3a..a82146558 100644
--- a/src/data/roadmaps/flutter/content/102-widgets/104-responsive-widgets.md
+++ b/src/data/roadmaps/flutter/content/102-widgets/104-responsive-widgets.md
@@ -1,3 +1,7 @@
 # Responsive Widgets
 
-- [@article@Official flutter responsive widget ](https://docs.flutter.dev/ui/layout/adaptive-responsive)
+Responsive widgets in Dart, primarily within Flutter, are crucial for building applications that adapt to diverse screen sizes and orientations. Developers achieve this adaptability using tools like `LayoutBuilder` to respond to available space, `MediaQuery` to gather device information, and `Expanded` and `Flexible` for dynamic space distribution. `AspectRatio` maintains proportions, `OrientationBuilder` adjusts for landscape or portrait modes, and `Wrap` handles overflow by moving widgets to new lines. Adaptive widgets and custom layouts further enhance platform-specific responsiveness. By employing these techniques and considering breakpoints and thorough testing, developers can create Flutter apps that provide a consistent and optimal user experience across various devices.
+
+Visit the following resources to learn more:
+
+- [@official@Responsive Widget](https://docs.flutter.dev/ui/layout/adaptive-responsive)
diff --git a/src/data/roadmaps/flutter/content/102-widgets/index.md b/src/data/roadmaps/flutter/content/102-widgets/index.md
index 26e235add..6be6b7822 100644
--- a/src/data/roadmaps/flutter/content/102-widgets/index.md
+++ b/src/data/roadmaps/flutter/content/102-widgets/index.md
@@ -1,21 +1,9 @@
 # Widgets
 
-Widgets in Flutter are the basic building blocks of the user interface. They define how the UI looks and behaves. Widgets can be combined to create complex user interfaces and can be easily customized. Some common types of widgets include:
-
-- Text
-- Image
-- Button
-- Container
-- Card
-- Column & Row
-- ListView
-- AppBar
-- Scaffold
-
-Widgets in Flutter are also designed to be highly reusable, allowing developers to build complex UIs quickly and efficiently.
+Widgets in Flutter are the basic building blocks of the user interface. They define how the UI looks and behaves. Widgets can be combined to create complex user interfaces and can be easily customized. Widgets in Flutter are also designed to be highly reusable, allowing developers to build complex UIs quickly and efficiently.
 
 Visit the following resources to learn more:
 
-- [@article@Introduction to widgets](https://docs.flutter.dev/development/ui/widgets-intro)
-- [@article@Widget catalog](https://docs.flutter.dev/development/ui/widgets)
+- [@official@Introduction to Widgets](https://docs.flutter.dev/development/ui/widgets-intro)
+- [@official@Widget Catalog](https://docs.flutter.dev/development/ui/widgets)
 - [@video@Flutter Widgets Explained](https://www.youtube.com/watch?v=FU2Eeizo95o)
diff --git a/src/data/roadmaps/flutter/content/103-working-with-assets/100-fonts.md b/src/data/roadmaps/flutter/content/103-working-with-assets/100-fonts.md
index e659efe90..20a2da6a1 100644
--- a/src/data/roadmaps/flutter/content/103-working-with-assets/100-fonts.md
+++ b/src/data/roadmaps/flutter/content/103-working-with-assets/100-fonts.md
@@ -9,5 +9,5 @@ You can use custom fonts in your app by including the font file in your app's as
 
 Visit the following resources to learn more:
 
-- [@article@Font - Flutter](https://docs.flutter.dev/cookbook/design/fonts)
+- [@official@Fonts](https://docs.flutter.dev/cookbook/design/fonts)
 - [@article@How to use custom fonts in Flutter](https://blog.logrocket.com/use-custom-fonts-flutter/)
diff --git a/src/data/roadmaps/flutter/content/103-working-with-assets/101-images.md b/src/data/roadmaps/flutter/content/103-working-with-assets/101-images.md
index 0b720b25f..3b26875ad 100644
--- a/src/data/roadmaps/flutter/content/103-working-with-assets/101-images.md
+++ b/src/data/roadmaps/flutter/content/103-working-with-assets/101-images.md
@@ -10,5 +10,5 @@ The `Image` widget also accepts additional parameters such as `fit`, `width`, an
 
 Visit the following resources to learn more:
 
-- [@article@Adding assets and images](https://docs.flutter.dev/development/ui/assets-and-images)
+- [@official@Adding Assets and Images](https://docs.flutter.dev/development/ui/assets-and-images)
 - [@article@Images in Flutter](https://docs.flutter.dev/cookbook/images)
diff --git a/src/data/roadmaps/flutter/content/103-working-with-assets/102-other-file-types.md b/src/data/roadmaps/flutter/content/103-working-with-assets/102-other-file-types.md
index 58f5ef254..1b390f5ea 100644
--- a/src/data/roadmaps/flutter/content/103-working-with-assets/102-other-file-types.md
+++ b/src/data/roadmaps/flutter/content/103-working-with-assets/102-other-file-types.md
@@ -4,10 +4,9 @@ In Flutter, you can work with different file types besides images. Some common f
 
 1. Text files: You can read or write text files using the dart:io library.
 2. JSON files: You can parse JSON data using the dart:convert library.
-   javascript
 3. Audio and Video files: You can play audio and video files using the video_player and audioplayers packages.
 4. PDF files: You can display PDF files using the pdf package.
 
 Learn more from the following links:
 
-- [@article@File class](https://api.flutter.dev/flutter/dart-io/File-class.html)
+- [@official@File Class](https://api.flutter.dev/flutter/dart-io/File-class.html)
diff --git a/src/data/roadmaps/flutter/content/103-working-with-assets/index.md b/src/data/roadmaps/flutter/content/103-working-with-assets/index.md
index 8e167095d..59f15f95d 100644
--- a/src/data/roadmaps/flutter/content/103-working-with-assets/index.md
+++ b/src/data/roadmaps/flutter/content/103-working-with-assets/index.md
@@ -2,14 +2,9 @@
 
 Assets are resources such as images, fonts, and other files that are included in your app. To use assets in Flutter, you need to specify them in your app's `pubspec.yaml` file and then access them in your code.
 
-Here's how to work with assets in Flutter:
-
-1. Add assets to your app's `pubspec.yaml` file:
-2. Access assets in your code
-
 The `pubspec.yaml` file is used to manage dependencies, assets, and other settings in your Flutter app. The `flutter` section is used to specify assets that should be included with the app. The path specified in the `assets` section should be relative to the `pubspec.yaml` file.
 
 Learn more from the following links:
 
+- [@official@Adding Assets in Flutter](https://docs.flutter.dev/development/ui/assets-and-images)
 - [@video@Flutter Tutorial - Assets](https://www.youtube.com/watch?v=Hxh6nNHSUjo)
-- [@article@Adding Assets in Flutter](https://docs.flutter.dev/development/ui/assets-and-images)
diff --git a/src/data/roadmaps/flutter/content/104-version-control-systems/100-git.md b/src/data/roadmaps/flutter/content/104-version-control-systems/100-git.md
index ce8202489..6e1632d54 100644
--- a/src/data/roadmaps/flutter/content/104-version-control-systems/100-git.md
+++ b/src/data/roadmaps/flutter/content/104-version-control-systems/100-git.md
@@ -1,10 +1,12 @@
 # Git
 
-[Git](https://git-scm.com/) is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
+Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
 
 Visit the following resources to learn more:
 
-- [@video@Git & GitHub Crash Course For Beginners](https://www.youtube.com/watch?v=SWYqp7iY_Tc)
+- [@roadmap@Visit Dedicated Git & GitHub Roadmap](https://roadmap.sh/git-github)
+- [@official@Git Documentation](https://git-scm.com/)
 - [@article@Learn Git with Tutorials, News and Tips - Atlassian](https://www.atlassian.com/git)
+- [@video@Git & GitHub Crash Course For Beginners](https://www.youtube.com/watch?v=SWYqp7iY_Tc)
 - [@article@Git Cheat Sheet](https://cs.fyi/guide/git-cheatsheet)
 - [@feed@Explore top posts about Git](https://app.daily.dev/tags/git?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/104-version-control-systems/index.md b/src/data/roadmaps/flutter/content/104-version-control-systems/index.md
index 12575facb..c501e1816 100644
--- a/src/data/roadmaps/flutter/content/104-version-control-systems/index.md
+++ b/src/data/roadmaps/flutter/content/104-version-control-systems/index.md
@@ -4,6 +4,8 @@ Version control systems allow you to track changes to your codebase/files over t
 
 Visit the following resources to learn more:
 
+- [@article@What is Version Control? - Github](https://github.com/resources/articles/software-development/what-is-version-control)
+- [@article@What is Version Control? - Atlassian](https://www.atlassian.com/git/tutorials/what-is-version-control)
 - [@video@Version Control System Introduction](https://www.youtube.com/watch?v=zbKdDsNNOhg)
 - [@video@Git & GitHub Crash Course For Beginners](https://www.youtube.com/watch?v=SWYqp7iY_Tc)
 - [@video@Learn Git in 20 Minutes](https://youtu.be/Y9XZQO1n_7c?t=21)
diff --git a/src/data/roadmaps/flutter/content/105-repo-hosting-services/100-github.md b/src/data/roadmaps/flutter/content/105-repo-hosting-services/100-github.md
index 28bd12052..a7ae9c745 100644
--- a/src/data/roadmaps/flutter/content/105-repo-hosting-services/100-github.md
+++ b/src/data/roadmaps/flutter/content/105-repo-hosting-services/100-github.md
@@ -2,18 +2,11 @@
 
 GitHub is a web-based platform that provides hosting for software development and version control using Git. It is widely used by developers and organizations around the world to manage and collaborate on software projects.
 
-With GitHub, you can:
-
-- Store your code in a repository (repo) and version it using Git.
-- Collaborate with other people on a project by sharing your repo and working together on code changes.
-- Share your projects with the world by making your repos public.
-- Use GitHub to discover new projects and contribute to existing ones by forking a repo, making changes, and submitting a pull request.
-- Track issues and bugs, and manage projects with features like project boards, milestones, and wikis.
-
-GitHub also provides a wide range of tools and services for developers, including GitHub Pages for hosting websites, GitHub Actions for automating workflows, and GitHub Marketplace for finding and integrating with third-party tools.
-
 Learn more from the following resources:
 
+- [@roadmap@Visit Dedicated GitHub Roadmap](https://roadmap.sh/git-github)
+- [@official@GitHub](https://github.com)
+- [@official@GitHub Documentation](https://docs.github.com/en/get-started/quickstart)
+- [@video@What is GitHub?](https://www.youtube.com/watch?v=w3jLJU7DT5E)
 - [@video@Git and GitHub for Beginners - Crash Course](https://www.youtube.com/watch?v=RGOj5yH7evk)
-- [@article@Get Started with Github](https://docs.github.com/en)
 - [@feed@Explore top posts about GitHub](https://app.daily.dev/tags/github?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/105-repo-hosting-services/index.md b/src/data/roadmaps/flutter/content/105-repo-hosting-services/index.md
index a5561f297..2c4a466e6 100644
--- a/src/data/roadmaps/flutter/content/105-repo-hosting-services/index.md
+++ b/src/data/roadmaps/flutter/content/105-repo-hosting-services/index.md
@@ -1,17 +1,12 @@
 # Repo Hosting Services
 
-There are several repository hosting services that support Flutter development. Here are some popular options:
-
-- GitHub: One of the most widely used repository hosting services for Flutter projects. It provides hosting for Git repositories, issue tracking, collaboration, and many other features.
-- GitLab: A web-based Git repository manager that provides a wide range of features, including version control, issue tracking, continuous integration, and more.
-- Bitbucket: A Git and Mercurial repository hosting service that provides features such as pull requests, code reviews, and team management.
-- AWS CodeCommit: A fully managed Git repository service provided by Amazon Web Services. It integrates with other AWS services and provides features such as branch protection, code reviews, and continuous integration.
-- Azure DevOps: A set of development tools, services, and features provided by Microsoft, including version control (Git), continuous integration, and project management.
-
-When choosing a repository hosting service for your Flutter project, consider your specific needs and requirements, such as collaboration, scalability, and cost. You may also want to consider factors such as ease of use, integrations, and support for third-party tools.
+Several popular repository hosting services, including GitHub, GitLab, Bitbucket, AWS CodeCommit, and Azure DevOps, support Flutter development by offering Git repository management, issue tracking, and collaboration tools. When selecting a service, developers should consider factors like project needs, scalability, cost, ease of use, integrations, and third-party tool support to ensure the chosen platform aligns with their specific requirements.
 
 Learn more from the following links:
 
+- [@official@Github](https://github.com/)
+- [@official@Gitlab](https://gitlab.com/)
+- [@official@Azure](https://azure.microsoft.com/)
 - [@video@Host Flutter Website On GitHub Pages](https://www.youtube.com/watch?v=z-yOqoQ2q6s)
 - [@article@How to Deploy a Flutter Web App?](https://medium.com/solute-labs/flutter-for-web-how-to-deploy-a-flutter-web-app-c7d9db7ced2e)
 - [@article@Deploying - Flutter](https://docs.flutter.dev/deployment/web#deploying-to-the-web)
diff --git a/src/data/roadmaps/flutter/content/106-design-principles/100-dependency-injection.md b/src/data/roadmaps/flutter/content/106-design-principles/100-dependency-injection.md
index 0dba312a5..23b795dfe 100644
--- a/src/data/roadmaps/flutter/content/106-design-principles/100-dependency-injection.md
+++ b/src/data/roadmaps/flutter/content/106-design-principles/100-dependency-injection.md
@@ -2,15 +2,9 @@
 
 Dependency Injection is a design pattern that allows objects to receive their dependencies from external sources instead of creating them internally. In Flutter, this can be useful for managing complex state, reducing coupling between components, and making testing easier.
 
-Here's how to use dependency injection in Flutter:
-
-- Create a dependency
-- Create a provider
-- Use the provider in your widget tree
-- Access the dependency in a widget
-
 Learn more from the following links:
 
+- [@article@Dependency Injection](https://docs.flutter.dev/app-architecture/case-study/dependency-injection)
 - [@article@Dependency Injection In Flutter](https://medium.com/flutter-community/dependency-injection-in-flutter-f19fb66a0740)
 - [@video@Flutter Dependency Injection For Beginners](https://www.youtube.com/watch?v=vBT-FhgMaWM)
 - [@feed@Explore top posts about Dependency Injection](https://app.daily.dev/tags/dependency-injection?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/106-design-principles/101-design-patterns.md b/src/data/roadmaps/flutter/content/106-design-principles/101-design-patterns.md
index 4eb8e34a7..144202968 100644
--- a/src/data/roadmaps/flutter/content/106-design-principles/101-design-patterns.md
+++ b/src/data/roadmaps/flutter/content/106-design-principles/101-design-patterns.md
@@ -1,17 +1,6 @@
 # Design Patterns
 
-Design patterns are solutions to common problems in software development that can be used to improve the quality and maintainability of your code. Here are some popular design patterns that are commonly used in Flutter development:
-
-- Model-View-Controller (MVC)
-- Model-View-ViewModel (MVVM)
-- Provider Pattern
-- Bloc Pattern
-- Singleton Pattern
-- Factory Pattern
-- Builder Pattern
-- Composite Pattern
-
-When choosing a design pattern for your Flutter application, consider your specific requirements and use cases. You may also want to consider the trade-offs between different patterns, such as maintainability, scalability, and ease of use.
+Design patterns are solutions to common problems in software development that can be used to improve the quality and maintainability of your code.
 
 Learn more from the following links:
 
diff --git a/src/data/roadmaps/flutter/content/106-design-principles/102-solid-principles.md b/src/data/roadmaps/flutter/content/106-design-principles/102-solid-principles.md
index 74677bd88..64cc712eb 100644
--- a/src/data/roadmaps/flutter/content/106-design-principles/102-solid-principles.md
+++ b/src/data/roadmaps/flutter/content/106-design-principles/102-solid-principles.md
@@ -1,7 +1,10 @@
 # SOLID Principles
 
+SOLID is a mnemonic acronym for five design principles intended to make object-oriented designs more understandable, flexible, and maintainable.
+
 Learn more from the following links:
 
+- [@article@SOLID: The First 5 Principles of Object Oriented Design](https://www.digitalocean.com/community/conceptual-articles/s-o-l-i-d-the-first-five-principles-of-object-oriented-design)
 - [@video@S.O.L.I.D Principles](https://www.youtube.com/watch?v=fvNTJang7l4)
 - [@article@Overview of S.O.L.I.D Principles In Dart](https://medium.flutterdevs.com/s-o-l-i-d-principles-in-dart-e6c0c8d1f8f1)
 - [@article@The S.O.L.I.D Principles in Pictures](https://medium.com/backticks-tildes/the-s-o-l-i-d-principles-in-pictures-b34ce2f1e898)
diff --git a/src/data/roadmaps/flutter/content/106-design-principles/index.md b/src/data/roadmaps/flutter/content/106-design-principles/index.md
index 5e170d5a4..76e291132 100644
--- a/src/data/roadmaps/flutter/content/106-design-principles/index.md
+++ b/src/data/roadmaps/flutter/content/106-design-principles/index.md
@@ -1,16 +1,6 @@
 # Design Principles
 
-Here are some common design principles that are often followed in Flutter development:
-
-- Material Design: A design system developed by Google that provides a consistent look and feel across all platforms and devices.
-- Responsiveness: Designing the user interface to work seamlessly on different screen sizes and aspect ratios.
-- User-centered Design: Designing the application with the user's needs and goals in mind.
-- Simplicity: Designing the user interface to be simple and intuitive, minimizing the number of steps needed to complete a task.
-- Consistency: Maintaining a consistent look and feel throughout the application, using consistent colors, typography, and layout.
-- Accessibility: Making the application usable by people with disabilities, including screen reader support, keyboard accessibility, and high-contrast mode.
-- Performance: Designing the application to be fast and responsive, even on low-end devices.
-
-By following these design principles, you can create a user-friendly and visually appealing application that provides a great user experience.
+Flutter development emphasizes design principles like Material Design, responsiveness, user-centeredness, simplicity, consistency, accessibility, and performance to create visually appealing and user-friendly applications that function seamlessly across various devices and cater to diverse user needs.
 
 Learn more from the following:
 
diff --git a/src/data/roadmaps/flutter/content/107-package-manager/100-pub-dev.md b/src/data/roadmaps/flutter/content/107-package-manager/100-pub-dev.md
index 2e8ee2809..99ae99052 100644
--- a/src/data/roadmaps/flutter/content/107-package-manager/100-pub-dev.md
+++ b/src/data/roadmaps/flutter/content/107-package-manager/100-pub-dev.md
@@ -1,8 +1,8 @@
-# Pub dev
+# pub.dev
 
 `pub.dev` is the official package repository for Dart and Flutter packages. It is a platform for hosting, managing, and distributing Dart packages and Flutter plugins. Developers can use `pub.dev` to search for packages, find information about packages, and install packages in their Flutter projects.
 
 Visit the following resources to learn more:
 
 - [@official@pub.dev](https://pub.dev/)
-- [@article@Using packages](https://docs.flutter.dev/development/packages-and-plugins/using-packages)
+- [@official@Using packages](https://docs.flutter.dev/development/packages-and-plugins/using-packages)
diff --git a/src/data/roadmaps/flutter/content/107-package-manager/101-flutter-pub-dart-pub.md b/src/data/roadmaps/flutter/content/107-package-manager/101-flutter-pub-dart-pub.md
index 4f05d1732..251da99c8 100644
--- a/src/data/roadmaps/flutter/content/107-package-manager/101-flutter-pub-dart-pub.md
+++ b/src/data/roadmaps/flutter/content/107-package-manager/101-flutter-pub-dart-pub.md
@@ -2,15 +2,7 @@
 
 `pub` is the package manager for Dart and Flutter, used for managing dependencies and publishing packages.
 
-With `pub`, developers can:
-
-- Search for and download packages from the `pub.dev` repository.
-- Manage dependencies in their projects, including adding, updating, and removing packages.
-- Publish their own packages to `pub.dev` for others to use.
-
-`pub` uses a `pubspec.yaml` file in each project to manage dependencies and define the package metadata. This file includes information such as the package name, version, and dependencies.
-
-In Flutter projects, `pub` is used to manage both Dart packages and Flutter plugins. This makes it easy to find and use packages that extend the functionality of your Flutter application.
+`pub` is used to manage both Dart packages and Flutter plugins. This makes it easy to find and use packages that extend the functionality of your Flutter application.
 
 `pub` is an essential tool for Dart and Flutter development, providing a centralized repository for packages, making it easier to find, install, and manage dependencies in your projects.
 
diff --git a/src/data/roadmaps/flutter/content/107-package-manager/index.md b/src/data/roadmaps/flutter/content/107-package-manager/index.md
index 48ff86135..22bf1deee 100644
--- a/src/data/roadmaps/flutter/content/107-package-manager/index.md
+++ b/src/data/roadmaps/flutter/content/107-package-manager/index.md
@@ -4,5 +4,5 @@ The package manager for Flutter is called pub. It is used to manage Flutter proj
 
 Visit the following resources to learn more:
 
-- [@article@Packages and Plugins](https://docs.flutter.dev/development/packages-and-plugins)
+- [@official@Packages and Plugins](https://docs.flutter.dev/development/packages-and-plugins)
 - [@video@Dart Package Manager (pub.dev) in Flutter](https://www.youtube.com/watch?v=F1VRO0_MKLs)
diff --git a/src/data/roadmaps/flutter/content/108-working-with-apis/100-json.md b/src/data/roadmaps/flutter/content/108-working-with-apis/100-json.md
index 4cac1d2bb..78372951a 100644
--- a/src/data/roadmaps/flutter/content/108-working-with-apis/100-json.md
+++ b/src/data/roadmaps/flutter/content/108-working-with-apis/100-json.md
@@ -8,5 +8,5 @@ To encode a Dart object to a JSON string, you can use the `jsonEncode` function
 
 Visit the following resources to learn more:
 
-- [@article@JSON and serialization](https://docs.flutter.dev/development/data-and-backend/json)
-- [@article@Using JSON](https://dart.dev/guides/json)
+- [@official@JSON and serialization](https://docs.flutter.dev/development/data-and-backend/json)
+- [@official@Using JSON](https://dart.dev/guides/json)
diff --git a/src/data/roadmaps/flutter/content/108-working-with-apis/101-web-sockets.md b/src/data/roadmaps/flutter/content/108-working-with-apis/101-web-sockets.md
index a82ae93b8..6ba300b42 100644
--- a/src/data/roadmaps/flutter/content/108-working-with-apis/101-web-sockets.md
+++ b/src/data/roadmaps/flutter/content/108-working-with-apis/101-web-sockets.md
@@ -4,5 +4,5 @@ In addition to normal HTTP requests, you can connect to servers using WebSockets
 
 Visit the following resources to learn more:
 
-- [@article@Work with WebSockets](https://docs.flutter.dev/cookbook/networking/web-sockets)
+- [@official@Work with WebSockets](https://docs.flutter.dev/cookbook/networking/web-sockets)
 - [@article@What is WebSocket and How It Works?](https://www.wallarm.com/what/a-simple-explanation-of-what-a-websocket-is)
diff --git a/src/data/roadmaps/flutter/content/108-working-with-apis/102-graphql.md b/src/data/roadmaps/flutter/content/108-working-with-apis/102-graphql.md
index 7b7170020..acea02d04 100644
--- a/src/data/roadmaps/flutter/content/108-working-with-apis/102-graphql.md
+++ b/src/data/roadmaps/flutter/content/108-working-with-apis/102-graphql.md
@@ -2,10 +2,8 @@
 
 GraphQL is a query language for your API that allows clients to request exactly the data they need, and nothing more. It was developed by Facebook and released as open source in 2015.
 
-One of the main benefits of GraphQL is that it allows the client to request specific fields on demand, rather than having the server determine what data to send in a fixed response format. This allows the client to request only the data it needs, reducing network traffic and improving the efficiency of the API.
+Visit the following resources to learn more:
 
-If you want to learn more about GraphQL, here are a few links to get you started:
-
-[GraphQL official website](https://graphql.org/) - This is the official website for GraphQL, which provides an overview of the language, as well as documentation and resources for learning more.
-
-[How to GraphQL](https://www.howtographql.com/) - This is a comprehensive tutorial that covers everything you need to know about GraphQL, including the basics of the language, how to set up a GraphQL server, and how to use GraphQL in a client application.
+- [@roadmap@Visit Dedicated GraphQL Roadmap](https://roadmap.sh/graphql)
+- [@official@GraphQL](https://graphql.org)
+- [@official@Learn GraphQL](https://graphql.org/learn)
diff --git a/src/data/roadmaps/flutter/content/109-storage/101-shared-preferences.md b/src/data/roadmaps/flutter/content/109-storage/101-shared-preferences.md
index 0e808a75e..cfcb49fe7 100644
--- a/src/data/roadmaps/flutter/content/109-storage/101-shared-preferences.md
+++ b/src/data/roadmaps/flutter/content/109-storage/101-shared-preferences.md
@@ -4,5 +4,5 @@ In Flutter, SharedPreferences is a plugin allowing you to store data in key-valu
 
 Visit the following resources to learn more:
 
-- [@article@shared_preferences - pub.dev package](https://pub.dev/packages/shared_preferences)
-- [@article@How do I access Shared Preferences?](https://docs.flutter.dev/get-started/flutter-for/android-devs#how-do-i-access-shared-preferences)
+- [@official@How do I Access Shared Preferences?](https://docs.flutter.dev/get-started/flutter-for/android-devs#how-do-i-access-shared-preferences)
+- [@official@shared_preferences - pub.dev package](https://pub.dev/packages/shared_preferences)
diff --git a/src/data/roadmaps/flutter/content/109-storage/102-firebase/100-authentication.md b/src/data/roadmaps/flutter/content/109-storage/102-firebase/100-authentication.md
index 8cd86a286..67474873a 100644
--- a/src/data/roadmaps/flutter/content/109-storage/102-firebase/100-authentication.md
+++ b/src/data/roadmaps/flutter/content/109-storage/102-firebase/100-authentication.md
@@ -2,9 +2,7 @@
 
 Firebase Authentication is a service provided by Firebase that allows you to easily add user authentication to your Flutter app. With Firebase Authentication, you can authenticate users using email and password, phone number, or popular identity providers like Google, Facebook, and more.
 
-To integrate Firebase Authentication into your Flutter app, you need to first create a Firebase project in the Firebase Console and then add the Firebase Authentication package to your Flutter app.
-
 Learn more from the following links:
 
-- [@article@Make Authenticated requests](https://docs.flutter.dev/cookbook/networking/authenticated-requests)
+- [@official@Make Authenticated Requests](https://docs.flutter.dev/cookbook/networking/authenticated-requests)
 - [@feed@Explore top posts about Authentication](https://app.daily.dev/tags/authentication?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/109-storage/102-firebase/101-storage.md b/src/data/roadmaps/flutter/content/109-storage/102-firebase/101-storage.md
index c483bc694..7887fec36 100644
--- a/src/data/roadmaps/flutter/content/109-storage/102-firebase/101-storage.md
+++ b/src/data/roadmaps/flutter/content/109-storage/102-firebase/101-storage.md
@@ -6,5 +6,6 @@ To use Firebase Storage in your Flutter app, you need to first create a Firebase
 
 Learn more from the following:
 
+- [@official@Firebase Storage](https://firebase.google.com/docs/storage)
 - [@video@How to Upload and Retrieve Images from Firebase Storage](https://www.youtube.com/watch?v=sM-WMcX66FI)
 - [@feed@Explore top posts about Storage](https://app.daily.dev/tags/storage?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/109-storage/102-firebase/102-firestore.md b/src/data/roadmaps/flutter/content/109-storage/102-firebase/102-firestore.md
index 7de7a07d9..3dfe673c5 100644
--- a/src/data/roadmaps/flutter/content/109-storage/102-firebase/102-firestore.md
+++ b/src/data/roadmaps/flutter/content/109-storage/102-firebase/102-firestore.md
@@ -4,5 +4,6 @@ Firebase Firestore is a cloud-based NoSQL document database service provided by
 
 Learn more from the following links:
 
+- [@official@Firebase Firestore](https://firebase.google.com/docs/firestore)
 - [@video@Using Firestore - Flutter](https://www.youtube.com/watch?v=DqJ_KjFzL9I)
 - [@feed@Explore top posts about Firestore](https://app.daily.dev/tags/firestore?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/109-storage/102-firebase/103-push-notifications.md b/src/data/roadmaps/flutter/content/109-storage/102-firebase/103-push-notifications.md
index 04e1f0514..c6ec8fbce 100644
--- a/src/data/roadmaps/flutter/content/109-storage/102-firebase/103-push-notifications.md
+++ b/src/data/roadmaps/flutter/content/109-storage/102-firebase/103-push-notifications.md
@@ -1,13 +1,7 @@
 # Push Notifications
 
-To implement push notifications in Flutter using Firebase, follow these steps:
-
-- Create a Firebase project and set up a Flutter app.
-- Integrate the Firebase Cloud Messaging (FCM) plugin in your Flutter app.
-- Handle the incoming push notifications in your Flutter app and specify how they should be displayed.
-- Send test push notifications using the Firebase Console or other tools like Postman.
-- Customize your notifications by specifying the notification icon, sound, and vibration pattern.
+Implementing Firebase push notifications in Flutter involves setting up a Firebase project, integrating the FCM plugin, handling and displaying incoming notifications within the app, testing through the Firebase Console or tools like Postman, and customizing notification appearance with icons, sounds, and vibration patterns.
 
 Learn more from the following links:
 
-- [@article@How do I set up push notifications?](https://docs.flutter.dev/get-started/flutter-for/android-devs#how-do-i-set-up-push-notifications)
+- [@official@How do I Set up Push Notifications?](https://docs.flutter.dev/get-started/flutter-for/android-devs#how-do-i-set-up-push-notifications)
diff --git a/src/data/roadmaps/flutter/content/109-storage/102-firebase/104-remote-config.md b/src/data/roadmaps/flutter/content/109-storage/102-firebase/104-remote-config.md
index f06d6d319..6a6cb78f4 100644
--- a/src/data/roadmaps/flutter/content/109-storage/102-firebase/104-remote-config.md
+++ b/src/data/roadmaps/flutter/content/109-storage/102-firebase/104-remote-config.md
@@ -1,18 +1,8 @@
 # Remote Config
 
-It is a cloud-based service that allows you to change the behavior and appearance of your app without requiring users to download an app update. In Flutter, you can use the firebase_remote_config plugin to access Firebase Remote Config.
-
-Here are the basic steps to implement Firebase Remote Config in a Flutter app:
-
-- Add the firebase_remote_config plugin to your pubspec.yaml file.
-- Initialize the Firebase Remote Config service in your main.dart file.
-- Define the default values for your remote parameters in the Firebase Console or by calling setDefaults method.
-- Fetch the remote parameters from Firebase by calling fetch method.
-- Get the values for the parameters by calling get method and use them in your app.
-- Update the remote parameters in the Firebase Console or by calling activateFetched method.
-
-You can use Remote Config to control the appearance of your app, change the behavior of features, and even A/B test different experiences for your users.
+Firebase Remote Config, accessed in Flutter via the `firebase_remote_config` plugin, enables dynamic app behavior and appearance changes without app updates. This involves adding the plugin, initializing the service, defining default parameter values in the console or code, fetching and retrieving remote parameters, and updating those parameters either through the console or by activating fetched values, allowing for A/B testing and feature control.
 
 Learn more from the following:
 
+- [@official@Remote Config](https://firebase.google.com/docs/remote-config)
 - [@video@Firebase Remote Config](https://www.youtube.com/watch?v=34ExOdNEMXI)
diff --git a/src/data/roadmaps/flutter/content/109-storage/102-firebase/105-cloud-functions.md b/src/data/roadmaps/flutter/content/109-storage/102-firebase/105-cloud-functions.md
index 842a33038..2bea77fd4 100644
--- a/src/data/roadmaps/flutter/content/109-storage/102-firebase/105-cloud-functions.md
+++ b/src/data/roadmaps/flutter/content/109-storage/102-firebase/105-cloud-functions.md
@@ -4,5 +4,6 @@ Cloud Functions for Firebase is a serverless computing platform that simplifies
 
 Learn more from the following links:
 
+- [@official@Cloud Functions](https://firebase.google.com/docs/functions)
 - [@video@Getting Started with Firebase Cloud Functions](https://youtube.com/playlist?list=PLl-K7zZEsYLkPZHe41m4jfAxUi0JjLgSM\&si=yx0EwIXxhG2PHRXp)
 - [@feed@Explore top posts about Cloud](https://app.daily.dev/tags/cloud?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/109-storage/102-firebase/index.md b/src/data/roadmaps/flutter/content/109-storage/102-firebase/index.md
index 8ed2ea20c..71cdede87 100644
--- a/src/data/roadmaps/flutter/content/109-storage/102-firebase/index.md
+++ b/src/data/roadmaps/flutter/content/109-storage/102-firebase/index.md
@@ -4,6 +4,6 @@ Firebase is a Backend-as-a-Service (BaaS) app development platform that provides
 
 Visit the following resources to learn more:
 
-- [@article@Firebase](https://docs.flutter.dev/development/data-and-backend/firebase)
+- [@official@Firebase](https://docs.flutter.dev/development/data-and-backend/firebase)
 - [@video@Flutter Firebase Tutorials](https://www.youtube.com/watch?v=agxDK0qmH88\&list=PLFyjjoCMAPtxS6Cx1XSjCfxOxHQ4_e0sL)
 - [@feed@Explore top posts about Firebase](https://app.daily.dev/tags/firebase?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/109-storage/index.md b/src/data/roadmaps/flutter/content/109-storage/index.md
index f011a249b..48e66ec25 100644
--- a/src/data/roadmaps/flutter/content/109-storage/index.md
+++ b/src/data/roadmaps/flutter/content/109-storage/index.md
@@ -11,6 +11,6 @@ All of these storage options are supported through third-party packages, which a
 
 Visit the following links to learn more:
 
+- [@official@Cloud Storage in Flutter](https://firebase.flutter.dev/docs/storage/overview/)
 - [@video@Storage - Flutter Tutorial](https://www.youtube.com/watch?v=UpKrhZ0Hppks)
-- [@article@Cloud Storage in Flutter](https://firebase.flutter.dev/docs/storage/overview/)
 - [@feed@Explore top posts about Storage](https://app.daily.dev/tags/storage?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/110-advanced-dart/100-core-libraries.md b/src/data/roadmaps/flutter/content/110-advanced-dart/100-core-libraries.md
index 6277c847e..c54a95181 100644
--- a/src/data/roadmaps/flutter/content/110-advanced-dart/100-core-libraries.md
+++ b/src/data/roadmaps/flutter/content/110-advanced-dart/100-core-libraries.md
@@ -4,5 +4,5 @@ Dart has a rich set of core libraries that provide essentials for many everyday
 
 Visit the following resources to learn more:
 
-- [@article@Core libraries](https://dart.dev/guides/libraries)
-- [@article@Libraries](https://api.flutter.dev/)
+- [@official@Core Libraries](https://dart.dev/guides/libraries)
+- [@official@Libraries - Flutter API](https://api.flutter.dev/)
diff --git a/src/data/roadmaps/flutter/content/110-advanced-dart/101-lists.md b/src/data/roadmaps/flutter/content/110-advanced-dart/101-lists.md
index 5960cd7bc..edc55ffd7 100644
--- a/src/data/roadmaps/flutter/content/110-advanced-dart/101-lists.md
+++ b/src/data/roadmaps/flutter/content/110-advanced-dart/101-lists.md
@@ -1,15 +1,7 @@
 # Lists
 
-Some common ways to display lists in Dart Flutter include:
-
-- ListView widget
-- ListTile widget
-- SingleChildScrollView with Column
-- GridView widget
-- CustomScrollView with Slivers
-
-These widgets allow you to display items in a scrolling list, a grid, or a combination of both. You can customize the appearance of each item using widgets, layouts, and styling.
+Dart Flutter offers various widgets for displaying lists, including `ListView`, `ListTile`, `SingleChildScrollView` with `Column`, `GridView`, and `CustomScrollView` with `Slivers`, enabling scrolling lists, grids, and customized item appearances through widgets, layouts, and styling.
 
 Learn more from the following:
 
-- [@article@List Class](https://api.flutter.dev/flutter/dart-core/List-class.html)
+- [@official@List Class](https://api.flutter.dev/flutter/dart-core/List-class.html)
diff --git a/src/data/roadmaps/flutter/content/110-advanced-dart/102-collections.md b/src/data/roadmaps/flutter/content/110-advanced-dart/102-collections.md
index 3eed4cd38..531ae3472 100644
--- a/src/data/roadmaps/flutter/content/110-advanced-dart/102-collections.md
+++ b/src/data/roadmaps/flutter/content/110-advanced-dart/102-collections.md
@@ -1,16 +1,8 @@
 # Collections
 
-In Dart, collections are used to store and manipulate groups of objects. There are several types of collections available, including:
-
-1. List (ordered and indexable)
-2. Set (unordered and unique elements)
-3. Map (key-value pairs)
-4. Queue (ordered and first-in-first-out)
-5. Stack (ordered and last-in-first-out)
-
-These collections are built-in data structures that can be used to store and manipulate data efficiently. They can be used in a variety of scenarios, such as storing user data, managing state, and organizing algorithms.
+Dart provides built-in collections like Lists (ordered, indexed), Sets (unordered, unique), Maps (key-value pairs), Queues (FIFO), and Stacks (LIFO) for efficient data storage and manipulation, useful in various scenarios like data storage, state management, and algorithm implementation.
 
 Learn more from the following:
 
-- [@article@Generic collections in Flutter](https://dart.dev/guides/language/language-tour#generic-collections-and-the-types-they-contain)
-- [@article@Iterable collections](https://dart.dev/codelabs/iterables)
+- [@official@Generic Collections in Flutter](https://dart.dev/guides/language/language-tour#generic-collections-and-the-types-they-contain)
+- [@official@Iterable Collections](https://dart.dev/codelabs/iterables)
diff --git a/src/data/roadmaps/flutter/content/110-advanced-dart/103-lambdas.md b/src/data/roadmaps/flutter/content/110-advanced-dart/103-lambdas.md
index 0f00f0b6d..24311c608 100644
--- a/src/data/roadmaps/flutter/content/110-advanced-dart/103-lambdas.md
+++ b/src/data/roadmaps/flutter/content/110-advanced-dart/103-lambdas.md
@@ -2,16 +2,9 @@
 
 Lambdas, also known as anonymous functions, are a fundamental concept in Dart and Flutter. They are a way to create short, inline functions that can be passed as arguments to other functions or assigned to variables.
 
-Here are some common use cases for lambdas in Dart Flutter:
-
-- Event Handlers: You can use lambdas as event handlers for widgets, such as buttons.
-- Callbacks: You can use lambdas as callbacks to pass into functions that execute later.
-- Streams: You can use lambdas to handle events in a Stream.
-- Filtering: You can use lambdas to filter data in a collection using functions like where and `firstWhere`.
-
 Lambdas are defined using the `=>` operator and can take zero or more arguments. They can also contain expressions, statements, and return values.
 
 Learn more from the following links:
 
-- [@article@Lambda functions in Dart](https://medium.com/jay-tillu/lambda-functions-in-dart-7db8b759f07a)
+- [@article@Lambda Functions in Dart](https://medium.com/jay-tillu/lambda-functions-in-dart-7db8b759f07a)
 - [@video@Anonymous Function in Dart | Lambda Function](https://www.youtube.com/watch?v=XTKKQdTAR0U)
diff --git a/src/data/roadmaps/flutter/content/110-advanced-dart/104-functional-programming.md b/src/data/roadmaps/flutter/content/110-advanced-dart/104-functional-programming.md
index 906aed6c7..18f45b11a 100644
--- a/src/data/roadmaps/flutter/content/110-advanced-dart/104-functional-programming.md
+++ b/src/data/roadmaps/flutter/content/110-advanced-dart/104-functional-programming.md
@@ -1,15 +1,10 @@
 # Functional Programming
 
-Functional programming is a programming paradigm that emphasizes immutability, statelessness, and the use of functions to transform data. Dart, being a modern programming language, supports functional programming concepts such as:
-
-- Higher-Order Functions: Dart supports functions that take other functions as arguments and/or return functions as output.
-- Immutable Data: Dart provides support for immutable data structures and encourages the use of these data structures in functional programming.
-- Lambdas/Closures: Dart has support for anonymous functions, also known as lambdas or closures, which can be used to create simple and concise functions.
-- Pure Functions: Dart encourages the use of pure functions, which are functions that have no side effects and always return the same output given the same inputs.
+Dart supports functional programming through higher-order functions, immutable data structures, lambdas/closures, and pure functions, enabling developers to write code that emphasizes immutability, statelessness, and data transformation via functions.
 
 Learn more from the following links:
 
+- [@official@Functional Programming - Flutter](https://docs.flutter.dev/resources/faq)
 - [@article@Brief Overview of Functional Programming](https://buildflutter.com/functional-programming-with-flutter/)
 - [@article@Functional Programming in Dart & Flutter](https://yogi-6.medium.com/list/functional-programming-in-dart-flutter-2f3ac9d7fa39)
-- [@article@Functional programming - Flutter](https://docs.flutter.dev/resources/faq)
 - [@feed@Explore top posts about Functional Programming](https://app.daily.dev/tags/functional-programming?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/110-advanced-dart/105-isolates.md b/src/data/roadmaps/flutter/content/110-advanced-dart/105-isolates.md
index 3d6659525..490f5fe00 100644
--- a/src/data/roadmaps/flutter/content/110-advanced-dart/105-isolates.md
+++ b/src/data/roadmaps/flutter/content/110-advanced-dart/105-isolates.md
@@ -1,15 +1,8 @@
 # Isolates
 
-Isolates in Flutter are separate execution contexts that run in parallel with each other. They are used to improve performance and concurrency in Flutter applications. Key benefits of using Isolates in Flutter include:
-
-- Improved Performance: Isolates allow you to run intensive computations or blocking operations in the background, without freezing the user interface.
-- Concurrent Execution: Isolates provide a way to run multiple tasks concurrently, allowing you to improve the overall performance of your app.
-- Isolation: Each Isolate runs in its own memory space and is isolated from other Isolates. This makes it easier to write reliable and secure code.
-- Communication: Flutter provides a mechanism for communicating between Isolates, allowing them to share data and coordinate their work.
-
-Isolates are created using the `Isolate` class and can be used for a variety of tasks, such as network operations, long-running computations, or background tasks. When using Isolates, it's important to be mindful of the cost of context-switching and communication between Isolates.
+Flutter Isolates are parallel execution contexts that enhance performance and concurrency by running intensive tasks in the background, preventing UI freezes. They provide isolated memory spaces for reliable code, enable concurrent execution, and facilitate inter-isolate communication for data sharing and coordination, though developers must consider context-switching and communication overhead.
 
 Learn more from the following links:
 
-- [@article@How isolates work](https://dart.dev/guides/language/concurrency#how-isolates-work)
+- [@official@How Isolates Work](https://dart.dev/guides/language/concurrency#how-isolates-work)
 - [@article@Dart - Isolates and event loops](https://medium.com/dartlang/dart-asynchronous-programming-isolates-and-event-loops-bffc3e296a6a)
diff --git a/src/data/roadmaps/flutter/content/110-advanced-dart/106-async-await.md b/src/data/roadmaps/flutter/content/110-advanced-dart/106-async-await.md
index 854d80c18..3edb3b9d8 100644
--- a/src/data/roadmaps/flutter/content/110-advanced-dart/106-async-await.md
+++ b/src/data/roadmaps/flutter/content/110-advanced-dart/106-async-await.md
@@ -1,13 +1,8 @@
 # Async Await
 
-It is a programming pattern in Flutter that makes it easier to write asynchronous code. It allows you to write asynchronous code that looks and behaves like synchronous code.
-
-- **async**: The async keyword is used to mark a function as asynchronous, which means that the function can run asynchronously and not block the main thread.
-- **await**: The await keyword is used inside an async function to wait for the result of an asynchronous operation before continuing the execution of the function.
-
-With `async`/`await`, you can write asynchronous code that is easy to read, write, and maintain.
+Flutter's `async`/`await` pattern simplifies asynchronous programming by enabling code that appears synchronous. The `async` keyword designates a function as asynchronous, allowing non-blocking execution, while `await` pauses execution until an asynchronous operation completes, resulting in cleaner and more maintainable asynchronous code.
 
 Learn more from the following resources:
 
-- [@article@Asynchronous programming: async, await](https://dart.dev/codelabs/async-await)
-- [@article@Async widgets](https://docs.flutter.dev/development/ui/widgets/async)
+- [@official@Asynchronous Programming: async, await](https://dart.dev/codelabs/async-await)
+- [@official@Async widgets](https://docs.flutter.dev/development/ui/widgets/async)
diff --git a/src/data/roadmaps/flutter/content/110-advanced-dart/107-streams.md b/src/data/roadmaps/flutter/content/110-advanced-dart/107-streams.md
index c20fea7fa..db03a3567 100644
--- a/src/data/roadmaps/flutter/content/110-advanced-dart/107-streams.md
+++ b/src/data/roadmaps/flutter/content/110-advanced-dart/107-streams.md
@@ -4,6 +4,6 @@ Streams in Flutter are a way to receive data over time as it becomes available.
 
 Learn more from the following resources:
 
-- [@article@Creating streams in Dart](https://dart.dev/articles/libraries/creating-streams)
+- [@official@Creating streams in Dart](https://dart.dev/articles/libraries/creating-streams)
 - [@article@Understanding Streams in Dart and Flutter](https://medium.com/stackademic/understanding-streams-in-dart-and-flutter-0d153b559760)
 - [@article@How to Use and Create Streams from Scratch in Dart and Flutter – a Beginner's Guide](https://www.freecodecamp.org/news/how-to-use-and-create-streams-in-dart-and-flutter/)
diff --git a/src/data/roadmaps/flutter/content/110-advanced-dart/108-futures.md b/src/data/roadmaps/flutter/content/110-advanced-dart/108-futures.md
index 98de45c6b..d3927c003 100644
--- a/src/data/roadmaps/flutter/content/110-advanced-dart/108-futures.md
+++ b/src/data/roadmaps/flutter/content/110-advanced-dart/108-futures.md
@@ -10,4 +10,4 @@ Futures in Flutter are a way of representing a potential value that will be avai
 
 Learn more from the following resources:
 
-- [@article@Futures and Error handling](https://dart.dev/guides/libraries/futures-error-handling)
+- [@official@Futures and Error handling](https://dart.dev/guides/libraries/futures-error-handling)
diff --git a/src/data/roadmaps/flutter/content/110-advanced-dart/index.md b/src/data/roadmaps/flutter/content/110-advanced-dart/index.md
index d1c6a1596..08ed4f5f7 100644
--- a/src/data/roadmaps/flutter/content/110-advanced-dart/index.md
+++ b/src/data/roadmaps/flutter/content/110-advanced-dart/index.md
@@ -1,21 +1,9 @@
 # Advanced Dart
 
-Here are some advanced concepts in Dart that are commonly used in Flutter development:
-
-- Generics: allows creating reusable code by abstracting over types
-- Async/Await: simplifies asynchronous programming by allowing to wait for a Future to complete in a clean, readable way.
-- Mixins: lets classes inherit behaviors from multiple mixin classes
-- Abstract Classes: provide a base class that can be extended to create multiple concrete implementations.
-- Streams: provide a way to receive a continuous sequence of events, like data from a server or user events.
-- Isolates: allow running Dart code in separate threads with communication through message passing.
-- Futures: represent a value that will be available at some point in the future.
-- Null-aware operators (??, ?.): provide a concise way to handle null values.
-- Collection literals: provide concise syntax for creating collections.
-- Extension Methods: allow adding methods to existing classes, even if you don't have access to their source code.
-
-By mastering these concepts, you will be able to write more efficient and maintainable Dart code in your Flutter projects.
+Advanced Dart concepts crucial for Flutter development include generics for reusable code, `async`/`await` for clean asynchronous operations, mixins for multiple inheritance, abstract classes for base implementations, streams for continuous event handling, isolates for parallel processing, futures for future value representation, null-aware operators for concise null handling, collection literals for efficient collection creation, and extension methods for adding functionality to existing classes, all contributing to more efficient and maintainable code.
 
 Learn more from the following resources:
 
 - [@official@Tutorials - Dart](https://dart.dev/tutorials)
+- [@article@Advanced Dart](https://techdynasty.medium.com/advanced-dart-in-flutter-elevating-your-development-skills-1c8ec309266f)
 - [@feed@Explore top posts about Dart](https://app.daily.dev/tags/dart?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/111-state-management/100-provider.md b/src/data/roadmaps/flutter/content/111-state-management/100-provider.md
index 3e969a9a0..1e6fee141 100644
--- a/src/data/roadmaps/flutter/content/111-state-management/100-provider.md
+++ b/src/data/roadmaps/flutter/content/111-state-management/100-provider.md
@@ -4,5 +4,5 @@ Provider is a wrapper around InheritedWidget (base class for widgets that effici
 
 Visit the following resources to learn more:
 
-- [@article@provider](https://pub.dev/packages/provider)
-- [@article@Simple app state management](https://docs.flutter.dev/development/data-and-backend/state-mgmt/simple)
+- [@official@Provider](https://pub.dev/packages/provider)
+- [@official@Simple App State Management](https://docs.flutter.dev/development/data-and-backend/state-mgmt/simple)
diff --git a/src/data/roadmaps/flutter/content/111-state-management/101-bloc.md b/src/data/roadmaps/flutter/content/111-state-management/101-bloc.md
index 50b7842b7..6ad12c081 100644
--- a/src/data/roadmaps/flutter/content/111-state-management/101-bloc.md
+++ b/src/data/roadmaps/flutter/content/111-state-management/101-bloc.md
@@ -4,8 +4,8 @@ Bloc (Business Logic Component) is a state management pattern used in Flutter to
 
 Learn more from the following links:
 
+- [@official@BLoC in Flutter](https://docs.flutter.dev/development/data-and-backend/state-mgmt/options#bloc--rx)
 - [@article@Get started with flutter_bloc](https://pub.dev/packages/flutter_bloc)
-- [@article@BLoC in Flutter](https://docs.flutter.dev/development/data-and-backend/state-mgmt/options#bloc--rx)
 - [@article@Flutter bloc for beginners](https://medium.com/flutter-community/flutter-bloc-for-beginners-839e22adb9f5)
 - [@video@Flutter Bloc - Tutorial](https://www.youtube.com/watch?v=Ep6R7U9wa0U)
 - [@video@BLoC Pattern: A Comprehensive Tutorial](https://www.youtube.com/watch?v=Qe47b8r5epc&ab_channel=MaxonFlutter)
\ No newline at end of file
diff --git a/src/data/roadmaps/flutter/content/111-state-management/102-riverpod.md b/src/data/roadmaps/flutter/content/111-state-management/102-riverpod.md
index fa91b6f3e..742f525ff 100644
--- a/src/data/roadmaps/flutter/content/111-state-management/102-riverpod.md
+++ b/src/data/roadmaps/flutter/content/111-state-management/102-riverpod.md
@@ -6,8 +6,8 @@ One of the key features of Riverpod is its ability to manage and scope state in
 
 Learn more from the following links:
 
-- [@article@riverpod](https://pub.dev/packages/riverpod)
-- [@article@Riverpod in Flutter](https://docs.flutter.dev/development/data-and-backend/state-mgmt/options#riverpod)
-- [@official@Documentation](https://riverpod.dev/)
+- [@official@riverpod](https://pub.dev/packages/riverpod)
+- [@official@Riverpod in Flutter](https://docs.flutter.dev/development/data-and-backend/state-mgmt/options#riverpod)
+- [@official@riverpod Documentation](https://riverpod.dev/)
 - [@article@Documentation v2 is in progress](https://docs-v2.riverpod.dev/)
 - [@article@Flutter Riverpod 2.0: The Ultimate Guide](https://codewithandrea.com/articles/flutter-state-management-riverpod/)
\ No newline at end of file
diff --git a/src/data/roadmaps/flutter/content/111-state-management/103-velocity-x.md b/src/data/roadmaps/flutter/content/111-state-management/103-velocity-x.md
index f7858e6a1..4d5d20caa 100644
--- a/src/data/roadmaps/flutter/content/111-state-management/103-velocity-x.md
+++ b/src/data/roadmaps/flutter/content/111-state-management/103-velocity-x.md
@@ -4,5 +4,5 @@ VelocityX is a Flutter UI toolkit for building high-performance, visually stunni
 
 Learn more from the following links:
 
-- [@official@Get started with VelocityX](https://velocityx.dev/)
+- [@official@Get Started with VelocityX](https://velocityx.dev/)
 - [@article@Intro to velocity_x](https://pub.dev/packages/velocity_x)
diff --git a/src/data/roadmaps/flutter/content/111-state-management/104-get-x.md b/src/data/roadmaps/flutter/content/111-state-management/104-get-x.md
index 4cc3d203f..670f34dcb 100644
--- a/src/data/roadmaps/flutter/content/111-state-management/104-get-x.md
+++ b/src/data/roadmaps/flutter/content/111-state-management/104-get-x.md
@@ -4,5 +4,5 @@ GetX is a lightweight and powerful solution for state management and navigation
 
 Learn more from the following links:
 
-- [@article@GetX in Flutter](https://docs.flutter.dev/development/data-and-backend/state-mgmt/options#getx)
+- [@official@GetX in Flutter](https://docs.flutter.dev/development/data-and-backend/state-mgmt/options#getx)
 - [@video@Complete GetX State Management | Flutter](https://www.youtube.com/watch?v=CNpXbeI_slw)
diff --git a/src/data/roadmaps/flutter/content/111-state-management/105-redux.md b/src/data/roadmaps/flutter/content/111-state-management/105-redux.md
index 4743fff7f..136a03496 100644
--- a/src/data/roadmaps/flutter/content/111-state-management/105-redux.md
+++ b/src/data/roadmaps/flutter/content/111-state-management/105-redux.md
@@ -4,7 +4,7 @@ Redux is a state management library for Flutter, commonly used with the Flutter
 
 Visit the following resources to learn more:
 
-- [@article@flutter\_redux](https://pub.dev/packages/flutter_redux)
-- [@article@Redux - Tutorial](https://docs.flutter.dev/development/data-and-backend/state-mgmt/options#redux)
+- [@official@flutter\_redux](https://pub.dev/packages/flutter_redux)
+- [@official@Redux - Tutorial](https://docs.flutter.dev/development/data-and-backend/state-mgmt/options#redux)
 - [@article@Building a Flutter app with Redux](https://hillel.dev/2018/06/01/building-a-large-flutter-app-with-redux/)
 - [@feed@Explore top posts about Redux](https://app.daily.dev/tags/redux?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/111-state-management/106-value-notifier.md b/src/data/roadmaps/flutter/content/111-state-management/106-value-notifier.md
index 45dff4411..1f0bed6ef 100644
--- a/src/data/roadmaps/flutter/content/111-state-management/106-value-notifier.md
+++ b/src/data/roadmaps/flutter/content/111-state-management/106-value-notifier.md
@@ -4,5 +4,5 @@ Flutter's ValueNotifier is a lightweight tool for state management in Flutter. I
 
 Visit the following resources to learn more:
 
-- [@article@ValueNotifier class - Flutter](https://api.flutter.dev/flutter/foundation/ValueNotifier-class.html)
+- [@official@ValueNotifier Class - Flutter](https://api.flutter.dev/flutter/foundation/ValueNotifier-class.html)
 - [@article@ValuerNotifier & ValueListenableBuilder](https://medium.com/@avnishnishad/flutter-communication-between-widgets-using-valuenotifier-and-valuelistenablebuilder-b51ef627a58b)
\ No newline at end of file
diff --git a/src/data/roadmaps/flutter/content/111-state-management/107-change-notifier.md b/src/data/roadmaps/flutter/content/111-state-management/107-change-notifier.md
index e4b261b5a..e84946f3d 100644
--- a/src/data/roadmaps/flutter/content/111-state-management/107-change-notifier.md
+++ b/src/data/roadmaps/flutter/content/111-state-management/107-change-notifier.md
@@ -4,5 +4,5 @@ Flutter's ChangeNotifier is a fundamental class for state management in Flutter.
 
 Visit the following resources to learn more:
 
-- [@article@ChangeNotifier class - Flutter](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html)
-- [@article@Simple app state management](https://docs.flutter.dev/data-and-backend/state-mgmt/simple)
\ No newline at end of file
+- [@official@ChangeNotifier class - Flutter](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html)
+- [@official@Simple app state management](https://docs.flutter.dev/data-and-backend/state-mgmt/simple)
\ No newline at end of file
diff --git a/src/data/roadmaps/flutter/content/111-state-management/index.md b/src/data/roadmaps/flutter/content/111-state-management/index.md
index e7192b4d3..b30c26121 100644
--- a/src/data/roadmaps/flutter/content/111-state-management/index.md
+++ b/src/data/roadmaps/flutter/content/111-state-management/index.md
@@ -1,16 +1,7 @@
 # State Management
 
-State management in Flutter refers to the process of managing and updating the data or state of a Flutter application. In Flutter, the state of the widgets can change dynamically, for example, when a user interacts with the application. The state management techniques in Flutter include:
-
-- ScopedModel: a third-party state management solution that uses a centralized model to manage the state.
-- Provider: a lightweight solution that allows widgets to access the state with minimal boilerplate code.
-- BLoC (Business Logic Component): a state management technique that uses streams and reactive programming to manage the state.
-- Redux: a state management solution inspired by the Redux library in React.
-- InheritedWidget: a built-in widget that allows the state to be passed down the widget tree.
-
-The choice of state management technique depends on the complexity and size of the project. For smaller projects, Provider or InheritedWidget may be sufficient, while larger projects may require a more robust solution like ScopedModel or Redux.
+State management in Flutter refers to the process of managing and updating the data or state of a Flutter application. In Flutter, the state of the widgets can change dynamically, for example, when a user interacts with the application.
 
 Learn more from the following resources:
 
-- [@article@State management in Flutter](https://docs.flutter.dev/development/data-and-backend/state-mgmt)
-- [@article@Intro to State Management](https://docs.flutter.dev/development/data-and-backend/state-mgmt/intro)
+- [@official@State Management in Flutter](https://docs.flutter.dev/development/data-and-backend/state-mgmt)
diff --git a/src/data/roadmaps/flutter/content/112-animations/100-curved-animations.md b/src/data/roadmaps/flutter/content/112-animations/100-curved-animations.md
index a11fbdea0..83fdc4ae8 100644
--- a/src/data/roadmaps/flutter/content/112-animations/100-curved-animations.md
+++ b/src/data/roadmaps/flutter/content/112-animations/100-curved-animations.md
@@ -1,12 +1,8 @@
 # CurvedAnimations
 
-Curved animations in Flutter can be achieved using the "CurvedAnimation" class. This class takes in a "Curve" object that defines the rate of change of the animation over time. The most commonly used curve is the "Curves.easeInOut" curve, which starts slow, speeds up in the middle, and then slows down again towards the end. To create a curved animation in Flutter, use the following steps:
-
-1. Create a "AnimationController" object that controls the animation.
-2. Create a "CurvedAnimation" object, passing in the "AnimationController" and a "Curve" object.
-3. Use the "CurvedAnimation" object in the animation.
+Curved animations in Flutter can be achieved using the "CurvedAnimation" class. This class takes in a "Curve" object that defines the rate of change of the animation over time. The most commonly used curve is the "Curves.easeInOut" curve, which starts slow, speeds up in the middle, and then slows down again towards the end.
 
 Learn more from the following links:
 
-- [@article@Curved­Animation](https://docs.flutter.dev/development/ui/animations/tutorial)
+- [@official@Curved­Animation](https://docs.flutter.dev/development/ui/animations/tutorial)
 - [@article@CurvedAnimation Class](https://api.flutter.dev/flutter/animation/CurvedAnimation-class.html)
diff --git a/src/data/roadmaps/flutter/content/112-animations/101-animation-controller.md b/src/data/roadmaps/flutter/content/112-animations/101-animation-controller.md
index eda20508e..b00d78e31 100644
--- a/src/data/roadmaps/flutter/content/112-animations/101-animation-controller.md
+++ b/src/data/roadmaps/flutter/content/112-animations/101-animation-controller.md
@@ -11,5 +11,5 @@ By default, an AnimationController linearly produces values that range from 0.0
 
 Learn more from the following links:
 
-- [@article@AnimationController - Flutter](https://docs.flutter.dev/development/ui/animations/tutorial#animationcontroller)
+- [@official@AnimationController - Flutter](https://docs.flutter.dev/ui/animations/tutorial#animationcontroller)
 - [@article@AnimationController class](https://api.flutter.dev/flutter/animation/AnimationController-class.html)
diff --git a/src/data/roadmaps/flutter/content/112-animations/102-animated-builder.md b/src/data/roadmaps/flutter/content/112-animations/102-animated-builder.md
index b95a912a2..9f0c818ef 100644
--- a/src/data/roadmaps/flutter/content/112-animations/102-animated-builder.md
+++ b/src/data/roadmaps/flutter/content/112-animations/102-animated-builder.md
@@ -4,5 +4,5 @@ AnimatedBuilder is a widget in Flutter that allows you to build animations. It t
 
 Learn more from the following links:
 
-- [@article@AnimatedBuilder Class](https://api.flutter.dev/flutter/widgets/AnimatedBuilder-class.html)
+- [@official@AnimatedBuilder Class](https://api.flutter.dev/flutter/widgets/AnimatedBuilder-class.html)
 - [@article@Refactoring with AnimatedBuilders](https://docs.flutter.dev/development/ui/animations/tutorial#refactoring-with-animatedbuilder)
diff --git a/src/data/roadmaps/flutter/content/112-animations/103-animated-widget.md b/src/data/roadmaps/flutter/content/112-animations/103-animated-widget.md
index a3fb7b0e2..2d79f9c74 100644
--- a/src/data/roadmaps/flutter/content/112-animations/103-animated-widget.md
+++ b/src/data/roadmaps/flutter/content/112-animations/103-animated-widget.md
@@ -4,5 +4,5 @@ AnimatedWidget is a Flutter widget that takes an `Animation` object as an argume
 
 Learn more from the following links:
 
-- [@article@Simplifying with Animated­Widget](https://docs.flutter.dev/development/ui/animations/tutorial#simplifying-with-animatedwidgets)
+- [@official@Simplifying with Animated­Widget](https://docs.flutter.dev/development/ui/animations/tutorial#simplifying-with-animatedwidgets)
 - [@article@AnimatedWidget Class](https://api.flutter.dev/flutter/widgets/AnimatedWidget-class.html)
diff --git a/src/data/roadmaps/flutter/content/112-animations/104-hero.md b/src/data/roadmaps/flutter/content/112-animations/104-hero.md
index 6ca66f90d..238bba90d 100644
--- a/src/data/roadmaps/flutter/content/112-animations/104-hero.md
+++ b/src/data/roadmaps/flutter/content/112-animations/104-hero.md
@@ -4,6 +4,5 @@ Hero is a widget in Flutter that allows you to create smooth animations between
 
 Visit the following resources to learn more:
 
-- [@article@Hero animations](https://docs.flutter.dev/development/ui/animations/hero-animations)
+- [@official@Hero Animations](https://docs.flutter.dev/development/ui/animations/hero-animations)
 - [@article@HeroAnimation class](https://docs.flutter.dev/development/ui/animations/hero-animations#heroanimation-class)
-- [@article@Hero class](https://api.flutter.dev/flutter/widgets/Hero-class.html)
diff --git a/src/data/roadmaps/flutter/content/112-animations/105-opacity.md b/src/data/roadmaps/flutter/content/112-animations/105-opacity.md
index c31133008..4cc6598e0 100644
--- a/src/data/roadmaps/flutter/content/112-animations/105-opacity.md
+++ b/src/data/roadmaps/flutter/content/112-animations/105-opacity.md
@@ -4,5 +4,5 @@ Opacity is a Flutter widget that allows you to control the transparency of its c
 
 Visit the following resources to learn more:
 
-- [@article@Fade a widget in and out](https://docs.flutter.dev/cookbook/animation/opacity-animation)
+- [@official@Fade a Widget in and out](https://docs.flutter.dev/cookbook/animation/opacity-animation)
 - [@article@AnimatedOpacity widget](https://docs.flutter.dev/codelabs/implicit-animations#animate-opacity-with-animatedopacity-widgets)
diff --git a/src/data/roadmaps/flutter/content/112-animations/index.md b/src/data/roadmaps/flutter/content/112-animations/index.md
index 1d0f7e713..c8f28dd32 100644
--- a/src/data/roadmaps/flutter/content/112-animations/index.md
+++ b/src/data/roadmaps/flutter/content/112-animations/index.md
@@ -4,5 +4,5 @@ Flutter’s animation support makes it easy to implement a variety of animation
 
 Visit the following resources to learn more:
 
-- [@article@Introduction to animations](https://docs.flutter.dev/development/ui/animations)
+- [@official@Introduction to Animations](https://docs.flutter.dev/development/ui/animations)
 - [@article@Animation library](https://api.flutter.dev/flutter/animation/animation-library.html)
diff --git a/src/data/roadmaps/flutter/content/113-testing/100-unit-testing.md b/src/data/roadmaps/flutter/content/113-testing/100-unit-testing.md
index 1e173fd5f..8b23117e6 100644
--- a/src/data/roadmaps/flutter/content/113-testing/100-unit-testing.md
+++ b/src/data/roadmaps/flutter/content/113-testing/100-unit-testing.md
@@ -2,10 +2,8 @@
 
 Unit testing in Flutter is the process of testing individual units of code, such as functions or classes, to ensure that they behave as expected. Unit testing helps to catch bugs early in the development process and increases the confidence in your code by making it easier to refactor or make changes without breaking existing functionality.
 
-In Flutter, you can write unit tests using the test package, which provides a testing framework and various test utilities. You can write tests that run on the Dart VM or on a physical device or emulator. The tests are written using a combination of Dart code and special test functions provided by the test package. You can use assert statements to verify the behavior of your code, and the testing framework will report whether the tests pass or fail.
-
 Visit the following resources to learn more:
 
-- [@article@An introduction to unit testing](https://docs.flutter.dev/cookbook/testing/unit/introduction)
-- [@article@Unit tests - Flutter](https://docs.flutter.dev/testing#unit-tests)
+- [@official@Introduction to Unit Testing](https://docs.flutter.dev/cookbook/testing/unit/introduction)
+- [@official@Unit Tests - Flutter](https://docs.flutter.dev/testing#unit-tests)
 - [@feed@Explore top posts about Testing](https://app.daily.dev/tags/testing?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/113-testing/101-widget-testing.md b/src/data/roadmaps/flutter/content/113-testing/101-widget-testing.md
index 9f98ffbf6..1bf05e6d9 100644
--- a/src/data/roadmaps/flutter/content/113-testing/101-widget-testing.md
+++ b/src/data/roadmaps/flutter/content/113-testing/101-widget-testing.md
@@ -2,12 +2,8 @@
 
 Widget testing in Flutter is the process of testing the behavior and appearance of individual widgets, in isolation from the rest of your app. It allows you to verify that a widget works correctly, displays the expected output, and behaves correctly in response to user interactions.
 
-In Flutter, you can write widget tests using the `flutter_test` package, which provides a testing framework for writing and running widget tests. A widget test is similar to a unit test, but instead of testing individual functions, you test entire widgets. You can use the `TestWidgetsFlutterBinding` to run your widget tests and simulate user interactions, such as taps, scrolls, and other gestures.
-
-The framework provides several utility functions to help you build and test widgets, such as `pumpWidget`, which allows you to pump a widget and its children into the widget tree and simulate a frame of animation, and `find`, which allows you to search the widget tree for a widget that matches specific criteria.
-
 Visit the following resources to learn more:
 
-- [@article@An introduction to widget testing](https://docs.flutter.dev/cookbook/testing/widget/introduction)
-- [@article@Widget Tests - Flutter](https://docs.flutter.dev/testing#widget-tests)
+- [@official@Introduction to Widget Testing](https://docs.flutter.dev/cookbook/testing/widget/introduction)
+- [@official@Widget Tests - Flutter](https://docs.flutter.dev/testing#widget-tests)
 - [@feed@Explore top posts about Testing](https://app.daily.dev/tags/testing?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/113-testing/102-integration-testing.md b/src/data/roadmaps/flutter/content/113-testing/102-integration-testing.md
index 54ed6ec02..ad49b2ac8 100644
--- a/src/data/roadmaps/flutter/content/113-testing/102-integration-testing.md
+++ b/src/data/roadmaps/flutter/content/113-testing/102-integration-testing.md
@@ -2,12 +2,8 @@
 
 Integration tests in Flutter are tests that verify the behavior of your app as a whole, rather than individual widgets or functions. Integration tests allow you to test the interactions between different parts of your app and verify that the overall behavior of the app is correct.
 
-In Flutter, you can write integration tests using the `flutter_driver` package, which provides a testing framework for writing and running integration tests. An integration test runs on a physical device or an emulator, and uses the `FlutterDriver` class to interact with the app and simulate user interactions, such as taps, scrolls, and gestures.
-
-The framework provides several utility functions to help you interact with your app, such as `tap`, `scroll`, and `enterText`, which allow you to perform actions in your app and verify its behavior. You can also use `waitFor`, which allows you to wait for specific conditions to be met before continuing with the test.
-
 Visit the following resources to learn more:
 
-- [@article@An introduction to integration testing](https://docs.flutter.dev/cookbook/testing/integration/introduction)
-- [@article@Integration Tests](https://docs.flutter.dev/testing#integration-tests)
+- [@official@Introduction to Integration Testing](https://docs.flutter.dev/cookbook/testing/integration/introduction)
+- [@official@Integration Tests](https://docs.flutter.dev/testing#integration-tests)
 - [@feed@Explore top posts about Testing](https://app.daily.dev/tags/testing?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/113-testing/103-tdd.md b/src/data/roadmaps/flutter/content/113-testing/103-tdd.md
index 4c26cc311..3dc8686d0 100644
--- a/src/data/roadmaps/flutter/content/113-testing/103-tdd.md
+++ b/src/data/roadmaps/flutter/content/113-testing/103-tdd.md
@@ -2,8 +2,6 @@
 
 Test-driven development (TDD) is a software development methodology in which tests are written before the implementation of the code they are testing. The idea behind TDD is to write a failing test first, then write just enough code to make the test pass, and then refactor the code if necessary. This process is repeated for each new feature or requirement that is added to the app.
 
-In Flutter, TDD can be applied using the `test` and `flutter_test` packages, which provide testing frameworks for writing and running unit tests and widget tests, respectively. TDD can be used to write tests for individual functions, classes, and widgets, as well as integration tests that verify the behavior of the app as a whole.
-
 Learn more from the following links:
 
 - [@article@Test-Driven Development in Flutter](https://techblog.geekyants.com/test-driven-development-in-flutter)
diff --git a/src/data/roadmaps/flutter/content/113-testing/104-bdd.md b/src/data/roadmaps/flutter/content/113-testing/104-bdd.md
index a1f0248d6..f94e7fe6b 100644
--- a/src/data/roadmaps/flutter/content/113-testing/104-bdd.md
+++ b/src/data/roadmaps/flutter/content/113-testing/104-bdd.md
@@ -2,9 +2,7 @@
 
 Behavior-driven development (BDD) is a software development methodology that emphasizes collaboration between developers, testers, and stakeholders to define and verify the behavior of an application. BDD uses natural language to describe the expected behavior of the application and provides a shared understanding of the requirements for the development team.
 
-In Flutter, BDD can be applied using the `flutter_driver` package, which provides a testing framework for writing and running integration tests. BDD can be used to write tests that verify the behavior of the app as a whole, rather than individual widgets or functions.
-
-Learn morer from the following links:
+Learn more from the following links:
 
 - [@article@Build Flutter with BDD](https://medium.com/tide-engineering-team/build-flutter-with-bdd-b4507170a2fe)
 - [@video@Tutorial - BDD in Flutter](https://www.youtube.com/watch?v=Kwvsc31FE_8)
diff --git a/src/data/roadmaps/flutter/content/113-testing/index.md b/src/data/roadmaps/flutter/content/113-testing/index.md
index 820267052..74998c4f5 100644
--- a/src/data/roadmaps/flutter/content/113-testing/index.md
+++ b/src/data/roadmaps/flutter/content/113-testing/index.md
@@ -2,17 +2,8 @@
 
 Testing is a crucial part of the development process in Flutter, as it helps you to verify the behavior and appearance of your app and ensure that it behaves correctly and consistently across different devices and platforms.
 
-There are several types of tests that you can write to verify the behavior and appearance of your app:
-
-- Unit tests
-- Widget tests
-- Integration tests
-- Acceptance tests
-
-In Flutter, you can write tests using the test and flutter\_test packages, which provide testing frameworks for writing and running unit tests and widget tests, respectively. You can also use the flutter\_driver package, which provides a testing framework for writing and running integration tests.
-
 Learn more from the following links:
 
-- [@article@Dart Testing](https://dart.dev/guides/testing)
-- [@article@Testing Flutter apps](https://docs.flutter.dev/testing)
+- [@official@Dart Testing](https://dart.dev/guides/testing)
+- [@official@Testing Flutter Apps](https://docs.flutter.dev/testing)
 - [@feed@Explore top posts about Testing](https://app.daily.dev/tags/testing?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/114-reactive-programming/100-rxdart.md b/src/data/roadmaps/flutter/content/114-reactive-programming/100-rxdart.md
index 9bf3d8d93..5c502937c 100644
--- a/src/data/roadmaps/flutter/content/114-reactive-programming/100-rxdart.md
+++ b/src/data/roadmaps/flutter/content/114-reactive-programming/100-rxdart.md
@@ -2,5 +2,7 @@
 
 RxDart is a library for Dart that provides additional functionality for working with reactive programming, specifically with the Streams and Observables classes. It extends the standard Dart Streams API and provides additional features such as the ability to transform and combine streams, and to compose and chain streams together. In Flutter, RxDart is commonly used to handle asynchronous data streams and user interactions in a more efficient and elegant way.
 
-- [@article@RxDart Official Docs](https://pub.dev/documentation/rxdart/latest)
+Learn more from the following links:
+
+- [@official@RxDart Documentation](https://pub.dev/documentation/rxdart/latest)
 - [@article@Overview of RxDart in Flutter](https://docs.flutter.dev/development/data-and-backend/state-mgmt/options#bloc--rx)
diff --git a/src/data/roadmaps/flutter/content/114-reactive-programming/index.md b/src/data/roadmaps/flutter/content/114-reactive-programming/index.md
index 642430ce1..a63a36449 100644
--- a/src/data/roadmaps/flutter/content/114-reactive-programming/index.md
+++ b/src/data/roadmaps/flutter/content/114-reactive-programming/index.md
@@ -1,10 +1,6 @@
 # Reactive Programming
 
-Reactive programming is a programming paradigm that allows for handling changing data streams and updating the UI based on those changes. In Flutter, reactive programming can be achieved using:
-
-1. Streams: A sequence of asynchronous events.
-2. Futures: A way to represent a single asynchronous operation.
-3. BLoCs (Business Logic Components): A state management pattern that uses streams to separate business logic from UI code.
+Reactive programming is a programming paradigm that allows for handling changing data streams and updating the UI based on those changes.
 
 Reactive programming in Flutter helps create dynamic and responsive apps that can handle changing data and update the UI accordingly. The `StreamBuilder` and `FutureBuilder` widgets are commonly used in Flutter to build reactive UIs.
 
diff --git a/src/data/roadmaps/flutter/content/115-dev-tools/100-flutter-inspector.md b/src/data/roadmaps/flutter/content/115-dev-tools/100-flutter-inspector.md
index 474141d73..be652897c 100644
--- a/src/data/roadmaps/flutter/content/115-dev-tools/100-flutter-inspector.md
+++ b/src/data/roadmaps/flutter/content/115-dev-tools/100-flutter-inspector.md
@@ -2,15 +2,8 @@
 
 It is a tool in the Flutter SDK that provides a visual representation of the widget tree in a Flutter app. It allows developers to inspect the widgets in their app, see the properties and styles applied to each widget, and interact with the app in real-time.
 
-With the Flutter Inspector, developers can:
-
-1. Debug the widget tree and see how the widgets are laid out.
-2. Modify properties of widgets in real-time to see the impact on the app.
-3. Inspect the properties and styles of individual widgets, and view any errors or warnings.
-4. Measure the performance of the app, including the frame rate and number of widgets.
-
 Visit the following resources to learn more:
 
-- [@article@Using the Flutter inspector](https://docs.flutter.dev/development/tools/devtools/inspector)
+- [@official@Using the Flutter Inspector](https://docs.flutter.dev/development/tools/devtools/inspector)
 - [@video@How to Use the Flutter Inspector](https://www.youtube.com/watch?v=CcLfGJZS8ns)
 - [@feed@Explore top posts about Flutter](https://app.daily.dev/tags/flutter?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/115-dev-tools/101-flutter-outline.md b/src/data/roadmaps/flutter/content/115-dev-tools/101-flutter-outline.md
index 4edae8ee9..49a5a96cc 100644
--- a/src/data/roadmaps/flutter/content/115-dev-tools/101-flutter-outline.md
+++ b/src/data/roadmaps/flutter/content/115-dev-tools/101-flutter-outline.md
@@ -2,11 +2,6 @@
 
 Flutter Outline is a feature in the Flutter development environment (IDE) that provides a tree-like representation of the widgets and elements in your Flutter app. It shows the hierarchy of the widgets, their relationships, and the structure of your app.
 
-The Flutter Outline can be used to:
+Visit the following resources to learn more:
 
-- Navigate through your code
-- Understand the widget hierarchy
-- Debug your code
-- Refactor your code
-
-The Flutter Outline is a useful tool for Flutter developers, as it provides a high-level overview of your app and makes it easier to navigate and understand the code. It can help you to write better code and debug your app more efficiently.
+- [@official@Flutter Outline](https://api.flutter.dev/flutter/material/OutlinedButton-class.html)
diff --git a/src/data/roadmaps/flutter/content/115-dev-tools/102-memory-allocation.md b/src/data/roadmaps/flutter/content/115-dev-tools/102-memory-allocation.md
index 0fb81045b..daa7dac09 100644
--- a/src/data/roadmaps/flutter/content/115-dev-tools/102-memory-allocation.md
+++ b/src/data/roadmaps/flutter/content/115-dev-tools/102-memory-allocation.md
@@ -2,8 +2,6 @@
 
 Memory allocation is the process of reserving a portion of the device's memory for the use of your app. The memory allocation in Flutter is managed by the Dart virtual machine, which uses a garbage collector to automatically manage the memory used by the app.
 
-In Flutter, the widgets in the app's widget tree represent the state of the app. When the state changes, the widgets are rebuilt and the previous state's memory is automatically collected by the garbage collector.
+Visit the following resources to learn more:
 
-Visit the following links:
-
-- [@article@Using the Memory view](https://docs.flutter.dev/development/tools/devtools/memory)
+- [@official@Using the Memory view](https://docs.flutter.dev/development/tools/devtools/memory)
diff --git a/src/data/roadmaps/flutter/content/115-dev-tools/index.md b/src/data/roadmaps/flutter/content/115-dev-tools/index.md
index d0958c3d4..8cdabe534 100644
--- a/src/data/roadmaps/flutter/content/115-dev-tools/index.md
+++ b/src/data/roadmaps/flutter/content/115-dev-tools/index.md
@@ -1,17 +1,9 @@
 # Dev Tools
 
-Flutter DevTools is a suite of development tools provided by Flutter to help developers build, test, and debug Flutter apps. The tools include:
+Flutter DevTools is a suite of development tools provided by Flutter to help developers build, test, and debug Flutter apps.
 
-1. CLI: A command-line interface for managing and building Flutter apps.
-2. Doctor: A tool for diagnosing Flutter installation issues.
-3. Emulator: An emulator for running and testing Flutter apps.
-4. Observatory: A performance profiling tool for Flutter apps.
-5. Dart DevTools: A browser-based suite of development tools for Dart, including a debugger and performance profiling tools.
-6. Hot Reload: A feature that allows developers to see the impact of code changes in real-time.
-7. DevTools Extension: A browser extension that provides advanced debugging and performance profiling capabilities for Flutter apps.
+Learn more from the following resources:
 
-Learn more from the following links:
-
-- [@article@Flutter - DevTools](https://docs.flutter.dev/development/tools/devtools/overview)
-- [@article@Dart DevTools](https://dart.dev/tools/dart-devtools)
+- [@official@Flutter - DevTools](https://docs.flutter.dev/development/tools/devtools/overview)
+- [@official@Dart DevTools](https://dart.dev/tools/dart-devtools)
 - [@feed@Explore top posts about Tools](https://app.daily.dev/tags/tools?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/116-flutter-internals/100-render-objects.md b/src/data/roadmaps/flutter/content/116-flutter-internals/100-render-objects.md
index ca68e04b9..d0b64c147 100644
--- a/src/data/roadmaps/flutter/content/116-flutter-internals/100-render-objects.md
+++ b/src/data/roadmaps/flutter/content/116-flutter-internals/100-render-objects.md
@@ -4,5 +4,5 @@ RenderObject's can be defined as "Objects" that render and manipulate layouts, s
 
 Visit the following resources to learn more:
 
-- [@article@RenderObject documentation](https://api.flutter.dev/flutter/rendering/RenderObject-class.html)
+- [@official@RenderObject Documentation](https://api.flutter.dev/flutter/rendering/RenderObject-class.html)
 - [@article@Get started with RenderObjects - Flutter](https://jasper-dev.hashnode.dev/getting-started-with-renderobjects-in-flutter)
diff --git a/src/data/roadmaps/flutter/content/116-flutter-internals/102-immutability.md b/src/data/roadmaps/flutter/content/116-flutter-internals/102-immutability.md
index dab41ee1c..79a29ea74 100644
--- a/src/data/roadmaps/flutter/content/116-flutter-internals/102-immutability.md
+++ b/src/data/roadmaps/flutter/content/116-flutter-internals/102-immutability.md
@@ -2,8 +2,6 @@
 
 Immutability in Flutter refers to objects that cannot be changed once they are created. In Flutter, immutability is used to ensure that objects in the widget tree are not modified unexpectedly, which can lead to unexpected behavior and bugs in the app.
 
-In Flutter, objects that represent the state of the app, such as widgets and their properties, are considered immutable. When the state of the app changes, a new object is created to represent the new state, and the widget tree is rebuilt with the updated objects.
+Visit the following resources to learn more:
 
-Learn more from the following links:
-
-- [@article@Immutable data in Flutter](https://dart.academy/immutable-data-patterns-in-dart-and-flutter/)
+- [@article@Immutable Data in Flutter](https://dart.academy/immutable-data-patterns-in-dart-and-flutter/)
diff --git a/src/data/roadmaps/flutter/content/116-flutter-internals/103-3-trees.md b/src/data/roadmaps/flutter/content/116-flutter-internals/103-3-trees.md
index 3e0e8aab3..ca718c929 100644
--- a/src/data/roadmaps/flutter/content/116-flutter-internals/103-3-trees.md
+++ b/src/data/roadmaps/flutter/content/116-flutter-internals/103-3-trees.md
@@ -2,9 +2,7 @@
 
 A tree is a data structure that is used to represent the hierarchy of widgets in a Flutter app. The tree structure allows Flutter to manage the layout, styling, and behavior of the widgets in the app.
 
-A Flutter app's widget tree is created by composing smaller widgets into larger ones, which are then added to the tree. The root node of the tree represents the entire app, while the other nodes represent individual widgets.
-
-Learn more from the following links:
+Visit the following resources to learn more:
 
+- [@official@Tree in Flutter](https://docs.flutter.dev/resources/inside-flutter#tree-surgery)
 - [@article@Beginning Flutter — Understanding Tree](https://medium.com/@JediPixels/beginning-flutter-understanding-the-widget-tree-3513c94dc356)
-- [@article@Tree in Flutter](https://docs.flutter.dev/resources/inside-flutter#tree-surgery)
diff --git a/src/data/roadmaps/flutter/content/116-flutter-internals/index.md b/src/data/roadmaps/flutter/content/116-flutter-internals/index.md
index f23df5a01..fa8d03aef 100644
--- a/src/data/roadmaps/flutter/content/116-flutter-internals/index.md
+++ b/src/data/roadmaps/flutter/content/116-flutter-internals/index.md
@@ -1,12 +1,8 @@
 # Flutter Internals
 
-The internal workings of Flutter refer to the underlying mechanisms and architecture that make up the Flutter framework.
+The internal workings of Flutter refer to the underlying mechanisms and architecture that make up the Flutter framework. Flutter is a reactive framework for building user interfaces, which means that it allows developers to build dynamic, responsive apps that update automatically in response to changes in the state of the app.
 
-At a high level, Flutter is a reactive framework for building user interfaces, which means that it allows developers to build dynamic, responsive apps that update automatically in response to changes in the state of the app.
-
-Flutter achieves this by using a unique rendering engine that is based on the Skia graphics library. The rendering engine allows Flutter to render complex animations and graphics with high performance, and it also provides a way for Flutter to manage the layout and size of widgets in the app.
-
-Visit the following links:
+Visit the following resources to learn more:
 
 - [@article@Flutter - Internals](https://www.didierboelens.com/2019/09/flutter-internals/)
 - [@article@Overview of Flutter Internals](https://flutter.megathink.com/)
diff --git a/src/data/roadmaps/flutter/content/117-ci-cd/100-fast-lane.md b/src/data/roadmaps/flutter/content/117-ci-cd/100-fast-lane.md
index 5050d7d02..d851b3906 100644
--- a/src/data/roadmaps/flutter/content/117-ci-cd/100-fast-lane.md
+++ b/src/data/roadmaps/flutter/content/117-ci-cd/100-fast-lane.md
@@ -4,6 +4,6 @@ Fastlane is a third-party tool for automating the development and deployment pro
 
 Fastlane provides a suite of tools for automating tasks such as building, testing, and distributing apps. For example, fastlane can automate the process of building an app, creating a release candidate, and submitting the app to the app store.
 
-Learn more from the following links:
+Visit the following resources to learn more:
 
-- [@article@Fast Lane - CI/CD in Flutter](https://docs.flutter.dev/deployment/cd)
+- [@official@Fast Lane - CI/CD in Flutter](https://docs.flutter.dev/deployment/cd)
diff --git a/src/data/roadmaps/flutter/content/117-ci-cd/101-codemagic.md b/src/data/roadmaps/flutter/content/117-ci-cd/101-codemagic.md
index 6f061ae64..af2c11d90 100644
--- a/src/data/roadmaps/flutter/content/117-ci-cd/101-codemagic.md
+++ b/src/data/roadmaps/flutter/content/117-ci-cd/101-codemagic.md
@@ -4,7 +4,7 @@ Codemagic is a cloud-based continuous integration and delivery (CI/CD) platform
 
 Codemagic provides a simple and efficient way for Flutter developers to automate the build, test, and deployment process for their apps. It integrates with the Flutter framework and allows developers to configure the build process, run tests, and distribute the app to various app stores with just a few clicks.
 
-Learn more from the following links:
+Visit the following resources to learn more:
 
 - [@official@Codemagic - Flutter](https://codemagic.io/start/)
 - [@article@Create a build archive with Codemagic](https://docs.flutter.dev/deployment/ios#create-a-build-archive-with-codemagic-cli-tools)
diff --git a/src/data/roadmaps/flutter/content/117-ci-cd/102-bitrise.md b/src/data/roadmaps/flutter/content/117-ci-cd/102-bitrise.md
index bd834a21b..bba0fdf5a 100644
--- a/src/data/roadmaps/flutter/content/117-ci-cd/102-bitrise.md
+++ b/src/data/roadmaps/flutter/content/117-ci-cd/102-bitrise.md
@@ -4,6 +4,6 @@ Bitrise is a cloud-based continuous integration and delivery (CI/CD) platform th
 
 Bitrise provides a comprehensive suite of tools for automating the build, test, and deployment process for mobile apps, including apps built with Flutter. With Bitrise, developers can automate tasks such as building the app, running tests, and distributing the app to various app stores.
 
-Learn more from the following links:
+Visit the following resources to learn more:
 
 - [@article@Adding a Flutter app to Bitrise](https://devcenter.bitrise.io/en/getting-started/quick-start-guides/getting-started-with-flutter-apps.html)
diff --git a/src/data/roadmaps/flutter/content/117-ci-cd/103-github-actions.md b/src/data/roadmaps/flutter/content/117-ci-cd/103-github-actions.md
index 9389bb179..9a34ec970 100644
--- a/src/data/roadmaps/flutter/content/117-ci-cd/103-github-actions.md
+++ b/src/data/roadmaps/flutter/content/117-ci-cd/103-github-actions.md
@@ -1,18 +1,9 @@
 # Github Actions
 
-GitHub Actions is a workflow automation tool provided by GitHub that can be used to automate various tasks in a Flutter mobile app development process.
+GitHub Actions is a workflow automation tool provided by GitHub that can be used to automate various tasks in a Flutter mobile app development process. With GitHub Actions, developers can create custom workflows to automate tasks such as building the app, running tests, and deploying the app to various app stores. These workflows are defined as a series of actions in a YAML file, which can be committed to the repository.
 
-With GitHub Actions, developers can create custom workflows to automate tasks such as building the app, running tests, and deploying the app to various app stores. These workflows are defined as a series of actions in a YAML file, which can be committed to the repository.
+Visit the following resources to learn more:
 
-In a Flutter project, GitHub Actions can be used to:
-
-- Automate the build process
-- Run tests
-- Deploy to multiple app stores
-- Monitor the build process
-
-Learn more from the following links:
-
-- [@opensource@Github Actions](https://github.com/features/actions)
+- [@official@Github Actions](https://github.com/features/actions)
 - [@opensource@Flutter - Github Actions](https://github.com/nabilnalakath/flutter-githubaction)
 - [@feed@Explore top posts about GitHub](https://app.daily.dev/tags/github?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/117-ci-cd/104-firebase-app-distribution.md b/src/data/roadmaps/flutter/content/117-ci-cd/104-firebase-app-distribution.md
index 72811ec98..5ff7bc7c3 100644
--- a/src/data/roadmaps/flutter/content/117-ci-cd/104-firebase-app-distribution.md
+++ b/src/data/roadmaps/flutter/content/117-ci-cd/104-firebase-app-distribution.md
@@ -4,7 +4,7 @@ Firebase App Distribution is a service provided by Firebase, a mobile developmen
 
 With Firebase App Distribution, developers can upload a pre-release version of their Flutter mobile app to the Firebase platform, and then invite testers and stakeholders to download and test the app. Testers and stakeholders can provide feedback directly from the app, making it easier for developers to fix bugs and make improvements before releasing the app to the general public.
 
-To learn more visit the following links:
+Visit the following resources to learn more:
 
-- [@article@Firebase Hosting](https://firebase.google.com/docs/hosting)
+- [@official@Firebase Hosting](https://firebase.google.com/docs/hosting)
 - [@feed@Explore top posts about Firebase](https://app.daily.dev/tags/firebase?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/117-ci-cd/index.md b/src/data/roadmaps/flutter/content/117-ci-cd/index.md
index 4888991b7..411ef6c4f 100644
--- a/src/data/roadmaps/flutter/content/117-ci-cd/index.md
+++ b/src/data/roadmaps/flutter/content/117-ci-cd/index.md
@@ -4,14 +4,7 @@ CI/CD (Continuous Integration and Continuous Deployment) is a software developme
 
 With CI/CD, developers can automate the build, test, and deployment process for their Flutter apps, making it easier to catch bugs and deploy new features quickly and efficiently.
 
-The key components of a CI/CD pipeline for a Flutter app are:
+Visit the following resources to learn more:
 
-- Version control
-- Automated builds
-- Automated testing
-- Deployment
-
-Learn more from the following links:
-
-- [@article@CI/CD - Flutter](https://docs.flutter.dev/deployment/cd)
+- [@official@CI/CD - Flutter](https://docs.flutter.dev/deployment/cd)
 - [@feed@Explore top posts about CI/CD](https://app.daily.dev/tags/cicd?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/118-analytics/100-segment.md b/src/data/roadmaps/flutter/content/118-analytics/100-segment.md
index 794dc2df8..fe1520015 100644
--- a/src/data/roadmaps/flutter/content/118-analytics/100-segment.md
+++ b/src/data/roadmaps/flutter/content/118-analytics/100-segment.md
@@ -4,13 +4,6 @@ Segment is an analytics platform that provides a single API for collecting, stor
 
 With Segment, Flutter developers can easily add analytics tracking to their app, without having to integrate with multiple analytics tools individually. Segment acts as a single point of integration, allowing developers to send data to multiple analytics tools with a single API.
 
-Some key features of Segment for Flutter apps include:
+Visit the following resources to learn more:
 
-- Data collection
-- Data routing
-- Data storage
-- User tracking
-
-Learn more from the following links:
-
-- [@article@Doc of flutter_segment](https://pub.dev/packages/flutter_segment)
+- [@official@flutter_segment](https://pub.dev/packages/flutter_segment)
diff --git a/src/data/roadmaps/flutter/content/118-analytics/101-mix-panel.md b/src/data/roadmaps/flutter/content/118-analytics/101-mix-panel.md
index c61fff8e9..05c924ad6 100644
--- a/src/data/roadmaps/flutter/content/118-analytics/101-mix-panel.md
+++ b/src/data/roadmaps/flutter/content/118-analytics/101-mix-panel.md
@@ -4,14 +4,7 @@ Mixpanel is a product analytics platform that provides insights into user behavi
 
 With Mixpanel, Flutter developers can track user interactions with their app, including page views, events, and user properties, and use this data to gain insights into user behavior. Mixpanel provides a range of tools and features for analyzing this data, including real-time dashboards, segmentation, and A/B testing.
 
-Some key features of Mixpanel for Flutter apps include:
-
-- User tracking
-- Real-time dashboards
-- Segmentation
-- A/B testing
-
-Learn more from the following links:
+Visit the following resources to learn more:
 
 - [@article@Overview of Flutter Mixpanel](https://levelup.gitconnected.com/flutter-web-mixpanel-6046ffb664fb)
 - [@article@Flutter Mixpanel Analytics Integration](https://medium.com/flutter-clan/flutter-mixpanel-analytics-integration-b5840b155f7b)
diff --git a/src/data/roadmaps/flutter/content/118-analytics/102-firebase-analytics.md b/src/data/roadmaps/flutter/content/118-analytics/102-firebase-analytics.md
index 7a195fa5d..99f472fdf 100644
--- a/src/data/roadmaps/flutter/content/118-analytics/102-firebase-analytics.md
+++ b/src/data/roadmaps/flutter/content/118-analytics/102-firebase-analytics.md
@@ -4,8 +4,8 @@ Firebase Analytics is a free analytics tool provided by Google that helps to und
 
 With Firebase Analytics, Flutter developers can track user interactions with their app, including page views, events, and user properties, and use this data to gain insights into user behavior. Firebase Analytics provides a range of tools and features for analyzing this data, including real-time dashboards, user segmentation, and funnels.
 
-Learn more from the following links:
+Visit the following resources to learn more:
 
-- [@article@Flutter - Firebase](https://docs.flutter.dev/development/data-and-backend/firebase)
+- [@official@Flutter - Firebase](https://docs.flutter.dev/development/data-and-backend/firebase)
 - [@article@How To Add Firebase Analytics in Flutter](https://medium.datadriveninvestor.com/how-to-add-firebase-analytics-to-your-flutter-app-641fbda1d224?gi=ad489389a531)
 - [@feed@Explore top posts about Firebase](https://app.daily.dev/tags/firebase?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/118-analytics/103-google-analytics.md b/src/data/roadmaps/flutter/content/118-analytics/103-google-analytics.md
index 6f4fc2947..4ea3bccc2 100644
--- a/src/data/roadmaps/flutter/content/118-analytics/103-google-analytics.md
+++ b/src/data/roadmaps/flutter/content/118-analytics/103-google-analytics.md
@@ -4,7 +4,7 @@ Google Analytics is a free web analytics service provided by Google that helps t
 
 With Google Analytics, Flutter developers can track user interactions with their app, including page views, events, and user properties, and use this data to gain insights into user behavior. Google Analytics provides a range of tools and features for analyzing this data, including real-time dashboards, user segmentation, and funnels.
 
-Learn more from the following links:
+Visit the following resources to learn more:
 
-- [@article@Google Analytics for Firebase](https://firebase.flutter.dev/docs/analytics/overview/)
+- [@official@Google Analytics for Firebase](https://firebase.flutter.dev/docs/analytics/overview/)
 - [@feed@Explore top posts about Google](https://app.daily.dev/tags/google?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/content/118-analytics/index.md b/src/data/roadmaps/flutter/content/118-analytics/index.md
index fb7b31e4a..f98f9cb70 100644
--- a/src/data/roadmaps/flutter/content/118-analytics/index.md
+++ b/src/data/roadmaps/flutter/content/118-analytics/index.md
@@ -1,13 +1,8 @@
 # Analytics
 
-Analytics is a key aspect of understanding user behavior and measuring app performance for Flutter apps. There are a number of analytics tools available for Flutter apps, each with their own set of features and benefits. Some of the most popular analytics tools for Flutter include:
+Analytics is a key aspect of understanding user behavior and measuring app performance for Flutter apps. There are a number of analytics tools available for Flutter apps, each with their own set of features and benefits.
 
-1. Firebase Analytics: A free analytics tool provided by Google that helps to understand user behavior and measure app performance for mobile apps.
-2. Google Analytics: A free web analytics service provided by Google that helps to understand user behavior and measure app performance for mobile apps.
-3. Mixpanel: A paid analytics tool that provides a range of features for tracking user behavior, including real-time dashboards, user segmentation, and funnels.
-4. Segment: A paid analytics tool that provides a range of features for tracking user behavior, including real-time dashboards, user segmentation, and funnels.
+Visit the following resources to learn more:
 
-Learn more from the following links:
-
-- [@video@Flutter Analytics using Firebase](https://www.youtube.com/watch?v=31KpJXqCayo)
 - [@article@Top Flutter Analytics](https://fluttergems.dev/analytics-consumer-insights/)
+- [@video@Flutter Analytics using Firebase](https://www.youtube.com/watch?v=31KpJXqCayo)
diff --git a/src/data/roadmaps/flutter/content/119-deployment/100-appstore.md b/src/data/roadmaps/flutter/content/119-deployment/100-appstore.md
index c332ed0d0..bdc2c631d 100644
--- a/src/data/roadmaps/flutter/content/119-deployment/100-appstore.md
+++ b/src/data/roadmaps/flutter/content/119-deployment/100-appstore.md
@@ -4,7 +4,7 @@ App Store is an important platform to consider when publishing Flutter apps. To
 
 To publish a Flutter app on the App Store, developers need to ensure that their app meets Apple's guidelines and requirements, which include guidelines for performance, design, and user experience. Once the app has been reviewed and approved by Apple, it can be published on the App Store and made available for download to iOS users.
 
-Learn more from the following links:
+Visit the following resources to learn more:
 
-- [@article@Build and release an iOS app](https://docs.flutter.dev/deployment/ios)
-- [@article@App Store App Review](https://developer.apple.com/app-store/review/)
\ No newline at end of file
+- [@official@Build and Release an iOS App](https://docs.flutter.dev/deployment/ios)
+- [@article@App Store App Review](https://developer.apple.com/app-store/review/)
diff --git a/src/data/roadmaps/flutter/content/119-deployment/101-guidelines-and-protocols.md b/src/data/roadmaps/flutter/content/119-deployment/101-guidelines-and-protocols.md
index 71b027e05..bfe216461 100644
--- a/src/data/roadmaps/flutter/content/119-deployment/101-guidelines-and-protocols.md
+++ b/src/data/roadmaps/flutter/content/119-deployment/101-guidelines-and-protocols.md
@@ -11,6 +11,6 @@ Guidelines and protocols are important considerations for Flutter developers as
 
 By following these guidelines and protocols, Flutter developers can ensure that their apps are well-designed, user-friendly, and secure, making it easier to attract and retain users.
 
-Learn more from the following links:
+Visit the following resources to learn more:
 
 - [@article@Flutter - Protocols](https://api.flutter.dev/objcdoc/Protocols.html)
diff --git a/src/data/roadmaps/flutter/content/119-deployment/101-playstore.md b/src/data/roadmaps/flutter/content/119-deployment/101-playstore.md
index 28008d478..83b2e9cfb 100644
--- a/src/data/roadmaps/flutter/content/119-deployment/101-playstore.md
+++ b/src/data/roadmaps/flutter/content/119-deployment/101-playstore.md
@@ -4,6 +4,6 @@ The Google Play Store is an online store for Android apps, games, and other digi
 
 Visit the following resources to learn more:
 
-- [@article@Publish your app](https://developer.android.com/studio/publish)
-- [@article@Build and release an Android app](https://docs.flutter.dev/deployment/android)
+- [@official@Build and Release an Android App](https://docs.flutter.dev/deployment/android)
+- [@article@Publish your App - Android Developer](https://developer.android.com/studio/publish)
 - [@article@Publishing Flutter App To PlayStore](https://medium.flutterdevs.com/publishing-flutter-app-to-playstore-fa7543b61a7b)
diff --git a/src/data/roadmaps/flutter/content/119-deployment/index.md b/src/data/roadmaps/flutter/content/119-deployment/index.md
index 6e0627a01..c25dd0a63 100644
--- a/src/data/roadmaps/flutter/content/119-deployment/index.md
+++ b/src/data/roadmaps/flutter/content/119-deployment/index.md
@@ -1,16 +1,8 @@
 # Deployment
 
-Deployment in Flutter refers to the process of releasing a Flutter app to end-users. There are several steps involved in deploying a Flutter app, including:
+Deployment in Flutter refers to the process of releasing a Flutter app to end-users. Deploying a Flutter app involves a combination of technical skills and experience, as well as knowledge of the relevant app stores and their policies and requirements.
 
-- Building the app
-- Testing the app
-- Configuring app settings
-- Releasing to app stores
-- Updating the app
+Visit the following resources to learn more:
 
-In general, deploying a Flutter app involves a combination of technical skills and experience, as well as knowledge of the relevant app stores and their policies and requirements.
-
-Learn more from the following links:
-
-- [@article@Flutter - Web deployment](https://dart.dev/web/deployment)
+- [@official@Web Deployment](https://dart.dev/web/deployment)
 - [@feed@Explore top posts about CI/CD](https://app.daily.dev/tags/cicd?ref=roadmapsh)
diff --git a/src/data/roadmaps/flutter/flutter.md b/src/data/roadmaps/flutter/flutter.md
index 96cd93a85..703c3bc26 100644
--- a/src/data/roadmaps/flutter/flutter.md
+++ b/src/data/roadmaps/flutter/flutter.md
@@ -25,7 +25,6 @@ seo:
     - 'guide to becoming a flutter developer'
     - 'flutter developer'
     - 'flutter engineer'
-    - 'flutter skills'
     - 'guide to flutter'
     - 'flutter roadmap'
     - 'flutter skills'
@@ -38,7 +37,6 @@ seo:
     - 'flutter developer roadmap'
     - 'become a flutter developer'
     - 'flutter developer career path'
-    - 'flutter developer'
     - 'modern flutter developer'
 relatedRoadmaps:
   - 'backend'
diff --git a/src/data/roadmaps/frontend/content/content-security-policy@rmcm0CZbtNVC9LZ14-H6h.md b/src/data/roadmaps/frontend/content/content-security-policy@rmcm0CZbtNVC9LZ14-H6h.md
index ec2a06add..cd9925df7 100644
--- a/src/data/roadmaps/frontend/content/content-security-policy@rmcm0CZbtNVC9LZ14-H6h.md
+++ b/src/data/roadmaps/frontend/content/content-security-policy@rmcm0CZbtNVC9LZ14-H6h.md
@@ -5,6 +5,5 @@ Content Security Policy (CSP) is a security standard implemented by web browsers
 Visit the following resources to learn more:
 
 - [@article@MDN Content Security Policy (CSP)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP)
-- [@article@Google Devs Content Security Policy (CSP)](https://developers.google.com/web/fundamentals/security/csp)
 - [@article@Web.dev - Content Security Policy (CSP)](https://web.dev/csp/)
 - [@feed@Explore top posts about Security](https://app.daily.dev/tags/security?ref=roadmapsh)
diff --git a/src/data/roadmaps/frontend/content/css@ZhJhf1M2OphYbEmduFq-9.md b/src/data/roadmaps/frontend/content/css@ZhJhf1M2OphYbEmduFq-9.md
index f434ee1af..af582398b 100644
--- a/src/data/roadmaps/frontend/content/css@ZhJhf1M2OphYbEmduFq-9.md
+++ b/src/data/roadmaps/frontend/content/css@ZhJhf1M2OphYbEmduFq-9.md
@@ -8,3 +8,4 @@ Visit the following resources to learn more:
 - [@course@HTML & CSS Full Course - Beginner to Pro](https://www.youtube.com/watch?v=G3e-cpL7ofc)
 - [@article@Web.dev by Google — Learn CSS](https://web.dev/learn/css/)
 - [@feed@Explore top posts about CSS](https://app.daily.dev/tags/css?ref=roadmapsh)
+- [@course@Responsive Web Design Certification - Co-Learn HTML & CSS with guided projects](https://www.freecodecamp.org/learn/2022/responsive-web-design/)
diff --git a/src/data/roadmaps/frontend/content/html@yWG2VUkaF5IJVVut6AiSy.md b/src/data/roadmaps/frontend/content/html@yWG2VUkaF5IJVVut6AiSy.md
index 6f4dc6d81..dd2083dc1 100644
--- a/src/data/roadmaps/frontend/content/html@yWG2VUkaF5IJVVut6AiSy.md
+++ b/src/data/roadmaps/frontend/content/html@yWG2VUkaF5IJVVut6AiSy.md
@@ -8,3 +8,4 @@ Visit the following resources to learn more:
 - [@video@HTML Full Course for Beginners](https://youtu.be/mJgBOIoGihA)
 - [@video@HTML Full Course - Build a Website Tutorial](https://www.youtube.com/watch?v=pQN-pnXPaVg)
 - [@feed@Explore top posts about HTML](https://app.daily.dev/tags/html?ref=roadmapsh)
+- [@course@Responsive Web Design Certification - Co-Learn HTML & CSS with guided projects](https://www.freecodecamp.org/learn/2022/responsive-web-design/)
diff --git a/src/data/roadmaps/frontend/frontend.md b/src/data/roadmaps/frontend/frontend.md
index 5e6cb1956..35c257d0e 100644
--- a/src/data/roadmaps/frontend/frontend.md
+++ b/src/data/roadmaps/frontend/frontend.md
@@ -20,7 +20,7 @@ question:
 
     ## Which languages are used for Frontend Development?
 
-    The best part about the frontend development role is that there aren’t that many options to pick from when it comes to [frontend technologies](https://roadmap.sh/frontend/technologies) (unlike with backend development).
+    The easy part about the frontend development role is that there aren’t that many options to choose from when it comes to [frontend languages](https://roadmap.sh/frontend/languages) and [technologies](https://roadmap.sh/frontend/technologies) (unlike with backend development).
 
     As a frontend developer, you’ll be working with the following technologies:
 
diff --git a/src/data/roadmaps/full-stack/content/basic-aws-services@cUOfvOlQ_0Uu1VX3i67kJ.md b/src/data/roadmaps/full-stack/content/basic-aws-services@cUOfvOlQ_0Uu1VX3i67kJ.md
index 1ee88fca0..439294a57 100644
--- a/src/data/roadmaps/full-stack/content/basic-aws-services@cUOfvOlQ_0Uu1VX3i67kJ.md
+++ b/src/data/roadmaps/full-stack/content/basic-aws-services@cUOfvOlQ_0Uu1VX3i67kJ.md
@@ -1,6 +1,6 @@
 # Basic AWS Services
 
-AWS has several services but you don't need to know all of them. Some common ones that you can start with are EC2, VPN, S3, Route 53, and SES.
+AWS has several services but you don't need to know all of them. Some common ones that you can start with are EC2, VPC, S3, Route 53, and SES.
 
 Here are some of the resources to get you started:
 
diff --git a/src/data/roadmaps/game-developer/content/artificial-neural-network@AoH2r4EOHyZd8YaV24rBk.md b/src/data/roadmaps/game-developer/content/artificial-neural-network@AoH2r4EOHyZd8YaV24rBk.md
index 2ad2ec3c0..69828ff2a 100644
--- a/src/data/roadmaps/game-developer/content/artificial-neural-network@AoH2r4EOHyZd8YaV24rBk.md
+++ b/src/data/roadmaps/game-developer/content/artificial-neural-network@AoH2r4EOHyZd8YaV24rBk.md
@@ -4,6 +4,5 @@ Artificial Neural Networks (ANN) are a branch of machine learning that draw insp
 
 Visit the following resources to learn more:
 
-- [@article@Artificial Neural Networks (ANN)](https://www.geeksforgeeks.org/artificial-neural-networks-and-its-applications/)
 - [@article@What is ANN?](https://www.coursera.org/articles/artificial-neural-network)
 - [@article@What is Neural Network?](https://www.ibm.com/topics/neural-networks)
diff --git a/src/data/roadmaps/game-developer/content/cc@jsq0UXnIIC0Z_nbK2w48f.md b/src/data/roadmaps/game-developer/content/cc@jsq0UXnIIC0Z_nbK2w48f.md
index 895b883e3..e1fe31744 100644
--- a/src/data/roadmaps/game-developer/content/cc@jsq0UXnIIC0Z_nbK2w48f.md
+++ b/src/data/roadmaps/game-developer/content/cc@jsq0UXnIIC0Z_nbK2w48f.md
@@ -6,5 +6,5 @@ On the other hand, **C++** follows the paradigm of both procedural and object-or
 
 Visit the following resources to learn more:
 
-- [@article@The C Programming Language](https://www.iso.org/standard/74528.html)
+- [@article@C Programming Language](https://en.wikipedia.org/wiki/C_%28programming_language%29)
 - [@article@C++ Programming Language](https://en.wikipedia.org/wiki/C%2B%2B)
diff --git a/src/data/roadmaps/game-developer/content/computer-graphics@lIb5MeDoqVj6HycveOgTS.md b/src/data/roadmaps/game-developer/content/computer-graphics@lIb5MeDoqVj6HycveOgTS.md
index 879aaf7b2..5230019d9 100644
--- a/src/data/roadmaps/game-developer/content/computer-graphics@lIb5MeDoqVj6HycveOgTS.md
+++ b/src/data/roadmaps/game-developer/content/computer-graphics@lIb5MeDoqVj6HycveOgTS.md
@@ -4,6 +4,5 @@ Computer Graphics is a subfield of computer science that studies methods for dig
 
 Visit the following resources to learn more:
 
-- [@article@What is Computer Graphics?](https://www.geeksforgeeks.org/introduction-to-computer-graphics/)
 - [@article@Introduction to Computer Graphics](https://open.umn.edu/opentextbooks/textbooks/420)
 - [@video@How do Video Game Graphics Work?](https://www.youtube.com/watch?v=C8YtdC8mxTU)
diff --git a/src/data/roadmaps/game-developer/content/epa@vWLKYK2KUzV1fO-vQunzW.md b/src/data/roadmaps/game-developer/content/epa@vWLKYK2KUzV1fO-vQunzW.md
index 85add2d59..d6c06e499 100644
--- a/src/data/roadmaps/game-developer/content/epa@vWLKYK2KUzV1fO-vQunzW.md
+++ b/src/data/roadmaps/game-developer/content/epa@vWLKYK2KUzV1fO-vQunzW.md
@@ -1,8 +1,8 @@
 # EPA
 
-The **EPA**, also known as the *Environmental Protection Agency*, is not typically related to game development or the concept of intersection within this context. However, in game development, EPA might refer to an 'Event-driven Process chain Architecture' or some other game-specific acronym. In this domain, different terminologies and acronyms are often used to express complex architectures, designs, or functionalities. If you have encountered EPA in a game development context, it might be best to refer to the specific documentation or guide where it was described for a better understanding. Understanding the context is key to untangle the meaning of such abbreviations.
+The **EPA** (Expanding Polytope Algorithm) is an iterative algorithm used for calculating the penetration depth between two shapes in collision detection. It is commonly used in physics engines and robotics. The algorithm takes the resulting simplex from a previously applied GJK algorithm, iteratively expanding the polytope towards the Minkowski Difference boundary until it finds the closest point to the origin. The vector from that point to the origin is the penetration vector and its magnitude is equal to the penetration depth between the two shapes.
 
 Visit the following resources to learn more:
 
-- [@article@Environmental Sustainability in Game Development](https://polydin.com/environmental-sustainability-in-game-development/)
-- [@article@Gaming Sustainability - Microsoft Game Dev](https://learn.microsoft.com/en-us/gaming/sustainability/sustainability-overview)
+- [@article@EPA: Collision response algorithm for 2D/3D - winter.dev](https://winter.dev/articles/epa-algorithm)
+- [@article@EPA (Expanding Polytope Algorithm) - dyn4j](https://dyn4j.org/2010/05/epa-expanding-polytope-algorithm/)
diff --git a/src/data/roadmaps/game-developer/content/godot@7OffO2mBmfBKqPBTZ9ngI.md b/src/data/roadmaps/game-developer/content/godot@7OffO2mBmfBKqPBTZ9ngI.md
index 34890ef44..552c73c4d 100644
--- a/src/data/roadmaps/game-developer/content/godot@7OffO2mBmfBKqPBTZ9ngI.md
+++ b/src/data/roadmaps/game-developer/content/godot@7OffO2mBmfBKqPBTZ9ngI.md
@@ -1,10 +1,12 @@
 # Godot
 
-Godot is an open-source, multi-platform game engine that is known for being feature-rich and user-friendly. It is developed by hundreds of contributors from around the world and supports the creation of both 2D and 3D games. Godot uses its own scripting language, GDScript, which is similar to Python, but it also supports C# and visual scripting. It is equipped with a unique scene system and comes with a multitude of tools that can expedite the development process. Godot's design philosophy centers around flexibility, extensibility, and ease of use, providing a handy tool for both beginners and pros in game development.
+Godot is an open-source, multi-platform game engine that is known for being feature-rich and user-friendly. It is developed by hundreds of contributors from around the world and supports the creation of both 2D and 3D games. Godot uses its own scripting language, GDScript, which is similar to Python, but it also supports C#. It is equipped with a unique scene system and comes with a multitude of tools that can expedite the development process. Godot's design philosophy centers around flexibility, extensibility, and ease of use, providing a handy tool for both beginners and pros in game development.
 
 Visit the following resources to learn more:
 
 - [@opensource@godotengine/godot](https://github.com/godotengine/godot)
 - [@official@Godot](https://godotengine.org/)
 - [@official@Godot Documentation](https://docs.godotengine.org/en/stable/)
-- [@video@Godot in 100 Seconds](https://m.youtube.com/watch?v=QKgTZWbwD1U)
+- [@video@Godot in 100 Seconds](https://www.youtube.com/watch?v=QKgTZWbwD1U)
+- [@video@Tutorial - How to make a Video Game in Godot](https://www.youtube.com/watch?v=LOhfqjmasi0)
+- [@video@Tutorial - How to make 3D Games in Godot](https://www.youtube.com/watch?v=ke5KpqcoiIU)
diff --git a/src/data/roadmaps/game-developer/content/joints@m2_wUW2VHMCXHnn5B91qr.md b/src/data/roadmaps/game-developer/content/joints@m2_wUW2VHMCXHnn5B91qr.md
index de533a3d2..96e084e71 100644
--- a/src/data/roadmaps/game-developer/content/joints@m2_wUW2VHMCXHnn5B91qr.md
+++ b/src/data/roadmaps/game-developer/content/joints@m2_wUW2VHMCXHnn5B91qr.md
@@ -4,5 +4,6 @@ Joints in game development primarily refer to the connections between two object
 
 Visit the following resources to learn more:
 
-- [@article@Game Character Rigging Fundamentals](https://learn.unity.com/project/game-character-rigging-fundamentals)
+- [@official@Introduction to joints](https://docs.unity3d.com/Manual/Joints.html)
+- [@article@Character Rigging for Video Games](https://game-ace.com/blog/character-rigging-for-video-games/)
 - [@article@Joints in Unity](https://simonpham.medium.com/joints-in-unity-f9b602212524)
diff --git a/src/data/roadmaps/game-developer/content/mcts@QD9TfZn3yhGPVwiyJ6d0V.md b/src/data/roadmaps/game-developer/content/mcts@QD9TfZn3yhGPVwiyJ6d0V.md
index 21ec4023d..341934baf 100644
--- a/src/data/roadmaps/game-developer/content/mcts@QD9TfZn3yhGPVwiyJ6d0V.md
+++ b/src/data/roadmaps/game-developer/content/mcts@QD9TfZn3yhGPVwiyJ6d0V.md
@@ -5,4 +5,3 @@
 Visit the following resources to learn more:
 
 - [@article@MCTS Algorithm](https://en.wikipedia.org/wiki/Monte_Carlo_tree_search/)
-- [@article@Monte Carlo Tree Search](https://www.geeksforgeeks.org/ml-monte-carlo-tree-search-mcts/)
diff --git a/src/data/roadmaps/git-github/content/collaborators@r-u1vTpUyuvsB0revOU0C.md b/src/data/roadmaps/git-github/content/collaborators@r-u1vTpUyuvsB0revOU0C.md
index 6bd5812e6..4e4f6ff54 100644
--- a/src/data/roadmaps/git-github/content/collaborators@r-u1vTpUyuvsB0revOU0C.md
+++ b/src/data/roadmaps/git-github/content/collaborators@r-u1vTpUyuvsB0revOU0C.md
@@ -6,6 +6,5 @@ Visit the following resources to learn more:
 
 - [@official@How to add collaborators to your personal projects](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-access-to-your-personal-repositories/inviting-collaborators-to-a-personal-repository)
 - [@official@Adding outside collaborators to repositories in your organization](https://docs.github.com/en/organizations/managing-user-access-to-your-organizations-repositories/managing-outside-collaborators/adding-outside-collaborators-to-repositories-in-your-organization)
-- [@article@What are github collaborators](https://www.geeksforgeeks.org/what-are-github-collaborators/)
 - [@article@How to Add Collaborators to Your GitHub Repository](https://www.blinkops.com/blog/how-to-add-collaborators-to-your-github-repository)
 - [@video@Using Github for Team collaboration](https://youtu.be/4nyIS58ORWw?si=yK5LCONNVm9OIUK5)
\ No newline at end of file
diff --git a/src/data/roadmaps/git-github/content/github-wikis@lONqOqD-4slxa9B5i9ADX.md b/src/data/roadmaps/git-github/content/github-wikis@lONqOqD-4slxa9B5i9ADX.md
index 0ec044cb6..74b6f5b40 100644
--- a/src/data/roadmaps/git-github/content/github-wikis@lONqOqD-4slxa9B5i9ADX.md
+++ b/src/data/roadmaps/git-github/content/github-wikis@lONqOqD-4slxa9B5i9ADX.md
@@ -5,4 +5,4 @@ GitHub Wikis are collaborative documentation spaces integrated directly into Git
 Visit the following resources to learn more:
 
 - [@official@About Wikis](https://docs.github.com/en/communities/documenting-your-project-with-wikis/about-wikis)
-- [@article@Documenting your project with Wikis](https://docs.github.com/en/communities/documenting-your-project-with-wikis)
+- [@official@Documenting your project with Wikis](https://docs.github.com/en/communities/documenting-your-project-with-wikis)
diff --git a/src/data/roadmaps/git-github/content/unstaged-changes@uxqJzQFRcALqatNRIWR0w.md b/src/data/roadmaps/git-github/content/unstaged-changes@uxqJzQFRcALqatNRIWR0w.md
index aafe19caa..5646a74d2 100644
--- a/src/data/roadmaps/git-github/content/unstaged-changes@uxqJzQFRcALqatNRIWR0w.md
+++ b/src/data/roadmaps/git-github/content/unstaged-changes@uxqJzQFRcALqatNRIWR0w.md
@@ -1,6 +1,8 @@
 # Unstaged Changes
 
-For changes that are not yet staged with `git add`, such as untracked new files or modified existing ones, use `git diff --unified`. This command compares your working directory against the latest committed version of each file. It's a useful tool for reviewing any local modifications before deciding whether to stage them for future commits.
+For changes that are not yet staged with `git add`, such as untracked new files or modified existing ones , use `git diff`. This command compares your working directory (your current changes) against the staging area (changes already staged with `git add`). It’s a useful tool for reviewing local modifications before deciding whether to stage them for future commits.
+
+The `--unified` option (or -U) controls the number of context lines shown in the diff output. By default, Git shows 3 lines of context around each change. For example, `git diff --unified=5` will display 5 lines of context around each change, making it easier to understand the surrounding code or content.
 
 - [@article@What are unstaged changes in GitHub?](https://stackoverflow.com/questions/10954329/whats-the-unstaged-changes-in-github)
-- [@article@How to unstage files in Git](https://www.git-tower.com/learn/git/faq/git-unstage)
\ No newline at end of file
+- [@article@How to unstage files in Git](https://www.git-tower.com/learn/git/faq/git-unstage)
diff --git a/src/data/roadmaps/git-github/content/workflow-context@BnPiTu1Jw2kIW560a2A5T.md b/src/data/roadmaps/git-github/content/workflow-context@BnPiTu1Jw2kIW560a2A5T.md
index bea269b17..3dc0f1941 100644
--- a/src/data/roadmaps/git-github/content/workflow-context@BnPiTu1Jw2kIW560a2A5T.md
+++ b/src/data/roadmaps/git-github/content/workflow-context@BnPiTu1Jw2kIW560a2A5T.md
@@ -4,5 +4,5 @@ Workflow context in GitHub Actions refers to the environment and variables that
 
 Learn more from the following resources:
 
-- [@article@GitHub Actions Contexts](https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/contexts)
+- [@official@GitHub Actions Contexts](https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/contexts)
 - [@video@Working with contexts in GitHub Actions](https://www.youtube.com/watch?v=16WT_r0zjYE)
\ No newline at end of file
diff --git a/src/data/roadmaps/git-github/content/workflow-runners@6QwlY3dEvjfAOPALcWKXQ.md b/src/data/roadmaps/git-github/content/workflow-runners@6QwlY3dEvjfAOPALcWKXQ.md
index 92628d77f..2f9bc81f4 100644
--- a/src/data/roadmaps/git-github/content/workflow-runners@6QwlY3dEvjfAOPALcWKXQ.md
+++ b/src/data/roadmaps/git-github/content/workflow-runners@6QwlY3dEvjfAOPALcWKXQ.md
@@ -4,5 +4,5 @@ Workflow runners are the environments where GitHub Actions workflows are execute
 
 Learn more from the following resources:
 
-- [@video@GitHub Actions Self-hosted runners](https://www.youtube.com/watch?v=aLHyPZO0Fy0)
-- [@article@GitHub Actions Runners](https://docs.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners)
\ No newline at end of file
+- [@official@GitHub Actions Runners](https://docs.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners)
+- [@video@GitHub Actions Self-hosted runners](https://www.youtube.com/watch?v=aLHyPZO0Fy0)
\ No newline at end of file
diff --git a/src/data/roadmaps/git-github/content/workflow-triggers@55uHPFNwYPVZx8Cy3c985.md b/src/data/roadmaps/git-github/content/workflow-triggers@55uHPFNwYPVZx8Cy3c985.md
index a254abbe1..257ba834d 100644
--- a/src/data/roadmaps/git-github/content/workflow-triggers@55uHPFNwYPVZx8Cy3c985.md
+++ b/src/data/roadmaps/git-github/content/workflow-triggers@55uHPFNwYPVZx8Cy3c985.md
@@ -4,5 +4,5 @@ Workflow triggers are events that initiate a GitHub Actions workflow. They can b
 
 Learn more from the following resources:
 
-- [@article@GitHub Actions Documentation](https://docs.github.com/en/actions)
-- [@article@GitHub Actions Triggers](https://docs.github.com/en/actions/reference/events-that-trigger-workflows)
\ No newline at end of file
+- [@official@GitHub Actions Documentation](https://docs.github.com/en/actions)
+- [@official@GitHub Actions Triggers](https://docs.github.com/en/actions/reference/events-that-trigger-workflows)
\ No newline at end of file
diff --git a/src/data/roadmaps/golang/content/101-go-advanced/100-go-modules.md b/src/data/roadmaps/golang/content/101-go-advanced/100-go-modules.md
index f5870b579..5077af41f 100644
--- a/src/data/roadmaps/golang/content/101-go-advanced/100-go-modules.md
+++ b/src/data/roadmaps/golang/content/101-go-advanced/100-go-modules.md
@@ -7,5 +7,4 @@ Visit the following resources to learn more:
 - [@official@Go Modules](https://go.dev/blog/using-go-modules)
 - [@article@DigitalOcean: How to use Go Modules](https://www.digitalocean.com/community/tutorials/how-to-use-go-modules)
 - [@video@Go Modules](https://www.youtube.com/watch?v=9cV1KESTJRc)
-- [@video@Go Modules Explained in 5 Minutes](https://youtu.be/7xSxIwWJ9R4)
 - [@feed@Explore top posts about Golang](https://app.daily.dev/tags/golang?ref=roadmapsh)
diff --git a/src/data/roadmaps/golang/content/102-go-building-clis/102-bubbletea.md b/src/data/roadmaps/golang/content/102-go-building-clis/102-bubbletea.md
new file mode 100644
index 000000000..80eb774fa
--- /dev/null
+++ b/src/data/roadmaps/golang/content/102-go-building-clis/102-bubbletea.md
@@ -0,0 +1,9 @@
+# Bubbletea
+
+Bubbletea is a powerful and flexible framework for building terminal user interfaces (TUIs) in Go, based on The Elm Architecture. 
+
+Visit the following resources to learn more:
+
+- [@opensource@Bubbletea](https://github.com/charmbracelet/bubbletea)
+- [@article@Bubbletea Tutorial](https://github.com/charmbracelet/bubbletea/tree/master/tutorials)
+- [@video@Building Terminal Wizard in Go](https://www.youtube.com/watch?v=Gl31diSVP8M)
diff --git a/src/data/roadmaps/golang/content/109-go-microservices/100-watermill.md b/src/data/roadmaps/golang/content/109-go-microservices/100-watermill.md
index 3de27d50f..1ba6bccbe 100644
--- a/src/data/roadmaps/golang/content/109-go-microservices/100-watermill.md
+++ b/src/data/roadmaps/golang/content/109-go-microservices/100-watermill.md
@@ -1,8 +1,9 @@
 # Watermill
 
-Watermill is an event streaming library for handling asynchronous requests in go. It provides multiple sets of implementations for pub/sub.
-e.g: You can use conventional pub/sub implementations like Kafka or RabbitMQ, but also HTTP or MySQL binlog, if that fits your use case.
+Watermill is an event streaming library for handling asynchronous requests in Go. It provides multiple implementations for pub/sub.
+For example, you can use conventional pub/sub systems like Kafka or RabbitMQ, as well as HTTP or MySQL binlog, depending on your use case.
 
 Visit the following resources to learn more:
 
-- [@official@Watermill Website](https://watermill.io/)
+- [@official@Watermill Website](https://watermill.io)
+- [@official@Watermill Documentation](https://watermill.io/docs/getting-started)
diff --git a/src/data/roadmaps/java/content/100-java-fundamentals/103-functions.md b/src/data/roadmaps/java/content/100-java-fundamentals/103-functions.md
deleted file mode 100644
index 5b65ae133..000000000
--- a/src/data/roadmaps/java/content/100-java-fundamentals/103-functions.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# Functions
-
-A method/function is a way to perform some task. Similarly, in programming like Java, a function method is a block of code written to perform a specific task repeatedly. It provides reusability of code. We write the function once and use it many times. It works on the 'DRY' principle i.e., "Do not repeat yourself".
-
-Steps -
-
-1. Define function - `datatype function_name(parameters){body}`
-2. Call function - `function_name(values)`
-3. Lambda functions - `x -> x + 1`
-4. Pass a function as a variable -
-```
-final Consumer<Integer> simpleReference1 = App::someMethod1;  
-simpleReference1.accept(1);
-```
-
-Visit the following resources to learn more:
-
-- [@article@Methods/Functions in Java.](https://www.javatpoint.com/method-in-java)
-- [@article@Learn Functions/Methods in Java](https://www.w3schools.com/java/java_methods.asp)
-- [@video@Functions / Methods in Java](https://www.youtube.com/watch?v=vvanI8NRlSI)
-- [@article@Lambda functions](https://www.w3schools.com/java/java_lambda.asp)
-- [@article@Passing functions as a variable](https://northcoder.com/post/passing-java-functions-in-variables/)
diff --git a/src/data/roadmaps/java/content/100-java-fundamentals/104-datastructures.md b/src/data/roadmaps/java/content/100-java-fundamentals/104-datastructures.md
deleted file mode 100644
index 2300d6791..000000000
--- a/src/data/roadmaps/java/content/100-java-fundamentals/104-datastructures.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# Datastructures
-
-As the name indicates itself, a **Data Structure** is a way of organizing the data in the **memory** so that it can be used efficiently. Some common data structures are array, linked list, stack, hashtable, queue, tree, heap, and graph.
-
-- Array allocates continuous memory for homogeneous data
-- Linked List stores data in nodes with references
-- Stack follows Last In First Out principle
-- Queue follows First In First Out principle
-
-Visit the following resources to learn more:
-
-- [@article@Data Structures and Algorithms](https://www.javatpoint.com/data-structure-tutorial)
-- [@video@Java + DSA + Interview Preparation Course](https://youtube.com/playlist?list=PL9gnSGHSqcnr_DxHsP7AW9ftq0AtAyYqJ)
-- [@video@Data Structures Illustrated](https://www.youtube.com/watch?v=9rhT3P1MDHk&list=PLkZYeFmDuaN2-KUIv-mvbjfKszIGJ4FaY)
diff --git a/src/data/roadmaps/java/content/100-java-fundamentals/105-oop.md b/src/data/roadmaps/java/content/100-java-fundamentals/105-oop.md
deleted file mode 100644
index a23829e60..000000000
--- a/src/data/roadmaps/java/content/100-java-fundamentals/105-oop.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# OOP
-
-Object-oriented programming (OOP) is a programming paradigm based on the concept of objects, which can contain data and code: data in the form of fields (often known as attributes or properties), and code in the form of procedures (often known as methods). In OOP, computer programs are designed by making them out of objects that interact with one another.
-
-Abstraction, encapsulation, polymorphism, and inheritance are the four main theoretical principles of object-oriented programming. But Java also works with three further OOP concepts: association, aggregation, and composition.
-
-Visit the following resources to learn more:
-
-- [@article@Class](https://www.javatpoint.com/object-and-class-in-java)
-- [@article@Inheritance](https://www.javatpoint.com/inheritance-in-java)
-- [@article@Polymorphism](https://www.javatpoint.com/runtime-polymorphism-in-java)
-- [@article@Abstraction](https://www.softwaretestinghelp.com/what-is-abstraction-in-java/)
-- [@article@Encapsulation](https://www.programiz.com/java-programming/encapsulation)
-- [@article@Association](https://www.javatpoint.com/association-in-java)
-- [@article@Aggregation](https://www.javatpoint.com/aggregation-in-java)
-- [@article@Composition](https://www.geeksforgeeks.org/composition-in-java/)
-- [@article@Java OOPs Concepts](https://www.javatpoint.com/java-oops-concepts)
-- [@article@Using OOP concepts to write high-performance Java code](https://raygun.com/blog/oop-concepts-java)
-- [@video@Java complete OOPs playlist](https://youtube.com/playlist?list=PL9gnSGHSqcno1G3XjUbwzXHL8_EttOuKk)
-- [@video@Java OOPs Concepts](https://www.youtube.com/watch?v=6T_HgnjoYwM)
diff --git a/src/data/roadmaps/java/content/101-java-advanced-topics/101-memory-management.md b/src/data/roadmaps/java/content/101-java-advanced-topics/101-memory-management.md
deleted file mode 100644
index 905719a0c..000000000
--- a/src/data/roadmaps/java/content/101-java-advanced-topics/101-memory-management.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Memory Management
-
-In Java, memory management is the process of allocation and de-allocation of objects.
-
-Visit the following resources to learn more:
-
-- [@article@Memory Management in Java](https://www.javatpoint.com/memory-management-in-java)
-- [@video@Memory Management Tutorial in Java](https://www.youtube.com/watch?v=fM8yj93X80s)
-- [@video@Memory Managament And Garbage Collection in Java](https://youtu.be/vz6vSZRuS2M?si=4-JyoDkgcxrLmxSt)
diff --git a/src/data/roadmaps/java/content/101-java-advanced-topics/102-collection-framework.md b/src/data/roadmaps/java/content/101-java-advanced-topics/102-collection-framework.md
deleted file mode 100644
index 58ed75f64..000000000
--- a/src/data/roadmaps/java/content/101-java-advanced-topics/102-collection-framework.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# Collection Framework
-
-The Collection in Java is a framework that provides an architecture to store and manipulate the group of objects. Java Collections can achieve all the operations that you perform on a data such as searching, sorting, insertion, manipulation, and deletion.
-
-Visit the following resources to learn more:
-
-- [@article@Collections in Java](https://www.javatpoint.com/collections-in-java)
-- [@article@Java - Collections Framework](https://www.tutorialspoint.com/java/java_collections.htm)
diff --git a/src/data/roadmaps/java/content/101-java-advanced-topics/103-serialization.md b/src/data/roadmaps/java/content/101-java-advanced-topics/103-serialization.md
deleted file mode 100644
index b989c3f2d..000000000
--- a/src/data/roadmaps/java/content/101-java-advanced-topics/103-serialization.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# Serialization
-
-Serialization is the conversion of the state of an object into a byte stream; deserialization does the opposite. Stated differently, serialization is the conversion of a Java object into a static stream (sequence) of bytes, which we can then save to a database or transfer over a network.
-
-Visit the following resources to learn more:
-
-- [@article@Serialization and Deserialization in Java](https://www.javatpoint.com/serialization-in-java)
-- [@article@Introduction to Java Serialization](https://www.baeldung.com/java-serialization)
diff --git a/src/data/roadmaps/java/content/101-java-advanced-topics/106-how-jvm-works.md b/src/data/roadmaps/java/content/101-java-advanced-topics/106-how-jvm-works.md
deleted file mode 100644
index 16d534248..000000000
--- a/src/data/roadmaps/java/content/101-java-advanced-topics/106-how-jvm-works.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# How JVM Works
-
-The Java Virtual Machine (JVM) is a platform-dependent program that executes platform-independent Java bytecode, embodying the "Write once, run everywhere" principle. As a crucial component of the Java Runtime Environment (JRE), the JVM is responsible for initiating Java programs by calling their main method. While designed primarily for Java, the JVM's ability to run any language compiled to Java bytecode has led to its adoption by other languages like Kotlin, Scala, and Groovy. Multiple JVM implementations exist, with Oracle's HotSpot being the standard and GraalVM emerging as a high-performance alternative, each offering unique features and optimizations
-
-Visit the following resources to learn more:
-
-- [@article@Introducing the Java Virtual Machine](https://www.infoworld.com/article/3272244/what-is-the-jvm-introducing-the-java-virtual-machine.html)
-- [@video@How JVM works?](https://youtu.be/G1ubVOl9IBw)
-- [@article@JVM languages](https://www.whizlabs.com/blog/jvm-languages/)
-- [@article@GraalVM](https://www.graalvm.org/)
-- [@feed@Explore top posts about JVM](https://app.daily.dev/tags/jvm?ref=roadmapsh)
-- [@video@JVM Architecture in 8min](https://www.youtube.com/watch?v=QHIWkwxs0AI)
diff --git a/src/data/roadmaps/java/content/101-java-advanced-topics/107-garbage-collection.md b/src/data/roadmaps/java/content/101-java-advanced-topics/107-garbage-collection.md
deleted file mode 100644
index b0f28dc6c..000000000
--- a/src/data/roadmaps/java/content/101-java-advanced-topics/107-garbage-collection.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Garbage Collection
-
-Java garbage collection is the process by which Java programs perform automatic memory management. Java programs compile to bytecode that can be run on a Java Virtual Machine, or JVM for short. When Java programs run on the JVM, objects are created on the heap, which is a portion of memory dedicated to the program
-
-Visit the following resources to learn more:
-
-- [@article@Java Garbage Collection](https://stackify.com/what-is-java-garbage-collection/)
-- [@article@Java Garbage Collection](https://www.javatpoint.com/Garbage-Collection)
-- [@video@Garbage Collection in Java - Geekific](https://www.youtube.com/watch?v=XXOaCV5xm9s)
diff --git a/src/data/roadmaps/java/content/101-java-advanced-topics/index.md b/src/data/roadmaps/java/content/101-java-advanced-topics/index.md
deleted file mode 100644
index 01b6e0c78..000000000
--- a/src/data/roadmaps/java/content/101-java-advanced-topics/index.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# Java Advanced Topics
-
-Java Advanced Topics delves into crucial concepts that every Java developer should master to build efficient and scalable applications. It covers memory management techniques, deep dives into the collection framework, and explores serialization for data persistence. Networking and sockets are discussed to help you build robust communication systems, while an understanding of how the JVM works and garbage collection mechanisms ensures optimal application performance. Additionally, the basics of threading introduce parallelism, crucial for modern multi-threaded programming.
-
-Visit the following resources to learn more:
-
-- [@article@What is Advanced Java? - GeeksForGeeks](https://www.geeksforgeeks.org/what-is-advanced-java/)
-- [@article@What is Advance Java? - JavatPoint](https://www.javatpoint.com/what-is-advance-java)
-- [@video@Advance Java Full Course 2023 - SimpliLearn](https://youtu.be/Ae-r8hsbPUo?si=faFsqJYfCc5jIO6p)
-
diff --git a/src/data/roadmaps/java/content/102-java-build-tools/102-ant.md b/src/data/roadmaps/java/content/102-java-build-tools/102-ant.md
deleted file mode 100644
index 0a1ea49ae..000000000
--- a/src/data/roadmaps/java/content/102-java-build-tools/102-ant.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# Ant
-
-Apache Ant is a Java library and command-line tool whose mission is to drive processes described in build files as targets and extension points dependent upon each other. The main known usage of Ant is the build of Java applications. Ant supplies a number of built-in tasks allowing to compile, assemble, test and run Java applications. Ant can also be used effectively to build non Java applications, for instance C or C++ applications. More generally, Ant can be used to pilot any type of process which can be described in terms of targets and tasks.
-
-Visit the following resources to learn more:
-
-- [@article@Apache Ant](https://ant.apache.org/)
-- [@article@Apache Ant Tutorial](https://www.javatpoint.com/apache-ant-tutorial)
-- [@article@Apache Ant](https://en.wikipedia.org/wiki/Apache_Ant)
-- [@video@What is Apache Ant?](https://youtu.be/3rizinq7bng)
diff --git a/src/data/roadmaps/java/content/103-java-web-frameworks/100-spring.md b/src/data/roadmaps/java/content/103-java-web-frameworks/100-spring.md
deleted file mode 100644
index 11a04318b..000000000
--- a/src/data/roadmaps/java/content/103-java-web-frameworks/100-spring.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# Spring
-
-Spring is a powerful open-source Java platform (framework), that is used to create and maintain web applications. It starts as the Spring Framework providing a Dependency Injection Container.
-Spring Boot is an autoconfigurable packaging of multiple Spring projects (like Data, MVC, REST etc) initially created for creating microservices or quick PoC (Proof of concepts)
-
-Visit the following resources to learn more:
-
-- [@official@Official Site](https://spring.io/)
-- [@official@Quickstart guide](https://spring.io/quickstart)
-- [@official@Official guides](https://spring.io/guides)
-- [@article@Spring Framework Documentation](https://docs.spring.io/spring-framework/docs/current/reference/html/)
-- [@article@Spring Boot tutorials](https://www.baeldung.com/spring-boot)
-- [@article@What is Spring Framework? An Unorthodox Guide](https://www.marcobehler.com/guides/spring-framework)
-- [@feed@Explore top posts about Spring Framework](https://app.daily.dev/tags/spring?ref=roadmapsh)
diff --git a/src/data/roadmaps/java/content/103-java-web-frameworks/103-spark.md b/src/data/roadmaps/java/content/103-java-web-frameworks/103-spark.md
deleted file mode 100644
index 8dfab4804..000000000
--- a/src/data/roadmaps/java/content/103-java-web-frameworks/103-spark.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# Spark
-
-Spark is a micro framework for creating web applications in Kotlin and Java 8. Sinatra, a popular Ruby micro framework, was the inspiration for it.
-
-Visit the following resources to learn more:
-
-- [@article@Spark Java](https://sparkjava.com/)
-- [@article@Intro to Spark Java Framework](https://www.baeldung.com/spark-framework-rest-api)
-- [@article@What is Spark java?](https://www.javatpoint.com/spark-java)
-- [@feed@Explore top posts about Apache Spark](https://app.daily.dev/tags/spark?ref=roadmapsh)
diff --git a/src/data/roadmaps/java/content/104-java-orm/100-jpa.md b/src/data/roadmaps/java/content/104-java-orm/100-jpa.md
deleted file mode 100644
index e96dab9de..000000000
--- a/src/data/roadmaps/java/content/104-java-orm/100-jpa.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# JPA
-
-The Jakarta Persistence API provides Java developers with an object/relational mapping facility for managing relational data in Java applications. JPA is not a tool nor a framework, but a set of interfaces for accessing, persisting, and managing data between Java objects and (a) relational database. Because it is a set of interfaces, it will require an implementation to work with and persist Java objects. This will be ORM. Here are the main features of JPA:
-
-- Cleaner, easier, standardized ORM.
-- Supports inheritance, polymorphism, and polymorphic queries.
-- Supports metadata annotations/XML descriptors to define the mapping (between objects and relational database).
-- Supports a rich, SQL-like query language for static and dynamic queries.
-- Pluggable persistence providers like Hibernate, MyBatis, etc.
-- Caching: JPA supports 2 kinds of cache - first and second levels - to support performance tuning.
-
-> Note: In 2019, JPA was renamed from Java Persistence API to Jakarta Persistence.
-
-Visit the following resources to learn more:
-
-- [@article@TutorialsPoint JPA](https://www.tutorialspoint.com/jpa/jpa_architecture.htm)
-- [@article@Official Java doc - Package javax.persistence](https://docs.oracle.com/javaee/7/api/javax/persistence/package-summary.html)
-- [@article@Pro Jakarta Persistence in Jakarta EE 10](https://www.amazon.com/Pro-Jakarta-Persistence-Depth-Development/dp/1484274423)
-- [@article@Java Persistence with Spring Data and Hibernate by Catalin Tudose](https://www.simonandschuster.com/books/Java-Persistence-with-Spring-Data-and-Hibernate/Catalin-Tudose/9781617299186)
-- [@feed@Explore top posts about Java](https://app.daily.dev/tags/java?ref=roadmapsh)
diff --git a/src/data/roadmaps/java/content/106-java-jdbc/100-jdbi3.md b/src/data/roadmaps/java/content/106-java-jdbc/100-jdbi3.md
deleted file mode 100644
index 1225ea64d..000000000
--- a/src/data/roadmaps/java/content/106-java-jdbc/100-jdbi3.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# Jdbi3
-
-Jdbi is an open source Java library (Apache license) that uses lambda expressions and reflection to provide a friendlier, higher level interface than JDBC to access the database.
-
-Visit the following resources to learn more:
-
-- [@official@Jdbi](https://jdbi.org/)
-- [@article@Jdbi Tutorial](https://www.baeldung.com/jdbi)
diff --git a/src/data/roadmaps/java/content/106-java-jdbc/101-jdbc-template.md b/src/data/roadmaps/java/content/106-java-jdbc/101-jdbc-template.md
deleted file mode 100644
index 214175c4d..000000000
--- a/src/data/roadmaps/java/content/106-java-jdbc/101-jdbc-template.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# JDBC Template
-
-JDBCTemplate is a central class in Spring's JDBC core package that simplifies the use of JDBC and helps to avoid common errors. It internally uses JDBC API and eliminates many problems with JDBC API. It executes SQL queries or updates, initiating iteration over ResultSets, catching JDBC exceptions, and translating them to the generic. It executes core JDBC workflow, leaving application code to provide SQL and extract results. It handles the exception and provides informative exception messages with the help of exception classes defined in the `org.springframework.dao` package.
-
-Visit the following resources to learn more:
-
-- [@article@JDBC Template tutorial](https://www.baeldung.com/spring-jdbc-jdbctemplate)
-- [@feed@Explore top posts about Java](https://app.daily.dev/tags/java?ref=roadmapsh)
diff --git a/src/data/roadmaps/java/content/107-testing-java-apps/102-cukes.md b/src/data/roadmaps/java/content/107-testing-java-apps/102-cukes.md
deleted file mode 100644
index a4f8803bf..000000000
--- a/src/data/roadmaps/java/content/107-testing-java-apps/102-cukes.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# Cukes
-
-cukes-rest takes simplicity of Cucumber and provides bindings for HTTP specification. As a sugar on top, cukes-rest adds steps for storing and using request/response content from a file system, variable support in .features, context inflation in all steps and a custom plug-in system to allow users to add additional project specific content.
-
-Visit the following resources to learn more:
-
-- [@opensource@Cukes Github](https://github.com/ctco/cukes)
-- [@article@Getting Started with Cukes-REST](https://speakerdeck.com/larchaon/getting-started-with-cukes-rest?slide=23)
diff --git a/src/data/roadmaps/java/content/107-testing-java-apps/103-jbehave.md b/src/data/roadmaps/java/content/107-testing-java-apps/103-jbehave.md
deleted file mode 100644
index 338bdb408..000000000
--- a/src/data/roadmaps/java/content/107-testing-java-apps/103-jbehave.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# Jbehave
-
-JBehave is a framework for Behaviour-Driven Development (BDD). BDD is an evolution of test-driven development (TDD) and acceptance-test driven design, and is intended to make these practices more accessible and intuitive to newcomers and experts alike. It shifts the vocabulary from being test-based to behaviour-based, and positions itself as a design philosophy.
-
-Visit the following resources to learn more:
-
-- [@official@Jbehave](https://jbehave.org/)
-- [@official@Jbehave Tutorial](https://jbehave.org/tutorials.html)
diff --git a/src/data/roadmaps/java/content/abstraction@qdA6bK9ZkP8p0_NH_wMuj.md b/src/data/roadmaps/java/content/abstraction@qdA6bK9ZkP8p0_NH_wMuj.md
new file mode 100644
index 000000000..73f423810
--- /dev/null
+++ b/src/data/roadmaps/java/content/abstraction@qdA6bK9ZkP8p0_NH_wMuj.md
@@ -0,0 +1,8 @@
+# Abstraction
+
+The abstract keyword in Java is used to declare a class or a method that cannot be instantiated directly or must be implemented by subclasses, respectively. It is a key part of Java's abstraction mechanism, allowing developers to define abstract classes and methods that provide a blueprint for other classes.
+
+Visit the following resources to learn more:
+
+- [@article@Java Abstract Classes](https://jenkov.com/tutorials/java/abstract-classes.html)
+- [@article@Java Interfaces vs. Abstract Classes](https://jenkov.com/tutorials/java/interfaces-vs-abstract-classes.html)
diff --git a/src/data/roadmaps/java/content/access-specifiers@KYndNwfQcwRCf3zCXOwd_.md b/src/data/roadmaps/java/content/access-specifiers@KYndNwfQcwRCf3zCXOwd_.md
new file mode 100644
index 000000000..3aeb34a7c
--- /dev/null
+++ b/src/data/roadmaps/java/content/access-specifiers@KYndNwfQcwRCf3zCXOwd_.md
@@ -0,0 +1,7 @@
+# Access Specifiers
+
+Access specifiers (or access modifiers) in Java are keywords that control the visibility or accessibility of classes, methods, constructors, and other members. They determine from where these members can be accessed. Java provides four access specifiers: `private`, `default` (no keyword), `protected`, and `public`, each offering a different level of access control.
+
+Visit the following resources to learn more:
+
+- [@article@Java Access Modifiers](https://jenkov.com/tutorials/java/access-modifiers.html)
diff --git a/src/data/roadmaps/java/content/annotations@c--y6GcKj9am0CBdu_Hnt.md b/src/data/roadmaps/java/content/annotations@c--y6GcKj9am0CBdu_Hnt.md
new file mode 100644
index 000000000..b81cb1193
--- /dev/null
+++ b/src/data/roadmaps/java/content/annotations@c--y6GcKj9am0CBdu_Hnt.md
@@ -0,0 +1,7 @@
+# Annotations
+
+Annotations are a form of metadata that provide data about a program. They are used to provide supplemental information about the code, but they are not a part of the program itself. Annotations can be used by the compiler to detect errors or suppress warnings, and they can also be used at runtime to modify the behavior of the program.
+
+Visit the following resources to learn more:
+
+- [@article@Java Annotations Tutorial](https://jenkov.com/tutorials/java/annotations.html)
\ No newline at end of file
diff --git a/src/data/roadmaps/java/content/array-vs-arraylist@a-EQiBUlSgdZba1mW36op.md b/src/data/roadmaps/java/content/array-vs-arraylist@a-EQiBUlSgdZba1mW36op.md
new file mode 100644
index 000000000..d71933617
--- /dev/null
+++ b/src/data/roadmaps/java/content/array-vs-arraylist@a-EQiBUlSgdZba1mW36op.md
@@ -0,0 +1,8 @@
+# Array vs ArrayList
+
+Arrays and ArrayLists are both ways to store collections of elements in Java. An array is a fixed-size, ordered sequence of elements of the same data type. Once you declare its size, you cannot change it. An ArrayList, on the other hand, is a dynamic, resizable array implementation. It can grow or shrink as needed, allowing you to add or remove elements without worrying about the initial size.
+
+Visit the following resources to learn more:
+
+- [@article@Java Arrays](https://jenkov.com/tutorials/java/arrays.html)
+- [@article@Java ArrayLists](https://jenkov.com/tutorials/java-collections/list.html)
diff --git a/src/data/roadmaps/java/content/arrays@5khApwg1FZ-0qorsLyH-F.md b/src/data/roadmaps/java/content/arrays@5khApwg1FZ-0qorsLyH-F.md
new file mode 100644
index 000000000..fef9dc3d4
--- /dev/null
+++ b/src/data/roadmaps/java/content/arrays@5khApwg1FZ-0qorsLyH-F.md
@@ -0,0 +1,8 @@
+# Arrays
+
+Arrays are fundamental data structures used to store a collection of elements of the same data type in contiguous memory locations. They provide a way to organize and access multiple values using a single variable name and an index. Each element in an array can be accessed directly using its index, starting from 0.
+
+Visit the following resources to learn more:
+
+- [@article@Java Arrays](https://jenkov.com/tutorials/java/arrays.html)
+- [@video@Java Arrays Tutorial](https://www.youtube.com/watch?v=ei_4Nt7XWOw)
\ No newline at end of file
diff --git a/src/data/roadmaps/java/content/attributes-and-methods@xTwJYcA6ldgaw3yGmbDEd.md b/src/data/roadmaps/java/content/attributes-and-methods@xTwJYcA6ldgaw3yGmbDEd.md
new file mode 100644
index 000000000..073725453
--- /dev/null
+++ b/src/data/roadmaps/java/content/attributes-and-methods@xTwJYcA6ldgaw3yGmbDEd.md
@@ -0,0 +1,9 @@
+# Attributes and Methods
+
+Attributes are variables that hold data about an object, defining its state or characteristics. Methods are functions that define the behavior of an object, allowing it to perform actions or operations. Together, attributes and methods encapsulate the data and behavior of an object within a class.
+
+Visit the following resources to learn more:
+
+- [@article@Java Classes](https://jenkov.com/tutorials/java/classes.html)
+- [@article@Java Methods](https://jenkov.com/tutorials/java/methods.html)
+- [@article@Java Properties](https://jenkov.com/tutorials/java-collections/properties.html)
diff --git a/src/data/roadmaps/java/content/100-java-fundamentals/100-basic-syntax.md b/src/data/roadmaps/java/content/basic-syntax@OlbQNB6YXZjO1J7D0lZU1.md
similarity index 100%
rename from src/data/roadmaps/java/content/100-java-fundamentals/100-basic-syntax.md
rename to src/data/roadmaps/java/content/basic-syntax@OlbQNB6YXZjO1J7D0lZU1.md
diff --git a/src/data/roadmaps/java/content/basics-of-oop@DZ4BX4NYeCQbjGSj56lng.md b/src/data/roadmaps/java/content/basics-of-oop@DZ4BX4NYeCQbjGSj56lng.md
new file mode 100644
index 000000000..c9b3dfe01
--- /dev/null
+++ b/src/data/roadmaps/java/content/basics-of-oop@DZ4BX4NYeCQbjGSj56lng.md
@@ -0,0 +1,7 @@
+# Basics of OOP
+
+Object-Oriented Programming (OOP) is a programming paradigm centered around "objects," which contain data in the form of fields (attributes) and code in the form of procedures (methods). OOP focuses on creating reusable code by grouping related data and behavior into objects, allowing for modularity, abstraction, inheritance, and polymorphism. These concepts help in organizing and structuring code in a way that mirrors real-world entities and their interactions.
+
+Visit the following resources to learn more:
+
+- [@article@Java Classes and Objects](https://jenkov.com/tutorials/java/classes.html)
diff --git a/src/data/roadmaps/java/content/bazel@6FMj9tMAQPii_1kLtHJLk.md b/src/data/roadmaps/java/content/bazel@6FMj9tMAQPii_1kLtHJLk.md
new file mode 100644
index 000000000..41507e43e
--- /dev/null
+++ b/src/data/roadmaps/java/content/bazel@6FMj9tMAQPii_1kLtHJLk.md
@@ -0,0 +1,9 @@
+# Bazel
+
+Bazel is an open-source build and test tool similar to Make, Maven, and Gradle. It uses a human-readable, high-level build language. Bazel supports projects in multiple languages and builds outputs for multiple platforms. It's designed for fast, reliable, and reproducible builds, making it suitable for large codebases and complex projects.
+
+Visit the following resources to learn more:
+
+- [@article@Getting started with Bazel](https://bazel.build/start)
+- [@article@Build Java Projects with Bazel](https://earthly.dev/blog/build-java-projects-with-bazel/)
+- [@article@Introduction to the Bazel Build Tool](https://www.baeldung.com/bazel-build-tool)
diff --git a/src/data/roadmaps/java/content/102-java-build-tools/index.md b/src/data/roadmaps/java/content/build-tools@81N1cZLue_Ii0uD5CV6kZ.md
similarity index 100%
rename from src/data/roadmaps/java/content/102-java-build-tools/index.md
rename to src/data/roadmaps/java/content/build-tools@81N1cZLue_Ii0uD5CV6kZ.md
diff --git a/src/data/roadmaps/java/content/classes-and-objects@LenPrQwxFsE1UVbXO_dE7.md b/src/data/roadmaps/java/content/classes-and-objects@LenPrQwxFsE1UVbXO_dE7.md
new file mode 100644
index 000000000..a42868dc8
--- /dev/null
+++ b/src/data/roadmaps/java/content/classes-and-objects@LenPrQwxFsE1UVbXO_dE7.md
@@ -0,0 +1,8 @@
+# Classes and Objects
+
+Classes are blueprints for creating objects, which are instances of those classes. A class defines the characteristics (attributes) and behaviors (methods) that objects of that class will possess. Think of a class as a template and an object as a specific instance created from that template.
+
+Visit the following resources to learn more:
+
+- [@article@Java Class and Objects](https://www.programiz.com/java-programming/class-objects)
+- [@article@Java Classes and Objects](https://www.youtube.com/watch?v=IUqKuGNasdM)
\ No newline at end of file
diff --git a/src/data/roadmaps/java/content/concurrency@shqS9-hg__mkOtnnl_I4l.md b/src/data/roadmaps/java/content/concurrency@shqS9-hg__mkOtnnl_I4l.md
new file mode 100644
index 000000000..0710af816
--- /dev/null
+++ b/src/data/roadmaps/java/content/concurrency@shqS9-hg__mkOtnnl_I4l.md
@@ -0,0 +1,8 @@
+# Concurrency
+
+Concurrency is the ability of a program to execute multiple tasks seemingly simultaneously. This doesn't necessarily mean they are running at the exact same instant, but rather that their execution overlaps in time. This can be achieved through techniques like multithreading, where a single program is divided into multiple threads that can run concurrently, or through asynchronous programming, where tasks can be started and then the program can continue executing other tasks without waiting for the first task to complete.
+
+Visit the following resources to learn more:
+
+- [@article@Java Concurrency and Multithreading Tutorial](https://jenkov.com/tutorials/java-concurrency/index.html)
+- [@article@Java Concurrency in Practice](https://www.baeldung.com/java-concurrency)
\ No newline at end of file
diff --git a/src/data/roadmaps/java/content/100-java-fundamentals/102-conditionals.md b/src/data/roadmaps/java/content/conditionals@sG_3ZQIE1-FQXQkk-OduQ.md
similarity index 100%
rename from src/data/roadmaps/java/content/100-java-fundamentals/102-conditionals.md
rename to src/data/roadmaps/java/content/conditionals@sG_3ZQIE1-FQXQkk-OduQ.md
diff --git a/src/data/roadmaps/java/content/cryptography@_wV2VQq6MIY1rVHjK8pfu.md b/src/data/roadmaps/java/content/cryptography@_wV2VQq6MIY1rVHjK8pfu.md
new file mode 100644
index 000000000..9b6f346be
--- /dev/null
+++ b/src/data/roadmaps/java/content/cryptography@_wV2VQq6MIY1rVHjK8pfu.md
@@ -0,0 +1,8 @@
+# Cryptography
+
+Cryptography is the practice and study of techniques for secure communication in the presence of adversaries. It involves converting readable data (plaintext) into an unreadable format (ciphertext) through encryption, and then converting the ciphertext back into plaintext through decryption. Cryptography uses algorithms and keys to ensure confidentiality, integrity, authentication, and non-repudiation of information.
+
+Visit the following resources to learn more:
+
+- [@article@Java Cryptography Tutorial](https://jenkov.com/tutorials/java-cryptography/index.html)
+
diff --git a/src/data/roadmaps/java/content/107-testing-java-apps/101-cucumber-jvm.md b/src/data/roadmaps/java/content/cucubmber-jvm@UFDy19TNkykRsKv4vRsVJ.md
similarity index 100%
rename from src/data/roadmaps/java/content/107-testing-java-apps/101-cucumber-jvm.md
rename to src/data/roadmaps/java/content/cucubmber-jvm@UFDy19TNkykRsKv4vRsVJ.md
diff --git a/src/data/roadmaps/java/content/100-java-fundamentals/101-data-types-variables.md b/src/data/roadmaps/java/content/data-types@5g9mmi01WeZ4aDqNzwx_V.md
similarity index 64%
rename from src/data/roadmaps/java/content/100-java-fundamentals/101-data-types-variables.md
rename to src/data/roadmaps/java/content/data-types@5g9mmi01WeZ4aDqNzwx_V.md
index 14ec648d3..6e9d62fe9 100644
--- a/src/data/roadmaps/java/content/100-java-fundamentals/101-data-types-variables.md
+++ b/src/data/roadmaps/java/content/data-types@5g9mmi01WeZ4aDqNzwx_V.md
@@ -9,8 +9,6 @@ Data Types are divided into two group -
 
 Visit the following resources to learn more:
 
-- [@article@What are Data Types & Variables?](https://www.guru99.com/java-variables.html)
+- [@article@Java Data Types](https://jenkov.com/tutorials/java/variables.html)
+- [@article@What are Data Types & Variables?](https://jenkov.com/tutorials/java/data-types.html)
 - [@article@Java Variables](https://www.javatpoint.com/java-variables)
-- [@article@Learn more about Data types and Variables](https://www.javatpoint.com/java-data-types)
-- [@article@Java enums](https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html)
-- [@article@Java Records](https://www.baeldung.com/java-record-keyword)
diff --git a/src/data/roadmaps/java/content/104-java-orm/index.md b/src/data/roadmaps/java/content/database-access@fV-gW51jhna2__Ln2HIIh.md
similarity index 100%
rename from src/data/roadmaps/java/content/104-java-orm/index.md
rename to src/data/roadmaps/java/content/database-access@fV-gW51jhna2__Ln2HIIh.md
diff --git a/src/data/roadmaps/java/content/100-java-fundamentals/107-date-time.md b/src/data/roadmaps/java/content/date-and-time@9h20XVRli7TDq0QIJwX2U.md
similarity index 100%
rename from src/data/roadmaps/java/content/100-java-fundamentals/107-date-time.md
rename to src/data/roadmaps/java/content/date-and-time@9h20XVRli7TDq0QIJwX2U.md
diff --git a/src/data/roadmaps/java/content/dependency-injection@zItXmuluDtl6HkTYQ7qMh.md b/src/data/roadmaps/java/content/dependency-injection@zItXmuluDtl6HkTYQ7qMh.md
new file mode 100644
index 000000000..2519dc026
--- /dev/null
+++ b/src/data/roadmaps/java/content/dependency-injection@zItXmuluDtl6HkTYQ7qMh.md
@@ -0,0 +1,9 @@
+# Dependency Injection
+
+Dependency Injection (DI) is a design pattern where objects receive their dependencies from external sources rather than creating them themselves. This means a class doesn't have to worry about how to obtain the objects it needs to function; instead, those objects are "injected" into the class, usually through its constructor, setter methods, or interface. This promotes loose coupling and makes code more testable and maintainable.
+
+Visit the following resources to learn more:
+
+- [@article@Dependency Injection Tutorial](https://jenkov.com/tutorials/dependency-injection/index.html)
+- [@article@Java Dependency Injection Design Pattern Example Tutorial](https://www.digitalocean.com/community/tutorials/java-dependency-injection-design-pattern-example-tutorial)
+
diff --git a/src/data/roadmaps/java/content/dequeue@DWO2-EPIUeKK5aQGiTuKc.md b/src/data/roadmaps/java/content/dequeue@DWO2-EPIUeKK5aQGiTuKc.md
new file mode 100644
index 000000000..3dfb3b99f
--- /dev/null
+++ b/src/data/roadmaps/java/content/dequeue@DWO2-EPIUeKK5aQGiTuKc.md
@@ -0,0 +1,8 @@
+# Dequeue
+
+A Dequeue (pronounced "dee-queue") is a double-ended queue, a data structure that allows you to add and remove elements from both the front (head) and the back (tail) of the queue. Unlike a regular queue (FIFO - First-In, First-Out), a dequeue provides flexibility for both FIFO and LIFO (Last-In, First-Out) operations. This makes it useful for implementing various algorithms and data management tasks where elements need to be accessed or modified from either end.
+
+Visit the following resources to learn more:
+
+- [@article@Java Deque Tutorial](https://jenkov.com/tutorials/java-collections/deque.html)
+- [@article@Java Deque](https://www.programiz.com/java-programming/deque)
diff --git a/src/data/roadmaps/java/content/104-java-orm/103-ebean.md b/src/data/roadmaps/java/content/ebean@X2rJ3BY1ytFKsbJqJETFu.md
similarity index 100%
rename from src/data/roadmaps/java/content/104-java-orm/103-ebean.md
rename to src/data/roadmaps/java/content/ebean@X2rJ3BY1ytFKsbJqJETFu.md
diff --git a/src/data/roadmaps/java/content/encapsulation@iH9wSsOK4a77pS7U0Yu5z.md b/src/data/roadmaps/java/content/encapsulation@iH9wSsOK4a77pS7U0Yu5z.md
new file mode 100644
index 000000000..ae38fae52
--- /dev/null
+++ b/src/data/roadmaps/java/content/encapsulation@iH9wSsOK4a77pS7U0Yu5z.md
@@ -0,0 +1,8 @@
+# Encapsulation
+
+Encapsulation is a fundamental concept in object-oriented programming where data and the methods that operate on that data are bundled together as a single unit. This unit, often a class, hides the internal state of the object from the outside world and only exposes a controlled interface for interacting with it. This protects the data from accidental modification and allows for easier maintenance and modification of the code.
+
+Visit the following resources to learn more:
+
+- [@article@Java - Encapsulation](https://www.tutorialspoint.com/java/java_encapsulation.htm)
+
diff --git a/src/data/roadmaps/java/content/enums@ey1f8IsdAlDv1O3E_tNog.md b/src/data/roadmaps/java/content/enums@ey1f8IsdAlDv1O3E_tNog.md
new file mode 100644
index 000000000..58ce63d65
--- /dev/null
+++ b/src/data/roadmaps/java/content/enums@ey1f8IsdAlDv1O3E_tNog.md
@@ -0,0 +1,8 @@
+# Enums
+
+Enums, short for enumerations, are a special data type in Java that represent a group of named constants. They allow you to define a type that can only take on a specific set of predefined values. This makes your code more readable and less prone to errors by restricting the possible values a variable can hold.
+
+Visit the following resources to learn more:
+
+- [@article@Java Enums](https://jenkov.com/tutorials/java/enums.html)
+- [@article@Java Enums](https://www.programiz.com/java-programming/enums)
diff --git a/src/data/roadmaps/java/content/100-java-fundamentals/108-exception-handling.md b/src/data/roadmaps/java/content/exception-handling@g9P3548F38tYGjevBc42w.md
similarity index 75%
rename from src/data/roadmaps/java/content/100-java-fundamentals/108-exception-handling.md
rename to src/data/roadmaps/java/content/exception-handling@g9P3548F38tYGjevBc42w.md
index e95e769ae..6e23baf64 100644
--- a/src/data/roadmaps/java/content/100-java-fundamentals/108-exception-handling.md
+++ b/src/data/roadmaps/java/content/exception-handling@g9P3548F38tYGjevBc42w.md
@@ -11,5 +11,4 @@ There are three types of exceptions -
 Visit the following resources to learn more:
 
 - [@video@Understanding Java Exceptions](https://www.youtube.com/watch?v=W-N2ltgU-X4)
-- [@article@Mastering Java Exception Handling: A Comprehensive Guide](https://naveen-metta.medium.com/mastering-java-exception-handling-a-comprehensive-guide-a897b8020582)
-- [@article@Exception Handling in Java](https://www.javatpoint.com/exception-handling-in-java)
+- [@article@Exception Handling in Java](https://www.tpointtech.com/exception-handling-in-java)
diff --git a/src/data/roadmaps/java/content/100-java-fundamentals/106-files-and-apis.md b/src/data/roadmaps/java/content/file-operations@NowpzyPVFcX082j5YS5i8.md
similarity index 100%
rename from src/data/roadmaps/java/content/100-java-fundamentals/106-files-and-apis.md
rename to src/data/roadmaps/java/content/file-operations@NowpzyPVFcX082j5YS5i8.md
diff --git a/src/data/roadmaps/java/content/final-keyword@Ajuc_rHObqMQBXLqRIuxh.md b/src/data/roadmaps/java/content/final-keyword@Ajuc_rHObqMQBXLqRIuxh.md
new file mode 100644
index 000000000..f64f5859e
--- /dev/null
+++ b/src/data/roadmaps/java/content/final-keyword@Ajuc_rHObqMQBXLqRIuxh.md
@@ -0,0 +1,9 @@
+# Final Keyword
+
+The `final` keyword in Java is a non-access modifier used to apply restrictions on a variable, method, or class. When applied to a variable, it makes the variable's value constant after initialization. When applied to a method, it prevents the method from being overridden in a subclass. When applied to a class, it prevents the class from being subclassed (inherited).
+
+Visit the following resources to learn more:
+
+- [@article@Java Final Keyword](https://www.baeldung.com/java-final)
+- [@article@How does the final keyword in Java work? I can still modify an object](https://stackoverflow.com/questions/15655012/how-does-the-final-keyword-in-java-work-i-can-still-modify-an-object)
+
diff --git a/src/data/roadmaps/java/content/functional-composition@1Mk_zXxCCcUoX-gFxtlnf.md b/src/data/roadmaps/java/content/functional-composition@1Mk_zXxCCcUoX-gFxtlnf.md
new file mode 100644
index 000000000..ec85f248e
--- /dev/null
+++ b/src/data/roadmaps/java/content/functional-composition@1Mk_zXxCCcUoX-gFxtlnf.md
@@ -0,0 +1,8 @@
+# Functional Composition
+
+Functional composition is the process of combining two or more functions to produce a new function. The resulting function applies each function in order, passing the output of one function as the input to the next. This allows you to build complex operations by chaining together simpler, reusable functions.
+
+Visit the following resources to learn more:
+
+- [@article@Functional Composition in Java](https://jenkov.com/tutorials/java-functional-programming/functional-composition.html)
+- [@article@Java Functional Programming](https://www.baeldung.com/java-functional-programming)
\ No newline at end of file
diff --git a/src/data/roadmaps/java/content/functional-interfaces@SityDdjhhNZ9CO3Tg0VI9.md b/src/data/roadmaps/java/content/functional-interfaces@SityDdjhhNZ9CO3Tg0VI9.md
new file mode 100644
index 000000000..585d0a0ab
--- /dev/null
+++ b/src/data/roadmaps/java/content/functional-interfaces@SityDdjhhNZ9CO3Tg0VI9.md
@@ -0,0 +1,9 @@
+# Functional Interfaces
+
+Functional interfaces are interfaces that contain only one abstract method. They can have multiple default or static methods, but only one method that needs to be implemented. These interfaces can be used with lambda expressions and method references, allowing for concise and readable code when dealing with single-method operations.
+
+Visit the following resources to learn more:
+
+- [@article@Java Functional Interfaces](https://jenkov.com/tutorials/java-functional-programming/functional-interfaces.html)
+- [@article@Java Functional Interfaces](https://www.baeldung.com/java-8-functional-interfaces)
+
diff --git a/src/data/roadmaps/java/content/101-java-advanced-topics/100-generics.md b/src/data/roadmaps/java/content/generic-collections@eL4pc6SaNiKP48PzN7mNe.md
similarity index 100%
rename from src/data/roadmaps/java/content/101-java-advanced-topics/100-generics.md
rename to src/data/roadmaps/java/content/generic-collections@eL4pc6SaNiKP48PzN7mNe.md
diff --git a/src/data/roadmaps/java/content/102-java-build-tools/100-gradle.md b/src/data/roadmaps/java/content/gradle@rmDIm5dqtdlNfPhvpqS7-.md
similarity index 100%
rename from src/data/roadmaps/java/content/102-java-build-tools/100-gradle.md
rename to src/data/roadmaps/java/content/gradle@rmDIm5dqtdlNfPhvpqS7-.md
diff --git a/src/data/roadmaps/java/content/104-java-orm/102-hibernate.md b/src/data/roadmaps/java/content/hibernate@UEiDzzodyEu5O1xFAFDly.md
similarity index 100%
rename from src/data/roadmaps/java/content/104-java-orm/102-hibernate.md
rename to src/data/roadmaps/java/content/hibernate@UEiDzzodyEu5O1xFAFDly.md
diff --git a/src/data/roadmaps/java/content/high-order-functions@dz6bCmB4dgA7VVZ448cN6.md b/src/data/roadmaps/java/content/high-order-functions@dz6bCmB4dgA7VVZ448cN6.md
new file mode 100644
index 000000000..7459670ac
--- /dev/null
+++ b/src/data/roadmaps/java/content/high-order-functions@dz6bCmB4dgA7VVZ448cN6.md
@@ -0,0 +1,7 @@
+# High Order Functions
+
+High Order Functions are functions that can either accept other functions as arguments or return functions as their results. This capability allows for more flexible and reusable code by enabling you to abstract over operations. Essentially, you can pass behavior as data, making your code more dynamic and adaptable to different situations.
+
+Visit the following resources to learn more:
+
+- [@article@Java High Order Functions](https://jenkov.com/tutorials/java-functional-programming/higher-order-functions.html)
\ No newline at end of file
diff --git a/src/data/roadmaps/java/content/inheritance@PXpPEmCEBUKRjwP3B5LzJ.md b/src/data/roadmaps/java/content/inheritance@PXpPEmCEBUKRjwP3B5LzJ.md
new file mode 100644
index 000000000..432bbd249
--- /dev/null
+++ b/src/data/roadmaps/java/content/inheritance@PXpPEmCEBUKRjwP3B5LzJ.md
@@ -0,0 +1,8 @@
+# Inheritance
+
+Inheritance is a fundamental concept in object-oriented programming where a new class (called a subclass or derived class) acquires properties and behaviors from an existing class (called a superclass or base class). This allows for code reuse and the creation of hierarchical relationships between classes, promoting a more organized and maintainable codebase. The subclass can extend the superclass by adding new attributes and methods or overriding existing ones.
+
+Visit the following resources to learn more:
+
+- [@article@Java Inheritance](https://jenkov.com/tutorials/java/inheritance.html)
+- [@article@Inheritance in Java with Example](https://www.digitalocean.com/community/tutorials/inheritance-java-example)
diff --git a/src/data/roadmaps/java/content/initializer-block@dg_UpaO8TzIN7w_QZ1n-6.md b/src/data/roadmaps/java/content/initializer-block@dg_UpaO8TzIN7w_QZ1n-6.md
new file mode 100644
index 000000000..a67445a46
--- /dev/null
+++ b/src/data/roadmaps/java/content/initializer-block@dg_UpaO8TzIN7w_QZ1n-6.md
@@ -0,0 +1,9 @@
+# Initializer Block
+
+An initializer block in Java is a block of code, enclosed in curly braces `{}` , that is executed when an instance of a class is created. It's used to initialize instance variables or perform setup tasks before the constructor is called. There are two types: instance initializer blocks, which run every time a new object is created, and static initializer blocks, which run only once when the class is first loaded.
+
+Visit the following resources to learn more:
+
+- [@article@Static and Instance Initializer Blocks in Java](https://www.baeldung.com/java-static-instance-initializer-blocks)
+- [@article@All About Java Instance Initializer Blocks](https://blogs.oracle.com/javamagazine/post/java-instance-initializer-block)
+- [@article@What is an initialization block?](https://stackoverflow.com/questions/3987428/what-is-an-initialization-block)
diff --git a/src/data/roadmaps/java/content/interfaces@6wTRN2PYC6zM_Txkekx53.md b/src/data/roadmaps/java/content/interfaces@6wTRN2PYC6zM_Txkekx53.md
new file mode 100644
index 000000000..ee89b3172
--- /dev/null
+++ b/src/data/roadmaps/java/content/interfaces@6wTRN2PYC6zM_Txkekx53.md
@@ -0,0 +1,8 @@
+# Interfaces
+
+An interface in Java is a blueprint of a class. It specifies a set of methods that a class must implement if it claims to implement the interface. Think of it as a contract: any class that "signs" the contract (implements the interface) agrees to provide specific behaviors (methods). Interfaces can also contain constants (static final variables). They help achieve abstraction and multiple inheritance in Java.
+
+Visit the following resources to learn more:
+
+- [@article@Interfaces in Java](https://jenkov.com/tutorials/java/interfaces.html)
+- [@article@A Guide to Java Interfaces](https://www.baeldung.com/java-interfaces)
diff --git a/src/data/roadmaps/java/content/io-operations@M0ybgK1JCycXhZ1dEpCFo.md b/src/data/roadmaps/java/content/io-operations@M0ybgK1JCycXhZ1dEpCFo.md
new file mode 100644
index 000000000..050fe3ef4
--- /dev/null
+++ b/src/data/roadmaps/java/content/io-operations@M0ybgK1JCycXhZ1dEpCFo.md
@@ -0,0 +1,7 @@
+# I/O Operations
+
+I/O Operations, short for Input/Output Operations, deal with how a program interacts with the outside world. This involves reading data from sources like files, network connections, or the keyboard, and writing data to destinations such as files, the console, or network sockets. Essentially, it's the mechanism by which a program receives information and sends results.
+
+Visit the following resources to learn more:
+
+- [@article@Java IO Tutorial](https://jenkov.com/tutorials/java-io/index.html)
diff --git a/src/data/roadmaps/java/content/iterator@-17LFO72I8RKjJRMXct9k.md b/src/data/roadmaps/java/content/iterator@-17LFO72I8RKjJRMXct9k.md
new file mode 100644
index 000000000..5e53950f4
--- /dev/null
+++ b/src/data/roadmaps/java/content/iterator@-17LFO72I8RKjJRMXct9k.md
@@ -0,0 +1,8 @@
+# Iterator
+
+An Iterator is an object that enables you to traverse through a collection (like a List or Set) one element at a time. It provides a standard way to access elements sequentially without needing to know the underlying structure of the collection. You can use methods like `hasNext()` to check if there's a next element and `next()` to retrieve it.
+
+Visit the following resources to learn more:
+
+- [@article@Java Iterator Tutorial](https://jenkov.com/tutorials/java-collections/iterator.html)
+- [@article@Java Iterable Tutorial](https://jenkov.com/tutorials/java-collections/iterable.html)
diff --git a/src/data/roadmaps/java/content/java-memory-model@wEc7pSVU5G2c6Zqmtb_1k.md b/src/data/roadmaps/java/content/java-memory-model@wEc7pSVU5G2c6Zqmtb_1k.md
new file mode 100644
index 000000000..ce8b9a460
--- /dev/null
+++ b/src/data/roadmaps/java/content/java-memory-model@wEc7pSVU5G2c6Zqmtb_1k.md
@@ -0,0 +1,7 @@
+# Java Memory Model
+
+The Java Memory Model (JMM) defines how threads in Java interact with memory. It specifies how and when different threads can see writes to shared variables, addressing issues like data visibility and race conditions in concurrent programs. The JMM ensures that multithreaded Java programs behave predictably across different hardware architectures by establishing rules for memory synchronization and ordering.
+
+Visit the following resources to learn more:
+
+- [@article@Java Memory Model](https://jenkov.com/tutorials/java-concurrency/java-memory-model.html)
diff --git a/src/data/roadmaps/java/content/javalin@OrkJa48HIDmrLOgCBpimA.md b/src/data/roadmaps/java/content/javalin@OrkJa48HIDmrLOgCBpimA.md
new file mode 100644
index 000000000..130130868
--- /dev/null
+++ b/src/data/roadmaps/java/content/javalin@OrkJa48HIDmrLOgCBpimA.md
@@ -0,0 +1,9 @@
+# Javalin
+
+Javalin is a lightweight web framework for Java and Kotlin that's designed to be simple, intuitive, and fun to use. It allows developers to quickly build web applications and APIs with minimal boilerplate code. Javalin focuses on providing a straightforward approach to routing, request handling, and response generation, making it a good choice for projects where speed of development and ease of understanding are important.
+
+Visit the following resources to learn more:
+
+- [@official@Javalin Website](https://javalin.io/)
+- [@article@Creating a REST API with Javalin](https://www.baeldung.com/javalin-rest-microservices)
+
diff --git a/src/data/roadmaps/java/content/106-java-jdbc/index.md b/src/data/roadmaps/java/content/jdbc@9UbRG752qxJdUwmqEAjN3.md
similarity index 100%
rename from src/data/roadmaps/java/content/106-java-jdbc/index.md
rename to src/data/roadmaps/java/content/jdbc@9UbRG752qxJdUwmqEAjN3.md
diff --git a/src/data/roadmaps/java/content/107-testing-java-apps/107-jmeter.md b/src/data/roadmaps/java/content/jmeter@U2BqOY49HaII6mKQB3SVt.md
similarity index 100%
rename from src/data/roadmaps/java/content/107-testing-java-apps/107-jmeter.md
rename to src/data/roadmaps/java/content/jmeter@U2BqOY49HaII6mKQB3SVt.md
diff --git a/src/data/roadmaps/java/content/107-testing-java-apps/104-junit.md b/src/data/roadmaps/java/content/junit@hY1-sEpTmpaj1PregdkFf.md
similarity index 100%
rename from src/data/roadmaps/java/content/107-testing-java-apps/104-junit.md
rename to src/data/roadmaps/java/content/junit@hY1-sEpTmpaj1PregdkFf.md
diff --git a/src/data/roadmaps/java/content/lambda-expressions@00_q6I95eO-PUUrKpPFY8.md b/src/data/roadmaps/java/content/lambda-expressions@00_q6I95eO-PUUrKpPFY8.md
new file mode 100644
index 000000000..795c57118
--- /dev/null
+++ b/src/data/roadmaps/java/content/lambda-expressions@00_q6I95eO-PUUrKpPFY8.md
@@ -0,0 +1,7 @@
+# Lambda Expressions
+
+Lambda expressions are essentially short blocks of code that you can pass around to be executed. They allow you to treat functionality as a method argument, or code as data. Think of them as anonymous methods – methods without a name – that can be written directly in the place where they are needed, making your code more concise and readable, especially when dealing with functional interfaces.
+
+Visit the following resources to learn more:
+
+- [@article@Java Lambda Expressions](https://jenkov.com/tutorials/java/lambda-expressions.html)
diff --git a/src/data/roadmaps/java/content/100-java-fundamentals/index.md b/src/data/roadmaps/java/content/learn-the-basics@2TGq1y2QthnxxN-FfToSe.md
similarity index 100%
rename from src/data/roadmaps/java/content/100-java-fundamentals/index.md
rename to src/data/roadmaps/java/content/learn-the-basics@2TGq1y2QthnxxN-FfToSe.md
diff --git a/src/data/roadmaps/java/content/lifecycle-of-a-program@QgWalJLIb6Fw0HhN1wb02.md b/src/data/roadmaps/java/content/lifecycle-of-a-program@QgWalJLIb6Fw0HhN1wb02.md
new file mode 100644
index 000000000..bd10822e7
--- /dev/null
+++ b/src/data/roadmaps/java/content/lifecycle-of-a-program@QgWalJLIb6Fw0HhN1wb02.md
@@ -0,0 +1,8 @@
+# Lifecycle of a Program
+
+In Java, the program lifecycle consists of several distinct phases that work together to execute code. The process begins with developers writing Java source code in `.java` files using an IDE or text editor. This code is then compiled by the Java compiler (javac) into bytecode stored in `.class` files, with syntax and type checking performed during compilation. When the program runs, the Java Virtual Machine (JVM) loads these compiled class files into memory through a process involving loading of binary data, linking for verification and preparation, and initialization of class elements. The JVM then verifies the bytecode's security compliance, performs Just-In-Time (JIT) compilation to translate bytecode into native machine code for better performance, and executes the program instructions while managing system resources. Throughout execution, the JVM handles garbage collection by reclaiming memory from unused objects, and finally releases all resources upon program termination. This architecture enables Java's "write once, run anywhere" capability since the bytecode can execute on any device with a compatible JVM.
+
+Visit the following resources to learn more:
+
+- [@article@Life Cycle of a Java Program](https://www.startertutorials.com/corejava/life-cycle-java-program.html)
+- [@article@How the JVM Executes Java Code](https://www.cesarsotovalero.net/blog/how-the-jvm-executes-java-code.html)
diff --git a/src/data/roadmaps/java/content/105-java-logging-frameworks/100-log4j2.md b/src/data/roadmaps/java/content/log4j2@sFaNj_1MviaTc6UIfjXl6.md
similarity index 100%
rename from src/data/roadmaps/java/content/105-java-logging-frameworks/100-log4j2.md
rename to src/data/roadmaps/java/content/log4j2@sFaNj_1MviaTc6UIfjXl6.md
diff --git a/src/data/roadmaps/java/content/105-java-logging-frameworks/101-logback.md b/src/data/roadmaps/java/content/logback@okC1uMdyfIJAhX_R9Npsw.md
similarity index 100%
rename from src/data/roadmaps/java/content/105-java-logging-frameworks/101-logback.md
rename to src/data/roadmaps/java/content/logback@okC1uMdyfIJAhX_R9Npsw.md
diff --git a/src/data/roadmaps/java/content/105-java-logging-frameworks/index.md b/src/data/roadmaps/java/content/logging-frameworks@d9F5Wt8onY125DLuzNULg.md
similarity index 100%
rename from src/data/roadmaps/java/content/105-java-logging-frameworks/index.md
rename to src/data/roadmaps/java/content/logging-frameworks@d9F5Wt8onY125DLuzNULg.md
diff --git a/src/data/roadmaps/java/content/100-java-fundamentals/107-loops.md b/src/data/roadmaps/java/content/loops@JHUhVEjWFXTn6-wKcKevg.md
similarity index 100%
rename from src/data/roadmaps/java/content/100-java-fundamentals/107-loops.md
rename to src/data/roadmaps/java/content/loops@JHUhVEjWFXTn6-wKcKevg.md
diff --git a/src/data/roadmaps/java/content/map@eKtdDtiJygKQ4PuEylFQY.md b/src/data/roadmaps/java/content/map@eKtdDtiJygKQ4PuEylFQY.md
new file mode 100644
index 000000000..201854741
--- /dev/null
+++ b/src/data/roadmaps/java/content/map@eKtdDtiJygKQ4PuEylFQY.md
@@ -0,0 +1,10 @@
+# Map
+
+A Map is a data structure that stores data in key-value pairs. Each key is unique, and it maps to a specific value. Think of it like a dictionary where you use a word (the key) to look up its definition (the value). Maps allow you to efficiently retrieve, add, or remove values based on their associated keys.
+
+Visit the following resources to learn more:
+
+- [@article@Generic Map in Java](https://jenkov.com/tutorials/java-generics/generic-map.html)
+- [@article@Java Map](https://jenkov.com/tutorials/java-collections/map.html)
+- [@article@Java ConcurrentMap](https://jenkov.com/tutorials/java-util-concurrent/concurrentmap.html)
+- [@article@Java SortedMap](https://jenkov.com/tutorials/java-collections/sortedmap.html)
diff --git a/src/data/roadmaps/java/content/math-operations@ziD_XwzJSFQP_3iLjq9pA.md b/src/data/roadmaps/java/content/math-operations@ziD_XwzJSFQP_3iLjq9pA.md
new file mode 100644
index 000000000..991e14d54
--- /dev/null
+++ b/src/data/roadmaps/java/content/math-operations@ziD_XwzJSFQP_3iLjq9pA.md
@@ -0,0 +1,7 @@
+# Math Operations
+
+Math operations involve performing calculations using numbers. These operations include addition, subtraction, multiplication, division, and modulus (finding the remainder). They are fundamental building blocks for solving numerical problems and manipulating data in programming.
+
+Visit the following resources to learn more:
+
+- [@article@Java Math](https://jenkov.com/tutorials/java/math-operators-and-math-class.html)
diff --git a/src/data/roadmaps/java/content/102-java-build-tools/101-maven.md b/src/data/roadmaps/java/content/maven@VdL_fAHxmRbuF0J627beA.md
similarity index 100%
rename from src/data/roadmaps/java/content/102-java-build-tools/101-maven.md
rename to src/data/roadmaps/java/content/maven@VdL_fAHxmRbuF0J627beA.md
diff --git a/src/data/roadmaps/java/content/method-chaining@Ax2ouIZgN1DpPzKDy4fwp.md b/src/data/roadmaps/java/content/method-chaining@Ax2ouIZgN1DpPzKDy4fwp.md
new file mode 100644
index 000000000..07f22f219
--- /dev/null
+++ b/src/data/roadmaps/java/content/method-chaining@Ax2ouIZgN1DpPzKDy4fwp.md
@@ -0,0 +1,8 @@
+# Method Chaining
+
+Method chaining is a programming technique where multiple method calls are made sequentially on the same object, one after another, in a single statement. Each method in the chain returns an object, allowing the next method to be called on that returned object. This approach enhances code readability and conciseness by reducing the need for temporary variables and intermediate steps.
+
+Visit the following resources to learn more:
+
+- [@article@Java Method Chaining - Java Explained](https://bito.ai/resources/java-method-chaining-java-explained)
+- [@stackoverflow@How to achieve method chaining in Java](https://stackoverflow.com/questions/21180269/how-to-achieve-method-chaining-in-java)
diff --git a/src/data/roadmaps/java/content/method-overloading--overriding@y-i56f1P_mMdvyBr7J4XE.md b/src/data/roadmaps/java/content/method-overloading--overriding@y-i56f1P_mMdvyBr7J4XE.md
new file mode 100644
index 000000000..e7e30f848
--- /dev/null
+++ b/src/data/roadmaps/java/content/method-overloading--overriding@y-i56f1P_mMdvyBr7J4XE.md
@@ -0,0 +1,8 @@
+# Method Overloading and Overriding
+
+Method overloading allows you to define multiple methods in the same class with the same name but different parameters (different number, types, or order of parameters). Method overriding, on the other hand, occurs when a subclass provides a specific implementation for a method that is already defined in its superclass. The method signature (name and parameters) must be the same in both the superclass and the subclass for overriding to occur.
+
+Visit the following resources to learn more:
+
+- [@article@Overriding vs Overloading in Java](https://www.digitalocean.com/community/tutorials/overriding-vs-overloading-in-java)
+- [@article@Java Inheritance Tutorial](https://jenkov.com/tutorials/java/inheritance.html)
diff --git a/src/data/roadmaps/java/content/107-testing-java-apps/100-mocking.md b/src/data/roadmaps/java/content/mocking--mockito@mLM1HJf6_pxrUDOmb45ew.md
similarity index 100%
rename from src/data/roadmaps/java/content/107-testing-java-apps/100-mocking.md
rename to src/data/roadmaps/java/content/mocking--mockito@mLM1HJf6_pxrUDOmb45ew.md
diff --git a/src/data/roadmaps/java/content/modules@kdxy8Zssnc5lJjdmjUyMc.md b/src/data/roadmaps/java/content/modules@kdxy8Zssnc5lJjdmjUyMc.md
new file mode 100644
index 000000000..ba36cf7b6
--- /dev/null
+++ b/src/data/roadmaps/java/content/modules@kdxy8Zssnc5lJjdmjUyMc.md
@@ -0,0 +1,8 @@
+# Modules
+
+Modules in Java are a way to organize code into reusable and independent units. They provide a higher level of abstraction than packages, allowing you to control which parts of your code are exposed to other modules and which are kept private. This enhances encapsulation, improves security, and simplifies dependency management by explicitly declaring dependencies between modules.
+
+Visit the following resources to learn more:
+
+- [@article@Java Modules](https://jenkov.com/tutorials/java/modules.html)
+- [@article@A Guide to Java 9 Modularity](https://www.baeldung.com/java-modularity)
diff --git a/src/data/roadmaps/java/content/nested-classes@zDBW20W2XMCtNTG3emJ_A.md b/src/data/roadmaps/java/content/nested-classes@zDBW20W2XMCtNTG3emJ_A.md
new file mode 100644
index 000000000..06cac0c5e
--- /dev/null
+++ b/src/data/roadmaps/java/content/nested-classes@zDBW20W2XMCtNTG3emJ_A.md
@@ -0,0 +1,8 @@
+# Nested Classes
+
+Nested classes are classes defined inside another class. The class that contains the inner class is known as the outer class. Nested classes can access members of the outer class, even if they are declared private. They are a way to logically group classes that are only used in one place, increasing encapsulation and maintainability.
+
+Visit the following resources to learn more:
+
+- [@article@Java Nested Classes](https://jenkov.com/tutorials/java/nested-classes.html)
+- [@article@Guide to Nested Classes in Java](https://www.baeldung.com/java-nested-classes)
diff --git a/src/data/roadmaps/java/content/101-java-advanced-topics/104-networking-sockets.md b/src/data/roadmaps/java/content/networking@JeMG0gU8IVRBZgczjXmPi.md
similarity index 100%
rename from src/data/roadmaps/java/content/101-java-advanced-topics/104-networking-sockets.md
rename to src/data/roadmaps/java/content/networking@JeMG0gU8IVRBZgczjXmPi.md
diff --git a/src/data/roadmaps/java/content/object-lifecycle@3qowgj1pas1X7oRric9eU.md b/src/data/roadmaps/java/content/object-lifecycle@3qowgj1pas1X7oRric9eU.md
new file mode 100644
index 000000000..c8862834a
--- /dev/null
+++ b/src/data/roadmaps/java/content/object-lifecycle@3qowgj1pas1X7oRric9eU.md
@@ -0,0 +1,7 @@
+# Object Lifecycle
+
+The object lifecycle refers to the series of stages an object goes through from its creation (allocation of memory) to its destruction (reclaiming of memory). These stages typically include object creation, initialization, usage, and eventual garbage collection when the object is no longer needed. Understanding this lifecycle is crucial for efficient memory management and preventing resource leaks.
+
+Visit the following resources to learn more:
+
+- [@article@Object Life Cycle in Java](https://www.tpointtech.com/object-life-cycle-in-java)
diff --git a/src/data/roadmaps/java/content/optionals@l9fxK8K9fcUqR7hs5TkWU.md b/src/data/roadmaps/java/content/optionals@l9fxK8K9fcUqR7hs5TkWU.md
new file mode 100644
index 000000000..e0b2f03cd
--- /dev/null
+++ b/src/data/roadmaps/java/content/optionals@l9fxK8K9fcUqR7hs5TkWU.md
@@ -0,0 +1,8 @@
+# Optionals
+
+Optionals are a container object that may or may not contain a non-null value. They are primarily used to represent the absence of a value, avoiding the need to return null, which can lead to NullPointerExceptions. Optionals provide methods to explicitly check if a value is present and to handle cases where a value is absent in a more controlled and readable manner.
+
+Visit the following resources to learn more:
+
+- [@article@Guide To Optionals](https://www.baeldung.com/java-optional)
+- [@article@Java Optional](https://dzone.com/articles/optional-in-java)
diff --git a/src/data/roadmaps/java/content/100-java-fundamentals/106-packages.md b/src/data/roadmaps/java/content/packages@60POZOjwHSdKYL6rfkyEy.md
similarity index 100%
rename from src/data/roadmaps/java/content/100-java-fundamentals/106-packages.md
rename to src/data/roadmaps/java/content/packages@60POZOjwHSdKYL6rfkyEy.md
diff --git a/src/data/roadmaps/java/content/pass-by-value--pass-by-reference@3r0Er9XZHovIZz3gNyj4A.md b/src/data/roadmaps/java/content/pass-by-value--pass-by-reference@3r0Er9XZHovIZz3gNyj4A.md
new file mode 100644
index 000000000..99028b9a9
--- /dev/null
+++ b/src/data/roadmaps/java/content/pass-by-value--pass-by-reference@3r0Er9XZHovIZz3gNyj4A.md
@@ -0,0 +1,8 @@
+# Pass by Value / Pass by Reference
+
+Pass by value and pass by reference are two different ways of passing arguments to a function or method. In pass by value, a copy of the variable's value is passed to the function, so any changes made to the parameter inside the function do not affect the original variable. In pass by reference, a direct reference to the variable is passed, meaning that changes made to the parameter inside the function will directly affect the original variable.
+
+Visit the following resources to learn more:
+
+- [@article@Java is Pass-by-Value, Not Pass-by-Reference](https://www.baeldung.com/java-pass-by-value-or-pass-by-reference)
+- [@article@Is Java "pass-by-reference" or "pass-by-value"?](https://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value)
\ No newline at end of file
diff --git a/src/data/roadmaps/java/content/103-java-web-frameworks/102-play-framework.md b/src/data/roadmaps/java/content/play-framework@kN-mXxqUPNJNsJGQ0U_7J.md
similarity index 100%
rename from src/data/roadmaps/java/content/103-java-web-frameworks/102-play-framework.md
rename to src/data/roadmaps/java/content/play-framework@kN-mXxqUPNJNsJGQ0U_7J.md
diff --git a/src/data/roadmaps/java/content/103-java-web-frameworks/104-quarkus.md b/src/data/roadmaps/java/content/quarkus@w-kcKPh8U0P_jtT90_1Xy.md
similarity index 100%
rename from src/data/roadmaps/java/content/103-java-web-frameworks/104-quarkus.md
rename to src/data/roadmaps/java/content/quarkus@w-kcKPh8U0P_jtT90_1Xy.md
diff --git a/src/data/roadmaps/java/content/queue@ThoWhXb4vUvNfE70_wMfa.md b/src/data/roadmaps/java/content/queue@ThoWhXb4vUvNfE70_wMfa.md
new file mode 100644
index 000000000..555c63e03
--- /dev/null
+++ b/src/data/roadmaps/java/content/queue@ThoWhXb4vUvNfE70_wMfa.md
@@ -0,0 +1,7 @@
+# Queue
+
+A queue is a fundamental data structure that follows the First-In, First-Out (FIFO) principle. Think of it like a line at a store: the first person to join the line is the first person to be served.  Elements are added to the rear (enqueue) and removed from the front (dequeue) of the queue.
+
+Visit the following resources to learn more:
+
+- [@article@Java Queue](https://jenkov.com/tutorials/java-collections/queue.html)
diff --git a/src/data/roadmaps/java/content/record@VqLV7kolfRFnvOuJAvzlg.md b/src/data/roadmaps/java/content/record@VqLV7kolfRFnvOuJAvzlg.md
new file mode 100644
index 000000000..7c83c9a8a
--- /dev/null
+++ b/src/data/roadmaps/java/content/record@VqLV7kolfRFnvOuJAvzlg.md
@@ -0,0 +1,8 @@
+# Record
+
+A record is a special type of class in Java that is designed to hold immutable data. It automatically generates methods like `equals()`, `hashCode()`, and `toString()` based on the components declared in its header, reducing boilerplate code. Records are useful for creating data transfer objects (DTOs) or simple data aggregates where the primary purpose is to store and access data.
+
+Visit the following resources to learn more:
+
+- [@article@Java Records](https://jenkov.com/tutorials/java/record.html)
+- [@video@Java Records](https://www.youtube.com/watch?v=xs7DiEIHW0U)
diff --git a/src/data/roadmaps/java/content/regular-expressions@C7rB3jkshHFN7TkHRJPlz.md b/src/data/roadmaps/java/content/regular-expressions@C7rB3jkshHFN7TkHRJPlz.md
new file mode 100644
index 000000000..aab5df854
--- /dev/null
+++ b/src/data/roadmaps/java/content/regular-expressions@C7rB3jkshHFN7TkHRJPlz.md
@@ -0,0 +1,7 @@
+# Regular Expressions
+
+Regular expressions, often shortened to "regex," are sequences of characters that define a search pattern. These patterns are used to match character combinations in strings. They can be used to search, edit, or manipulate text and data. Regular expressions provide a powerful and flexible way to work with text-based data.
+
+Visit the following resources to learn more:
+
+- [@article@Java Regular Expressions Tutorial](https://jenkov.com/tutorials/java-regex/index.html)
diff --git a/src/data/roadmaps/java/content/107-testing-java-apps/106-rest-assured.md b/src/data/roadmaps/java/content/rest-assured@gB4XUR9nCdF1-dOEwGcHi.md
similarity index 100%
rename from src/data/roadmaps/java/content/107-testing-java-apps/106-rest-assured.md
rename to src/data/roadmaps/java/content/rest-assured@gB4XUR9nCdF1-dOEwGcHi.md
diff --git a/src/data/roadmaps/java/content/set@XjkNd5WJ9yxW48dwHQNkZ.md b/src/data/roadmaps/java/content/set@XjkNd5WJ9yxW48dwHQNkZ.md
new file mode 100644
index 000000000..14ac0c255
--- /dev/null
+++ b/src/data/roadmaps/java/content/set@XjkNd5WJ9yxW48dwHQNkZ.md
@@ -0,0 +1,8 @@
+# Set
+
+A Set is a data structure that stores a collection of unique elements. This means that no duplicate values are allowed within a Set. Sets provide efficient ways to check for membership (if an element exists in the set) and perform operations like union, intersection, and difference.
+
+Visit the following resources to learn more:
+
+- [@article@Java Set](https://jenkov.com/tutorials/java-collections/set.html)
+- [@article@Java Set Interface and Implementation](https://www.digitalocean.com/community/tutorials/java-set)
diff --git a/src/data/roadmaps/java/content/105-java-logging-frameworks/102-slf4j.md b/src/data/roadmaps/java/content/slf4j@LGlZHKqyQ-aWtHnhklhgn.md
similarity index 100%
rename from src/data/roadmaps/java/content/105-java-logging-frameworks/102-slf4j.md
rename to src/data/roadmaps/java/content/slf4j@LGlZHKqyQ-aWtHnhklhgn.md
diff --git a/src/data/roadmaps/java/content/104-java-orm/101-spring-data-jpa.md b/src/data/roadmaps/java/content/spring-data-jpa@WzWOxBUKKg6LeuBmVesc2.md
similarity index 100%
rename from src/data/roadmaps/java/content/104-java-orm/101-spring-data-jpa.md
rename to src/data/roadmaps/java/content/spring-data-jpa@WzWOxBUKKg6LeuBmVesc2.md
diff --git a/src/data/roadmaps/java/content/103-java-web-frameworks/101-spring-boot.md b/src/data/roadmaps/java/content/spring-spring-boot@xoryfi4SpJlkz-PV05ql6.md
similarity index 100%
rename from src/data/roadmaps/java/content/103-java-web-frameworks/101-spring-boot.md
rename to src/data/roadmaps/java/content/spring-spring-boot@xoryfi4SpJlkz-PV05ql6.md
diff --git a/src/data/roadmaps/java/content/stack@DzfE_9WLAp-BrG3C1-MwU.md b/src/data/roadmaps/java/content/stack@DzfE_9WLAp-BrG3C1-MwU.md
new file mode 100644
index 000000000..df20fb4ab
--- /dev/null
+++ b/src/data/roadmaps/java/content/stack@DzfE_9WLAp-BrG3C1-MwU.md
@@ -0,0 +1,8 @@
+# Stack
+
+A stack is a fundamental data structure that follows the Last-In, First-Out (LIFO) principle. Imagine a stack of plates; you can only add or remove plates from the top. This means the last element added to the stack is the first one to be removed. Stacks are used to manage function calls, evaluate expressions, and implement undo/redo functionality.
+
+Visit the following resources to learn more:
+
+- [@article@Java Stack Tutorial](https://jenkov.com/tutorials/java-collections/stack.html)
+- [@article@Guide to Java Stack](https://www.baeldung.com/java-stack)
diff --git a/src/data/roadmaps/java/content/static-keyword@ZcNxO6qIXIg7RaWYnZj2e.md b/src/data/roadmaps/java/content/static-keyword@ZcNxO6qIXIg7RaWYnZj2e.md
new file mode 100644
index 000000000..00a9e9aef
--- /dev/null
+++ b/src/data/roadmaps/java/content/static-keyword@ZcNxO6qIXIg7RaWYnZj2e.md
@@ -0,0 +1,9 @@
+# Static Keyword
+
+The `static` keyword in Java is used to create members (variables and methods) that belong to the class itself, rather than to any specific instance of the class. This means there's only one copy of a static variable shared by all objects of that class, and you can access static members directly using the class name without needing to create an object. Static methods can only access static variables and call other static methods.
+
+Visit the following resources to learn more:
+
+- [@article@Java Static Keyword Explained With Examples](https://www.freecodecamp.org/news/java-static-keyword-explained/)
+- [@article@Static and Non-static Fields in Java](https://jenkov.com/tutorials/java/fields.html#static-and-non-static-fields)
+- [@article@Guide to the Java 'static' Keyword](https://www.baeldung.com/java-static)
diff --git a/src/data/roadmaps/java/content/static-vs-dynamic-binding@Kjdj862xnz8fqDYE3HKhC.md b/src/data/roadmaps/java/content/static-vs-dynamic-binding@Kjdj862xnz8fqDYE3HKhC.md
new file mode 100644
index 000000000..d0fb4293a
--- /dev/null
+++ b/src/data/roadmaps/java/content/static-vs-dynamic-binding@Kjdj862xnz8fqDYE3HKhC.md
@@ -0,0 +1,8 @@
+# Static vs Dynamic Binding
+
+Static binding, also known as early binding, happens at compile time. The compiler knows exactly which method will be called based on the type of the variable. Dynamic binding, or late binding, occurs at runtime. The specific method to be called is determined based on the actual object type, not the variable type, allowing for more flexibility and polymorphism.
+
+Visit the following resources to learn more:
+
+- [@article@Static and Dynamic Binding in Java](https://www.baeldung.com/java-static-dynamic-binding)
+- [@article@Static and Dynamic Binding in Java with Examples](https://beginnersbook.com/2013/04/java-static-dynamic-binding/)
diff --git a/src/data/roadmaps/java/content/101-java-advanced-topics/105-streams.md b/src/data/roadmaps/java/content/stream-api@WHxAwfdKHQSOg0TLX05EG.md
similarity index 100%
rename from src/data/roadmaps/java/content/101-java-advanced-topics/105-streams.md
rename to src/data/roadmaps/java/content/stream-api@WHxAwfdKHQSOg0TLX05EG.md
diff --git a/src/data/roadmaps/java/content/strings-and-methods@aEaBobzFWv0mJHGAbgxKY.md b/src/data/roadmaps/java/content/strings-and-methods@aEaBobzFWv0mJHGAbgxKY.md
new file mode 100644
index 000000000..740fba62d
--- /dev/null
+++ b/src/data/roadmaps/java/content/strings-and-methods@aEaBobzFWv0mJHGAbgxKY.md
@@ -0,0 +1,7 @@
+# Strings and Methods
+
+Strings are sequences of characters, like words or sentences, used to represent text in programming. Methods are actions you can perform on these strings, such as finding their length, changing their case (uppercase or lowercase), or extracting parts of them. These methods allow you to manipulate and work with text data effectively.
+
+Visit the following resources to learn more:
+
+- [@article@Java Strings](https://jenkov.com/tutorials/java/strings.html)
diff --git a/src/data/roadmaps/java/content/107-testing-java-apps/index.md b/src/data/roadmaps/java/content/testing@LgpsnXV0CTvTspjnsd0Rd.md
similarity index 100%
rename from src/data/roadmaps/java/content/107-testing-java-apps/index.md
rename to src/data/roadmaps/java/content/testing@LgpsnXV0CTvTspjnsd0Rd.md
diff --git a/src/data/roadmaps/java/content/107-testing-java-apps/105-testng.md b/src/data/roadmaps/java/content/testng@XU2C8bF9ICej8LS7ZGTTv.md
similarity index 100%
rename from src/data/roadmaps/java/content/107-testing-java-apps/105-testng.md
rename to src/data/roadmaps/java/content/testng@XU2C8bF9ICej8LS7ZGTTv.md
diff --git a/src/data/roadmaps/java/content/101-java-advanced-topics/108-basics-of-threads.md b/src/data/roadmaps/java/content/threads@u_YysD7Bpnq-xkFX5yJGz.md
similarity index 58%
rename from src/data/roadmaps/java/content/101-java-advanced-topics/108-basics-of-threads.md
rename to src/data/roadmaps/java/content/threads@u_YysD7Bpnq-xkFX5yJGz.md
index b737487dc..7b4897a22 100644
--- a/src/data/roadmaps/java/content/101-java-advanced-topics/108-basics-of-threads.md
+++ b/src/data/roadmaps/java/content/threads@u_YysD7Bpnq-xkFX5yJGz.md
@@ -6,8 +6,5 @@ Writing correct multi-threaded application is complex and it's an advanced topic
 
 Visit the following resources to learn more:
 
-- [@article@Threads in Java](https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html)
-- [@article@An Introduction to Thread in Java](https://www.simplilearn.com/tutorials/java-tutorial/thread-in-java)
-- [@article@How to Create a Thread in Java?](https://www.javatpoint.com/how-to-create-a-thread-in-java)
-- [@article@Multithreaded programming is HARD](https://jenkov.com/tutorials/java-concurrency/index.html)
+- [@article@Threads in Java](https://jenkov.com/tutorials/java-concurrency/index.html)
 - [@video@Java Threads Tutorial](https://www.youtube.com/watch?v=TCd8QIS-2KI)
diff --git a/src/data/roadmaps/java/content/105-java-logging-frameworks/103-tinylog.md b/src/data/roadmaps/java/content/tinylog@Fn7aAaGbwYsAp4xLuuFud.md
similarity index 100%
rename from src/data/roadmaps/java/content/105-java-logging-frameworks/103-tinylog.md
rename to src/data/roadmaps/java/content/tinylog@Fn7aAaGbwYsAp4xLuuFud.md
diff --git a/src/data/roadmaps/java/content/type-casting@yNDbk6r5wFqBi25xmIRF_.md b/src/data/roadmaps/java/content/type-casting@yNDbk6r5wFqBi25xmIRF_.md
new file mode 100644
index 000000000..be6545ab4
--- /dev/null
+++ b/src/data/roadmaps/java/content/type-casting@yNDbk6r5wFqBi25xmIRF_.md
@@ -0,0 +1,8 @@
+# Type Casting
+
+Type casting is the process of converting a variable from one data type to another. This is often necessary when you need to perform operations between variables of different types, or when you need to store a value of one type in a variable of another type. In Java, type casting can be either implicit (automatic) or explicit (requiring a cast operator).
+
+Visit the following resources to learn more:
+
+- [@article@Type Casting in Java: Everything You Need to Know](https://www.simplilearn.com/tutorials/java-tutorial/type-casting-in-java)
+- [@article@Java Type Casting (With Examples)](https://www.programiz.com/java-programming/typecasting)
diff --git a/src/data/roadmaps/java/content/variables-and-scopes@VBNcAO0STaZJ1iV9A7utv.md b/src/data/roadmaps/java/content/variables-and-scopes@VBNcAO0STaZJ1iV9A7utv.md
new file mode 100644
index 000000000..cc76931c4
--- /dev/null
+++ b/src/data/roadmaps/java/content/variables-and-scopes@VBNcAO0STaZJ1iV9A7utv.md
@@ -0,0 +1,8 @@
+# Variables and Scopes
+
+Variables are like containers that hold data in a program. Each variable has a name, a type (like integer, text, or boolean), and a value. The scope of a variable determines where in your code you can access and use that variable. Understanding scope is crucial to avoid naming conflicts and ensure data is accessed correctly within different parts of your program.
+
+Visit the following resources to learn more:
+
+- [@article@Java Variables](https://jenkov.com/tutorials/java/variables.html)
+- [@article@Java Variable Scope](https://www.baeldung.com/java-variable-scope)
diff --git a/src/data/roadmaps/java/content/virtual-threads@vJSq1GJLIMQ6IIB8CMK8g.md b/src/data/roadmaps/java/content/virtual-threads@vJSq1GJLIMQ6IIB8CMK8g.md
new file mode 100644
index 000000000..12df348c1
--- /dev/null
+++ b/src/data/roadmaps/java/content/virtual-threads@vJSq1GJLIMQ6IIB8CMK8g.md
@@ -0,0 +1,9 @@
+# Virtual Threads
+
+Virtual Threads are lightweight threads managed by the Java Virtual Machine (JVM). Unlike traditional operating system threads, which are relatively expensive to create and manage, virtual threads are designed to be extremely lightweight, allowing for the creation of millions of them. They are intended to improve the scalability and concurrency of Java applications by making it easier to write code that can handle a large number of concurrent operations without the overhead associated with traditional threads.
+
+Visit the following resources to learn more:
+
+- [@article@Java 21 Virtual Threads: Dude, Where's My Lock?](https://netflixtechblog.com/java-21-virtual-threads-dude-wheres-my-lock-3052540e231d)
+- [@article@Virtual Thread vs Thread in Java](https://www.baeldung.com/java-virtual-thread-vs-thread)
+- [@article@The Ultimate Guide to Java Virtual Threads](https://rockthejvm.com/articles/the-ultimate-guide-to-java-virtual-threads)
diff --git a/src/data/roadmaps/java/content/volatile-keyword@U4Wx3MH3LgJLa0n9Ne0Br.md b/src/data/roadmaps/java/content/volatile-keyword@U4Wx3MH3LgJLa0n9Ne0Br.md
new file mode 100644
index 000000000..ca9ceebae
--- /dev/null
+++ b/src/data/roadmaps/java/content/volatile-keyword@U4Wx3MH3LgJLa0n9Ne0Br.md
@@ -0,0 +1,8 @@
+# Volatile Keyword
+
+The `volatile` keyword in Java is a modifier that can be applied to instance variables. It ensures that all threads see the most up-to-date value of a variable. Without `volatile`, each thread might cache its own copy of the variable, leading to inconsistencies when multiple threads access and modify it concurrently. Using `volatile` forces the thread to read the variable's value directly from main memory, and write changes directly back to main memory, bypassing the thread's local cache.
+
+Visit the following resources to learn more:
+
+- [@article@Java Volatile Keyword](https://jenkov.com/tutorials/java-concurrency/volatile.html)
+- [@article@Guide to the Volatile Keyword in Java](https://www.baeldung.com/java-volatile)
diff --git a/src/data/roadmaps/java/content/103-java-web-frameworks/index.md b/src/data/roadmaps/java/content/web-frameworks@_W84u4UXMSY0zvy6RJvFi.md
similarity index 100%
rename from src/data/roadmaps/java/content/103-java-web-frameworks/index.md
rename to src/data/roadmaps/java/content/web-frameworks@_W84u4UXMSY0zvy6RJvFi.md
diff --git a/src/data/roadmaps/java/java.json b/src/data/roadmaps/java/java.json
index 3881b3dec..9e8cd9da4 100644
--- a/src/data/roadmaps/java/java.json
+++ b/src/data/roadmaps/java/java.json
@@ -1,4380 +1 @@
-{
-  "mockup": {
-    "controls": {
-      "control": [
-        {
-          "ID": "4575",
-          "typeID": "Arrow",
-          "zOrder": "0",
-          "w": "88",
-          "h": "21",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "764",
-          "y": "993",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 88,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5683314450194445,
-              "y": 0.049422788376152126
-            },
-            "p2": {
-              "x": 0,
-              "y": 20.5
-            }
-          }
-        },
-        {
-          "ID": "4576",
-          "typeID": "Arrow",
-          "zOrder": "1",
-          "w": "29",
-          "h": "56",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "416",
-          "y": "185",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "color": "10027263",
-            "p0": {
-              "x": 1,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5189460476787955,
-              "y": -0.17340025094102887
-            },
-            "p2": {
-              "x": 29,
-              "y": 56
-            },
-            "stroke": "dotted"
-          }
-        },
-        {
-          "ID": "4577",
-          "typeID": "Arrow",
-          "zOrder": "2",
-          "w": "164",
-          "h": "80",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "390",
-          "y": "1180",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 163.54590590319128,
-              "y": 0.21503750628403395
-            },
-            "p1": {
-              "x": 0.3415936949541605,
-              "y": 0.2360486189239869
-            },
-            "p2": {
-              "x": -0.4888832845319939,
-              "y": 78.4480648241979
-            }
-          }
-        },
-        {
-          "ID": "4578",
-          "typeID": "Arrow",
-          "zOrder": "3",
-          "w": "1",
-          "h": "153",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "634",
-          "y": "1168",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "color": "10027263",
-            "p0": {
-              "x": 1,
-              "y": -0.5
-            },
-            "p1": {
-              "x": 0.5467472449342342,
-              "y": -0.006043370067543646
-            },
-            "p2": {
-              "x": 1,
-              "y": 152.12975218407814
-            }
-          }
-        },
-        {
-          "ID": "4579",
-          "typeID": "Arrow",
-          "zOrder": "4",
-          "w": "1",
-          "h": "62",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "637",
-          "y": "1101",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 0,
-              "y": -0.5
-            },
-            "p1": {
-              "x": 0.5467472449342341,
-              "y": -0.006043370067543647
-            },
-            "p2": {
-              "x": 0,
-              "y": 61.5
-            }
-          }
-        },
-        {
-          "ID": "4580",
-          "typeID": "Arrow",
-          "zOrder": "5",
-          "w": "101",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "711",
-          "y": "1168",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 100.54590590319128,
-              "y": 0.21503750628403395
-            },
-            "p1": {
-              "x": 0.5467472449342339,
-              "y": -0.006043370067543644
-            },
-            "p2": {
-              "x": -0.34456558612976096,
-              "y": 0.21503750628403395
-            }
-          }
-        },
-        {
-          "ID": "4581",
-          "typeID": "Arrow",
-          "zOrder": "6",
-          "w": "190",
-          "h": "101",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "369",
-          "y": "1070",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "color": "10027263",
-            "p0": {
-              "x": 189.60923090179483,
-              "y": 100.34652634056556
-            },
-            "p1": {
-              "x": 0.49438202247191004,
-              "y": 0.14606741573033685
-            },
-            "p2": {
-              "x": -0.5,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4582",
-          "typeID": "Arrow",
-          "zOrder": "7",
-          "w": "102",
-          "h": "97",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "254",
-          "y": "1069",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 102,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.555359394703657,
-              "y": 0.21664564943253461
-            },
-            "p2": {
-              "x": 0,
-              "y": 97
-            }
-          }
-        },
-        {
-          "ID": "4583",
-          "typeID": "Arrow",
-          "zOrder": "8",
-          "w": "89",
-          "h": "57",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "254",
-          "y": "1066",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 89,
-              "y": -0.5
-            },
-            "p1": {
-              "x": 0.4221511395441838,
-              "y": 0.24854058376649316
-            },
-            "p2": {
-              "x": 0,
-              "y": 56
-            }
-          }
-        },
-        {
-          "ID": "4584",
-          "typeID": "Arrow",
-          "zOrder": "9",
-          "w": "16",
-          "h": "89",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "356",
-          "y": "983",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "color": "10027263",
-            "p0": {
-              "x": 16,
-              "y": 88.5
-            },
-            "p1": {
-              "x": 0.49438202247191015,
-              "y": 0.1460674157303371
-            },
-            "p2": {
-              "x": 11,
-              "y": -0.5
-            }
-          }
-        },
-        {
-          "ID": "4585",
-          "typeID": "Arrow",
-          "zOrder": "10",
-          "w": "94",
-          "h": "27",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "755",
-          "y": "1022",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 94,
-              "y": 26
-            },
-            "p1": {
-              "x": 0.5652504390218331,
-              "y": -0.04277514219065342
-            },
-            "p2": {
-              "x": 0,
-              "y": -0.5
-            }
-          }
-        },
-        {
-          "ID": "4586",
-          "typeID": "Arrow",
-          "zOrder": "11",
-          "w": "1",
-          "h": "62",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "657",
-          "y": "951",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 0,
-              "y": -0.5
-            },
-            "p1": {
-              "x": 0.5467472449342341,
-              "y": -0.006043370067543647
-            },
-            "p2": {
-              "x": 0,
-              "y": 61.5
-            }
-          }
-        },
-        {
-          "ID": "4587",
-          "typeID": "__group__",
-          "zOrder": "12",
-          "measuredW": "116",
-          "measuredH": "42",
-          "w": "116",
-          "h": "42",
-          "x": "600",
-          "y": "937",
-          "properties": {
-            "controlName": "100-java-logging-frameworks:log4j2"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "116",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "51",
-                  "measuredH": "24",
-                  "x": "32",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Log4j2"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4588",
-          "typeID": "Arrow",
-          "zOrder": "13",
-          "h": "34",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "390",
-          "y": "986",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "color": "10027263",
-            "p0": {
-              "x": 149.5,
-              "y": 32.5
-            },
-            "p1": {
-              "x": 0.6803934308695361,
-              "y": 0.12103152376044628
-            },
-            "p2": {
-              "x": 0,
-              "y": -0.5
-            }
-          }
-        },
-        {
-          "ID": "4589",
-          "typeID": "Arrow",
-          "zOrder": "14",
-          "w": "71",
-          "h": "91",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "265",
-          "y": "979",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 0,
-              "y": 91
-            },
-            "p1": {
-              "x": 0.6008857528899565,
-              "y": 0.11717459840864736
-            },
-            "p2": {
-              "x": 71,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4590",
-          "typeID": "Arrow",
-          "zOrder": "15",
-          "w": "72",
-          "h": "45",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "255",
-          "y": "981",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 0,
-              "y": 45
-            },
-            "p1": {
-              "x": 0.5642946317103621,
-              "y": 0.14731585518102372
-            },
-            "p2": {
-              "x": 72,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4591",
-          "typeID": "Arrow",
-          "zOrder": "16",
-          "w": "74",
-          "h": "3",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "249",
-          "y": "970",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 0,
-              "y": 2.5
-            },
-            "p1": {
-              "x": 0.5467472449342342,
-              "y": -0.006043370067543645
-            },
-            "p2": {
-              "x": 74,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4592",
-          "typeID": "Arrow",
-          "zOrder": "17",
-          "w": "1",
-          "h": "62",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "352",
-          "y": "906",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 0,
-              "y": -0.5
-            },
-            "p1": {
-              "x": 0.5467472449342341,
-              "y": -0.006043370067543647
-            },
-            "p2": {
-              "x": 0,
-              "y": 61.5
-            }
-          }
-        },
-        {
-          "ID": "4593",
-          "typeID": "Arrow",
-          "zOrder": "18",
-          "w": "169",
-          "h": "138",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "419",
-          "y": "837",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "color": "10027263",
-            "p0": {
-              "x": 0,
-              "y": 137.5
-            },
-            "p1": {
-              "x": 0.5796146044624716,
-              "y": -0.25050709939147836
-            },
-            "p2": {
-              "x": 168,
-              "y": -0.5
-            }
-          }
-        },
-        {
-          "ID": "4594",
-          "typeID": "Arrow",
-          "zOrder": "19",
-          "w": "69",
-          "h": "90",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "704",
-          "y": "826",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 69,
-              "y": 89.5
-            },
-            "p1": {
-              "x": 0.517683465959328,
-              "y": -0.07117595048629538
-            },
-            "p2": {
-              "x": 0,
-              "y": -0.5
-            }
-          }
-        },
-        {
-          "ID": "4595",
-          "typeID": "Arrow",
-          "zOrder": "20",
-          "w": "71",
-          "h": "52",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "707",
-          "y": "825",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 71,
-              "y": 51.5
-            },
-            "p1": {
-              "x": 0.5176834659593281,
-              "y": -0.07117595048629538
-            },
-            "p2": {
-              "x": 0,
-              "y": -0.5
-            }
-          }
-        },
-        {
-          "ID": "4596",
-          "typeID": "Arrow",
-          "zOrder": "21",
-          "w": "87",
-          "h": "8",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "695",
-          "y": "822",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 87,
-              "y": 7.5
-            },
-            "p1": {
-              "x": 0.46115550897419105,
-              "y": -0.015066160094327265
-            },
-            "p2": {
-              "x": 0,
-              "y": -0.5
-            }
-          }
-        },
-        {
-          "ID": "4597",
-          "typeID": "Arrow",
-          "zOrder": "22",
-          "w": "75",
-          "h": "34",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "704",
-          "y": "780",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 75,
-              "y": -0.5
-            },
-            "p1": {
-              "x": 0.5901794145420208,
-              "y": 0.12086874409820589
-            },
-            "p2": {
-              "x": 0,
-              "y": 32.5
-            }
-          }
-        },
-        {
-          "ID": "4598",
-          "typeID": "Arrow",
-          "zOrder": "23",
-          "w": "142",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "403",
-          "y": "824",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "color": "10027263",
-            "p0": {
-              "x": 142,
-              "y": 0.5
-            },
-            "p1": {
-              "x": 0.4577237788246963,
-              "y": -0.003223406893131664
-            },
-            "p2": {
-              "x": 0,
-              "y": 1.5
-            }
-          }
-        },
-        {
-          "ID": "4599",
-          "typeID": "Arrow",
-          "zOrder": "24",
-          "w": "72",
-          "h": "83",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "207",
-          "y": "835",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 71,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.49238578680203043,
-              "y": -0.1065989847715736
-            },
-            "p2": {
-              "x": -0.5,
-              "y": 82.5
-            }
-          }
-        },
-        {
-          "ID": "4600",
-          "typeID": "Arrow",
-          "zOrder": "25",
-          "w": "78",
-          "h": "47",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "202",
-          "y": "828",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 77,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5286705624543463,
-              "y": -0.1044558071585099
-            },
-            "p2": {
-              "x": -0.5,
-              "y": 46.5
-            }
-          }
-        },
-        {
-          "ID": "4601",
-          "typeID": "Arrow",
-          "zOrder": "26",
-          "w": "92",
-          "h": "4",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "195",
-          "y": "819",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 92,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5115764636484295,
-              "y": 0.01858133018728801
-            },
-            "p2": {
-              "x": 0,
-              "y": 3.5
-            }
-          }
-        },
-        {
-          "ID": "4602",
-          "typeID": "Arrow",
-          "zOrder": "27",
-          "w": "181",
-          "h": "131",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "361",
-          "y": "691",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "color": "10027263",
-            "p0": {
-              "x": 181,
-              "y": -0.5
-            },
-            "p1": {
-              "x": 0.47484417739114826,
-              "y": 0.025178243128110726
-            },
-            "p2": {
-              "x": 0,
-              "y": 130.5
-            }
-          }
-        },
-        {
-          "ID": "4603",
-          "typeID": "Arrow",
-          "zOrder": "28",
-          "w": "114",
-          "h": "41",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "309",
-          "y": "634",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 114,
-              "y": 40.5
-            },
-            "p1": {
-              "x": 0.5332865705904859,
-              "y": 0.09074097691620968
-            },
-            "p2": {
-              "x": 0,
-              "y": -0.5
-            }
-          }
-        },
-        {
-          "ID": "4604",
-          "typeID": "Arrow",
-          "zOrder": "29",
-          "w": "118",
-          "h": "83",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "307",
-          "y": "694",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 118,
-              "y": -0.5
-            },
-            "p1": {
-              "x": 0.5576080853453116,
-              "y": -0.077653003930376
-            },
-            "p2": {
-              "x": 0,
-              "y": 82.5
-            }
-          }
-        },
-        {
-          "ID": "4605",
-          "typeID": "Arrow",
-          "zOrder": "30",
-          "w": "120",
-          "h": "39",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "307",
-          "y": "690",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 120,
-              "y": -0.5
-            },
-            "p1": {
-              "x": 0.5543621631807046,
-              "y": -0.06350103636706236
-            },
-            "p2": {
-              "x": 0,
-              "y": 38.5
-            }
-          }
-        },
-        {
-          "ID": "4606",
-          "typeID": "Arrow",
-          "zOrder": "31",
-          "w": "139",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "291",
-          "y": "683",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 139,
-              "y": 0.5
-            },
-            "p1": {
-              "x": 0.5194288003393264,
-              "y": 0.00233286990126545
-            },
-            "p2": {
-              "x": 0,
-              "y": -0.5
-            }
-          }
-        },
-        {
-          "ID": "4607",
-          "typeID": "Arrow",
-          "zOrder": "32",
-          "w": "1",
-          "h": "126",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "668",
-          "y": "621",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 1,
-              "y": -0.5
-            },
-            "p1": {
-              "x": 0.546747244934234,
-              "y": -0.006043370067543548
-            },
-            "p2": {
-              "x": 1,
-              "y": 125.5
-            }
-          }
-        },
-        {
-          "ID": "4608",
-          "typeID": "Arrow",
-          "zOrder": "33",
-          "w": "105",
-          "h": "40",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "672",
-          "y": "689",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 104,
-              "y": 39.5
-            },
-            "p1": {
-              "x": 0.4372442019099593,
-              "y": -0.09720327421555257
-            },
-            "p2": {
-              "x": -0.5,
-              "y": -0.5
-            }
-          }
-        },
-        {
-          "ID": "4609",
-          "typeID": "Arrow",
-          "zOrder": "34",
-          "w": "114",
-          "h": "48",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "661",
-          "y": "638",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 114,
-              "y": -0.5
-            },
-            "p1": {
-              "x": 0.42392803686203145,
-              "y": 0.09827429342881466
-            },
-            "p2": {
-              "x": 0,
-              "y": 47
-            }
-          }
-        },
-        {
-          "ID": "4610",
-          "typeID": "Arrow",
-          "zOrder": "35",
-          "w": "115",
-          "h": "1",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "673",
-          "y": "685",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 114.5,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5194288003393264,
-              "y": 0.0023328699012654486
-            },
-            "p2": {
-              "x": -0.5,
-              "y": 1
-            }
-          }
-        },
-        {
-          "ID": "4611",
-          "typeID": "Arrow",
-          "zOrder": "36",
-          "w": "103",
-          "h": "70",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "629",
-          "y": "499",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 103,
-              "y": 69.5
-            },
-            "p1": {
-              "x": 0.5846756207563066,
-              "y": -0.036972790801407494
-            },
-            "p2": {
-              "x": 0,
-              "y": -0.5
-            }
-          }
-        },
-        {
-          "ID": "4612",
-          "typeID": "Arrow",
-          "zOrder": "37",
-          "w": "1",
-          "h": "75",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "460",
-          "y": "496",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 1,
-              "y": -0.5
-            },
-            "p1": {
-              "x": 0.5467472449342339,
-              "y": -0.006043370067543547
-            },
-            "p2": {
-              "x": 0,
-              "y": 74.5
-            }
-          }
-        },
-        {
-          "ID": "4613",
-          "typeID": "Arrow",
-          "zOrder": "38",
-          "w": "100",
-          "h": "93",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "304",
-          "y": "497",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 100,
-              "y": -0.5
-            },
-            "p1": {
-              "x": 0.5656811947576956,
-              "y": -0.055470893020420485
-            },
-            "p2": {
-              "x": 0,
-              "y": 92.5
-            }
-          }
-        },
-        {
-          "ID": "4614",
-          "typeID": "Arrow",
-          "zOrder": "39",
-          "w": "13",
-          "h": "63",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "487",
-          "y": "313",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "color": "10027263",
-            "p0": {
-              "x": 4,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.48693312836279784,
-              "y": 0.16641045349730976
-            },
-            "p2": {
-              "x": 0,
-              "y": 63
-            }
-          }
-        },
-        {
-          "ID": "4615",
-          "typeID": "Arrow",
-          "zOrder": "40",
-          "w": "87",
-          "h": "177",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "509",
-          "y": "497",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "color": "10027263",
-            "p0": {
-              "x": 0,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5656248906310154,
-              "y": 0.32313022783746903
-            },
-            "p2": {
-              "x": 49,
-              "y": 177
-            }
-          }
-        },
-        {
-          "ID": "4616",
-          "typeID": "Arrow",
-          "zOrder": "41",
-          "w": "98",
-          "h": "47",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "631",
-          "y": "436",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 97.5,
-              "y": -0.5
-            },
-            "p1": {
-              "x": 0.5537800308573949,
-              "y": 0.044853427374917355
-            },
-            "p2": {
-              "x": 0,
-              "y": 46
-            }
-          }
-        },
-        {
-          "ID": "4617",
-          "typeID": "Arrow",
-          "zOrder": "42",
-          "w": "120",
-          "h": "44",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "627",
-          "y": "495",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 120,
-              "y": 44
-            },
-            "p1": {
-              "x": 0.5846756207563067,
-              "y": -0.036972790801407494
-            },
-            "p2": {
-              "x": 0,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4618",
-          "typeID": "Arrow",
-          "zOrder": "43",
-          "w": "107",
-          "h": "51",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "306",
-          "y": "435",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 107,
-              "y": 51
-            },
-            "p1": {
-              "x": 0.5245584633234497,
-              "y": 0.05852778135877272
-            },
-            "p2": {
-              "x": 0,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4619",
-          "typeID": "Arrow",
-          "zOrder": "44",
-          "w": "108",
-          "h": "44",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "306",
-          "y": "492",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 108,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.5656811947576956,
-              "y": -0.05547089302042055
-            },
-            "p2": {
-              "x": 0,
-              "y": 44
-            }
-          }
-        },
-        {
-          "ID": "4620",
-          "typeID": "Arrow",
-          "zOrder": "45",
-          "w": "115",
-          "h": "5",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "304",
-          "y": "487",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 115,
-              "y": 1
-            },
-            "p1": {
-              "x": 0.5205160087037612,
-              "y": 0.03901150139881877
-            },
-            "p2": {
-              "x": 0,
-              "y": 0
-            }
-          }
-        },
-        {
-          "ID": "4621",
-          "typeID": "Arrow",
-          "zOrder": "46",
-          "w": "123",
-          "h": "3",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "607",
-          "y": "488",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "stroke": "dotted",
-            "color": "10027263",
-            "p0": {
-              "x": 122.5,
-              "y": -0.5
-            },
-            "p1": {
-              "x": 0.5536354056902003,
-              "y": 0.01338250790305583
-            },
-            "p2": {
-              "x": 0,
-              "y": 1
-            }
-          }
-        },
-        {
-          "ID": "4622",
-          "typeID": "Label",
-          "zOrder": "47",
-          "measuredW": "60",
-          "measuredH": "36",
-          "x": "445",
-          "y": "379",
-          "properties": {
-            "size": "28",
-            "text": "Java"
-          }
-        },
-        {
-          "ID": "4623",
-          "typeID": "Arrow",
-          "zOrder": "48",
-          "w": "24",
-          "h": "51",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "457",
-          "y": "424",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "color": "10027263",
-            "p0": {
-              "x": 5,
-              "y": 0
-            },
-            "p1": {
-              "x": 0.4861538461538458,
-              "y": -0.24923076923076912
-            },
-            "p2": {
-              "x": 24,
-              "y": 51
-            }
-          }
-        },
-        {
-          "ID": "4624",
-          "typeID": "__group__",
-          "zOrder": "49",
-          "measuredW": "262",
-          "measuredH": "43",
-          "w": "262",
-          "h": "43",
-          "x": "384",
-          "y": "467",
-          "properties": {
-            "controlName": "100-java-fundamentals"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "262",
-                  "h": "43",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "177",
-                  "measuredH": "24",
-                  "x": "42",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Learn the Fundamentals"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4625",
-          "typeID": "__group__",
-          "zOrder": "50",
-          "measuredW": "222",
-          "measuredH": "42",
-          "w": "222",
-          "h": "42",
-          "x": "99",
-          "y": "422",
-          "properties": {
-            "controlName": "100-java-fundamentals:basic-syntax"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "222",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "w": "95",
-                  "measuredW": "92",
-                  "measuredH": "24",
-                  "x": "64",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Basic Syntax"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4626",
-          "typeID": "__group__",
-          "zOrder": "51",
-          "measuredW": "222",
-          "measuredH": "42",
-          "w": "222",
-          "h": "42",
-          "x": "99",
-          "y": "468",
-          "properties": {
-            "controlName": "101-java-fundamentals:data-types-variables"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "222",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "150",
-                  "measuredH": "24",
-                  "x": "36",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "DataTypes, Variables"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4627",
-          "typeID": "__group__",
-          "zOrder": "52",
-          "measuredW": "280",
-          "measuredH": "42",
-          "w": "280",
-          "h": "42",
-          "x": "718",
-          "y": "460",
-          "properties": {
-            "controlName": "105-java-fundamentals:oop"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "280",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "178",
-                  "measuredH": "24",
-                  "x": "51",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "OOP, Interfaces, Classes"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4628",
-          "typeID": "__group__",
-          "zOrder": "53",
-          "measuredW": "118",
-          "measuredH": "42",
-          "w": "118",
-          "h": "42",
-          "x": "99",
-          "y": "514",
-          "properties": {
-            "controlName": "102-java-fundamentals:conditionals"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "118",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "90",
-                  "measuredH": "24",
-                  "x": "14",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Conditionals"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4629",
-          "typeID": "__group__",
-          "zOrder": "54",
-          "measuredW": "280",
-          "measuredH": "42",
-          "w": "280",
-          "h": "42",
-          "x": "718",
-          "y": "414",
-          "properties": {
-            "controlName": "104-java-fundamentals:datastructures"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "280",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "109",
-                  "measuredH": "24",
-                  "x": "85",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "DataStructures"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4630",
-          "typeID": "__group__",
-          "zOrder": "55",
-          "measuredW": "350",
-          "measuredH": "141",
-          "w": "350",
-          "h": "141",
-          "x": "736",
-          "y": "201",
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "350",
-                  "h": "141",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0"
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "314",
-                  "measuredH": "25",
-                  "x": "14",
-                  "y": "17",
-                  "properties": {
-                    "size": "17",
-                    "text": "Find the detailed version of this roadmap"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "Label",
-                  "zOrder": "2",
-                  "measuredW": "319",
-                  "measuredH": "25",
-                  "x": "14",
-                  "y": "45",
-                  "properties": {
-                    "size": "17",
-                    "text": "along with resources and other roadmaps"
-                  }
-                },
-                {
-                  "ID": "3",
-                  "typeID": "__group__",
-                  "zOrder": "3",
-                  "measuredW": "320",
-                  "measuredH": "45",
-                  "w": "320",
-                  "h": "45",
-                  "x": "15",
-                  "y": "81",
-                  "properties": {
-                    "controlName": "ext_link:roadmap.sh"
-                  },
-                  "children": {
-                    "controls": {
-                      "control": [
-                        {
-                          "ID": "0",
-                          "typeID": "Canvas",
-                          "zOrder": "0",
-                          "w": "320",
-                          "h": "45",
-                          "measuredW": "100",
-                          "measuredH": "70",
-                          "x": "0",
-                          "y": "0",
-                          "properties": {
-                            "borderColor": "4273622",
-                            "color": "4273622"
-                          }
-                        },
-                        {
-                          "ID": "1",
-                          "typeID": "Label",
-                          "zOrder": "1",
-                          "measuredW": "105",
-                          "measuredH": "28",
-                          "x": "141",
-                          "y": "8",
-                          "properties": {
-                            "color": "16777215",
-                            "size": "20",
-                            "text": "roadmap.sh"
-                          }
-                        },
-                        {
-                          "ID": "2",
-                          "typeID": "Label",
-                          "zOrder": "2",
-                          "measuredW": "35",
-                          "measuredH": "28",
-                          "x": "76",
-                          "y": "8",
-                          "properties": {
-                            "color": "16777215",
-                            "size": "20",
-                            "text": "http"
-                          }
-                        },
-                        {
-                          "ID": "3",
-                          "typeID": "Label",
-                          "zOrder": "3",
-                          "measuredW": "5",
-                          "measuredH": "28",
-                          "x": "113",
-                          "y": "8",
-                          "properties": {
-                            "color": "16777215",
-                            "size": "20",
-                            "text": ":"
-                          }
-                        },
-                        {
-                          "ID": "4",
-                          "typeID": "Label",
-                          "zOrder": "4",
-                          "measuredW": "10",
-                          "measuredH": "28",
-                          "x": "120",
-                          "y": "9",
-                          "properties": {
-                            "color": "16777215",
-                            "size": "20",
-                            "text": "/"
-                          }
-                        },
-                        {
-                          "ID": "5",
-                          "typeID": "Label",
-                          "zOrder": "5",
-                          "measuredW": "10",
-                          "measuredH": "28",
-                          "x": "128",
-                          "y": "9",
-                          "properties": {
-                            "color": "16777215",
-                            "size": "20",
-                            "text": "/"
-                          }
-                        }
-                      ]
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4631",
-          "typeID": "__group__",
-          "zOrder": "56",
-          "measuredW": "100",
-          "measuredH": "42",
-          "w": "100",
-          "h": "42",
-          "x": "221",
-          "y": "515",
-          "properties": {
-            "controlName": "103-java-fundamentals:functions"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "71",
-                  "measuredH": "24",
-                  "x": "14",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Functions"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4632",
-          "typeID": "__group__",
-          "zOrder": "57",
-          "measuredW": "280",
-          "measuredH": "42",
-          "w": "280",
-          "h": "42",
-          "x": "718",
-          "y": "506",
-          "properties": {
-            "controlName": "106-java-fundamentals:packages"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "280",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "71",
-                  "measuredH": "24",
-                  "x": "104",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Packages"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4633",
-          "typeID": "__group__",
-          "zOrder": "58",
-          "measuredW": "280",
-          "measuredH": "42",
-          "w": "280",
-          "h": "42",
-          "x": "718",
-          "y": "552",
-          "properties": {
-            "controlName": "106-java-fundamentals:files-and-apis"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "280",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "199",
-                  "measuredH": "24",
-                  "x": "40",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Working with Files and APIs"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4634",
-          "typeID": "__group__",
-          "zOrder": "59",
-          "measuredW": "186",
-          "measuredH": "42",
-          "w": "186",
-          "h": "42",
-          "x": "368",
-          "y": "541",
-          "properties": {
-            "controlName": "107-java-fundamentals:loops"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "186",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "45",
-                  "measuredH": "24",
-                  "x": "70",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Loops"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4635",
-          "typeID": "__group__",
-          "zOrder": "60",
-          "measuredW": "284",
-          "measuredH": "43",
-          "w": "284",
-          "h": "43",
-          "x": "413",
-          "y": "664",
-          "properties": {
-            "controlName": "101-java-advanced-topics"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "284",
-                  "h": "43",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "113",
-                  "measuredH": "24",
-                  "x": "85",
-                  "y": "10",
-                  "properties": {
-                    "size": "16",
-                    "text": "Getting Deeper"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4636",
-          "typeID": "__group__",
-          "zOrder": "61",
-          "measuredW": "222",
-          "measuredH": "42",
-          "w": "222",
-          "h": "42",
-          "x": "769",
-          "y": "618",
-          "properties": {
-            "controlName": "106-java-advanced-topics:how-jvm-works"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "222",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "121",
-                  "measuredH": "24",
-                  "x": "50",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "How JVM works?"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4637",
-          "typeID": "__group__",
-          "zOrder": "62",
-          "measuredW": "222",
-          "measuredH": "42",
-          "w": "222",
-          "h": "42",
-          "x": "769",
-          "y": "664",
-          "properties": {
-            "controlName": "107-java-advanced-topics:garbage-collection"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "222",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "141",
-                  "measuredH": "24",
-                  "x": "40",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Garbage Collection"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4638",
-          "typeID": "__group__",
-          "zOrder": "63",
-          "measuredW": "222",
-          "measuredH": "42",
-          "w": "222",
-          "h": "42",
-          "x": "769",
-          "y": "710",
-          "properties": {
-            "controlName": "108-java-advanced-topics:basics-of-threads"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "222",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "130",
-                  "measuredH": "24",
-                  "x": "46",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Basics of Threads"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4639",
-          "typeID": "__group__",
-          "zOrder": "64",
-          "measuredW": "186",
-          "measuredH": "42",
-          "w": "186",
-          "h": "42",
-          "x": "368",
-          "y": "587",
-          "properties": {
-            "controlName": "108-java-fundamentals:exception-handling"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "186",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "141",
-                  "measuredH": "24",
-                  "x": "22",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Exception Handling"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4640",
-          "typeID": "__group__",
-          "zOrder": "65",
-          "measuredW": "222",
-          "measuredH": "42",
-          "w": "222",
-          "h": "42",
-          "x": "99",
-          "y": "615",
-          "properties": {
-            "controlName": "101-java-advanced-topics:memory-management"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "222",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "159",
-                  "measuredH": "24",
-                  "x": "31",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Memory Management"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4641",
-          "typeID": "__group__",
-          "zOrder": "66",
-          "measuredW": "222",
-          "measuredH": "42",
-          "w": "222",
-          "h": "42",
-          "x": "99",
-          "y": "660",
-          "properties": {
-            "controlName": "102-java-advanced-topics:collection-framework"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "222",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "157",
-                  "measuredH": "24",
-                  "x": "32",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Collection Framework"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4642",
-          "typeID": "__group__",
-          "zOrder": "67",
-          "measuredW": "117",
-          "measuredH": "42",
-          "w": "117",
-          "h": "42",
-          "x": "613",
-          "y": "605",
-          "properties": {
-            "controlName": "100-java-advanced-topics:generics"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "117",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "66",
-                  "measuredH": "24",
-                  "x": "26",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Generics"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4643",
-          "typeID": "__group__",
-          "zOrder": "68",
-          "measuredW": "117",
-          "measuredH": "42",
-          "w": "117",
-          "h": "42",
-          "x": "613",
-          "y": "725",
-          "properties": {
-            "controlName": "105-java-advanced-topics:streams"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "117",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "60",
-                  "measuredH": "24",
-                  "x": "29",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Streams"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4644",
-          "typeID": "__group__",
-          "zOrder": "69",
-          "measuredW": "222",
-          "measuredH": "42",
-          "w": "222",
-          "h": "42",
-          "x": "99",
-          "y": "705",
-          "properties": {
-            "controlName": "103-java-advanced-topics:serialization"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "222",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "89",
-                  "measuredH": "24",
-                  "x": "66",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Serialization"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4645",
-          "typeID": "__group__",
-          "zOrder": "70",
-          "measuredW": "222",
-          "measuredH": "42",
-          "w": "222",
-          "h": "42",
-          "x": "99",
-          "y": "750",
-          "properties": {
-            "controlName": "104-java-advanced-topics:networking-sockets"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "222",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "158",
-                  "measuredH": "24",
-                  "x": "32",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Networking & Sockets"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4646",
-          "typeID": "__group__",
-          "zOrder": "71",
-          "measuredW": "169",
-          "measuredH": "43",
-          "w": "169",
-          "h": "43",
-          "x": "269",
-          "y": "804",
-          "properties": {
-            "controlName": "102-java-build-tools"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "169",
-                  "h": "43",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "78",
-                  "measuredH": "24",
-                  "x": "46",
-                  "y": "10",
-                  "properties": {
-                    "size": "16",
-                    "text": "Build Tools"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4647",
-          "typeID": "__group__",
-          "zOrder": "72",
-          "measuredW": "116",
-          "measuredH": "42",
-          "w": "116",
-          "h": "42",
-          "x": "99",
-          "y": "803",
-          "properties": {
-            "controlName": "100-java-build-tools:gradle"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "116",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "49",
-                  "measuredH": "24",
-                  "x": "33",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Gradle"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4648",
-          "typeID": "__group__",
-          "zOrder": "73",
-          "measuredW": "116",
-          "measuredH": "42",
-          "w": "116",
-          "h": "42",
-          "x": "99",
-          "y": "849",
-          "properties": {
-            "controlName": "101-java-build-tools:maven"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "116",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "49",
-                  "measuredH": "24",
-                  "x": "33",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Maven"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4649",
-          "typeID": "__group__",
-          "zOrder": "74",
-          "measuredW": "116",
-          "measuredH": "42",
-          "w": "116",
-          "h": "42",
-          "x": "101",
-          "y": "896",
-          "properties": {
-            "controlName": "102-java-build-tools:ant"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "116",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "24",
-                  "measuredH": "24",
-                  "x": "46",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Ant"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4650",
-          "typeID": "__group__",
-          "zOrder": "75",
-          "measuredW": "218",
-          "measuredH": "43",
-          "w": "218",
-          "h": "43",
-          "x": "500",
-          "y": "802",
-          "properties": {
-            "controlName": "103-java-web-frameworks"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "218",
-                  "h": "43",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "125",
-                  "measuredH": "24",
-                  "x": "46",
-                  "y": "10",
-                  "properties": {
-                    "size": "16",
-                    "text": "Web Frameworks"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4651",
-          "typeID": "__group__",
-          "zOrder": "76",
-          "measuredW": "82",
-          "measuredH": "42",
-          "w": "82",
-          "h": "42",
-          "x": "770",
-          "y": "763",
-          "properties": {
-            "controlName": "100-java-web-frameworks:spring"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "82",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "47",
-                  "measuredH": "24",
-                  "x": "17",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Spring"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4652",
-          "typeID": "__group__",
-          "zOrder": "77",
-          "measuredW": "138",
-          "measuredH": "42",
-          "w": "138",
-          "h": "42",
-          "x": "855",
-          "y": "763",
-          "properties": {
-            "controlName": "101-java-web-frameworks:spring-boot"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "138",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "85",
-                  "measuredH": "24",
-                  "x": "26",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Spring Boot"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4653",
-          "typeID": "__group__",
-          "zOrder": "78",
-          "measuredW": "222",
-          "measuredH": "42",
-          "w": "222",
-          "h": "42",
-          "x": "770",
-          "y": "810",
-          "properties": {
-            "controlName": "102-java-web-frameworks:play-framework"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "222",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "114",
-                  "measuredH": "24",
-                  "x": "54",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Play Framework"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4654",
-          "typeID": "__group__",
-          "zOrder": "79",
-          "measuredW": "222",
-          "measuredH": "42",
-          "w": "222",
-          "h": "42",
-          "x": "770",
-          "y": "857",
-          "properties": {
-            "controlName": "103-java-web-frameworks:spark"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "222",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "42",
-                  "measuredH": "24",
-                  "x": "90",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Spark"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4655",
-          "typeID": "__group__",
-          "zOrder": "80",
-          "measuredW": "129",
-          "measuredH": "43",
-          "w": "129",
-          "h": "43",
-          "x": "309",
-          "y": "952",
-          "properties": {
-            "controlName": "104-java-orm"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "129",
-                  "h": "43",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "38",
-                  "measuredH": "24",
-                  "x": "46",
-                  "y": "10",
-                  "properties": {
-                    "size": "16",
-                    "text": "ORM"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4656",
-          "typeID": "__group__",
-          "zOrder": "81",
-          "measuredW": "92",
-          "measuredH": "42",
-          "w": "92",
-          "h": "42",
-          "x": "308",
-          "y": "885",
-          "properties": {
-            "controlName": "100-java-orm:jpa"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "92",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "28",
-                  "measuredH": "24",
-                  "x": "32",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "JPA"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4657",
-          "typeID": "__group__",
-          "zOrder": "82",
-          "measuredW": "169",
-          "measuredH": "42",
-          "w": "169",
-          "h": "42",
-          "x": "104",
-          "y": "997",
-          "properties": {
-            "controlName": "102-java-orm:hibernate"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "169",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "73",
-                  "measuredH": "24",
-                  "x": "48",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Hibernate"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4658",
-          "typeID": "__group__",
-          "zOrder": "83",
-          "measuredW": "169",
-          "measuredH": "42",
-          "w": "169",
-          "h": "42",
-          "x": "104",
-          "y": "951",
-          "properties": {
-            "controlName": "101-java-orm:spring-data-jpa"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "169",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "117",
-                  "measuredH": "24",
-                  "x": "26",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Spring Data JPA"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4659",
-          "typeID": "__group__",
-          "zOrder": "84",
-          "measuredW": "169",
-          "measuredH": "42",
-          "w": "169",
-          "h": "42",
-          "x": "104",
-          "y": "1043",
-          "properties": {
-            "controlName": "103-java-orm:ebean"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "169",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "50",
-                  "measuredH": "24",
-                  "x": "60",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "EBean"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4660",
-          "typeID": "__group__",
-          "zOrder": "85",
-          "measuredW": "239",
-          "measuredH": "43",
-          "w": "239",
-          "h": "43",
-          "x": "531",
-          "y": "997",
-          "properties": {
-            "controlName": "105-java-logging-frameworks"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "239",
-                  "h": "43",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "151",
-                  "measuredH": "24",
-                  "x": "44",
-                  "y": "10",
-                  "properties": {
-                    "size": "16",
-                    "text": "Logging Frameworks"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4661",
-          "typeID": "__group__",
-          "zOrder": "86",
-          "measuredW": "116",
-          "measuredH": "42",
-          "w": "116",
-          "h": "42",
-          "x": "601",
-          "y": "891",
-          "properties": {
-            "controlName": "101-java-logging-frameworks:logback"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "116",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "62",
-                  "measuredH": "24",
-                  "x": "27",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Logback"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4662",
-          "typeID": "__group__",
-          "zOrder": "87",
-          "measuredW": "168",
-          "measuredH": "42",
-          "w": "168",
-          "h": "42",
-          "x": "824",
-          "y": "1021",
-          "properties": {
-            "controlName": "103-java-logging-frameworks:tinylog"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "168",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "57",
-                  "measuredH": "24",
-                  "x": "55",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "TinyLog"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4663",
-          "typeID": "__group__",
-          "zOrder": "88",
-          "measuredW": "129",
-          "measuredH": "43",
-          "w": "129",
-          "h": "43",
-          "x": "309",
-          "y": "1043",
-          "properties": {
-            "controlName": "106-java-jdbc"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "129",
-                  "h": "43",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "43",
-                  "measuredH": "24",
-                  "x": "43",
-                  "y": "10",
-                  "properties": {
-                    "size": "16",
-                    "text": "JDBC"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4664",
-          "typeID": "__group__",
-          "zOrder": "89",
-          "measuredW": "169",
-          "measuredH": "42",
-          "w": "169",
-          "h": "42",
-          "x": "104",
-          "y": "1103",
-          "properties": {
-            "controlName": "100-java-jdbc:jdbi3"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "169",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "47",
-                  "measuredH": "24",
-                  "x": "61",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "JDBI3"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4665",
-          "typeID": "__group__",
-          "zOrder": "90",
-          "measuredW": "169",
-          "measuredH": "42",
-          "w": "169",
-          "h": "42",
-          "x": "104",
-          "y": "1149",
-          "properties": {
-            "controlName": "101-java-jdbc:jdbc-template"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "169",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "114",
-                  "measuredH": "24",
-                  "x": "28",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "JDBC Template"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4666",
-          "typeID": "__group__",
-          "zOrder": "91",
-          "measuredW": "201",
-          "measuredH": "43",
-          "w": "201",
-          "h": "43",
-          "x": "531",
-          "y": "1147",
-          "properties": {
-            "controlName": "107-testing-java-apps"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "201",
-                  "h": "43",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16776960"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "128",
-                  "measuredH": "24",
-                  "x": "37",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Testing your Apps"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4667",
-          "typeID": "__group__",
-          "zOrder": "92",
-          "measuredW": "177",
-          "measuredH": "42",
-          "w": "177",
-          "h": "42",
-          "x": "555",
-          "y": "1082",
-          "properties": {
-            "controlName": "100-testing-java-apps:mocking"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "177",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "62",
-                  "measuredH": "24",
-                  "x": "18",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Mocking"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "Label",
-                  "zOrder": "2",
-                  "measuredW": "57",
-                  "measuredH": "24",
-                  "x": "102",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Mockito"
-                  }
-                },
-                {
-                  "ID": "3",
-                  "typeID": "Label",
-                  "zOrder": "3",
-                  "measuredW": "10",
-                  "measuredH": "21",
-                  "x": "85",
-                  "y": "10",
-                  "properties": {
-                    "text": ">",
-                    "bold": "true"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4668",
-          "typeID": "Canvas",
-          "zOrder": "93",
-          "w": "192",
-          "h": "133",
-          "measuredW": "100",
-          "measuredH": "70",
-          "x": "788",
-          "y": "1082"
-        },
-        {
-          "ID": "4669",
-          "typeID": "Label",
-          "zOrder": "94",
-          "measuredW": "121",
-          "measuredH": "24",
-          "x": "817",
-          "y": "1090",
-          "properties": {
-            "size": "16",
-            "text": "Behavior Testing"
-          }
-        },
-        {
-          "ID": "4670",
-          "typeID": "__group__",
-          "zOrder": "95",
-          "measuredW": "172",
-          "measuredH": "42",
-          "w": "172",
-          "h": "42",
-          "x": "798",
-          "y": "1119",
-          "properties": {
-            "controlName": "101-testing-java-apps:cucumber-jvm"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "172",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "114",
-                  "measuredH": "24",
-                  "x": "29",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Cucumber-JVM"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4671",
-          "typeID": "__group__",
-          "zOrder": "96",
-          "measuredW": "76",
-          "measuredH": "42",
-          "w": "76",
-          "h": "42",
-          "x": "798",
-          "y": "1165",
-          "properties": {
-            "controlName": "102-testing-java-apps:cukes"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "76",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "46",
-                  "measuredH": "24",
-                  "x": "15",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Cukes"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4672",
-          "typeID": "__group__",
-          "zOrder": "97",
-          "measuredW": "91",
-          "measuredH": "42",
-          "w": "91",
-          "h": "42",
-          "x": "879",
-          "y": "1165",
-          "properties": {
-            "controlName": "103-testing-java-apps:jbehave"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "91",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "64",
-                  "measuredH": "24",
-                  "x": "14",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "JBehave"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4673",
-          "typeID": "Canvas",
-          "zOrder": "98",
-          "w": "168",
-          "h": "133",
-          "measuredW": "100",
-          "measuredH": "70",
-          "x": "269",
-          "y": "1218"
-        },
-        {
-          "ID": "4674",
-          "typeID": "Label",
-          "zOrder": "99",
-          "measuredW": "135",
-          "measuredH": "24",
-          "x": "285",
-          "y": "1227",
-          "properties": {
-            "size": "16",
-            "text": "Integration Testing"
-          }
-        },
-        {
-          "ID": "4675",
-          "typeID": "__group__",
-          "zOrder": "100",
-          "measuredW": "148",
-          "measuredH": "42",
-          "w": "148",
-          "h": "42",
-          "x": "279",
-          "y": "1255",
-          "properties": {
-            "controlName": "106-testing-java-apps:rest-assured"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "148",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "104",
-                  "measuredH": "24",
-                  "x": "29",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "REST Assured"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4676",
-          "typeID": "__group__",
-          "zOrder": "101",
-          "measuredW": "148",
-          "measuredH": "42",
-          "w": "148",
-          "h": "42",
-          "x": "279",
-          "y": "1301",
-          "properties": {
-            "controlName": "107-testing-java-apps:jmeter"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "148",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "52",
-                  "measuredH": "24",
-                  "x": "48",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "JMeter"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4677",
-          "typeID": "Canvas",
-          "zOrder": "102",
-          "w": "154",
-          "h": "133",
-          "measuredW": "100",
-          "measuredH": "70",
-          "x": "119",
-          "y": "1218"
-        },
-        {
-          "ID": "4678",
-          "typeID": "Label",
-          "zOrder": "103",
-          "measuredW": "86",
-          "measuredH": "24",
-          "x": "153",
-          "y": "1226",
-          "properties": {
-            "size": "16",
-            "text": "Unit Testing"
-          }
-        },
-        {
-          "ID": "4679",
-          "typeID": "__group__",
-          "zOrder": "104",
-          "measuredW": "125",
-          "measuredH": "42",
-          "w": "125",
-          "h": "42",
-          "x": "133",
-          "y": "1254",
-          "properties": {
-            "controlName": "104-testing-java-apps:junit"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "125",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "39",
-                  "measuredH": "24",
-                  "x": "43",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "JUnit"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4680",
-          "typeID": "__group__",
-          "zOrder": "105",
-          "measuredW": "125",
-          "measuredH": "42",
-          "w": "125",
-          "h": "42",
-          "x": "133",
-          "y": "1300",
-          "properties": {
-            "controlName": "105-testing-java-apps:testng"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "125",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "55",
-                  "measuredH": "24",
-                  "x": "35",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "TestNG"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4681",
-          "typeID": "Arrow",
-          "zOrder": "106",
-          "w": "1",
-          "h": "98",
-          "measuredW": "150",
-          "measuredH": "100",
-          "x": "763",
-          "y": "1348",
-          "properties": {
-            "curvature": "0",
-            "leftArrow": "false",
-            "rightArrow": "false",
-            "color": "10027263",
-            "p0": {
-              "x": -0.5,
-              "y": -0.5
-            },
-            "p1": {
-              "x": 0.5259259259259262,
-              "y": 0
-            },
-            "p2": {
-              "x": -0.5,
-              "y": 97
-            },
-            "stroke": "dotted"
-          }
-        },
-        {
-          "ID": "4682",
-          "typeID": "__group__",
-          "zOrder": "107",
-          "measuredW": "468",
-          "measuredH": "84",
-          "w": "468",
-          "h": "84",
-          "x": "530",
-          "y": "1293",
-          "properties": {
-            "controlName": "ext_link:roadmap.sh/backend"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "468",
-                  "h": "84",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0"
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "407",
-                  "measuredH": "28",
-                  "x": "30",
-                  "y": "16",
-                  "properties": {
-                    "size": "20",
-                    "text": "Backend Roadmap after Language Selection"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "Label",
-                  "zOrder": "2",
-                  "measuredW": "153",
-                  "measuredH": "24",
-                  "x": "157",
-                  "y": "44",
-                  "properties": {
-                    "size": "16",
-                    "text": "roadmap.sh/backend",
-                    "color": "10027263"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4683",
-          "typeID": "__group__",
-          "zOrder": "108",
-          "measuredW": "557",
-          "measuredH": "90",
-          "w": "557",
-          "h": "90",
-          "x": "42",
-          "y": "233",
-          "properties": {
-            "controlName": "ext_link:roadmap.sh/backend"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "557",
-                  "h": "90",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0"
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "384",
-                  "measuredH": "28",
-                  "x": "87",
-                  "y": "19",
-                  "properties": {
-                    "size": "20",
-                    "text": "Backend Roadmap till Language Selection"
-                  }
-                },
-                {
-                  "ID": "2",
-                  "typeID": "Label",
-                  "zOrder": "2",
-                  "measuredW": "153",
-                  "measuredH": "24",
-                  "x": "202",
-                  "y": "48",
-                  "properties": {
-                    "size": "16",
-                    "text": "roadmap.sh/backend",
-                    "color": "10027263"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4684",
-          "typeID": "__group__",
-          "zOrder": "109",
-          "measuredW": "166",
-          "measuredH": "42",
-          "w": "166",
-          "h": "42",
-          "x": "826",
-          "y": "974",
-          "properties": {
-            "controlName": "102-java-logging-frameworks:slf4j"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "166",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "47",
-                  "measuredH": "24",
-                  "x": "59",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "SLF4J"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4685",
-          "typeID": "__group__",
-          "zOrder": "110",
-          "measuredW": "222",
-          "measuredH": "42",
-          "w": "222",
-          "h": "42",
-          "x": "770",
-          "y": "903",
-          "properties": {
-            "controlName": "104-java-web-frameworks:quarkus"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "222",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "61",
-                  "measuredH": "24",
-                  "x": "80",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Quarkus"
-                  }
-                }
-              ]
-            }
-          }
-        },
-        {
-          "ID": "4686",
-          "typeID": "__group__",
-          "zOrder": "111",
-          "measuredW": "223",
-          "measuredH": "42",
-          "w": "223",
-          "h": "42",
-          "x": "99",
-          "y": "560",
-          "properties": {
-            "controlName": "107-java-fundamentals:date-time"
-          },
-          "children": {
-            "controls": {
-              "control": [
-                {
-                  "ID": "0",
-                  "typeID": "Canvas",
-                  "zOrder": "0",
-                  "w": "223",
-                  "h": "42",
-                  "measuredW": "100",
-                  "measuredH": "70",
-                  "x": "0",
-                  "y": "0",
-                  "properties": {
-                    "color": "16770457"
-                  }
-                },
-                {
-                  "ID": "1",
-                  "typeID": "Label",
-                  "zOrder": "1",
-                  "measuredW": "181",
-                  "measuredH": "24",
-                  "x": "21",
-                  "y": "9",
-                  "properties": {
-                    "size": "16",
-                    "text": "Working with Date / Time"
-                  }
-                }
-              ]
-            }
-          }
-        }
-      ]
-    },
-    "attributes": {
-      "name": "New Wireframe 1 copy 8",
-      "order": 1000000.6428282561,
-      "parentID": null,
-      "notes": ""
-    },
-    "branchID": "Master",
-    "resourceID": "960B5EDB-5533-4531-9B7D-06B4366EBEAE",
-    "mockupH": "1261",
-    "mockupW": "1044",
-    "measuredW": "1086",
-    "measuredH": "1446",
-    "version": "1.0"
-  },
-  "groupOffset": {
-    "x": 0,
-    "y": 0
-  },
-  "dependencies": [],
-  "projectID": "file:///Users/kamrify/Desktop/New%20Roadmaps/Android%20Roadmap.bmpr"
-}
\ No newline at end of file
+{"nodes":[{"id":"CdLumO1g7RNbOkwUFkVC3","type":"horizontal","position":{"x":1216.3696984675892,"y":1636.8196545591995},"selected":true,"data":{"label":"horizontal node","style":{"stroke":"#2B78E4","strokeWidth":3.65,"strokeDasharray":"0.8 8","strokeLinecap":"round"}},"zIndex":999,"width":156,"height":20,"style":{"width":156,"height":20},"positionAbsolute":{"x":1216.3696984675892,"y":1636.8196545591995},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"VheIOU0XKrEw_5M-Wv4yv","type":"section","position":{"x":1022.3252013753893,"y":1620.015947794886},"width":194,"height":124,"style":{"width":194,"height":124},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":1022.3252013753893,"y":1620.015947794886},"dragging":false,"resizing":true,"selectable":true,"focusable":true},{"id":"8Ej86dM3j55V5r29WHTef","type":"section","position":{"x":839.8929054677501,"y":1619.5740097760008},"width":186,"height":168,"style":{"width":186,"height":168},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":839.8929054677501,"y":1619.5740097760008},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"phhoZcCGuVm_zYFfcArb8","type":"section","position":{"x":699.482369832682,"y":1618.4390443834811},"width":145,"height":169,"style":{"width":145,"height":169},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":699.482369832682,"y":1618.4390443834811},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"iv_f10rCHm21sz5hesZxj","type":"vertical","position":{"x":1688.2217949048954,"y":1645.8131791964786},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.65,"stroke":"#2B78E4"},"oldId":"l40LZhtS-ldRtJ2cgiiXc"},"zIndex":999,"width":20,"height":104,"style":{"width":20,"height":104},"positionAbsolute":{"x":1688.2217949048954,"y":1645.8131791964786},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"l40LZhtS-ldRtJ2cgiiXc","type":"vertical","position":{"x":1577.5469679422956,"y":1649.8131791964786},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.65,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":100,"style":{"width":20,"height":100},"positionAbsolute":{"x":1577.5469679422956,"y":1649.8131791964786},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"7HWfRgtCU9Dv2N_3oHwYe","type":"horizontal","position":{"x":945.0073106597292,"y":1515.8599244017678},"selected":true,"data":{"label":"horizontal node","style":{"stroke":"#2B78E4","strokeWidth":3.65}},"zIndex":999,"width":95,"height":20,"style":{"width":95,"height":20},"positionAbsolute":{"x":945.0073106597292,"y":1515.8599244017678},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"BUES6hALwmHMS0oAKPKz0","type":"vertical","position":{"x":782.5073106597292,"y":1116.3203519457165},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.6}},"zIndex":999,"width":20,"height":166,"style":{"width":20,"height":166},"positionAbsolute":{"x":782.5073106597292,"y":1116.3203519457165},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"pbxsWeOonIRXRxPpdV-zo","type":"horizontal","position":{"x":818.6618709488598,"y":1178.2990031143668},"selected":true,"data":{"label":"horizontal node","style":{"stroke":"#2B78E4","strokeWidth":3.6}},"zIndex":999,"width":169,"height":20,"style":{"width":169,"height":20},"positionAbsolute":{"x":818.6618709488598,"y":1178.2990031143668},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"myugQ4WCRi1GGRZJ8uu5k","type":"vertical","position":{"x":808.6618709488598,"y":1115.3203519457165},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.6},"oldId":"BUES6hALwmHMS0oAKPKz0"},"zIndex":999,"width":20,"height":75,"style":{"width":20,"height":75},"positionAbsolute":{"x":808.6618709488598,"y":1115.3203519457165},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"ofYL6wlERXJaXuKL075zY","type":"section","position":{"x":703.0073106597292,"y":1280.8599244017678},"width":242,"height":270,"style":{"width":242,"height":270},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":703.0073106597292,"y":1280.8599244017678},"dragging":false,"selectable":true,"focusable":true},{"id":"FY6qOOwg_pdFKoYPVOeys","type":"horizontal","position":{"x":1478.3696984675892,"y":1176.8203519457165},"selected":true,"data":{"label":"horizontal node","style":{"stroke":"#2B78E4","strokeWidth":3.65}},"zIndex":999,"width":64,"height":20,"style":{"width":64,"height":20},"positionAbsolute":{"x":1478.3696984675892,"y":1176.8203519457165},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"ekkBrbM8BtpMu3TpHadYb","type":"section","position":{"x":1251.596805689261,"y":889.688197690446},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":228,"height":322,"style":{"width":228,"height":322},"resizing":false,"dragging":false,"positionAbsolute":{"x":1251.596805689261,"y":889.688197690446},"selectable":true,"focusable":true},{"id":"FyTlaUqrK5h3e5mWwkvVg","type":"section","position":{"x":1018.5552405844742,"y":524.0085042417479},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":449,"height":316,"style":{"width":449,"height":316},"resizing":false,"dragging":false,"positionAbsolute":{"x":1018.5552405844742,"y":524.0085042417479},"selectable":true,"focusable":true},{"id":"o5yOEJFOR-wScK0GWPuQq","type":"section","position":{"x":701.5073106597292,"y":403.3478959395741},"width":248,"height":440,"style":{"width":248,"height":440},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"resizing":false,"dragging":false,"positionAbsolute":{"x":701.5073106597292,"y":403.3478959395741},"focusable":true,"selectable":true},{"id":"hp15XdmPlKKTbYnrYfCBl","type":"title","position":{"x":1193.3343015809069,"y":-6.124142006891191},"selected":true,"data":{"label":"Java","style":{"fontSize":28,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":99,"height":68,"positionAbsolute":{"x":1193.3343015809069,"y":-6.124142006891191},"dragging":false,"selectable":true,"focusable":true},{"id":"2TGq1y2QthnxxN-FfToSe","type":"topic","position":{"x":1125.8343015809069,"y":187.97715893815337},"selected":true,"data":{"label":"Learn the Basics","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"Rhk7BrJqNEXQT3LGlGLM6"},"zIndex":999,"width":234,"height":49,"style":{"width":234,"height":49},"positionAbsolute":{"x":1125.8343015809069,"y":187.97715893815337},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"rj8ATHPvFP-QtD9mDLY0Z","type":"vertical","position":{"x":1232.8343015809069,"y":-98.12414200689119},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.75,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":92,"style":{"width":20,"height":92},"positionAbsolute":{"x":1232.8343015809069,"y":-98.12414200689119},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"OlbQNB6YXZjO1J7D0lZU1","type":"subtopic","position":{"x":699.1618709488599,"y":81.97715893815337},"selected":true,"data":{"label":"Basic Syntax","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":247,"height":50,"style":{"width":247,"height":50},"positionAbsolute":{"x":699.1618709488599,"y":81.97715893815337},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"5g9mmi01WeZ4aDqNzwx_V","type":"subtopic","position":{"x":699.1618709488599,"y":187.97715893815337},"selected":true,"data":{"label":"Data Types","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"QgWalJLIb6Fw0HhN1wb02"},"zIndex":999,"width":247,"height":49,"style":{"width":247,"height":49},"positionAbsolute":{"x":699.1618709488599,"y":187.97715893815337},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"sG_3ZQIE1-FQXQkk-OduQ","type":"subtopic","position":{"x":1522.5338845627668,"y":239.38076562915717},"selected":true,"data":{"label":"Conditionals","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":233,"height":49,"style":{"width":233,"height":49},"positionAbsolute":{"x":1522.5338845627668,"y":239.38076562915717},"dragging":false,"selectable":true,"focusable":true},{"id":"5khApwg1FZ-0qorsLyH-F","type":"subtopic","position":{"x":1522.5338845627668,"y":186.38076562915717},"selected":true,"data":{"label":"Arrays ","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"DZ4BX4NYeCQbjGSj56lng"},"zIndex":999,"width":233,"height":49,"style":{"width":233,"height":49},"positionAbsolute":{"x":1522.5338845627668,"y":186.38076562915717},"dragging":false,"selectable":true,"focusable":true},{"id":"JHUhVEjWFXTn6-wKcKevg","type":"subtopic","position":{"x":1522.5338845627668,"y":292.38076562915717},"selected":true,"data":{"label":"Loops","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"DZ4BX4NYeCQbjGSj56lng"},"zIndex":999,"width":233,"height":49,"style":{"width":233,"height":49},"positionAbsolute":{"x":1522.5338845627668,"y":292.38076562915717},"dragging":false,"selectable":true,"focusable":true},{"id":"VBNcAO0STaZJ1iV9A7utv","type":"subtopic","position":{"x":699.1618709488599,"y":240.97715893815337},"selected":true,"data":{"label":"Variables and Scopes","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"aEaBobzFWv0mJHGAbgxKY"},"zIndex":999,"width":247,"height":49,"style":{"width":247,"height":49},"positionAbsolute":{"x":699.1618709488599,"y":240.97715893815337},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"yNDbk6r5wFqBi25xmIRF_","type":"subtopic","position":{"x":699.1618709488599,"y":293.97715893815337},"selected":true,"data":{"label":"Type Casting","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"aEaBobzFWv0mJHGAbgxKY"},"zIndex":999,"width":247,"height":49,"style":{"width":247,"height":49},"positionAbsolute":{"x":699.1618709488599,"y":293.97715893815337},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"aEaBobzFWv0mJHGAbgxKY","type":"subtopic","position":{"x":1522.5338845627668,"y":80.38076562915717},"selected":true,"data":{"label":"Strings and Methods","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":233,"height":49,"style":{"width":233,"height":49},"positionAbsolute":{"x":1522.5338845627668,"y":80.38076562915717},"dragging":false,"selectable":true,"focusable":true},{"id":"ziD_XwzJSFQP_3iLjq9pA","type":"subtopic","position":{"x":1522.5338845627668,"y":133.38076562915717},"selected":true,"data":{"label":"Math Operations","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"aEaBobzFWv0mJHGAbgxKY"},"zIndex":999,"width":233,"height":49,"style":{"width":233,"height":49},"positionAbsolute":{"x":1522.5338845627668,"y":133.38076562915717},"dragging":false,"selectable":true,"focusable":true},{"id":"QgWalJLIb6Fw0HhN1wb02","type":"subtopic","position":{"x":699.1618709488599,"y":134.97715893815337},"selected":true,"data":{"label":"Lifecycle of a Program","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"aEaBobzFWv0mJHGAbgxKY"},"zIndex":999,"width":247,"height":49,"style":{"width":247,"height":49},"positionAbsolute":{"x":699.1618709488599,"y":134.97715893815337},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"LenPrQwxFsE1UVbXO_dE7","type":"subtopic","position":{"x":712.0073106597292,"y":462.3478959395741},"selected":true,"data":{"label":"Classes and Objects","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"xTwJYcA6ldgaw3yGmbDEd"},"zIndex":999,"width":229,"height":49,"style":{"width":229,"height":49},"positionAbsolute":{"x":712.0073106597292,"y":462.3478959395741},"dragging":false,"focusable":true,"resizing":false,"selectable":true},{"id":"xTwJYcA6ldgaw3yGmbDEd","type":"subtopic","position":{"x":712.0073106597292,"y":515.3478959395741},"selected":true,"data":{"label":"Attributes and Methods","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":229,"height":49,"style":{"width":229,"height":49},"positionAbsolute":{"x":712.0073106597292,"y":515.3478959395741},"dragging":false,"focusable":true,"resizing":false,"selectable":true},{"id":"KYndNwfQcwRCf3zCXOwd_","type":"subtopic","position":{"x":712.0073106597292,"y":568.3478959395741},"selected":true,"data":{"label":"Access Specifiers","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"xTwJYcA6ldgaw3yGmbDEd"},"zIndex":999,"width":229,"height":49,"style":{"width":229,"height":49},"positionAbsolute":{"x":712.0073106597292,"y":568.3478959395741},"dragging":false,"focusable":true,"resizing":false,"selectable":true},{"id":"ZcNxO6qIXIg7RaWYnZj2e","type":"subtopic","position":{"x":712.0073106597292,"y":621.3478959395741},"selected":true,"data":{"label":"Static Keyword","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"Ajuc_rHObqMQBXLqRIuxh"},"zIndex":999,"width":229,"height":49,"style":{"width":229,"height":49},"positionAbsolute":{"x":712.0073106597292,"y":621.3478959395741},"dragging":false,"focusable":true,"resizing":false,"selectable":true},{"id":"zDBW20W2XMCtNTG3emJ_A","type":"subtopic","position":{"x":712.0073106597292,"y":726.5225969995055},"selected":true,"data":{"label":"Nested Classes","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"Ajuc_rHObqMQBXLqRIuxh"},"zIndex":999,"width":229,"height":49,"style":{"width":229,"height":49},"positionAbsolute":{"x":712.0073106597292,"y":726.5225969995055},"dragging":false,"focusable":true,"resizing":false,"selectable":true},{"id":"DZ4BX4NYeCQbjGSj56lng","type":"subtopic","position":{"x":1522.5338845627668,"y":345.38076562915717},"selected":true,"data":{"label":"Basics of OOP","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":233,"height":49,"style":{"width":233,"height":49},"positionAbsolute":{"x":1522.5338845627668,"y":345.38076562915717},"dragging":false,"selectable":true,"focusable":true},{"id":"zNHDLv26Xn3oMrDVSAP1Z","type":"paragraph","position":{"x":1075.0552405844742,"y":416.3478959395741},"selected":true,"data":{"label":"Object Oriented Programming","style":{"fontSize":20,"borderColor":"transparent","backgroundColor":"transparent","color":"#000000","textAlign":"center","justifyContent":"center","padding":16}},"zIndex":999,"width":336,"height":52,"style":{"width":336,"height":52},"dragging":false,"resizing":false,"positionAbsolute":{"x":1075.0552405844742,"y":416.3478959395741},"focusable":true,"selectable":true},{"id":"ryMPhTTScI9pJMkQsZaaM","type":"label","position":{"x":762.5073106597292,"y":416.3478959395741},"selected":true,"data":{"label":"Basics of OOP","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":128,"height":36,"style":{},"dragging":false,"positionAbsolute":{"x":762.5073106597292,"y":416.3478959395741},"focusable":true,"selectable":true},{"id":"X6xl98_RqAQY79baHmRRI","type":"horizontal","position":{"x":949.5073106597292,"y":432.3478959395741},"selected":true,"data":{"label":"horizontal node","style":{"stroke":"#2B78E4","strokeWidth":3.65,"strokeDasharray":"0","strokeLinecap":"round"}},"zIndex":999,"width":139,"height":20,"style":{"width":139,"height":20},"positionAbsolute":{"x":949.5073106597292,"y":432.3478959395741},"dragging":false,"resizing":false,"focusable":true,"selectable":true},{"id":"sHYmeXbdREoxrru0PZ3Px","type":"label","position":{"x":1170.5552405844742,"y":533.5536247250346},"selected":true,"data":{"label":"More about OOP","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":145,"height":36,"style":{},"positionAbsolute":{"x":1170.5552405844742,"y":533.5536247250346},"dragging":false,"focusable":true,"selectable":true},{"id":"Ax2ouIZgN1DpPzKDy4fwp","type":"subtopic","position":{"x":981.8343015809069,"y":632.5536247250346},"selected":true,"data":{"label":"Method Chaining","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"3qowgj1pas1X7oRric9eU"},"zIndex":999,"width":209,"height":49,"style":{"width":209,"height":49},"dragging":false,"positionAbsolute":{"x":981.8343015809069,"y":632.5536247250346},"focusable":true,"resizing":false,"selectable":true},{"id":"ey1f8IsdAlDv1O3E_tNog","type":"subtopic","position":{"x":981.8343015809069,"y":685.5536247250346},"selected":true,"data":{"label":"Enums","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"VqLV7kolfRFnvOuJAvzlg"},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"dragging":false,"positionAbsolute":{"x":981.8343015809069,"y":685.5536247250346},"focusable":true,"resizing":false,"selectable":true},{"id":"Ajuc_rHObqMQBXLqRIuxh","type":"subtopic","position":{"x":712.0073106597292,"y":674.3478959395741},"selected":true,"data":{"label":"Final Keyword","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"KYndNwfQcwRCf3zCXOwd_"},"zIndex":999,"width":229,"height":49,"style":{"width":229,"height":49},"positionAbsolute":{"x":712.0073106597292,"y":674.3478959395741},"dragging":false,"focusable":true,"resizing":false,"selectable":true},{"id":"3qowgj1pas1X7oRric9eU","type":"subtopic","position":{"x":981.8343015809069,"y":579.5536247250346},"selected":true,"data":{"label":"Object Lifecycle","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"iH9wSsOK4a77pS7U0Yu5z"},"zIndex":999,"width":209,"height":49,"style":{"width":209,"height":49},"dragging":false,"positionAbsolute":{"x":981.8343015809069,"y":579.5536247250346},"focusable":true,"resizing":false,"selectable":true},{"id":"qdA6bK9ZkP8p0_NH_wMuj","type":"subtopic","position":{"x":1365.6267811847088,"y":579.0404190441817},"selected":true,"data":{"label":"Abstraction","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"Kjdj862xnz8fqDYE3HKhC"},"zIndex":999,"width":138,"height":49,"style":{"width":138,"height":49},"dragging":false,"positionAbsolute":{"x":1365.6267811847088,"y":579.0404190441817},"focusable":true,"resizing":false,"selectable":true},{"id":"PXpPEmCEBUKRjwP3B5LzJ","type":"subtopic","position":{"x":1197.6267811847088,"y":579.5536247250346},"selected":true,"data":{"label":"Inheritance","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"iH9wSsOK4a77pS7U0Yu5z"},"zIndex":999,"width":164,"height":49,"style":{"width":164,"height":49},"dragging":false,"positionAbsolute":{"x":1197.6267811847088,"y":579.5536247250346},"focusable":true,"resizing":false,"selectable":true},{"id":"y-i56f1P_mMdvyBr7J4XE","type":"subtopic","position":{"x":1197.6267811847088,"y":685.5536247250346},"selected":true,"data":{"label":"Method Overloading / Overriding","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"Kjdj862xnz8fqDYE3HKhC"},"zIndex":999,"width":306,"height":49,"style":{"width":306,"height":49},"dragging":false,"positionAbsolute":{"x":1197.6267811847088,"y":685.5536247250346},"focusable":true,"resizing":false,"selectable":true},{"id":"Kjdj862xnz8fqDYE3HKhC","type":"subtopic","position":{"x":1197.6267811847088,"y":739.5536247250346},"selected":true,"data":{"label":"Static vs Dynamic Binding","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"iH9wSsOK4a77pS7U0Yu5z"},"zIndex":999,"width":306,"height":49,"style":{"width":306,"height":49},"dragging":false,"positionAbsolute":{"x":1197.6267811847088,"y":739.5536247250346},"focusable":true,"resizing":false,"selectable":true},{"id":"6wTRN2PYC6zM_Txkekx53","type":"subtopic","position":{"x":1366.9652858056302,"y":632.5536247250346},"selected":true,"data":{"label":"Interfaces","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"iH9wSsOK4a77pS7U0Yu5z"},"zIndex":999,"width":138,"height":49,"style":{"width":138,"height":49},"dragging":false,"positionAbsolute":{"x":1366.9652858056302,"y":632.5536247250346},"focusable":true,"resizing":false,"selectable":true},{"id":"iH9wSsOK4a77pS7U0Yu5z","type":"subtopic","position":{"x":1197.6267811847088,"y":632.5536247250346},"selected":true,"data":{"label":"Encapsulation","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":163,"height":49,"style":{"width":163,"height":49},"dragging":false,"positionAbsolute":{"x":1197.6267811847088,"y":632.5536247250346},"focusable":true,"resizing":false,"selectable":true},{"id":"VqLV7kolfRFnvOuJAvzlg","type":"subtopic","position":{"x":1087.8343015809069,"y":685.5536247250346},"selected":true,"data":{"label":"Record","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"iH9wSsOK4a77pS7U0Yu5z"},"zIndex":999,"width":103,"height":49,"style":{"width":103,"height":49},"dragging":false,"positionAbsolute":{"x":1087.8343015809069,"y":685.5536247250346},"focusable":true,"resizing":false,"selectable":true},{"id":"60POZOjwHSdKYL6rfkyEy","type":"subtopic","position":{"x":712.0073106597292,"y":780.5225969995055},"selected":true,"data":{"label":"Packages","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"zDBW20W2XMCtNTG3emJ_A"},"zIndex":999,"width":229,"height":49,"style":{"width":229,"height":49},"positionAbsolute":{"x":712.0073106597292,"y":780.5225969995055},"dragging":false,"focusable":true,"resizing":false,"selectable":true},{"id":"dg_UpaO8TzIN7w_QZ1n-6","type":"subtopic","position":{"x":981.8343015809069,"y":739.5536247250346},"selected":true,"data":{"label":"Initializer Block","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"_TTAYrb6QvFGyTvK7cA-7"},"zIndex":999,"width":209,"height":49,"style":{"width":209,"height":49},"dragging":false,"positionAbsolute":{"x":981.8343015809069,"y":739.5536247250346},"focusable":true,"resizing":false,"selectable":true},{"id":"3r0Er9XZHovIZz3gNyj4A","type":"subtopic","position":{"x":981.8343015809069,"y":792.3789236651032},"selected":true,"data":{"label":"Pass by Value / Pass by Reference","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"dg_UpaO8TzIN7w_QZ1n-6"},"zIndex":999,"width":522,"height":49,"style":{"width":522,"height":49},"dragging":false,"positionAbsolute":{"x":981.8343015809069,"y":792.3789236651032},"focusable":true,"resizing":false,"selectable":true},{"id":"c--y6GcKj9am0CBdu_Hnt","type":"topic","position":{"x":1538.5338845627668,"y":684.5892688143869},"selected":true,"data":{"label":"Annotations","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":217,"height":49,"style":{"width":217,"height":49},"positionAbsolute":{"x":1538.5338845627668,"y":684.5892688143869},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"00_q6I95eO-PUUrKpPFY8","type":"topic","position":{"x":1538.5338845627668,"y":632.0714467697107},"selected":true,"data":{"label":"Lambda Expressions","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"c--y6GcKj9am0CBdu_Hnt"},"zIndex":999,"width":217,"height":49,"style":{"width":217,"height":49},"positionAbsolute":{"x":1538.5338845627668,"y":632.0714467697107},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"kdxy8Zssnc5lJjdmjUyMc","type":"topic","position":{"x":1538.5338845627668,"y":737.107090859063},"selected":true,"data":{"label":"Modules","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"c--y6GcKj9am0CBdu_Hnt"},"zIndex":999,"width":217,"height":49,"style":{"width":217,"height":49},"positionAbsolute":{"x":1538.5338845627668,"y":737.107090859063},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"a-EQiBUlSgdZba1mW36op","type":"subtopic","position":{"x":1263.3696984675892,"y":937.5225017715202},"selected":true,"data":{"label":"Array vs ArrayList","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":203,"height":49,"style":{"width":203,"height":49},"positionAbsolute":{"x":1263.3696984675892,"y":937.5225017715202},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"XjkNd5WJ9yxW48dwHQNkZ","type":"subtopic","position":{"x":1263.3696984675892,"y":990.5225017715202},"selected":true,"data":{"label":"Set","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"positionAbsolute":{"x":1263.3696984675892,"y":990.5225017715202},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"eKtdDtiJygKQ4PuEylFQY","type":"subtopic","position":{"x":1367.3054548486343,"y":990.5225017715202},"selected":true,"data":{"label":"Map","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"positionAbsolute":{"x":1367.3054548486343,"y":990.5225017715202},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"ThoWhXb4vUvNfE70_wMfa","type":"subtopic","position":{"x":1263.3696984675892,"y":1043.5225017715202},"selected":true,"data":{"label":"Queue","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"DWO2-EPIUeKK5aQGiTuKc"},"zIndex":999,"width":101,"height":49,"style":{"width":101,"height":49},"positionAbsolute":{"x":1263.3696984675892,"y":1043.5225017715202},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"DzfE_9WLAp-BrG3C1-MwU","type":"subtopic","position":{"x":1263.3696984675892,"y":1096.5225017715204},"selected":true,"data":{"label":"Stack","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"eL4pc6SaNiKP48PzN7mNe"},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"positionAbsolute":{"x":1263.3696984675892,"y":1096.5225017715204},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"DWO2-EPIUeKK5aQGiTuKc","type":"subtopic","position":{"x":1367.3054548486343,"y":1043.5225017715202},"selected":true,"data":{"label":"Dequeue","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"positionAbsolute":{"x":1367.3054548486343,"y":1043.5225017715202},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"-17LFO72I8RKjJRMXct9k","type":"subtopic","position":{"x":1367.3054548486343,"y":1096.5225017715204},"selected":true,"data":{"label":"Iterator","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"DWO2-EPIUeKK5aQGiTuKc"},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"positionAbsolute":{"x":1367.3054548486343,"y":1096.5225017715204},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"PX4ZcshR0QtsPElyZzSel","type":"label","position":{"x":1314.3696984675892,"y":898.3203519457165},"selected":true,"data":{"label":"Collections","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":101,"height":36,"style":{},"positionAbsolute":{"x":1314.3696984675892,"y":898.3203519457165},"dragging":false,"selectable":true,"focusable":true},{"id":"eL4pc6SaNiKP48PzN7mNe","type":"subtopic","position":{"x":1263.3696984675892,"y":1152.0111884486032},"selected":true,"data":{"label":"Generic Collections","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":206,"height":49,"style":{"width":206,"height":49},"positionAbsolute":{"x":1263.3696984675892,"y":1152.0111884486032},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"Z_rjrHtWp1Zp1G2YN0KfD","type":"vertical","position":{"x":1638.356875320924,"y":831.2420992601204},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.65}},"zIndex":999,"width":20,"height":109,"style":{"width":20,"height":109},"positionAbsolute":{"x":1638.356875320924,"y":831.2420992601204},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"l9fxK8K9fcUqR7hs5TkWU","type":"topic","position":{"x":1538.5338845627668,"y":789.6249129037391},"selected":true,"data":{"label":"Optionals","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"JeMG0gU8IVRBZgczjXmPi"},"zIndex":999,"width":217,"height":49,"style":{"width":217,"height":49},"positionAbsolute":{"x":1538.5338845627668,"y":789.6249129037391},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"g9P3548F38tYGjevBc42w","type":"topic","position":{"x":1538.5338845627668,"y":520.5536247250346},"selected":true,"data":{"label":"Exception Handling","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"00_q6I95eO-PUUrKpPFY8"},"zIndex":999,"width":217,"height":49,"style":{"width":217,"height":49},"positionAbsolute":{"x":1538.5338845627668,"y":520.5536247250346},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"D1woaibP6qkuqmBQkZrhO","type":"horizontal","position":{"x":1174.7508238192552,"y":1178.2990031143668},"selected":true,"data":{"label":"horizontal node","style":{"stroke":"#2B78E4","strokeWidth":3.65},"oldId":"FY6qOOwg_pdFKoYPVOeys"},"zIndex":999,"width":77,"height":20,"style":{"width":77,"height":20},"positionAbsolute":{"x":1174.7508238192552,"y":1178.2990031143668},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"_W84u4UXMSY0zvy6RJvFi","type":"topic","position":{"x":1250.6499336025647,"y":1501.4989519840194},"selected":true,"data":{"label":"Web Frameworks","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"LgpsnXV0CTvTspjnsd0Rd"},"zIndex":999,"width":231,"height":49,"style":{"width":231,"height":49},"positionAbsolute":{"x":1250.6499336025647,"y":1501.4989519840194},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"xoryfi4SpJlkz-PV05ql6","type":"subtopic","position":{"x":1250.6499336025647,"y":1315.2594233874954},"selected":true,"data":{"label":"Spring (Spring Boot)","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":231,"height":49,"style":{"width":231,"height":49},"positionAbsolute":{"x":1250.6499336025647,"y":1315.2594233874954},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"kN-mXxqUPNJNsJGQ0U_7J","type":"subtopic","position":{"x":1250.6499336025647,"y":1421.2594233874954},"selected":true,"data":{"label":"Play Framework","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"xoryfi4SpJlkz-PV05ql6"},"zIndex":999,"width":231,"height":49,"style":{"width":231,"height":49},"positionAbsolute":{"x":1250.6499336025647,"y":1421.2594233874954},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"w-kcKPh8U0P_jtT90_1Xy","type":"subtopic","position":{"x":1250.6499336025647,"y":1368.2594233874954},"selected":true,"data":{"label":"Quarkus","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"OrkJa48HIDmrLOgCBpimA"},"zIndex":999,"width":113,"height":49,"style":{"width":113,"height":49},"positionAbsolute":{"x":1250.6499336025647,"y":1368.2594233874954},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"aqTfDatV26H0rOAhyQo0q","type":"label","position":{"x":1246.1499336025647,"y":1255.4420481297732},"selected":true,"data":{"label":"Spring Boot is recommended","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":240,"height":36,"style":{},"positionAbsolute":{"x":1246.1499336025647,"y":1255.4420481297732},"dragging":false,"selectable":true,"focusable":true},{"id":"81N1cZLue_Ii0uD5CV6kZ","type":"topic","position":{"x":1006.8720474064457,"y":1502.013322952089},"selected":true,"data":{"label":"Build Tools","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":180,"height":49,"style":{"width":180,"height":49},"positionAbsolute":{"x":1006.8720474064457,"y":1502.013322952089},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"VdL_fAHxmRbuF0J627beA","type":"subtopic","position":{"x":1006.8720474064457,"y":1317.2276953646335},"selected":true,"data":{"label":"Maven","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"6FMj9tMAQPii_1kLtHJLk"},"zIndex":999,"width":180,"height":49,"style":{"width":180,"height":49},"positionAbsolute":{"x":1006.8720474064457,"y":1317.2276953646335},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"rmDIm5dqtdlNfPhvpqS7-","type":"subtopic","position":{"x":1006.8720474064457,"y":1370.2276953646335},"selected":true,"data":{"label":"Gradle","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"6FMj9tMAQPii_1kLtHJLk"},"zIndex":999,"width":180,"height":49,"style":{"width":180,"height":49},"positionAbsolute":{"x":1006.8720474064457,"y":1370.2276953646335},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"6FMj9tMAQPii_1kLtHJLk","type":"subtopic","position":{"x":1006.8720474064457,"y":1423.2276953646335},"selected":true,"data":{"label":"Bazel","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":180,"height":49,"style":{"width":180,"height":49},"positionAbsolute":{"x":1006.8720474064457,"y":1423.2276953646335},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"zItXmuluDtl6HkTYQ7qMh","type":"topic","position":{"x":1538.5338845627668,"y":941.8599244017678},"selected":true,"data":{"label":"Dependency Injection","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"JeMG0gU8IVRBZgczjXmPi"},"zIndex":999,"width":217,"height":49,"style":{"width":217,"height":49},"positionAbsolute":{"x":1538.5338845627668,"y":941.8599244017678},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"M0ybgK1JCycXhZ1dEpCFo","type":"topic","position":{"x":1538.5338845627668,"y":1109.3203519457165},"selected":true,"data":{"label":"I/O Operations","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"JeMG0gU8IVRBZgczjXmPi"},"zIndex":999,"width":217,"height":49,"style":{"width":217,"height":49},"positionAbsolute":{"x":1538.5338845627668,"y":1109.3203519457165},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"NowpzyPVFcX082j5YS5i8","type":"topic","position":{"x":1538.5338845627668,"y":1162.3203519457165},"selected":true,"data":{"label":"File Operations","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"JeMG0gU8IVRBZgczjXmPi"},"zIndex":999,"width":217,"height":49,"style":{"width":217,"height":49},"positionAbsolute":{"x":1538.5338845627668,"y":1162.3203519457165},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"H-TpLxAx_BnJhyFc4HK6M","type":"label","position":{"x":1354.1499336025647,"y":1273.5598732714204},"selected":true,"data":{"label":"v","href":"","color":"#000000","style":{"fontSize":17},"oldId":"aqTfDatV26H0rOAhyQo0q"},"zIndex":999,"width":24,"height":36,"style":{},"positionAbsolute":{"x":1354.1499336025647,"y":1273.5598732714204},"dragging":false,"selectable":true,"focusable":true},{"id":"shqS9-hg__mkOtnnl_I4l","type":"topic","position":{"x":973.8343015809069,"y":1162.3203519457165},"selected":true,"data":{"label":"Concurrency","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"JeMG0gU8IVRBZgczjXmPi"},"zIndex":999,"width":217,"height":49,"style":{"width":217,"height":49},"positionAbsolute":{"x":973.8343015809069,"y":1162.3203519457165},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"u_YysD7Bpnq-xkFX5yJGz","type":"subtopic","position":{"x":973.8343015809069,"y":1073.5225017715202},"selected":true,"data":{"label":"Threads","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"U4Wx3MH3LgJLa0n9Ne0Br"},"zIndex":999,"width":217,"height":49,"style":{"width":217,"height":49},"positionAbsolute":{"x":973.8343015809069,"y":1073.5225017715202},"dragging":false,"selectable":true,"focusable":true},{"id":"vJSq1GJLIMQ6IIB8CMK8g","type":"subtopic","position":{"x":973.8343015809069,"y":1020.5225017715202},"selected":true,"data":{"label":"Virtual Threads","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"U4Wx3MH3LgJLa0n9Ne0Br"},"zIndex":999,"width":217,"height":49,"style":{"width":217,"height":49},"positionAbsolute":{"x":973.8343015809069,"y":1020.5225017715202},"dragging":false,"selectable":true,"focusable":true},{"id":"wEc7pSVU5G2c6Zqmtb_1k","type":"subtopic","position":{"x":973.8343015809069,"y":967.5225017715202},"selected":true,"data":{"label":"Java Memory Model","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"U4Wx3MH3LgJLa0n9Ne0Br"},"zIndex":999,"width":217,"height":49,"style":{"width":217,"height":49},"positionAbsolute":{"x":973.8343015809069,"y":967.5225017715202},"dragging":false,"selectable":true,"focusable":true},{"id":"U4Wx3MH3LgJLa0n9Ne0Br","type":"subtopic","position":{"x":973.8343015809069,"y":915.3203519457165},"selected":true,"data":{"label":"volatile keyword","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":217,"height":49,"style":{"width":217,"height":49},"positionAbsolute":{"x":973.8343015809069,"y":915.3203519457165},"dragging":false,"selectable":true,"focusable":true},{"id":"_wV2VQq6MIY1rVHjK8pfu","type":"topic","position":{"x":702.0073106597292,"y":914.3203519457165},"selected":true,"data":{"label":"Cryptography","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"JeMG0gU8IVRBZgczjXmPi"},"zIndex":999,"width":221,"height":49,"style":{"width":221,"height":49},"positionAbsolute":{"x":702.0073106597292,"y":914.3203519457165},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"9h20XVRli7TDq0QIJwX2U","type":"topic","position":{"x":701.1618709488599,"y":966.5225017715202},"selected":true,"data":{"label":"Date and Time","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"JeMG0gU8IVRBZgczjXmPi"},"zIndex":999,"width":223,"height":49,"style":{"width":223,"height":49},"positionAbsolute":{"x":701.1618709488599,"y":966.5225017715202},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"UGccAJeFA636IiCySl-zF","type":"label","position":{"x":711.0073106597292,"y":1507.8599244017678},"selected":true,"data":{"label":"Functional Programming","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":226,"height":36,"style":{"width":226},"positionAbsolute":{"x":711.0073106597292,"y":1507.8599244017678},"dragging":false,"selectable":true,"focusable":true},{"id":"1Mk_zXxCCcUoX-gFxtlnf","type":"subtopic","position":{"x":711.0073106597292,"y":1394.8599244017678},"selected":true,"data":{"label":"Functional Composition","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"WHxAwfdKHQSOg0TLX05EG"},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":711.0073106597292,"y":1394.8599244017678},"dragging":false,"selectable":true,"focusable":true},{"id":"dz6bCmB4dgA7VVZ448cN6","type":"subtopic","position":{"x":711.0073106597292,"y":1288.8599244017678},"selected":true,"data":{"label":"High Order Functions","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"SityDdjhhNZ9CO3Tg0VI9"},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":711.0073106597292,"y":1288.8599244017678},"dragging":false,"selectable":true,"focusable":true},{"id":"SityDdjhhNZ9CO3Tg0VI9","type":"subtopic","position":{"x":711.0073106597292,"y":1341.8599244017678},"selected":true,"data":{"label":"Functional Interfaces","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":711.0073106597292,"y":1341.8599244017678},"dragging":false,"selectable":true,"focusable":true},{"id":"WHxAwfdKHQSOg0TLX05EG","type":"subtopic","position":{"x":711.0073106597292,"y":1447.8599244017678},"selected":true,"data":{"label":"Stream API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"SityDdjhhNZ9CO3Tg0VI9"},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":711.0073106597292,"y":1447.8599244017678},"dragging":false,"selectable":true,"focusable":true},{"id":"JeMG0gU8IVRBZgczjXmPi","type":"topic","position":{"x":700.0073106597292,"y":1018.7246515973238},"selected":true,"data":{"label":"Networking","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"kdxy8Zssnc5lJjdmjUyMc"},"zIndex":999,"width":223,"height":49,"style":{"width":223,"height":49},"positionAbsolute":{"x":700.0073106597292,"y":1018.7246515973238},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"C7rB3jkshHFN7TkHRJPlz","type":"topic","position":{"x":700.0073106597292,"y":1073.5225017715202},"selected":true,"data":{"label":"Regular Expressions","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"JeMG0gU8IVRBZgczjXmPi"},"zIndex":999,"width":223,"height":49,"style":{"width":223,"height":49},"positionAbsolute":{"x":700.0073106597292,"y":1073.5225017715202},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"fV-gW51jhna2__Ln2HIIh","type":"topic","position":{"x":1529.0338845627668,"y":1500.3599244017678},"selected":true,"data":{"label":"Database Access","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"LgpsnXV0CTvTspjnsd0Rd"},"zIndex":999,"width":220,"height":49,"style":{"width":220,"height":49},"positionAbsolute":{"x":1529.0338845627668,"y":1500.3599244017678},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"WzWOxBUKKg6LeuBmVesc2","type":"subtopic","position":{"x":1554.5338845627668,"y":1417.8469443073327},"selected":true,"data":{"label":"Spring Data JPA","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"9UbRG752qxJdUwmqEAjN3"},"zIndex":999,"width":169,"height":49,"style":{"width":169,"height":49},"positionAbsolute":{"x":1554.5338845627668,"y":1417.8469443073327},"dragging":false,"selectable":true,"focusable":true},{"id":"UEiDzzodyEu5O1xFAFDly","type":"subtopic","position":{"x":1554.5338845627668,"y":1364.8469443073327},"selected":true,"data":{"label":"Hibernate","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"9UbRG752qxJdUwmqEAjN3"},"zIndex":999,"width":169,"height":49,"style":{"width":169,"height":49},"positionAbsolute":{"x":1554.5338845627668,"y":1364.8469443073327},"dragging":false,"selectable":true,"focusable":true},{"id":"X2rJ3BY1ytFKsbJqJETFu","type":"subtopic","position":{"x":1554.5338845627668,"y":1311.8469443073327},"selected":true,"data":{"label":"EBean","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"9UbRG752qxJdUwmqEAjN3"},"zIndex":999,"width":169,"height":49,"style":{"width":169,"height":49},"positionAbsolute":{"x":1554.5338845627668,"y":1311.8469443073327},"dragging":false,"selectable":true,"focusable":true},{"id":"d9F5Wt8onY125DLuzNULg","type":"topic","position":{"x":1529.0338845627668,"y":1622.3196545591995},"selected":true,"data":{"label":"Logging Frameworks","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"LgpsnXV0CTvTspjnsd0Rd"},"zIndex":999,"width":220,"height":49,"style":{"width":220,"height":49},"positionAbsolute":{"x":1529.0338845627668,"y":1622.3196545591995},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"okC1uMdyfIJAhX_R9Npsw","type":"subtopic","position":{"x":1532.5469679422956,"y":1716.8068987197155},"selected":true,"data":{"label":"Logback","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":110,"height":49,"style":{"width":110,"height":49},"positionAbsolute":{"x":1532.5469679422956,"y":1716.8068987197155},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"sFaNj_1MviaTc6UIfjXl6","type":"subtopic","position":{"x":1648.2217949048954,"y":1716.8068987197155},"selected":true,"data":{"label":"Log4j2","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"positionAbsolute":{"x":1648.2217949048954,"y":1716.8068987197155},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"LGlZHKqyQ-aWtHnhklhgn","type":"subtopic","position":{"x":1532.5469679422956,"y":1769.8068987197155},"selected":true,"data":{"label":"SLF4J","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":110,"height":49,"style":{"width":110,"height":49},"positionAbsolute":{"x":1532.5469679422956,"y":1769.8068987197155},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"Fn7aAaGbwYsAp4xLuuFud","type":"subtopic","position":{"x":1648.2217949048954,"y":1769.8068987197155},"selected":true,"data":{"label":"TinyLog","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"positionAbsolute":{"x":1648.2217949048954,"y":1769.8068987197155},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"LgpsnXV0CTvTspjnsd0Rd","type":"topic","position":{"x":1300.7385519848222,"y":1621.8196545591995},"selected":true,"data":{"label":"Testing","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"81N1cZLue_Ii0uD5CV6kZ"},"zIndex":999,"width":120,"height":50,"style":{"width":120,"height":50},"positionAbsolute":{"x":1300.7385519848222,"y":1621.8196545591995},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"9UbRG752qxJdUwmqEAjN3","type":"subtopic","position":{"x":1554.5338845627668,"y":1258.8469443073327},"selected":true,"data":{"label":"JDBC","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":169,"height":49,"style":{"width":169,"height":49},"positionAbsolute":{"x":1554.5338845627668,"y":1258.8469443073327},"dragging":false,"selectable":true,"focusable":true},{"id":"ahcnPvftbi83gtiqV6VTP","type":"label","position":{"x":712.482369832682,"y":1739.4390443834811},"selected":true,"data":{"label":"Unit Testing","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":119,"height":32,"style":{"width":119,"height":31.718994140625},"positionAbsolute":{"x":712.482369832682,"y":1739.4390443834811},"dragging":false,"selectable":true,"focusable":true},{"id":"hY1-sEpTmpaj1PregdkFf","type":"subtopic","position":{"x":712.482369832682,"y":1626.4390443834811},"selected":true,"data":{"label":"JUnit","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":119,"height":49,"style":{"width":119,"height":49},"positionAbsolute":{"x":712.482369832682,"y":1626.4390443834811},"dragging":false,"selectable":true,"focusable":true},{"id":"XU2C8bF9ICej8LS7ZGTTv","type":"subtopic","position":{"x":712.482369832682,"y":1679.4390443834811},"selected":true,"data":{"label":"TestNG","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":119,"height":49,"style":{"width":119,"height":49},"positionAbsolute":{"x":712.482369832682,"y":1679.4390443834811},"dragging":false,"selectable":true,"focusable":true},{"id":"lI6ST4WcGtPdKSoWIxStg","type":"label","position":{"x":854.3929054677501,"y":1740.5740097760008},"selected":true,"data":{"label":"Integration Testing","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":159,"height":36,"style":{},"positionAbsolute":{"x":854.3929054677501,"y":1740.5740097760008},"dragging":false,"selectable":true,"focusable":true},{"id":"gB4XUR9nCdF1-dOEwGcHi","type":"subtopic","position":{"x":854.3929054677501,"y":1627.5740097760008},"selected":true,"data":{"label":"REST Assured","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":159,"height":49,"style":{"width":159,"height":49},"positionAbsolute":{"x":854.3929054677501,"y":1627.5740097760008},"dragging":false,"selectable":true,"focusable":true},{"id":"U2BqOY49HaII6mKQB3SVt","type":"subtopic","position":{"x":854.3929054677501,"y":1680.5740097760008},"selected":true,"data":{"label":"JMeter","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":159,"height":49,"style":{"width":159,"height":49},"positionAbsolute":{"x":854.3929054677501,"y":1680.5740097760008},"dragging":false,"selectable":true,"focusable":true},{"id":"BFX3fjnFTHVnNnqMudZoK","type":"label","position":{"x":1046.8252013753893,"y":1693.015947794886},"selected":true,"data":{"label":"Behavior Testing","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":144,"height":36,"style":{},"positionAbsolute":{"x":1046.8252013753893,"y":1693.015947794886},"dragging":false,"selectable":true,"focusable":true},{"id":"UFDy19TNkykRsKv4vRsVJ","type":"subtopic","position":{"x":1030.3252013753893,"y":1633.015947794886},"selected":true,"data":{"label":"Cucubmber-JVM","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"mLM1HJf6_pxrUDOmb45ew"},"zIndex":999,"width":177,"height":49,"style":{"width":177,"height":49},"positionAbsolute":{"x":1030.3252013753893,"y":1633.015947794886},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"mLM1HJf6_pxrUDOmb45ew","type":"subtopic","position":{"x":1022.3252013753893,"y":1738.4390443834811},"selected":true,"data":{"label":"Mocking > Mockito","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":196,"height":49,"style":{"width":196,"height":49},"positionAbsolute":{"x":1022.3252013753893,"y":1738.4390443834811},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"width":411,"height":121,"id":"0vLaVNJaJSHZ_bHli6Qzs","type":"paragraph","position":{"x":1155.2385519848222,"y":1895.2880407433463},"selected":true,"data":{"label":"Visit Backend path and see what you missed","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center","borderColor":"#000000","backgroundColor":"WHITe"},"oldId":"m9eO0jLGuR_9w2JJbe_g2"},"zIndex":999,"positionAbsolute":{"x":1155.2385519848222,"y":1895.2880407433463},"dragging":false,"style":{"width":411,"height":121},"resizing":false,"focusable":true,"selectable":true},{"width":20,"height":85,"id":"xi0QAi4kXm3-IFKgopnOP","type":"vertical","position":{"x":1359.8343015809069,"y":2016.2880407433463},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"},"oldId":"RLtk1C3gofHnLJ17x3o5b"},"zIndex":999,"positionAbsolute":{"x":1359.8343015809069,"y":2016.2880407433463},"dragging":false,"focusable":true,"style":{"width":20,"height":85},"resizing":false,"selectable":true},{"width":377,"height":49,"id":"-sFboM4eFUMVq1tlPl-fV","type":"button","position":{"x":1177.931647147896,"y":1952.012591461887},"selected":true,"data":{"label":"Backend Roadmap","href":"https://roadmap.sh/backend","color":"#FFFFFf","backgroundColor":"#4136D6","style":{"fontSize":17},"borderColor":"#4136D6","oldId":"qXKNK_IsGS8-JgLK-Q9oU"},"zIndex":999,"dragging":false,"positionAbsolute":{"x":1177.931647147896,"y":1952.012591461887},"style":{"width":377,"height":49},"focusable":true,"resizing":false,"selectable":true},{"id":"t7TlesNLK0sOM8Zv7t-MF","type":"paragraph","position":{"x":703.0073106597292,"y":-98.12414200689119},"selected":true,"data":{"label":"This is Java specific roadmap and intentionally skips some backend topics.","style":{"fontSize":17,"borderColor":"#000000","backgroundColor":"#ffffff","color":"#000000","textAlign":"center","justifyContent":"flex-start","padding":16}},"zIndex":999,"width":390,"height":150,"positionAbsolute":{"x":703.0073106597292,"y":-98.12414200689119},"dragging":false,"style":{"width":390,"height":150},"resizing":false,"selectable":true,"focusable":true},{"id":"2zqZkyVgigifcRS1H7F_b","type":"button","position":{"x":722.5073106597292,"y":-12.157567200212156},"selected":true,"data":{"label":"Visit Backend Roadmap","href":"https://roadmap.sh/backend","color":"#000000","backgroundColor":"#d1d1d1","style":{"fontSize":17},"borderColor":"#D1D1D1"},"zIndex":999,"width":351,"height":49,"dragging":false,"style":{"width":351,"height":49},"resizing":false,"positionAbsolute":{"x":722.5073106597292,"y":-12.157567200212156},"selectable":true,"focusable":true},{"id":"kpF15oUmlUmk1qVGEBB7Y","type":"paragraph","position":{"x":1401.8167239283337,"y":-93.80861630367417},"selected":true,"data":{"label":"Find the detailed version of this roadmap along with other similar roadmaps","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left","borderColor":"#000000","backgroundColor":"#FFFFFf"},"oldId":"yHmHXymPNWwu8p1vvqD3o"},"zIndex":999,"width":354,"height":143,"positionAbsolute":{"x":1401.8167239283337,"y":-93.80861630367417},"dragging":false,"selectable":true,"focusable":true,"style":{"width":354,"height":143},"resizing":false},{"id":"if9eTna5NRTMStVwpSwDP","type":"button","position":{"x":1414.3167239283337,"y":-11.95049837897065},"selected":true,"data":{"label":"roadmap.sh","href":"https://roadmap.sh","color":"#ffffff","backgroundColor":"#4136D6","style":{"fontSize":17},"oldId":"2zqZkyVgigifcRS1H7F_b"},"zIndex":999,"width":329,"height":49,"dragging":false,"style":{"width":329,"height":49},"resizing":false,"positionAbsolute":{"x":1414.3167239283337,"y":-11.95049837897065},"selectable":true,"focusable":true},{"id":"OrkJa48HIDmrLOgCBpimA","type":"subtopic","position":{"x":1368.6499336025647,"y":1368.2594233874954},"selected":true,"data":{"label":"Javalin","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"kN-mXxqUPNJNsJGQ0U_7J"},"zIndex":999,"width":113,"height":49,"style":{"width":113,"height":49},"positionAbsolute":{"x":1368.6499336025647,"y":1368.2594233874954},"selectable":true,"focusable":true,"dragging":false,"resizing":false}],"edges":[{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"iogwMmOvub2ZF4zgg6WyF","sourceHandle":"x2","target":"_hYN0gEi9BL24nptEtXWU","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"XX0I26JoVMVXIe_7bVMix","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"z2","target":"idLHBxhvcIqZTqmh_E8Az","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"dFn6kGOoJ-0BzJJEb9DSG","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"z2","target":"os3Pa6W9SSNEzgmlBbglQ","targetHandle":"y2","data":{"edgeStyle":"dashed"},"id":"arkF7QJJRbCBYWp0crqa2","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"z2","target":"3oInpqvTSSC5_K6i7j8N7","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"HNVw8OboycWKLEtEbG2bn","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"z2","target":"YKhuRbcUFzo0hTvuTq-Yl","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"auB7Png72XjmhcLr3IJA7","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"jZ67HhVRelJaxjsCckSSI","sourceHandle":"x2","target":"hWA7RtuqltMTmHdcCnmES","targetHandle":"y1","data":{"edgeStyle":"solid"},"id":"2aoDIr80lXSJLW1hIGUkb","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"sourceHandle":"z2","target":"NMznG9mo2wzNFnjhg990f","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"m-_y7nLeYFkUKGiacxWA0","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"sourceHandle":"z2","target":"gc_7cuIO2_joKlQRAPDfX","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"G7pXuJfkyt2nWAOHU8yV0","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"rrrvATyhXqRgJGWI3z0WF","sourceHandle":"x2","target":"AvbMQ5vY3ip1oX_6Yq4ie","targetHandle":"w2","data":{"edgeStyle":"dashed"},"id":"2_6Yz3-Agx9_rEN5xW86c","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"hWA7RtuqltMTmHdcCnmES","sourceHandle":"w2","target":"1AJv95mTLpR7L8KBoGym8","targetHandle":"x1","data":{"edgeStyle":"dashed"},"id":"kgMI98fg2-mKMgUs0wnjD","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"hWA7RtuqltMTmHdcCnmES","sourceHandle":"y2","target":"0etAs56EeBfh_0IlAaSra","targetHandle":"w1","data":{"edgeStyle":"solid"},"selected":true,"id":"ts38Q2ceHs60TJscUBZVE","focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"jZ67HhVRelJaxjsCckSSI","sourceHandle":"y2","target":"h6ceO0kiBIxNRkPzN3hBY","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"ZiMV7umyPdhy3JJDcopR-","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"jZ67HhVRelJaxjsCckSSI","sourceHandle":"y2","target":"_JlT9oKQ6Yu4UX6l19G8P","targetHandle":"z2","data":{"edgeStyle":"dashed"},"id":"WI-MhbxrehFcVwyGJ5CQJ","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"x2","target":"jZ67HhVRelJaxjsCckSSI","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"qUrLBzvXvJOg53HBfjrOI","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"hp15XdmPlKKTbYnrYfCBl","sourceHandle":"x2","target":"2TGq1y2QthnxxN-FfToSe","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-hp15XdmPlKKTbYnrYfCBlx2-Rhk7BrJqNEXQT3LGlGLM6w1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"2TGq1y2QthnxxN-FfToSe","sourceHandle":"y2","target":"OlbQNB6YXZjO1J7D0lZU1","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-Rhk7BrJqNEXQT3LGlGLM6y2-OlbQNB6YXZjO1J7D0lZU1z1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"2TGq1y2QthnxxN-FfToSe","sourceHandle":"y2","target":"5g9mmi01WeZ4aDqNzwx_V","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-Rhk7BrJqNEXQT3LGlGLM6y2-QgWalJLIb6Fw0HhN1wb02z1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"2TGq1y2QthnxxN-FfToSe","sourceHandle":"y2","target":"VBNcAO0STaZJ1iV9A7utv","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-Rhk7BrJqNEXQT3LGlGLM6y2-VBNcAO0STaZJ1iV9A7utvz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"2TGq1y2QthnxxN-FfToSe","sourceHandle":"y2","target":"yNDbk6r5wFqBi25xmIRF_","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-Rhk7BrJqNEXQT3LGlGLM6y2-yNDbk6r5wFqBi25xmIRF_z1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"2TGq1y2QthnxxN-FfToSe","sourceHandle":"z2","target":"5khApwg1FZ-0qorsLyH-F","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-Rhk7BrJqNEXQT3LGlGLM6z2-5khApwg1FZ-0qorsLyH-Fy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"2TGq1y2QthnxxN-FfToSe","sourceHandle":"z2","target":"sG_3ZQIE1-FQXQkk-OduQ","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-Rhk7BrJqNEXQT3LGlGLM6z2-sG_3ZQIE1-FQXQkk-OduQy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"2TGq1y2QthnxxN-FfToSe","sourceHandle":"z2","target":"JHUhVEjWFXTn6-wKcKevg","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-Rhk7BrJqNEXQT3LGlGLM6z2-DZ4BX4NYeCQbjGSj56lngy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"2TGq1y2QthnxxN-FfToSe","sourceHandle":"z2","target":"KcIUQ5XpOI6WTA9wrqzn3","targetHandle":"y2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-Rhk7BrJqNEXQT3LGlGLM6z2-KcIUQ5XpOI6WTA9wrqzn3y2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"2TGq1y2QthnxxN-FfToSe","sourceHandle":"z2","target":"ziD_XwzJSFQP_3iLjq9pA","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-2TGq1y2QthnxxN-FfToSez2-ziD_XwzJSFQP_3iLjq9pAy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"2TGq1y2QthnxxN-FfToSe","sourceHandle":"z2","target":"aEaBobzFWv0mJHGAbgxKY","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-2TGq1y2QthnxxN-FfToSez2-aEaBobzFWv0mJHGAbgxKYy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"2TGq1y2QthnxxN-FfToSe","sourceHandle":"y2","target":"QgWalJLIb6Fw0HhN1wb02","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-2TGq1y2QthnxxN-FfToSey2-QgWalJLIb6Fw0HhN1wb02z1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"Rhk7BrJqNEXQT3LGlGLM6","sourceHandle":"y2","target":"LenPrQwxFsE1UVbXO_dE7","targetHandle":"w2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-Rhk7BrJqNEXQT3LGlGLM6y2-LenPrQwxFsE1UVbXO_dE7w2","selected":true,"type":"simplebezier","focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"2TGq1y2QthnxxN-FfToSe","sourceHandle":"z2","target":"DZ4BX4NYeCQbjGSj56lng","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-2TGq1y2QthnxxN-FfToSez2-DZ4BX4NYeCQbjGSj56lngy1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"2TGq1y2QthnxxN-FfToSe","sourceHandle":"x2","target":"zNHDLv26Xn3oMrDVSAP1Z","targetHandle":"w2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-2TGq1y2QthnxxN-FfToSex2-zNHDLv26Xn3oMrDVSAP1Zw2","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"FyTlaUqrK5h3e5mWwkvVg","sourceHandle":"x2","target":"XUikvUeIXLl34LP6HFrAI","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-FyTlaUqrK5h3e5mWwkvVgx2-XUikvUeIXLl34LP6HFrAIw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"kdxy8Zssnc5lJjdmjUyMc","sourceHandle":"y2","target":"8n5A3GTRV3WpEnCa4yGam","targetHandle":"z1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-kdxy8Zssnc5lJjdmjUyMcy2-8n5A3GTRV3WpEnCa4yGamz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"zNHDLv26Xn3oMrDVSAP1Z","sourceHandle":"x2","target":"FyTlaUqrK5h3e5mWwkvVg","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-zNHDLv26Xn3oMrDVSAP1Zx2-FyTlaUqrK5h3e5mWwkvVgw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"zNHDLv26Xn3oMrDVSAP1Z","sourceHandle":"z2","target":"g9P3548F38tYGjevBc42w","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-zNHDLv26Xn3oMrDVSAP1Zz2-g9P3548F38tYGjevBc42ww1","selected":true,"type":"smoothstep","selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"g9P3548F38tYGjevBc42w","sourceHandle":"x2","target":"00_q6I95eO-PUUrKpPFY8","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-g9P3548F38tYGjevBc42wx2-00_q6I95eO-PUUrKpPFY8w1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"81N1cZLue_Ii0uD5CV6kZ","sourceHandle":"w2","target":"6FMj9tMAQPii_1kLtHJLk","targetHandle":"x2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-81N1cZLue_Ii0uD5CV6kZw2-6FMj9tMAQPii_1kLtHJLkx2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"zItXmuluDtl6HkTYQ7qMh","sourceHandle":"x2","target":"M0ybgK1JCycXhZ1dEpCFo","targetHandle":"w2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-zItXmuluDtl6HkTYQ7qMhx2-M0ybgK1JCycXhZ1dEpCFow2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_W84u4UXMSY0zvy6RJvFi","sourceHandle":"w2","target":"kN-mXxqUPNJNsJGQ0U_7J","targetHandle":"x1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-LgpsnXV0CTvTspjnsd0Rdw2-kN-mXxqUPNJNsJGQ0U_7Jx1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_W84u4UXMSY0zvy6RJvFi","sourceHandle":"y2","target":"81N1cZLue_Ii0uD5CV6kZ","targetHandle":"z2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-LgpsnXV0CTvTspjnsd0Rdy2-81N1cZLue_Ii0uD5CV6kZz2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"shqS9-hg__mkOtnnl_I4l","sourceHandle":"w2","target":"u_YysD7Bpnq-xkFX5yJGz","targetHandle":"x1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-JeMG0gU8IVRBZgczjXmPiw2-u_YysD7Bpnq-xkFX5yJGzx1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_W84u4UXMSY0zvy6RJvFi","sourceHandle":"z2","target":"fV-gW51jhna2__Ln2HIIh","targetHandle":"y1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-_W84u4UXMSY0zvy6RJvFiz2-LgpsnXV0CTvTspjnsd0Rdy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"fV-gW51jhna2__Ln2HIIh","sourceHandle":"w2","target":"WzWOxBUKKg6LeuBmVesc2","targetHandle":"x1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-LgpsnXV0CTvTspjnsd0Rdw2-WzWOxBUKKg6LeuBmVesc2x1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"fV-gW51jhna2__Ln2HIIh","sourceHandle":"x2","target":"d9F5Wt8onY125DLuzNULg","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-fV-gW51jhna2__Ln2HIIhx2-LgpsnXV0CTvTspjnsd0Rdw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"d9F5Wt8onY125DLuzNULg","sourceHandle":"y2","target":"LgpsnXV0CTvTspjnsd0Rd","targetHandle":"z2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-d9F5Wt8onY125DLuzNULgy2-LgpsnXV0CTvTspjnsd0Rdz2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"d9F5Wt8onY125DLuzNULg","sourceHandle":"y2","target":"d9F5Wt8onY125DLuzNULg","targetHandle":"y1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-d9F5Wt8onY125DLuzNULgy2-d9F5Wt8onY125DLuzNULgy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"KMA7NkxFbPoUDtFnGBFnj","sourceHandle":"x2","target":"0vLaVNJaJSHZ_bHli6Qzs","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-KMA7NkxFbPoUDtFnGBFnjx2-0vLaVNJaJSHZ_bHli6Qzsw1","selected":true,"type":"simplebezier","focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"DYkdM_L7T2GcTPAoZNnUR","sourceHandle":"x2","target":"0vLaVNJaJSHZ_bHli6Qzs","targetHandle":"z1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-DYkdM_L7T2GcTPAoZNnURx2-0vLaVNJaJSHZ_bHli6Qzsz1","selected":true,"type":"smoothstep","selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"LgpsnXV0CTvTspjnsd0Rd","sourceHandle":"x2","target":"0vLaVNJaJSHZ_bHli6Qzs","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-LgpsnXV0CTvTspjnsd0Rdx2-0vLaVNJaJSHZ_bHli6Qzsw1","selected":true,"selectable":true,"focusable":true}]}
\ No newline at end of file
diff --git a/src/data/roadmaps/java/java.md b/src/data/roadmaps/java/java.md
index b2a8209d1..b0931ea9d 100644
--- a/src/data/roadmaps/java/java.md
+++ b/src/data/roadmaps/java/java.md
@@ -2,6 +2,7 @@
 jsonUrl: '/jsons/roadmaps/java.json'
 pdfUrl: '/pdfs/roadmaps/java.pdf'
 order: 9
+renderer: 'editor'
 briefTitle: 'Java'
 briefDescription: 'Step by step guide to becoming a Java Developer in 2025'
 title: 'Java Developer'
@@ -9,7 +10,7 @@ description: 'Step by step guide to becoming a Java developer in 2025'
 hasTopics: true
 dimensions:
   width: 968
-  height: 1167.29
+  height: 2000
 schema:
   headline: 'Java Developer Roadmap'
   description: 'Learn how to become a Java Developer with this interactive step by step guide in 2025. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place.'
diff --git a/src/data/roadmaps/java/migration-mapping.json b/src/data/roadmaps/java/migration-mapping.json
new file mode 100644
index 000000000..0ac123433
--- /dev/null
+++ b/src/data/roadmaps/java/migration-mapping.json
@@ -0,0 +1,39 @@
+{
+  "java-fundamentals": "2TGq1y2QthnxxN-FfToSe",
+  "java-fundamentals:basic-syntax": "OlbQNB6YXZjO1J7D0lZU1",
+  "java-fundamentals:conditionals": "sG_3ZQIE1-FQXQkk-OduQ",
+  "java-fundamentals:date-time": "9h20XVRli7TDq0QIJwX2U",
+  "java-fundamentals:loops": "JHUhVEjWFXTn6-wKcKevg",
+  "java-fundamentals:exception-handling": "g9P3548F38tYGjevBc42w",
+  "java-fundamentals:data-types-variables": "5g9mmi01WeZ4aDqNzwx_V",
+  "java-fundamentals:packages": "60POZOjwHSdKYL6rfkyEy",
+  "java-fundamentals:files-and-apis": "NowpzyPVFcX082j5YS5i8",
+  "java-advanced-topics:basics-of-threads": "u_YysD7Bpnq-xkFX5yJGz",
+  "java-advanced-topics:streams": "WHxAwfdKHQSOg0TLX05EG",
+  "java-advanced-topics:networking-sockets": "JeMG0gU8IVRBZgczjXmPi",
+  "java-build-tools:gradle": "rmDIm5dqtdlNfPhvpqS7-",
+  "java-build-tools:maven": "VdL_fAHxmRbuF0J627beA",
+  "java-build-tools": "81N1cZLue_Ii0uD5CV6kZ",
+  "java-web-frameworks": "_W84u4UXMSY0zvy6RJvFi",
+  "java-web-frameworks:spring-boot": "xoryfi4SpJlkz-PV05ql6",
+  "java-web-frameworks:quarkus": "w-kcKPh8U0P_jtT90_1Xy",
+  "java-web-frameworks:play-framework": "kN-mXxqUPNJNsJGQ0U_7J",
+  "java-logging-frameworks:logback": "okC1uMdyfIJAhX_R9Npsw",
+  "java-logging-frameworks:log4j2": "sFaNj_1MviaTc6UIfjXl6",
+  "java-logging-frameworks:slf4j": "LGlZHKqyQ-aWtHnhklhgn",
+  "java-logging-frameworks:tinylog": "Fn7aAaGbwYsAp4xLuuFud",
+  "java-orm": "fV-gW51jhna2__Ln2HIIh",
+  "java-orm:spring-data-jpa": "WzWOxBUKKg6LeuBmVesc2",
+  "java-orm:hibernate": "UEiDzzodyEu5O1xFAFDly",
+  "java-orm:ebean": "X2rJ3BY1ytFKsbJqJETFu",
+  "java-jdbc": "9UbRG752qxJdUwmqEAjN3",
+  "java-logging-frameworks": "d9F5Wt8onY125DLuzNULg",
+  "testing-java-apps": "LgpsnXV0CTvTspjnsd0Rd",
+  "testing-java-apps:mocking": "mLM1HJf6_pxrUDOmb45ew",
+  "testing-java-apps:cucumber-jvm": "UFDy19TNkykRsKv4vRsVJ",
+  "testing-java-apps:junit": "hY1-sEpTmpaj1PregdkFf",
+  "testing-java-apps:testng": "XU2C8bF9ICej8LS7ZGTTv",
+  "testing-java-apps:jmeter": "U2BqOY49HaII6mKQB3SVt",
+  "testing-java-apps:rest-assured": "gB4XUR9nCdF1-dOEwGcHi",
+  "java-advanced-topics:generics": "eL4pc6SaNiKP48PzN7mNe"
+}
\ No newline at end of file
diff --git a/src/data/roadmaps/javascript/content/block@uqEzHYx13Y2EpvTTRzykn.md b/src/data/roadmaps/javascript/content/block@uqEzHYx13Y2EpvTTRzykn.md
index 8c84ada3a..211e5b8d9 100644
--- a/src/data/roadmaps/javascript/content/block@uqEzHYx13Y2EpvTTRzykn.md
+++ b/src/data/roadmaps/javascript/content/block@uqEzHYx13Y2EpvTTRzykn.md
@@ -4,5 +4,4 @@ This scope restricts the variable that is declared inside a specific block, from
 
 Visit the following resources to learn more:
 
-- [@article@JavaScript Scope](https://www.w3schools.com/js/js_scope.asp)
-- [@article@Block Scoping in JavaScript](https://www.geeksforgeeks.org/javascript-es2015-block-scoping)
+- [@article@JavaScript Scope](https://www.w3schools.com/js/js_scope.asp)
\ No newline at end of file
diff --git a/src/data/roadmaps/javascript/faqs.astro b/src/data/roadmaps/javascript/faqs.astro
index e69de29bb..2705cb2b8 100644
--- a/src/data/roadmaps/javascript/faqs.astro
+++ b/src/data/roadmaps/javascript/faqs.astro
@@ -0,0 +1,57 @@
+---
+import type { FAQType } from '../../components/FAQs/FAQs.astro';
+
+export const faqs: FAQType[] = [
+  {
+    question: 'What skills does a JavaScript developer need?',
+    answer: [
+      'A JavaScript developer needs to have a solid grasp of core JavaScript concepts to be successful because those will be the only common concepts that any framework or library they might depend on will use.',
+      'These core concepts include functions, operators, and data structures. And they should include experience with at least one JavaScript framework or core library, such as React for building interactive websites or NextJS for backends.',
+      "If their focus is back-end development, concepts such as API design and integration, data modeling, server-side rendering, and database querying are a must, as these will be part of the developer's daily tasks.",
+      "Front-end developers should also learn about web standards, the DOM API, web components (or lightning web components if you're working with the Salesforce ecosystem), and have some basic understanding of UX.",
+      'Candidates looking to prepare for JavaScript developer interview questions should include the above-mentioned topics in their study program. For that, many developers schedule their studies at their own pace through extensive documentation, online training, and roadmaps like this one to build a solid foundational knowledge base.',
+    ],
+  },
+  {
+    question: 'Is JavaScript hard to learn?',
+    answer: [
+      "JavaScript can be challenging at first, but it's not necessarily hard to learn. It has a lot of flexibility, which can be both a strength and a source of confusion. If you're new to programming, it might feel overwhelming due to the variety of ways you can do the same thing.",
+      'However, if you have some programming background, JS can be accessible due to its extensive online documentation and supportive community, which makes it easier to learn at your own pace.',
+      "As learners progress and encounter the language's continuous stream of new features (due to its constant evolution), the learning process becomes challenging and rewarding.",
+    ],
+  },
+  {
+    question: 'How much is a JavaScript developer paid?',
+    answer: [
+      'JavaScript developers are usually paid very well due to their high demand. The web industry keeps growing, and the demand for developers who can build complex experiences is even higher. This translates to companies fighting each other over JavaScript developers, which tends to increase the base salary for these roles.',
+      'That said, compensation can vary significantly based on factors such as geographical location and level of expertise. Salaries tend to be competitive in major tech hubs like New York and San Francisco, and experienced professionals or certified JavaScript developers with extensive knowledge of JavaScript frameworks often require higher pay.',
+      "As a basis for comparison, according to sites such as Glassdoors, an average JavaScript developer earns 70,000 USD in the United States at an entry level (about 1 year of experience). Someone who's more experienced (10+ years of experience), however, can take that number to 110,000 USD on average.",
+      "In the end, it depends on the company and how much they're willing to pay, as well as on your negotiation skills.",
+    ],
+  },
+  {
+    question: 'How is JavaScript different from Java?',
+    answer: [
+      'JavaScript is very different from Java, despite the similarity in their names. This is because JavaScript and Java are fundamentally different languages. JavaScript is a dynamically typed language that favors a mixed programming model between procedural and functional programming with some sprinkles of OOP, while Java is a statically typed, object-oriented language.',
+      'JavaScript usually runs in browsers or server environments like Node.js, whereas Java is commonly used in desktop and server-side applications requiring the Java Virtual Machine (JVM) to be executed.',
+      "These differences extend to the languages' design philosophies and learning curves, with JavaScript emphasizing dynamic content creation through flexible tools and data structures.",
+    ],
+  },
+  {
+    question: 'How is JavaScript different from PHP?',
+    answer: [
+      'JavaScript is very different from PHP because it serves a different role within the web development ecosystem.',
+      'JavaScript can be used both by front-end developers to create interactive elements and on the back-end to code business logic, while PHP is a server-side-only scripting language that manages backend logic.',
+      'Developers can use a combination of the two to build web applications that blend interactive design (thanks to JavaScript) with robust server-side functionality (thanks to PHP).',
+    ],
+  },
+  {
+    question: 'How is JavaScript different from TypeScript?',
+    answer: [
+      'JavaScript is different from TypeScript because TS is a superset of JavaScript. In other words, TypeScript enhances the language by adding new features that tend to align with the expectations of many developers (especially those coming from other languages like Java).',
+      'Although TypeScript introduces additional layers of explicit documentation and data type definitions, it also builds on the core principles of JavaScript (so at its core, it feels like JavaScript and is compatible with it). At the end of the day, they can both be used to build interactive web applications.',
+      'Many certified JavaScript developers and front end experts choose TypeScript for its ability to produce more robust and maintainable code while still relying on the flexible and innovative features that make JavaScript the de facto tool for web developers.',
+    ],
+  },
+];
+---
diff --git a/src/data/roadmaps/javascript/javascript.md b/src/data/roadmaps/javascript/javascript.md
index 56b1de536..d02b2f426 100644
--- a/src/data/roadmaps/javascript/javascript.md
+++ b/src/data/roadmaps/javascript/javascript.md
@@ -18,6 +18,20 @@ schema:
   imageUrl: 'https://roadmap.sh/roadmaps/javascript.png'
   datePublished: '2023-01-05'
   dateModified: '2023-01-20'
+question:
+  title: 'What is JavaScript?'
+  description: |
+    JavaScript is a very flexible and versatile programming language, considered as a core technology for web development. This is because it is the only language natively supported by all browsers, allowing developers to add dynamic behavior and create complex user experiences with this language. 
+    
+    Because of its flexibility and portability, JavaScript is also widely used for back-end development (thanks to runtimes such as Node.js, Bun, and Deno) and even server-side scripting (for automation and for creating developer tools).
+    
+    ## What does a JavaScript developer do?
+    
+    A JavaScript developer writes and maintains code to build interactive web applications, back-end logic (usually RESTful APIs), or some automation work. 
+    
+    If they're focused on front-end development, their work usually involves designing dynamic user interfaces and integrating them with REST APIs (usually) to connect with back-end systems.
+    
+    If, on the other hand, they're focused on back-end development, then most likely, they're spending most of their time developing APIs using a back-end framework like NextJS.
 seo:
   title: 'JavaScript Developer Roadmap: Step by step guide to learn JavaScript'
   description: 'Community driven, articles, resources, guides, interview questions, quizzes for javascript development. Learn to become a modern JavaScript developer by following the steps, skills, resources and guides listed in this roadmap.'
diff --git a/src/data/roadmaps/kubernetes/content/106-resource-management/index.md b/src/data/roadmaps/kubernetes/content/106-resource-management/index.md
index 903183a4c..7655cf28e 100644
--- a/src/data/roadmaps/kubernetes/content/106-resource-management/index.md
+++ b/src/data/roadmaps/kubernetes/content/106-resource-management/index.md
@@ -6,3 +6,4 @@ Learn more from the following links:
 
 - [@official@Managing Resources - Documentation](https://kubernetes.io/docs/concepts/cluster-administration/manage-deployment/)
 - [@article@Managing Kubernetes resources: 5 things to remember](https://enterprisersproject.com/article/2020/8/managing-kubernetes-resources-5-things-remember)
+- [@video@Resource Management in Kubernetes](https://www.youtube.com/watch?v=MbgFIQoVh6w)
diff --git a/src/data/roadmaps/linux/content/103-working-with-files/103-soft-hard-links.md b/src/data/roadmaps/linux/content/103-working-with-files/103-soft-hard-links.md
index 331942130..5e3030a94 100644
--- a/src/data/roadmaps/linux/content/103-working-with-files/103-soft-hard-links.md
+++ b/src/data/roadmaps/linux/content/103-working-with-files/103-soft-hard-links.md
@@ -16,4 +16,8 @@ ln source_file.txt hard_link.txt
 ln -s source_file.txt soft_link.txt
 ```
 
-Please, understand that `source_file.txt` is the original file and `hard_link.txt` & `soft_link.txt` are the hard and soft links respectively.
\ No newline at end of file
+Please, understand that `source_file.txt` is the original file and `hard_link.txt` & `soft_link.txt` are the hard and soft links respectively.
+
+Learn more from the following resources:
+
+- [@article@How to understand the difference between hard and symbolic links in Linux](https://labex.io/tutorials/linux-how-to-understand-the-difference-between-hard-and-symbolic-links-in-linux-409929)
diff --git a/src/data/roadmaps/linux/content/108-service-management/index.md b/src/data/roadmaps/linux/content/108-service-management/index.md
index eb2ff48e3..af909f075 100644
--- a/src/data/roadmaps/linux/content/108-service-management/index.md
+++ b/src/data/roadmaps/linux/content/108-service-management/index.md
@@ -16,4 +16,8 @@ sudo systemctl start sshd
 sudo systemctl status sshd
 ```
 
-Managing services is a key skill in Linux system administration and essential for maintaining a secure and stable system.
\ No newline at end of file
+Managing services is a key skill in Linux system administration and essential for maintaining a secure and stable system.
+
+Learn more from the following resources:
+
+- [@article@How to Master Linux Service Management with Systemctl](https://labex.io/tutorials/linux-how-to-master-linux-service-management-with-systemctl-392864)
diff --git a/src/data/roadmaps/mongodb/content/108-developer-tools/101-mongodb-connectors/100-kafka.md b/src/data/roadmaps/mongodb/content/108-developer-tools/101-mongodb-connectors/100-kafka.md
index eb268c05f..f3e712daa 100644
--- a/src/data/roadmaps/mongodb/content/108-developer-tools/101-mongodb-connectors/100-kafka.md
+++ b/src/data/roadmaps/mongodb/content/108-developer-tools/101-mongodb-connectors/100-kafka.md
@@ -25,7 +25,7 @@ The MongoDB Sink Connector enables the transfer of data from a Kafka topic to Mo
 
 To get started with MongoDB Kafka connectors, you can follow these steps:
 
-- Download and install [Apache Kafka](https://kafka.apache.org/downloads) and [MongoDB Kafka Connector](https://www.confluent.io/hub/mongodb/mongo-kafka-connect).
+- Download and install [Apache Kafka](https://kafka.apache.org/downloads) and [MongoDB Kafka Connector](https://www.confluent.io/hub/mongodb/kafka-connect-mongodb).
 - Configure your source/sink connector properties.
 - Start the Kafka connect runtime with the MongoDB connector.
 - Verify that your data is being transferred between Kafka and MongoDB as per your requirement.
diff --git a/src/data/roadmaps/nodejs/content/--watch@812bVEzxwTsYzLG_PmLqN.md b/src/data/roadmaps/nodejs/content/--watch@812bVEzxwTsYzLG_PmLqN.md
index 478e4cbe9..cec1eab7e 100644
--- a/src/data/roadmaps/nodejs/content/--watch@812bVEzxwTsYzLG_PmLqN.md
+++ b/src/data/roadmaps/nodejs/content/--watch@812bVEzxwTsYzLG_PmLqN.md
@@ -2,7 +2,7 @@
 
 The `--watch` flag in Node.js is a powerful feature introduced in Node.js version 19 that enables automatic reloading of your Node.js application whenever changes are detected in the specified files.
 
-## How it works
+Here's How it works:
 
 - You run your Node.js script with the `--watch` flag: `$ node --watch your_script.js`
 - Node.js starts watching the specified file (or directory) for changes.
@@ -10,6 +10,6 @@ The `--watch` flag in Node.js is a powerful feature introduced in Node.js versio
 
 Visit the following resources to learn more:
 
-- [@official@Official Docs](https://nodejs.org/api/cli.html)
-- [@official@Node.js API Docs](https://nodejs.org/api/cli.html#--watch)
+- [@official@Node.js CLI](https://nodejs.org/api/cli.html)
+- [@official@Node.js --watch Docs](https://nodejs.org/api/cli.html#--watch)
 - [@article@Medium - Watch Mode](https://medium.com/@khaled.smq/built-in-nodejs-watch-mode-52ffadaec8a8)
diff --git a/src/data/roadmaps/nodejs/content/__dirname@1AaGG660rvZlNYMOA35qO.md b/src/data/roadmaps/nodejs/content/__dirname@1AaGG660rvZlNYMOA35qO.md
index 2bc57c13d..aedc7c9d5 100644
--- a/src/data/roadmaps/nodejs/content/__dirname@1AaGG660rvZlNYMOA35qO.md
+++ b/src/data/roadmaps/nodejs/content/__dirname@1AaGG660rvZlNYMOA35qO.md
@@ -4,5 +4,5 @@ The `__dirname` in a node script returns the path of the folder where the curren
 
 Visit the following resources to learn more:
 
-- [@official@Official Website](https://nodejs.org/docs/latest/api/modules.html#__dirname)
+- [@official@\_\_dirname](https://nodejs.org/docs/latest/api/modules.html#__dirname)
 - [@article@How to use \_\_dirname](https://www.digitalocean.com/community/tutorials/nodejs-how-to-use__dirname)
diff --git a/src/data/roadmaps/nodejs/content/__filename@P2gdwx1qCxvg1Ppfw0aqQ.md b/src/data/roadmaps/nodejs/content/__filename@P2gdwx1qCxvg1Ppfw0aqQ.md
index c66b7d9fb..b685da588 100644
--- a/src/data/roadmaps/nodejs/content/__filename@P2gdwx1qCxvg1Ppfw0aqQ.md
+++ b/src/data/roadmaps/nodejs/content/__filename@P2gdwx1qCxvg1Ppfw0aqQ.md
@@ -4,4 +4,4 @@ The `__filename` in Node.js returns the filename of the executed code. It gives
 
 Visit the following resources to learn more:
 
-- [@official@Official Docs](https://nodejs.org/docs/latest/api/modules.html#__filename)
+- [@official@\_\_filename](https://nodejs.org/docs/latest/api/modules.html#__filename)
diff --git a/src/data/roadmaps/nodejs/content/async-programming@uE7fvHSTSdebMf5RsNyaY.md b/src/data/roadmaps/nodejs/content/async-programming@uE7fvHSTSdebMf5RsNyaY.md
index 720ca0267..75f3411f4 100644
--- a/src/data/roadmaps/nodejs/content/async-programming@uE7fvHSTSdebMf5RsNyaY.md
+++ b/src/data/roadmaps/nodejs/content/async-programming@uE7fvHSTSdebMf5RsNyaY.md
@@ -1,4 +1,4 @@
-# Nodejs async programming
+# Async Programming
 
 Asynchronous code means that things can happen independently of the main program flow, async functions in JavaScript are processed in the background without blocking other requests. It ensures non-blocking code execution. Asynchronous code executes without having any dependency and no order. This improves the system efficiency and throughput. Making web apps requires knowledge of asynchronous concepts since we will be dealing with actions that require some time to get processed.
 
diff --git a/src/data/roadmaps/nodejs/content/axios@BOLiZg8YDKADMwP01U5ph.md b/src/data/roadmaps/nodejs/content/axios@BOLiZg8YDKADMwP01U5ph.md
index 69d4a3904..8a72844dc 100644
--- a/src/data/roadmaps/nodejs/content/axios@BOLiZg8YDKADMwP01U5ph.md
+++ b/src/data/roadmaps/nodejs/content/axios@BOLiZg8YDKADMwP01U5ph.md
@@ -4,6 +4,6 @@ Axios is a promise-based HTTP Client for node.js and the browser. Used for makin
 
 Visit the following resources to learn more:
 
-- [@article@Axios Official Documentation](https://axios-http.com/docs/intro)
+- [@official@Axios Documentation](https://axios-http.com/docs/intro)
 - [@video@Axios Tutorial](https://www.youtube.com/watch?v=6LyagkoRWYA)
 - [@feed@Explore top posts about Axios](https://app.daily.dev/tags/axios?ref=roadmapsh)
diff --git a/src/data/roadmaps/nodejs/content/callbacks@GwInWcbQn18PnzKGXzmln.md b/src/data/roadmaps/nodejs/content/callbacks@GwInWcbQn18PnzKGXzmln.md
index c3a2cfd8d..277a226a4 100644
--- a/src/data/roadmaps/nodejs/content/callbacks@GwInWcbQn18PnzKGXzmln.md
+++ b/src/data/roadmaps/nodejs/content/callbacks@GwInWcbQn18PnzKGXzmln.md
@@ -4,5 +4,5 @@ Node.js, being an asynchronous platform, doesn't wait around for things like fil
 
 Visit the following resources to learn more:
 
-- [@article@What are callbacks?](https://developer.mozilla.org/en-US/docs/Glossary/Callback_function)
 - [@official@Asynchronicity in Programming Languages](https://nodejs.org/en/learn/asynchronous-work/javascript-asynchronous-programming-and-callbacks)
+- [@article@What are Callbacks?](https://developer.mozilla.org/en-US/docs/Glossary/Callback_function)
diff --git a/src/data/roadmaps/nodejs/content/chokidar@een1zhvgN_33Cu6OiWtyX.md b/src/data/roadmaps/nodejs/content/chokidar@een1zhvgN_33Cu6OiWtyX.md
index 504621b53..aea8be651 100644
--- a/src/data/roadmaps/nodejs/content/chokidar@een1zhvgN_33Cu6OiWtyX.md
+++ b/src/data/roadmaps/nodejs/content/chokidar@een1zhvgN_33Cu6OiWtyX.md
@@ -4,4 +4,4 @@ Chokidar is a fast open-source file watcher for node. js. You give it a bunch of
 
 Visit the following resources to learn more:
 
-- [@official@NPM Docs](https://www.npmjs.com/package/chokidar)
+- [@official@chokidar package](https://www.npmjs.com/package/chokidar)
diff --git a/src/data/roadmaps/nodejs/content/commander@BxxLQUI7JcQgF6TK3L5uU.md b/src/data/roadmaps/nodejs/content/commander@BxxLQUI7JcQgF6TK3L5uU.md
index a0ba1ce5b..b3594b6b7 100644
--- a/src/data/roadmaps/nodejs/content/commander@BxxLQUI7JcQgF6TK3L5uU.md
+++ b/src/data/roadmaps/nodejs/content/commander@BxxLQUI7JcQgF6TK3L5uU.md
@@ -4,5 +4,5 @@ Commander is a light-weight, expressive, and powerful command-line framework for
 
 Visit the following resources to learn more:
 
-- [@official@Official Documentation](https://www.npmjs.com/package/commander)
+- [@official@commander package](https://www.npmjs.com/package/commander)
 - [@feed@Explore top posts about JavaScript](https://app.daily.dev/tags/javascript?ref=roadmapsh)
diff --git a/src/data/roadmaps/nodejs/content/common-built-in-modules@M62lAWBOrTe99TfpFOQ-Y.md b/src/data/roadmaps/nodejs/content/common-built-in-modules@M62lAWBOrTe99TfpFOQ-Y.md
index 73f8d2c0f..a5317fb7d 100644
--- a/src/data/roadmaps/nodejs/content/common-built-in-modules@M62lAWBOrTe99TfpFOQ-Y.md
+++ b/src/data/roadmaps/nodejs/content/common-built-in-modules@M62lAWBOrTe99TfpFOQ-Y.md
@@ -4,13 +4,13 @@ These are the core modules that come with `Node.js` out of the box. This module
 
 Learn more from the following resources:
 
-- [@official@Nodejs fs module](https://nodejs.org/api/fs.html)
-- [@official@Nodejs url module](https://nodejs.org/api/url.html)
-- [@official@Nodejs console module](https://nodejs.org/api/console.html)
-- [@official@Nodejs util module](https://nodejs.org/api/util.html)
-- [@official@Nodejs events module](https://nodejs.org/api/events.html)
-- [@official@Nodejs os module](https://nodejs.org/api/os.html)
-- [@official@Nodejs worker threads module](https://nodejs.org/api/worker_threads.html)
-- [@official@Nodejs child process module](https://nodejs.org/api/child_process.html)
-- [@official@Nodejs process object](https://nodejs.org/api/process.html)
-- [@official@Nodejs crypto module](https://nodejs.org/api/crypto.html)
\ No newline at end of file
+- [@official@fs module](https://nodejs.org/api/fs.html)
+- [@official@url module](https://nodejs.org/api/url.html)
+- [@official@console module](https://nodejs.org/api/console.html)
+- [@official@util module](https://nodejs.org/api/util.html)
+- [@official@events module](https://nodejs.org/api/events.html)
+- [@official@os module](https://nodejs.org/api/os.html)
+- [@official@worker threads module](https://nodejs.org/api/worker_threads.html)
+- [@official@child process module](https://nodejs.org/api/child_process.html)
+- [@official@process object](https://nodejs.org/api/process.html)
+- [@official@crypto module](https://nodejs.org/api/crypto.html)
\ No newline at end of file
diff --git a/src/data/roadmaps/nodejs/content/cypress@3Fh3-V1kCZtlUTvEoloIO.md b/src/data/roadmaps/nodejs/content/cypress@3Fh3-V1kCZtlUTvEoloIO.md
index 50cebc952..24fbfa76e 100644
--- a/src/data/roadmaps/nodejs/content/cypress@3Fh3-V1kCZtlUTvEoloIO.md
+++ b/src/data/roadmaps/nodejs/content/cypress@3Fh3-V1kCZtlUTvEoloIO.md
@@ -4,6 +4,6 @@ Cypress is a new front end testing tool built for the modern web. It enables you
 
 Visit the following resources to learn more:
 
-- [@official@Cypress Website](https://www.cypress.io/)
+- [@official@Cypress](https://www.cypress.io/)
 - [@article@Cypress Documentation](https://docs.cypress.io/)
 - [@feed@Explore top posts about Cypress](https://app.daily.dev/tags/cypress?ref=roadmapsh)
diff --git a/src/data/roadmaps/nodejs/content/debugging@ZLNUuDKhJ03Kw7xMVc7IR.md b/src/data/roadmaps/nodejs/content/debugging@ZLNUuDKhJ03Kw7xMVc7IR.md
index 5ea20965b..97d9f9b81 100644
--- a/src/data/roadmaps/nodejs/content/debugging@ZLNUuDKhJ03Kw7xMVc7IR.md
+++ b/src/data/roadmaps/nodejs/content/debugging@ZLNUuDKhJ03Kw7xMVc7IR.md
@@ -2,7 +2,7 @@
 
 Debugging is a concept to identify and remove errors from software applications. Here, we will learn about the technique to debug a Node.js application.
 
-## Why not to use console.log() for debugging?
+Why not to use `console.log()` for debugging?
 
 Using `console.log` to debug the code generally dives into an infinite loop of “stopping the app and adding a console.log, and start the app again” operations. Besides slowing down the development of the app, it also makes the writing dirty and creates unnecessary code. Finally, trying to log out variables alongside with the noise of other potential logging operations, may make the process of debugging difficult when attempting to find the values you are debugging.
 
diff --git a/src/data/roadmaps/nodejs/content/drizzle@JXQF9H4_N0rM7ZDKcCZNn.md b/src/data/roadmaps/nodejs/content/drizzle@JXQF9H4_N0rM7ZDKcCZNn.md
index 8f66be028..4c438a471 100644
--- a/src/data/roadmaps/nodejs/content/drizzle@JXQF9H4_N0rM7ZDKcCZNn.md
+++ b/src/data/roadmaps/nodejs/content/drizzle@JXQF9H4_N0rM7ZDKcCZNn.md
@@ -4,7 +4,7 @@ Drizzle lets you build your project the way you want, without interfering with y
 
 Visit the following resources to learn more:
 
-- [@official@Drizzle Website](https://orm.drizzle.team/)
+- [@official@Drizzle](https://orm.drizzle.team/)
 - [@official@Drizzle Documentation](https://orm.drizzle.team/docs/overview)
 - [@opensource@Drizzle Github](https://github.com/drizzle-team/drizzle-orm)
 - [@article@Getting Started with Drizzle](https://dev.to/franciscomendes10866/getting-started-with-drizzle-orm-a-beginners-tutorial-4782)
diff --git a/src/data/roadmaps/nodejs/content/ejs@L-_N7OxxuHCXsdWYBgZGu.md b/src/data/roadmaps/nodejs/content/ejs@L-_N7OxxuHCXsdWYBgZGu.md
index 8c41b881c..c438418b4 100644
--- a/src/data/roadmaps/nodejs/content/ejs@L-_N7OxxuHCXsdWYBgZGu.md
+++ b/src/data/roadmaps/nodejs/content/ejs@L-_N7OxxuHCXsdWYBgZGu.md
@@ -5,9 +5,9 @@ In simple words, the EJS template engine helps to easily embed JavaScript into y
 
 Visit the following resources to learn more:
 
-- [@official@EJS Website](https://ejs.co/)
-- [@official@EJS Official Documentation](https://ejs.co/#docs)
-- [@official@EJS Official Package](https://www.npmjs.com/package/ejs)
+- [@official@EJS](https://ejs.co/)
+- [@official@EJS Documentation](https://ejs.co/#docs)
+- [@official@EJS Package](https://www.npmjs.com/package/ejs)
 - [@article@Try EJS Online](https://ionicabizau.github.io/ejs-playground/)
 - [@article@How to use EJS](https://www.digitalocean.com/community/tutorials/how-to-use-ejs-to-template-your-node-application)
 - [@article@Step-by-Step EJS Guide](https://codeforgeek.com/ejs-template-engine-in-nodejs/)
diff --git a/src/data/roadmaps/nodejs/content/esm@mKccfWOhC1Aj4VnaOqryA.md b/src/data/roadmaps/nodejs/content/esm@mKccfWOhC1Aj4VnaOqryA.md
index 52db24b45..eb09309bc 100644
--- a/src/data/roadmaps/nodejs/content/esm@mKccfWOhC1Aj4VnaOqryA.md
+++ b/src/data/roadmaps/nodejs/content/esm@mKccfWOhC1Aj4VnaOqryA.md
@@ -4,4 +4,4 @@ ESM (ECMAScript Modules) is a standardized module system in JavaScript that allo
 
 Visit the following resources to learn more:
 
-- [@article@esm documentation on nodejs org](https://nodejs.org/api/esm.html)
+- [@official@ESM Documentation](https://nodejs.org/api/esm.html)
diff --git a/src/data/roadmaps/nodejs/content/exitting--exit-codes@XteNExIZN3_g95_dPCopY.md b/src/data/roadmaps/nodejs/content/exitting--exit-codes@XteNExIZN3_g95_dPCopY.md
index 91f4c0bdc..fee6ebf2a 100644
--- a/src/data/roadmaps/nodejs/content/exitting--exit-codes@XteNExIZN3_g95_dPCopY.md
+++ b/src/data/roadmaps/nodejs/content/exitting--exit-codes@XteNExIZN3_g95_dPCopY.md
@@ -1,8 +1,8 @@
 # Exiting and exit codes
 
-`Exiting` is a way of terminating a Node.js process by using node.js process module.
+Exiting is a way of terminating a Node.js process by using node.js process module.
 
 Visit the following resources to learn more:
 
-- [@official@Node.js Docs on exit](https://nodejs.org/docs/latest/api/process.html)
-- [@article@How to Exit a Process in Node.js](https://www.knowledgehut.com/blog/web-development/node-js-process-exit)
+- [@official@Exit Documentation](https://nodejs.org/api/process.html#event-exit)
+- [@article@How to Exit a Process in Node.js](https://betterstack.com/community/questions/how-to-exit-in-node-js/)
diff --git a/src/data/roadmaps/nodejs/content/expressjs@1vq_KcYR_pkfp1MtXaL75.md b/src/data/roadmaps/nodejs/content/expressjs@1vq_KcYR_pkfp1MtXaL75.md
index 91754c849..2f5c5cddd 100644
--- a/src/data/roadmaps/nodejs/content/expressjs@1vq_KcYR_pkfp1MtXaL75.md
+++ b/src/data/roadmaps/nodejs/content/expressjs@1vq_KcYR_pkfp1MtXaL75.md
@@ -4,8 +4,8 @@ Express is a node js web application framework that provides broad features for
 
 Visit the following resources to learn more:
 
-- [@official@Express.js Official Website](https://expressjs.com/)
-- [@official@Official Getting Started Guide](https://expressjs.com/en/starter/installing.html)
+- [@official@Express.js](https://expressjs.com/)
+- [@official@Getting Started Guide](https://expressjs.com/en/starter/installing.html)
 - [@article@Express Full Guide](https://www.tutorialspoint.com/nodejs/nodejs_express_framework.htm)
 - [@article@Sample Project](https://auth0.com/blog/create-a-simple-and-stylish-node-express-app/)
 - [@feed@Explore top posts about Express.js](https://app.daily.dev/tags/express?ref=roadmapsh)
diff --git a/src/data/roadmaps/nodejs/content/fastify@WkU_rI4i-UmNSxb5F9TI-.md b/src/data/roadmaps/nodejs/content/fastify@WkU_rI4i-UmNSxb5F9TI-.md
index b3b2f2f89..b4c90e7ca 100644
--- a/src/data/roadmaps/nodejs/content/fastify@WkU_rI4i-UmNSxb5F9TI-.md
+++ b/src/data/roadmaps/nodejs/content/fastify@WkU_rI4i-UmNSxb5F9TI-.md
@@ -4,7 +4,7 @@ Fastify is a web framework highly focused on providing the best developer experi
 
 Visit the following resources to learn more:
 
-- [@official@Fastify Website](https://www.fastify.io/)
-- [@official@Fastify Official Documentations](https://www.fastify.io/docs/latest/)
+- [@official@Fastify](https://www.fastify.io/)
+- [@official@Fastify Documentations](https://www.fastify.io/docs/latest/)
 - [@video@Beginner Fastify Tutorial](https://www.youtube.com/watch?v=Lk-uVEVGxOA)
 - [@feed@Explore top posts about Fastify](https://app.daily.dev/tags/fastify?ref=roadmapsh)
diff --git a/src/data/roadmaps/nodejs/content/figlet-package@PHLdJylzNZDJBGi8FFsfO.md b/src/data/roadmaps/nodejs/content/figlet-package@PHLdJylzNZDJBGi8FFsfO.md
index 330915569..d02fb1c0d 100644
--- a/src/data/roadmaps/nodejs/content/figlet-package@PHLdJylzNZDJBGi8FFsfO.md
+++ b/src/data/roadmaps/nodejs/content/figlet-package@PHLdJylzNZDJBGi8FFsfO.md
@@ -4,4 +4,4 @@ This package aims to fully implement the FIGfont spec in JavaScript, which repre
 
 Visit the following resources to learn more:
 
-- [@opensource@GitHub Repository](https://github.com/patorjk/figlet.js)
+- [@opensource@figlet](https://github.com/patorjk/figlet.js)
diff --git a/src/data/roadmaps/nodejs/content/fs-extra@zDmWGRrgwq3Gjfkyk6crK.md b/src/data/roadmaps/nodejs/content/fs-extra@zDmWGRrgwq3Gjfkyk6crK.md
index d94383967..cacb65b39 100644
--- a/src/data/roadmaps/nodejs/content/fs-extra@zDmWGRrgwq3Gjfkyk6crK.md
+++ b/src/data/roadmaps/nodejs/content/fs-extra@zDmWGRrgwq3Gjfkyk6crK.md
@@ -4,5 +4,5 @@ fs-extra adds file system methods that aren't included in the native fs module a
 
 Visit the following resources to learn more:
 
-- [@official@Official Website](https://www.npmjs.com/package/fs-extra)
+- [@official@fs-extra package](https://www.npmjs.com/package/fs-extra)
 - [@article@fs-extra vs fs](https://ar.al/2021/03/07/fs-extra-to-fs/)
diff --git a/src/data/roadmaps/nodejs/content/fs-module@b1r1X3XCoPSayQjDBcy54.md b/src/data/roadmaps/nodejs/content/fs-module@b1r1X3XCoPSayQjDBcy54.md
index 338939259..21ec2fc24 100644
--- a/src/data/roadmaps/nodejs/content/fs-module@b1r1X3XCoPSayQjDBcy54.md
+++ b/src/data/roadmaps/nodejs/content/fs-module@b1r1X3XCoPSayQjDBcy54.md
@@ -4,6 +4,6 @@ File System or `fs` module is a built in module in Node that enables interacting
 
 Visit the following resources to learn more:
 
-- [@official@Official Documentation](https://nodejs.org/api/fs.html)
+- [@official@fs](https://nodejs.org/api/fs.html)
 - [@article@More about fs module](https://www.w3schools.com/nodejs/nodejs_filesystem.asp)
 - [@video@Using fs](https://www.youtube.com/watch?v=ZySsdm576wE)
diff --git a/src/data/roadmaps/nodejs/content/got-package@6stiDKubT6XVAOGiJ6wsx.md b/src/data/roadmaps/nodejs/content/got-package@6stiDKubT6XVAOGiJ6wsx.md
index 42e9e2148..ae34d48a2 100644
--- a/src/data/roadmaps/nodejs/content/got-package@6stiDKubT6XVAOGiJ6wsx.md
+++ b/src/data/roadmaps/nodejs/content/got-package@6stiDKubT6XVAOGiJ6wsx.md
@@ -4,5 +4,5 @@ Got is a lighter, human-friendly, and powerful HTTP request library explicitly d
 
 Visit the following resources to learn more:
 
-- [@official@Official Documentation](https://www.npmjs.com/package/got)
+- [@official@Got Documentation](https://www.npmjs.com/package/got)
 - [@article@How to consume APIs using GOT in Node.js?](https://rapidapi.com/guides/call-apis-got)
diff --git a/src/data/roadmaps/nodejs/content/history-of-nodejs@Vrcv5px-3fqmyJnQv3WBK.md b/src/data/roadmaps/nodejs/content/history-of-nodejs@Vrcv5px-3fqmyJnQv3WBK.md
index 2fccaa9a0..1f8049a25 100644
--- a/src/data/roadmaps/nodejs/content/history-of-nodejs@Vrcv5px-3fqmyJnQv3WBK.md
+++ b/src/data/roadmaps/nodejs/content/history-of-nodejs@Vrcv5px-3fqmyJnQv3WBK.md
@@ -6,5 +6,5 @@ Visit the following resources to learn more:
 
 - [@article@Rising Stack - History of Node.js on a Timeline](https://blog.risingstack.com/history-of-node-js/)
 - [@article@SAP Press - How Did Node.js Come About?](https://blog.sap-press.com/how-did-node.js-come-about)
-- [@video@Node.js: The Documentary | An origin story](https://youtu.be/LB8KwiiUGy0)
+- [@video@Node.js: The Documentary | An Origin Story](https://youtu.be/LB8KwiiUGy0)
 - [@feed@Explore top posts about Node.js](https://app.daily.dev/tags/nodejs?ref=roadmapsh)
diff --git a/src/data/roadmaps/nodejs/content/hono@Xa-lA1wbZ9JZ_XpXfhhw5.md b/src/data/roadmaps/nodejs/content/hono@Xa-lA1wbZ9JZ_XpXfhhw5.md
index dcb3b84f8..7da06aaf2 100644
--- a/src/data/roadmaps/nodejs/content/hono@Xa-lA1wbZ9JZ_XpXfhhw5.md
+++ b/src/data/roadmaps/nodejs/content/hono@Xa-lA1wbZ9JZ_XpXfhhw5.md
@@ -4,5 +4,5 @@ Hono is a lightweight, simple, and fast web framework for Cloudflare Workers, De
 
 Visit the following resources to learn more:
 
-- [@article@Hono Official Documentations](https://hono.dev/docs/)
+- [@official@Hono Documentation](https://hono.dev/docs/)
 - [@article@Build a web application with Hono](https://blog.logrocket.com/build-web-application-hono/)
diff --git a/src/data/roadmaps/nodejs/content/http-module@Sjc1YDtbzXyLQH711_3nj.md b/src/data/roadmaps/nodejs/content/http-module@Sjc1YDtbzXyLQH711_3nj.md
index 050ac1c9e..fc40c9c62 100644
--- a/src/data/roadmaps/nodejs/content/http-module@Sjc1YDtbzXyLQH711_3nj.md
+++ b/src/data/roadmaps/nodejs/content/http-module@Sjc1YDtbzXyLQH711_3nj.md
@@ -8,5 +8,5 @@ You can make API calls using the `http` module in Node.js as well. Here are the
 Visit the following resources to learn more:
 
 - [@official@Node.js `http.get()` documentation](https://nodejs.org/docs/latest-v16.x/api/http.html#httpgeturl-options-callback)
-- [@official@Node `http.request()` documentation](https://nodejs.org/docs/latest-v16.x/api/http.html#httprequesturl-options-callback)
+- [@official@Node.js `http.request()` documentation](https://nodejs.org/docs/latest-v16.x/api/http.html#httprequesturl-options-callback)
 - [@article@How To Create an HTTP Client with Core HTTP in Node.js](https://www.digitalocean.com/community/tutorials/how-to-create-an-http-client-with-core-http-in-node-js)
diff --git a/src/data/roadmaps/nodejs/content/inquirer-package@WFJJtIqVoBIhK10XY-d7l.md b/src/data/roadmaps/nodejs/content/inquirer-package@WFJJtIqVoBIhK10XY-d7l.md
index 9ae2118fd..392c094ec 100644
--- a/src/data/roadmaps/nodejs/content/inquirer-package@WFJJtIqVoBIhK10XY-d7l.md
+++ b/src/data/roadmaps/nodejs/content/inquirer-package@WFJJtIqVoBIhK10XY-d7l.md
@@ -7,6 +7,6 @@ You can use it to empower your terminal applications that need user input or to
 
 Visit the following resources to learn more:
 
-- [@opensource@Official Docs](https://github.com/SBoudrias/Inquirer.js#readme)
+- [@opensource@Inquirer](https://github.com/SBoudrias/Inquirer.js#readme)
 - [@article@How To Create Interactive Command-line Prompts with Inquirer.js](https://www.digitalocean.com/community/tutorials/nodejs-interactive-command-line-prompts)
 - [@video@How to make a CLI in Node.js with Inquirer](https://www.youtube.com/watch?v=0xjfkl9nODQ)
diff --git a/src/data/roadmaps/nodejs/content/introduction-to-nodejs@KDd40JOAvZ8O1mfhTYB3K.md b/src/data/roadmaps/nodejs/content/introduction-to-nodejs@KDd40JOAvZ8O1mfhTYB3K.md
index ae9eaf9e4..102e93c45 100644
--- a/src/data/roadmaps/nodejs/content/introduction-to-nodejs@KDd40JOAvZ8O1mfhTYB3K.md
+++ b/src/data/roadmaps/nodejs/content/introduction-to-nodejs@KDd40JOAvZ8O1mfhTYB3K.md
@@ -6,6 +6,6 @@ It is used for server-side programming, and primarily deployed for non-blocking,
 
 Visit the following resources to learn more:
 
-- [@official@Official Website](https://nodejs.org/en/)
-- [@official@Official Documentation](https://nodejs.org/en/docs/)
+- [@official@Node.js](https://nodejs.org/en/)
+- [@official@Node.js Documentation](https://nodejs.org/en/docs/)
 - [@feed@Explore top posts about Node.js](https://app.daily.dev/tags/nodejs?ref=roadmapsh)
diff --git a/src/data/roadmaps/nodejs/content/jest@5xrbKv2stKPJRv7Vzf9nM.md b/src/data/roadmaps/nodejs/content/jest@5xrbKv2stKPJRv7Vzf9nM.md
index 49b9f3cc8..a55b08e55 100644
--- a/src/data/roadmaps/nodejs/content/jest@5xrbKv2stKPJRv7Vzf9nM.md
+++ b/src/data/roadmaps/nodejs/content/jest@5xrbKv2stKPJRv7Vzf9nM.md
@@ -4,6 +4,6 @@ Jest is a delightful JavaScript Testing Framework with a focus on simplicity. It
 
 Visit the following resources to learn more:
 
-- [@official@Jest Website](https://jestjs.io)
-- [@article@Jest Documentation](https://jestjs.io/docs/getting-started)
+- [@official@Jest](https://jestjs.io)
+- [@official@Jest Documentation](https://jestjs.io/docs/getting-started)
 - [@feed@Explore top posts about Jest](https://app.daily.dev/tags/jest?ref=roadmapsh)
diff --git a/src/data/roadmaps/nodejs/content/jsonwebtoken@7u2WMxjLx3mMtn0cha4M7.md b/src/data/roadmaps/nodejs/content/jsonwebtoken@7u2WMxjLx3mMtn0cha4M7.md
index 6c00ddcca..ed36f1fc7 100644
--- a/src/data/roadmaps/nodejs/content/jsonwebtoken@7u2WMxjLx3mMtn0cha4M7.md
+++ b/src/data/roadmaps/nodejs/content/jsonwebtoken@7u2WMxjLx3mMtn0cha4M7.md
@@ -4,6 +4,6 @@ JWT, or JSON-Web-Token, is an open standard for sharing security information bet
 
 Visit the following resources to learn more:
 
-- [@official@Package Documentation](https://www.npmjs.com/package/jsonwebtoken)
+- [@official@JSON Package Documentation](https://www.npmjs.com/package/jsonwebtoken)
 - [@article@What is JWT](https://www.akana.com/blog/what-is-jwt)
 - [@video@JWT Implementation](https://www.youtube.com/watch?v=mbsmsi7l3r4)
diff --git a/src/data/roadmaps/nodejs/content/keep-app-running@af7n-J7VvbdpZh9lwA773.md b/src/data/roadmaps/nodejs/content/keep-app-running@af7n-J7VvbdpZh9lwA773.md
index 68e64f41a..2623010cc 100644
--- a/src/data/roadmaps/nodejs/content/keep-app-running@af7n-J7VvbdpZh9lwA773.md
+++ b/src/data/roadmaps/nodejs/content/keep-app-running@af7n-J7VvbdpZh9lwA773.md
@@ -4,5 +4,5 @@ PM2 lets you run your nodejs scripts forever. In the event that your application
 
 Visit the following resources to learn more:
 
-- [@article@Keep a node application constantly running](https://devtut.github.io/nodejs/keep-a-node-application-constantly-running.html#use-pm2-as-a-process-manager)
+- [@article@Keep a Node Application Constantly Running](https://devtut.github.io/nodejs/keep-a-node-application-constantly-running.html#use-pm2-as-a-process-manager)
 - [@feed@Explore top posts about Node.js](https://app.daily.dev/tags/nodejs?ref=roadmapsh)
diff --git a/src/data/roadmaps/nodejs/content/knex@HDDnt79_PCB5JU-KnHKUh.md b/src/data/roadmaps/nodejs/content/knex@HDDnt79_PCB5JU-KnHKUh.md
index 9c33b2396..e5bf26bb3 100644
--- a/src/data/roadmaps/nodejs/content/knex@HDDnt79_PCB5JU-KnHKUh.md
+++ b/src/data/roadmaps/nodejs/content/knex@HDDnt79_PCB5JU-KnHKUh.md
@@ -4,5 +4,5 @@ Knex.js is a "batteries included" SQL query builder for PostgreSQL, CockroachDB,
 
 Visit the following resources to learn more:
 
-- [@official@Knex.js Docs](https://knexjs.org)
+- [@official@Knex.js](https://knexjs.org)
 - [@feed@Explore top posts about Node.js](https://app.daily.dev/tags/nodejs?ref=roadmapsh)
diff --git a/src/data/roadmaps/nodejs/content/ky@-_2letLUta5Ymc5eEOKhn.md b/src/data/roadmaps/nodejs/content/ky@-_2letLUta5Ymc5eEOKhn.md
index f9aee52d8..dd34f7684 100644
--- a/src/data/roadmaps/nodejs/content/ky@-_2letLUta5Ymc5eEOKhn.md
+++ b/src/data/roadmaps/nodejs/content/ky@-_2letLUta5Ymc5eEOKhn.md
@@ -4,5 +4,5 @@ Ky is a tiny and elegant HTTP client based on the browser Fetch API. Ky targets
 
 Visit the following resources to learn more:
 
-- [@opensource@Ky Official Docs](https://github.com/sindresorhus/ky)
+- [@opensource@Ky Docs](https://github.com/sindresorhus/ky)
 - [@official@npmjs.org](https://www.npmjs.com/package/ky/v/0.9.0)
diff --git a/src/data/roadmaps/nodejs/content/marko@f2DyjBIglAZ6NoHaRnlzt.md b/src/data/roadmaps/nodejs/content/marko@f2DyjBIglAZ6NoHaRnlzt.md
index 957744f15..ee8a104fe 100644
--- a/src/data/roadmaps/nodejs/content/marko@f2DyjBIglAZ6NoHaRnlzt.md
+++ b/src/data/roadmaps/nodejs/content/marko@f2DyjBIglAZ6NoHaRnlzt.md
@@ -4,4 +4,4 @@ Marko is a fast and lightweight HTML-based templating engine that compiles templ
 
 Visit the following resources to learn more:
 
-- [@article@Marko Documentation](https://markojs.com/docs/guides-overview/)
+- [@official@Marko Documentation](https://markojs.com/docs/guides-overview/)
diff --git a/src/data/roadmaps/nodejs/content/memory-leaks@oU9I7KBZoTSXXFmYscEIq.md b/src/data/roadmaps/nodejs/content/memory-leaks@oU9I7KBZoTSXXFmYscEIq.md
index 8dee11075..04d75efb2 100644
--- a/src/data/roadmaps/nodejs/content/memory-leaks@oU9I7KBZoTSXXFmYscEIq.md
+++ b/src/data/roadmaps/nodejs/content/memory-leaks@oU9I7KBZoTSXXFmYscEIq.md
@@ -4,7 +4,7 @@ Memory leaks are caused when your Node.js app’s CPU and memory usage increases
 
 Visit the following resources to learn more:
 
-- [@article@Memory leaks in Node.js](https://sematext.com/blog/nodejs-memory-leaks/)
-- [@article@Memory leaks causes](https://sematext.com/blog/nodejs-memory-leaks/#what-causes-them-common-node-js-memory-leaks)
-- [@article@Memory leaks detectors](https://sematext.com/blog/nodejs-memory-leaks/#node-js-memory-leak-detectors)
+- [@article@Memory Leaks in Node.js](https://sematext.com/blog/nodejs-memory-leaks/)
+- [@article@Memory Leaks Causes](https://sematext.com/blog/nodejs-memory-leaks/#what-causes-them-common-node-js-memory-leaks)
+- [@article@Memory Leaks Detectors](https://sematext.com/blog/nodejs-memory-leaks/#node-js-memory-leak-detectors)
 - [@feed@Explore top posts about General Programming](https://app.daily.dev/tags/general-programming?ref=roadmapsh)
diff --git a/src/data/roadmaps/nodejs/content/modules@mbGFT6S7mL3bHHEZv0_s2.md b/src/data/roadmaps/nodejs/content/modules@mbGFT6S7mL3bHHEZv0_s2.md
index ea46f1397..e3f41988b 100644
--- a/src/data/roadmaps/nodejs/content/modules@mbGFT6S7mL3bHHEZv0_s2.md
+++ b/src/data/roadmaps/nodejs/content/modules@mbGFT6S7mL3bHHEZv0_s2.md
@@ -5,6 +5,6 @@ We split our code into different files to maintain, organize and reuse code when
 Visit the following resources to learn more:
 
 - [@official@Modules: CommonJS modules](https://nodejs.org/api/modules.html#modules-commonjs-modules)
-- [@article@CommonJS vs. ES modules in Node.js](https://blog.logrocket.com/commonjs-vs-es-modules-node-js/)
+- [@article@CommonJS vs. ES Modules in Node.js](https://blog.logrocket.com/commonjs-vs-es-modules-node-js/)
 - [@video@Modules in Node.js](https://www.youtube.com/watch?v=9Amxzvq5LY8&)
 - [@feed@Explore top posts about Node.js](https://app.daily.dev/tags/nodejs?ref=roadmapsh)
diff --git a/src/data/roadmaps/nodejs/content/mongoose@NDf-o-WECK02mVnZ8IFxy.md b/src/data/roadmaps/nodejs/content/mongoose@NDf-o-WECK02mVnZ8IFxy.md
index a597db69a..93e370f64 100644
--- a/src/data/roadmaps/nodejs/content/mongoose@NDf-o-WECK02mVnZ8IFxy.md
+++ b/src/data/roadmaps/nodejs/content/mongoose@NDf-o-WECK02mVnZ8IFxy.md
@@ -4,6 +4,6 @@ Mongoose is an Object Data Modeling (ODM) library for MongoDB and Node.js. Mongo
 
 Visit the following resources to learn more:
 
-- [@official@Mongoose Website](https://mongoosejs.com)
+- [@official@Mongoose](https://mongoosejs.com)
 - [@article@Getting Started with MongoDB and Mongoose](https://www.mongodb.com/developer/languages/javascript/getting-started-with-mongodb-and-mongoose/)
 - [@feed@Explore top posts about Mongoose](https://app.daily.dev/tags/mongoose?ref=roadmapsh)
diff --git a/src/data/roadmaps/nodejs/content/monitor-changes-dev@swp4wBgA7z-sd64VDkMrw.md b/src/data/roadmaps/nodejs/content/monitor-changes-dev@swp4wBgA7z-sd64VDkMrw.md
index b1f97fa51..6164cf1d5 100644
--- a/src/data/roadmaps/nodejs/content/monitor-changes-dev@swp4wBgA7z-sd64VDkMrw.md
+++ b/src/data/roadmaps/nodejs/content/monitor-changes-dev@swp4wBgA7z-sd64VDkMrw.md
@@ -2,5 +2,6 @@
 
 In Node.js, you need to restart the process to make changes take effect. This adds an extra step to your workflow. You can eliminate this extra step by using `nodemon` to restart the process automatically.
 
-Since Node.js 18.11.0, you can run Node with the `--watch` flag to reload your app everytime a file is changed. So you don't need to use `nodemon` anymore.
-[Node.js 18.11.0 Changelog](https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V18.md#18.11.0).
+Since Node.js 18.11.0, you can run Node with the `--watch` flag to reload your app every time a file is changed. So you don't need to use `nodemon` anymore.
+
+Visit the following resources to learn more:
diff --git a/src/data/roadmaps/nodejs/content/morgan@CTHFGgtXFpke4aPhh5vRY.md b/src/data/roadmaps/nodejs/content/morgan@CTHFGgtXFpke4aPhh5vRY.md
index bd5270022..8e31730e2 100644
--- a/src/data/roadmaps/nodejs/content/morgan@CTHFGgtXFpke4aPhh5vRY.md
+++ b/src/data/roadmaps/nodejs/content/morgan@CTHFGgtXFpke4aPhh5vRY.md
@@ -4,5 +4,5 @@ Morgan is a NodeJS and express.js middleware to log the HTTP request and error,
 
 Visit the following resources to learn more:
 
-- [@official@Official Website](https://www.npmjs.com/package/morgan)
-- [@article@How to use Morgan|DigitalOcean](https://www.digitalocean.com/community/tutorials/nodejs-getting-started-morgan)
+- [@official@morgan package](https://www.npmjs.com/package/morgan)
+- [@article@How to Use Morgan | DigitalOcean](https://www.digitalocean.com/community/tutorials/nodejs-getting-started-morgan)
diff --git a/src/data/roadmaps/nodejs/content/native-drivers@5WqLm53CHDT5uBoMH-iPl.md b/src/data/roadmaps/nodejs/content/native-drivers@5WqLm53CHDT5uBoMH-iPl.md
index 53d4bfccf..28bc5b544 100644
--- a/src/data/roadmaps/nodejs/content/native-drivers@5WqLm53CHDT5uBoMH-iPl.md
+++ b/src/data/roadmaps/nodejs/content/native-drivers@5WqLm53CHDT5uBoMH-iPl.md
@@ -1,3 +1,7 @@
 # Native Drivers
 
-Another way to connect to different databases in Node.js is to use the official native drivers provided by the database. For example, here is the [list of drivers by MongoDB](https://www.mongodb.com/docs/drivers/)
+Another way to connect to different databases in Node.js is to use the official native drivers provided by the database.
+
+Visit the following resources to learn more:
+
+[@official@MongoDB Drivers](https://www.mongodb.com/docs/drivers/)
diff --git a/src/data/roadmaps/nodejs/content/native-drivers@KpC-QYKalUp7VUvnMKBoW.md b/src/data/roadmaps/nodejs/content/native-drivers@KpC-QYKalUp7VUvnMKBoW.md
index c51a65caa..9877e20f6 100644
--- a/src/data/roadmaps/nodejs/content/native-drivers@KpC-QYKalUp7VUvnMKBoW.md
+++ b/src/data/roadmaps/nodejs/content/native-drivers@KpC-QYKalUp7VUvnMKBoW.md
@@ -1,16 +1,3 @@
 # Native drivers
 
 NativeDriver is an implementation of the WebDriver API which drives the UI of a native application rather than a web application. It extends the WebDriver API in a few key places, and re-interprets the existing API for native applications.
-
-- MySQL:
-  - [mysql](https://www.npmjs.com/package/mysql)
-  - [mysql2](https://www.npmjs.com/package/mysql2)
-- MariaDB:
-  - [mariadb](https://www.npmjs.com/package/mariadb)
-- PostgreSQL:
-  - [pg](https://www.npmjs.com/package/pg)
-- Microsoft SQL Server:
-  - [tedious](https://www.npmjs.com/package/tedious)
-  - [mssql](https://www.npmjs.com/package/mssql)
-- Oracle:
-  - [oracledb](https://www.npmjs.com/package/oracledb)
diff --git a/src/data/roadmaps/nodejs/content/nestjs@tGD8XLHnfspfv8CbguGwV.md b/src/data/roadmaps/nodejs/content/nestjs@tGD8XLHnfspfv8CbguGwV.md
index a4c8b9923..d1a37b6bb 100644
--- a/src/data/roadmaps/nodejs/content/nestjs@tGD8XLHnfspfv8CbguGwV.md
+++ b/src/data/roadmaps/nodejs/content/nestjs@tGD8XLHnfspfv8CbguGwV.md
@@ -4,7 +4,7 @@ NestJS is a progressive Node.js framework for creating efficient and scalable se
 
 Visit the following resources to learn more:
 
-- [@official@NestJS Website](https://nestjs.com)
-- [@article@NestJS Official Documentations](https://docs.nestjs.com)
+- [@official@NestJS](https://nestjs.com)
+- [@official@NestJS Documentations](https://docs.nestjs.com)
 - [@video@Beginner NestJS Tutorial](https://www.youtube.com/watch?v=GHTA143_b-s)
 - [@feed@Explore top posts about NestJS](https://app.daily.dev/tags/nestjs?ref=roadmapsh)
diff --git a/src/data/roadmaps/nodejs/content/nodemon@2Ym2jMvov0lZ79aJFaw29.md b/src/data/roadmaps/nodejs/content/nodemon@2Ym2jMvov0lZ79aJFaw29.md
index 8315021cc..4b4a2e6e5 100644
--- a/src/data/roadmaps/nodejs/content/nodemon@2Ym2jMvov0lZ79aJFaw29.md
+++ b/src/data/roadmaps/nodejs/content/nodemon@2Ym2jMvov0lZ79aJFaw29.md
@@ -1,10 +1,12 @@
 # Nodemon
 
-In Node.js, you need to restart the process to make changes take effect. This adds an extra step to your workflow. You can eliminate this extra step by using [nodemon](https://nodemon.io/) or [PM2](https://pm2.keymetrics.io/docs/usage/quick-start/) to restart the process automatically.
+In Node.js, you need to restart the process to make changes take effect. This adds an extra step to your workflow. You can eliminate this extra step by using nodemon or PM2 to restart the process automatically.
 
-`nodemon` is a command-line interface (CLI) utility developed by [@rem](https://twitter.com/rem) that wraps your Node app, watches the file system, and automatically restarts the process.
+`nodemon` is a command-line interface (CLI) utility developed by rem that wraps your Node app, watches the file system, and automatically restarts the process.
 
 Visit the following resources to learn more:
 
+- [@official@Nodemon](https://nodemon.io/)
+- [@article@PM2](https://pm2.keymetrics.io/docs/usage/quick-start/)
 - [@article@How To Restart Your Node.js Apps Automatically with nodemon](https://www.digitalocean.com/community/tutorials/workflow-nodemon)
 - [@feed@Explore top posts about Node.js](https://app.daily.dev/tags/nodejs?ref=roadmapsh)
diff --git a/src/data/roadmaps/nodejs/content/nodetest@oSLpy31XEcA2nRq9ks_LJ.md b/src/data/roadmaps/nodejs/content/nodetest@oSLpy31XEcA2nRq9ks_LJ.md
index 5073cd257..c81745e35 100644
--- a/src/data/roadmaps/nodejs/content/nodetest@oSLpy31XEcA2nRq9ks_LJ.md
+++ b/src/data/roadmaps/nodejs/content/nodetest@oSLpy31XEcA2nRq9ks_LJ.md
@@ -2,7 +2,7 @@
 
 `node:test` is a built-in module in Node.js that provides a simple, asynchronous test runner. It's designed to make writing tests as straightforward as writing any other code.
 
-## Key Features
+Key Features
 
 - Simplicity: Easy to use and understand.
 - Asynchronous Support: Handles asynchronous code gracefully.
diff --git a/src/data/roadmaps/nodejs/content/npm-workspaces@WvxCGVKLvTUVEHeOcUQPg.md b/src/data/roadmaps/nodejs/content/npm-workspaces@WvxCGVKLvTUVEHeOcUQPg.md
index 64faf23da..7260f2c03 100644
--- a/src/data/roadmaps/nodejs/content/npm-workspaces@WvxCGVKLvTUVEHeOcUQPg.md
+++ b/src/data/roadmaps/nodejs/content/npm-workspaces@WvxCGVKLvTUVEHeOcUQPg.md
@@ -5,5 +5,5 @@ Workspace is a generic term that refers to the set of npm CLI features that supp
 Visit the following resources to learn more:
 
 - [@official@npm workspaces](https://docs.npmjs.com/cli/using-npm/workspaces)
-- [@article@Getting Started with Npm Workspaces ](https://ruanmartinelli.com/posts/npm-7-workspaces-1)
+- [@article@Getting Started with Npm Workspaces](https://ruanmartinelli.com/posts/npm-7-workspaces-1)
 - [@feed@Explore top posts about NPM](https://app.daily.dev/tags/npm?ref=roadmapsh)
diff --git a/src/data/roadmaps/nodejs/content/npm@jQJ9aOKtg-O-GhWk5OgCK.md b/src/data/roadmaps/nodejs/content/npm@jQJ9aOKtg-O-GhWk5OgCK.md
index 370e6aa82..bf0e16b63 100644
--- a/src/data/roadmaps/nodejs/content/npm@jQJ9aOKtg-O-GhWk5OgCK.md
+++ b/src/data/roadmaps/nodejs/content/npm@jQJ9aOKtg-O-GhWk5OgCK.md
@@ -6,9 +6,8 @@ It is two things: first and foremost, it is an online repository for the publish
 
 Visit the following resources to learn more:
 
+- [@official@NPM Documentation](https://docs.npmjs.com/)
 - [@official@What is npm?](https://nodejs.org/en/learn/getting-started/an-introduction-to-the-npm-package-manager)
 - [@official@An introduction to the npm package manager](https://nodejs.org/en/learn/getting-started/an-introduction-to-the-npm-package-manager)
-- [@official@Official Website](https://www.npmjs.com/)
-- [@official@Official Documentation](https://docs.npmjs.com/)
 - [@video@NPM Crash Course](https://www.youtube.com/watch?v=jHDhaSSKmB0)
 - [@feed@Explore top posts about Node.js](https://app.daily.dev/tags/nodejs?ref=roadmapsh)
diff --git a/src/data/roadmaps/nodejs/content/npx@YdpJ-DUo8Q5ATRmF4s4YS.md b/src/data/roadmaps/nodejs/content/npx@YdpJ-DUo8Q5ATRmF4s4YS.md
index c3e86affd..3fe3bff2b 100644
--- a/src/data/roadmaps/nodejs/content/npx@YdpJ-DUo8Q5ATRmF4s4YS.md
+++ b/src/data/roadmaps/nodejs/content/npx@YdpJ-DUo8Q5ATRmF4s4YS.md
@@ -4,5 +4,5 @@ npx is a very powerful command that's been available in npm starting version 5.2
 
 Visit the following resources to learn more:
 
+- [@official@npx](https://docs.npmjs.com/cli/commands/npx/)
 - [@article@Introduction to the npx Node.js Package Runner](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)
-- [@official@Official Documentation](https://docs.npmjs.com/cli/commands/npx/)
diff --git a/src/data/roadmaps/nodejs/content/passportjs@mIyv6S9a5dCHkk-JhhjKV.md b/src/data/roadmaps/nodejs/content/passportjs@mIyv6S9a5dCHkk-JhhjKV.md
index dfdc5bf31..8e47bd465 100644
--- a/src/data/roadmaps/nodejs/content/passportjs@mIyv6S9a5dCHkk-JhhjKV.md
+++ b/src/data/roadmaps/nodejs/content/passportjs@mIyv6S9a5dCHkk-JhhjKV.md
@@ -4,7 +4,7 @@ Passport.js is authentication middleware for Node.js. It makes implementing auth
 
 Visit the following resources to learn more:
 
-- [@official@PassportJS Website](https://www.passportjs.org/)
-- [@official@PassportJS Official Documentation](https://www.passportjs.org/docs/)
+- [@official@PassportJS](https://www.passportjs.org/)
+- [@official@PassportJS Documentation](https://www.passportjs.org/docs/)
 - [@video@Implementation of OAuth using passportjs](https://www.youtube.com/watch?v=sakQbeRjgwg\&list=PL4cUxeGkcC9jdm7QX143aMLAqyM-jTZ2x)
 - [@feed@Explore top posts about JavaScript](https://app.daily.dev/tags/javascript?ref=roadmapsh)
diff --git a/src/data/roadmaps/nodejs/content/path-module@Blzb-fdQZMu6Xq5JDJW0_.md b/src/data/roadmaps/nodejs/content/path-module@Blzb-fdQZMu6Xq5JDJW0_.md
index d59f058cb..598ff509e 100644
--- a/src/data/roadmaps/nodejs/content/path-module@Blzb-fdQZMu6Xq5JDJW0_.md
+++ b/src/data/roadmaps/nodejs/content/path-module@Blzb-fdQZMu6Xq5JDJW0_.md
@@ -4,6 +4,6 @@ The `path` module provides utilities for working with file and directory paths.
 
 Visit the following resources to learn more:
 
-- [@official@Path Documentations](https://nodejs.org/api/path.html)
+- [@official@Path Documentation](https://nodejs.org/api/path.html)
 - [@official@Learn Node.js File Paths](https://nodejs.org/en/learn/manipulating-files/nodejs-file-paths)
 - [@video@Path Module in Node.js](https://youtu.be/j95Lwxvi9JY)
diff --git a/src/data/roadmaps/nodejs/content/playwright@Ix-g9pgJjEI04bSfROvlq.md b/src/data/roadmaps/nodejs/content/playwright@Ix-g9pgJjEI04bSfROvlq.md
index cacbda3dc..b7b134a89 100644
--- a/src/data/roadmaps/nodejs/content/playwright@Ix-g9pgJjEI04bSfROvlq.md
+++ b/src/data/roadmaps/nodejs/content/playwright@Ix-g9pgJjEI04bSfROvlq.md
@@ -6,6 +6,6 @@ Playwright provides a high-level API to interact with web pages. You can write s
 
 Visit the following resources to learn more:
 
-- [@official@Playwright Website](https://playwright.dev/)
+- [@official@Playwright](https://playwright.dev/)
 - [@official@Playwright Docs](https://playwright.dev/docs/getting-started-vscode)
 - [@article@Getting Started with Playwright](https://learn.microsoft.com/en-us/shows/getting-started-with-end-to-end-testing-with-playwright/)
diff --git a/src/data/roadmaps/nodejs/content/pm2@7WAuMMyelUbgwEHtnMmJv.md b/src/data/roadmaps/nodejs/content/pm2@7WAuMMyelUbgwEHtnMmJv.md
index ed05a70f2..dab0ce991 100644
--- a/src/data/roadmaps/nodejs/content/pm2@7WAuMMyelUbgwEHtnMmJv.md
+++ b/src/data/roadmaps/nodejs/content/pm2@7WAuMMyelUbgwEHtnMmJv.md
@@ -4,5 +4,5 @@ PM2 is a production process manager for Node.js applications with a built-in loa
 
 Visit the following resources to learn more:
 
-- [@article@Pm2 Website](https://pm2.keymetrics.io/)
-- [@article@Pm2 Official Documentations](https://pm2.keymetrics.io/docs/usage/quick-start/)
+- [@official@Pm2](https://pm2.keymetrics.io/)
+- [@official@Pm2 Documentations](https://pm2.keymetrics.io/docs/usage/quick-start/)
diff --git a/src/data/roadmaps/nodejs/content/prisma@3Qxtf8n6gJYdnRsuqa52Q.md b/src/data/roadmaps/nodejs/content/prisma@3Qxtf8n6gJYdnRsuqa52Q.md
index 80b75d23f..909984c4e 100644
--- a/src/data/roadmaps/nodejs/content/prisma@3Qxtf8n6gJYdnRsuqa52Q.md
+++ b/src/data/roadmaps/nodejs/content/prisma@3Qxtf8n6gJYdnRsuqa52Q.md
@@ -4,6 +4,6 @@ Prisma provides an open source next-generation ORM in the TypeScript ecosystem.
 
 Visit the following resources to learn more:
 
-- [@official@Prisma Website](https://www.prisma.io/)
+- [@official@Prisma](https://www.prisma.io/)
 - [@video@Prisma & MongoDB Youtube Tutorial](https://www.youtube.com/watch?v=-7r4whMKt1s)
 - [@feed@Explore top posts about Prisma](https://app.daily.dev/tags/prisma?ref=roadmapsh)
diff --git a/src/data/roadmaps/nodejs/content/prisma@O7Cy2g_GPxKU6vPfEmNyi.md b/src/data/roadmaps/nodejs/content/prisma@O7Cy2g_GPxKU6vPfEmNyi.md
index f0ba4e3e6..3961a0cbc 100644
--- a/src/data/roadmaps/nodejs/content/prisma@O7Cy2g_GPxKU6vPfEmNyi.md
+++ b/src/data/roadmaps/nodejs/content/prisma@O7Cy2g_GPxKU6vPfEmNyi.md
@@ -4,6 +4,6 @@ Prisma is an ORM that helps app developers build faster and make fewer errors. C
 
 Visit the following resources to learn more:
 
-- [@official@Prisma Website](https://www.prisma.io/)
-- [@official@Prisma Official Documentations](https://www.prisma.io/docs/)
+- [@official@Prisma](https://www.prisma.io/)
+- [@official@Prisma Documentation](https://www.prisma.io/docs/)
 - [@feed@Explore top posts about Prisma](https://app.daily.dev/tags/prisma?ref=roadmapsh)
diff --git a/src/data/roadmaps/nodejs/content/processcwd@QT2QE2FLkyUDpwMKYkFQL.md b/src/data/roadmaps/nodejs/content/processcwd@QT2QE2FLkyUDpwMKYkFQL.md
index 3cb4866fc..b904ab429 100644
--- a/src/data/roadmaps/nodejs/content/processcwd@QT2QE2FLkyUDpwMKYkFQL.md
+++ b/src/data/roadmaps/nodejs/content/processcwd@QT2QE2FLkyUDpwMKYkFQL.md
@@ -4,5 +4,5 @@ The `process.cwd()` method returns the current working directory of the Node.js
 
 Visit the following resources to learn more:
 
-- [@official@Official Website](https://nodejs.org/api/process.html#processcwd)
+- [@official@process.cwd()](https://nodejs.org/api/process.html#processcwd)
 - [@article@Whats the difference between process.cwd() vs \_\_dirname?](https://stackoverflow.com/questions/9874382/whats-the-difference-between-process-cwd-vs-dirname)
diff --git a/src/data/roadmaps/nodejs/content/processenv@wthXp2YGg3eTMbxsek77C.md b/src/data/roadmaps/nodejs/content/processenv@wthXp2YGg3eTMbxsek77C.md
index c17b2b2e5..6be0f7404 100644
--- a/src/data/roadmaps/nodejs/content/processenv@wthXp2YGg3eTMbxsek77C.md
+++ b/src/data/roadmaps/nodejs/content/processenv@wthXp2YGg3eTMbxsek77C.md
@@ -4,5 +4,5 @@ In Node. js, process. env is a global variable that is injected during runtime.
 
 Visit the following resources to learn more:
 
-- [@official@Node.js Learn environment variables](https://nodejs.org/en/learn/command-line/how-to-read-environment-variables-from-nodejs)
+- [@official@Node.js Learn Environment Variables](https://nodejs.org/en/learn/command-line/how-to-read-environment-variables-from-nodejs)
 - [@article@Process.env Node](https://www.knowledgehut.com/blog/web-development/node-environment-variables)
\ No newline at end of file
diff --git a/src/data/roadmaps/nodejs/content/processstdin@betuntelnEMSHdatO6VPl.md b/src/data/roadmaps/nodejs/content/processstdin@betuntelnEMSHdatO6VPl.md
index a174fbe93..d92da0864 100644
--- a/src/data/roadmaps/nodejs/content/processstdin@betuntelnEMSHdatO6VPl.md
+++ b/src/data/roadmaps/nodejs/content/processstdin@betuntelnEMSHdatO6VPl.md
@@ -4,5 +4,5 @@ The `process.stdin` is a standard Readable stream which listens for user input a
 
 Visit the following resources to learn more:
 
-- [@official@Official Documentation](https://nodejs.org/api/process.html#processstdin)
+- [@official@process.stdin](https://nodejs.org/api/process.html#processstdin)
 - [@article@Node.js Process stdin & stdout](https://nodecli.com/node-stdin-stdout)
diff --git a/src/data/roadmaps/nodejs/content/promises@QcOqhuKWOUUUBSiu5Oelv.md b/src/data/roadmaps/nodejs/content/promises@QcOqhuKWOUUUBSiu5Oelv.md
index 7c6a24ce1..921a55260 100644
--- a/src/data/roadmaps/nodejs/content/promises@QcOqhuKWOUUUBSiu5Oelv.md
+++ b/src/data/roadmaps/nodejs/content/promises@QcOqhuKWOUUUBSiu5Oelv.md
@@ -1,10 +1,13 @@
 # Promises
 
 A promise is commonly defined as a proxy for a value that will eventually become available.
+
 Asynchronous functions use promise behind the scenes, so understanding how promises work is fundamental to understanding how "async" and "await" works.
+
 Once a promise has been called, it will start in a pending state. This means that the calling function continues executing, while the promise is pending until it resolves, giving the calling function whatever data was being requested.
 
 Creating a Promise:
+
 The Promise API exposes a Promise constructor, which you initialize using new Promise().
 
 Using resolve() and reject(), we can communicate back to the caller what the resulting Promise state was, and what to do with it.
diff --git a/src/data/roadmaps/nodejs/content/prompts-package@xgsKrUdfB0g0DMQCLK3aY.md b/src/data/roadmaps/nodejs/content/prompts-package@xgsKrUdfB0g0DMQCLK3aY.md
index 4edc7889b..e5bc3dfde 100644
--- a/src/data/roadmaps/nodejs/content/prompts-package@xgsKrUdfB0g0DMQCLK3aY.md
+++ b/src/data/roadmaps/nodejs/content/prompts-package@xgsKrUdfB0g0DMQCLK3aY.md
@@ -4,4 +4,4 @@ Prompts is a higher level and user friendly interface built on top of Node.js's
 
 Visit the following resources to learn more:
 
-- [@official@Official Documentation](https://www.npmjs.com/package/prompts)
+- [@official@Prompts](https://www.npmjs.com/package/prompts)
diff --git a/src/data/roadmaps/nodejs/content/pug@O67e2qyhxP5joR5LGyZ2N.md b/src/data/roadmaps/nodejs/content/pug@O67e2qyhxP5joR5LGyZ2N.md
index 3f99edbc4..914f01e02 100644
--- a/src/data/roadmaps/nodejs/content/pug@O67e2qyhxP5joR5LGyZ2N.md
+++ b/src/data/roadmaps/nodejs/content/pug@O67e2qyhxP5joR5LGyZ2N.md
@@ -6,7 +6,7 @@ Pug is a high-performance template engine heavily influenced by Haml and impleme
 
 Visit the following resources to learn more:
 
-- [@article@Getting started with PugJs](https://pugjs.org/api/getting-started.html)
+- [@official@Getting started with PugJs](https://pugjs.org/api/getting-started.html)
 - [@article@How to Build a Node Application Using a Pug Template](https://blog.bitsrc.io/how-to-build-a-node-application-using-a-pug-template-7319ab1bba69?gi=40b338891148)
 - [@video@Node.js + Express - Tutorial - PugJS Templating Engine](https://www.youtube.com/watch?v=DSp9ExFw3Ig)
 - [@article@Pug.js tutorial](https://zetcode.com/javascript/pugjs/)
diff --git a/src/data/roadmaps/nodejs/content/sequelize@fOm-ktIaLqrmA0zln0Bga.md b/src/data/roadmaps/nodejs/content/sequelize@fOm-ktIaLqrmA0zln0Bga.md
index 1c91c7f2a..ab5f9f43b 100644
--- a/src/data/roadmaps/nodejs/content/sequelize@fOm-ktIaLqrmA0zln0Bga.md
+++ b/src/data/roadmaps/nodejs/content/sequelize@fOm-ktIaLqrmA0zln0Bga.md
@@ -2,14 +2,14 @@
 
 Sequelize is an easy-to-use and promise-based Node.js ORM tool for Postgres, MySQL, MariaDB, SQLite, DB2, Microsoft SQL Server, and Snowflake. It features solid transaction support, relations, eager and lazy loading, read replication and more.
 
-## What is an ORM ?
+What is an ORM ?
 
-An ORM is known as Object Relational Mapper. This is a tool or a level of abstraction which maps(converts) data in a relational database into programmatic objects that can be manipulated by a programmer using a programming language(usually an OOP language). ORMs solely exist to map the details between two data sources which due to a mismatch cannot coexist together.
+An ORM is known as Object Relational Mapper. This is a tool or a level of abstraction which maps(converts) data in a relational database into programmatic objects that can be manipulated by a programmer using a programming language (usually an OOP language). ORMs solely exist to map the details between two data sources which due to a mismatch cannot coexist together.
 
 Visit the following resources to learn more:
 
-- [@official@Sequelize Website](https://sequelize.org/)
+- [@official@Sequelize](https://sequelize.org/)
 - [@official@Sequelize - NPM Package](https://www.npmjs.com/package/sequelize)
-- [@official@Official Sequelize Docs](https://sequelize.org/docs/v6/getting-started/)
+- [@official@Sequelize Docs](https://sequelize.org/docs/v6/getting-started/)
 - [@article@Getting started with Sequelize](https://levelup.gitconnected.com/the-ultimate-guide-to-get-started-with-sequelize-orm-238588d3516e)
 - [@feed@Explore top posts about Node.js](https://app.daily.dev/tags/nodejs?ref=roadmapsh)
diff --git a/src/data/roadmaps/nodejs/content/setimmediate@YvTPpoIiSqjDYi0Q10kWh.md b/src/data/roadmaps/nodejs/content/setimmediate@YvTPpoIiSqjDYi0Q10kWh.md
index b689ad4aa..9ddbc6ebc 100644
--- a/src/data/roadmaps/nodejs/content/setimmediate@YvTPpoIiSqjDYi0Q10kWh.md
+++ b/src/data/roadmaps/nodejs/content/setimmediate@YvTPpoIiSqjDYi0Q10kWh.md
@@ -4,5 +4,5 @@ The `setImmediate` function delays the execution of a function to be called afte
 
 Visit the following resources to learn more:
 
-- [@article@Understanding setImmediate](https://developer.mozilla.org/en-US/docs/Web/API/Window/setImmediate)
 - [@official@Understanding setImmediate](https://nodejs.org/en/learn/asynchronous-work/understanding-setimmediate)
+- [@article@Understanding setImmediate](https://developer.mozilla.org/en-US/docs/Web/API/Window/setImmediate)
diff --git a/src/data/roadmaps/nodejs/content/streams@WrnjjUDXQwwMXQjmgK72U.md b/src/data/roadmaps/nodejs/content/streams@WrnjjUDXQwwMXQjmgK72U.md
index 80e4cece6..727bf800d 100644
--- a/src/data/roadmaps/nodejs/content/streams@WrnjjUDXQwwMXQjmgK72U.md
+++ b/src/data/roadmaps/nodejs/content/streams@WrnjjUDXQwwMXQjmgK72U.md
@@ -11,7 +11,7 @@ Multiple streams can be chained together using `pipe()` method.
 
 Visit the following resources to learn more:
 
-- [@official@Stream API Official Documentation](https://nodejs.org/api/stream.html)
+- [@official@Stream API Documentation](https://nodejs.org/api/stream.html)
 - [@video@Node.js Streams tutorial](https://www.youtube.com/watch?v=GlybFFMXXmQ)
 - [@article@Understanding Streams in Node.js](https://nodesource.com/blog/understanding-streams-in-nodejs)
 - [@feed@Explore top posts about Node.js](https://app.daily.dev/tags/nodejs?ref=roadmapsh)
diff --git a/src/data/roadmaps/nodejs/content/system-errors@05YY-AhLKzn4Ypr4eow5E.md b/src/data/roadmaps/nodejs/content/system-errors@05YY-AhLKzn4Ypr4eow5E.md
index 2811994b6..4eebbe1b4 100644
--- a/src/data/roadmaps/nodejs/content/system-errors@05YY-AhLKzn4Ypr4eow5E.md
+++ b/src/data/roadmaps/nodejs/content/system-errors@05YY-AhLKzn4Ypr4eow5E.md
@@ -3,7 +3,7 @@
 Node.js generates system errors when exceptions occur within its runtime environment. These usually occur when an application violates an operating system constraint.
 For example, a system error will occur if an application attempts to read a file that does not exist.
 
-Below are the system errors commonly encountered when writing a Node.js program
+Below are the system errors commonly encountered when writing a Node.js program:
 
 1. EACCES - Permission denied
 2. EADDRINUSE - Address already in use
@@ -21,5 +21,5 @@ Below are the system errors commonly encountered when writing a Node.js program
 
 Visit the following resources to learn more:
 
-- [@official@Node.js Errors - Official Docs](https://nodejs.org/api/errors.html#errors_class_systemerror)
+- [@official@Node.js Errors](https://nodejs.org/api/errors.html#errors_class_systemerror)
 - [@Article@16 Common Errors in Node.js and How to Fix Them](https://betterstack.com/community/guides/scaling-nodejs/nodejs-errors/)
diff --git a/src/data/roadmaps/nodejs/content/template-engines@J0ErCAZT5B97ZMogU2JHd.md b/src/data/roadmaps/nodejs/content/template-engines@J0ErCAZT5B97ZMogU2JHd.md
index 3897584b9..0dc96830f 100644
--- a/src/data/roadmaps/nodejs/content/template-engines@J0ErCAZT5B97ZMogU2JHd.md
+++ b/src/data/roadmaps/nodejs/content/template-engines@J0ErCAZT5B97ZMogU2JHd.md
@@ -10,3 +10,9 @@ Some examples of template engines in Node.js are:
 - EJS
 - Handlebars
 - HAML
+
+Visit the following resources to learn more:
+
+- [@official@Getting Started with Pug](https://pugjs.org/api/getting-started.html)
+- [@official@Handlebars Package](https://www.npmjs.com/package/handlebars)
+- [@official@EJS Package](https://www.npmjs.com/package/ejs)
diff --git a/src/data/roadmaps/nodejs/content/testing@90NIFfbWjTbyKZKwyJlfI.md b/src/data/roadmaps/nodejs/content/testing@90NIFfbWjTbyKZKwyJlfI.md
index 6e8185d09..59379feed 100644
--- a/src/data/roadmaps/nodejs/content/testing@90NIFfbWjTbyKZKwyJlfI.md
+++ b/src/data/roadmaps/nodejs/content/testing@90NIFfbWjTbyKZKwyJlfI.md
@@ -6,6 +6,6 @@ The two most common testing approaches are unit testing and end-to-end testing.
 
 Visit the following resources to learn more:
 
-- [@article@Wikipedia - Software Testing](https://en.wikipedia.org/wiki/Software_testing)
+- [@article@Software Testing](https://en.wikipedia.org/wiki/Software_testing)
 - [@official@Vitest](https://vitest.dev/)
 - [@official@Jest](https://jest.io)
diff --git a/src/data/roadmaps/nodejs/content/threads@KzUmXkwrmU_ssVBjSHAiY.md b/src/data/roadmaps/nodejs/content/threads@KzUmXkwrmU_ssVBjSHAiY.md
index 28233bde1..0e3884362 100644
--- a/src/data/roadmaps/nodejs/content/threads@KzUmXkwrmU_ssVBjSHAiY.md
+++ b/src/data/roadmaps/nodejs/content/threads@KzUmXkwrmU_ssVBjSHAiY.md
@@ -1,7 +1,6 @@
 # Nodejs Threads
 
-Node.js is a single-threaded language and gives us ways to work parallelly to our main process.
-Taking note of nowadays multicore system single threading is very memory efficient.
+Node.js is a single-threaded language and gives us ways to work parallelly to our main process. Taking note of nowadays multicore system single threading is very memory efficient.
 
 Visit the following resources to learn more:
 
diff --git a/src/data/roadmaps/nodejs/content/typeorm@rk5FtAPDi1TpvWd0yBbtl.md b/src/data/roadmaps/nodejs/content/typeorm@rk5FtAPDi1TpvWd0yBbtl.md
index 7a2e71d0a..4dd773b8d 100644
--- a/src/data/roadmaps/nodejs/content/typeorm@rk5FtAPDi1TpvWd0yBbtl.md
+++ b/src/data/roadmaps/nodejs/content/typeorm@rk5FtAPDi1TpvWd0yBbtl.md
@@ -2,8 +2,6 @@
 
 TypeORM is an ORM that can run in NodeJS, Browser, Cordova, PhoneGap, Ionic, React Native, NativeScript, Expo, and Electron platforms and can be used with TypeScript and JavaScript (ES5, ES6, ES7, ES8). Its goal is to always support the latest JavaScript features and provide additional features that help you to develop any kind of application that uses databases - from small applications with a few tables to large scale enterprise applications with multiple databases.
 
-TypeORM supports both [Active Record](https://typeorm.io/active-record-data-mapper#what-is-the-active-record-pattern) and [Data Mapper](https://typeorm.io/active-record-data-mapper#what-is-the-data-mapper-pattern) patterns, unlike all other JavaScript ORMs currently in existence, which means you can write high quality, loosely coupled, scalable, maintainable applications the most productive way.
-
 Visit the following resources to learn more:
 
 - [@official@TypeORM Docs](https://typeorm.io)
diff --git a/src/data/roadmaps/nodejs/content/updating-packages@bYBz12FUiJ1qLgdQSGyGK.md b/src/data/roadmaps/nodejs/content/updating-packages@bYBz12FUiJ1qLgdQSGyGK.md
index 3f140119d..b4cfc05e0 100644
--- a/src/data/roadmaps/nodejs/content/updating-packages@bYBz12FUiJ1qLgdQSGyGK.md
+++ b/src/data/roadmaps/nodejs/content/updating-packages@bYBz12FUiJ1qLgdQSGyGK.md
@@ -6,3 +6,4 @@ Visit the following resources to learn more:
 
 - [@video@How to Update All NPM Dependencies At Once](https://www.youtube.com/watch?v=Ghdfdq17JAY)
 - [@official@Updating packages downloaded from the registry](https://docs.npmjs.com/updating-packages-downloaded-from-the-registry)
+- [@article@How to Update Npm Packages Safely With Npm Check Updates](https://chrispennington.blog/blog/how-to-update-npm-packages-safely-with-npm-check-updates/)
diff --git a/src/data/roadmaps/nodejs/content/using-debugger@XEGTeGWw05xWYOfUo3POE.md b/src/data/roadmaps/nodejs/content/using-debugger@XEGTeGWw05xWYOfUo3POE.md
index 26d087958..3c73792bb 100644
--- a/src/data/roadmaps/nodejs/content/using-debugger@XEGTeGWw05xWYOfUo3POE.md
+++ b/src/data/roadmaps/nodejs/content/using-debugger@XEGTeGWw05xWYOfUo3POE.md
@@ -6,5 +6,6 @@ Example - `$ node inspect myscript.js`
 
 Visit the following resources to learn more:
 
-- [@official@Official Docs](https://nodejs.org/api/debugger.html)
+- [@official@Debugger](https://nodejs.org/api/debugger.html)
+- [@official@Inspect Docs](https://nodejs.org/en/learn/getting-started/debugging)
 - [@article@Freecodecamp.org - Debugging](https://www.freecodecamp.org/news/how-to-debug-node-js-applications/)
diff --git a/src/data/roadmaps/nodejs/content/vitest@qjToBaMenW3SDtEfoCbQ6.md b/src/data/roadmaps/nodejs/content/vitest@qjToBaMenW3SDtEfoCbQ6.md
index 314ecac77..201d0d163 100644
--- a/src/data/roadmaps/nodejs/content/vitest@qjToBaMenW3SDtEfoCbQ6.md
+++ b/src/data/roadmaps/nodejs/content/vitest@qjToBaMenW3SDtEfoCbQ6.md
@@ -4,5 +4,5 @@ Vitest is a Vite-native unit testing framework that's Jest-compatible. Vitest is
 
 Visit the following resources to learn more:
 
-- [@official@Official Website](https://vitest.dev/)
-- [@article@Vitest Documentation](https://vitest.dev/guide/)
+- [@official@Vitest](https://vitest.dev/)
+- [@official@Vitest Documentation](https://vitest.dev/guide/)
diff --git a/src/data/roadmaps/nodejs/content/what-is-nodejs@Mp056kNnwsRWeEXuhGPy-.md b/src/data/roadmaps/nodejs/content/what-is-nodejs@Mp056kNnwsRWeEXuhGPy-.md
index 0d236e6cf..c8a9c9598 100644
--- a/src/data/roadmaps/nodejs/content/what-is-nodejs@Mp056kNnwsRWeEXuhGPy-.md
+++ b/src/data/roadmaps/nodejs/content/what-is-nodejs@Mp056kNnwsRWeEXuhGPy-.md
@@ -6,7 +6,7 @@ Node.js provides a set of asynchronous I/O primitives in its standard library th
 
 Visit the following resources to learn more:
 
-- [@official@Official Website](https://nodejs.org/en/about/)
+- [@official@Node.js](https://nodejs.org/en/about/)
 - [@official@Node.js - Getting Started](https://nodejs.org/en/learn/getting-started/introduction-to-nodejs)
 - [@article@Node.js - Introduction](https://www.w3schools.com/nodejs/nodejs_intro.asp)
 - [@video@What is Node.js?](https://www.youtube.com/watch?v=uVwtVBpw7RQ)
diff --git a/src/data/roadmaps/nodejs/content/winston@Oe9cQCz2lwSaot7miZOta.md b/src/data/roadmaps/nodejs/content/winston@Oe9cQCz2lwSaot7miZOta.md
index eccfd65e2..cc9f8f93a 100644
--- a/src/data/roadmaps/nodejs/content/winston@Oe9cQCz2lwSaot7miZOta.md
+++ b/src/data/roadmaps/nodejs/content/winston@Oe9cQCz2lwSaot7miZOta.md
@@ -4,5 +4,5 @@ winston is designed to be a simple and universal logging library with support fo
 
 Visit the following resources to learn more:
 
-- [@opensource@winston Website](https://github.com/winstonjs/winston)
+- [@opensource@winston](https://github.com/winstonjs/winston?tab=readme-ov-file#readme)
 - -[@article@A Complete Guide to Winston Logging in Node.js](https://betterstack.com/community/guides/logging/how-to-install-setup-and-use-winston-and-morgan-to-log-node-js-applications/)
diff --git a/src/data/roadmaps/nodejs/content/worker-threads@bH2Iv3BX0ZiWD3lOmC_m_.md b/src/data/roadmaps/nodejs/content/worker-threads@bH2Iv3BX0ZiWD3lOmC_m_.md
index 2b656ab13..6a4c05410 100644
--- a/src/data/roadmaps/nodejs/content/worker-threads@bH2Iv3BX0ZiWD3lOmC_m_.md
+++ b/src/data/roadmaps/nodejs/content/worker-threads@bH2Iv3BX0ZiWD3lOmC_m_.md
@@ -5,4 +5,4 @@ With worker threads, we can achieve a much efficient application without creatin
 
 Visit the following resources to learn more:
 
-- [@official@Worker Threads Docs](https://nodejs.org/api/worker_threads.html#worker-threads)
+- [@official@Worker Threads](https://nodejs.org/api/worker_threads.html#worker-threads)
diff --git a/src/data/roadmaps/nodejs/content/working-with-databases@5l-lZ8gwVLqqAF_n99vIO.md b/src/data/roadmaps/nodejs/content/working-with-databases@5l-lZ8gwVLqqAF_n99vIO.md
index eac1d24bc..ef6776311 100644
--- a/src/data/roadmaps/nodejs/content/working-with-databases@5l-lZ8gwVLqqAF_n99vIO.md
+++ b/src/data/roadmaps/nodejs/content/working-with-databases@5l-lZ8gwVLqqAF_n99vIO.md
@@ -4,4 +4,4 @@ A database is an organized collection of structured information, or data, typica
 
 Visit the following resources to learn more:
 
-- [@article@Wikipedia - What is Database?](https://en.wikipedia.org/wiki/Database)
+- [@article@What is Database?](https://en.wikipedia.org/wiki/Database)
diff --git a/src/data/roadmaps/php/content/csrf-protection@J9yIXZTtwbFzH2u4dI1ep.md b/src/data/roadmaps/php/content/csrf-protection@J9yIXZTtwbFzH2u4dI1ep.md
index 36b5706ca..a4911df8d 100644
--- a/src/data/roadmaps/php/content/csrf-protection@J9yIXZTtwbFzH2u4dI1ep.md
+++ b/src/data/roadmaps/php/content/csrf-protection@J9yIXZTtwbFzH2u4dI1ep.md
@@ -18,4 +18,4 @@ if(isset($_POST['csrf']) && $_POST['csrf'] === $_SESSION['csrf']) {
 
 Visit the following resources to learn more:
 
-- [@official@Security Guide](https://php.net/manual/en/security.csrf.php)
+- [@article@PHP Tutorial CSRF] (https://www.phptutorial.net/php-tutorial/php-csrf/)
diff --git a/src/data/roadmaps/php/content/named-arguments@RkNjYva8o_jXp9suz5YdG.md b/src/data/roadmaps/php/content/named-arguments@RkNjYva8o_jXp9suz5YdG.md
index d82c6623a..f1f04e10d 100644
--- a/src/data/roadmaps/php/content/named-arguments@RkNjYva8o_jXp9suz5YdG.md
+++ b/src/data/roadmaps/php/content/named-arguments@RkNjYva8o_jXp9suz5YdG.md
@@ -4,11 +4,11 @@ Named arguments in PHP, introduced with PHP 8.0, allow you to specify the values
 
 ```php
 <?php
-$a = array_fill(start_index: 0, num: 100, value: 50);
+$a = array_fill(start_index: 0, count: 100, value: 50);
 ```
 
-In this code snippet, the parameters are passed by their names ('start_index', 'num', 'value'), not by their order in the function definition.
+In this code snippet, the parameters are passed by their names ('start_index', 'count', 'value'), not by their order in the function definition.
 
 Visit the following resources to learn more:
 
-- [@official@Named Arguments](https://www.php.net/manual/en/functions.arguments.php#functions.named-arguments)
\ No newline at end of file
+- [@official@Named Arguments](https://www.php.net/manual/en/functions.arguments.php#functions.named-arguments)
diff --git a/src/data/roadmaps/php/content/null-safe-operator@1NXSk8VZDr89jQTTkOL7x.md b/src/data/roadmaps/php/content/null-safe-operator@1NXSk8VZDr89jQTTkOL7x.md
index b92259576..0a2099c1c 100644
--- a/src/data/roadmaps/php/content/null-safe-operator@1NXSk8VZDr89jQTTkOL7x.md
+++ b/src/data/roadmaps/php/content/null-safe-operator@1NXSk8VZDr89jQTTkOL7x.md
@@ -4,4 +4,5 @@ The Null Safe Operator is a handy feature in PHP which deals with an issue that
 
 Visit the following resources to learn more:
 
-- [@official@Null Safe Operator](https://www.php.net/manual/en/language.oop5.nullsafe.php)
\ No newline at end of file
+- [@official@The Basics - Manual](https://www.php.net/manual/en/language.oop5.basic.php)
+- [@official@PHP RFC: Nullsafe operator](https://wiki.php.net/rfc/nullsafe_operator)
diff --git a/src/data/roadmaps/php/content/symfony@57VSMVePOr9qUD5x_LNdf.md b/src/data/roadmaps/php/content/symfony@57VSMVePOr9qUD5x_LNdf.md
index 5cb8ebf3f..e3eed8a8e 100644
--- a/src/data/roadmaps/php/content/symfony@57VSMVePOr9qUD5x_LNdf.md
+++ b/src/data/roadmaps/php/content/symfony@57VSMVePOr9qUD5x_LNdf.md
@@ -10,5 +10,5 @@ This will download and install a new Symfony project in the 'myproject' director
 
 Visit the following resources to learn more:
 
-- [@official@Symphony](https://symfony.com/)
-- [@official@Symphony Documentation](https://symfony.com/doc/current/index.html)
+- [@official@Symfony](https://symfony.com/)
+- [@official@Symfony Documentation](https://symfony.com/doc/current/index.html)
diff --git a/src/data/roadmaps/postgresql-dba/content/default-priviliges@t18XjeHP4uRyERdqhHpl5.md b/src/data/roadmaps/postgresql-dba/content/default-privileges@t18XjeHP4uRyERdqhHpl5.md
similarity index 100%
rename from src/data/roadmaps/postgresql-dba/content/default-priviliges@t18XjeHP4uRyERdqhHpl5.md
rename to src/data/roadmaps/postgresql-dba/content/default-privileges@t18XjeHP4uRyERdqhHpl5.md
diff --git a/src/data/roadmaps/postgresql-dba/content/object-priviliges@S20aJB-VuSpXYyd0-0S8c.md b/src/data/roadmaps/postgresql-dba/content/object-privileges@S20aJB-VuSpXYyd0-0S8c.md
similarity index 100%
rename from src/data/roadmaps/postgresql-dba/content/object-priviliges@S20aJB-VuSpXYyd0-0S8c.md
rename to src/data/roadmaps/postgresql-dba/content/object-privileges@S20aJB-VuSpXYyd0-0S8c.md
diff --git a/src/data/roadmaps/postgresql-dba/content/relational-model@mDVbjdVN0spY7dI_8k1YW.md b/src/data/roadmaps/postgresql-dba/content/relational-model@mDVbjdVN0spY7dI_8k1YW.md
index b2f4c388d..c9d69ccec 100644
--- a/src/data/roadmaps/postgresql-dba/content/relational-model@mDVbjdVN0spY7dI_8k1YW.md
+++ b/src/data/roadmaps/postgresql-dba/content/relational-model@mDVbjdVN0spY7dI_8k1YW.md
@@ -4,5 +4,4 @@ The relational model is an approach to organizing and structuring data using tab
 
 Learn more from the following resources:
 
-- [@article@What is the Relational Model?](https://www.postgresql.org/docs/7.1/relmodel-oper.html)
-- [@article@The Relational Model](https://www.geeksforgeeks.org/relational-model-in-dbms/)
\ No newline at end of file
+- [@article@What is the Relational Model?](https://www.postgresql.org/docs/7.1/relmodel-oper.html)
\ No newline at end of file
diff --git a/src/data/roadmaps/postgresql-dba/content/using-pg_ctlcluster@v3SoKmeCh6uxKW5GAAMje.md b/src/data/roadmaps/postgresql-dba/content/using-pg_ctlcluster@v3SoKmeCh6uxKW5GAAMje.md
index 62fab398f..89172e212 100644
--- a/src/data/roadmaps/postgresql-dba/content/using-pg_ctlcluster@v3SoKmeCh6uxKW5GAAMje.md
+++ b/src/data/roadmaps/postgresql-dba/content/using-pg_ctlcluster@v3SoKmeCh6uxKW5GAAMje.md
@@ -4,4 +4,4 @@
 
 Learn more from the following resources:
 
-- [@official@pg_ctlcluster](https://www.postgresql.org/docs/current/pgctlcluster.html)
+- [@article@pg_ctlcluster](https://manpages.ubuntu.com/manpages/focal/man1/pg_ctlcluster.1.html)
diff --git a/src/data/roadmaps/postgresql-dba/postgresql-dba.json b/src/data/roadmaps/postgresql-dba/postgresql-dba.json
index 8d80d4fae..86736f406 100644
--- a/src/data/roadmaps/postgresql-dba/postgresql-dba.json
+++ b/src/data/roadmaps/postgresql-dba/postgresql-dba.json
@@ -2765,7 +2765,7 @@
       },
       "selected": false,
       "data": {
-        "label": "Object Priviliges",
+        "label": "Object Privileges",
         "style": {
           "fontSize": 17,
           "justifyContent": "flex-start",
@@ -2830,7 +2830,7 @@
       },
       "selected": false,
       "data": {
-        "label": "Default Priviliges",
+        "label": "Default Privileges",
         "style": {
           "fontSize": 17,
           "justifyContent": "flex-start",
@@ -8128,4 +8128,4 @@
       "focusable": true
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/src/data/roadmaps/product-manager/content/product-roadmap@gS3ofDrqDRKbecIskIyGi.md b/src/data/roadmaps/product-manager/content/product-roadmap@gS3ofDrqDRKbecIskIyGi.md
index cb5bf7c71..9bba9031a 100644
--- a/src/data/roadmaps/product-manager/content/product-roadmap@gS3ofDrqDRKbecIskIyGi.md
+++ b/src/data/roadmaps/product-manager/content/product-roadmap@gS3ofDrqDRKbecIskIyGi.md
@@ -1,3 +1,7 @@
 # Product Roadmap
 
-The product roadmap is a strategic document that provides a detailed overview of the product's direction and vision. It outlines the product's plans, both tactical and strategic - including the specific steps necessary to achieve the company's goals and vision. As a Product Manager, you are expected to guide the creation of the product roadmap, communicating the product’s evolution to the team, stakeholders, and customers. This tool serves as an essential reference point helping to align all stakeholders with the key priorities and vision of the product, and acts as a guide for decisions around product development.
\ No newline at end of file
+The product roadmap is a strategic document that provides a detailed overview of the product's direction and vision. It outlines the product's plans, both tactical and strategic - including the specific steps necessary to achieve the company's goals and vision. As a Product Manager, you are expected to guide the creation of the product roadmap, communicating the product’s evolution to the team, stakeholders, and customers. This tool serves as an essential reference point helping to align all stakeholders with the key priorities and vision of the product, and acts as a guide for decisions around product development.
+
+Learn more from the following resources:
+- [@article@What is a Product Roadmap? - Product Plan](https://www.productplan.com/learn/what-is-a-product-roadmap/)
+- [@video@What is a Product Roadmap? - Vibhor Chandel](https://www.youtube.com/watch?v=BJR70jnpHog&ab_channel=VibhorChandel)
diff --git a/src/data/roadmaps/prompt-engineering/content/100-basic-llm/101-llm-types.md b/src/data/roadmaps/prompt-engineering/content/100-basic-llm/101-llm-types.md
index d227bb7b1..d9ab5efb9 100644
--- a/src/data/roadmaps/prompt-engineering/content/100-basic-llm/101-llm-types.md
+++ b/src/data/roadmaps/prompt-engineering/content/100-basic-llm/101-llm-types.md
@@ -4,7 +4,7 @@ On a high level, LLMs can be categorized into two types i.e. Base LLMs and Instr
 
 ## Base LLMs
 
-Base LLMs are the LLMs which are designed to predict the next word based on the training data. They are not designed to answer questions, carry out conversations or help solve problems. For example, if you give a base LLM the sentence "In this book about LLMs, we will discuss", it might complete this sentence and give you "In this book about LLMs, we will discsus **what LLMs are, how they work, and how you can leverage them in your applications.**." Or if you give it "What are some famous social networks?", instead of answering it might give back "Why do people use social networks?" or "What are some of the benefits of social networks?". As you can see, it is giving us relevant text but it is not answering the question. This is where the Instruction tuned LLMs come in to the picture.
+Base LLMs are the LLMs which are designed to predict the next word based on the training data. They are not designed to answer questions, carry out conversations or help solve problems. For example, if you give a base LLM the sentence "In this book about LLMs, we will discuss", it might complete this sentence and give you "In this book about LLMs, we will discsus **what LLMs are, how they work, and how you can leverage them in your applications.**" Or if you give it "What are some famous social networks?", instead of answering it might give back "Why do people use social networks?" or "What are some of the benefits of social networks?". As you can see, it is giving us relevant text but it is not answering the question. This is where the Instruction Tuned LLMs come into the picture.
 
 ## Instruction tuned LLMs
 
@@ -22,4 +22,4 @@ Learn more from the following resources:
 
 - [@article@Understanding AI Models: Base Language Learning Models vs. Instruction Tuned Language Learning Models - Olivier Mills](https://oliviermills.com/articles/understanding-ai-models-base-language-learning-models-vs-instruction-tuned-language-learning-models)
 - [@video@Why Are There So Many Foundation Models?](https://www.youtube.com/watch?v=QPQy7jUpmyA)
-- [@video@How to Pick the Right AI Foundation Model](https://www.youtube.com/watch?v=pePAAGfh-IU)
\ No newline at end of file
+- [@video@How to Pick the Right AI Foundation Model](https://www.youtube.com/watch?v=pePAAGfh-IU)
diff --git a/src/data/roadmaps/prompt-engineering/content/102-prompts/good-prompts/100-use-delimiters.md b/src/data/roadmaps/prompt-engineering/content/102-prompts/good-prompts/100-use-delimiters.md
index 70ae4fbb2..61e5cd9cc 100644
--- a/src/data/roadmaps/prompt-engineering/content/102-prompts/good-prompts/100-use-delimiters.md
+++ b/src/data/roadmaps/prompt-engineering/content/102-prompts/good-prompts/100-use-delimiters.md
@@ -21,7 +21,7 @@ Summarize the text delimited by triple curly braces into a single sentence.
 ```
 
 ```
-Translate the text delimited by tripple quotes into Arabic
+Translate the text delimited by triple quotes into Arabic.
 
 """How are you?"""
-```
\ No newline at end of file
+```
diff --git a/src/data/roadmaps/python/content/custom@l7k0qTYe42wYBTlT2-1cy.md b/src/data/roadmaps/python/content/custom@l7k0qTYe42wYBTlT2-1cy.md
index 0c417bfcb..151d38bdd 100644
--- a/src/data/roadmaps/python/content/custom@l7k0qTYe42wYBTlT2-1cy.md
+++ b/src/data/roadmaps/python/content/custom@l7k0qTYe42wYBTlT2-1cy.md
@@ -6,3 +6,4 @@ Visit the following resources to learn more:
 
 - [@official@Python Modules](https://docs.python.org/3/tutorial/modules.html)
 - [@article@Modules in Python](https://www.programiz.com/python-programming/modules)
+- [@article@Python Modules and Packages](https://realpython.com/python-modules-packages/)
diff --git a/src/data/roadmaps/python/content/dictionaries@bc9CL_HMT-R6nXO1eR-gP.md b/src/data/roadmaps/python/content/dictionaries@bc9CL_HMT-R6nXO1eR-gP.md
index 4cebe1e0a..01eb3509f 100644
--- a/src/data/roadmaps/python/content/dictionaries@bc9CL_HMT-R6nXO1eR-gP.md
+++ b/src/data/roadmaps/python/content/dictionaries@bc9CL_HMT-R6nXO1eR-gP.md
@@ -1,8 +1,9 @@
 # Dictionaries
 
-In Python, a dictionary is a built-in data type that allows you to store key-value pairs. Each key in the dictionary is unique, and each key is associated with a value. Dictionaries are unordered collections, meaning the order of items is not guaranteed.
+In Python, a dictionary is a built-in data type that allows you to store key-value pairs. Each key in the dictionary is unique, and each key is associated with a value. Starting from Python 3.7, dictionaries maintain the order of items as they were added.
 
 Learn more from the following resources:
 
 - [@official@Dictionaries in Python](https://docs.python.org/3/tutorial/datastructures.html#dictionaries)
 - [@article@W3 Schools - Dictionaries](https://www.w3schools.com/python/python_dictionaries.asp)
+- [@article@Dictionaries in Python](https://realpython.com/python-dicts/)
diff --git a/src/data/roadmaps/python/content/iterators@aB1LSQjDEQb_BxueOcnxU.md b/src/data/roadmaps/python/content/iterators@aB1LSQjDEQb_BxueOcnxU.md
index 366eee257..b24d77666 100644
--- a/src/data/roadmaps/python/content/iterators@aB1LSQjDEQb_BxueOcnxU.md
+++ b/src/data/roadmaps/python/content/iterators@aB1LSQjDEQb_BxueOcnxU.md
@@ -6,3 +6,4 @@ Visit the following resources to learn more:
 
 - [@article@Iterators in Python](https://www.w3schools.com/python/python_iterators.asp)
 - [@article@Python Iterators](https://www.programiz.com/python-programming/iterator)
+- [@article@Iterators and Iterables in Python](https://realpython.com/python-iterators-iterables/)
diff --git a/src/data/roadmaps/python/content/loops@Dvy7BnNzK55qbh_SgOk8m.md b/src/data/roadmaps/python/content/loops@Dvy7BnNzK55qbh_SgOk8m.md
index f1e947839..e569608bf 100644
--- a/src/data/roadmaps/python/content/loops@Dvy7BnNzK55qbh_SgOk8m.md
+++ b/src/data/roadmaps/python/content/loops@Dvy7BnNzK55qbh_SgOk8m.md
@@ -4,7 +4,6 @@ Loops are used to execute a block of code repeatedly.
 
 Visit the following resources to learn more:
 
-- [@article@Loops in Python](https://www.geeksforgeeks.org/loops-in-python/)
 - [@article@Python "while" Loops (Indefinite Iteration)](https://realpython.com/python-while-loop/)
 - [@article@Python "for" Loops (Definite Iteration)](https://realpython.com/python-for-loop/#the-guts-of-the-python-for-loop)
 - [@video@Python For Loops](https://www.youtube.com/watch?v=KWgYha0clzw)
diff --git a/src/data/roadmaps/python/content/methods-dunder@zAS4YiEJ6VPsyABrkIG8i.md b/src/data/roadmaps/python/content/methods-dunder@zAS4YiEJ6VPsyABrkIG8i.md
index 45982ba48..2d3a0070d 100644
--- a/src/data/roadmaps/python/content/methods-dunder@zAS4YiEJ6VPsyABrkIG8i.md
+++ b/src/data/roadmaps/python/content/methods-dunder@zAS4YiEJ6VPsyABrkIG8i.md
@@ -5,7 +5,7 @@ A method in python is somewhat similar to a function, except it is associated wi
 - The method is implicitly used for an object for which it is called.
 - The method is accessible to data that is contained within the class.
 
-Dunder or magic methods in Python are the methods having two prefix and suffix underscores in the method name. Dunder here means “Double Under (Underscores)”. These are commonly used for operator overloading. Few examples for magic methods are: **`__init__`**, **`__add__`**, **`__len__`**, **`__repr__`** etc.
+Dunder or magic methods in Python are the methods that have two prefix and suffix underscores in the method name. Dunder here means “Double Under (Underscores)”. These are commonly used for operator overloading. Few examples for magic methods are: **`__init__`**, **`__add__`**, **`__len__`**, **`__repr__`** etc.
 
 Visit the following resources to learn more:
 
diff --git a/src/data/roadmaps/python/content/object-oriented-programming@P_Di-XPSDITmU3xKQew8G.md b/src/data/roadmaps/python/content/object-oriented-programming@P_Di-XPSDITmU3xKQew8G.md
index ddb193ee5..413cc2603 100644
--- a/src/data/roadmaps/python/content/object-oriented-programming@P_Di-XPSDITmU3xKQew8G.md
+++ b/src/data/roadmaps/python/content/object-oriented-programming@P_Di-XPSDITmU3xKQew8G.md
@@ -1,6 +1,6 @@
 # OOP
 
-In Python, object-oriented Programming (OOPs) is a programming paradigm that uses objects and classes in programming. It aims to implement real-world entities like inheritance, polymorphisms, encapsulation, etc. in the programming. The main concept of OOPs is to bind the data and the functions that work on that together as a single unit so that no other part of the code can access this data.
+In Python, object-oriented Programming (OOPs) is a programming paradigm that uses objects and classes in programming. It aims to implement real-world entities like inheritance, polymorphism, encapsulation, etc., in programming. The main concept of OOPs is to bind the data and the functions that work on that together as a single unit so that no other part of the code can access this data.
 
 Visit the following resources to learn more:
 
diff --git a/src/data/roadmaps/python/content/ruff@6cB0pvUO1-gvCtgqozP-Q.md b/src/data/roadmaps/python/content/ruff@6cB0pvUO1-gvCtgqozP-Q.md
index 887a4dd4d..630f53dbd 100644
--- a/src/data/roadmaps/python/content/ruff@6cB0pvUO1-gvCtgqozP-Q.md
+++ b/src/data/roadmaps/python/content/ruff@6cB0pvUO1-gvCtgqozP-Q.md
@@ -2,4 +2,4 @@
 
 An extremely fast Python linter and code formatter, written in Rust.
 
-- [@official@ruff documentation](https://docs.astral.sh/ruff/)
+- [@official@Ruff documentation](https://docs.astral.sh/ruff/)
diff --git a/src/data/roadmaps/python/content/tuples@i7xIGiXU-k5UIKHIhQPjE.md b/src/data/roadmaps/python/content/tuples@i7xIGiXU-k5UIKHIhQPjE.md
index c0702b29d..4bb3fa264 100644
--- a/src/data/roadmaps/python/content/tuples@i7xIGiXU-k5UIKHIhQPjE.md
+++ b/src/data/roadmaps/python/content/tuples@i7xIGiXU-k5UIKHIhQPjE.md
@@ -3,3 +3,6 @@
 Tuples are immutable sequences, meaning that once a tuple is created, its elements cannot be changed. Tuples are often used to store related pieces of information. They are defined by placing the elements inside parentheses () separated by commas.
 
 - [@official@Tuples Documentation](https://docs.python.org/3/tutorial/datastructures.html#tuples-and-sequences)
+- [@article@When and How to Use Tuples](https://thenewstack.io/python-for-beginners-when-and-how-to-use-tuples/)
+- [@article@Python's tuple Data Type: A Deep Dive With Examples](https://realpython.com/python-tuple/#getting-started-with-pythons-tuple-data-type)
+- [@video@why are Tuples even a thing?](https://www.youtube.com/watch?v=fR_D_KIAYrE)
diff --git a/src/data/roadmaps/python/faqs.astro b/src/data/roadmaps/python/faqs.astro
index e69de29bb..d94ab94be 100644
--- a/src/data/roadmaps/python/faqs.astro
+++ b/src/data/roadmaps/python/faqs.astro
@@ -0,0 +1,62 @@
+---
+import type { FAQType } from '../../components/FAQs/FAQs.astro';
+
+export const faqs: FAQType[] = [
+  {
+    question: 'What skills does a Python developer need?',
+    answer: [
+      "The skills that a Python developer needs are highly dependent on the industry they'd like to focus on.",
+      'For example, developers interested in backend web development should be familiar with web frameworks such as Django and Flask. They should also spend some time learning about RESTful design, API management, system architecture, and most likely, some SQL for database querying.',
+      "On the other hand, for a Python developer who's more interested in data science (also known as a data scientist), expertise in NumPy, Pandas, and machine learning tools becomes necessary.",
+      'If automation is their focus, developers should look into IaC (Infrastructure as Code) tools and configuration management and delve a bit deeper into cloud platforms and deployment strategies.',
+      'Universally speaking (now outside the domains of Python alone), writing efficient and clean code along with strong problem-solving skills are essential for any development-related role. And you can boost that up with knowledge of data structures and algorithms and understanding object-oriented programming (or functional programming) to top it all up.',
+    ],
+  },
+  {
+    question: 'Is Python easy to learn?',
+    answer: [
+      "Python is considered one of the easiest programming languages to learn because of its simple and readable syntax. To many, Python reads a lot like the English language, greatly reducing the cognitive load involved with understanding other people's code.",
+      'Unlike other languages, Python code requires fewer lines, making it a great choice for beginners. Many universities and coding bootcamps use Python as an introduction to programming because of its logical structure and extensive documentation.',
+      'But in the end, it\'s also important to mention that "easy" is relative, and everyone learns in their own way, and what might be considered simple or easy for the majority of developers doesn\'t automatically make it easy for the rest.',
+      "If you're looking to become a Python developer, the best thing you can do is to focus on following a pre-defined [Python roadmap](https://roadmap.sh/python) and avoid comparing your progress with that of others.",
+    ],
+  },
+  {
+    question: 'Why do beginners use Python?',
+    answer: [
+      'Beginners choose Python because, generally speaking, it tends to be easier to read, write, and understand than many other programming languages.',
+      'Python removes the need for complex syntax rules found in languages like C++ or Java (like the use of squirrely braces, or "&&" and "||" to represent a logical AND or a logical OR operator), allowing developers to focus on solving problems rather than debugging syntax errors.',
+      'On top of that, Python has a vast ecosystem of libraries and frameworks that simplify tasks in web development, data science, and automation, making it very "beginner-friendly" from that POV.',
+      'Finally, the very active and large community around the language (which helps answer questions and provide learning resources to newcomers) is a very appealing characteristic that attracts beginners to Python.',
+    ],
+  },
+  {
+    question: 'Is Python easier than C++?',
+    answer: [
+      'Python is easier than C++ because of its simplified syntax and dynamic typing, making it a more appealing option for new developers.',
+      'Looking at both languages, C++ can be considered to be "lower level" when compared to Python because the former provides an interface that is closer to the actual hardware than the API provided by Python.',
+      'A classic example that shows how C++ is closer to the machine is the language requiring manual memory management. That allows developers to directly interact with hardware components by letting them fine-tune CPU records and more.',
+      'On the other hand, Python handles memory allocation automatically and has a more flexible approach to programming. This higher level of abstraction is what allows Python developers to focus on building software rather than on learning how the machine works so they can build the software on top of it.',
+      'Of course, there are downsides to this approach as well, but when considering ease of adoption, especially for new developers, abstraction helps keep problems at bay.',
+    ],
+  },
+  {
+    question: 'How is Python different from Java?',
+    answer: [
+      'Python is different from Java in many ways. Looking at the syntax alone, Python has a simpler syntax and is dynamically typed, whereas Java is more verbose (and much more similar to that of C or C++) and statically typed.',
+      'In terms of execution, Java requires its code to be compiled so it can be executed inside its virtual machine (known as JVM or Java Virtual Machine), while Python is interpreted, which makes Python a more flexible but often slower option.',
+      'Finally, when considering the best use cases for each language, Python is widely used in data science, automation, and backend development, while Java is more common in enterprise applications, Android development, and large-scale system architectures.',
+      "In the end, there is no best choice between both languages, it's all about your use case and project needs.",
+    ],
+  },
+  {
+    question: 'How long does it take to learn Python?',
+    answer: [
+      'The time it takes to learn Python depends on several things, including your past programming experience, how much you want to learn about the language, and the field in which you want to use Python.',
+      'Generally, most developers going through the learning process can pick up basic Python skills in a few weeks, while mastering the language for professional development could take several months or even years.',
+      'If, on the other hand, you have no prior experience with programming, it can take somewhere between 6 to 8 weeks to learn the basics of Python and programming, as long as you keep the learning consistent.',
+      "Finally, if you're hoping to work as a Python developer, chances are you'll need 6 months to a year of consistent learning and practice on top of having all the programming basics covered.",
+    ],
+  },
+];
+---
diff --git a/src/data/roadmaps/python/python.md b/src/data/roadmaps/python/python.md
index fbaa19124..374e2019a 100644
--- a/src/data/roadmaps/python/python.md
+++ b/src/data/roadmaps/python/python.md
@@ -17,6 +17,40 @@ schema:
   imageUrl: 'https://roadmap.sh/roadmaps/python.png'
   datePublished: '2023-01-05'
   dateModified: '2024-07-31'
+question:
+  title: 'What is a Python developer?'
+  description: |
+    A Python developer is a software developer tasked with building web services, automating tasks, performing data analysis, and everything in between using Python.
+    
+    In terms of responsibilities, they will vary based on their project, company, and seniority. However, they usually include writing efficient code, managing data structures (especially when doing data science with Python), optimizing algorithms, and working with frameworks such as Pandas, TensorFlow, Django, and others.
+    
+    ## How to become a Python developer
+    
+    To become a Python developer, the first step is learning the basics of Python, including data types, functions, and object-oriented programming (you can get away without learning OOP as well since Python allows for a hybrid programming model). 
+    
+    Understanding how to work with Python libraries like NumPy, Pandas, and Requests is also essential. Since Python can be used in many different ways, picking the right library and framework to focus on depends on you and your intentions with the language.
+    
+    Beyond coding skills, to become a great Python developer, you should also spend some time looking into data structures like linked lists, trees, and hash maps. While they're not critical to building applications, they're great tools to show you how to solve problems in different ways.
+    
+    Python developers should also learn about version control systems like Git, and completing projects that involve APIs, automation, or data processing helps in building a strong portfolio. One way to do this is by contributing to open-source projects to get hands-on experience and improve your problem-solving skills.
+    
+    ## Is Python a frontend or backend language?
+    
+    Python is a backend language, as the only language natively supported by browsers is JavaScript. On the backend, it is used to build the server-side logic that handles data processing, authentication, and even database management. 
+    
+    While it can be used on the frontend through the addition of extra libraries such as [PyScript](https://pyscript.net/), this is not a normal practice as it adds dependencies and extra logic to already complex applications.
+    
+    In web development, Python is often used alongside Django or Flask to build robust backend services. It is also used for API development, data processing, and automation. 	
+    
+    ## What is Python used for?
+    
+    Python is used for many different things and across multiple domains, given how versatile it is. 
+    
+    In web development, for example, Python can be used with frameworks like Django and Flask to help developers create scalable applications. In data science, it is the de facto language for data analysis, machine learning, and artificial intelligence (thanks to libraries like Pandas, NumPy, and TensorFlow).
+    
+    In the field of automation, this language is also very popular, allowing developers to streamline repetitive tasks through Python code. 
+    
+    Finally, even though it's not as popular in these industries, Python can be used in cybersecurity, embedded systems, and even game development. Many companies use Python for cloud computing and backend services because of its simplicity and extensive support for integration with external systems.
 seo:
   title: 'Learn to become a modern Python developer'
   description: 'Community driven, articles, resources, guides, interview questions, quizzes for python development. Learn to become a modern Python developer by following the steps, skills, resources and guides listed in this roadmap.'
diff --git a/src/data/roadmaps/qa/content/regression-testing@XCeXiKvBblmDArfbWjDvw.md b/src/data/roadmaps/qa/content/regression-testing@XCeXiKvBblmDArfbWjDvw.md
index 935a4c199..9ab5bda98 100644
--- a/src/data/roadmaps/qa/content/regression-testing@XCeXiKvBblmDArfbWjDvw.md
+++ b/src/data/roadmaps/qa/content/regression-testing@XCeXiKvBblmDArfbWjDvw.md
@@ -4,6 +4,6 @@ Regression Testing is a type of software testing to confirm that a recent progra
 
 Visit the following resources to learn more:
 
-- [@article@Regression Testing](https://www.javatpoint.com/regression-testing)
+- [@article@Regression Testing](https://www.tpointtech.com/regression-testing)
 - [@article@What is Regression Testing with Test Cases](https://www.guru99.com/regression-testing.html)
-- [@feed@Explore top posts about Testing](https://app.daily.dev/tags/testing?ref=roadmapsh)
\ No newline at end of file
+- [@feed@Explore top posts about Testing](https://app.daily.dev/tags/testing?ref=roadmapsh)
diff --git a/src/data/roadmaps/redis/content/atomicity-in-redis@jrgaoDnt_RxTu79hk4hCD.md b/src/data/roadmaps/redis/content/atomicity-in-redis@jrgaoDnt_RxTu79hk4hCD.md
index dec8201d9..0830cf15b 100644
--- a/src/data/roadmaps/redis/content/atomicity-in-redis@jrgaoDnt_RxTu79hk4hCD.md
+++ b/src/data/roadmaps/redis/content/atomicity-in-redis@jrgaoDnt_RxTu79hk4hCD.md
@@ -5,4 +5,4 @@ Atomicity in Redis refers to the property that ensures a set of operations is ex
 Learn more from the following resources:
 
 - [@official@Atomicity with Lua](https://redis.io/learn/develop/java/spring/rate-limiting/fixed-window/reactive-lua)
--[@article@Atomicity in Redis operations](https://lucaspin.medium.com/atomicity-in-redis-operations-a1d7bc9f4a90)
+- [@article@Atomicity in Redis operations](https://lucaspin.medium.com/atomicity-in-redis-operations-a1d7bc9f4a90)
diff --git a/src/data/roadmaps/redis/content/lists@4-C4XqACUp4nvcMIj6djF.md b/src/data/roadmaps/redis/content/lists@4-C4XqACUp4nvcMIj6djF.md
index 8ad63ec2f..60c5a752b 100644
--- a/src/data/roadmaps/redis/content/lists@4-C4XqACUp4nvcMIj6djF.md
+++ b/src/data/roadmaps/redis/content/lists@4-C4XqACUp4nvcMIj6djF.md
@@ -4,5 +4,4 @@ Lists in Redis are ordered collections of string elements, allowing operations s
 
 Learn more from the following resources:
 
-- [@official@Redis Lists](https://redis.io/docs/latest/develop/data-types/lists/)
-- [@article@Complete Guide to Redis Lists](https://www.geeksforgeeks.org/complete-guide-to-redis-lists/)
\ No newline at end of file
+- [@official@Redis Lists](https://redis.io/docs/latest/develop/data-types/lists/)
\ No newline at end of file
diff --git a/src/data/roadmaps/redis/content/pipelining@LHlwjN3WHYUBUafzzwsWQ.md b/src/data/roadmaps/redis/content/pipelining@LHlwjN3WHYUBUafzzwsWQ.md
index e7d34a9ce..df685b512 100644
--- a/src/data/roadmaps/redis/content/pipelining@LHlwjN3WHYUBUafzzwsWQ.md
+++ b/src/data/roadmaps/redis/content/pipelining@LHlwjN3WHYUBUafzzwsWQ.md
@@ -4,5 +4,4 @@ Pipelining in Redis is a technique that allows clients to send multiple commands
 
 Learn more from the following resources:
 
-- [@official@Redis Pipelining](https://redis.io/docs/latest/develop/use/pipelining/)
-- [@article@Complete Guide to Redis Pipelining](https://www.geeksforgeeks.org/complete-guide-to-redis-pipelining/)
\ No newline at end of file
+- [@official@Redis Pipelining](https://redis.io/docs/latest/develop/use/pipelining/)
\ No newline at end of file
diff --git a/src/data/roadmaps/redis/content/rpop@brUGqWZ287EWtvl9uUbNt.md b/src/data/roadmaps/redis/content/rpop@brUGqWZ287EWtvl9uUbNt.md
index 9d491cf3a..2ef6a8e7f 100644
--- a/src/data/roadmaps/redis/content/rpop@brUGqWZ287EWtvl9uUbNt.md
+++ b/src/data/roadmaps/redis/content/rpop@brUGqWZ287EWtvl9uUbNt.md
@@ -4,4 +4,4 @@ The RPOP command removes and then returns the last elements of the list stored a
 
 Learn more from the following resources:
 
-- [@official@RPOP Documentation](https://redis.io/docs/latest/commands/rpush/)
\ No newline at end of file
+- [@official@RPOP Documentation](https://redis.io/docs/latest/commands/rpop/)
diff --git a/src/data/roadmaps/rust/content/100-introduction/index.md b/src/data/roadmaps/rust/content/100-introduction/index.md
index eb4d78709..a81e06136 100644
--- a/src/data/roadmaps/rust/content/100-introduction/index.md
+++ b/src/data/roadmaps/rust/content/100-introduction/index.md
@@ -5,3 +5,4 @@ Rust is a modern system programming language focused on performance, safety, and
 - [@official@Rust by Example](https://doc.rust-lang.org/stable/rust-by-example/index.html)
 - [@official@Official Website](https://www.rust-lang.org/)
 - [@opensource@Rust Book](https://edu.anarcho-copy.org/Programming%20Languages/Rust/rust-programming-language-steve-klabnik.pdf)
+- [@opensource@Rust Book Interactive](https://rust-book.cs.brown.edu/experiment-intro.html)
diff --git a/src/data/roadmaps/server-side-game-developer/content/cc@E4H3hniIW6hKpH3Qr--N5.md b/src/data/roadmaps/server-side-game-developer/content/cc@E4H3hniIW6hKpH3Qr--N5.md
index ea412a98a..dba30aca0 100644
--- a/src/data/roadmaps/server-side-game-developer/content/cc@E4H3hniIW6hKpH3Qr--N5.md
+++ b/src/data/roadmaps/server-side-game-developer/content/cc@E4H3hniIW6hKpH3Qr--N5.md
@@ -1,3 +1,6 @@
 # C / C++
 
-"C" and "C++", often written as "C/CPP", are two significantly prominent and similar programming languages widely used in server-side game development. "C" is a procedural language, which means that it follows a step-by-step procedure to solve a problem, while "C++" is both a procedural and object-oriented programming (OOP) language. This dual nature of "C++" allows it to handle more complex interrelated data and functions efficiently, which is a beneficial feature in game development. Moreover, "C++" is an extension of "C", meaning that any legal "C" program is also a valid "C++" program. Both languages offer a high degree of control over system resources and memory, making them an excellent choice for building fast and efficient server-side applications, such as multiplayer game servers.
\ No newline at end of file
+"C" and "C++", often written as "C/CPP", are two significantly prominent and similar programming languages widely used in server-side game development. "C" is a procedural language, which means that it follows a step-by-step procedure to solve a problem, while "C++" is both a procedural and object-oriented programming (OOP) language. This dual nature of "C++" allows it to handle more complex interrelated data and functions efficiently, which is a beneficial feature in game development. Moreover, "C++" is an extension of "C", meaning that any legal "C" program is also a valid "C++" program. Both languages offer a high degree of control over system resources and memory, making them an excellent choice for building fast and efficient server-side applications, such as multiplayer game servers.
+
+- [@article@C Programming Language](https://en.wikipedia.org/wiki/C_%28programming_language%29)
+- [@article@C++ Programming Language](https://en.wikipedia.org/wiki/C%2B%2B)
diff --git a/src/data/roadmaps/software-architect/content/important-skills-to-learn@lBtlDFPEQvQ_xtLtehU0S.md b/src/data/roadmaps/software-architect/content/important-skills-to-learn@lBtlDFPEQvQ_xtLtehU0S.md
index 2a6d3b94c..938a8ac36 100644
--- a/src/data/roadmaps/software-architect/content/important-skills-to-learn@lBtlDFPEQvQ_xtLtehU0S.md
+++ b/src/data/roadmaps/software-architect/content/important-skills-to-learn@lBtlDFPEQvQ_xtLtehU0S.md
@@ -12,7 +12,3 @@ To support the laid-out activities specific skills are required. From my experie
 - Balance
 - Consult
 - Market
-
-Visit the following resources to learn more:
-
-- [@article@Software Architect Skills](https://www.geeksforgeeks.org/software-architects-skills/)
\ No newline at end of file
diff --git a/src/data/roadmaps/software-architect/content/levels-of-architecture@2sR4KULvAUUoOtopvsEBs.md b/src/data/roadmaps/software-architect/content/levels-of-architecture@2sR4KULvAUUoOtopvsEBs.md
index ba56b5894..52f97c43d 100644
--- a/src/data/roadmaps/software-architect/content/levels-of-architecture@2sR4KULvAUUoOtopvsEBs.md
+++ b/src/data/roadmaps/software-architect/content/levels-of-architecture@2sR4KULvAUUoOtopvsEBs.md
@@ -5,7 +5,3 @@ Architecture can be done on several “levels” of abstractions. The level infl
 - **Application Level:** The lowest level of architecture. Focus on one single application. Very detailed, low level design. Communication is usually within one development team.
 - **Solution Level:** The mid-level of architecture. Focus on one or more applications which fulfill a business need (business solution). Some high, but mainly low-level design. Communication is between multiple development teams.
 - **Enterprise Level:** The highest level of architecture. Focus on multiple solutions. High level, abstract design, which needs to be detailed out by solution or application architects. Communication is across the organization.
-
-Visit the following resources to learn more:
-
-- [@article@Software Engineering Architecture](https://www.geeksforgeeks.org/software-engineering-architectural-design/)
\ No newline at end of file
diff --git a/src/data/roadmaps/software-architect/content/patterns--design-principles@_U0VoTkqM1d6NR13p5azS.md b/src/data/roadmaps/software-architect/content/patterns--design-principles@_U0VoTkqM1d6NR13p5azS.md
index dc7101266..495786919 100644
--- a/src/data/roadmaps/software-architect/content/patterns--design-principles@_U0VoTkqM1d6NR13p5azS.md
+++ b/src/data/roadmaps/software-architect/content/patterns--design-principles@_U0VoTkqM1d6NR13p5azS.md
@@ -1 +1,3 @@
 # Patterns and design principles
+
+In the realm of software architecture, patterns and design principles are foundational tools that enable architects to create robust, scalable, and maintainable systems. They offer proven solutions to common problems and guide decision-making throughout the software development lifecycle. Understanding these concepts is essential for anyone following a software architect roadmap, as they bridge the gap between high-level architecture and practical implementation.
diff --git a/src/data/roadmaps/software-architect/content/tcpip-model@UCCT7-E_QUKPg3jAsjobx.md b/src/data/roadmaps/software-architect/content/tcpip-model@UCCT7-E_QUKPg3jAsjobx.md
index 8ea19b0f4..487e914bb 100644
--- a/src/data/roadmaps/software-architect/content/tcpip-model@UCCT7-E_QUKPg3jAsjobx.md
+++ b/src/data/roadmaps/software-architect/content/tcpip-model@UCCT7-E_QUKPg3jAsjobx.md
@@ -13,5 +13,4 @@ The `TCP/IP model` defines how devices should transmit data between them and ena
 Visit the following resources to learn more:
 
 - [@article@What is Transmission Control Protocol TCP/IP? - Fortinet](https://www.fortinet.com/resources/cyberglossary/tcp-ip#:~:text=The%20TCP%2FIP%20model%20defines,exchanged%20and%20organized%20over%20networks.)
-- [@article@TCP/IP Model](https://www.geeksforgeeks.org/tcp-ip-model/)
 - [@article@What is TCP/IP and How Does it Work?](https://www.techtarget.com/searchnetworking/definition/TCP-IP)git reset
\ No newline at end of file
diff --git a/src/data/roadmaps/software-architect/content/tools@SuMhTyaBS9vwASxAt39DH.md b/src/data/roadmaps/software-architect/content/tools@SuMhTyaBS9vwASxAt39DH.md
index d6b0fb073..d106280d2 100644
--- a/src/data/roadmaps/software-architect/content/tools@SuMhTyaBS9vwASxAt39DH.md
+++ b/src/data/roadmaps/software-architect/content/tools@SuMhTyaBS9vwASxAt39DH.md
@@ -1,7 +1,3 @@
 # Architect Tools
 
 Architect tools are software tools that help architects to design, document, and manage software architectures. These tools can be used to create architecture diagrams, generate code, and automate the software development process.
-
-Visit the following resources to learn more:
-
-- [@article@Top 10 Software Architecture Tools in 2024](https://www.geeksforgeeks.org/software-architecture-tools/)
\ No newline at end of file
diff --git a/src/data/roadmaps/sql/sql.json b/src/data/roadmaps/sql/sql.json
index 226030509..fab8673ae 100644
--- a/src/data/roadmaps/sql/sql.json
+++ b/src/data/roadmaps/sql/sql.json
@@ -1,5585 +1 @@
-{
-  "nodes": [
-    {
-      "id": "uAWe6RysRWSe8PqyYQKKX",
-      "type": "vertical",
-      "position": {
-        "x": 92.74891832888147,
-        "y": 1732.8028446032797
-      },
-      "selected": false,
-      "data": {
-        "label": "vertical node",
-        "style": {
-          "strokeDasharray": "0.8 8",
-          "strokeLinecap": "round",
-          "strokeWidth": 3.5,
-          "stroke": "#2B78E4"
-        }
-      },
-      "zIndex": 999,
-      "width": 20,
-      "height": 101,
-      "style": {
-        "width": 20,
-        "height": 101
-      },
-      "positionAbsolute": {
-        "x": 92.74891832888147,
-        "y": 1732.8028446032797
-      },
-      "dragging": false,
-      "resizing": false,
-      "focusable": true
-    },
-    {
-      "id": "GEdhZU9WflZsSbHIAL6Y8",
-      "type": "section",
-      "position": {
-        "x": -599.9741508977197,
-        "y": 1805.4578222275159
-      },
-      "width": 271,
-      "height": 270,
-      "style": {
-        "width": 271,
-        "height": 270
-      },
-      "selected": false,
-      "data": {
-        "style": {
-          "backgroundColor": "#ffffff",
-          "borderColor": "#000000"
-        }
-      },
-      "positionAbsolute": {
-        "x": -599.9741508977197,
-        "y": 1805.4578222275159
-      },
-      "dragging": false,
-      "focusable": true
-    },
-    {
-      "id": "hWk-3dRw9XQyHpc9_oxet",
-      "type": "vertical",
-      "position": {
-        "x": -111.76200280604616,
-        "y": 1372.4268132068846
-      },
-      "selected": false,
-      "data": {
-        "label": "vertical node",
-        "style": {
-          "strokeDasharray": "0.8 8",
-          "strokeLinecap": "round",
-          "strokeWidth": 3.5,
-          "stroke": "#2B78E4"
-        }
-      },
-      "zIndex": 999,
-      "width": 20,
-      "height": 167,
-      "style": {
-        "width": 20,
-        "height": 167
-      },
-      "positionAbsolute": {
-        "x": -111.76200280604616,
-        "y": 1372.4268132068846
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "bxQ-MepnAll0CkNFpqeJA",
-      "type": "vertical",
-      "position": {
-        "x": 244.58982076233502,
-        "y": 1372.4268132068846
-      },
-      "selected": false,
-      "data": {
-        "label": "vertical node",
-        "style": {
-          "strokeDasharray": "0.8 8",
-          "strokeLinecap": "round",
-          "strokeWidth": 3.5,
-          "stroke": "#2B78E4"
-        },
-        "oldId": "hWk-3dRw9XQyHpc9_oxet"
-      },
-      "zIndex": 999,
-      "width": 20,
-      "height": 167,
-      "style": {
-        "width": 20,
-        "height": 167
-      },
-      "positionAbsolute": {
-        "x": 244.58982076233502,
-        "y": 1372.4268132068846
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "V800FmJL7JvYLHj_s6Qpe",
-      "type": "vertical",
-      "position": {
-        "x": 368.94949271295843,
-        "y": 1461.4268132068846
-      },
-      "selected": false,
-      "data": {
-        "label": "vertical node",
-        "style": {
-          "strokeDasharray": "0.8 8",
-          "strokeLinecap": "round",
-          "strokeWidth": 3.5,
-          "stroke": "#2B78E4"
-        },
-        "oldId": "hWk-3dRw9XQyHpc9_oxet"
-      },
-      "zIndex": 999,
-      "width": 20,
-      "height": 78,
-      "style": {
-        "width": 20,
-        "height": 78
-      },
-      "positionAbsolute": {
-        "x": 368.94949271295843,
-        "y": 1461.4268132068846
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "XeLCXJ5VfwHrIFGqcB8QH",
-      "type": "vertical",
-      "position": {
-        "x": 335.47198755548254,
-        "y": 1208.3834408721723
-      },
-      "selected": false,
-      "data": {
-        "label": "vertical node",
-        "style": {
-          "strokeDasharray": "0.8 8",
-          "strokeLinecap": "round",
-          "strokeWidth": 3.5,
-          "stroke": "#2B78E4"
-        }
-      },
-      "zIndex": 999,
-      "width": 20,
-      "height": 95,
-      "style": {
-        "width": 20,
-        "height": 95
-      },
-      "positionAbsolute": {
-        "x": 335.47198755548254,
-        "y": 1208.3834408721723
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "eyqdjMFVONWDshElnh-fS",
-      "type": "section",
-      "position": {
-        "x": -314.2510816711185,
-        "y": 1122.8834408721723
-      },
-      "width": 218,
-      "height": 196,
-      "style": {
-        "width": 218,
-        "height": 195.5
-      },
-      "selected": false,
-      "data": {
-        "style": {
-          "backgroundColor": "#ffffff",
-          "borderColor": "#000000"
-        }
-      },
-      "positionAbsolute": {
-        "x": -314.2510816711185,
-        "y": 1122.8834408721723
-      },
-      "selectable": true,
-      "focusable": true,
-      "resizing": false,
-      "dragging": false
-    },
-    {
-      "id": "5iMBYXe8Al0ZeiRBnJ-cn",
-      "type": "vertical",
-      "position": {
-        "x": -193.26200280604616,
-        "y": 821.8865696806382
-      },
-      "selected": false,
-      "data": {
-        "label": "vertical node",
-        "style": {
-          "stroke": "#2B78E4",
-          "strokeWidth": 3.65
-        }
-      },
-      "zIndex": 999,
-      "width": 20,
-      "height": 287,
-      "style": {
-        "width": 20,
-        "height": 287
-      },
-      "positionAbsolute": {
-        "x": -193.26200280604616,
-        "y": 821.8865696806382
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "H-11E5G6rdTKj3k7PK12l",
-      "type": "section",
-      "position": {
-        "x": -612.7510816711185,
-        "y": 1124.7304293708296
-      },
-      "selected": false,
-      "data": {
-        "label": "",
-        "style": {
-          "width": 150,
-          "height": 100,
-          "fontSize": 17,
-          "backgroundColor": "#ffffff",
-          "borderColor": "#000000"
-        }
-      },
-      "zIndex": -999,
-      "width": 243,
-      "height": 216,
-      "style": {
-        "width": 243,
-        "height": 216
-      },
-      "positionAbsolute": {
-        "x": -612.7510816711185,
-        "y": 1124.7304293708296
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "6FdHTzqQwJqR4czP5qXAY",
-      "type": "section",
-      "position": {
-        "x": -45.25108167111853,
-        "y": 897.7304293708296
-      },
-      "selected": false,
-      "data": {
-        "label": "",
-        "style": {
-          "width": 150,
-          "height": 100,
-          "fontSize": 17,
-          "backgroundColor": "#ffffff",
-          "borderColor": "#000000"
-        }
-      },
-      "zIndex": -999,
-      "width": 238,
-      "height": 160,
-      "style": {
-        "width": 238,
-        "height": 160
-      },
-      "dragging": false,
-      "resizing": false,
-      "positionAbsolute": {
-        "x": -45.25108167111853,
-        "y": 897.7304293708296
-      },
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "nSShTLakj1E_JAHdcsfe4",
-      "type": "section",
-      "position": {
-        "x": -45.25108167111853,
-        "y": 1051.8865696806383
-      },
-      "selected": false,
-      "data": {
-        "label": "",
-        "style": {
-          "width": 150,
-          "height": 100,
-          "fontSize": 17,
-          "backgroundColor": "#ffffff",
-          "borderColor": "#000000"
-        }
-      },
-      "zIndex": -999,
-      "width": 238,
-      "height": 163,
-      "style": {
-        "width": 238,
-        "height": 163
-      },
-      "positionAbsolute": {
-        "x": -45.25108167111853,
-        "y": 1051.8865696806383
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "OPT7zGno_ghrrj4dAUKaW",
-      "type": "horizontal",
-      "position": {
-        "x": -369.7510816711185,
-        "y": 967.7304293708296
-      },
-      "selected": false,
-      "data": {
-        "label": "horizontal node",
-        "style": {
-          "strokeDasharray": "0.8 8",
-          "strokeLinecap": "round",
-          "strokeWidth": 3.5,
-          "stroke": "#2B78E4"
-        }
-      },
-      "zIndex": 999,
-      "width": 95,
-      "height": 20,
-      "style": {
-        "width": 95,
-        "height": 20
-      },
-      "positionAbsolute": {
-        "x": -369.7510816711185,
-        "y": 967.7304293708296
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "vVvwzfWSzMXhGop1nX_9k",
-      "type": "section",
-      "position": {
-        "x": -612.7510816711185,
-        "y": 914.2304293708296
-      },
-      "selected": false,
-      "data": {
-        "label": "",
-        "style": {
-          "width": 150,
-          "height": 100,
-          "fontSize": 17,
-          "backgroundColor": "#ffffff",
-          "borderColor": "#000000"
-        }
-      },
-      "zIndex": -999,
-      "width": 243,
-      "height": 214,
-      "style": {
-        "width": 243,
-        "height": 214
-      },
-      "resizing": false,
-      "dragging": false,
-      "positionAbsolute": {
-        "x": -612.7510816711185,
-        "y": 914.2304293708296
-      },
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "BZD3zEjZNwFZN5Erp2UwN",
-      "type": "vertical",
-      "position": {
-        "x": -193.26200280604616,
-        "y": 749.0530101616195
-      },
-      "selected": false,
-      "data": {
-        "label": "vertical node",
-        "style": {
-          "strokeDasharray": "0.8 8",
-          "strokeLinecap": "round",
-          "strokeWidth": 3.5,
-          "stroke": "#2B78E4"
-        }
-      },
-      "zIndex": 999,
-      "width": 20,
-      "height": 78,
-      "style": {
-        "width": 20,
-        "height": 78
-      },
-      "positionAbsolute": {
-        "x": -193.26200280604616,
-        "y": 749.0530101616195
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "WigElh37ztiRYRstQR9NE",
-      "type": "section",
-      "position": {
-        "x": -615.2510816711185,
-        "y": 697.2304293708296
-      },
-      "selected": false,
-      "data": {
-        "label": "",
-        "style": {
-          "width": 150,
-          "height": 100,
-          "fontSize": 17,
-          "backgroundColor": "#ffffff",
-          "borderColor": "#000000"
-        }
-      },
-      "zIndex": -999,
-      "width": 317,
-      "height": 73,
-      "style": {
-        "width": 317,
-        "height": 73
-      },
-      "resizing": false,
-      "positionAbsolute": {
-        "x": -615.2510816711185,
-        "y": 697.2304293708296
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "tUokjJrzZ4hp8c6f7iBI0",
-      "type": "horizontal",
-      "position": {
-        "x": 90.44949271295843,
-        "y": 807.3865696806382
-      },
-      "selected": false,
-      "data": {
-        "label": "horizontal node",
-        "style": {
-          "stroke": "#2B78E4",
-          "strokeWidth": 3.65
-        },
-        "oldId": "Zr7u2K8_wGkPwWzTvSJJu"
-      },
-      "zIndex": 999,
-      "width": 138,
-      "height": 20,
-      "style": {
-        "width": 138,
-        "height": 20
-      },
-      "positionAbsolute": {
-        "x": 90.44949271295843,
-        "y": 807.3865696806382
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "Zr7u2K8_wGkPwWzTvSJJu",
-      "type": "horizontal",
-      "position": {
-        "x": 117.44949271295843,
-        "y": 662.3865696806382
-      },
-      "selected": false,
-      "data": {
-        "label": "horizontal node",
-        "style": {
-          "stroke": "#2B78E4",
-          "strokeWidth": 3.65
-        }
-      },
-      "zIndex": 999,
-      "width": 138,
-      "height": 20,
-      "style": {
-        "width": 138,
-        "height": 20
-      },
-      "positionAbsolute": {
-        "x": 117.44949271295843,
-        "y": 662.3865696806382
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "zO8ETJn55ShzPf8ifDqO2",
-      "type": "horizontal",
-      "position": {
-        "x": -271.26200280604616,
-        "y": 295.2980966830105
-      },
-      "selected": false,
-      "data": {
-        "label": "horizontal node",
-        "style": {
-          "stroke": "#2B78E4",
-          "strokeWidth": 3.75
-        }
-      },
-      "zIndex": 999,
-      "width": 225,
-      "height": 20,
-      "style": {
-        "width": 225,
-        "height": 20
-      },
-      "positionAbsolute": {
-        "x": -271.26200280604616,
-        "y": 295.2980966830105
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "80OaUGoB4961Qak9JZ7sS",
-      "type": "vertical",
-      "position": {
-        "x": 147.0258491022803,
-        "y": 300.7980966830105
-      },
-      "selected": false,
-      "data": {
-        "label": "vertical node",
-        "style": {
-          "strokeDasharray": "0.8 8",
-          "strokeLinecap": "round",
-          "strokeWidth": 3.5,
-          "stroke": "#2B78E4"
-        }
-      },
-      "zIndex": 999,
-      "width": 20,
-      "height": 104,
-      "style": {
-        "width": 20,
-        "height": 104
-      },
-      "positionAbsolute": {
-        "x": 147.0258491022803,
-        "y": 300.7980966830105
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "6yiWcpPgkAuYFZlDGlM1P",
-      "type": "vertical",
-      "position": {
-        "x": 147.0258491022803,
-        "y": 171.52074126997718
-      },
-      "selected": false,
-      "data": {
-        "label": "vertical node",
-        "style": {
-          "stroke": "#2B78E4",
-          "strokeWidth": 3.65
-        }
-      },
-      "zIndex": 999,
-      "width": 20,
-      "height": 144,
-      "style": {
-        "width": 20,
-        "height": 144
-      },
-      "positionAbsolute": {
-        "x": 147.0258491022803,
-        "y": 171.52074126997718
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true,
-      "resizing": false
-    },
-    {
-      "id": "vpSPxfiH2jcZiDF4glMnG",
-      "type": "vertical",
-      "position": {
-        "x": 348.94949271295843,
-        "y": 171.52074126997718
-      },
-      "selected": false,
-      "data": {
-        "label": "vertical node",
-        "style": {
-          "strokeDasharray": "0.8 8",
-          "strokeLinecap": "round",
-          "strokeWidth": 3.5,
-          "stroke": "#2B78E4"
-        }
-      },
-      "zIndex": 999,
-      "width": 20,
-      "height": 111,
-      "style": {
-        "width": 20,
-        "height": 111
-      },
-      "positionAbsolute": {
-        "x": 348.94949271295843,
-        "y": 171.52074126997718
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "7YsPMUciWuosgKwI9YJrI",
-      "type": "section",
-      "position": {
-        "x": -611.8883211898742,
-        "y": 198.5207412699772
-      },
-      "selected": false,
-      "data": {
-        "label": "",
-        "style": {
-          "width": 150,
-          "height": 100,
-          "fontSize": 17,
-          "backgroundColor": "#ffffff",
-          "borderColor": "#000000"
-        }
-      },
-      "zIndex": -999,
-      "width": 232,
-      "height": 164,
-      "style": {
-        "width": 232,
-        "height": 164
-      },
-      "resizing": false,
-      "dragging": false,
-      "positionAbsolute": {
-        "x": -611.8883211898742,
-        "y": 198.5207412699772
-      },
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "width": 20,
-      "height": 76,
-      "id": "LEijbLyxg4RyutKEM2Y5g",
-      "type": "vertical",
-      "position": {
-        "x": -114.16916540260297,
-        "y": -227.7695706291704
-      },
-      "selected": false,
-      "data": {
-        "label": "vertical node",
-        "style": {
-          "strokeDasharray": "0.8 8",
-          "strokeLinecap": "round",
-          "strokeWidth": 3.5,
-          "stroke": "#0A33FF"
-        },
-        "oldId": "xD07fJ1NmNeAarVCEfubU"
-      },
-      "zIndex": 999,
-      "positionAbsolute": {
-        "x": -114.16916540260297,
-        "y": -227.7695706291704
-      },
-      "dragging": false,
-      "focusable": true,
-      "style": {
-        "width": 20,
-        "height": 76
-      },
-      "resizing": false,
-      "selectable": true
-    },
-    {
-      "id": "yHmHXymPNWwu8p1vvqD3o",
-      "type": "paragraph",
-      "position": {
-        "x": 110.84147172248669,
-        "y": -233.7695706291704
-      },
-      "selected": false,
-      "data": {
-        "label": "Find the detailed version of this roadmap and other similar roadmaps",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "left",
-          "borderColor": "#000000",
-          "backgroundColor": "#FFFFFf"
-        }
-      },
-      "zIndex": 999,
-      "width": 328,
-      "height": 138,
-      "positionAbsolute": {
-        "x": 110.84147172248669,
-        "y": -233.7695706291704
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true,
-      "style": {
-        "width": 328,
-        "height": 138
-      },
-      "resizing": false
-    },
-    {
-      "id": "R_Fs6rdl2XtQ9aLOubMqL",
-      "type": "button",
-      "position": {
-        "x": 121.34147172248669,
-        "y": -156.7840072114252
-      },
-      "selected": false,
-      "data": {
-        "label": "roadmap.sh",
-        "href": "https://roadmap.sh",
-        "color": "#ffffff",
-        "backgroundColor": "#4136D6",
-        "style": {
-          "fontSize": 17
-        },
-        "oldId": "2zqZkyVgigifcRS1H7F_b"
-      },
-      "zIndex": 999,
-      "width": 307,
-      "height": 49,
-      "dragging": false,
-      "style": {
-        "width": 307,
-        "height": 49
-      },
-      "resizing": false,
-      "positionAbsolute": {
-        "x": 121.34147172248669,
-        "y": -156.7840072114252
-      },
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "Y3FQ2wGWFb1VciLEVEGUf",
-      "type": "linksgroup",
-      "position": {
-        "x": -615.9741508977197,
-        "y": -233.7695706291704
-      },
-      "selected": false,
-      "data": {
-        "label": "Related Roadmaps",
-        "links": [
-          {
-            "id": "yFz6Tz37UtT8Q0NVDPl3H",
-            "label": "PostgreSQL Roadmap",
-            "url": "https://roadmap.sh/postgresql-dba"
-          },
-          {
-            "id": "PEA4CJvPLfhUc9S8CU_Dm",
-            "label": "MongoDB Roadmap",
-            "url": "https://roadmap.sh/mongodb"
-          },
-          {
-            "id": "Lk_Ancllvboaz-jcPQdZQ",
-            "label": "Backend Roadmap",
-            "url": "https://roadmap.sh/backend"
-          }
-        ]
-      },
-      "zIndex": 999,
-      "width": 344,
-      "height": 166,
-      "positionAbsolute": {
-        "x": -615.9741508977197,
-        "y": -233.7695706291704
-      },
-      "dragging": false,
-      "style": {
-        "width": 344,
-        "height": 166
-      },
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "xwpc_KxehAruFM0pCQnie",
-      "type": "vertical",
-      "position": {
-        "x": -178.82615613784935,
-        "y": 2214.6370362009566
-      },
-      "selected": false,
-      "data": {
-        "label": "vertical node",
-        "style": {
-          "strokeDasharray": "0.8 8",
-          "strokeLinecap": "round",
-          "strokeWidth": 3.5,
-          "stroke": "#4136D4"
-        },
-        "oldId": "Ju00mr0KLGN2BV6yEQGPt"
-      },
-      "zIndex": 999,
-      "width": 20,
-      "height": 104,
-      "positionAbsolute": {
-        "x": -178.82615613784935,
-        "y": 2214.6370362009566
-      },
-      "dragging": false,
-      "style": {
-        "width": 20,
-        "height": 104
-      },
-      "resizing": false,
-      "focusable": true,
-      "selectable": true
-    },
-    {
-      "width": 482,
-      "height": 118,
-      "id": "GV_zWF6rSWg5bqgiXhOEf",
-      "type": "paragraph",
-      "position": {
-        "x": -409.82615613784935,
-        "y": 2122.8704528251837
-      },
-      "selected": false,
-      "data": {
-        "label": "Have a look at the following related roadmaps",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center",
-          "borderColor": "#000000",
-          "backgroundColor": "#ffffff"
-        },
-        "oldId": "sVXZrBCsiSzWBBYWTm-nQ"
-      },
-      "zIndex": 999,
-      "positionAbsolute": {
-        "x": -409.82615613784935,
-        "y": 2122.8704528251837
-      },
-      "dragging": false,
-      "style": {
-        "width": 482,
-        "height": 118
-      },
-      "resizing": false,
-      "focusable": true,
-      "selectable": true
-    },
-    {
-      "width": 142,
-      "height": 49,
-      "id": "OQpi63qND2KBXVvKBNMST",
-      "type": "button",
-      "position": {
-        "x": -398.308978052272,
-        "y": 2177.5597347368353
-      },
-      "selected": false,
-      "data": {
-        "label": "Backend",
-        "href": "https://roadmap.sh/backend",
-        "color": "#FFFFFf",
-        "backgroundColor": "#4136D4",
-        "style": {
-          "fontSize": 17
-        },
-        "borderColor": "#4136D4",
-        "oldId": "U0fJo2a3vnaodNJhfZ78I"
-      },
-      "zIndex": 999,
-      "dragging": false,
-      "positionAbsolute": {
-        "x": -398.308978052272,
-        "y": 2177.5597347368353
-      },
-      "style": {
-        "width": 142,
-        "height": 49
-      },
-      "focusable": true,
-      "resizing": false,
-      "selectable": true
-    },
-    {
-      "width": 167,
-      "height": 49,
-      "id": "iuSv7V59YxUZawN38Qlli",
-      "type": "button",
-      "position": {
-        "x": -108.06128192779408,
-        "y": 2177.5597347368353
-      },
-      "selected": false,
-      "data": {
-        "label": "MongoDB",
-        "href": "https://roadmap.sh/mongodb",
-        "color": "#FFFFFf",
-        "backgroundColor": "#4136D4",
-        "style": {
-          "fontSize": 17
-        },
-        "borderColor": "#4136D4",
-        "oldId": "ZSrQoNGKiR484uALMWO9F"
-      },
-      "zIndex": 999,
-      "dragging": false,
-      "positionAbsolute": {
-        "x": -108.06128192779408,
-        "y": 2177.5597347368353
-      },
-      "style": {
-        "width": 167,
-        "height": 49
-      },
-      "focusable": true,
-      "resizing": false,
-      "selectable": true
-    },
-    {
-      "id": "R9DQNc0AyAQ2HLpP4HOk6",
-      "type": "subtopic",
-      "position": {
-        "x": 130.89980850421182,
-        "y": -41.63210941079885
-      },
-      "selected": false,
-      "data": {
-        "label": "What are Relational Databases?",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 310,
-      "height": 49,
-      "style": {
-        "width": 310,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 130.89980850421182,
-        "y": -41.63210941079885
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "fNTb9y3zs1HPYclAmu_Wv",
-      "type": "subtopic",
-      "position": {
-        "x": 130.89980850421182,
-        "y": 11.367890589201153
-      },
-      "selected": false,
-      "data": {
-        "label": "RDBMS Benefits and Limitations",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 310,
-      "height": 49,
-      "style": {
-        "width": 310,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 130.89980850421182,
-        "y": 11.367890589201153
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "width": 95,
-      "height": 68,
-      "id": "iogwMmOvub2ZF4zgg6WyF",
-      "type": "title",
-      "position": {
-        "x": -151.66916540260297,
-        "y": -151.7695706291704
-      },
-      "selected": false,
-      "data": {
-        "label": "SQL",
-        "style": {
-          "fontSize": 28,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        },
-        "oldId": "9nxw2PEl-_eQPW0FHNPq2"
-      },
-      "zIndex": 999,
-      "dragging": false,
-      "positionAbsolute": {
-        "x": -151.66916540260297,
-        "y": -151.7695706291704
-      },
-      "focusable": true,
-      "selectable": true
-    },
-    {
-      "id": "nhUKKWyBH80nyKfGT8ErC",
-      "type": "topic",
-      "position": {
-        "x": -227.16916540260297,
-        "y": 13.436864496015943
-      },
-      "selected": false,
-      "data": {
-        "label": "Learn the Basics",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        },
-        "oldId": "JDDG4KfhtIlw1rkNCzUli"
-      },
-      "zIndex": 999,
-      "width": 246,
-      "height": 49,
-      "style": {
-        "width": 246,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -227.16916540260297,
-        "y": 13.436864496015943
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false,
-      "resizing": false
-    },
-    {
-      "width": 142,
-      "height": 49,
-      "id": "U0fJo2a3vnaodNJhfZ78I",
-      "type": "button",
-      "position": {
-        "x": -252.30897805227198,
-        "y": 2177.5597347368353
-      },
-      "selected": false,
-      "data": {
-        "label": "PostgreSQL",
-        "href": "https://roadmap.sh/postgresql-dba",
-        "color": "#FFFFFf",
-        "backgroundColor": "#4136D4",
-        "style": {
-          "fontSize": 17
-        },
-        "borderColor": "#4136D4",
-        "oldId": "P5IZjP0g1_fnvHy3YTR4q"
-      },
-      "zIndex": 999,
-      "dragging": false,
-      "positionAbsolute": {
-        "x": -252.30897805227198,
-        "y": 2177.5597347368353
-      },
-      "style": {
-        "width": 142,
-        "height": 49
-      },
-      "focusable": true,
-      "resizing": false,
-      "selectable": true
-    },
-    {
-      "id": "gx4KaFqKgJX9n9_ZGMqlZ",
-      "type": "subtopic",
-      "position": {
-        "x": 130.89980850421182,
-        "y": 64.36789058920115
-      },
-      "selected": false,
-      "data": {
-        "label": "SQL vs NoSQL Databases",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 310,
-      "height": 49,
-      "style": {
-        "width": 310,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 130.89980850421182,
-        "y": 64.36789058920115
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true,
-      "resizing": false
-    },
-    {
-      "id": "JDDG4KfhtIlw1rkNCzUli",
-      "type": "topic",
-      "position": {
-        "x": -227.16916540260297,
-        "y": 144.23119080604232
-      },
-      "selected": false,
-      "data": {
-        "label": "Basic SQL Syntax",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        },
-        "oldId": "VJSIbYJcy2MC6MOFBrqXi"
-      },
-      "zIndex": 999,
-      "width": 246,
-      "height": 50,
-      "style": {
-        "width": 246,
-        "height": 50
-      },
-      "positionAbsolute": {
-        "x": -227.16916540260297,
-        "y": 144.23119080604232
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false,
-      "resizing": false
-    },
-    {
-      "id": "6yoo7qC6X2jYDIjd3HIm7",
-      "type": "subtopic",
-      "position": {
-        "x": -611.9219566015802,
-        "y": 35.23119080604238
-      },
-      "selected": false,
-      "data": {
-        "label": "SQL Keywords",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 232,
-      "height": 49,
-      "style": {
-        "width": 232,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -611.9219566015802,
-        "y": 35.23119080604238
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false,
-      "resizing": false
-    },
-    {
-      "id": "tBzMDfCMh6MIagNaxCzin",
-      "type": "subtopic",
-      "position": {
-        "x": -611.9219566015802,
-        "y": 88.23119080604238
-      },
-      "selected": false,
-      "data": {
-        "label": "Data Types",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 232,
-      "height": 53,
-      "style": {
-        "width": 232,
-        "height": 53
-      },
-      "positionAbsolute": {
-        "x": -611.9219566015802,
-        "y": 88.23119080604238
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "ffwniprGJHZzJ7t3lQcXz",
-      "type": "subtopic",
-      "position": {
-        "x": -611.9219566015802,
-        "y": 145.23119080604232
-      },
-      "selected": false,
-      "data": {
-        "label": "Operators",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 232,
-      "height": 49,
-      "style": {
-        "width": 232,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -611.9219566015802,
-        "y": 145.23119080604232
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false
-    },
-    {
-      "id": "rmqXH29n1oXtZ8tvmcRFn",
-      "type": "subtopic",
-      "position": {
-        "x": -601.6806695765429,
-        "y": 208.52268765100933
-      },
-      "selected": false,
-      "data": {
-        "label": "SELECT",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 100,
-      "height": 49,
-      "style": {
-        "width": 100,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -601.6806695765429,
-        "y": 208.52268765100933
-      },
-      "selectable": true,
-      "focusable": true,
-      "resizing": false,
-      "dragging": false
-    },
-    {
-      "id": "mPj6BiK5FKKkIQ9WsWEo6",
-      "type": "subtopic",
-      "position": {
-        "x": -497.61169566972785,
-        "y": 208.52268765100933
-      },
-      "selected": false,
-      "data": {
-        "label": "INSERT",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 110,
-      "height": 49,
-      "style": {
-        "width": 110,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -497.61169566972785,
-        "y": 208.52268765100933
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false,
-      "resizing": false
-    },
-    {
-      "id": "eu9dJFi6gBPMBdy08Y5Bb",
-      "type": "subtopic",
-      "position": {
-        "x": -497.61169566972785,
-        "y": 261.52268765100933
-      },
-      "selected": false,
-      "data": {
-        "label": "UPDATE",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 107,
-      "height": 49,
-      "style": {
-        "width": 107,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -497.61169566972785,
-        "y": 261.52268765100933
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false,
-      "resizing": false
-    },
-    {
-      "id": "ddtVaA4Ls6qRj-7OtTSIH",
-      "type": "subtopic",
-      "position": {
-        "x": -601.6806695765429,
-        "y": 261.52268765100933
-      },
-      "selected": false,
-      "data": {
-        "label": "DELETE",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 100,
-      "height": 49,
-      "style": {
-        "width": 100,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -601.6806695765429,
-        "y": 261.52268765100933
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "91OF3VQdzsu_YPsT6zrVT",
-      "type": "label",
-      "position": {
-        "x": -548.8883211898742,
-        "y": 321.5207412699772
-      },
-      "selected": false,
-      "data": {
-        "label": "Statements",
-        "href": "",
-        "color": "#000000",
-        "style": {
-          "fontSize": 17
-        }
-      },
-      "zIndex": 999,
-      "width": 103,
-      "height": 36,
-      "style": {},
-      "positionAbsolute": {
-        "x": -548.8883211898742,
-        "y": 321.5207412699772
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "xPOeXK1EPBNG56vgfG-VV",
-      "type": "topic",
-      "position": {
-        "x": 118.89980850421182,
-        "y": 144.73119080604232
-      },
-      "selected": false,
-      "data": {
-        "label": "Data Definition Language (DDL)",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 322,
-      "height": 49,
-      "style": {
-        "width": 322,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 118.89980850421182,
-        "y": 144.73119080604232
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false,
-      "resizing": false
-    },
-    {
-      "id": "K5vhqTJrdPK08Txv8zaEj",
-      "type": "subtopic",
-      "position": {
-        "x": 275.44949271295843,
-        "y": 238.7980966830105
-      },
-      "selected": false,
-      "data": {
-        "label": "Truncate Table",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 166,
-      "height": 53,
-      "style": {
-        "width": 166,
-        "height": 53
-      },
-      "positionAbsolute": {
-        "x": 275.44949271295843,
-        "y": 238.7980966830105
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false
-    },
-    {
-      "id": "WjXlO42WL9saDS7RIGapt",
-      "type": "subtopic",
-      "position": {
-        "x": 275.44949271295843,
-        "y": 295.7980966830105
-      },
-      "selected": false,
-      "data": {
-        "label": "Alter Table",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 166,
-      "height": 49,
-      "style": {
-        "width": 166,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 275.44949271295843,
-        "y": 295.7980966830105
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false
-    },
-    {
-      "id": "epEpBxRosLhuAuKwp823r",
-      "type": "subtopic",
-      "position": {
-        "x": 275.44949271295843,
-        "y": 348.7980966830105
-      },
-      "selected": false,
-      "data": {
-        "label": "Create Table",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 166,
-      "height": 49,
-      "style": {
-        "width": 166,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 275.44949271295843,
-        "y": 348.7980966830105
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false
-    },
-    {
-      "id": "YzJ6QmY2arMfRzMAPaI0T",
-      "type": "subtopic",
-      "position": {
-        "x": 275.44949271295843,
-        "y": 401.7980966830105
-      },
-      "selected": false,
-      "data": {
-        "label": "Drop Table",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 166,
-      "height": 49,
-      "style": {
-        "width": 166,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 275.44949271295843,
-        "y": 401.7980966830105
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false,
-      "resizing": false
-    },
-    {
-      "id": "WMSXi-eez_hHGDM8kUdWz",
-      "type": "topic",
-      "position": {
-        "x": -147.5663615725029,
-        "y": 280.7980966830105
-      },
-      "selected": false,
-      "data": {
-        "label": "Data Manipulation Language (DML)",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 355,
-      "height": 49,
-      "style": {
-        "width": 355,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -147.5663615725029,
-        "y": 280.7980966830105
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false,
-      "resizing": false
-    },
-    {
-      "id": "i8u8E_sne6XiKJo2FXDog",
-      "type": "subtopic",
-      "position": {
-        "x": -148.91017923766498,
-        "y": 376.83610755141524
-      },
-      "selected": false,
-      "data": {
-        "label": "Select",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center",
-          "colorType": "h"
-        }
-      },
-      "zIndex": 999,
-      "width": 361,
-      "height": 49,
-      "style": {
-        "width": 361,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -148.91017923766498,
-        "y": 376.83610755141524
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false,
-      "resizing": false
-    },
-    {
-      "id": "N1Racr3ZpU320gS545We8",
-      "type": "subtopic",
-      "position": {
-        "x": -148.91017923766498,
-        "y": 430.83610755141524
-      },
-      "selected": false,
-      "data": {
-        "label": "FROM",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 133,
-      "height": 49,
-      "style": {
-        "width": 133,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -148.91017923766498,
-        "y": 430.83610755141524
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false,
-      "resizing": false
-    },
-    {
-      "id": "WhYAy6f7Euk3E49-ot644",
-      "type": "subtopic",
-      "position": {
-        "x": -11.910179237664977,
-        "y": 430.83610755141524
-      },
-      "selected": false,
-      "data": {
-        "label": "WHERE",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 114,
-      "height": 49,
-      "style": {
-        "width": 114,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -11.910179237664977,
-        "y": 430.83610755141524
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false,
-      "resizing": false
-    },
-    {
-      "id": "NfCiSPrL4upMssukcw3Kh",
-      "type": "subtopic",
-      "position": {
-        "x": -11.910179237664977,
-        "y": 483.83610755141524
-      },
-      "selected": false,
-      "data": {
-        "label": "ORDER BY",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 132,
-      "height": 49,
-      "style": {
-        "width": 132,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -11.910179237664977,
-        "y": 483.83610755141524
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false,
-      "resizing": false
-    },
-    {
-      "id": "14TKE6KhrH1yFtHcSZSXq",
-      "type": "subtopic",
-      "position": {
-        "x": -148.91017923766498,
-        "y": 483.83610755141524
-      },
-      "selected": false,
-      "data": {
-        "label": "GROUP BY",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 134,
-      "height": 49,
-      "style": {
-        "width": 134,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -148.91017923766498,
-        "y": 483.83610755141524
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false,
-      "resizing": false
-    },
-    {
-      "id": "ytwCkSMTiTuemE0KVfAfy",
-      "type": "subtopic",
-      "position": {
-        "x": 125.08982076233502,
-        "y": 483.83610755141524
-      },
-      "selected": false,
-      "data": {
-        "label": "HAVING",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 87,
-      "height": 49,
-      "style": {
-        "width": 87,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 125.08982076233502,
-        "y": 483.83610755141524
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false,
-      "resizing": false
-    },
-    {
-      "id": "4UQQYbjzwVxZOAxBuXKQS",
-      "type": "subtopic",
-      "position": {
-        "x": 107.08982076233502,
-        "y": 430.83610755141524
-      },
-      "selected": false,
-      "data": {
-        "label": "JOINs",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 105,
-      "height": 49,
-      "style": {
-        "width": 105,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 107.08982076233502,
-        "y": 430.83610755141524
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false,
-      "resizing": false
-    },
-    {
-      "id": "-Hew0y53ziZK3epQnGA0O",
-      "type": "subtopic",
-      "position": {
-        "x": -148.91017923766498,
-        "y": 536.8361075514152
-      },
-      "selected": false,
-      "data": {
-        "label": "INSERT",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 100,
-      "height": 49,
-      "style": {
-        "width": 100,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -148.91017923766498,
-        "y": 536.8361075514152
-      },
-      "selectable": true,
-      "focusable": true,
-      "resizing": false,
-      "dragging": false
-    },
-    {
-      "id": "KJJ6PYjTnr_3yU2mNPL9v",
-      "type": "subtopic",
-      "position": {
-        "x": -44.41017923766498,
-        "y": 536.8361075514152
-      },
-      "selected": false,
-      "data": {
-        "label": "UPDATE",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 153,
-      "height": 49,
-      "style": {
-        "width": 153,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -44.41017923766498,
-        "y": 536.8361075514152
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false,
-      "resizing": false
-    },
-    {
-      "id": "zWnvuHJLHr03PWkrW1wZZ",
-      "type": "subtopic",
-      "position": {
-        "x": 112.08982076233502,
-        "y": 536.8361075514152
-      },
-      "selected": false,
-      "data": {
-        "label": "DELETE",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 100,
-      "height": 49,
-      "style": {
-        "width": 100,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 112.08982076233502,
-        "y": 536.8361075514152
-      },
-      "selectable": true,
-      "focusable": true,
-      "resizing": false,
-      "dragging": false
-    },
-    {
-      "id": "68Y4cMQtdnJrbqSvl7aHc",
-      "type": "vertical",
-      "position": {
-        "x": -281.26200280604616,
-        "y": 303.2980966830105
-      },
-      "selected": false,
-      "data": {
-        "label": "vertical node",
-        "style": {
-          "stroke": "#2B78E4",
-          "strokeWidth": 3.75
-        }
-      },
-      "zIndex": 999,
-      "width": 20,
-      "height": 207,
-      "style": {
-        "width": 20,
-        "height": 207
-      },
-      "positionAbsolute": {
-        "x": -281.26200280604616,
-        "y": 303.2980966830105
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "LX9nzJ4uqznHN4SksoDvr",
-      "type": "topic",
-      "position": {
-        "x": -369.76200280604616,
-        "y": 491.23040771484375
-      },
-      "selected": false,
-      "data": {
-        "label": "Aggregate Queries",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 197,
-      "height": 49,
-      "style": {
-        "width": 197,
-        "height": 49
-      },
-      "resizing": false,
-      "positionAbsolute": {
-        "x": -369.76200280604616,
-        "y": 491.23040771484375
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "w4T3jFb0ilf1KNw-AvRXG",
-      "type": "subtopic",
-      "position": {
-        "x": -609.4684257507324,
-        "y": 387.23040771484375
-      },
-      "selected": false,
-      "data": {
-        "label": "SUM",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 75,
-      "height": 49,
-      "style": {
-        "width": 75,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -609.4684257507324,
-        "y": 387.23040771484375
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false,
-      "resizing": false
-    },
-    {
-      "id": "9aHYrOQDkA84tlxcVK5aD",
-      "type": "subtopic",
-      "position": {
-        "x": -531.8883211898742,
-        "y": 387.23040771484375
-      },
-      "selected": false,
-      "data": {
-        "label": "COUNT",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 80,
-      "height": 49,
-      "style": {
-        "width": 80,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -531.8883211898742,
-        "y": 387.23040771484375
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false,
-      "resizing": false
-    },
-    {
-      "id": "Wou6YXLYUgomvcELh851L",
-      "type": "subtopic",
-      "position": {
-        "x": -609.4684257507324,
-        "y": 439.73040771484375
-      },
-      "selected": false,
-      "data": {
-        "label": "AVG",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 75,
-      "height": 49,
-      "style": {
-        "width": 75,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -609.4684257507324,
-        "y": 439.73040771484375
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false
-    },
-    {
-      "id": "bFEYMlqPZtTUYtDQxqHzT",
-      "type": "subtopic",
-      "position": {
-        "x": -531.8883211898742,
-        "y": 439.73040771484375
-      },
-      "selected": false,
-      "data": {
-        "label": "MIN",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 80,
-      "height": 49,
-      "style": {
-        "width": 80,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -531.8883211898742,
-        "y": 439.73040771484375
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false,
-      "resizing": false
-    },
-    {
-      "id": "YqDJq3fPxUZlwsdq0kJg7",
-      "type": "subtopic",
-      "position": {
-        "x": -609.4684257507324,
-        "y": 492.23040771484375
-      },
-      "selected": false,
-      "data": {
-        "label": "MAX",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 157,
-      "height": 49,
-      "style": {
-        "width": 157,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -609.4684257507324,
-        "y": 492.23040771484375
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false,
-      "resizing": false
-    },
-    {
-      "id": "Zw8IHfCCMSxmVjx5Ho5ff",
-      "type": "subtopic",
-      "position": {
-        "x": -609.4684257507324,
-        "y": 544.7304077148438
-      },
-      "selected": false,
-      "data": {
-        "label": "GROUP BY",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 157,
-      "height": 49,
-      "style": {
-        "width": 157,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -609.4684257507324,
-        "y": 544.7304077148438
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false,
-      "resizing": false
-    },
-    {
-      "id": "HhICJpCK5__b-itUoEBES",
-      "type": "subtopic",
-      "position": {
-        "x": -609.4684257507324,
-        "y": 597.2304077148438
-      },
-      "selected": false,
-      "data": {
-        "label": "HAVING",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 157,
-      "height": 49,
-      "style": {
-        "width": 157,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -609.4684257507324,
-        "y": 597.2304077148438
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "qBios3sZVhcJMpXmj9f7B",
-      "type": "topic",
-      "position": {
-        "x": -1.7791808916234686,
-        "y": 646.2304077148438
-      },
-      "selected": false,
-      "data": {
-        "label": "Data Constraints",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        },
-        "oldId": "8V6yw7kLaow-VVcv_K_pL"
-      },
-      "zIndex": 999,
-      "width": 176,
-      "height": 49,
-      "style": {
-        "width": 176,
-        "height": 49
-      },
-      "dragging": false,
-      "positionAbsolute": {
-        "x": -1.7791808916234686,
-        "y": 646.2304077148438
-      },
-      "selectable": true,
-      "focusable": true,
-      "resizing": false
-    },
-    {
-      "id": "Jlwmyq6CUQeDAlL4dazOP",
-      "type": "subtopic",
-      "position": {
-        "x": 275.44949271295843,
-        "y": 470.3865696806382
-      },
-      "selected": false,
-      "data": {
-        "label": "Primary Key",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 166,
-      "height": 49,
-      "style": {
-        "width": 166,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 275.44949271295843,
-        "y": 470.3865696806382
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false
-    },
-    {
-      "id": "DHz6sRLYhFeCbAcNJS8hm",
-      "type": "subtopic",
-      "position": {
-        "x": 275.44949271295843,
-        "y": 523.3865696806382
-      },
-      "selected": false,
-      "data": {
-        "label": "Foreign Key",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 166,
-      "height": 49,
-      "style": {
-        "width": 166,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 275.44949271295843,
-        "y": 523.3865696806382
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false
-    },
-    {
-      "id": "5yGo8i7eplxtXOD_qfzOs",
-      "type": "subtopic",
-      "position": {
-        "x": 275.44949271295843,
-        "y": 576.3865696806382
-      },
-      "selected": false,
-      "data": {
-        "label": "Unique",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 166,
-      "height": 49,
-      "style": {
-        "width": 166,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 275.44949271295843,
-        "y": 576.3865696806382
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false
-    },
-    {
-      "id": "M4M_-vjM9GNy0NmXZneDA",
-      "type": "subtopic",
-      "position": {
-        "x": 275.44949271295843,
-        "y": 629.3865696806382
-      },
-      "selected": false,
-      "data": {
-        "label": "NOT NULL",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 166,
-      "height": 49,
-      "style": {
-        "width": 166,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 275.44949271295843,
-        "y": 629.3865696806382
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false
-    },
-    {
-      "id": "Q0h9Wfnl_W9ThOkv7Q17A",
-      "type": "subtopic",
-      "position": {
-        "x": 275.44949271295843,
-        "y": 682.3865696806382
-      },
-      "selected": false,
-      "data": {
-        "label": "CHECK",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 166,
-      "height": 49,
-      "style": {
-        "width": 166,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 275.44949271295843,
-        "y": 682.3865696806382
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "1Crqx9BUhD84lOdUAjFA4",
-      "type": "vertical",
-      "position": {
-        "x": 245.44949271295843,
-        "y": 472.8865696806382
-      },
-      "selected": false,
-      "data": {
-        "label": "vertical node",
-        "style": {
-          "stroke": "#2B78E4",
-          "strokeWidth": 3.55
-        }
-      },
-      "zIndex": 999,
-      "width": 20,
-      "height": 259,
-      "style": {
-        "width": 20,
-        "height": 259
-      },
-      "positionAbsolute": {
-        "x": 245.44949271295843,
-        "y": 472.8865696806382
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "8V6yw7kLaow-VVcv_K_pL",
-      "type": "topic",
-      "position": {
-        "x": -1.7791808916234686,
-        "y": 791.2304293708296
-      },
-      "selected": false,
-      "data": {
-        "label": "JOIN Queries",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 176,
-      "height": 49,
-      "style": {
-        "width": 176,
-        "height": 49
-      },
-      "dragging": false,
-      "positionAbsolute": {
-        "x": -1.7791808916234686,
-        "y": 791.2304293708296
-      },
-      "selectable": true,
-      "focusable": true,
-      "resizing": false
-    },
-    {
-      "id": "aaua13CkTxLOYXr8cAgPm",
-      "type": "subtopic",
-      "position": {
-        "x": 247.47198755548254,
-        "y": 792.0530101616195
-      },
-      "selected": false,
-      "data": {
-        "label": "INNER JOIN",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 196,
-      "height": 49,
-      "style": {
-        "width": 196,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 247.47198755548254,
-        "y": 792.0530101616195
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false
-    },
-    {
-      "id": "X9cJJ8zLZCF2cOoqxwFfY",
-      "type": "subtopic",
-      "position": {
-        "x": 247.47198755548254,
-        "y": 845.0530101616195
-      },
-      "selected": false,
-      "data": {
-        "label": "LEFT JOIN",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 196,
-      "height": 49,
-      "style": {
-        "width": 196,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 247.47198755548254,
-        "y": 845.0530101616195
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false
-    },
-    {
-      "id": "shpgZkh1CLqUwjOaRtAFy",
-      "type": "subtopic",
-      "position": {
-        "x": 247.47198755548254,
-        "y": 898.0530101616195
-      },
-      "selected": false,
-      "data": {
-        "label": "RIGHT JOIN",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 196,
-      "height": 49,
-      "style": {
-        "width": 196,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 247.47198755548254,
-        "y": 898.0530101616195
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false
-    },
-    {
-      "id": "aS5zCyJRA779yHF0G2pje",
-      "type": "subtopic",
-      "position": {
-        "x": 247.47198755548254,
-        "y": 951.0530101616195
-      },
-      "selected": false,
-      "data": {
-        "label": "FULL OUTER JOIN",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 196,
-      "height": 49,
-      "style": {
-        "width": 196,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 247.47198755548254,
-        "y": 951.0530101616195
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false,
-      "resizing": false
-    },
-    {
-      "id": "6qG0AVYd6Y1B8LOSDoMX9",
-      "type": "subtopic",
-      "position": {
-        "x": 247.47198755548254,
-        "y": 1004.0530101616196
-      },
-      "selected": false,
-      "data": {
-        "label": "Self Join",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 196,
-      "height": 49,
-      "style": {
-        "width": 196,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 247.47198755548254,
-        "y": 1004.0530101616196
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false
-    },
-    {
-      "id": "7ow6tiSSCnTpv_GYQU017",
-      "type": "subtopic",
-      "position": {
-        "x": 247.47198755548254,
-        "y": 1057.0530101616196
-      },
-      "selected": false,
-      "data": {
-        "label": "Cross Join",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 196,
-      "height": 49,
-      "style": {
-        "width": 196,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 247.47198755548254,
-        "y": 1057.0530101616196
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "0Rk1z-F_PEgOIh1qeG8rJ",
-      "type": "vertical",
-      "position": {
-        "x": 218.44949271295843,
-        "y": 787.8865696806382
-      },
-      "selected": false,
-      "data": {
-        "label": "vertical node",
-        "style": {
-          "stroke": "#2B78E4",
-          "strokeWidth": 3.55
-        },
-        "oldId": "1Crqx9BUhD84lOdUAjFA4"
-      },
-      "zIndex": 999,
-      "width": 20,
-      "height": 319,
-      "style": {
-        "width": 20,
-        "height": 319
-      },
-      "positionAbsolute": {
-        "x": 218.44949271295843,
-        "y": 787.8865696806382
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "86iZ8s8EdhSuYwgwAM_EO",
-      "type": "topic",
-      "position": {
-        "x": -305.76200280604616,
-        "y": 791.2304293708296
-      },
-      "selected": false,
-      "data": {
-        "label": "Subqueries",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 202,
-      "height": 49,
-      "style": {
-        "width": 202,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -305.76200280604616,
-        "y": 791.2304293708296
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true,
-      "resizing": false
-    },
-    {
-      "id": "eXQ-TrTlqL5p2AdGnozkL",
-      "type": "subtopic",
-      "position": {
-        "x": -605.2510816711185,
-        "y": 708.2304293708296
-      },
-      "selected": false,
-      "data": {
-        "label": "Scalar",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 80,
-      "height": 49,
-      "style": {
-        "width": 80,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -605.2510816711185,
-        "y": 708.2304293708296
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true,
-      "resizing": false
-    },
-    {
-      "id": "wmtt-3auWLdQWuVdwZLPd",
-      "type": "subtopic",
-      "position": {
-        "x": -521.2510816711185,
-        "y": 708.2304293708296
-      },
-      "selected": false,
-      "data": {
-        "label": "Column",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 80,
-      "height": 49,
-      "style": {
-        "width": 80,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -521.2510816711185,
-        "y": 708.2304293708296
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true,
-      "resizing": false
-    },
-    {
-      "id": "aLDl75i8gtLRA2Ud-fMmQ",
-      "type": "subtopic",
-      "position": {
-        "x": -437.2510816711185,
-        "y": 708.2304293708296
-      },
-      "selected": false,
-      "data": {
-        "label": "Row",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 60,
-      "height": 49,
-      "style": {
-        "width": 60,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -437.2510816711185,
-        "y": 708.2304293708296
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true,
-      "resizing": false
-    },
-    {
-      "id": "R9WDMRd-3wxsKH97-sT3n",
-      "type": "subtopic",
-      "position": {
-        "x": -373.2510816711185,
-        "y": 708.2304293708296
-      },
-      "selected": false,
-      "data": {
-        "label": "Table",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 65,
-      "height": 49,
-      "style": {
-        "width": 65,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -373.2510816711185,
-        "y": 708.2304293708296
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "zEWmq0Y1LFPMQelpucrph",
-      "type": "label",
-      "position": {
-        "x": -242.76200280604616,
-        "y": 715.7304293708296
-      },
-      "selected": false,
-      "data": {
-        "label": "Different Types",
-        "href": "",
-        "color": "#000000",
-        "style": {
-          "fontSize": 17
-        }
-      },
-      "zIndex": 999,
-      "width": 131,
-      "height": 36,
-      "style": {},
-      "positionAbsolute": {
-        "x": -242.76200280604616,
-        "y": 715.7304293708296
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "xkPJ2MYiXmzC4yqQWyB_7",
-      "type": "subtopic",
-      "position": {
-        "x": -614.2510816711185,
-        "y": 791.2304293708296
-      },
-      "selected": false,
-      "data": {
-        "label": "Nested Subqueries",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 219,
-      "height": 49,
-      "style": {
-        "width": 219,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -614.2510816711185,
-        "y": 791.2304293708296
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "JZqS3Xapw6mfSPVgFW7av",
-      "type": "subtopic",
-      "position": {
-        "x": -614.2510816711185,
-        "y": 844.2304293708296
-      },
-      "selected": false,
-      "data": {
-        "label": "Correlated Subqueries",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 219,
-      "height": 49,
-      "style": {
-        "width": 219,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -614.2510816711185,
-        "y": 844.2304293708296
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "vTMd0bqz4eTgLnhfgY61h",
-      "type": "topic",
-      "position": {
-        "x": -305.76200280604616,
-        "y": 953.2304293708296
-      },
-      "selected": false,
-      "data": {
-        "label": "Advanced Functions",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 202,
-      "height": 49,
-      "style": {
-        "width": 202,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -305.76200280604616,
-        "y": 953.2304293708296
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "o2SH4iQn1Ap2yDZ7cVYLO",
-      "type": "subtopic",
-      "position": {
-        "x": -31.751081671118527,
-        "y": 912.2304293708296
-      },
-      "selected": false,
-      "data": {
-        "label": "FLOOR",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 80,
-      "height": 49,
-      "style": {
-        "width": 80,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -31.751081671118527,
-        "y": 912.2304293708296
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "6vYFb_D1N_-tLWZftL-Az",
-      "type": "subtopic",
-      "position": {
-        "x": 51.24891832888147,
-        "y": 912.2304293708296
-      },
-      "selected": false,
-      "data": {
-        "label": "ABS",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 65,
-      "height": 49,
-      "style": {
-        "width": 65,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 51.24891832888147,
-        "y": 912.2304293708296
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "OUw--8zEq6lk5-6oySVHe",
-      "type": "subtopic",
-      "position": {
-        "x": 119.24891832888147,
-        "y": 912.2304293708296
-      },
-      "selected": false,
-      "data": {
-        "label": "MOD",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 65,
-      "height": 49,
-      "style": {
-        "width": 65,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 119.24891832888147,
-        "y": 912.2304293708296
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "9DntFiZV1AyaRPhYP5q6u",
-      "type": "subtopic",
-      "position": {
-        "x": -31.751081671118527,
-        "y": 964.2304293708296
-      },
-      "selected": false,
-      "data": {
-        "label": "ROUND",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 114,
-      "height": 49,
-      "style": {
-        "width": 114
-      },
-      "positionAbsolute": {
-        "x": -31.751081671118527,
-        "y": 964.2304293708296
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "BAqJQvcguhIhzyII5LRH6",
-      "type": "subtopic",
-      "position": {
-        "x": 85.24891832888147,
-        "y": 964.0530101616195
-      },
-      "selected": false,
-      "data": {
-        "label": "CEILING",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 100,
-      "height": 49,
-      "style": {
-        "width": 100,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 85.24891832888147,
-        "y": 964.0530101616195
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "KI9LVF49Zml1StWiN0wUe",
-      "type": "label",
-      "position": {
-        "x": -11.279180891623469,
-        "y": 1017.5530101616196
-      },
-      "selected": false,
-      "data": {
-        "label": "Numeric Functions",
-        "href": "",
-        "color": "#000000",
-        "style": {
-          "fontSize": 17
-        }
-      },
-      "zIndex": 999,
-      "width": 161,
-      "height": 36,
-      "style": {},
-      "positionAbsolute": {
-        "x": -11.279180891623469,
-        "y": 1017.5530101616196
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "5inpEqafeVCfqsURHzQQg",
-      "type": "subtopic",
-      "position": {
-        "x": -602.2510816711185,
-        "y": 922.8865696806382
-      },
-      "selected": false,
-      "data": {
-        "label": "CONCAT",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 120,
-      "height": 49,
-      "style": {
-        "width": 120,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -602.2510816711185,
-        "y": 922.8865696806382
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "RH8DLiQpDUWqw3U1522q5",
-      "type": "subtopic",
-      "position": {
-        "x": -478.76200280604616,
-        "y": 922.8865696806382
-      },
-      "selected": false,
-      "data": {
-        "label": "LENGTH",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 100,
-      "height": 49,
-      "style": {
-        "width": 100,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -478.76200280604616,
-        "y": 922.8865696806382
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "PnG_5D6q66NAKxXVOwA6N",
-      "type": "subtopic",
-      "position": {
-        "x": -602.9741508977197,
-        "y": 974.8865696806382
-      },
-      "selected": false,
-      "data": {
-        "label": "SUBSTRING",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 120,
-      "height": 49,
-      "style": {
-        "width": 120,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -602.9741508977197,
-        "y": 974.8865696806382
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "VNbb3YPc0FtrROylRns8h",
-      "type": "subtopic",
-      "position": {
-        "x": -478.76200280604616,
-        "y": 974.8865696806382
-      },
-      "selected": false,
-      "data": {
-        "label": "REPLACE",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 100,
-      "height": 49,
-      "style": {
-        "width": 100,
-        "height": 49
-      },
-      "dragging": false,
-      "positionAbsolute": {
-        "x": -478.76200280604616,
-        "y": 974.8865696806382
-      },
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "Othfo7NvTVzfyL906PLM1",
-      "type": "subtopic",
-      "position": {
-        "x": -602.9741508977197,
-        "y": 1026.8865696806383
-      },
-      "selected": false,
-      "data": {
-        "label": "UPPER",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 120,
-      "height": 49,
-      "style": {
-        "width": 120,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -602.9741508977197,
-        "y": 1026.8865696806383
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "knTG6pAq2mYP24WMa29xI",
-      "type": "subtopic",
-      "position": {
-        "x": -478.76200280604616,
-        "y": 1026.8865696806383
-      },
-      "selected": false,
-      "data": {
-        "label": "LOWER",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 100,
-      "height": 49,
-      "style": {
-        "width": 100,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -478.76200280604616,
-        "y": 1026.8865696806383
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "Va_B9PyyGaQ_aX4ySyhUn",
-      "type": "label",
-      "position": {
-        "x": -567.8883211898742,
-        "y": 1085.8865696806383
-      },
-      "selected": false,
-      "data": {
-        "label": "String Functions",
-        "href": "",
-        "color": "#000000",
-        "style": {
-          "fontSize": 17
-        }
-      },
-      "zIndex": 999,
-      "width": 141,
-      "height": 36,
-      "style": {},
-      "positionAbsolute": {
-        "x": -567.8883211898742,
-        "y": 1085.8865696806383
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "W2ePJHdfEiEJ3ZKoRQKt_",
-      "type": "subtopic",
-      "position": {
-        "x": -32.75108167111853,
-        "y": 1063.8865696806383
-      },
-      "selected": false,
-      "data": {
-        "label": "CASE",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 100,
-      "height": 49,
-      "style": {
-        "width": 100,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -32.75108167111853,
-        "y": 1063.8865696806383
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "KI6vngoYcHsnpIk8ErhhS",
-      "type": "subtopic",
-      "position": {
-        "x": 71.24891832888147,
-        "y": 1063.8865696806383
-      },
-      "selected": false,
-      "data": {
-        "label": "NULLIF",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 112,
-      "height": 49,
-      "style": {
-        "width": 112,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 71.24891832888147,
-        "y": 1063.8865696806383
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "k7lZe4QRt9q4InUImFmvx",
-      "type": "subtopic",
-      "position": {
-        "x": -32.91017923766498,
-        "y": 1115.8865696806383
-      },
-      "selected": false,
-      "data": {
-        "label": "COALESCE",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 218,
-      "height": 49,
-      "style": {
-        "width": 218,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -32.91017923766498,
-        "y": 1115.8865696806383
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "K2k3gFdSE63CqWmHeFUEs",
-      "type": "label",
-      "position": {
-        "x": 21.248918328881473,
-        "y": 1171
-      },
-      "selected": false,
-      "data": {
-        "label": "Conditional",
-        "href": "",
-        "color": "#000000",
-        "style": {
-          "fontSize": 17
-        }
-      },
-      "zIndex": 999,
-      "width": 103,
-      "height": 36,
-      "style": {},
-      "positionAbsolute": {
-        "x": 21.248918328881473,
-        "y": 1171
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "Ivqo2wa-_NhGU3vGd0pUI",
-      "type": "subtopic",
-      "position": {
-        "x": -603.7510816711185,
-        "y": 1137.7304293708296
-      },
-      "selected": false,
-      "data": {
-        "label": "DATE",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 115,
-      "height": 49,
-      "style": {
-        "width": 115,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -603.7510816711185,
-        "y": 1137.7304293708296
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "88KlrMqSza9_YaD7Dv61p",
-      "type": "subtopic",
-      "position": {
-        "x": -484.7510816711185,
-        "y": 1137.7304293708296
-      },
-      "selected": false,
-      "data": {
-        "label": "TIME",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 103,
-      "height": 49,
-      "style": {
-        "width": 103,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -484.7510816711185,
-        "y": 1137.7304293708296
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "7hEqkoxkdAWmakGZsMJx-",
-      "type": "subtopic",
-      "position": {
-        "x": -603.7510816711185,
-        "y": 1190.7304293708296
-      },
-      "selected": false,
-      "data": {
-        "label": "TIMESTAMP",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 222,
-      "height": 49,
-      "style": {
-        "width": 222,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -603.7510816711185,
-        "y": 1190.7304293708296
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "BJ4fQvagTO0B5UtXblyx8",
-      "type": "subtopic",
-      "position": {
-        "x": -603.7510816711185,
-        "y": 1243.7304293708296
-      },
-      "selected": false,
-      "data": {
-        "label": "DATEPART",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 115,
-      "height": 49,
-      "style": {
-        "width": 115,
-        "height": 49
-      },
-      "dragging": false,
-      "positionAbsolute": {
-        "x": -603.7510816711185,
-        "y": 1243.7304293708296
-      },
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "1E1WdWOyqxbbdiIbw26dZ",
-      "type": "subtopic",
-      "position": {
-        "x": -484.7510816711185,
-        "y": 1243.7304293708296
-      },
-      "selected": false,
-      "data": {
-        "label": "DATEADD",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 103,
-      "height": 49,
-      "style": {
-        "width": 103,
-        "height": 49
-      },
-      "dragging": false,
-      "positionAbsolute": {
-        "x": -484.7510816711185,
-        "y": 1243.7304293708296
-      },
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "KWHyyOO605SQTAwdt3um_",
-      "type": "label",
-      "position": {
-        "x": -556.7510816711185,
-        "y": 1297.8865696806383
-      },
-      "selected": false,
-      "data": {
-        "label": "Date and Time",
-        "href": "",
-        "color": "#000000",
-        "style": {
-          "fontSize": 17
-        },
-        "oldId": "Va_B9PyyGaQ_aX4ySyhUn"
-      },
-      "zIndex": 999,
-      "width": 129,
-      "height": 36,
-      "style": {},
-      "positionAbsolute": {
-        "x": -556.7510816711185,
-        "y": 1297.8865696806383
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "2tyezwOIxV6O84N-Q3Awh",
-      "type": "topic",
-      "position": {
-        "x": -314.2510816711185,
-        "y": 1098.3834408721723
-      },
-      "selected": false,
-      "data": {
-        "label": "Views",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        },
-        "oldId": "vTMd0bqz4eTgLnhfgY61h"
-      },
-      "zIndex": 999,
-      "width": 218,
-      "height": 49,
-      "style": {
-        "width": 218,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -314.2510816711185,
-        "y": 1098.3834408721723
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "PcsGK4VBh0zNQIPZvNES4",
-      "type": "subtopic",
-      "position": {
-        "x": -306.2510816711185,
-        "y": 1155.3834408721723
-      },
-      "selected": false,
-      "data": {
-        "label": "Creating Views",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 202,
-      "height": 49,
-      "style": {
-        "width": 202,
-        "height": 49
-      },
-      "dragging": false,
-      "positionAbsolute": {
-        "x": -306.2510816711185,
-        "y": 1155.3834408721723
-      },
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "3eE-l-P93nOXoWfLr8PSW",
-      "type": "subtopic",
-      "position": {
-        "x": -306.2510816711185,
-        "y": 1208.3834408721723
-      },
-      "selected": false,
-      "data": {
-        "label": "Modifying Views",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 202,
-      "height": 49,
-      "style": {
-        "width": 202,
-        "height": 49
-      },
-      "dragging": false,
-      "positionAbsolute": {
-        "x": -306.2510816711185,
-        "y": 1208.3834408721723
-      },
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "MIOuWWcCjLAmgzog2DBC3",
-      "type": "subtopic",
-      "position": {
-        "x": -306.2510816711185,
-        "y": 1261.3834408721723
-      },
-      "selected": false,
-      "data": {
-        "label": "Dropping Views",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 202,
-      "height": 49,
-      "style": {
-        "width": 202,
-        "height": 49
-      },
-      "resizing": false,
-      "dragging": false,
-      "positionAbsolute": {
-        "x": -306.2510816711185,
-        "y": 1261.3834408721723
-      },
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "Mwwbw0gZzeM27ewaUh49a",
-      "type": "horizontal",
-      "position": {
-        "x": -96.25108167111853,
-        "y": 1280.8834408721723
-      },
-      "selected": false,
-      "data": {
-        "label": "horizontal node",
-        "style": {
-          "stroke": "#2B78E4",
-          "strokeWidth": 3.5
-        }
-      },
-      "zIndex": 999,
-      "width": 358,
-      "height": 20,
-      "style": {
-        "width": 358,
-        "height": 20
-      },
-      "positionAbsolute": {
-        "x": -96.25108167111853,
-        "y": 1280.8834408721723
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "LcljR70T-OnzSrJJDqOWf",
-      "type": "topic",
-      "position": {
-        "x": 204.97198755548254,
-        "y": 1266.3834408721723
-      },
-      "selected": false,
-      "data": {
-        "label": "Indexes",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        },
-        "oldId": "2tyezwOIxV6O84N-Q3Awh"
-      },
-      "zIndex": 999,
-      "width": 237,
-      "height": 49,
-      "style": {
-        "width": 237,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 204.97198755548254,
-        "y": 1266.3834408721723
-      },
-      "dragging": false,
-      "resizing": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "NtxGd6Vx-REBclry7lZuE",
-      "type": "subtopic",
-      "position": {
-        "x": 247.47198755548254,
-        "y": 1121.8865696806383
-      },
-      "selected": false,
-      "data": {
-        "label": "Managing Indexes",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 196,
-      "height": 49,
-      "style": {
-        "width": 196,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 247.47198755548254,
-        "y": 1121.8865696806383
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false
-    },
-    {
-      "id": "Ps9Yv2s-bKvEegGAbPsiA",
-      "type": "subtopic",
-      "position": {
-        "x": 247.47198755548254,
-        "y": 1174.8865696806383
-      },
-      "selected": false,
-      "data": {
-        "label": "Query Optimization",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 196,
-      "height": 49,
-      "style": {
-        "width": 196,
-        "height": 49
-      },
-      "dragging": false,
-      "positionAbsolute": {
-        "x": 247.47198755548254,
-        "y": 1174.8865696806383
-      },
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "OdaBXz2XBAVLsQ-m7xtAM",
-      "type": "topic",
-      "position": {
-        "x": 204.97198755548254,
-        "y": 1428.3990110065474
-      },
-      "selected": false,
-      "data": {
-        "label": "Transactions",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        },
-        "oldId": "UDqbT1y-YzBrljfKSz_RG"
-      },
-      "zIndex": 999,
-      "width": 237,
-      "height": 49,
-      "style": {
-        "width": 237,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 204.97198755548254,
-        "y": 1428.3990110065474
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true,
-      "resizing": false
-    },
-    {
-      "id": "7sTW1vwUhCFOMXYjScVEt",
-      "type": "subtopic",
-      "position": {
-        "x": 321.97198755548254,
-        "y": 1511.9869221425392
-      },
-      "selected": false,
-      "data": {
-        "label": "BEGIN",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 120,
-      "height": 49,
-      "style": {
-        "width": 120,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 321.97198755548254,
-        "y": 1511.9869221425392
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false
-    },
-    {
-      "id": "3cMECz5QPVDOFrk5duObs",
-      "type": "subtopic",
-      "position": {
-        "x": 321.97198755548254,
-        "y": 1564.9869221425392
-      },
-      "selected": false,
-      "data": {
-        "label": "COMMIT",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 120,
-      "height": 49,
-      "style": {
-        "width": 120,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 321.97198755548254,
-        "y": 1564.9869221425392
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false
-    },
-    {
-      "id": "xbD67KVlt3UhHpKh8HLx8",
-      "type": "subtopic",
-      "position": {
-        "x": 321.97198755548254,
-        "y": 1617.9869221425392
-      },
-      "selected": false,
-      "data": {
-        "label": "ROLLBACK",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 120,
-      "height": 49,
-      "style": {
-        "width": 120,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 321.97198755548254,
-        "y": 1617.9869221425392
-      },
-      "selectable": true,
-      "focusable": true,
-      "dragging": false
-    },
-    {
-      "id": "pJtYvXUo81aZfPuRjIbMq",
-      "type": "subtopic",
-      "position": {
-        "x": 321.97198755548254,
-        "y": 1670.9869221425392
-      },
-      "selected": false,
-      "data": {
-        "label": "SAVEPOINT",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 120,
-      "height": 49,
-      "style": {
-        "width": 120,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 321.97198755548254,
-        "y": 1670.9869221425392
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "igg34gLPl3HYVAmRNFGcV",
-      "type": "subtopic",
-      "position": {
-        "x": 212.08982076233502,
-        "y": 1511.9869221425392
-      },
-      "selected": false,
-      "data": {
-        "label": "ACID",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 85,
-      "height": 49,
-      "style": {},
-      "positionAbsolute": {
-        "x": 212.08982076233502,
-        "y": 1511.9869221425392
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "ujeq8EIFcrqkBjoFizsJM",
-      "type": "subtopic",
-      "position": {
-        "x": 29.089820762335023,
-        "y": 1343.8865696806383
-      },
-      "selected": false,
-      "data": {
-        "label": "Transaction Isolation Levels",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 259,
-      "height": 49,
-      "style": {},
-      "positionAbsolute": {
-        "x": 29.089820762335023,
-        "y": 1343.8865696806383
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "id": "R1ktDJpXOz0PTllAcBrdu",
-      "type": "topic",
-      "position": {
-        "x": -193.26200280604616,
-        "y": 1428.3990110065474
-      },
-      "selected": false,
-      "data": {
-        "label": "Data Integrity & Security",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        },
-        "oldId": "UDqbT1y-YzBrljfKSz_RG"
-      },
-      "zIndex": 999,
-      "width": 237,
-      "height": 49,
-      "style": {
-        "width": 237,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -193.26200280604616,
-        "y": 1428.3990110065474
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true,
-      "resizing": false
-    },
-    {
-      "id": "mBQ3Z8GlFcpIena3IB7D_",
-      "type": "subtopic",
-      "position": {
-        "x": -264.01430668156826,
-        "y": 1343.8865696806383
-      },
-      "selected": false,
-      "data": {
-        "label": "Data Integrity Constraints",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 251,
-      "height": 49,
-      "style": {
-        "width": 251,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -264.01430668156826,
-        "y": 1343.8865696806383
-      },
-      "dragging": false,
-      "focusable": true
-    },
-    {
-      "id": "03qMopxzjx_-dZbYw9b7J",
-      "type": "subtopic",
-      "position": {
-        "x": -264.01430668156826,
-        "y": 1515.0464993424512
-      },
-      "selected": false,
-      "data": {
-        "label": "GRANT and Revoke",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 251,
-      "height": 49,
-      "style": {
-        "width": 251,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -264.01430668156826,
-        "y": 1515.0464993424512
-      },
-      "dragging": false,
-      "focusable": true
-    },
-    {
-      "id": "vhBZqqmUcEon6-Vwvla4q",
-      "type": "subtopic",
-      "position": {
-        "x": -264.01430668156826,
-        "y": 1568.0464993424512
-      },
-      "selected": false,
-      "data": {
-        "label": "DB Security Best Practices",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 251,
-      "height": 49,
-      "style": {
-        "width": 251,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -264.01430668156826,
-        "y": 1568.0464993424512
-      },
-      "dragging": false,
-      "focusable": true
-    },
-    {
-      "id": "w7FNjdwqjY7X69aJqqBy4",
-      "type": "topic",
-      "position": {
-        "x": -607.4741508977197,
-        "y": 1428.3990110065474
-      },
-      "selected": false,
-      "data": {
-        "label": "Stored Procedures & Functions",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        },
-        "oldId": "UDqbT1y-YzBrljfKSz_RG"
-      },
-      "zIndex": 999,
-      "width": 286,
-      "height": 49,
-      "style": {
-        "width": 286,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -607.4741508977197,
-        "y": 1428.3990110065474
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true,
-      "resizing": false
-    },
-    {
-      "id": "4rqCPpTb0dAgpheBKshRG",
-      "type": "topic",
-      "position": {
-        "x": -592.9741508977197,
-        "y": 1645.2523745261662
-      },
-      "selected": false,
-      "data": {
-        "label": "Performance Optimization",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        },
-        "oldId": "UDqbT1y-YzBrljfKSz_RG"
-      },
-      "zIndex": 999,
-      "width": 257,
-      "height": 49,
-      "style": {
-        "width": 257,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -592.9741508977197,
-        "y": 1645.2523745261662
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true,
-      "resizing": false
-    },
-    {
-      "id": "9wOgP0i9G4HSeZGn2Gm7r",
-      "type": "subtopic",
-      "position": {
-        "x": -591.9741508977197,
-        "y": 1813.4578222275159
-      },
-      "selected": false,
-      "data": {
-        "label": "Using Indexes",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 255,
-      "height": 49,
-      "style": {
-        "width": 255,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -591.9741508977197,
-        "y": 1813.4578222275159
-      },
-      "dragging": false,
-      "focusable": true
-    },
-    {
-      "id": "C0dhS6uLf4TUSfvcWyXhv",
-      "type": "subtopic",
-      "position": {
-        "x": -591.9741508977197,
-        "y": 1866.4578222275159
-      },
-      "selected": false,
-      "data": {
-        "label": "Optimizing Joins",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 255,
-      "height": 49,
-      "style": {
-        "width": 255,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -591.9741508977197,
-        "y": 1866.4578222275159
-      },
-      "dragging": false,
-      "focusable": true
-    },
-    {
-      "id": "UVTgbZrqpbYl1bQvQejcF",
-      "type": "subtopic",
-      "position": {
-        "x": -591.9741508977197,
-        "y": 1919.4578222275159
-      },
-      "selected": false,
-      "data": {
-        "label": "Reducing Subqueries",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 255,
-      "height": 49,
-      "style": {
-        "width": 255,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -591.9741508977197,
-        "y": 1919.4578222275159
-      },
-      "dragging": false,
-      "focusable": true
-    },
-    {
-      "id": "w53CSY53nAAN0ux-XeJ4c",
-      "type": "subtopic",
-      "position": {
-        "x": -591.9741508977197,
-        "y": 1972.4578222275159
-      },
-      "selected": false,
-      "data": {
-        "label": "Selective Projection",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 255,
-      "height": 49,
-      "style": {
-        "width": 255,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -591.9741508977197,
-        "y": 1972.4578222275159
-      },
-      "dragging": false,
-      "focusable": true
-    },
-    {
-      "id": "s7WusVSHajNBKOLoo1COz",
-      "type": "label",
-      "position": {
-        "x": -591.9741508977197,
-        "y": 2032.4578222275159
-      },
-      "selected": false,
-      "data": {
-        "label": "Query Optimization Techniques",
-        "href": "",
-        "color": "#000000",
-        "style": {
-          "fontSize": 17
-        }
-      },
-      "zIndex": 999,
-      "width": 255,
-      "height": 36,
-      "style": {},
-      "positionAbsolute": {
-        "x": -591.9741508977197,
-        "y": 2032.4578222275159
-      },
-      "dragging": false,
-      "focusable": true
-    },
-    {
-      "id": "C6P69YiFdS-ioPXMNfX07",
-      "type": "subtopic",
-      "position": {
-        "x": -599.9741508977197,
-        "y": 1748.425681269572
-      },
-      "selected": false,
-      "data": {
-        "label": "Query Analysis Techniques",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 271,
-      "height": 49,
-      "style": {
-        "width": 271,
-        "height": 49
-      },
-      "resizing": false,
-      "dragging": false,
-      "positionAbsolute": {
-        "x": -599.9741508977197,
-        "y": 1748.425681269572
-      },
-      "focusable": true
-    },
-    {
-      "id": "UDqbT1y-YzBrljfKSz_RG",
-      "type": "topic",
-      "position": {
-        "x": -261.26200280604616,
-        "y": 1907.9466965113045
-      },
-      "selected": false,
-      "data": {
-        "label": "Advanced SQL",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 186,
-      "height": 49,
-      "style": {
-        "width": 186,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": -261.26200280604616,
-        "y": 1907.9466965113045
-      },
-      "dragging": false,
-      "selectable": true,
-      "focusable": true,
-      "resizing": false
-    },
-    {
-      "id": "TjgwabhEtaSoYMLNr6q9l",
-      "type": "subtopic",
-      "position": {
-        "x": 22.917108454473976,
-        "y": 1854.9466965113045
-      },
-      "selected": false,
-      "data": {
-        "label": "Recursive Queries",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 259,
-      "height": 49,
-      "style": {
-        "width": 259,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 22.917108454473976,
-        "y": 1854.9466965113045
-      },
-      "dragging": false,
-      "resizing": false,
-      "focusable": true
-    },
-    {
-      "id": "nwFaz9i-1s0WVrVaFsoqb",
-      "type": "subtopic",
-      "position": {
-        "x": 22.917108454473976,
-        "y": 1907.9466965113045
-      },
-      "selected": false,
-      "data": {
-        "label": "Pivot / Unpivot Operations",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 259,
-      "height": 49,
-      "style": {
-        "width": 259,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 22.917108454473976,
-        "y": 1907.9466965113045
-      },
-      "dragging": false,
-      "resizing": false,
-      "focusable": true
-    },
-    {
-      "id": "tBvXLLp5FKeSSN35Kj1X4",
-      "type": "subtopic",
-      "position": {
-        "x": 22.917108454473976,
-        "y": 1801.9466965113045
-      },
-      "selected": false,
-      "data": {
-        "label": "Window Functions",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 259,
-      "height": 49,
-      "style": {
-        "width": 259,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 22.917108454473976,
-        "y": 1801.9466965113045
-      },
-      "dragging": false,
-      "resizing": false,
-      "focusable": true
-    },
-    {
-      "id": "tedQynR0xicVKhuR1oahw",
-      "type": "subtopic",
-      "position": {
-        "x": 22.917108454473976,
-        "y": 1960.9466965113045
-      },
-      "selected": false,
-      "data": {
-        "label": "Common Table Expressions",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 259,
-      "height": 49,
-      "style": {
-        "width": 259,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 22.917108454473976,
-        "y": 1960.9466965113045
-      },
-      "dragging": false,
-      "resizing": false,
-      "focusable": true
-    },
-    {
-      "id": "z5Sf0VU14ZCQ80kL1qOqc",
-      "type": "subtopic",
-      "position": {
-        "x": 22.917108454473976,
-        "y": 2013.9466965113045
-      },
-      "selected": false,
-      "data": {
-        "label": "Dynamic SQL",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 259,
-      "height": 49,
-      "style": {
-        "width": 259,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 22.917108454473976,
-        "y": 2013.9466965113045
-      },
-      "dragging": false,
-      "resizing": false,
-      "focusable": true
-    },
-    {
-      "id": "zW27ZHdLwQY-85iqbBKQZ",
-      "type": "subtopic",
-      "position": {
-        "x": 42.34043885768011,
-        "y": 1707.7884641029652
-      },
-      "selected": false,
-      "data": {
-        "label": "Row_number",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 134,
-      "height": 49,
-      "style": {
-        "width": 134,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 42.34043885768011,
-        "y": 1707.7884641029652
-      },
-      "dragging": false,
-      "resizing": false,
-      "focusable": true
-    },
-    {
-      "id": "cucCPw3KfetAP2OMFUs0X",
-      "type": "subtopic",
-      "position": {
-        "x": 42.34043885768011,
-        "y": 1551.7884641029652
-      },
-      "selected": false,
-      "data": {
-        "label": "rank",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 134,
-      "height": 49,
-      "style": {
-        "width": 134,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 42.34043885768011,
-        "y": 1551.7884641029652
-      },
-      "dragging": false,
-      "resizing": false,
-      "focusable": true
-    },
-    {
-      "id": "QM0ltgPu8lLLYc2MsTLj-",
-      "type": "subtopic",
-      "position": {
-        "x": 42.34043885768011,
-        "y": 1603.7884641029652
-      },
-      "selected": false,
-      "data": {
-        "label": "dense_rank",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 134,
-      "height": 49,
-      "style": {
-        "width": 134,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 42.34043885768011,
-        "y": 1603.7884641029652
-      },
-      "dragging": false,
-      "resizing": true,
-      "focusable": true
-    },
-    {
-      "id": "aJJjaGunRrwyh9MjQfJt-",
-      "type": "subtopic",
-      "position": {
-        "x": 42.34043885768011,
-        "y": 1655.7884641029652
-      },
-      "selected": false,
-      "data": {
-        "label": "lead",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 65,
-      "height": 49,
-      "style": {
-        "width": 65,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 42.34043885768011,
-        "y": 1655.7884641029652
-      },
-      "dragging": false,
-      "resizing": false,
-      "focusable": true
-    },
-    {
-      "id": "BcXdxY6bld5c0YNFSKkh-",
-      "type": "subtopic",
-      "position": {
-        "x": 111.34043885768011,
-        "y": 1655.7884641029652
-      },
-      "selected": false,
-      "data": {
-        "label": "lag",
-        "style": {
-          "fontSize": 17,
-          "justifyContent": "flex-start",
-          "textAlign": "center"
-        }
-      },
-      "zIndex": 999,
-      "width": 65,
-      "height": 49,
-      "style": {
-        "width": 65,
-        "height": 49
-      },
-      "positionAbsolute": {
-        "x": 111.34043885768011,
-        "y": 1655.7884641029652
-      },
-      "dragging": false,
-      "resizing": false,
-      "focusable": true
-    }
-  ],
-  "edges": [
-    {
-      "style": {
-        "strokeDasharray": "0",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "sourceHandle": "x2",
-      "target": "GV_zWF6rSWg5bqgiXhOEf",
-      "targetHandle": "w1",
-      "data": {
-        "edgeStyle": "solid"
-      },
-      "id": "M0aRyhxjzTWUOW95D1g1y",
-      "selected": false,
-      "type": "smoothstep",
-      "focusable": true,
-      "selectable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "sourceHandle": "x2",
-      "target": "GV_zWF6rSWg5bqgiXhOEf",
-      "targetHandle": "w1",
-      "data": {
-        "edgeStyle": "solid"
-      },
-      "id": "Xw4lLz2zWuTkNu8r4oheF",
-      "selected": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "sourceHandle": "x2",
-      "target": "GV_zWF6rSWg5bqgiXhOEf",
-      "targetHandle": "w1",
-      "data": {
-        "edgeStyle": "solid"
-      },
-      "id": "mbCXMk97_HKXG3d4TxBOC",
-      "selected": false,
-      "focusable": true,
-      "selectable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0.8 8",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "nhUKKWyBH80nyKfGT8ErC",
-      "sourceHandle": "z2",
-      "target": "gx4KaFqKgJX9n9_ZGMqlZ",
-      "targetHandle": "y1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
-      "id": "reactflow__edge-JDDG4KfhtIlw1rkNCzUliz2-gx4KaFqKgJX9n9_ZGMqlZy1",
-      "selected": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "nhUKKWyBH80nyKfGT8ErC",
-      "sourceHandle": "x2",
-      "target": "JDDG4KfhtIlw1rkNCzUli",
-      "targetHandle": "w2",
-      "data": {
-        "edgeStyle": "solid"
-      },
-      "id": "reactflow__edge-nhUKKWyBH80nyKfGT8ErCx2-JDDG4KfhtIlw1rkNCzUliw2",
-      "selected": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0.8 8",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "JDDG4KfhtIlw1rkNCzUli",
-      "sourceHandle": "y2",
-      "target": "6yoo7qC6X2jYDIjd3HIm7",
-      "targetHandle": "z1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
-      "id": "reactflow__edge-JDDG4KfhtIlw1rkNCzUliy2-6yoo7qC6X2jYDIjd3HIm7z1",
-      "selected": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0.8 8",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "JDDG4KfhtIlw1rkNCzUli",
-      "sourceHandle": "y2",
-      "target": "tBzMDfCMh6MIagNaxCzin",
-      "targetHandle": "z1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
-      "id": "reactflow__edge-JDDG4KfhtIlw1rkNCzUliy2-tBzMDfCMh6MIagNaxCzinz1",
-      "selected": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0.8 8",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "JDDG4KfhtIlw1rkNCzUli",
-      "sourceHandle": "y2",
-      "target": "ffwniprGJHZzJ7t3lQcXz",
-      "targetHandle": "z1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
-      "id": "reactflow__edge-JDDG4KfhtIlw1rkNCzUliy2-ffwniprGJHZzJ7t3lQcXzz1",
-      "selected": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "JDDG4KfhtIlw1rkNCzUli",
-      "sourceHandle": "z2",
-      "target": "xPOeXK1EPBNG56vgfG-VV",
-      "targetHandle": "y1",
-      "data": {
-        "edgeStyle": "solid"
-      },
-      "id": "reactflow__edge-JDDG4KfhtIlw1rkNCzUliz2-xPOeXK1EPBNG56vgfG-VVy1",
-      "selected": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "iogwMmOvub2ZF4zgg6WyF",
-      "sourceHandle": "x2",
-      "target": "nhUKKWyBH80nyKfGT8ErC",
-      "targetHandle": "w1",
-      "data": {
-        "edgeStyle": "solid"
-      },
-      "id": "reactflow__edge-iogwMmOvub2ZF4zgg6WyFx2-nhUKKWyBH80nyKfGT8ErCw1",
-      "selected": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0.8 8",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "nhUKKWyBH80nyKfGT8ErC",
-      "sourceHandle": "z2",
-      "target": "R9DQNc0AyAQ2HLpP4HOk6",
-      "targetHandle": "y1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
-      "id": "reactflow__edge-nhUKKWyBH80nyKfGT8ErCz2-R9DQNc0AyAQ2HLpP4HOk6y1",
-      "selected": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0.8 8",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "nhUKKWyBH80nyKfGT8ErC",
-      "sourceHandle": "z2",
-      "target": "fNTb9y3zs1HPYclAmu_Wv",
-      "targetHandle": "y1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
-      "id": "reactflow__edge-nhUKKWyBH80nyKfGT8ErCz2-fNTb9y3zs1HPYclAmu_Wvy1",
-      "selected": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0.8 8",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "LX9nzJ4uqznHN4SksoDvr",
-      "sourceHandle": "y2",
-      "target": "bFEYMlqPZtTUYtDQxqHzT",
-      "targetHandle": "z1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
-      "id": "reactflow__edge-LX9nzJ4uqznHN4SksoDvry2-bFEYMlqPZtTUYtDQxqHzTz1",
-      "selected": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0.8 8",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "LX9nzJ4uqznHN4SksoDvr",
-      "sourceHandle": "y2",
-      "target": "9aHYrOQDkA84tlxcVK5aD",
-      "targetHandle": "z1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
-      "id": "reactflow__edge-LX9nzJ4uqznHN4SksoDvry2-9aHYrOQDkA84tlxcVK5aDz1",
-      "selected": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0.8 8",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "LX9nzJ4uqznHN4SksoDvr",
-      "sourceHandle": "y2",
-      "target": "YqDJq3fPxUZlwsdq0kJg7",
-      "targetHandle": "z2",
-      "data": {
-        "edgeStyle": "dashed"
-      },
-      "id": "reactflow__edge-LX9nzJ4uqznHN4SksoDvry2-YqDJq3fPxUZlwsdq0kJg7z2",
-      "selected": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0.8 8",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "LX9nzJ4uqznHN4SksoDvr",
-      "sourceHandle": "y2",
-      "target": "Zw8IHfCCMSxmVjx5Ho5ff",
-      "targetHandle": "z1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
-      "id": "reactflow__edge-LX9nzJ4uqznHN4SksoDvry2-Zw8IHfCCMSxmVjx5Ho5ffz1",
-      "selected": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0.8 8",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "LX9nzJ4uqznHN4SksoDvr",
-      "sourceHandle": "y2",
-      "target": "HhICJpCK5__b-itUoEBES",
-      "targetHandle": "z1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
-      "id": "reactflow__edge-LX9nzJ4uqznHN4SksoDvry2-HhICJpCK5__b-itUoEBESz1",
-      "selected": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "LX9nzJ4uqznHN4SksoDvr",
-      "sourceHandle": "x2",
-      "target": "qBios3sZVhcJMpXmj9f7B",
-      "targetHandle": "y1",
-      "data": {
-        "edgeStyle": "solid"
-      },
-      "selected": false,
-      "selectable": true,
-      "focusable": true,
-      "id": "reactflow__edge-LX9nzJ4uqznHN4SksoDvrx2-8V6yw7kLaow-VVcv_K_pLy1",
-      "type": "smoothstep"
-    },
-    {
-      "style": {
-        "strokeDasharray": "0",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "qBios3sZVhcJMpXmj9f7B",
-      "sourceHandle": "x2",
-      "target": "8V6yw7kLaow-VVcv_K_pL",
-      "targetHandle": "w2",
-      "data": {
-        "edgeStyle": "solid"
-      },
-      "id": "reactflow__edge-qBios3sZVhcJMpXmj9f7Bx2-8V6yw7kLaow-VVcv_K_pLw2",
-      "selected": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "8V6yw7kLaow-VVcv_K_pL",
-      "sourceHandle": "y2",
-      "target": "86iZ8s8EdhSuYwgwAM_EO",
-      "targetHandle": "z2",
-      "data": {
-        "edgeStyle": "solid"
-      },
-      "id": "reactflow__edge-8V6yw7kLaow-VVcv_K_pLy2-86iZ8s8EdhSuYwgwAM_EOz2",
-      "selected": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0.8 8",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "86iZ8s8EdhSuYwgwAM_EO",
-      "sourceHandle": "y2",
-      "target": "xkPJ2MYiXmzC4yqQWyB_7",
-      "targetHandle": "z1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
-      "id": "reactflow__edge-86iZ8s8EdhSuYwgwAM_EOy2-xkPJ2MYiXmzC4yqQWyB_7z1",
-      "selected": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0.8 8",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "86iZ8s8EdhSuYwgwAM_EO",
-      "sourceHandle": "y2",
-      "target": "JZqS3Xapw6mfSPVgFW7av",
-      "targetHandle": "z1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
-      "id": "reactflow__edge-86iZ8s8EdhSuYwgwAM_EOy2-JZqS3Xapw6mfSPVgFW7avz1",
-      "selected": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0.8 8",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "vTMd0bqz4eTgLnhfgY61h",
-      "sourceHandle": "z2",
-      "target": "6FdHTzqQwJqR4czP5qXAY",
-      "targetHandle": "y1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
-      "id": "reactflow__edge-vTMd0bqz4eTgLnhfgY61hz2-6FdHTzqQwJqR4czP5qXAYy1",
-      "selected": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "LcljR70T-OnzSrJJDqOWf",
-      "sourceHandle": "x2",
-      "target": "OdaBXz2XBAVLsQ-m7xtAM",
-      "targetHandle": "w1",
-      "data": {
-        "edgeStyle": "solid"
-      },
-      "id": "reactflow__edge-LcljR70T-OnzSrJJDqOWfx2-UDqbT1y-YzBrljfKSz_RGw1",
-      "selected": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "OdaBXz2XBAVLsQ-m7xtAM",
-      "sourceHandle": "y2",
-      "target": "R1ktDJpXOz0PTllAcBrdu",
-      "targetHandle": "z1",
-      "data": {
-        "edgeStyle": "solid"
-      },
-      "id": "reactflow__edge-OdaBXz2XBAVLsQ-m7xtAMy2-UDqbT1y-YzBrljfKSz_RGz1",
-      "selected": false,
-      "selectable": true,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "R1ktDJpXOz0PTllAcBrdu",
-      "sourceHandle": "y2",
-      "target": "w7FNjdwqjY7X69aJqqBy4",
-      "targetHandle": "z1",
-      "data": {
-        "edgeStyle": "solid"
-      },
-      "id": "reactflow__edge-R1ktDJpXOz0PTllAcBrduy2-UDqbT1y-YzBrljfKSz_RGz1",
-      "selected": false,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "w7FNjdwqjY7X69aJqqBy4",
-      "sourceHandle": "x2",
-      "target": "4rqCPpTb0dAgpheBKshRG",
-      "targetHandle": "w1",
-      "data": {
-        "edgeStyle": "solid"
-      },
-      "id": "reactflow__edge-w7FNjdwqjY7X69aJqqBy4x2-UDqbT1y-YzBrljfKSz_RGw1",
-      "selected": false,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0.8 8",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "4rqCPpTb0dAgpheBKshRG",
-      "sourceHandle": "x2",
-      "target": "C6P69YiFdS-ioPXMNfX07",
-      "targetHandle": "w1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
-      "id": "reactflow__edge-UDqbT1y-YzBrljfKSz_RGx2-C6P69YiFdS-ioPXMNfX07w1",
-      "selected": false,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "4rqCPpTb0dAgpheBKshRG",
-      "sourceHandle": "z2",
-      "target": "UDqbT1y-YzBrljfKSz_RG",
-      "targetHandle": "w1",
-      "data": {
-        "edgeStyle": "solid"
-      },
-      "id": "reactflow__edge-4rqCPpTb0dAgpheBKshRGz2-UDqbT1y-YzBrljfKSz_RGw1",
-      "selected": false,
-      "type": "smoothstep",
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0.8 8",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "UDqbT1y-YzBrljfKSz_RG",
-      "sourceHandle": "z2",
-      "target": "tBvXLLp5FKeSSN35Kj1X4",
-      "targetHandle": "y1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
-      "id": "reactflow__edge-UDqbT1y-YzBrljfKSz_RGz2-tBvXLLp5FKeSSN35Kj1X4y1",
-      "selected": false,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0.8 8",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "UDqbT1y-YzBrljfKSz_RG",
-      "sourceHandle": "z2",
-      "target": "nwFaz9i-1s0WVrVaFsoqb",
-      "targetHandle": "y2",
-      "data": {
-        "edgeStyle": "dashed"
-      },
-      "id": "reactflow__edge-UDqbT1y-YzBrljfKSz_RGz2-nwFaz9i-1s0WVrVaFsoqby2",
-      "selected": false,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0.8 8",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "UDqbT1y-YzBrljfKSz_RG",
-      "sourceHandle": "z2",
-      "target": "TjgwabhEtaSoYMLNr6q9l",
-      "targetHandle": "y1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
-      "id": "reactflow__edge-UDqbT1y-YzBrljfKSz_RGz2-TjgwabhEtaSoYMLNr6q9ly1",
-      "selected": false,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0.8 8",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "UDqbT1y-YzBrljfKSz_RG",
-      "sourceHandle": "z2",
-      "target": "tedQynR0xicVKhuR1oahw",
-      "targetHandle": "y1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
-      "id": "reactflow__edge-UDqbT1y-YzBrljfKSz_RGz2-tedQynR0xicVKhuR1oahwy1",
-      "selected": false,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0.8 8",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "UDqbT1y-YzBrljfKSz_RG",
-      "sourceHandle": "z2",
-      "target": "z5Sf0VU14ZCQ80kL1qOqc",
-      "targetHandle": "y1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
-      "id": "reactflow__edge-UDqbT1y-YzBrljfKSz_RGz2-z5Sf0VU14ZCQ80kL1qOqcy1",
-      "selected": false,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "UDqbT1y-YzBrljfKSz_RG",
-      "sourceHandle": "x2",
-      "target": "GV_zWF6rSWg5bqgiXhOEf",
-      "targetHandle": "w1",
-      "data": {
-        "edgeStyle": "solid"
-      },
-      "id": "reactflow__edge-UDqbT1y-YzBrljfKSz_RGx2-GV_zWF6rSWg5bqgiXhOEfw1",
-      "selected": false,
-      "focusable": true
-    },
-    {
-      "style": {
-        "strokeDasharray": "0.8 8",
-        "strokeLinecap": "round",
-        "strokeWidth": 3.5,
-        "stroke": "#2b78e4"
-      },
-      "source": "WigElh37ztiRYRstQR9NE",
-      "sourceHandle": "z2",
-      "target": "zEWmq0Y1LFPMQelpucrph",
-      "targetHandle": "y1",
-      "data": {
-        "edgeStyle": "dashed"
-      },
-      "id": "reactflow__edge-WigElh37ztiRYRstQR9NEz2-zEWmq0Y1LFPMQelpucrphy1",
-      "selected": false
-    }
-  ]
-}
\ No newline at end of file
+{"nodes":[{"id":"7DdMLjcx-zh7nwoILnWgn","type":"linksgroup","position":{"x":-611.9219566015802,"y":-233.7695706291704},"selected":true,"data":{"label":"","links":[{"id":"xnuo73dpjpTVvJa65hw8Y","label":"PostgreSQL Roadmap","href":"","url":"https://roadmap.sh/postgresql-dba"},{"id":"ZKSb0nzZ-jFu8vP_nbhRD","label":"MongoDB Roadmap","url":"https://roadmap.sh/mongodb"}]},"zIndex":999,"width":321,"height":95,"positionAbsolute":{"x":-611.9219566015802,"y":-233.7695706291704},"dragging":false,"style":{"width":321,"height":95},"resizing":false,"selectable":true,"focusable":true},{"id":"uAWe6RysRWSe8PqyYQKKX","type":"vertical","position":{"x":92.74891832888147,"y":1732.8028446032797},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":101,"style":{"width":20,"height":101},"positionAbsolute":{"x":92.74891832888147,"y":1732.8028446032797},"dragging":false,"resizing":false,"focusable":true,"selectable":true},{"id":"GEdhZU9WflZsSbHIAL6Y8","type":"section","position":{"x":-599.9741508977197,"y":1805.4578222275159},"width":271,"height":270,"style":{"width":271,"height":270},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":-599.9741508977197,"y":1805.4578222275159},"dragging":false,"focusable":true,"selectable":true},{"id":"hWk-3dRw9XQyHpc9_oxet","type":"vertical","position":{"x":-111.76200280604616,"y":1372.4268132068846},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":167,"style":{"width":20,"height":167},"positionAbsolute":{"x":-111.76200280604616,"y":1372.4268132068846},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"bxQ-MepnAll0CkNFpqeJA","type":"vertical","position":{"x":244.58982076233502,"y":1372.4268132068846},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"},"oldId":"hWk-3dRw9XQyHpc9_oxet"},"zIndex":999,"width":20,"height":167,"style":{"width":20,"height":167},"positionAbsolute":{"x":244.58982076233502,"y":1372.4268132068846},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"V800FmJL7JvYLHj_s6Qpe","type":"vertical","position":{"x":368.94949271295843,"y":1461.4268132068846},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"},"oldId":"hWk-3dRw9XQyHpc9_oxet"},"zIndex":999,"width":20,"height":78,"style":{"width":20,"height":78},"positionAbsolute":{"x":368.94949271295843,"y":1461.4268132068846},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"XeLCXJ5VfwHrIFGqcB8QH","type":"vertical","position":{"x":335.47198755548254,"y":1208.3834408721723},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":95,"style":{"width":20,"height":95},"positionAbsolute":{"x":335.47198755548254,"y":1208.3834408721723},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"eyqdjMFVONWDshElnh-fS","type":"section","position":{"x":-314.2510816711185,"y":1122.8834408721723},"width":218,"height":196,"style":{"width":218,"height":195.5},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":-314.2510816711185,"y":1122.8834408721723},"selectable":true,"focusable":true,"resizing":false,"dragging":false},{"id":"5iMBYXe8Al0ZeiRBnJ-cn","type":"vertical","position":{"x":-193.26200280604616,"y":821.8865696806382},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.65}},"zIndex":999,"width":20,"height":287,"style":{"width":20,"height":287},"positionAbsolute":{"x":-193.26200280604616,"y":821.8865696806382},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"H-11E5G6rdTKj3k7PK12l","type":"section","position":{"x":-612.7510816711185,"y":1124.7304293708296},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":243,"height":216,"style":{"width":243,"height":216},"positionAbsolute":{"x":-612.7510816711185,"y":1124.7304293708296},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"6FdHTzqQwJqR4czP5qXAY","type":"section","position":{"x":-45.25108167111853,"y":897.7304293708296},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":238,"height":160,"style":{"width":238,"height":160},"dragging":false,"resizing":false,"positionAbsolute":{"x":-45.25108167111853,"y":897.7304293708296},"selectable":true,"focusable":true},{"id":"nSShTLakj1E_JAHdcsfe4","type":"section","position":{"x":-45.25108167111853,"y":1051.8865696806383},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":238,"height":163,"style":{"width":238,"height":163},"positionAbsolute":{"x":-45.25108167111853,"y":1051.8865696806383},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"OPT7zGno_ghrrj4dAUKaW","type":"horizontal","position":{"x":-369.7510816711185,"y":967.7304293708296},"selected":true,"data":{"label":"horizontal node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":95,"height":20,"style":{"width":95,"height":20},"positionAbsolute":{"x":-369.7510816711185,"y":967.7304293708296},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"vVvwzfWSzMXhGop1nX_9k","type":"section","position":{"x":-612.7510816711185,"y":914.2304293708296},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":243,"height":214,"style":{"width":243,"height":214},"resizing":false,"dragging":false,"positionAbsolute":{"x":-612.7510816711185,"y":914.2304293708296},"selectable":true,"focusable":true},{"id":"BZD3zEjZNwFZN5Erp2UwN","type":"vertical","position":{"x":-193.26200280604616,"y":749.0530101616195},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":78,"style":{"width":20,"height":78},"positionAbsolute":{"x":-193.26200280604616,"y":749.0530101616195},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"WigElh37ztiRYRstQR9NE","type":"section","position":{"x":-615.2510816711185,"y":697.2304293708296},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":317,"height":73,"style":{"width":317,"height":73},"resizing":false,"positionAbsolute":{"x":-615.2510816711185,"y":697.2304293708296},"dragging":false,"selectable":true,"focusable":true},{"id":"tUokjJrzZ4hp8c6f7iBI0","type":"horizontal","position":{"x":90.44949271295843,"y":807.3865696806382},"selected":true,"data":{"label":"horizontal node","style":{"stroke":"#2B78E4","strokeWidth":3.65},"oldId":"Zr7u2K8_wGkPwWzTvSJJu"},"zIndex":999,"width":138,"height":20,"style":{"width":138,"height":20},"positionAbsolute":{"x":90.44949271295843,"y":807.3865696806382},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"Zr7u2K8_wGkPwWzTvSJJu","type":"horizontal","position":{"x":117.44949271295843,"y":662.3865696806382},"selected":true,"data":{"label":"horizontal node","style":{"stroke":"#2B78E4","strokeWidth":3.65}},"zIndex":999,"width":138,"height":20,"style":{"width":138,"height":20},"positionAbsolute":{"x":117.44949271295843,"y":662.3865696806382},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"zO8ETJn55ShzPf8ifDqO2","type":"horizontal","position":{"x":-271.26200280604616,"y":295.2980966830105},"selected":true,"data":{"label":"horizontal node","style":{"stroke":"#2B78E4","strokeWidth":3.75}},"zIndex":999,"width":225,"height":20,"style":{"width":225,"height":20},"positionAbsolute":{"x":-271.26200280604616,"y":295.2980966830105},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"80OaUGoB4961Qak9JZ7sS","type":"vertical","position":{"x":147.0258491022803,"y":300.7980966830105},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":104,"style":{"width":20,"height":104},"positionAbsolute":{"x":147.0258491022803,"y":300.7980966830105},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"6yiWcpPgkAuYFZlDGlM1P","type":"vertical","position":{"x":147.0258491022803,"y":171.52074126997718},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.65}},"zIndex":999,"width":20,"height":144,"style":{"width":20,"height":144},"positionAbsolute":{"x":147.0258491022803,"y":171.52074126997718},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"vpSPxfiH2jcZiDF4glMnG","type":"vertical","position":{"x":348.94949271295843,"y":171.52074126997718},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":111,"style":{"width":20,"height":111},"positionAbsolute":{"x":348.94949271295843,"y":171.52074126997718},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"7YsPMUciWuosgKwI9YJrI","type":"section","position":{"x":-611.8883211898742,"y":213.5207412699772},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":232,"height":164,"style":{"width":232,"height":164},"resizing":false,"dragging":false,"positionAbsolute":{"x":-611.8883211898742,"y":213.5207412699772},"selectable":true,"focusable":true},{"width":20,"height":76,"id":"LEijbLyxg4RyutKEM2Y5g","type":"vertical","position":{"x":-114.16916540260297,"y":-227.7695706291704},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#0A33FF"},"oldId":"xD07fJ1NmNeAarVCEfubU"},"zIndex":999,"positionAbsolute":{"x":-114.16916540260297,"y":-227.7695706291704},"dragging":false,"focusable":true,"style":{"width":20,"height":76},"resizing":false,"selectable":true},{"id":"yHmHXymPNWwu8p1vvqD3o","type":"paragraph","position":{"x":110.84147172248669,"y":-233.7695706291704},"selected":true,"data":{"label":"Find the detailed version of this roadmap and other similar roadmaps","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left","borderColor":"#000000","backgroundColor":"#FFFFFf"}},"zIndex":999,"width":328,"height":138,"positionAbsolute":{"x":110.84147172248669,"y":-233.7695706291704},"dragging":false,"selectable":true,"focusable":true,"style":{"width":328,"height":138},"resizing":false},{"id":"R_Fs6rdl2XtQ9aLOubMqL","type":"button","position":{"x":121.34147172248669,"y":-156.7840072114252},"selected":true,"data":{"label":"roadmap.sh","href":"https://roadmap.sh","color":"#ffffff","backgroundColor":"#4136D6","style":{"fontSize":17},"oldId":"2zqZkyVgigifcRS1H7F_b"},"zIndex":999,"width":307,"height":49,"dragging":false,"style":{"width":307,"height":49},"resizing":false,"positionAbsolute":{"x":121.34147172248669,"y":-156.7840072114252},"selectable":true,"focusable":true},{"id":"xwpc_KxehAruFM0pCQnie","type":"vertical","position":{"x":-178.82615613784935,"y":2214.6370362009566},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#4136D4"},"oldId":"Ju00mr0KLGN2BV6yEQGPt"},"zIndex":999,"width":20,"height":104,"positionAbsolute":{"x":-178.82615613784935,"y":2214.6370362009566},"dragging":false,"style":{"width":20,"height":104},"resizing":false,"focusable":true,"selectable":true},{"width":482,"height":118,"id":"GV_zWF6rSWg5bqgiXhOEf","type":"paragraph","position":{"x":-409.82615613784935,"y":2122.8704528251837},"selected":true,"data":{"label":"Have a look at the following related roadmaps","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center","borderColor":"#000000","backgroundColor":"#ffffff"},"oldId":"sVXZrBCsiSzWBBYWTm-nQ"},"zIndex":999,"positionAbsolute":{"x":-409.82615613784935,"y":2122.8704528251837},"dragging":false,"style":{"width":482,"height":118},"resizing":false,"focusable":true,"selectable":true},{"width":142,"height":49,"id":"OQpi63qND2KBXVvKBNMST","type":"button","position":{"x":-398.308978052272,"y":2177.5597347368353},"selected":true,"data":{"label":"Backend","href":"https://roadmap.sh/backend","color":"#FFFFFf","backgroundColor":"#4136D4","style":{"fontSize":17},"borderColor":"#4136D4","oldId":"U0fJo2a3vnaodNJhfZ78I"},"zIndex":999,"dragging":false,"positionAbsolute":{"x":-398.308978052272,"y":2177.5597347368353},"style":{"width":142,"height":49},"focusable":true,"resizing":false,"selectable":true},{"width":167,"height":49,"id":"iuSv7V59YxUZawN38Qlli","type":"button","position":{"x":-108.06128192779408,"y":2177.5597347368353},"selected":true,"data":{"label":"MongoDB","href":"https://roadmap.sh/mongodb","color":"#FFFFFf","backgroundColor":"#4136D4","style":{"fontSize":17},"borderColor":"#4136D4","oldId":"ZSrQoNGKiR484uALMWO9F"},"zIndex":999,"dragging":false,"positionAbsolute":{"x":-108.06128192779408,"y":2177.5597347368353},"style":{"width":167,"height":49},"focusable":true,"resizing":false,"selectable":true},{"id":"R9DQNc0AyAQ2HLpP4HOk6","type":"subtopic","position":{"x":130.89980850421182,"y":-41.63210941079885},"selected":true,"data":{"label":"What are Relational Databases?","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":310,"height":49,"style":{"width":310,"height":49},"positionAbsolute":{"x":130.89980850421182,"y":-41.63210941079885},"dragging":false,"selectable":true,"focusable":true},{"id":"fNTb9y3zs1HPYclAmu_Wv","type":"subtopic","position":{"x":130.89980850421182,"y":11.367890589201153},"selected":true,"data":{"label":"RDBMS Benefits and Limitations","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":310,"height":49,"style":{"width":310,"height":49},"positionAbsolute":{"x":130.89980850421182,"y":11.367890589201153},"dragging":false,"selectable":true,"focusable":true},{"width":95,"height":68,"id":"iogwMmOvub2ZF4zgg6WyF","type":"title","position":{"x":-151.66916540260297,"y":-151.7695706291704},"selected":true,"data":{"label":"SQL","style":{"fontSize":28,"justifyContent":"flex-start","textAlign":"center"},"oldId":"9nxw2PEl-_eQPW0FHNPq2"},"zIndex":999,"dragging":false,"positionAbsolute":{"x":-151.66916540260297,"y":-151.7695706291704},"focusable":true,"selectable":true},{"id":"nhUKKWyBH80nyKfGT8ErC","type":"topic","position":{"x":-227.16916540260297,"y":13.436864496015943},"selected":true,"data":{"label":"Learn the Basics","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"JDDG4KfhtIlw1rkNCzUli"},"zIndex":999,"width":246,"height":49,"style":{"width":246,"height":49},"positionAbsolute":{"x":-227.16916540260297,"y":13.436864496015943},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"width":142,"height":49,"id":"U0fJo2a3vnaodNJhfZ78I","type":"button","position":{"x":-252.30897805227198,"y":2177.5597347368353},"selected":true,"data":{"label":"PostgreSQL","href":"https://roadmap.sh/postgresql-dba","color":"#FFFFFf","backgroundColor":"#4136D4","style":{"fontSize":17},"borderColor":"#4136D4","oldId":"P5IZjP0g1_fnvHy3YTR4q"},"zIndex":999,"dragging":false,"positionAbsolute":{"x":-252.30897805227198,"y":2177.5597347368353},"style":{"width":142,"height":49},"focusable":true,"resizing":false,"selectable":true},{"id":"gx4KaFqKgJX9n9_ZGMqlZ","type":"subtopic","position":{"x":130.89980850421182,"y":64.36789058920115},"selected":true,"data":{"label":"SQL vs NoSQL Databases","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":310,"height":49,"style":{"width":310,"height":49},"positionAbsolute":{"x":130.89980850421182,"y":64.36789058920115},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"JDDG4KfhtIlw1rkNCzUli","type":"topic","position":{"x":-227.16916540260297,"y":159.23119080604232},"selected":true,"data":{"label":"Basic SQL Syntax","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"VJSIbYJcy2MC6MOFBrqXi"},"zIndex":999,"width":246,"height":50,"style":{"width":246,"height":50},"positionAbsolute":{"x":-227.16916540260297,"y":159.23119080604232},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"6yoo7qC6X2jYDIjd3HIm7","type":"subtopic","position":{"x":-611.9219566015802,"y":50.23119080604238},"selected":true,"data":{"label":"SQL Keywords","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":232,"height":49,"style":{"width":232,"height":49},"positionAbsolute":{"x":-611.9219566015802,"y":50.23119080604238},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"tBzMDfCMh6MIagNaxCzin","type":"subtopic","position":{"x":-611.9219566015802,"y":103.23119080604238},"selected":true,"data":{"label":"Data Types","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":232,"height":53,"style":{"width":232,"height":53},"positionAbsolute":{"x":-611.9219566015802,"y":103.23119080604238},"dragging":false,"selectable":true,"focusable":true},{"id":"ffwniprGJHZzJ7t3lQcXz","type":"subtopic","position":{"x":-611.9219566015802,"y":160.23119080604232},"selected":true,"data":{"label":"Operators","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":232,"height":49,"style":{"width":232,"height":49},"positionAbsolute":{"x":-611.9219566015802,"y":160.23119080604232},"selectable":true,"focusable":true,"dragging":false},{"id":"rmqXH29n1oXtZ8tvmcRFn","type":"subtopic","position":{"x":-601.6806695765429,"y":223.52268765100933},"selected":true,"data":{"label":"SELECT","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"positionAbsolute":{"x":-601.6806695765429,"y":223.52268765100933},"selectable":true,"focusable":true,"resizing":false,"dragging":false},{"id":"mPj6BiK5FKKkIQ9WsWEo6","type":"subtopic","position":{"x":-497.61169566972785,"y":223.52268765100933},"selected":true,"data":{"label":"INSERT","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":110,"height":49,"style":{"width":110,"height":49},"positionAbsolute":{"x":-497.61169566972785,"y":223.52268765100933},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"eu9dJFi6gBPMBdy08Y5Bb","type":"subtopic","position":{"x":-497.61169566972785,"y":276.52268765100933},"selected":true,"data":{"label":"UPDATE","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":107,"height":49,"style":{"width":107,"height":49},"positionAbsolute":{"x":-497.61169566972785,"y":276.52268765100933},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"ddtVaA4Ls6qRj-7OtTSIH","type":"subtopic","position":{"x":-601.6806695765429,"y":276.52268765100933},"selected":true,"data":{"label":"DELETE","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"positionAbsolute":{"x":-601.6806695765429,"y":276.52268765100933},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"91OF3VQdzsu_YPsT6zrVT","type":"label","position":{"x":-548.8883211898742,"y":336.5207412699772},"selected":true,"data":{"label":"Statements","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":103,"height":36,"style":{},"positionAbsolute":{"x":-548.8883211898742,"y":336.5207412699772},"dragging":false,"selectable":true,"focusable":true},{"id":"xPOeXK1EPBNG56vgfG-VV","type":"topic","position":{"x":118.89980850421182,"y":159.73119080604232},"selected":true,"data":{"label":"Data Definition Language (DDL)","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":322,"height":49,"style":{"width":322,"height":49},"positionAbsolute":{"x":118.89980850421182,"y":159.73119080604232},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"K5vhqTJrdPK08Txv8zaEj","type":"subtopic","position":{"x":275.44949271295843,"y":238.7980966830105},"selected":true,"data":{"label":"Truncate Table","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":166,"height":53,"style":{"width":166,"height":53},"positionAbsolute":{"x":275.44949271295843,"y":238.7980966830105},"selectable":true,"focusable":true,"dragging":false},{"id":"WjXlO42WL9saDS7RIGapt","type":"subtopic","position":{"x":275.44949271295843,"y":295.7980966830105},"selected":true,"data":{"label":"Alter Table","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":166,"height":49,"style":{"width":166,"height":49},"positionAbsolute":{"x":275.44949271295843,"y":295.7980966830105},"selectable":true,"focusable":true,"dragging":false},{"id":"epEpBxRosLhuAuKwp823r","type":"subtopic","position":{"x":275.44949271295843,"y":348.7980966830105},"selected":true,"data":{"label":"Create Table","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":166,"height":49,"style":{"width":166,"height":49},"positionAbsolute":{"x":275.44949271295843,"y":348.7980966830105},"selectable":true,"focusable":true,"dragging":false},{"id":"YzJ6QmY2arMfRzMAPaI0T","type":"subtopic","position":{"x":275.44949271295843,"y":401.7980966830105},"selected":true,"data":{"label":"Drop Table","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":166,"height":49,"style":{"width":166,"height":49},"positionAbsolute":{"x":275.44949271295843,"y":401.7980966830105},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"WMSXi-eez_hHGDM8kUdWz","type":"topic","position":{"x":-147.5663615725029,"y":280.7980966830105},"selected":true,"data":{"label":"Data Manipulation Language (DML)","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":355,"height":49,"style":{"width":355,"height":49},"positionAbsolute":{"x":-147.5663615725029,"y":280.7980966830105},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"i8u8E_sne6XiKJo2FXDog","type":"subtopic","position":{"x":-148.91017923766498,"y":376.83610755141524},"selected":true,"data":{"label":"Select","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center","colorType":"h"}},"zIndex":999,"width":361,"height":49,"style":{"width":361,"height":49},"positionAbsolute":{"x":-148.91017923766498,"y":376.83610755141524},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"N1Racr3ZpU320gS545We8","type":"subtopic","position":{"x":-148.91017923766498,"y":430.83610755141524},"selected":true,"data":{"label":"FROM","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":133,"height":49,"style":{"width":133,"height":49},"positionAbsolute":{"x":-148.91017923766498,"y":430.83610755141524},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"WhYAy6f7Euk3E49-ot644","type":"subtopic","position":{"x":-11.910179237664977,"y":430.83610755141524},"selected":true,"data":{"label":"WHERE","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":114,"height":49,"style":{"width":114,"height":49},"positionAbsolute":{"x":-11.910179237664977,"y":430.83610755141524},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"NfCiSPrL4upMssukcw3Kh","type":"subtopic","position":{"x":-11.910179237664977,"y":483.83610755141524},"selected":true,"data":{"label":"ORDER BY","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":132,"height":49,"style":{"width":132,"height":49},"positionAbsolute":{"x":-11.910179237664977,"y":483.83610755141524},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"14TKE6KhrH1yFtHcSZSXq","type":"subtopic","position":{"x":-148.91017923766498,"y":483.83610755141524},"selected":true,"data":{"label":"GROUP BY","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":134,"height":49,"style":{"width":134,"height":49},"positionAbsolute":{"x":-148.91017923766498,"y":483.83610755141524},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"ytwCkSMTiTuemE0KVfAfy","type":"subtopic","position":{"x":125.08982076233502,"y":483.83610755141524},"selected":true,"data":{"label":"HAVING","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":87,"height":49,"style":{"width":87,"height":49},"positionAbsolute":{"x":125.08982076233502,"y":483.83610755141524},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"4UQQYbjzwVxZOAxBuXKQS","type":"subtopic","position":{"x":107.08982076233502,"y":430.83610755141524},"selected":true,"data":{"label":"JOINs","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":105,"height":49,"style":{"width":105,"height":49},"positionAbsolute":{"x":107.08982076233502,"y":430.83610755141524},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"-Hew0y53ziZK3epQnGA0O","type":"subtopic","position":{"x":-148.91017923766498,"y":536.8361075514152},"selected":true,"data":{"label":"INSERT","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"positionAbsolute":{"x":-148.91017923766498,"y":536.8361075514152},"selectable":true,"focusable":true,"resizing":false,"dragging":false},{"id":"KJJ6PYjTnr_3yU2mNPL9v","type":"subtopic","position":{"x":-44.41017923766498,"y":536.8361075514152},"selected":true,"data":{"label":"UPDATE","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":153,"height":49,"style":{"width":153,"height":49},"positionAbsolute":{"x":-44.41017923766498,"y":536.8361075514152},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"zWnvuHJLHr03PWkrW1wZZ","type":"subtopic","position":{"x":112.08982076233502,"y":536.8361075514152},"selected":true,"data":{"label":"DELETE","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"positionAbsolute":{"x":112.08982076233502,"y":536.8361075514152},"selectable":true,"focusable":true,"resizing":false,"dragging":false},{"id":"68Y4cMQtdnJrbqSvl7aHc","type":"vertical","position":{"x":-281.26200280604616,"y":303.2980966830105},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.75}},"zIndex":999,"width":20,"height":207,"style":{"width":20,"height":207},"positionAbsolute":{"x":-281.26200280604616,"y":303.2980966830105},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"LX9nzJ4uqznHN4SksoDvr","type":"topic","position":{"x":-369.76200280604616,"y":511.23040771484375},"selected":true,"data":{"label":"Aggregate Queries","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":197,"height":49,"style":{"width":197,"height":49},"resizing":false,"positionAbsolute":{"x":-369.76200280604616,"y":511.23040771484375},"dragging":false,"selectable":true,"focusable":true},{"id":"w4T3jFb0ilf1KNw-AvRXG","type":"subtopic","position":{"x":-609.4684257507324,"y":407.23040771484375},"selected":true,"data":{"label":"SUM","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":75,"height":49,"style":{"width":75,"height":49},"positionAbsolute":{"x":-609.4684257507324,"y":407.23040771484375},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"9aHYrOQDkA84tlxcVK5aD","type":"subtopic","position":{"x":-531.8883211898742,"y":407.23040771484375},"selected":true,"data":{"label":"COUNT","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":80,"height":49,"style":{"width":80,"height":49},"positionAbsolute":{"x":-531.8883211898742,"y":407.23040771484375},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"Wou6YXLYUgomvcELh851L","type":"subtopic","position":{"x":-609.4684257507324,"y":459.73040771484375},"selected":true,"data":{"label":"AVG","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":75,"height":49,"style":{"width":75,"height":49},"positionAbsolute":{"x":-609.4684257507324,"y":459.73040771484375},"selectable":true,"focusable":true,"dragging":false},{"id":"bFEYMlqPZtTUYtDQxqHzT","type":"subtopic","position":{"x":-531.8883211898742,"y":459.73040771484375},"selected":true,"data":{"label":"MIN","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":80,"height":49,"style":{"width":80,"height":49},"positionAbsolute":{"x":-531.8883211898742,"y":459.73040771484375},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"YqDJq3fPxUZlwsdq0kJg7","type":"subtopic","position":{"x":-609.4684257507324,"y":512.2304077148438},"selected":true,"data":{"label":"MAX","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":157,"height":49,"style":{"width":157,"height":49},"positionAbsolute":{"x":-609.4684257507324,"y":512.2304077148438},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"Zw8IHfCCMSxmVjx5Ho5ff","type":"subtopic","position":{"x":-609.4684257507324,"y":564.7304077148438},"selected":true,"data":{"label":"GROUP BY","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":157,"height":49,"style":{"width":157,"height":49},"positionAbsolute":{"x":-609.4684257507324,"y":564.7304077148438},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"HhICJpCK5__b-itUoEBES","type":"subtopic","position":{"x":-609.4684257507324,"y":617.2304077148438},"selected":true,"data":{"label":"HAVING","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":157,"height":49,"style":{"width":157,"height":49},"positionAbsolute":{"x":-609.4684257507324,"y":617.2304077148438},"dragging":false,"selectable":true,"focusable":true},{"id":"qBios3sZVhcJMpXmj9f7B","type":"topic","position":{"x":-1.7791808916234686,"y":646.2304077148438},"selected":true,"data":{"label":"Data Constraints","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"8V6yw7kLaow-VVcv_K_pL"},"zIndex":999,"width":176,"height":49,"style":{"width":176,"height":49},"dragging":false,"positionAbsolute":{"x":-1.7791808916234686,"y":646.2304077148438},"selectable":true,"focusable":true,"resizing":false},{"id":"Jlwmyq6CUQeDAlL4dazOP","type":"subtopic","position":{"x":275.44949271295843,"y":470.3865696806382},"selected":true,"data":{"label":"Primary Key","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":166,"height":49,"style":{"width":166,"height":49},"positionAbsolute":{"x":275.44949271295843,"y":470.3865696806382},"selectable":true,"focusable":true,"dragging":false},{"id":"DHz6sRLYhFeCbAcNJS8hm","type":"subtopic","position":{"x":275.44949271295843,"y":523.3865696806382},"selected":true,"data":{"label":"Foreign Key","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":166,"height":49,"style":{"width":166,"height":49},"positionAbsolute":{"x":275.44949271295843,"y":523.3865696806382},"selectable":true,"focusable":true,"dragging":false},{"id":"5yGo8i7eplxtXOD_qfzOs","type":"subtopic","position":{"x":275.44949271295843,"y":576.3865696806382},"selected":true,"data":{"label":"Unique","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":166,"height":49,"style":{"width":166,"height":49},"positionAbsolute":{"x":275.44949271295843,"y":576.3865696806382},"selectable":true,"focusable":true,"dragging":false},{"id":"M4M_-vjM9GNy0NmXZneDA","type":"subtopic","position":{"x":275.44949271295843,"y":629.3865696806382},"selected":true,"data":{"label":"NOT NULL","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":166,"height":49,"style":{"width":166,"height":49},"positionAbsolute":{"x":275.44949271295843,"y":629.3865696806382},"selectable":true,"focusable":true,"dragging":false},{"id":"Q0h9Wfnl_W9ThOkv7Q17A","type":"subtopic","position":{"x":275.44949271295843,"y":682.3865696806382},"selected":true,"data":{"label":"CHECK","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":166,"height":49,"style":{"width":166,"height":49},"positionAbsolute":{"x":275.44949271295843,"y":682.3865696806382},"dragging":false,"selectable":true,"focusable":true},{"id":"1Crqx9BUhD84lOdUAjFA4","type":"vertical","position":{"x":245.44949271295843,"y":472.8865696806382},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.55}},"zIndex":999,"width":20,"height":259,"style":{"width":20,"height":259},"positionAbsolute":{"x":245.44949271295843,"y":472.8865696806382},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"8V6yw7kLaow-VVcv_K_pL","type":"topic","position":{"x":-1.7791808916234686,"y":791.2304293708296},"selected":true,"data":{"label":"JOIN Queries","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":176,"height":49,"style":{"width":176,"height":49},"dragging":false,"positionAbsolute":{"x":-1.7791808916234686,"y":791.2304293708296},"selectable":true,"focusable":true,"resizing":false},{"id":"aaua13CkTxLOYXr8cAgPm","type":"subtopic","position":{"x":247.47198755548254,"y":792.0530101616195},"selected":true,"data":{"label":"INNER JOIN","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":196,"height":49,"style":{"width":196,"height":49},"positionAbsolute":{"x":247.47198755548254,"y":792.0530101616195},"selectable":true,"focusable":true,"dragging":false},{"id":"X9cJJ8zLZCF2cOoqxwFfY","type":"subtopic","position":{"x":247.47198755548254,"y":845.0530101616195},"selected":true,"data":{"label":"LEFT JOIN","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":196,"height":49,"style":{"width":196,"height":49},"positionAbsolute":{"x":247.47198755548254,"y":845.0530101616195},"selectable":true,"focusable":true,"dragging":false},{"id":"shpgZkh1CLqUwjOaRtAFy","type":"subtopic","position":{"x":247.47198755548254,"y":898.0530101616195},"selected":true,"data":{"label":"RIGHT JOIN","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":196,"height":49,"style":{"width":196,"height":49},"positionAbsolute":{"x":247.47198755548254,"y":898.0530101616195},"selectable":true,"focusable":true,"dragging":false},{"id":"aS5zCyJRA779yHF0G2pje","type":"subtopic","position":{"x":247.47198755548254,"y":951.0530101616195},"selected":true,"data":{"label":"FULL OUTER JOIN","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":196,"height":49,"style":{"width":196,"height":49},"positionAbsolute":{"x":247.47198755548254,"y":951.0530101616195},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"6qG0AVYd6Y1B8LOSDoMX9","type":"subtopic","position":{"x":247.47198755548254,"y":1004.0530101616196},"selected":true,"data":{"label":"Self Join","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":196,"height":49,"style":{"width":196,"height":49},"positionAbsolute":{"x":247.47198755548254,"y":1004.0530101616196},"selectable":true,"focusable":true,"dragging":false},{"id":"7ow6tiSSCnTpv_GYQU017","type":"subtopic","position":{"x":247.47198755548254,"y":1057.0530101616196},"selected":true,"data":{"label":"Cross Join","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":196,"height":49,"style":{"width":196,"height":49},"positionAbsolute":{"x":247.47198755548254,"y":1057.0530101616196},"dragging":false,"selectable":true,"focusable":true},{"id":"0Rk1z-F_PEgOIh1qeG8rJ","type":"vertical","position":{"x":218.44949271295843,"y":787.8865696806382},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.55},"oldId":"1Crqx9BUhD84lOdUAjFA4"},"zIndex":999,"width":20,"height":319,"style":{"width":20,"height":319},"positionAbsolute":{"x":218.44949271295843,"y":787.8865696806382},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"86iZ8s8EdhSuYwgwAM_EO","type":"topic","position":{"x":-305.76200280604616,"y":791.2304293708296},"selected":true,"data":{"label":"Subqueries","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":202,"height":49,"style":{"width":202,"height":49},"positionAbsolute":{"x":-305.76200280604616,"y":791.2304293708296},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"eXQ-TrTlqL5p2AdGnozkL","type":"subtopic","position":{"x":-605.2510816711185,"y":708.2304293708296},"selected":true,"data":{"label":"Scalar","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":80,"height":49,"style":{"width":80,"height":49},"positionAbsolute":{"x":-605.2510816711185,"y":708.2304293708296},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"wmtt-3auWLdQWuVdwZLPd","type":"subtopic","position":{"x":-521.2510816711185,"y":708.2304293708296},"selected":true,"data":{"label":"Column","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":80,"height":49,"style":{"width":80,"height":49},"positionAbsolute":{"x":-521.2510816711185,"y":708.2304293708296},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"aLDl75i8gtLRA2Ud-fMmQ","type":"subtopic","position":{"x":-437.2510816711185,"y":708.2304293708296},"selected":true,"data":{"label":"Row","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":60,"height":49,"style":{"width":60,"height":49},"positionAbsolute":{"x":-437.2510816711185,"y":708.2304293708296},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"R9WDMRd-3wxsKH97-sT3n","type":"subtopic","position":{"x":-373.2510816711185,"y":708.2304293708296},"selected":true,"data":{"label":"Table","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":65,"height":49,"style":{"width":65,"height":49},"positionAbsolute":{"x":-373.2510816711185,"y":708.2304293708296},"dragging":false,"selectable":true,"focusable":true},{"id":"zEWmq0Y1LFPMQelpucrph","type":"label","position":{"x":-242.76200280604616,"y":715.7304293708296},"selected":true,"data":{"label":"Different Types","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":131,"height":36,"style":{},"positionAbsolute":{"x":-242.76200280604616,"y":715.7304293708296},"dragging":false,"selectable":true,"focusable":true},{"id":"xkPJ2MYiXmzC4yqQWyB_7","type":"subtopic","position":{"x":-614.2510816711185,"y":791.2304293708296},"selected":true,"data":{"label":"Nested Subqueries","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":219,"height":49,"style":{"width":219,"height":49},"positionAbsolute":{"x":-614.2510816711185,"y":791.2304293708296},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"JZqS3Xapw6mfSPVgFW7av","type":"subtopic","position":{"x":-614.2510816711185,"y":844.2304293708296},"selected":true,"data":{"label":"Correlated Subqueries","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":219,"height":49,"style":{"width":219,"height":49},"positionAbsolute":{"x":-614.2510816711185,"y":844.2304293708296},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"vTMd0bqz4eTgLnhfgY61h","type":"topic","position":{"x":-305.76200280604616,"y":953.2304293708296},"selected":true,"data":{"label":"Advanced Functions","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":202,"height":49,"style":{"width":202,"height":49},"positionAbsolute":{"x":-305.76200280604616,"y":953.2304293708296},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"o2SH4iQn1Ap2yDZ7cVYLO","type":"subtopic","position":{"x":-31.751081671118527,"y":912.2304293708296},"selected":true,"data":{"label":"FLOOR","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":80,"height":49,"style":{"width":80,"height":49},"positionAbsolute":{"x":-31.751081671118527,"y":912.2304293708296},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"6vYFb_D1N_-tLWZftL-Az","type":"subtopic","position":{"x":51.24891832888147,"y":912.2304293708296},"selected":true,"data":{"label":"ABS","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":65,"height":49,"style":{"width":65,"height":49},"positionAbsolute":{"x":51.24891832888147,"y":912.2304293708296},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"OUw--8zEq6lk5-6oySVHe","type":"subtopic","position":{"x":119.24891832888147,"y":912.2304293708296},"selected":true,"data":{"label":"MOD","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":65,"height":49,"style":{"width":65,"height":49},"positionAbsolute":{"x":119.24891832888147,"y":912.2304293708296},"dragging":false,"selectable":true,"focusable":true},{"id":"9DntFiZV1AyaRPhYP5q6u","type":"subtopic","position":{"x":-31.751081671118527,"y":964.2304293708296},"selected":true,"data":{"label":"ROUND","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":114,"height":49,"style":{"width":114},"positionAbsolute":{"x":-31.751081671118527,"y":964.2304293708296},"dragging":false,"selectable":true,"focusable":true},{"id":"BAqJQvcguhIhzyII5LRH6","type":"subtopic","position":{"x":85.24891832888147,"y":964.0530101616195},"selected":true,"data":{"label":"CEILING","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"positionAbsolute":{"x":85.24891832888147,"y":964.0530101616195},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"KI9LVF49Zml1StWiN0wUe","type":"label","position":{"x":-11.279180891623469,"y":1017.5530101616196},"selected":true,"data":{"label":"Numeric Functions","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":161,"height":36,"style":{},"positionAbsolute":{"x":-11.279180891623469,"y":1017.5530101616196},"dragging":false,"selectable":true,"focusable":true},{"id":"5inpEqafeVCfqsURHzQQg","type":"subtopic","position":{"x":-602.2510816711185,"y":922.8865696806382},"selected":true,"data":{"label":"CONCAT","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":120,"height":49,"style":{"width":120,"height":49},"positionAbsolute":{"x":-602.2510816711185,"y":922.8865696806382},"dragging":false,"selectable":true,"focusable":true},{"id":"RH8DLiQpDUWqw3U1522q5","type":"subtopic","position":{"x":-478.76200280604616,"y":922.8865696806382},"selected":true,"data":{"label":"LENGTH","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"positionAbsolute":{"x":-478.76200280604616,"y":922.8865696806382},"dragging":false,"selectable":true,"focusable":true},{"id":"PnG_5D6q66NAKxXVOwA6N","type":"subtopic","position":{"x":-602.9741508977197,"y":974.8865696806382},"selected":true,"data":{"label":"SUBSTRING","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":120,"height":49,"style":{"width":120,"height":49},"positionAbsolute":{"x":-602.9741508977197,"y":974.8865696806382},"dragging":false,"selectable":true,"focusable":true},{"id":"VNbb3YPc0FtrROylRns8h","type":"subtopic","position":{"x":-478.76200280604616,"y":974.8865696806382},"selected":true,"data":{"label":"REPLACE","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"dragging":false,"positionAbsolute":{"x":-478.76200280604616,"y":974.8865696806382},"selectable":true,"focusable":true},{"id":"Othfo7NvTVzfyL906PLM1","type":"subtopic","position":{"x":-602.9741508977197,"y":1026.8865696806383},"selected":true,"data":{"label":"UPPER","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":120,"height":49,"style":{"width":120,"height":49},"positionAbsolute":{"x":-602.9741508977197,"y":1026.8865696806383},"dragging":false,"selectable":true,"focusable":true},{"id":"knTG6pAq2mYP24WMa29xI","type":"subtopic","position":{"x":-478.76200280604616,"y":1026.8865696806383},"selected":true,"data":{"label":"LOWER","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"positionAbsolute":{"x":-478.76200280604616,"y":1026.8865696806383},"dragging":false,"selectable":true,"focusable":true},{"id":"Va_B9PyyGaQ_aX4ySyhUn","type":"label","position":{"x":-567.8883211898742,"y":1085.8865696806383},"selected":true,"data":{"label":"String Functions","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":141,"height":36,"style":{},"positionAbsolute":{"x":-567.8883211898742,"y":1085.8865696806383},"dragging":false,"selectable":true,"focusable":true},{"id":"W2ePJHdfEiEJ3ZKoRQKt_","type":"subtopic","position":{"x":-32.75108167111853,"y":1063.8865696806383},"selected":true,"data":{"label":"CASE","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":100,"height":49,"style":{"width":100,"height":49},"positionAbsolute":{"x":-32.75108167111853,"y":1063.8865696806383},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"KI6vngoYcHsnpIk8ErhhS","type":"subtopic","position":{"x":71.24891832888147,"y":1063.8865696806383},"selected":true,"data":{"label":"NULLIF","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":112,"height":49,"style":{"width":112,"height":49},"positionAbsolute":{"x":71.24891832888147,"y":1063.8865696806383},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"k7lZe4QRt9q4InUImFmvx","type":"subtopic","position":{"x":-32.91017923766498,"y":1115.8865696806383},"selected":true,"data":{"label":"COALESCE","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":218,"height":49,"style":{"width":218,"height":49},"positionAbsolute":{"x":-32.91017923766498,"y":1115.8865696806383},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"K2k3gFdSE63CqWmHeFUEs","type":"label","position":{"x":21.248918328881473,"y":1171},"selected":true,"data":{"label":"Conditional","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":103,"height":36,"style":{},"positionAbsolute":{"x":21.248918328881473,"y":1171},"dragging":false,"selectable":true,"focusable":true},{"id":"Ivqo2wa-_NhGU3vGd0pUI","type":"subtopic","position":{"x":-603.7510816711185,"y":1137.7304293708296},"selected":true,"data":{"label":"DATE","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":115,"height":49,"style":{"width":115,"height":49},"positionAbsolute":{"x":-603.7510816711185,"y":1137.7304293708296},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"88KlrMqSza9_YaD7Dv61p","type":"subtopic","position":{"x":-484.7510816711185,"y":1137.7304293708296},"selected":true,"data":{"label":"TIME","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":103,"height":49,"style":{"width":103,"height":49},"positionAbsolute":{"x":-484.7510816711185,"y":1137.7304293708296},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"7hEqkoxkdAWmakGZsMJx-","type":"subtopic","position":{"x":-603.7510816711185,"y":1190.7304293708296},"selected":true,"data":{"label":"TIMESTAMP","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":222,"height":49,"style":{"width":222,"height":49},"positionAbsolute":{"x":-603.7510816711185,"y":1190.7304293708296},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"BJ4fQvagTO0B5UtXblyx8","type":"subtopic","position":{"x":-603.7510816711185,"y":1243.7304293708296},"selected":true,"data":{"label":"DATEPART","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":115,"height":49,"style":{"width":115,"height":49},"dragging":false,"positionAbsolute":{"x":-603.7510816711185,"y":1243.7304293708296},"resizing":false,"selectable":true,"focusable":true},{"id":"1E1WdWOyqxbbdiIbw26dZ","type":"subtopic","position":{"x":-484.7510816711185,"y":1243.7304293708296},"selected":true,"data":{"label":"DATEADD","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":103,"height":49,"style":{"width":103,"height":49},"dragging":false,"positionAbsolute":{"x":-484.7510816711185,"y":1243.7304293708296},"resizing":false,"selectable":true,"focusable":true},{"id":"KWHyyOO605SQTAwdt3um_","type":"label","position":{"x":-556.7510816711185,"y":1297.8865696806383},"selected":true,"data":{"label":"Date and Time","href":"","color":"#000000","style":{"fontSize":17},"oldId":"Va_B9PyyGaQ_aX4ySyhUn"},"zIndex":999,"width":128,"height":36,"style":{},"positionAbsolute":{"x":-556.7510816711185,"y":1297.8865696806383},"dragging":false,"selectable":true,"focusable":true},{"id":"2tyezwOIxV6O84N-Q3Awh","type":"topic","position":{"x":-314.2510816711185,"y":1098.3834408721723},"selected":true,"data":{"label":"Views","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"vTMd0bqz4eTgLnhfgY61h"},"zIndex":999,"width":218,"height":49,"style":{"width":218,"height":49},"positionAbsolute":{"x":-314.2510816711185,"y":1098.3834408721723},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"PcsGK4VBh0zNQIPZvNES4","type":"subtopic","position":{"x":-306.2510816711185,"y":1155.3834408721723},"selected":true,"data":{"label":"Creating Views","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":202,"height":49,"style":{"width":202,"height":49},"dragging":false,"positionAbsolute":{"x":-306.2510816711185,"y":1155.3834408721723},"selectable":true,"focusable":true},{"id":"3eE-l-P93nOXoWfLr8PSW","type":"subtopic","position":{"x":-306.2510816711185,"y":1208.3834408721723},"selected":true,"data":{"label":"Modifying Views","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":202,"height":49,"style":{"width":202,"height":49},"dragging":false,"positionAbsolute":{"x":-306.2510816711185,"y":1208.3834408721723},"selectable":true,"focusable":true},{"id":"MIOuWWcCjLAmgzog2DBC3","type":"subtopic","position":{"x":-306.2510816711185,"y":1261.3834408721723},"selected":true,"data":{"label":"Dropping Views","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":202,"height":49,"style":{"width":202,"height":49},"resizing":false,"dragging":false,"positionAbsolute":{"x":-306.2510816711185,"y":1261.3834408721723},"selectable":true,"focusable":true},{"id":"Mwwbw0gZzeM27ewaUh49a","type":"horizontal","position":{"x":-96.25108167111853,"y":1280.8834408721723},"selected":true,"data":{"label":"horizontal node","style":{"stroke":"#2B78E4","strokeWidth":3.5}},"zIndex":999,"width":358,"height":20,"style":{"width":358,"height":20},"positionAbsolute":{"x":-96.25108167111853,"y":1280.8834408721723},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"LcljR70T-OnzSrJJDqOWf","type":"topic","position":{"x":204.97198755548254,"y":1266.3834408721723},"selected":true,"data":{"label":"Indexes","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"2tyezwOIxV6O84N-Q3Awh"},"zIndex":999,"width":237,"height":49,"style":{"width":237,"height":49},"positionAbsolute":{"x":204.97198755548254,"y":1266.3834408721723},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"NtxGd6Vx-REBclry7lZuE","type":"subtopic","position":{"x":247.47198755548254,"y":1121.8865696806383},"selected":true,"data":{"label":"Managing Indexes","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":196,"height":49,"style":{"width":196,"height":49},"positionAbsolute":{"x":247.47198755548254,"y":1121.8865696806383},"selectable":true,"focusable":true,"dragging":false},{"id":"Ps9Yv2s-bKvEegGAbPsiA","type":"subtopic","position":{"x":247.47198755548254,"y":1174.8865696806383},"selected":true,"data":{"label":"Query Optimization","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":196,"height":49,"style":{"width":196,"height":49},"dragging":false,"positionAbsolute":{"x":247.47198755548254,"y":1174.8865696806383},"selectable":true,"focusable":true},{"id":"OdaBXz2XBAVLsQ-m7xtAM","type":"topic","position":{"x":204.97198755548254,"y":1428.3990110065474},"selected":true,"data":{"label":"Transactions","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"UDqbT1y-YzBrljfKSz_RG"},"zIndex":999,"width":237,"height":49,"style":{"width":237,"height":49},"positionAbsolute":{"x":204.97198755548254,"y":1428.3990110065474},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"7sTW1vwUhCFOMXYjScVEt","type":"subtopic","position":{"x":321.97198755548254,"y":1511.9869221425392},"selected":true,"data":{"label":"BEGIN","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":120,"height":49,"style":{"width":120,"height":49},"positionAbsolute":{"x":321.97198755548254,"y":1511.9869221425392},"selectable":true,"focusable":true,"dragging":false},{"id":"3cMECz5QPVDOFrk5duObs","type":"subtopic","position":{"x":321.97198755548254,"y":1564.9869221425392},"selected":true,"data":{"label":"COMMIT","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":120,"height":49,"style":{"width":120,"height":49},"positionAbsolute":{"x":321.97198755548254,"y":1564.9869221425392},"selectable":true,"focusable":true,"dragging":false},{"id":"xbD67KVlt3UhHpKh8HLx8","type":"subtopic","position":{"x":321.97198755548254,"y":1617.9869221425392},"selected":true,"data":{"label":"ROLLBACK","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":120,"height":49,"style":{"width":120,"height":49},"positionAbsolute":{"x":321.97198755548254,"y":1617.9869221425392},"selectable":true,"focusable":true,"dragging":false},{"id":"pJtYvXUo81aZfPuRjIbMq","type":"subtopic","position":{"x":321.97198755548254,"y":1670.9869221425392},"selected":true,"data":{"label":"SAVEPOINT","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":120,"height":49,"style":{"width":120,"height":49},"positionAbsolute":{"x":321.97198755548254,"y":1670.9869221425392},"dragging":false,"selectable":true,"focusable":true},{"id":"igg34gLPl3HYVAmRNFGcV","type":"subtopic","position":{"x":212.08982076233502,"y":1511.9869221425392},"selected":true,"data":{"label":"ACID","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":85,"height":49,"style":{},"positionAbsolute":{"x":212.08982076233502,"y":1511.9869221425392},"dragging":false,"selectable":true,"focusable":true},{"id":"ujeq8EIFcrqkBjoFizsJM","type":"subtopic","position":{"x":29.089820762335023,"y":1343.8865696806383},"selected":true,"data":{"label":"Transaction Isolation Levels","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":259,"height":49,"style":{},"positionAbsolute":{"x":29.089820762335023,"y":1343.8865696806383},"dragging":false,"selectable":true,"focusable":true},{"id":"R1ktDJpXOz0PTllAcBrdu","type":"topic","position":{"x":-193.26200280604616,"y":1428.3990110065474},"selected":true,"data":{"label":"Data Integrity & Security","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"UDqbT1y-YzBrljfKSz_RG"},"zIndex":999,"width":237,"height":49,"style":{"width":237,"height":49},"positionAbsolute":{"x":-193.26200280604616,"y":1428.3990110065474},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"mBQ3Z8GlFcpIena3IB7D_","type":"subtopic","position":{"x":-264.01430668156826,"y":1343.8865696806383},"selected":true,"data":{"label":"Data Integrity Constraints","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":251,"height":49,"style":{"width":251,"height":49},"positionAbsolute":{"x":-264.01430668156826,"y":1343.8865696806383},"dragging":false,"focusable":true,"selectable":true},{"id":"03qMopxzjx_-dZbYw9b7J","type":"subtopic","position":{"x":-264.01430668156826,"y":1515.0464993424512},"selected":true,"data":{"label":"GRANT and Revoke","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":251,"height":49,"style":{"width":251,"height":49},"positionAbsolute":{"x":-264.01430668156826,"y":1515.0464993424512},"dragging":false,"focusable":true,"selectable":true},{"id":"vhBZqqmUcEon6-Vwvla4q","type":"subtopic","position":{"x":-264.01430668156826,"y":1568.0464993424512},"selected":true,"data":{"label":"DB Security Best Practices","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":251,"height":49,"style":{"width":251,"height":49},"positionAbsolute":{"x":-264.01430668156826,"y":1568.0464993424512},"dragging":false,"focusable":true,"selectable":true},{"id":"w7FNjdwqjY7X69aJqqBy4","type":"topic","position":{"x":-607.4741508977197,"y":1428.3990110065474},"selected":true,"data":{"label":"Stored Procedures & Functions","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"UDqbT1y-YzBrljfKSz_RG"},"zIndex":999,"width":286,"height":49,"style":{"width":286,"height":49},"positionAbsolute":{"x":-607.4741508977197,"y":1428.3990110065474},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"4rqCPpTb0dAgpheBKshRG","type":"topic","position":{"x":-592.9741508977197,"y":1645.2523745261662},"selected":true,"data":{"label":"Performance Optimization","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"UDqbT1y-YzBrljfKSz_RG"},"zIndex":999,"width":257,"height":49,"style":{"width":257,"height":49},"positionAbsolute":{"x":-592.9741508977197,"y":1645.2523745261662},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"9wOgP0i9G4HSeZGn2Gm7r","type":"subtopic","position":{"x":-591.9741508977197,"y":1813.4578222275159},"selected":true,"data":{"label":"Using Indexes","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":255,"height":49,"style":{"width":255,"height":49},"positionAbsolute":{"x":-591.9741508977197,"y":1813.4578222275159},"dragging":false,"focusable":true,"selectable":true},{"id":"C0dhS6uLf4TUSfvcWyXhv","type":"subtopic","position":{"x":-591.9741508977197,"y":1866.4578222275159},"selected":true,"data":{"label":"Optimizing Joins","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":255,"height":49,"style":{"width":255,"height":49},"positionAbsolute":{"x":-591.9741508977197,"y":1866.4578222275159},"dragging":false,"focusable":true,"selectable":true},{"id":"UVTgbZrqpbYl1bQvQejcF","type":"subtopic","position":{"x":-591.9741508977197,"y":1919.4578222275159},"selected":true,"data":{"label":"Reducing Subqueries","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":255,"height":49,"style":{"width":255,"height":49},"positionAbsolute":{"x":-591.9741508977197,"y":1919.4578222275159},"dragging":false,"focusable":true,"selectable":true},{"id":"w53CSY53nAAN0ux-XeJ4c","type":"subtopic","position":{"x":-591.9741508977197,"y":1972.4578222275159},"selected":true,"data":{"label":"Selective Projection","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":255,"height":49,"style":{"width":255,"height":49},"positionAbsolute":{"x":-591.9741508977197,"y":1972.4578222275159},"dragging":false,"focusable":true,"selectable":true},{"id":"s7WusVSHajNBKOLoo1COz","type":"label","position":{"x":-591.9741508977197,"y":2032.4578222275159},"selected":true,"data":{"label":"Query Optimization Techniques","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":255,"height":36,"style":{},"positionAbsolute":{"x":-591.9741508977197,"y":2032.4578222275159},"dragging":false,"focusable":true,"selectable":true},{"id":"C6P69YiFdS-ioPXMNfX07","type":"subtopic","position":{"x":-599.9741508977197,"y":1748.425681269572},"selected":true,"data":{"label":"Query Analysis Techniques","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":271,"height":49,"style":{"width":271,"height":49},"resizing":false,"dragging":false,"positionAbsolute":{"x":-599.9741508977197,"y":1748.425681269572},"focusable":true,"selectable":true},{"id":"UDqbT1y-YzBrljfKSz_RG","type":"topic","position":{"x":-261.26200280604616,"y":1907.9466965113045},"selected":true,"data":{"label":"Advanced SQL","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":186,"height":49,"style":{"width":186,"height":49},"positionAbsolute":{"x":-261.26200280604616,"y":1907.9466965113045},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"TjgwabhEtaSoYMLNr6q9l","type":"subtopic","position":{"x":22.917108454473976,"y":1854.9466965113045},"selected":true,"data":{"label":"Recursive Queries","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":259,"height":49,"style":{"width":259,"height":49},"positionAbsolute":{"x":22.917108454473976,"y":1854.9466965113045},"dragging":false,"resizing":false,"focusable":true,"selectable":true},{"id":"nwFaz9i-1s0WVrVaFsoqb","type":"subtopic","position":{"x":22.917108454473976,"y":1907.9466965113045},"selected":true,"data":{"label":"Pivot / Unpivot Operations","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":259,"height":49,"style":{"width":259,"height":49},"positionAbsolute":{"x":22.917108454473976,"y":1907.9466965113045},"dragging":false,"resizing":false,"focusable":true,"selectable":true},{"id":"tBvXLLp5FKeSSN35Kj1X4","type":"subtopic","position":{"x":22.917108454473976,"y":1801.9466965113045},"selected":true,"data":{"label":"Window Functions","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":259,"height":49,"style":{"width":259,"height":49},"positionAbsolute":{"x":22.917108454473976,"y":1801.9466965113045},"dragging":false,"resizing":false,"focusable":true,"selectable":true},{"id":"tedQynR0xicVKhuR1oahw","type":"subtopic","position":{"x":22.917108454473976,"y":1960.9466965113045},"selected":true,"data":{"label":"Common Table Expressions","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":259,"height":49,"style":{"width":259,"height":49},"positionAbsolute":{"x":22.917108454473976,"y":1960.9466965113045},"dragging":false,"resizing":false,"focusable":true,"selectable":true},{"id":"z5Sf0VU14ZCQ80kL1qOqc","type":"subtopic","position":{"x":22.917108454473976,"y":2013.9466965113045},"selected":true,"data":{"label":"Dynamic SQL","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":259,"height":49,"style":{"width":259,"height":49},"positionAbsolute":{"x":22.917108454473976,"y":2013.9466965113045},"dragging":false,"resizing":false,"focusable":true,"selectable":true},{"id":"zW27ZHdLwQY-85iqbBKQZ","type":"subtopic","position":{"x":42.34043885768011,"y":1707.7884641029652},"selected":true,"data":{"label":"Row_number","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":134,"height":49,"style":{"width":134,"height":49},"positionAbsolute":{"x":42.34043885768011,"y":1707.7884641029652},"dragging":false,"resizing":false,"focusable":true,"selectable":true},{"id":"cucCPw3KfetAP2OMFUs0X","type":"subtopic","position":{"x":42.34043885768011,"y":1551.7884641029652},"selected":true,"data":{"label":"rank","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":134,"height":49,"style":{"width":134,"height":49},"positionAbsolute":{"x":42.34043885768011,"y":1551.7884641029652},"dragging":false,"resizing":false,"focusable":true,"selectable":true},{"id":"QM0ltgPu8lLLYc2MsTLj-","type":"subtopic","position":{"x":42.34043885768011,"y":1603.7884641029652},"selected":true,"data":{"label":"dense_rank","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":134,"height":49,"style":{"width":134,"height":49},"positionAbsolute":{"x":42.34043885768011,"y":1603.7884641029652},"dragging":false,"resizing":true,"focusable":true,"selectable":true},{"id":"aJJjaGunRrwyh9MjQfJt-","type":"subtopic","position":{"x":42.34043885768011,"y":1655.7884641029652},"selected":true,"data":{"label":"lead","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":65,"height":49,"style":{"width":65,"height":49},"positionAbsolute":{"x":42.34043885768011,"y":1655.7884641029652},"dragging":false,"resizing":false,"focusable":true,"selectable":true},{"id":"BcXdxY6bld5c0YNFSKkh-","type":"subtopic","position":{"x":111.34043885768011,"y":1655.7884641029652},"selected":true,"data":{"label":"lag","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":65,"height":49,"style":{"width":65,"height":49},"positionAbsolute":{"x":111.34043885768011,"y":1655.7884641029652},"dragging":false,"resizing":false,"focusable":true,"selectable":true},{"id":"FcAeu8woDM7N51do6aiBV","type":"paragraph","position":{"x":-611.9219566015802,"y":-122.7695706291704},"selected":true,"data":{"label":"We just launched our premium SQL course, check it out below","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center","borderColor":"#000000","backgroundColor":"#FFFFFf"},"oldId":"yHmHXymPNWwu8p1vvqD3o"},"zIndex":999,"width":321,"height":141,"positionAbsolute":{"x":-611.9219566015802,"y":-122.7695706291704},"dragging":false,"selectable":true,"focusable":true,"style":{"width":321,"height":141},"resizing":false},{"id":"5n6N956H6tfwlQ0vqXW7e","type":"button","position":{"x":-594.4219566015802,"y":-42.7695706291704},"selected":true,"data":{"label":"Master SQL Course","href":"https://roadmap.sh/courses/sql","color":"#ffffff","backgroundColor":"#000000","style":{"fontSize":17},"oldId":"R_Fs6rdl2XtQ9aLOubMqL","borderColor":"#000000"},"zIndex":999,"width":285,"height":49,"dragging":false,"style":{"width":285,"height":49},"resizing":false,"positionAbsolute":{"x":-594.4219566015802,"y":-42.7695706291704},"selectable":true,"focusable":true}],"edges":[{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"sourceHandle":"x2","target":"GV_zWF6rSWg5bqgiXhOEf","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"M0aRyhxjzTWUOW95D1g1y","selected":true,"type":"smoothstep","focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"sourceHandle":"x2","target":"GV_zWF6rSWg5bqgiXhOEf","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"Xw4lLz2zWuTkNu8r4oheF","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"sourceHandle":"x2","target":"GV_zWF6rSWg5bqgiXhOEf","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"mbCXMk97_HKXG3d4TxBOC","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"nhUKKWyBH80nyKfGT8ErC","sourceHandle":"z2","target":"gx4KaFqKgJX9n9_ZGMqlZ","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-JDDG4KfhtIlw1rkNCzUliz2-gx4KaFqKgJX9n9_ZGMqlZy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"nhUKKWyBH80nyKfGT8ErC","sourceHandle":"x2","target":"JDDG4KfhtIlw1rkNCzUli","targetHandle":"w2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-nhUKKWyBH80nyKfGT8ErCx2-JDDG4KfhtIlw1rkNCzUliw2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"JDDG4KfhtIlw1rkNCzUli","sourceHandle":"y2","target":"6yoo7qC6X2jYDIjd3HIm7","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-JDDG4KfhtIlw1rkNCzUliy2-6yoo7qC6X2jYDIjd3HIm7z1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"JDDG4KfhtIlw1rkNCzUli","sourceHandle":"y2","target":"tBzMDfCMh6MIagNaxCzin","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-JDDG4KfhtIlw1rkNCzUliy2-tBzMDfCMh6MIagNaxCzinz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"JDDG4KfhtIlw1rkNCzUli","sourceHandle":"y2","target":"ffwniprGJHZzJ7t3lQcXz","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-JDDG4KfhtIlw1rkNCzUliy2-ffwniprGJHZzJ7t3lQcXzz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"JDDG4KfhtIlw1rkNCzUli","sourceHandle":"z2","target":"xPOeXK1EPBNG56vgfG-VV","targetHandle":"y1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-JDDG4KfhtIlw1rkNCzUliz2-xPOeXK1EPBNG56vgfG-VVy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"iogwMmOvub2ZF4zgg6WyF","sourceHandle":"x2","target":"nhUKKWyBH80nyKfGT8ErC","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-iogwMmOvub2ZF4zgg6WyFx2-nhUKKWyBH80nyKfGT8ErCw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"nhUKKWyBH80nyKfGT8ErC","sourceHandle":"z2","target":"R9DQNc0AyAQ2HLpP4HOk6","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-nhUKKWyBH80nyKfGT8ErCz2-R9DQNc0AyAQ2HLpP4HOk6y1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"nhUKKWyBH80nyKfGT8ErC","sourceHandle":"z2","target":"fNTb9y3zs1HPYclAmu_Wv","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-nhUKKWyBH80nyKfGT8ErCz2-fNTb9y3zs1HPYclAmu_Wvy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"LX9nzJ4uqznHN4SksoDvr","sourceHandle":"y2","target":"bFEYMlqPZtTUYtDQxqHzT","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-LX9nzJ4uqznHN4SksoDvry2-bFEYMlqPZtTUYtDQxqHzTz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"LX9nzJ4uqznHN4SksoDvr","sourceHandle":"y2","target":"9aHYrOQDkA84tlxcVK5aD","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-LX9nzJ4uqznHN4SksoDvry2-9aHYrOQDkA84tlxcVK5aDz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"LX9nzJ4uqznHN4SksoDvr","sourceHandle":"y2","target":"YqDJq3fPxUZlwsdq0kJg7","targetHandle":"z2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-LX9nzJ4uqznHN4SksoDvry2-YqDJq3fPxUZlwsdq0kJg7z2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"LX9nzJ4uqznHN4SksoDvr","sourceHandle":"y2","target":"Zw8IHfCCMSxmVjx5Ho5ff","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-LX9nzJ4uqznHN4SksoDvry2-Zw8IHfCCMSxmVjx5Ho5ffz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"LX9nzJ4uqznHN4SksoDvr","sourceHandle":"y2","target":"HhICJpCK5__b-itUoEBES","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-LX9nzJ4uqznHN4SksoDvry2-HhICJpCK5__b-itUoEBESz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"LX9nzJ4uqznHN4SksoDvr","sourceHandle":"x2","target":"qBios3sZVhcJMpXmj9f7B","targetHandle":"y1","data":{"edgeStyle":"solid"},"selected":true,"selectable":true,"focusable":true,"id":"reactflow__edge-LX9nzJ4uqznHN4SksoDvrx2-8V6yw7kLaow-VVcv_K_pLy1","type":"smoothstep"},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"qBios3sZVhcJMpXmj9f7B","sourceHandle":"x2","target":"8V6yw7kLaow-VVcv_K_pL","targetHandle":"w2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-qBios3sZVhcJMpXmj9f7Bx2-8V6yw7kLaow-VVcv_K_pLw2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"8V6yw7kLaow-VVcv_K_pL","sourceHandle":"y2","target":"86iZ8s8EdhSuYwgwAM_EO","targetHandle":"z2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-8V6yw7kLaow-VVcv_K_pLy2-86iZ8s8EdhSuYwgwAM_EOz2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"86iZ8s8EdhSuYwgwAM_EO","sourceHandle":"y2","target":"xkPJ2MYiXmzC4yqQWyB_7","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-86iZ8s8EdhSuYwgwAM_EOy2-xkPJ2MYiXmzC4yqQWyB_7z1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"86iZ8s8EdhSuYwgwAM_EO","sourceHandle":"y2","target":"JZqS3Xapw6mfSPVgFW7av","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-86iZ8s8EdhSuYwgwAM_EOy2-JZqS3Xapw6mfSPVgFW7avz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"vTMd0bqz4eTgLnhfgY61h","sourceHandle":"z2","target":"6FdHTzqQwJqR4czP5qXAY","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-vTMd0bqz4eTgLnhfgY61hz2-6FdHTzqQwJqR4czP5qXAYy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"LcljR70T-OnzSrJJDqOWf","sourceHandle":"x2","target":"OdaBXz2XBAVLsQ-m7xtAM","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-LcljR70T-OnzSrJJDqOWfx2-UDqbT1y-YzBrljfKSz_RGw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"OdaBXz2XBAVLsQ-m7xtAM","sourceHandle":"y2","target":"R1ktDJpXOz0PTllAcBrdu","targetHandle":"z1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-OdaBXz2XBAVLsQ-m7xtAMy2-UDqbT1y-YzBrljfKSz_RGz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"R1ktDJpXOz0PTllAcBrdu","sourceHandle":"y2","target":"w7FNjdwqjY7X69aJqqBy4","targetHandle":"z1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-R1ktDJpXOz0PTllAcBrduy2-UDqbT1y-YzBrljfKSz_RGz1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"w7FNjdwqjY7X69aJqqBy4","sourceHandle":"x2","target":"4rqCPpTb0dAgpheBKshRG","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-w7FNjdwqjY7X69aJqqBy4x2-UDqbT1y-YzBrljfKSz_RGw1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"4rqCPpTb0dAgpheBKshRG","sourceHandle":"x2","target":"C6P69YiFdS-ioPXMNfX07","targetHandle":"w1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-UDqbT1y-YzBrljfKSz_RGx2-C6P69YiFdS-ioPXMNfX07w1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"4rqCPpTb0dAgpheBKshRG","sourceHandle":"z2","target":"UDqbT1y-YzBrljfKSz_RG","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-4rqCPpTb0dAgpheBKshRGz2-UDqbT1y-YzBrljfKSz_RGw1","selected":true,"type":"smoothstep","focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"UDqbT1y-YzBrljfKSz_RG","sourceHandle":"z2","target":"tBvXLLp5FKeSSN35Kj1X4","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-UDqbT1y-YzBrljfKSz_RGz2-tBvXLLp5FKeSSN35Kj1X4y1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"UDqbT1y-YzBrljfKSz_RG","sourceHandle":"z2","target":"nwFaz9i-1s0WVrVaFsoqb","targetHandle":"y2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-UDqbT1y-YzBrljfKSz_RGz2-nwFaz9i-1s0WVrVaFsoqby2","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"UDqbT1y-YzBrljfKSz_RG","sourceHandle":"z2","target":"TjgwabhEtaSoYMLNr6q9l","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-UDqbT1y-YzBrljfKSz_RGz2-TjgwabhEtaSoYMLNr6q9ly1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"UDqbT1y-YzBrljfKSz_RG","sourceHandle":"z2","target":"tedQynR0xicVKhuR1oahw","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-UDqbT1y-YzBrljfKSz_RGz2-tedQynR0xicVKhuR1oahwy1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"UDqbT1y-YzBrljfKSz_RG","sourceHandle":"z2","target":"z5Sf0VU14ZCQ80kL1qOqc","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-UDqbT1y-YzBrljfKSz_RGz2-z5Sf0VU14ZCQ80kL1qOqcy1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"UDqbT1y-YzBrljfKSz_RG","sourceHandle":"x2","target":"GV_zWF6rSWg5bqgiXhOEf","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-UDqbT1y-YzBrljfKSz_RGx2-GV_zWF6rSWg5bqgiXhOEfw1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"WigElh37ztiRYRstQR9NE","sourceHandle":"z2","target":"zEWmq0Y1LFPMQelpucrph","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-WigElh37ztiRYRstQR9NEz2-zEWmq0Y1LFPMQelpucrphy1","selected":true,"selectable":true,"focusable":true}]}
\ No newline at end of file
diff --git a/src/data/roadmaps/system-design/content/backens-for-frontend@n4It-lr7FFtSY83DcGydX.md b/src/data/roadmaps/system-design/content/backends-for-frontend@n4It-lr7FFtSY83DcGydX.md
similarity index 100%
rename from src/data/roadmaps/system-design/content/backens-for-frontend@n4It-lr7FFtSY83DcGydX.md
rename to src/data/roadmaps/system-design/content/backends-for-frontend@n4It-lr7FFtSY83DcGydX.md
diff --git a/src/data/roadmaps/system-design/content/queu-based-load-leveling@LncTxPg-wx8loy55r5NmV.md b/src/data/roadmaps/system-design/content/queue-based-load-leveling@LncTxPg-wx8loy55r5NmV.md
similarity index 100%
rename from src/data/roadmaps/system-design/content/queu-based-load-leveling@LncTxPg-wx8loy55r5NmV.md
rename to src/data/roadmaps/system-design/content/queue-based-load-leveling@LncTxPg-wx8loy55r5NmV.md
diff --git a/src/data/roadmaps/system-design/content/sql-tuning@fY8zgbB13wxZ1CFtMSdZZ.md b/src/data/roadmaps/system-design/content/sql-tuning@fY8zgbB13wxZ1CFtMSdZZ.md
index 7ed10fdcf..4771eb78c 100644
--- a/src/data/roadmaps/system-design/content/sql-tuning@fY8zgbB13wxZ1CFtMSdZZ.md
+++ b/src/data/roadmaps/system-design/content/sql-tuning@fY8zgbB13wxZ1CFtMSdZZ.md
@@ -1,6 +1,6 @@
 # SQL Tuning
 
-SQL tuning is a broad topic and many books have been written as reference. It's important to benchmark and profile to simulate and uncover bottlenecks.
+SQL tuning is the attempt to diagnose and repair SQL statements that fail to meet a performance standard. It is a broad topic and many books have been written as reference. It's important to benchmark and profile to simulate and uncover bottlenecks.
 
 - Benchmark - Simulate high-load situations with tools such as ab.
 - Profile - Enable tools such as the slow query log to help track performance issues.
@@ -9,6 +9,6 @@ Benchmarking and profiling might point you to the following optimizations.
 
 To learn more, visit the following links:
 
-- [@article@Optimizing MySQL Queries](https://aiddroid.com/10-tips-optimizing-mysql-queries-dont-suck/)
+- [@official@Introduction to SQL Tuning - Oracle](https://docs.oracle.com/en/database/oracle/oracle-database/23/tgsql/introduction-to-sql-tuning.html#GUID-B653E5F3-F078-4BBC-9516-B892960046A2)
 - [@article@How we optimized PostgreSQL queries 100x](https://towardsdatascience.com/how-we-optimized-postgresql-queries-100x-ff52555eabe?gi=13caf5bcf32e)
 - [@feed@Explore top posts about SQL](https://app.daily.dev/tags/sql?ref=roadmapsh)
diff --git a/src/data/roadmaps/typescript/content/hybrid-types@lvtTSHH9yBTCiLng8btnI.md b/src/data/roadmaps/typescript/content/hybrid-types@lvtTSHH9yBTCiLng8btnI.md
index 71bcc588f..b7de10023 100644
--- a/src/data/roadmaps/typescript/content/hybrid-types@lvtTSHH9yBTCiLng8btnI.md
+++ b/src/data/roadmaps/typescript/content/hybrid-types@lvtTSHH9yBTCiLng8btnI.md
@@ -24,7 +24,3 @@ type User = {
   education: Education;
 };
 ```
-
-Learn more from the following links:
-
-- [@official@Geeksforgeeks.org - Hybrid Types](https://www.geeksforgeeks.org/what-are-hybrid-types-in-typescript/#:~:text=Hybrid%20types%20are%20a%20combination,properties%20like%20a%20regular%20object.)
diff --git a/src/data/roadmaps/typescript/content/utility-types@LSwUHfalnk5MgHt21PANb.md b/src/data/roadmaps/typescript/content/utility-types@LSwUHfalnk5MgHt21PANb.md
index 531994a9a..1b58d9042 100644
--- a/src/data/roadmaps/typescript/content/utility-types@LSwUHfalnk5MgHt21PANb.md
+++ b/src/data/roadmaps/typescript/content/utility-types@LSwUHfalnk5MgHt21PANb.md
@@ -13,4 +13,3 @@ Learn more from the following links:
 
 - [@official@TypeScript - Utility Types](https://www.typescriptlang.org/docs/handbook/utility-types.html)
 - [@article@TypeScript Utility Types Guide](https://camchenry.com/blog/typescript-utility-types)
-- [@article@TypeScript Utility Types: Key Concepts And Best Practices](https://marketsplash.com/tutorials/typescript/typescript-utility-types/)
diff --git a/src/data/roadmaps/ux-design/content/good-layout-rules@90_M5qABC1vZ1nsXVyqFJ.md b/src/data/roadmaps/ux-design/content/good-layout-rules@90_M5qABC1vZ1nsXVyqFJ.md
index 8ee0ca82b..c81ddd158 100644
--- a/src/data/roadmaps/ux-design/content/good-layout-rules@90_M5qABC1vZ1nsXVyqFJ.md
+++ b/src/data/roadmaps/ux-design/content/good-layout-rules@90_M5qABC1vZ1nsXVyqFJ.md
@@ -1,4 +1,4 @@
-# Good Layout Rules
+# Good Layout Rules & Design Guidelines
 
 In the world of UX design, a good layout is crucial to ensure your prototype is intuitive and user-friendly. By following these good layout rules, you can ensure your designs are efficient, attractive, and easy to navigate for users.
 
@@ -35,3 +35,7 @@ Make sure your prototype can adapt to different screen sizes and devices, ensuri
 As you develop your design, continually test and iterate on your layout based on user feedback and data. This process will help refine your design and ensure it meets the needs and expectations of your users.
 
 By incorporating these good layout rules into your prototyping process, you'll be well on your way to creating a user-friendly and effective design that meets the goals and objectives of your project.
+
+Visit the following resources to learn more:
+
+- [@article@User Interface Design Guidelines: 10 Rules of Thumb](https://www.interaction-design.org/literature/article/user-interface-design-guidelines-10-rules-of-thumb)
diff --git a/src/data/roadmaps/vue/content/binding-events@b7iXwtUnELg_ShbCyTrNA.md b/src/data/roadmaps/vue/content/binding-events@b7iXwtUnELg_ShbCyTrNA.md
index cefbe6931..2102d5672 100644
--- a/src/data/roadmaps/vue/content/binding-events@b7iXwtUnELg_ShbCyTrNA.md
+++ b/src/data/roadmaps/vue/content/binding-events@b7iXwtUnELg_ShbCyTrNA.md
@@ -4,5 +4,4 @@ Vue.js is an open-source Model–View–ViewModel front-end JavaScript framework
 
 Visit the following resources to learn more:
 
-- [@official@Binding Events](https://vuejs.org/guide/essentials/event-handling)
-- [@article@Vue.js Event Handling](https://www.geeksforgeeks.org/vue-js-event-handling/)
+- [@official@Binding Events](https://vuejs.org/guide/essentials/event-handling)
\ No newline at end of file
diff --git a/src/data/roadmaps/vue/content/event-modifiers@Aaf7eA-5sbAD5Cs1MbdTQ.md b/src/data/roadmaps/vue/content/event-modifiers@Aaf7eA-5sbAD5Cs1MbdTQ.md
index a8d952059..0b0808afa 100644
--- a/src/data/roadmaps/vue/content/event-modifiers@Aaf7eA-5sbAD5Cs1MbdTQ.md
+++ b/src/data/roadmaps/vue/content/event-modifiers@Aaf7eA-5sbAD5Cs1MbdTQ.md
@@ -4,4 +4,5 @@ In Vue.js, event modifiers are special postfixes that you can add to event handl
 
 Visit the following resources to learn more:
 
+- [@official@Event Modifiers](https://vuejs.org/guide/essentials/event-handling#event-modifiers)
 - [@article@Event Modifiers in Vue.js](https://www.freecodecamp.org/news/how-event-handling-works-in-vue-3-guide-for-devs/)
diff --git a/src/data/roadmaps/vue/content/global-properties@gihxGgt177BK_EYsAfpx9.md b/src/data/roadmaps/vue/content/global-properties@gihxGgt177BK_EYsAfpx9.md
index 9f11783d9..5357460af 100644
--- a/src/data/roadmaps/vue/content/global-properties@gihxGgt177BK_EYsAfpx9.md
+++ b/src/data/roadmaps/vue/content/global-properties@gihxGgt177BK_EYsAfpx9.md
@@ -4,4 +4,5 @@ Global properties allows you to add properties or methods that can be accessed t
 
 Visit the following resources to learn more:
 
+- [@official@Application API - globalProperties](https://vuejs.org/api/application.html#app-config-globalproperties)
 - [@article@Vue.js Global Properties](https://blog.logrocket.com/vue-js-globalproperties/)
diff --git a/src/data/roadmaps/vue/content/inline--method-handlers@gVahaZNPktQuqdukFEbQH.md b/src/data/roadmaps/vue/content/inline--method-handlers@gVahaZNPktQuqdukFEbQH.md
index a54fe7e2b..9c3c46119 100644
--- a/src/data/roadmaps/vue/content/inline--method-handlers@gVahaZNPktQuqdukFEbQH.md
+++ b/src/data/roadmaps/vue/content/inline--method-handlers@gVahaZNPktQuqdukFEbQH.md
@@ -4,4 +4,5 @@ In Vue.js, **inline handlers** are defined directly in the template using expres
 
 Visit the following resources to learn more:
 
-- [@official@Method Handlers](https://v1.vuejs.org/guide/events.html)
+- [@official@Inline Handlers](https://vuejs.org/guide/essentials/event-handling#inline-handlers)
+- [@official@Method Handlers](https://vuejs.org/guide/essentials/event-handling#method-handlers)
diff --git a/src/data/roadmaps/vue/content/key-modifiers@BXw36wqhmi3gExXwFCIBd.md b/src/data/roadmaps/vue/content/key-modifiers@BXw36wqhmi3gExXwFCIBd.md
index 62f315d22..ad6023e59 100644
--- a/src/data/roadmaps/vue/content/key-modifiers@BXw36wqhmi3gExXwFCIBd.md
+++ b/src/data/roadmaps/vue/content/key-modifiers@BXw36wqhmi3gExXwFCIBd.md
@@ -4,4 +4,4 @@ Input bindings are a way to bind user input to a component's data. This allows t
 
 Visit the following resources to learn more:
 
-- [@official@Input Bindings](https://vuejs.org/guide/essentials/forms)
+- [@official@Key Modifiers](https://vuejs.org/guide/essentials/event-handling#key-modifiers)
diff --git a/src/data/roadmaps/vue/content/modifiers@dSfrFLr8wKkLAOMJwtCTr.md b/src/data/roadmaps/vue/content/modifiers@dSfrFLr8wKkLAOMJwtCTr.md
index c20baf2d1..83ddf3c97 100644
--- a/src/data/roadmaps/vue/content/modifiers@dSfrFLr8wKkLAOMJwtCTr.md
+++ b/src/data/roadmaps/vue/content/modifiers@dSfrFLr8wKkLAOMJwtCTr.md
@@ -4,4 +4,4 @@ Modifiers are special suffixes that can be added to directives (such as v-model
 
 Visit the following resources to learn more:
 
-- [@official@Modifiers](https://v2.vuejs.org/v2/guide/components-custom-events.html)
+- [@official@Modifiers](https://vuejs.org/guide/essentials/forms.html#modifiers)
diff --git a/src/data/roadmaps/vue/content/mouse-button-modifiers@x0wl2Qz2LTP4Q2tThKAt3.md b/src/data/roadmaps/vue/content/mouse-button-modifiers@x0wl2Qz2LTP4Q2tThKAt3.md
index a68b9fac8..99b0fb952 100644
--- a/src/data/roadmaps/vue/content/mouse-button-modifiers@x0wl2Qz2LTP4Q2tThKAt3.md
+++ b/src/data/roadmaps/vue/content/mouse-button-modifiers@x0wl2Qz2LTP4Q2tThKAt3.md
@@ -4,4 +4,5 @@ Mouse button modifiers are a type of modifier that can be used with event handle
 
 Visit the following resources to learn more:
 
+- [@official@Mouse Button Modifiers](https://vuejs.org/guide/essentials/event-handling#mouse-button-modifiers)
 - [@article@Button Modifiers](https://medium.com/evolve-you/vue-3-keyboard-and-mouse-a4866d7d0e8)
diff --git a/src/env.d.ts b/src/env.d.ts
index 7218154c2..5ce093285 100644
--- a/src/env.d.ts
+++ b/src/env.d.ts
@@ -7,6 +7,7 @@ interface ImportMetaEnv {
   PUBLIC_APP_URL: string;
   PUBLIC_AVATAR_BASE_URL: string;
   PUBLIC_EDITOR_APP_URL: string;
+  PUBLIC_COURSE_APP_URL: string;
 }
 
 interface ImportMeta {
diff --git a/src/helper/generate-ai-course.ts b/src/helper/generate-ai-course.ts
new file mode 100644
index 000000000..6ae70b431
--- /dev/null
+++ b/src/helper/generate-ai-course.ts
@@ -0,0 +1,172 @@
+import {
+  generateAiCourseStructure,
+  readStream,
+  type AiCourse,
+} from '../lib/ai';
+import { queryClient } from '../stores/query-client';
+import { getAiCourseLimitOptions } from '../queries/ai-course';
+
+type GenerateCourseOptions = {
+  term: string;
+  difficulty: string;
+  slug?: string;
+  isForce?: boolean;
+  prompt?: string;
+  instructions?: string;
+  goal?: string;
+  about?: string;
+  onCourseIdChange?: (courseId: string) => void;
+  onCourseSlugChange?: (courseSlug: string) => void;
+  onCourseChange?: (course: AiCourse, rawData: string) => void;
+  onLoadingChange?: (isLoading: boolean) => void;
+  onError?: (error: string) => void;
+};
+
+export async function generateCourse(options: GenerateCourseOptions) {
+  const {
+    term,
+    slug,
+    difficulty,
+    onCourseIdChange,
+    onCourseSlugChange,
+    onCourseChange,
+    onLoadingChange,
+    onError,
+    isForce = false,
+    prompt,
+    instructions,
+    goal,
+    about,
+  } = options;
+
+  onLoadingChange?.(true);
+  onCourseChange?.(
+    {
+      title: '',
+      modules: [],
+      difficulty: '',
+      done: [],
+    },
+    '',
+  );
+  onError?.('');
+
+  try {
+    let response = null;
+
+    if (slug && isForce) {
+      response = await fetch(
+        `${import.meta.env.PUBLIC_API_URL}/v1-regenerate-ai-course/${slug}`,
+        {
+          method: 'POST',
+          headers: {
+            'Content-Type': 'application/json',
+          },
+          credentials: 'include',
+          body: JSON.stringify({
+            isForce,
+            customPrompt: prompt,
+          }),
+        },
+      );
+    } else {
+      response = await fetch(
+        `${import.meta.env.PUBLIC_API_URL}/v1-generate-ai-course`,
+        {
+          method: 'POST',
+          headers: {
+            'Content-Type': 'application/json',
+          },
+          body: JSON.stringify({
+            keyword: term,
+            difficulty,
+            isForce,
+            customPrompt: prompt,
+            instructions,
+            goal,
+            about,
+          }),
+          credentials: 'include',
+        },
+      );
+    }
+
+    if (!response.ok) {
+      const data = await response.json();
+      console.error(
+        'Error generating course:',
+        data?.message || 'Something went wrong',
+      );
+      onLoadingChange?.(false);
+      onError?.(data?.message || 'Something went wrong');
+      return;
+    }
+
+    const reader = response.body?.getReader();
+
+    if (!reader) {
+      console.error('Failed to get reader from response');
+      onError?.('Something went wrong');
+      onLoadingChange?.(false);
+      return;
+    }
+
+    const COURSE_ID_REGEX = new RegExp('@COURSEID:(\\w+)@');
+    const COURSE_SLUG_REGEX = new RegExp(/@COURSESLUG:([\w-]+)@/);
+
+    await readStream(reader, {
+      onStream: (result) => {
+        if (result.includes('@COURSEID') || result.includes('@COURSESLUG')) {
+          const courseIdMatch = result.match(COURSE_ID_REGEX);
+          const courseSlugMatch = result.match(COURSE_SLUG_REGEX);
+          const extractedCourseId = courseIdMatch?.[1] || '';
+          const extractedCourseSlug = courseSlugMatch?.[1] || '';
+
+          if (extractedCourseSlug) {
+            window.history.replaceState(
+              {
+                courseId: extractedCourseId,
+                courseSlug: extractedCourseSlug,
+                term,
+                difficulty,
+              },
+              '',
+              `${origin}/ai-tutor/${extractedCourseSlug}`,
+            );
+          }
+
+          result = result
+            .replace(COURSE_ID_REGEX, '')
+            .replace(COURSE_SLUG_REGEX, '');
+
+          onCourseIdChange?.(extractedCourseId);
+          onCourseSlugChange?.(extractedCourseSlug);
+        }
+
+        try {
+          const aiCourse = generateAiCourseStructure(result);
+          onCourseChange?.(
+            {
+              ...aiCourse,
+              difficulty: difficulty || '',
+            },
+            result,
+          );
+        } catch (e) {
+          console.error('Error parsing streamed course content:', e);
+        }
+      },
+      onStreamEnd: (result) => {
+        result = result
+          .replace(COURSE_ID_REGEX, '')
+          .replace(COURSE_SLUG_REGEX, '');
+        onLoadingChange?.(false);
+        queryClient.invalidateQueries(getAiCourseLimitOptions());
+      },
+    });
+  } catch (error: any) {
+    onError?.(error?.message || 'Something went wrong');
+    console.error('Error in course generation:', error);
+    onLoadingChange?.(false);
+  }
+}
diff --git a/src/helper/number.ts b/src/helper/number.ts
deleted file mode 100644
index f62d25dd3..000000000
--- a/src/helper/number.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-export function getPercentage(portion: number, total: number): string {
-  if (portion <= 0 || total <= 0) {
-    return '0.00';
-  }
-  
-  if (portion >= total) {
-    return '100.00';
-  }
-
-  const percentage = (portion / total) * 100;
-  return percentage.toFixed(2);
-}
diff --git a/src/helper/read-stream.ts b/src/helper/read-stream.ts
deleted file mode 100644
index 2df821443..000000000
--- a/src/helper/read-stream.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-const NEW_LINE = '\n'.charCodeAt(0);
-
-export async function readAIRoadmapStream(
-  reader: ReadableStreamDefaultReader<Uint8Array>,
-  {
-    onStream,
-    onStreamEnd,
-  }: {
-    onStream?: (roadmap: string) => void;
-    onStreamEnd?: (roadmap: string) => void;
-  },
-) {
-  const decoder = new TextDecoder('utf-8');
-  let result = '';
-
-  while (true) {
-    const { value, done } = await reader.read();
-    if (done) {
-      break;
-    }
-
-    // We will call the renderRoadmap callback whenever we encounter
-    // a new line with the result until the new line
-    // otherwise, we will keep appending the result to the previous result
-    if (value) {
-      let start = 0;
-      for (let i = 0; i < value.length; i++) {
-        if (value[i] === NEW_LINE) {
-          result += decoder.decode(value.slice(start, i + 1));
-          onStream?.(result);
-          start = i + 1;
-        }
-      }
-      if (start < value.length) {
-        result += decoder.decode(value.slice(start));
-      }
-    }
-  }
-
-  onStream?.(result);
-  onStreamEnd?.(result);
-  reader.releaseLock();
-}
-
-export async function readAIRoadmapContentStream(
-  reader: ReadableStreamDefaultReader<Uint8Array>,
-  {
-    onStream,
-    onStreamEnd,
-  }: {
-    onStream?: (roadmap: string) => void;
-    onStreamEnd?: (roadmap: string) => void;
-  },
-) {
-  const decoder = new TextDecoder('utf-8');
-  let result = '';
-
-  while (true) {
-    const { value, done } = await reader.read();
-    if (done) {
-      break;
-    }
-
-    if (value) {
-      result += decoder.decode(value);
-      onStream?.(result);
-    }
-  }
-
-  onStream?.(result);
-  onStreamEnd?.(result);
-  reader.releaseLock();
-}
diff --git a/src/icons/credit-card.svg b/src/icons/credit-card.svg
new file mode 100644
index 000000000..77963dcee
--- /dev/null
+++ b/src/icons/credit-card.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-credit-card"><rect width="20" height="14" x="2" y="5" rx="2"/><line x1="2" x2="22" y1="10" y2="10"/></svg>
\ No newline at end of file
diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro
index 643b97b3e..de0e5946f 100644
--- a/src/layouts/BaseLayout.astro
+++ b/src/layouts/BaseLayout.astro
@@ -13,7 +13,10 @@ import { siteConfig } from '../lib/config';
 import '../styles/global.css';
 import { PageVisit } from '../components/PageVisit/PageVisit';
 import type { ResourceType } from '../lib/resource-progress';
-import ChangelogBanner from "../components/ChangelogBanner.astro";
+import Clarity from '../components/Analytics/Clarity.astro';
+import RedditPixel from '../components/Analytics/RedditPixel.astro';
+import GoogleAd from '../components/Analytics/GoogleAd.astro';
+import GoogleAdSlot from '../components/Analytics/GoogleAdSlot.astro';
 
 export interface Props {
   title: string;
@@ -157,6 +160,9 @@ const gaPageIdentifier = Astro.url.pathname
     }
 
     <Analytics />
+    <Clarity />
+    <RedditPixel />
+    <GoogleAd />
   </head>
   <body class='flex min-h-screen flex-col'>
     <slot name='page-header'>
@@ -166,9 +172,7 @@ const gaPageIdentifier = Astro.url.pathname
     <slot />
 
     <slot name='page-footer'>
-      <slot name='changelog-banner'>
-        <ChangelogBanner />
-      </slot>
+      <slot name='changelog-banner' />
       <slot name='open-source-banner'>
         <OpenSourceBanner />
       </slot>
@@ -189,6 +193,7 @@ const gaPageIdentifier = Astro.url.pathname
       client:load
     />
 
+    <GoogleAdSlot />
     <slot name='after-footer' />
 
     <PageVisit
diff --git a/src/layouts/SkeletonLayout.astro b/src/layouts/SkeletonLayout.astro
index bee341a1b..4485f25c3 100644
--- a/src/layouts/SkeletonLayout.astro
+++ b/src/layouts/SkeletonLayout.astro
@@ -1,5 +1,5 @@
 ---
-import BaseLayout, { Props as BaseLayoutProps } from './BaseLayout.astro';
+import BaseLayout, { type Props as BaseLayoutProps } from './BaseLayout.astro';
 
 export interface Props extends BaseLayoutProps {}
 
diff --git a/src/lib/ai.ts b/src/lib/ai.ts
index 6481f0f2c..ac9bf1d9e 100644
--- a/src/lib/ai.ts
+++ b/src/lib/ai.ts
@@ -1 +1,209 @@
-export const IS_KEY_ONLY_ROADMAP_GENERATION = false;
\ No newline at end of file
+export const IS_KEY_ONLY_ROADMAP_GENERATION = false;
+
+type Lesson = string;
+
+type Module = {
+  title: string;
+  lessons: Lesson[];
+};
+
+export type AiCourse = {
+  title: string;
+  modules: Module[];
+  difficulty: string;
+  done: string[];
+};
+
+export function generateAiCourseStructure(
+  data: string,
+): Omit<AiCourse, 'difficulty'> {
+  const lines = data.split('\n');
+  let title = '';
+  const modules: Module[] = [];
+  let currentModule: Module | null = null;
+
+  for (let i = 0; i < lines.length; i++) {
+    const line = lines[i].trim();
+
+    if (i === 0 && line.startsWith('#')) {
+      // First line is the title
+      title = line.replace('#', '').trim();
+    } else if (line.startsWith('## ')) {
+      // New module
+      if (currentModule) {
+        modules.push(currentModule);
+      }
+      currentModule = {
+        title: line.replace('## ', ''),
+        lessons: [],
+      };
+      // Removed auto-expand code to keep modules collapsed by default
+    } else if (line.startsWith('- ') && currentModule) {
+      // Lesson within current module
+      currentModule.lessons.push(line.replace('- ', ''));
+    }
+  }
+
+  // Add the last module if it exists
+  if (currentModule) {
+    modules.push(currentModule);
+  }
+
+  return {
+    title,
+    modules,
+  };
+}
+
+type CourseFineTuneData = {
+  about: string;
+  goal: string;
+  customInstructions: string;
+};
+
+export function storeFineTuneData(meta: CourseFineTuneData) {
+  const sessionId = Date.now().toString();
+
+  localStorage.setItem(sessionId, JSON.stringify(meta));
+  localStorage.setItem('lastSessionId', sessionId);
+
+  return sessionId;
+}
+
+export function getCourseFineTuneData(
+  sessionId: string,
+): CourseFineTuneData | null {
+  const meta = localStorage.getItem(sessionId);
+  if (!meta) {
+    return null;
+  }
+
+  return JSON.parse(meta);
+}
+
+export function getLastSessionId(): string | null {
+  return localStorage.getItem('lastSessionId');
+}
+
+export function clearFineTuneData() {
+  const sessionId = getLastSessionId();
+  if (sessionId) {
+    localStorage.removeItem(sessionId);
+  }
+
+  localStorage.removeItem('lastSessionId');
+}
+
+const NEW_LINE = '\n'.charCodeAt(0);
+
+export async function readAIRoadmapStream(
+  reader: ReadableStreamDefaultReader<Uint8Array>,
+  {
+    onStream,
+    onStreamEnd,
+  }: {
+    onStream?: (roadmap: string) => void;
+    onStreamEnd?: (roadmap: string) => void;
+  },
+) {
+  const decoder = new TextDecoder('utf-8');
+  let result = '';
+
+  while (true) {
+    const { value, done } = await reader.read();
+    if (done) {
+      break;
+    }
+
+    // We will call the renderRoadmap callback whenever we encounter
+    // a new line with the result until the new line
+    // otherwise, we will keep appending the result to the previous result
+    if (value) {
+      let start = 0;
+      for (let i = 0; i < value.length; i++) {
+        if (value[i] === NEW_LINE) {
+          result += decoder.decode(value.slice(start, i + 1));
+          onStream?.(result);
+          start = i + 1;
+        }
+      }
+      if (start < value.length) {
+        result += decoder.decode(value.slice(start));
+      }
+    }
+  }
+
+  onStream?.(result);
+  onStreamEnd?.(result);
+  reader.releaseLock();
+}
+
+export async function readAIRoadmapContentStream(
+  reader: ReadableStreamDefaultReader<Uint8Array>,
+  {
+    onStream,
+    onStreamEnd,
+  }: {
+    onStream?: (roadmap: string) => void;
+    onStreamEnd?: (roadmap: string) => void;
+  },
+) {
+  const decoder = new TextDecoder('utf-8');
+  let result = '';
+
+  while (true) {
+    const { value, done } = await reader.read();
+    if (done) {
+      break;
+    }
+
+    if (value) {
+      result += decoder.decode(value);
+      onStream?.(result);
+    }
+  }
+
+  onStream?.(result);
+  onStreamEnd?.(result);
+  reader.releaseLock();
+}
+
+export async function readStream(
+  reader: ReadableStreamDefaultReader<Uint8Array>,
+  {
+    onStream,
+    onStreamEnd,
+  }: {
+    onStream?: (course: string) => void;
+    onStreamEnd?: (course: string) => void;
+  },
+) {
+  const decoder = new TextDecoder('utf-8');
+  let result = '';
+
+  while (true) {
+    const { value, done } = await reader.read();
+    if (done) {
+      break;
+    }
+
+    // Process the stream data as it comes in
+    if (value) {
+      let start = 0;
+      for (let i = 0; i < value.length; i++) {
+        if (value[i] === NEW_LINE) {
+          result += decoder.decode(value.slice(start, i + 1));
+          onStream?.(result);
+          start = i + 1;
+        }
+      }
+      if (start < value.length) {
+        result += decoder.decode(value.slice(start));
+      }
+    }
+  }
+
+  onStream?.(result);
+  onStreamEnd?.(result);
+  reader.releaseLock();
+}
diff --git a/src/lib/browser.ts b/src/lib/browser.ts
index ffb39031c..2a11e5d29 100644
--- a/src/lib/browser.ts
+++ b/src/lib/browser.ts
@@ -33,7 +33,6 @@ export function getUrlUtmParams(): UtmParams {
 
 export function triggerUtmRegistration() {
   const utmParams = getStoredUtmParams();
-  console.log(utmParams);
   if (!utmParams.utmSource) {
     return;
   }
diff --git a/src/lib/discord.ts b/src/lib/discord.ts
index a1ac8ce32..c73e3fed1 100644
--- a/src/lib/discord.ts
+++ b/src/lib/discord.ts
@@ -1,3 +1,5 @@
+import { siteConfig } from './config.ts';
+
 const formatter = Intl.NumberFormat('en-US', {
   notation: 'compact',
 });
@@ -14,6 +16,16 @@ export async function getDiscordInfo(): Promise<{
     return discordStats;
   }
 
+  if (import.meta.env.DEV) {
+    return {
+      url: 'https://roadmap.sh/discord',
+      total: 27000,
+      totalFormatted: '27k',
+      online: 49,
+      onlineFormatted: '3.44k',
+    };
+  }
+
   const response = await fetch(
     'https://discord.com/api/v9/invites/cJpEt5Qbwa?with_counts=true',
   );
diff --git a/src/lib/guide.ts b/src/lib/guide.ts
index fa61afcd7..6b92f9af0 100644
--- a/src/lib/guide.ts
+++ b/src/lib/guide.ts
@@ -88,8 +88,8 @@ export async function getAllGuides(): Promise<GuideFileType[]> {
         description: replaceVariables(guideFile.frontmatter.description),
         seo: {
           ...(guideFile.frontmatter?.seo || {}),
-          title: replaceVariables(guideFile.frontmatter.seo.title),
-          description: replaceVariables(guideFile.frontmatter.seo.description),
+          title: replaceVariables(guideFile.frontmatter.seo?.title || ''),
+          description: replaceVariables(guideFile.frontmatter.seo?.description || ''),
         },
       },
       relatedGuides: relatedGuides.reduce(
diff --git a/src/lib/jwt.ts b/src/lib/jwt.ts
index 1d3aaa0af..6207be59b 100644
--- a/src/lib/jwt.ts
+++ b/src/lib/jwt.ts
@@ -3,6 +3,9 @@ import Cookies from 'js-cookie';
 import type { AllowedOnboardingStatus } from '../api/user';
 
 export const TOKEN_COOKIE_NAME = '__roadmapsh_jt__';
+export const FIRST_LOGIN_PARAM = 'fl' as const;
+export const COURSE_PURCHASE_PARAM = 't';
+export const COURSE_PURCHASE_SUCCESS_PARAM = 'success';
 
 export type TokenPayload = {
   id: string;
diff --git a/src/lib/markdown.ts b/src/lib/markdown.ts
index 3cc2a7f84..c5429df42 100644
--- a/src/lib/markdown.ts
+++ b/src/lib/markdown.ts
@@ -1,5 +1,6 @@
 // @ts-ignore
 import MarkdownIt from 'markdown-it';
+import MarkdownItAsync from 'markdown-it-async';
 
 // replaces @variableName@ with the value of the variable
 export function replaceVariables(
@@ -16,27 +17,66 @@ export function replaceVariables(
   });
 }
 
+const md = new MarkdownIt({
+  html: true,
+  linkify: true,
+});
+
 export function markdownToHtml(markdown: string, isInline = true): string {
   try {
-    const md = new MarkdownIt({
-      html: true,
-      linkify: true,
+    if (isInline) {
+      return md.renderInline(markdown);
+    } else {
+      return md.render(markdown);
+    }
+  } catch (e) {
+    return markdown;
+  }
+}
+
+// This is a workaround for the issue with tiptap-markdown extension
+// It doesn't support links with escaped brackets like this:
+// \\[link\\](https://example.com) -> [link](https://example.com)
+export function sanitizeMarkdown(markdown: string) {
+  return markdown.replace(/\\\[([^\\]+)\\\]\(([^\\]+)\)/g, '[$1]($2)');
+}
+
+const markdownItAsync = MarkdownItAsync({
+  html: true,
+  linkify: true,
+
+  async highlight(code, lang, attrs) {
+    const { codeToHtml } = await import('shiki');
+
+    const html = await codeToHtml(code, {
+      lang: lang?.toLowerCase(),
+      theme: 'dracula',
     });
 
+    return html;
+  },
+});
+
+export async function markdownToHtmlWithHighlighting(markdown: string) {
+  try {
     // Solution to open links in new tab in markdown
     // otherwise default behaviour is to open in same tab
     //
     // SOURCE: https://github.com/markdown-it/markdown-it/blob/master/docs/architecture.md#renderer
     //
     const defaultRender =
-      md.renderer.rules.link_open ||
-      // @ts-ignore
+      markdownItAsync.renderer.rules.link_open ||
       function (tokens, idx, options, env, self) {
         return self.renderToken(tokens, idx, options);
       };
 
-    // @ts-ignore
-    md.renderer.rules.link_open = function (tokens, idx, options, env, self) {
+    markdownItAsync.renderer.rules.link_open = function (
+      tokens,
+      idx,
+      options,
+      env,
+      self,
+    ) {
       // Add a new `target` attribute, or replace the value of the existing one.
       tokens[idx].attrSet('target', '_blank');
 
@@ -44,19 +84,8 @@ export function markdownToHtml(markdown: string, isInline = true): string {
       return defaultRender(tokens, idx, options, env, self);
     };
 
-    if (isInline) {
-      return md.renderInline(markdown);
-    } else {
-      return md.render(markdown);
-    }
+    return markdownItAsync.renderAsync(markdown);
   } catch (e) {
     return markdown;
   }
 }
-
-// This is a workaround for the issue with tiptap-markdown extension
-// It doesn't support links with escaped brackets like this:
-// \\[link\\](https://example.com) -> [link](https://example.com)
-export function sanitizeMarkdown(markdown: string) {
-  return markdown.replace(/\\\[([^\\]+)\\\]\(([^\\]+)\)/g, '[$1]($2)');
-}
diff --git a/src/lib/number.ts b/src/lib/number.ts
index 9f3b2938a..feadfbaf2 100644
--- a/src/lib/number.ts
+++ b/src/lib/number.ts
@@ -9,3 +9,28 @@ export function formatCommaNumber(number: number): string {
 export function decimalIfNeeded(number: number): string {
   return number % 1 === 0 ? number.toString() : number.toFixed(1);
 }
+
+export function humanizeNumber(number: number): string {
+  if (number < 1000) {
+    return formatCommaNumber(number);
+  }
+
+  if (number < 1000000) {
+    return `${decimalIfNeeded(number / 1000)}k`;
+  }
+
+  return `${decimalIfNeeded(number / 1000000)}m`;
+}
+
+export function getPercentage(portion: number, total: number): number {
+  if (portion <= 0 || total <= 0) {
+    return 0;
+  }
+
+  if (portion >= total) {
+    return 100;
+  }
+
+  const percentage = (portion / total) * 100;
+  return Math.round(percentage);
+}
diff --git a/src/lib/question-group.ts b/src/lib/question-group.ts
index b0bd6396b..57080cb11 100644
--- a/src/lib/question-group.ts
+++ b/src/lib/question-group.ts
@@ -3,7 +3,7 @@ import slugify from 'slugify';
 import { getAllAuthors, type AuthorFileType } from './author.ts';
 import { getAllGuides } from './guide.ts';
 
-interface RawQuestionGroupFrontmatter {
+export interface RawQuestionGroupFrontmatter {
   order: number;
   briefTitle: string;
   briefDescription: string;
@@ -29,6 +29,7 @@ interface RawQuestionGroupFrontmatter {
     answer: string;
     topics: string[];
   }[];
+  ending?: string;
 }
 
 type RawQuestionGroupFileType =
@@ -49,6 +50,7 @@ export type QuestionGroupType = RawQuestionGroupFileType & {
   allTopics: string[];
   author?: AuthorFileType;
   relatedGuides?: Record<string, string>;
+  ending?: string;
 };
 
 /**
@@ -133,9 +135,19 @@ export async function getAllQuestionGroups(): Promise<QuestionGroupType[]> {
             )
         : undefined;
 
+      let endingText = '';
+      if (questionGroupFile.frontmatter.ending) {
+        const endingFilePath = `/src/data/question-groups/${questionGroupDir}/content/${questionGroupFile.frontmatter.ending}`;
+        endingText =
+          (answerFilesMap[endingFilePath] as any)?.default ||
+          answerFilesMap[endingFilePath] ||
+          `File missing: ${endingFilePath}`;
+      }
+
       return {
         ...questionGroupFile,
         id: questionGroupFileId,
+        ending: endingText,
         questions: formattedAnswers,
         allTopics: uniqueTopics,
         author: allAuthors.find(
diff --git a/src/lib/resource-progress.ts b/src/lib/resource-progress.ts
index 8f56faa0b..ed0f081e6 100644
--- a/src/lib/resource-progress.ts
+++ b/src/lib/resource-progress.ts
@@ -1,9 +1,9 @@
 import Cookies from 'js-cookie';
 import { httpGet, httpPost } from './http';
 import { TOKEN_COOKIE_NAME, getUser } from './jwt';
+import { roadmapProgress, totalRoadmapNodes } from '../stores/roadmap.ts';
 // @ts-ignore
 import Element = astroHTML.JSX.Element;
-import { roadmapProgress, totalRoadmapNodes } from '../stores/roadmap.ts';
 
 export type ResourceType = 'roadmap' | 'best-practice';
 export type ResourceProgressType =
@@ -112,6 +112,10 @@ export function clearMigratedRoadmapProgress(
     'typescript',
     'python',
     'sql',
+    'system-design',
+    'aspnet-core',
+    'java',
+    'cpp',
   ];
 
   if (!migratedRoadmaps.includes(resourceId)) {
diff --git a/src/lib/roadmap.ts b/src/lib/roadmap.ts
index bac7dfefc..34b1d66ed 100644
--- a/src/lib/roadmap.ts
+++ b/src/lib/roadmap.ts
@@ -1,4 +1,7 @@
+import type { PageType } from '../components/CommandMenu/CommandMenu';
 import type { MarkdownFileType } from './file';
+import { httpGet } from './http';
+import type { ResourceType } from './resource-progress';
 
 export function resourceTitleFromId(id: string): string {
   if (id === 'devops') {
@@ -150,3 +153,29 @@ export async function getRoadmapFaqsById(roadmapId: string): Promise<string[]> {
 
   return faqs || [];
 }
+
+export async function getResourceMeta(
+  resourceType: ResourceType,
+  resourceId: string,
+) {
+  const { error, response } = await httpGet<PageType[]>(`/pages.json`);
+  if (error || !response) {
+    return null;
+  }
+
+  const page = response.find((page) => {
+    if (resourceType === 'roadmap') {
+      return page.url === `/${resourceId}`;
+    } else if (resourceType === 'best-practice') {
+      return page.url === `/best-practices/${resourceId}`;
+    }
+
+    return false;
+  });
+
+  if (!page) {
+    return null;
+  }
+
+  return page;
+}
diff --git a/src/pages/[roadmapId]/courses.astro b/src/pages/[roadmapId]/courses.astro
index d7a606f85..f344a624d 100644
--- a/src/pages/[roadmapId]/courses.astro
+++ b/src/pages/[roadmapId]/courses.astro
@@ -1,25 +1,8 @@
 ---
-import { EditorRoadmap } from '../../components/EditorRoadmap/EditorRoadmap';
-import FAQs, { type FAQType } from '../../components/FAQs/FAQs.astro';
-import FrameRenderer from '../../components/FrameRenderer/FrameRenderer.astro';
-import RelatedRoadmaps from '../../components/RelatedRoadmaps.astro';
 import RoadmapHeader from '../../components/RoadmapHeader.astro';
-import { FolderKanbanIcon } from 'lucide-react';
-import { EmptyProjects } from '../../components/Projects/EmptyProjects';
-import ShareIcons from '../../components/ShareIcons/ShareIcons.astro';
-import { UserProgressModal } from '../../components/UserProgress/UserProgressModal';
 import BaseLayout from '../../layouts/BaseLayout.astro';
-import { getProjectsByRoadmapId } from '../../lib/project';
-import {
-  generateArticleSchema,
-  generateFAQSchema,
-} from '../../lib/jsonld-schema';
 import { getOpenGraphImageUrl } from '../../lib/open-graph';
 import { type RoadmapFrontmatter, getRoadmapIds } from '../../lib/roadmap';
-import RoadmapNote from '../../components/RoadmapNote.astro';
-import { RoadmapTitleQuestion } from '../../components/RoadmapTitleQuestion';
-import ResourceProgressStats from '../../components/ResourceProgressStats.astro';
-import AstroIcon from '../../components/AstroIcon.astro';
 import CourseStep from '../../components/courses/CourseStep.astro';
 import Milestone from '../../components/courses/Milestone.astro';
 
@@ -95,24 +78,42 @@ const seoDescription = `Seeking ${nounTitle.toLowerCase()} courses to enhance yo
       <div class='relative my-3 rounded-lg border bg-white px-12 py-8'>
         <span class='absolute inset-y-0 left-[26.3px] w-[1px] bg-black'></span>
 
-        <div class='mb-8 flex flex-col gap-4 text-sm text-gray-500 leading-normal'>
+        <div
+          class='mb-8 flex flex-col gap-4 text-sm leading-normal text-gray-500'
+        >
           <p>
             Frontend development is a vast field with a lot of tools and
-            technologies. We have the <a class="font-medium underline underline-offset-2 text-black" href="/frontend">frontend roadmap</a>
-            which is filled with a lot of <span class="font-medium text-black">free and good</span> resources to help you learn. But sometimes it helps to have a minimalistic list of courses
-            and project recommendations to help you get started.
+            technologies. We have the <a
+              class='font-medium text-black underline underline-offset-2'
+              href='/frontend'>frontend roadmap</a
+            >
+            which is filled with a lot of <span class='font-medium text-black'
+              >free and good</span
+            > resources to help you learn. But sometimes it helps to have a minimalistic
+            list of courses and project recommendations to help you get started.
           </p>
 
-          <p class="bg-yellow-100 text-yellow-900 rounded-md p-2">
-            Below are some of the best courses (paid) and projects to help you learn frontend development. These are handpicked and are a great way to get started.
+          <p class='rounded-md bg-yellow-100 p-2 text-yellow-900'>
+            Below are some of the best courses (paid) and projects to help you
+            learn frontend development. These are handpicked and are a great way
+            to get started.
           </p>
 
           <p>
-            Please note that these are paid courses curated from external platforms. We earn a small commission if you purchase the course using the links below. This helps us maintain the website and keep it free for everyone.
+            Please note that these are paid courses curated from external
+            platforms. We earn a small commission if you purchase the course
+            using the links below. This helps us maintain the website and keep
+            it free for everyone.
           </p>
 
           <p>
-            If you are looking for free resources, you can check out the <a class="font-medium underline underline-offset-2 text-black" href="/frontend">frontend roadmap</a>. Also, we have a <a class="font-medium underline underline-offset-2 text-black" href="/frontend/projects">list of projects</a> that you can work on to enhance your skills.
+            If you are looking for free resources, you can check out the <a
+              class='font-medium text-black underline underline-offset-2'
+              href='/frontend'>frontend roadmap</a
+            >. Also, we have a <a
+              class='font-medium text-black underline underline-offset-2'
+              href='/frontend/projects'>list of projects</a
+            > that you can work on to enhance your skills.
           </p>
         </div>
 
diff --git a/src/pages/[roadmapId]/index.astro b/src/pages/[roadmapId]/index.astro
index 524508bcb..ddc79a19d 100644
--- a/src/pages/[roadmapId]/index.astro
+++ b/src/pages/[roadmapId]/index.astro
@@ -4,7 +4,7 @@ import FAQs, { type FAQType } from '../../components/FAQs/FAQs.astro';
 import FrameRenderer from '../../components/FrameRenderer/FrameRenderer.astro';
 import RelatedRoadmaps from '../../components/RelatedRoadmaps.astro';
 import RoadmapHeader from '../../components/RoadmapHeader.astro';
-import ShareIcons from '../../components/ShareIcons/ShareIcons.astro';
+import { ShareIcons } from '../../components/ShareIcons/ShareIcons';
 import { TopicDetail } from '../../components/TopicDetail/TopicDetail';
 import { UserProgressModal } from '../../components/UserProgress/UserProgressModal';
 import BaseLayout from '../../layouts/BaseLayout.astro';
@@ -134,8 +134,11 @@ const projects = await getProjectsByRoadmapId(roadmapId);
 
     <div class='container relative !max-w-[1000px]'>
       <ShareIcons
+        resourceId={roadmapId}
+        resourceType='roadmap'
         description={roadmapData.briefDescription}
         pageUrl={`https://roadmap.sh/${roadmapId}`}
+        client:load
       />
 
       {
diff --git a/src/pages/account/billing.astro b/src/pages/account/billing.astro
new file mode 100644
index 000000000..1ef9f5237
--- /dev/null
+++ b/src/pages/account/billing.astro
@@ -0,0 +1,16 @@
+---
+import AccountSidebar from '../../components/AccountSidebar.astro';
+import AccountLayout from '../../layouts/AccountLayout.astro';
+import { BillingPage } from '../../components/Billing/BillingPage';
+---
+
+<AccountLayout
+  title='Billing'
+  description=''
+  noIndex={true}
+  initialLoadingMessage={'Loading billing details'}
+>
+  <AccountSidebar activePageId='billing' activePageTitle='Billing'>
+    <BillingPage client:load />
+  </AccountSidebar>
+</AccountLayout>
\ No newline at end of file
diff --git a/src/pages/ai-data-scientist/career-path.astro b/src/pages/ai-data-scientist/career-path.astro
new file mode 100644
index 000000000..bca35672d
--- /dev/null
+++ b/src/pages/ai-data-scientist/career-path.astro
@@ -0,0 +1,30 @@
+---
+import GuideContent from '../../components/Guide/GuideContent.astro';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import { getGuideById } from '../../lib/guide';
+import { getOpenGraphImageUrl } from '../../lib/open-graph';
+import { replaceVariables } from '../../lib/markdown';
+
+const guideId = 'ai-data-scientist-career-path';
+const guide = await getGuideById(guideId);
+
+const { frontmatter: guideData } = guide!;
+
+const ogImageUrl =
+  guideData.seo.ogImageUrl ||
+  getOpenGraphImageUrl({
+    group: 'guide',
+    resourceId: guideId,
+  });
+---
+
+<BaseLayout
+  title={guideData.seo.title}
+  description={guideData.seo.description}
+  permalink={`/ai-data-scientist/career-path`}
+  canonicalUrl={guideData.canonicalUrl}
+  ogImageUrl={ogImageUrl}
+>
+  <GuideContent guide={guide!} />
+  <div slot='changelog-banner'></div>
+</BaseLayout>
diff --git a/src/pages/ai-data-scientist/lifecycle.astro b/src/pages/ai-data-scientist/lifecycle.astro
new file mode 100644
index 000000000..9347bca71
--- /dev/null
+++ b/src/pages/ai-data-scientist/lifecycle.astro
@@ -0,0 +1,29 @@
+---
+import GuideContent from '../../components/Guide/GuideContent.astro';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import { getGuideById } from '../../lib/guide';
+import { getOpenGraphImageUrl } from '../../lib/open-graph';
+
+const guideId = 'ai-data-scientist-lifecycle';
+const guide = await getGuideById(guideId);
+
+const { frontmatter: guideData } = guide!;
+
+const ogImageUrl =
+  guideData.seo.ogImageUrl ||
+  getOpenGraphImageUrl({
+    group: 'guide',
+    resourceId: guideId,
+  });
+---
+
+<BaseLayout
+  title={guideData.seo.title}
+  description={guideData.seo.description}
+  permalink={`/ai-data-scientist/lifecycle`}
+  canonicalUrl={guideData.canonicalUrl}
+  ogImageUrl={ogImageUrl}
+>
+  <GuideContent guide={guide!} />
+  <div slot='changelog-banner'></div>
+</BaseLayout>
diff --git a/src/pages/ai-data-scientist/skills.astro b/src/pages/ai-data-scientist/skills.astro
new file mode 100644
index 000000000..bc3e50c76
--- /dev/null
+++ b/src/pages/ai-data-scientist/skills.astro
@@ -0,0 +1,29 @@
+---
+import GuideContent from '../../components/Guide/GuideContent.astro';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import { getGuideById } from '../../lib/guide';
+import { getOpenGraphImageUrl } from '../../lib/open-graph';
+
+const guideId = 'ai-data-scientist-skills';
+const guide = await getGuideById(guideId);
+
+const { frontmatter: guideData } = guide!;
+
+const ogImageUrl =
+  guideData.seo.ogImageUrl ||
+  getOpenGraphImageUrl({
+    group: 'guide',
+    resourceId: guideId,
+  });
+---
+
+<BaseLayout
+  title={guideData.seo.title}
+  description={guideData.seo.description}
+  permalink={`/ai-data-scientist/skills`}
+  canonicalUrl={guideData.canonicalUrl}
+  ogImageUrl={ogImageUrl}
+>
+  <GuideContent guide={guide!} />
+  <div slot='changelog-banner'></div>
+</BaseLayout>
diff --git a/src/pages/ai-data-scientist/tools.astro b/src/pages/ai-data-scientist/tools.astro
new file mode 100644
index 000000000..433b6a9fe
--- /dev/null
+++ b/src/pages/ai-data-scientist/tools.astro
@@ -0,0 +1,30 @@
+---
+import GuideContent from '../../components/Guide/GuideContent.astro';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import { getGuideById } from '../../lib/guide';
+import { getOpenGraphImageUrl } from '../../lib/open-graph';
+import { replaceVariables } from '../../lib/markdown';
+
+const guideId = 'ai-data-scientist-tools';
+const guide = await getGuideById(guideId);
+
+const { frontmatter: guideData } = guide!;
+
+const ogImageUrl =
+  guideData.seo.ogImageUrl ||
+  getOpenGraphImageUrl({
+    group: 'guide',
+    resourceId: guideId,
+  });
+---
+
+<BaseLayout
+  title={guideData.seo.title}
+  description={guideData.seo.description}
+  permalink={`/ai-data-scientist/tools`}
+  canonicalUrl={guideData.canonicalUrl}
+  ogImageUrl={ogImageUrl}
+>
+  <GuideContent guide={guide!} />
+  <div slot='changelog-banner'></div>
+</BaseLayout>
diff --git a/src/pages/ai-data-scientist/vs-computer-science.astro b/src/pages/ai-data-scientist/vs-computer-science.astro
new file mode 100644
index 000000000..6df46bde1
--- /dev/null
+++ b/src/pages/ai-data-scientist/vs-computer-science.astro
@@ -0,0 +1,30 @@
+---
+import GuideContent from '../../components/Guide/GuideContent.astro';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import { getGuideById } from '../../lib/guide';
+import { getOpenGraphImageUrl } from '../../lib/open-graph';
+import { replaceVariables } from '../../lib/markdown';
+
+const guideId = 'ai-data-scientist-vs-computer-science';
+const guide = await getGuideById(guideId);
+
+const { frontmatter: guideData } = guide!;
+
+const ogImageUrl =
+  guideData.seo.ogImageUrl ||
+  getOpenGraphImageUrl({
+    group: 'guide',
+    resourceId: guideId,
+  });
+---
+
+<BaseLayout
+  title={guideData.seo.title}
+  description={guideData.seo.description}
+  permalink={`/ai-data-scientist/vs-computer-science`}
+  canonicalUrl={guideData.canonicalUrl}
+  ogImageUrl={ogImageUrl}
+>
+  <GuideContent guide={guide!} />
+  <div slot='changelog-banner'></div>
+</BaseLayout>
diff --git a/src/pages/ai-data-scientist/vs-data-analytics.astro b/src/pages/ai-data-scientist/vs-data-analytics.astro
new file mode 100644
index 000000000..1df2ac4b9
--- /dev/null
+++ b/src/pages/ai-data-scientist/vs-data-analytics.astro
@@ -0,0 +1,30 @@
+---
+import GuideContent from '../../components/Guide/GuideContent.astro';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import { getGuideById } from '../../lib/guide';
+import { getOpenGraphImageUrl } from '../../lib/open-graph';
+import { replaceVariables } from '../../lib/markdown';
+
+const guideId = 'ai-data-scientist-vs-data-analytics';
+const guide = await getGuideById(guideId);
+
+const { frontmatter: guideData } = guide!;
+
+const ogImageUrl =
+  guideData.seo.ogImageUrl ||
+  getOpenGraphImageUrl({
+    group: 'guide',
+    resourceId: guideId,
+  });
+---
+
+<BaseLayout
+  title={guideData.seo.title}
+  description={guideData.seo.description}
+  permalink={`/ai-data-scientist/vs-data-analytics`}
+  canonicalUrl={guideData.canonicalUrl}
+  ogImageUrl={ogImageUrl}
+>
+  <GuideContent guide={guide!} />
+  <div slot='changelog-banner'></div>
+</BaseLayout>
diff --git a/src/pages/ai-data-scientist/vs-machine-learning.astro b/src/pages/ai-data-scientist/vs-machine-learning.astro
new file mode 100644
index 000000000..b9f38bbcf
--- /dev/null
+++ b/src/pages/ai-data-scientist/vs-machine-learning.astro
@@ -0,0 +1,30 @@
+---
+import GuideContent from '../../components/Guide/GuideContent.astro';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import { getGuideById } from '../../lib/guide';
+import { getOpenGraphImageUrl } from '../../lib/open-graph';
+import { replaceVariables } from '../../lib/markdown';
+
+const guideId = 'ai-data-scientist-vs-machine-learning';
+const guide = await getGuideById(guideId);
+
+const { frontmatter: guideData } = guide!;
+
+const ogImageUrl =
+  guideData.seo.ogImageUrl ||
+  getOpenGraphImageUrl({
+    group: 'guide',
+    resourceId: guideId,
+  });
+---
+
+<BaseLayout
+  title={guideData.seo.title}
+  description={guideData.seo.description}
+  permalink={`/ai-data-scientist/vs-machine-learning`}
+  canonicalUrl={guideData.canonicalUrl}
+  ogImageUrl={ogImageUrl}
+>
+  <GuideContent guide={guide!} />
+  <div slot='changelog-banner'></div>
+</BaseLayout>
diff --git a/src/pages/ai-tutor/[courseSlug].astro b/src/pages/ai-tutor/[courseSlug].astro
new file mode 100644
index 000000000..e3c6ec146
--- /dev/null
+++ b/src/pages/ai-tutor/[courseSlug].astro
@@ -0,0 +1,24 @@
+---
+import { GetAICourse } from '../../components/GenerateCourse/GetAICourse';
+import SkeletonLayout from '../../layouts/SkeletonLayout.astro';
+import { CheckSubscriptionVerification } from '../../components/Billing/CheckSubscriptionVerification';
+
+export const prerender = false;
+
+interface Params extends Record<string, string | undefined> {
+  courseSlug: string;
+}
+
+const { courseSlug } = Astro.params as Params;
+---
+
+<SkeletonLayout
+  title='AI Tutor'
+  briefTitle='AI Tutor'
+  description='AI Tutor'
+  keywords={['ai', 'tutor', 'education', 'learning']}
+  canonicalUrl={`/ai-tutor/${courseSlug}`}
+>
+  <GetAICourse client:load courseSlug={courseSlug} />
+  <CheckSubscriptionVerification client:load />
+</SkeletonLayout>
diff --git a/src/pages/ai-tutor/index.astro b/src/pages/ai-tutor/index.astro
new file mode 100644
index 000000000..11d129e0e
--- /dev/null
+++ b/src/pages/ai-tutor/index.astro
@@ -0,0 +1,10 @@
+---
+import { AICourse } from '../../components/GenerateCourse/AICourse';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import { CheckSubscriptionVerification } from '../../components/Billing/CheckSubscriptionVerification';
+---
+
+<BaseLayout title='AI Tutor' noIndex={true}>
+  <AICourse client:load />
+  <CheckSubscriptionVerification client:load />
+</BaseLayout>
diff --git a/src/pages/ai-tutor/search.astro b/src/pages/ai-tutor/search.astro
new file mode 100644
index 000000000..91edc218c
--- /dev/null
+++ b/src/pages/ai-tutor/search.astro
@@ -0,0 +1,16 @@
+---
+import { GenerateAICourse } from '../../components/GenerateCourse/GenerateAICourse';
+import SkeletonLayout from '../../layouts/SkeletonLayout.astro';
+import { CheckSubscriptionVerification } from '../../components/Billing/CheckSubscriptionVerification';
+---
+
+<SkeletonLayout
+  title='AI Tutor'
+  briefTitle='AI Tutor'
+  description='AI Tutor'
+  keywords={['ai', 'tutor', 'education', 'learning']}
+  canonicalUrl='/ai-tutor/search'
+>
+  <GenerateAICourse client:load />
+  <CheckSubscriptionVerification client:load />
+</SkeletonLayout>
diff --git a/src/pages/authors/[authorId].astro b/src/pages/authors/[authorId].astro
index 0ed281319..2bbcd920d 100644
--- a/src/pages/authors/[authorId].astro
+++ b/src/pages/authors/[authorId].astro
@@ -1,12 +1,12 @@
 ---
-import BaseLayout from '../../layouts/BaseLayout.astro';
 import AstroIcon from '../../components/AstroIcon.astro';
-import { getGuidesByAuthor } from '../../lib/guide';
-import { getVideosByAuthor } from '../../lib/video';
-import GuideListItem from '../../components/GuideListItem.astro';
+import { GuideListItem } from '../../components/FeaturedGuides/GuideListItem';
+import { VideoListItem } from '../../components/FeaturedVideos/VideoListItem';
+import BaseLayout from '../../layouts/BaseLayout.astro';
 import { getAuthorById, getAuthorIds } from '../../lib/author';
-import VideoListItem from '../../components/VideoListItem.astro';
+import { getGuidesByAuthor } from '../../lib/guide';
 import { getAllQuestionGroups } from '../../lib/question-group';
+import { getVideosByAuthor } from '../../lib/video';
 
 interface Params extends Record<string, string | undefined> {}
 
@@ -136,9 +136,12 @@ const videos = await getVideosByAuthor(authorId);
       {
         [...guides, ...questionGuides]
           .sort((a, b) => {
-            const aDate = a.frontmatter.date || a.frontmatter.publishedAt;
-            const bDate = b.frontmatter.date || b.frontmatter.publishedAt;
-            return new Date(bDate) - new Date(aDate);
+            const aFrontmatter = a.frontmatter as any;
+            const bFrontmatter = b.frontmatter as any;
+
+            const aDate = aFrontmatter.date || aFrontmatter.publishedAt;
+            const bDate = bFrontmatter.date || bFrontmatter.publishedAt;
+            return new Date(bDate).getTime() - new Date(aDate).getTime();
           })
           .map((guide) => <GuideListItem guide={guide} />)
       }
diff --git a/src/pages/backend/technologies.astro b/src/pages/backend/technologies.astro
index d3033f1c4..0efcd5018 100644
--- a/src/pages/backend/technologies.astro
+++ b/src/pages/backend/technologies.astro
@@ -24,7 +24,7 @@ const ogImageUrl =
 <BaseLayout
   title={guideData.seo.title}
   description={guideData.seo.description}
-  permalink={guide.frontmatter.excludedBySlug}
+  permalink={guideData.excludedBySlug}
   canonicalUrl={guideData.canonicalUrl}
   ogImageUrl={ogImageUrl}
 >
diff --git a/src/pages/best-practices/[bestPracticeId]/index.astro b/src/pages/best-practices/[bestPracticeId]/index.astro
index b4f40fb44..7fc4173b1 100644
--- a/src/pages/best-practices/[bestPracticeId]/index.astro
+++ b/src/pages/best-practices/[bestPracticeId]/index.astro
@@ -2,7 +2,7 @@
 import BestPracticeHeader from '../../../components/BestPracticeHeader.astro';
 import FrameRenderer from '../../../components/FrameRenderer/FrameRenderer.astro';
 import MarkdownFile from '../../../components/MarkdownFile.astro';
-import ShareIcons from '../../../components/ShareIcons/ShareIcons.astro';
+import { ShareIcons } from '../../../components/ShareIcons/ShareIcons';
 import { TopicDetail } from '../../../components/TopicDetail/TopicDetail';
 import UpcomingForm from '../../../components/UpcomingForm.astro';
 import BaseLayout from '../../../layouts/BaseLayout.astro';
@@ -94,8 +94,11 @@ const ogImageUrl = getOpenGraphImageUrl({
       !bestPracticeData.isUpcoming && bestPracticeData.jsonUrl && (
         <div class='container relative !max-w-[1000px]'>
           <ShareIcons
+            resourceId={bestPracticeId}
+            resourceType='best-practice'
             description={bestPracticeData.briefDescription}
             pageUrl={`https://roadmap.sh/best-practices/${bestPracticeId}`}
+            client:load
           />
 
           <TopicDetail
diff --git a/src/pages/courses/sql.astro b/src/pages/courses/sql.astro
new file mode 100644
index 000000000..ba5861eea
--- /dev/null
+++ b/src/pages/courses/sql.astro
@@ -0,0 +1,15 @@
+---
+import { SQLCoursePage } from '../../components/SQLCourse/SQLCoursePage.tsx';
+import SkeletonLayout from '../../layouts/SkeletonLayout.astro';
+---
+
+<SkeletonLayout
+  title='Master SQL'
+  briefTitle='Learn SQL from the ground up'
+  ogImageUrl='https://assets.roadmap.sh/guest/sql-course-bjc53.png'
+  description='Learn SQL from the ground up. This SQL programming class is designed to help you go from beginner to expert through hands-on practice with real-world scenarios, mastering everything from basic to complex queries.'
+  keywords={['sql', 'database', 'database management', 'database administration']}
+  canonicalUrl='/courses/sql'
+>
+  <SQLCoursePage client:load />
+</SkeletonLayout>
diff --git a/src/pages/dashboard.astro b/src/pages/dashboard.astro
index 50d8afcce..618550470 100644
--- a/src/pages/dashboard.astro
+++ b/src/pages/dashboard.astro
@@ -2,11 +2,17 @@
 import { DashboardPage } from '../components/Dashboard/DashboardPage';
 import BaseLayout from '../layouts/BaseLayout.astro';
 import { getAllBestPractices } from '../lib/best-practice';
+import { getAllQuestionGroups } from '../lib/question-group';
 import { getRoadmapsByTag } from '../lib/roadmap';
+import { getAllGuides } from '../lib/guide';
+import { getAllVideos } from '../lib/video';
 
 const roleRoadmaps = await getRoadmapsByTag('role-roadmap');
 const skillRoadmaps = await getRoadmapsByTag('skill-roadmap');
 const bestPractices = await getAllBestPractices();
+const questionGroups = await getAllQuestionGroups();
+const guides = await getAllGuides();
+const videos = await getAllVideos();
 
 const enrichedRoleRoadmaps = roleRoadmaps
   .filter((roadmapItem) => !roadmapItem.frontmatter.isHidden)
@@ -20,6 +26,7 @@ const enrichedRoleRoadmaps = roleRoadmaps
       description: frontmatter.briefDescription,
       relatedRoadmapIds: frontmatter.relatedRoadmaps,
       renderer: frontmatter.renderer,
+      isNew: frontmatter.isNew,
       metadata: {
         tags: frontmatter.tags,
       },
@@ -38,6 +45,7 @@ const enrichedSkillRoadmaps = skillRoadmaps
       description: frontmatter.briefDescription,
       relatedRoadmapIds: frontmatter.relatedRoadmaps,
       renderer: frontmatter.renderer,
+      isNew: frontmatter.isNew,
       metadata: {
         tags: frontmatter.tags,
       },
@@ -56,13 +64,16 @@ const enrichedBestPractices = bestPractices.map((bestPractice) => {
 });
 ---
 
-<BaseLayout title='Dashboard' noIndex={true} permalink="/dashboard">
+<BaseLayout title='Dashboard' noIndex={true} permalink='/dashboard'>
   <DashboardPage
     builtInRoleRoadmaps={enrichedRoleRoadmaps}
     builtInSkillRoadmaps={enrichedSkillRoadmaps}
     builtInBestPractices={enrichedBestPractices}
+    questionGroups={questionGroups}
+    guides={guides.slice(0, 7)}
+    videos={videos.slice(0, 7)}
     client:load
   />
   <div slot='open-source-banner'></div>
-  <div slot="changelog-banner" />
+  <div slot='changelog-banner'></div>
 </BaseLayout>
diff --git a/src/pages/devops/automation-tools.astro b/src/pages/devops/automation-tools.astro
index 5e32a08f4..e1b18f847 100644
--- a/src/pages/devops/automation-tools.astro
+++ b/src/pages/devops/automation-tools.astro
@@ -21,7 +21,7 @@ const ogImageUrl =
 <BaseLayout
   title={guideData.seo.title}
   description={guideData.seo.description}
-  permalink={guide.frontmatter.excludedBySlug}
+  permalink={guideData.excludedBySlug}
   canonicalUrl={guideData.canonicalUrl}
   ogImageUrl={ogImageUrl}
 >
diff --git a/src/pages/devops/automation.astro b/src/pages/devops/automation.astro
index 38f014d20..c6f1a3d36 100644
--- a/src/pages/devops/automation.astro
+++ b/src/pages/devops/automation.astro
@@ -21,7 +21,7 @@ const ogImageUrl =
 <BaseLayout
   title={guideData.seo.title}
   description={guideData.seo.description}
-  permalink={guide.frontmatter.excludedBySlug}
+  permalink={guideData.excludedBySlug}
   canonicalUrl={guideData.canonicalUrl}
   ogImageUrl={ogImageUrl}
 >
diff --git a/src/pages/devops/best-practices.astro b/src/pages/devops/best-practices.astro
index 90f00be54..e0ce7f19f 100644
--- a/src/pages/devops/best-practices.astro
+++ b/src/pages/devops/best-practices.astro
@@ -21,7 +21,7 @@ const ogImageUrl =
 <BaseLayout
   title={guideData.seo.title}
   description={guideData.seo.description}
-  permalink={guide.frontmatter.excludedBySlug}
+  permalink={guideData.excludedBySlug}
   canonicalUrl={guideData.canonicalUrl}
   ogImageUrl={ogImageUrl}
 >
diff --git a/src/pages/devops/career-path.astro b/src/pages/devops/career-path.astro
index 7b4b33f27..592f9ea57 100644
--- a/src/pages/devops/career-path.astro
+++ b/src/pages/devops/career-path.astro
@@ -19,9 +19,9 @@ const ogImageUrl =
 ---
 
 <BaseLayout
-  title={guideData.seo.title}
-  description={guideData.seo.description}
-  permalink={guide.frontmatter.excludedBySlug}
+  title={replaceVariables(guideData.seo.title)}
+  description={replaceVariables(guideData.seo.description)}
+  permalink={guideData.excludedBySlug}
   canonicalUrl={guideData.canonicalUrl}
   ogImageUrl={ogImageUrl}
 >
diff --git a/src/pages/devops/devops-engineer.astro b/src/pages/devops/devops-engineer.astro
index b540ca2b5..ca95f2c13 100644
--- a/src/pages/devops/devops-engineer.astro
+++ b/src/pages/devops/devops-engineer.astro
@@ -21,7 +21,7 @@ const ogImageUrl =
 <BaseLayout
   title={guideData.seo.title}
   description={guideData.seo.description}
-  permalink={guide.frontmatter.excludedBySlug}
+  permalink={guideData.excludedBySlug}
   canonicalUrl={guideData.canonicalUrl}
   ogImageUrl={ogImageUrl}
 >
diff --git a/src/pages/devops/job-description.astro b/src/pages/devops/job-description.astro
new file mode 100644
index 000000000..e6455932d
--- /dev/null
+++ b/src/pages/devops/job-description.astro
@@ -0,0 +1,30 @@
+---
+import GuideContent from '../../components/Guide/GuideContent.astro';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import { getGuideById } from '../../lib/guide';
+import { getOpenGraphImageUrl } from '../../lib/open-graph';
+import { replaceVariables } from '../../lib/markdown';
+
+const guideId = 'devops-job-description';
+const guide = await getGuideById(guideId);
+
+const { frontmatter: guideData } = guide!;
+
+const ogImageUrl =
+  guideData.seo.ogImageUrl ||
+  getOpenGraphImageUrl({
+    group: 'guide',
+    resourceId: guideId,
+  });
+---
+
+<BaseLayout
+  title={guideData.seo.title}
+  description={guideData.seo.description}
+  permalink={guideData.excludedBySlug}
+  canonicalUrl={guideData.canonicalUrl}
+  ogImageUrl={ogImageUrl}
+>
+  <GuideContent guide={guide!} />
+  <div slot='changelog-banner'></div>
+</BaseLayout>
diff --git a/src/pages/devops/test-automation.astro b/src/pages/devops/test-automation.astro
new file mode 100644
index 000000000..b03226944
--- /dev/null
+++ b/src/pages/devops/test-automation.astro
@@ -0,0 +1,30 @@
+---
+import GuideContent from '../../components/Guide/GuideContent.astro';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import { getGuideById } from '../../lib/guide';
+import { getOpenGraphImageUrl } from '../../lib/open-graph';
+import { replaceVariables } from '../../lib/markdown';
+
+const guideId = 'devops-test-automation';
+const guide = await getGuideById(guideId);
+
+const { frontmatter: guideData } = guide!;
+
+const ogImageUrl =
+  guideData.seo.ogImageUrl ||
+  getOpenGraphImageUrl({
+    group: 'guide',
+    resourceId: guideId,
+  });
+---
+
+<BaseLayout
+  title={guideData.seo.title}
+  description={guideData.seo.description}
+  permalink={guideData.excludedBySlug}
+  canonicalUrl={guideData.canonicalUrl}
+  ogImageUrl={ogImageUrl}
+>
+  <GuideContent guide={guide!} />
+  <div slot='changelog-banner'></div>
+</BaseLayout>
diff --git a/src/pages/devops/tools.astro b/src/pages/devops/tools.astro
index 232d78abb..2d4be2ac2 100644
--- a/src/pages/devops/tools.astro
+++ b/src/pages/devops/tools.astro
@@ -21,7 +21,7 @@ const ogImageUrl =
 <BaseLayout
   title={guideData.seo.title}
   description={guideData.seo.description}
-  permalink={guide.frontmatter.excludedBySlug}
+  permalink={guideData.excludedBySlug}
   canonicalUrl={guideData.canonicalUrl}
   ogImageUrl={ogImageUrl}
 >
diff --git a/src/pages/devops/vs-agile.astro b/src/pages/devops/vs-agile.astro
new file mode 100644
index 000000000..fa497f10b
--- /dev/null
+++ b/src/pages/devops/vs-agile.astro
@@ -0,0 +1,29 @@
+---
+import GuideContent from '../../components/Guide/GuideContent.astro';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import { getGuideById } from '../../lib/guide';
+import { getOpenGraphImageUrl } from '../../lib/open-graph';
+
+const guideId = 'devops-vs-agile';
+const guide = await getGuideById(guideId);
+
+const { frontmatter: guideData } = guide!;
+
+const ogImageUrl =
+  guideData.seo.ogImageUrl ||
+  getOpenGraphImageUrl({
+    group: 'guide',
+    resourceId: guideId,
+  });
+---
+
+<BaseLayout
+  title={guideData.seo.title}
+  description={guideData.seo.description}
+  permalink={guideData.excludedBySlug}
+  canonicalUrl={guideData.canonicalUrl}
+  ogImageUrl={ogImageUrl}
+>
+  <GuideContent guide={guide!} />
+  <div slot='changelog-banner'></div>
+</BaseLayout>
diff --git a/src/pages/devops/vs-developer.astro b/src/pages/devops/vs-developer.astro
index 99042513d..08c31adf0 100644
--- a/src/pages/devops/vs-developer.astro
+++ b/src/pages/devops/vs-developer.astro
@@ -21,7 +21,7 @@ const ogImageUrl =
 <BaseLayout
   title={replaceVariables(guideData.seo.title)}
   description={replaceVariables(guideData.seo.description)}
-  permalink={guide.frontmatter.excludedBySlug}
+  permalink={guideData.excludedBySlug}
   canonicalUrl={guideData.canonicalUrl}
   ogImageUrl={ogImageUrl}
 >
diff --git a/src/pages/devops/vs-devsecops.astro b/src/pages/devops/vs-devsecops.astro
new file mode 100644
index 000000000..c4047865b
--- /dev/null
+++ b/src/pages/devops/vs-devsecops.astro
@@ -0,0 +1,29 @@
+---
+import GuideContent from '../../components/Guide/GuideContent.astro';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import { getGuideById } from '../../lib/guide';
+import { getOpenGraphImageUrl } from '../../lib/open-graph';
+
+const guideId = 'devops-vs-devsecops';
+const guide = await getGuideById(guideId);
+
+const { frontmatter: guideData } = guide!;
+
+const ogImageUrl =
+  guideData.seo.ogImageUrl ||
+  getOpenGraphImageUrl({
+    group: 'guide',
+    resourceId: guideId,
+  });
+---
+
+<BaseLayout
+  title={guideData.seo.title}
+  description={guideData.seo.description}
+  permalink={guideData.excludedBySlug}
+  canonicalUrl={guideData.canonicalUrl}
+  ogImageUrl={ogImageUrl}
+>
+  <GuideContent guide={guide!} />
+  <div slot='changelog-banner'></div>
+</BaseLayout>
diff --git a/src/pages/frontend/technologies.astro b/src/pages/frontend/technologies.astro
index 6b71755f8..4477e9304 100644
--- a/src/pages/frontend/technologies.astro
+++ b/src/pages/frontend/technologies.astro
@@ -23,7 +23,7 @@ const ogImageUrl =
 <BaseLayout
   title={guideData.seo.title}
   description={guideData.seo.description}
-  permalink={guide.frontmatter.excludedBySlug}
+  permalink={guideData.excludedBySlug}
   canonicalUrl={guideData.canonicalUrl}
   ogImageUrl={ogImageUrl}
 >
diff --git a/src/pages/full-stack/how-to-become.astro b/src/pages/full-stack/how-to-become.astro
new file mode 100644
index 000000000..e23b2b38c
--- /dev/null
+++ b/src/pages/full-stack/how-to-become.astro
@@ -0,0 +1,30 @@
+---
+import GuideContent from '../../components/Guide/GuideContent.astro';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import { getGuideById } from '../../lib/guide';
+import { getOpenGraphImageUrl } from '../../lib/open-graph';
+import { replaceVariables } from '../../lib/markdown';
+
+const guideId = 'full-stack-how-to-become';
+const guide = await getGuideById(guideId);
+
+const { frontmatter: guideData } = guide!;
+
+const ogImageUrl =
+  guideData.seo.ogImageUrl ||
+  getOpenGraphImageUrl({
+    group: 'guide',
+    resourceId: guideId,
+  });
+---
+
+<BaseLayout
+  title={guideData.seo.title}
+  description={guideData.seo.description}
+  permalink={guideData.excludedBySlug}
+  canonicalUrl={guideData.canonicalUrl}
+  ogImageUrl={ogImageUrl}
+>
+  <GuideContent guide={guide!} />
+  <div slot='changelog-banner'></div>
+</BaseLayout>
diff --git a/src/pages/get-started.astro b/src/pages/get-started.astro
index eba6b40dc..b1b70c41a 100644
--- a/src/pages/get-started.astro
+++ b/src/pages/get-started.astro
@@ -40,6 +40,7 @@ import {
 } from 'lucide-react';
 import { SectionBadge } from '../components/GetStarted/SectionBadge';
 import { TipItem } from '../components/GetStarted/TipItem';
+import ChangelogBanner from '../components/ChangelogBanner.astro';
 ---
 
 <BaseLayout
@@ -283,11 +284,14 @@ import { TipItem } from '../components/GetStarted/TipItem';
       description='Learn all you need to know to become a DevOps Engineer.'
     />
 
-    <RoadmapCard
-      icon={Cloud}
-      title='AWS'
-      link='/aws'
-      description='Learn all you need to know to become an AWS Engineer.'
+    <RoadmapMultiCard
+      roadmaps={[
+        { title: 'AWS', link: '/aws' },
+        { title: 'Cloudflare', link: '/cloudflare' },
+      ]}
+      description='or perhaps you want to learn AWS or Cloudflare?'
+      secondaryRoadmaps={[{ title: 'Terraform', link: '/terraform' }]}
+      secondaryDescription='Or learn to automate your infrastructure using Terraform?'
     />
 
     <RoadmapMultiCard
@@ -295,9 +299,8 @@ import { TipItem } from '../components/GetStarted/TipItem';
         { title: 'Docker', link: '/docker' },
         { title: 'Kubernetes', link: '/kubernetes' },
         { title: 'Linux', link: '/linux' },
-        { title: 'Terraform', link: '/terraform' },
       ]}
-      description='or perhaps you want to learn Docker, Kubernetes, Terraform or Linux?'
+      description='or perhaps you want to learn Docker, Kubernetes or Linux?'
       secondaryRoadmaps={[
         { title: 'Python', link: '/python' },
         { title: 'Go', link: '/golang' },
@@ -508,4 +511,5 @@ import { TipItem } from '../components/GetStarted/TipItem';
       </p>
     </div>
   </div>
+  <ChangelogBanner slot='changelog-banner' />
 </BaseLayout>
diff --git a/src/pages/golang/rest-api.astro b/src/pages/golang/rest-api.astro
new file mode 100644
index 000000000..90acda95e
--- /dev/null
+++ b/src/pages/golang/rest-api.astro
@@ -0,0 +1,30 @@
+---
+import GuideContent from '../../components/Guide/GuideContent.astro';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import { getGuideById } from '../../lib/guide';
+import { getOpenGraphImageUrl } from '../../lib/open-graph';
+import { replaceVariables } from '../../lib/markdown';
+
+const guideId = 'golang-rest-api';
+const guide = await getGuideById(guideId);
+
+const { frontmatter: guideData } = guide!;
+
+const ogImageUrl =
+  guideData.seo.ogImageUrl ||
+  getOpenGraphImageUrl({
+    group: 'guide',
+    resourceId: guideId,
+  });
+---
+
+<BaseLayout
+  title={guideData.seo.title}
+  description={guideData.seo.description}
+  permalink={guideData.excludedBySlug}
+  canonicalUrl={guideData.canonicalUrl}
+  ogImageUrl={ogImageUrl}
+>
+  <GuideContent guide={guide!} />
+  <div slot="changelog-banner" />
+</BaseLayout>
diff --git a/src/pages/golang/vs-java.astro b/src/pages/golang/vs-java.astro
new file mode 100644
index 000000000..c8ced7e9d
--- /dev/null
+++ b/src/pages/golang/vs-java.astro
@@ -0,0 +1,29 @@
+---
+import GuideContent from '../../components/Guide/GuideContent.astro';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import { getGuideById } from '../../lib/guide';
+import { getOpenGraphImageUrl } from '../../lib/open-graph';
+
+const guideId = 'go-vs-java';
+const guide = await getGuideById(guideId);
+
+const { frontmatter: guideData } = guide!;
+
+const ogImageUrl =
+  guideData.seo.ogImageUrl ||
+  getOpenGraphImageUrl({
+    group: 'guide',
+    resourceId: guideId,
+  });
+---
+
+<BaseLayout
+  title={guideData.seo.title}
+  description={guideData.seo.description}
+  permalink={guideData.excludedBySlug}
+  canonicalUrl={guideData.canonicalUrl}
+  ogImageUrl={ogImageUrl}
+>
+  <GuideContent guide={guide!} />
+  <div slot='changelog-banner'></div>
+</BaseLayout>
diff --git a/src/pages/guides/index.astro b/src/pages/guides/index.astro
index df27054ff..ac7eeb02e 100644
--- a/src/pages/guides/index.astro
+++ b/src/pages/guides/index.astro
@@ -1,5 +1,5 @@
 ---
-import GuideListItem from '../../components/GuideListItem.astro';
+import { GuideListItem } from '../../components/FeaturedGuides/GuideListItem';
 import SimplePageHeader from '../../components/SimplePageHeader.astro';
 import BaseLayout from '../../layouts/BaseLayout.astro';
 import { getAllGuides } from '../../lib/guide';
@@ -12,8 +12,8 @@ const questionGuides = (await getAllQuestionGroups()).filter(
 
 const allGuides = [...guides, ...questionGuides];
 const sortedGuides = allGuides.sort((a, b) => {
-  const aDate = new Date(a.frontmatter.date);
-  const bDate = new Date(b.frontmatter.date);
+  const aDate = new Date(a.frontmatter.date as string);
+  const bDate = new Date(b.frontmatter.date as string);
 
   return bDate.getTime() - aDate.getTime();
 });
@@ -36,5 +36,5 @@ const sortedGuides = allGuides.sort((a, b) => {
       </div>
     </div>
   </div>
-  <div slot="changelog-banner" />
+  <div slot='changelog-banner'></div>
 </BaseLayout>
diff --git a/src/pages/index.astro b/src/pages/index.astro
index 8c2151b9d..bf92f689c 100644
--- a/src/pages/index.astro
+++ b/src/pages/index.astro
@@ -1,20 +1,22 @@
 ---
-import FeaturedVideos from '../components/FeaturedVideos.astro';
-import FeaturedGuides from '../components/FeaturedGuides.astro';
+import ChangelogBanner from '../components/ChangelogBanner.astro';
+import { FeaturedGuideList } from '../components/FeaturedGuides/FeaturedGuideList';
 import FeaturedItems from '../components/FeaturedItems/FeaturedItems.astro';
+import { FeaturedVideoList } from '../components/FeaturedVideos/FeaturedVideoList';
 import HeroSection from '../components/HeroSection/HeroSection.astro';
 import BaseLayout from '../layouts/BaseLayout.astro';
 import { getAllBestPractices } from '../lib/best-practice';
 import { getAllGuides } from '../lib/guide';
+import { getAllQuestionGroups } from '../lib/question-group';
 import { getRoadmapsByTag } from '../lib/roadmap';
 import { getAllVideos } from '../lib/video';
-import { getAllQuestionGroups } from '../lib/question-group';
 
 const roleRoadmaps = await getRoadmapsByTag('role-roadmap');
 const skillRoadmaps = await getRoadmapsByTag('skill-roadmap');
 const bestPractices = await getAllBestPractices();
 const questionGroups = await getAllQuestionGroups();
-const projectGroups = [
+
+export const projectGroups = [
   {
     title: 'Frontend',
     id: 'frontend',
@@ -23,7 +25,11 @@ const projectGroups = [
     title: 'Backend',
     id: 'backend',
   },
-]
+  {
+    title: 'DevOps',
+    id: 'devops',
+  },
+];
 
 const guides = await getAllGuides();
 const questionGuides = (await getAllQuestionGroups()).filter(
@@ -99,12 +105,13 @@ const videos = await getAllVideos();
     />
 
     <div class='grid grid-cols-1 gap-7 bg-gray-50 py-7 sm:gap-16 sm:py-16'>
-      <FeaturedGuides
+      <FeaturedGuideList
         heading='Guides'
         guides={guides.slice(0, 7)}
         questions={questionGuides.slice(0, 7)}
       />
-      <FeaturedVideos heading='Videos' videos={videos.slice(0, 7)} />
+      <FeaturedVideoList heading='Videos' videos={videos.slice(0, 7)} />
     </div>
   </div>
+  <ChangelogBanner slot='changelog-banner' />
 </BaseLayout>
diff --git a/src/pages/java/vs-javascript.astro b/src/pages/java/vs-javascript.astro
new file mode 100644
index 000000000..46343ae44
--- /dev/null
+++ b/src/pages/java/vs-javascript.astro
@@ -0,0 +1,29 @@
+---
+import GuideContent from '../../components/Guide/GuideContent.astro';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import { getGuideById } from '../../lib/guide';
+import { getOpenGraphImageUrl } from '../../lib/open-graph';
+
+const guideId = 'java-vs-javascript';
+const guide = await getGuideById(guideId);
+
+const { frontmatter: guideData } = guide!;
+
+const ogImageUrl =
+  guideData.seo.ogImageUrl ||
+  getOpenGraphImageUrl({
+    group: 'guide',
+    resourceId: guideId,
+  });
+---
+
+<BaseLayout
+  title={guideData.seo.title}
+  description={guideData.seo.description}
+  permalink={guideData.excludedBySlug}
+  canonicalUrl={guideData.canonicalUrl}
+  ogImageUrl={ogImageUrl}
+>
+  <GuideContent guide={guide!} />
+  <div slot="changelog-banner" />
+</BaseLayout>
diff --git a/src/pages/java/vs-python.astro b/src/pages/java/vs-python.astro
new file mode 100644
index 000000000..7f8632aa5
--- /dev/null
+++ b/src/pages/java/vs-python.astro
@@ -0,0 +1,29 @@
+---
+import GuideContent from '../../components/Guide/GuideContent.astro';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import { getGuideById } from '../../lib/guide';
+import { getOpenGraphImageUrl } from '../../lib/open-graph';
+
+const guideId = 'java-vs-python';
+const guide = await getGuideById(guideId);
+
+const { frontmatter: guideData } = guide!;
+
+const ogImageUrl =
+  guideData.seo.ogImageUrl ||
+  getOpenGraphImageUrl({
+    group: 'guide',
+    resourceId: guideId,
+  });
+---
+
+<BaseLayout
+  title={guideData.seo.title}
+  description={guideData.seo.description}
+  permalink={guideData.excludedBySlug}
+  canonicalUrl={guideData.canonicalUrl}
+  ogImageUrl={ogImageUrl}
+>
+  <GuideContent guide={guide!} />
+  <div slot="changelog-banner" />
+</BaseLayout>
diff --git a/src/pages/roadmaps.astro b/src/pages/roadmaps.astro
index 7d9df0145..c0f4db6be 100644
--- a/src/pages/roadmaps.astro
+++ b/src/pages/roadmaps.astro
@@ -5,6 +5,7 @@ import GridItem from '../components/GridItem.astro';
 import SimplePageHeader from '../components/SimplePageHeader.astro';
 import BaseLayout from '../layouts/BaseLayout.astro';
 import { getRoadmapsByTag } from '../lib/roadmap';
+import ChangelogBanner from '../components/ChangelogBanner.astro';
 ---
 
 <BaseLayout
@@ -14,4 +15,5 @@ import { getRoadmapsByTag } from '../lib/roadmap';
 >
   <RoadmapsPageHeader client:load />
   <RoadmapsPage client:load />
+  <ChangelogBanner slot='changelog-banner' />
 </BaseLayout>
diff --git a/src/pages/videos/index.astro b/src/pages/videos/index.astro
index 4226e4444..5bfdd5b44 100644
--- a/src/pages/videos/index.astro
+++ b/src/pages/videos/index.astro
@@ -1,6 +1,6 @@
 ---
-import VideoListItem from '../../components/VideoListItem.astro';
 import SimplePageHeader from '../../components/SimplePageHeader.astro';
+import { VideoListItem } from '../../components/FeaturedVideos/VideoListItem';
 import BaseLayout from '../../layouts/BaseLayout.astro';
 import { getAllVideos } from '../../lib/video';
 
diff --git a/src/queries/ai-course.ts b/src/queries/ai-course.ts
new file mode 100644
index 000000000..0a955bb12
--- /dev/null
+++ b/src/queries/ai-course.ts
@@ -0,0 +1,101 @@
+import { httpGet } from '../lib/query-http';
+import { isLoggedIn } from '../lib/jwt';
+import { queryOptions } from '@tanstack/react-query';
+
+export interface AICourseProgressDocument {
+  _id: string;
+  userId: string;
+  courseId: string;
+  done: string[];
+  createdAt: Date;
+  updatedAt: Date;
+}
+
+type AICourseModule = {
+  title: string;
+  lessons: string[];
+};
+
+type GetAICourseParams = {
+  aiCourseSlug: string;
+};
+
+export interface AICourseDocument {
+  _id: string;
+  userId: string;
+  title: string;
+  slug?: string;
+  keyword: string;
+  done: string[];
+  difficulty: string;
+  modules: AICourseModule[];
+  viewCount: number;
+  createdAt: Date;
+  updatedAt: Date;
+}
+
+type GetAICourseResponse = AICourseDocument;
+
+export function getAiCourseOptions(params: GetAICourseParams) {
+  return {
+    queryKey: ['ai-course', params],
+    queryFn: () => {
+      return httpGet<GetAICourseResponse>(
+        `/v1-get-ai-course/${params.aiCourseSlug}`,
+      );
+    },
+    enabled: !!params.aiCourseSlug,
+  };
+}
+
+export type GetAICourseLimitResponse = {
+  used: number;
+  limit: number;
+};
+
+export function getAiCourseLimitOptions() {
+  return queryOptions({
+    queryKey: ['ai-course-limit'],
+    queryFn: () => {
+      return httpGet<GetAICourseLimitResponse>(`/v1-get-ai-course-limit`);
+    },
+    enabled: !!isLoggedIn(),
+  });
+}
+
+export type ListUserAiCoursesQuery = {
+  perPage?: string;
+  currPage?: string;
+  query?: string;
+};
+
+export type AICourseWithLessonCount = AICourseDocument & {
+  lessonCount: number;
+};
+
+type ListUserAiCoursesResponse = {
+  data: AICourseWithLessonCount[];
+  totalCount: number;
+  totalPages: number;
+  currPage: number;
+  perPage: number;
+};
+
+export function listUserAiCoursesOptions(
+  params: ListUserAiCoursesQuery = {
+    perPage: '10',
+    currPage: '1',
+    query: '',
+  },
+) {
+  return {
+    queryKey: ['user-ai-courses', params],
+    queryFn: () => {
+      return httpGet<ListUserAiCoursesResponse>(
+        `/v1-list-user-ai-courses`,
+        params,
+      );
+    },
+    enabled: !!isLoggedIn(),
+  };
+}
diff --git a/src/queries/billing.ts b/src/queries/billing.ts
new file mode 100644
index 000000000..6425b4048
--- /dev/null
+++ b/src/queries/billing.ts
@@ -0,0 +1,97 @@
+import { queryOptions, useQuery } from '@tanstack/react-query';
+import { httpGet } from '../lib/query-http';
+import { isLoggedIn } from '../lib/jwt';
+import { queryClient } from '../stores/query-client';
+
+export const allowedSubscriptionStatus = [
+  'active',
+  'canceled',
+  'incomplete',
+  'incomplete_expired',
+  'past_due',
+  'paused',
+  'trialing',
+  'unpaid',
+  'none',
+] as const;
+export type AllowedSubscriptionStatus =
+  (typeof allowedSubscriptionStatus)[number];
+
+export const USER_SUBSCRIPTION_PLAN_PRICES = [
+  {
+    name: 'Pay Monthly',
+    interval: 'month',
+    priceId: import.meta.env.PUBLIC_STRIPE_INDIVIDUAL_MONTHLY_PRICE_ID,
+    amount: import.meta.env.PUBLIC_STRIPE_INDIVIDUAL_MONTHLY_PRICE_AMOUNT,
+  },
+  {
+    name: 'Pay Yearly',
+    interval: 'year',
+    priceId: import.meta.env.PUBLIC_STRIPE_INDIVIDUAL_YEARLY_PRICE_ID,
+    amount: import.meta.env.PUBLIC_STRIPE_INDIVIDUAL_YEARLY_PRICE_AMOUNT,
+  },
+] as const;
+
+export type AllowedSubscriptionInterval =
+  (typeof USER_SUBSCRIPTION_PLAN_PRICES)[number]['interval'];
+
+type BillingDetailsResponse = {
+  status: AllowedSubscriptionStatus;
+  planId?: string;
+  priceId?: string;
+  interval?: string;
+  currentPeriodEnd?: Date;
+  cancelAtPeriodEnd?: boolean;
+};
+
+export function billingDetailsOptions() {
+  return queryOptions({
+    queryKey: ['billing-details'],
+    queryFn: async () => {
+      return httpGet<BillingDetailsResponse>('/v1-billing-details');
+    },
+    enabled: !!isLoggedIn(),
+  });
+}
+
+export function useIsPaidUser() {
+  const { data, isLoading } = useQuery(
+    {
+      queryKey: ['billing-details'],
+      queryFn: async () => {
+        return httpGet<BillingDetailsResponse>('/v1-billing-details');
+      },
+      enabled: !!isLoggedIn(),
+      select: (data) => data.status === 'active',
+    },
+    queryClient,
+  );
+
+  return {
+    isPaidUser: data ?? false,
+    isLoading,
+  };
+}
+
+type CoursePriceParams = {
+  courseSlug: string;
+};
+
+type CoursePriceResponse = {
+  flag: string;
+  fullPrice: number;
+  regionalPrice: number;
+  regionalDiscountPercentage: number;
+  isEligibleForDiscount: boolean;
+};
+
+export function coursePriceOptions(params: CoursePriceParams) {
+  return queryOptions({
+    queryKey: ['course-price', params],
+    queryFn: async () => {
+      return httpGet<CoursePriceResponse>(
+        `/v1-course-price/${params.courseSlug}`,
+      );
+    },
+  });
+}
diff --git a/src/queries/course-progress.ts b/src/queries/course-progress.ts
new file mode 100644
index 000000000..343d7cb54
--- /dev/null
+++ b/src/queries/course-progress.ts
@@ -0,0 +1,41 @@
+import { queryOptions } from '@tanstack/react-query';
+import { isLoggedIn } from '../lib/jwt';
+import { httpGet } from '../lib/query-http';
+
+export interface CourseProgressDocument {
+  _id: string;
+  userId: string;
+  courseId: string;
+  completed: {
+    chapterId: string;
+    lessonId: string;
+    completedAt: Date;
+  }[];
+  review?: {
+    rating: number;
+    feedback?: string;
+  };
+
+  enrolledAt?: Date;
+  completedAt?: Date;
+  createdAt: Date;
+  updatedAt: Date;
+}
+
+export type CourseProgressResponse = Pick<
+  CourseProgressDocument,
+  'completed' | 'completedAt' | 'review' | 'enrolledAt'
+>;
+
+export function courseProgressOptions(courseSlug: string) {
+  return queryOptions({
+    queryKey: ['course-progress', courseSlug],
+    retryOnMount: false,
+    queryFn: async () => {
+      return httpGet<CourseProgressResponse>(
+        `/v1-course-progress/${courseSlug}`,
+      );
+    },
+    enabled: !!isLoggedIn(),
+  });
+}
diff --git a/src/styles/global.css b/src/styles/global.css
index f410f3380..6e076638d 100644
--- a/src/styles/global.css
+++ b/src/styles/global.css
@@ -56,6 +56,9 @@ h3 > code {
 .prose ul li > code:before,
 p > code:before,
 .prose ul li > code:after,
+.prose ol li > code:before,
+p > code:before,
+.prose ol li > code:after,
 p > code:after,
 a > code:after,
 a > code:before {
@@ -113,8 +116,46 @@ a > code:before {
   animation: barberpole 15s linear infinite;
 }
 
+.striped-loader-yellow {
+  background-image: repeating-linear-gradient(
+    -45deg,
+    transparent,
+    transparent 5px,
+    hsla(55, 100%, 50%, 0.7) 5px,
+    hsla(55, 100%, 50%, 0.7) 10px
+  );
+  background-size: 200% 200%;
+  animation: barberpole 15s linear infinite;
+}
+
+.striped-loader-slate {
+  background-image: repeating-linear-gradient(
+    -45deg,
+    transparent,
+    transparent 5px,
+    hsla(0, 0%, 0%, 0.1) 5px,
+    hsla(0, 0%, 0%, 0.1) 10px
+  );
+  background-size: 200% 200%;
+  animation: barberpole 30s linear infinite;
+}
+
+.striped-loader-slate-fast {
+  animation: barberpole 10s linear infinite;
+}
+
 @keyframes barberpole {
   100% {
     background-position: 100% 100%;
   }
 }
+
+/* Hide scrollbars */
+.scrollbar-none {
+  scrollbar-width: none;
+  -ms-overflow-style: none;
+}
+
+.scrollbar-none::-webkit-scrollbar {
+  display: none;
+}
\ No newline at end of file
diff --git a/tailwind.config.cjs b/tailwind.config.cjs
index d1301c24c..14780c3ed 100644
--- a/tailwind.config.cjs
+++ b/tailwind.config.cjs
@@ -37,11 +37,22 @@ module.exports = {
             opacity: '1',
           },
         },
+        spotlight: {
+          "0%": {
+            opacity: 0,
+            transform: "translate(-72%, -62%) scale(0.5)",
+          },
+          "100%": {
+            opacity: 1,
+            transform: "translate(-50%,-40%) scale(1)",
+          },
+        },
       },
       animation: {
         'fade-slide-up':
           'fade-slide-up 0.2s cubic-bezier(0.4, 0, 0.2, 1) forwards',
         'fade-in': 'fade-in 0.2s cubic-bezier(0.4, 0, 0.2, 1) forwards',
+        spotlight: "spotlight 2s ease 0.25s 1 forwards",
       },
     },
     container: {