From a22867bd96ae692fa5332dda152dda8d4fe00059 Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Fri, 17 Jan 2025 15:36:54 +0000 Subject: [PATCH 01/53] Add devops job description guide --- src/data/guides/devops-job-description.md | 235 ++++++++++++++++++++++ src/lib/guide.ts | 4 +- src/pages/devops/job-description.astro | 30 +++ 3 files changed, 267 insertions(+), 2 deletions(-) create mode 100644 src/data/guides/devops-job-description.md create mode 100644 src/pages/devops/job-description.astro 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/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 { 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/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, + }); +--- + + + +
+
From 19dd7f7f4f979b734772afe71cb43643cea61523 Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Fri, 17 Jan 2025 15:46:12 +0000 Subject: [PATCH 02/53] Add devops vs agile guide --- src/data/guides/devops-vs-agile.md | 204 +++++++++++++++++++++++++++++ src/pages/devops/vs-agile.astro | 29 ++++ 2 files changed, 233 insertions(+) create mode 100644 src/data/guides/devops-vs-agile.md create mode 100644 src/pages/devops/vs-agile.astro 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/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, + }); +--- + + + +
+
From b05f6148ac4f3cac49c8ba3b3304a934d248fa4d Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Fri, 17 Jan 2025 16:06:33 +0000 Subject: [PATCH 03/53] Add devops vs devsecops guide --- src/data/guides/devops-vs-devsecops.md | 231 +++++++++++++++++++++++++ src/pages/devops/vs-devsecops.astro | 29 ++++ 2 files changed, 260 insertions(+) create mode 100644 src/data/guides/devops-vs-devsecops.md create mode 100644 src/pages/devops/vs-devsecops.astro 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/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, + }); +--- + + + +
+
From 8cf272431d9ee842f0726aebb8328c1c56584f7e Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Fri, 17 Jan 2025 20:06:55 +0000 Subject: [PATCH 04/53] Fix spacing in license --- license | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 From 3d2db1b46e00d54c3b21fd7431aaaed43c8df54d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 18 Jan 2025 07:20:51 +0600 Subject: [PATCH 05/53] chore: update roadmap content json (#8062) Co-authored-by: kamranahmedse <4921183+kamranahmedse@users.noreply.github.com> --- public/roadmap-content/vue.json | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/public/roadmap-content/vue.json b/public/roadmap-content/vue.json index fa11459df..fe9a25e68 100644 --- a/public/roadmap-content/vue.json +++ b/public/roadmap-content/vue.json @@ -580,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" } ] @@ -591,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/", @@ -603,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" } ] @@ -613,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", From 7b59b5862e25b01506c8d6a88b9e37290ebe68be Mon Sep 17 00:00:00 2001 From: SangHyun Kim Date: Sat, 18 Jan 2025 10:26:48 +0900 Subject: [PATCH 06/53] fix: dedupe the same redirect link (#8065) --- .../content/content-security-policy@rmcm0CZbtNVC9LZ14-H6h.md | 1 - 1 file changed, 1 deletion(-) 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) From 19a6cb20ec1b9e9523d50b91066e834d53887229 Mon Sep 17 00:00:00 2001 From: za4g <138465437+za4g@users.noreply.github.com> Date: Fri, 17 Jan 2025 18:33:57 -0700 Subject: [PATCH 07/53] fix: resource content title typo Typo - Spelling of Fairness --- ...n1Xc3ooYz_.md => bias-and-fairness@lhIU0ulpvDAn1Xc3ooYz_.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/data/roadmaps/ai-engineer/content/{bias-and-fareness@lhIU0ulpvDAn1Xc3ooYz_.md => bias-and-fairness@lhIU0ulpvDAn1Xc3ooYz_.md} (98%) 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. From 0534e99093faf4770861e4122ab82f0c9a81d7ad Mon Sep 17 00:00:00 2001 From: Ed Lan <165309301+Edlan01@users.noreply.github.com> Date: Sat, 18 Jan 2025 02:36:30 +0100 Subject: [PATCH 08/53] Fix typo (#8067) --- src/data/roadmaps/frontend/frontend.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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: From 2085a31894d38e1339d2b8f1c430438e75a936fd Mon Sep 17 00:00:00 2001 From: Alberto Belalcazar Date: Mon, 20 Jan 2025 11:47:48 +0100 Subject: [PATCH 09/53] fix: updated link - Redis URL Docs (#8081) --- src/data/projects/weather-api-wrapper-service.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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). From e16866009a9ed5ea578148724cb467eed687829e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2025 11:05:27 +0000 Subject: [PATCH 10/53] chore: update roadmap content json (#8077) Co-authored-by: kamranahmedse <4921183+kamranahmedse@users.noreply.github.com> --- public/roadmap-content/ai-engineer.json | 22 +++------------------- public/roadmap-content/frontend.json | 5 ----- 2 files changed, 3 insertions(+), 24 deletions(-) diff --git a/public/roadmap-content/ai-engineer.json b/public/roadmap-content/ai-engineer.json index 1c80bfca2..e1bb7b3a6 100644 --- a/public/roadmap-content/ai-engineer.json +++ b/public/roadmap-content/ai-engineer.json @@ -632,26 +632,10 @@ } ] }, - "lhIU0ulpvDAn1Xc3ooYz_": { + "bias-and-fareness@lhIU0ulpvDAn1Xc3ooYz_.md": { "title": "Bias and Fareness", - "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": [ - { - "title": "What Do We Do About the Biases in AI?", - "url": "https://hbr.org/2019/10/what-do-we-do-about-the-biases-in-ai", - "type": "article" - }, - { - "title": "AI Bias - What Is It and How to Avoid It?", - "url": "https://levity.ai/blog/ai-bias-how-to-avoid", - "type": "article" - }, - { - "title": "What about fairness, bias and discrimination?", - "url": "https://ico.org.uk/for-organisations/uk-gdpr-guidance-and-resources/artificial-intelligence/guidance-on-ai-and-data-protection/how-do-we-ensure-fairness-in-ai/what-about-fairness-bias-and-discrimination/", - "type": "article" - } - ] + "description": "", + "links": [] }, "sWBT-j2cRuFqRFYtV_5TK": { "title": "Security and Privacy Concerns", diff --git a/public/roadmap-content/frontend.json b/public/roadmap-content/frontend.json index 737802cfe..332ad81bc 100644 --- a/public/roadmap-content/frontend.json +++ b/public/roadmap-content/frontend.json @@ -1607,11 +1607,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/", From 9ff560b1fdb51e685dea688456ba6e44505a0c5f Mon Sep 17 00:00:00 2001 From: Rikuya Osawa <109570170+rikuyaosawa@users.noreply.github.com> Date: Mon, 20 Jan 2025 20:06:05 +0900 Subject: [PATCH 11/53] fix: replace unavailable resource and add more description (#8079) --- .../system-design/content/sql-tuning@fY8zgbB13wxZ1CFtMSdZZ.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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) From 2640c821673e664954a1617243809074bd4faa51 Mon Sep 17 00:00:00 2001 From: "Abraham J. Olaobaju" <39011309+bajoski34@users.noreply.github.com> Date: Mon, 20 Jan 2025 11:06:52 +0000 Subject: [PATCH 12/53] Add content to patterns (#8074) * Update patterns--design-principles@_U0VoTkqM1d6NR13p5azS.md * Update src/data/roadmaps/software-architect/content/patterns--design-principles@_U0VoTkqM1d6NR13p5azS.md --------- Co-authored-by: Kamran Ahmed --- .../patterns--design-principles@_U0VoTkqM1d6NR13p5azS.md | 2 ++ 1 file changed, 2 insertions(+) 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. From 22f29a12f989e673608f5a3723f8e9fc72f70875 Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Mon, 20 Jan 2025 17:09:39 +0600 Subject: [PATCH 13/53] feat: add copy content (#8001) --- src/components/CreateTeam/RoadmapSelector.tsx | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) 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(false); const [error, setError] = useState(''); + const [confirmationContentId, setConfirmationContentId] = useState(); async function loadAllRoadmaps() { const { error, response } = await httpGet(`/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 && ( + { + setConfirmationContentId(''); + }} + onClick={(shouldCopy) => { + addTeamResource(confirmationContentId, shouldCopy).finally(() => { + pageProgressMessage.set(''); + setConfirmationContentId(''); + }); + }} + /> + ); + return (
+ {confirmationContentIdModal} + {changingRoadmapId && ( 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(() => {}); From 3bd379692fa11c47c7f4543612afb130b831d29f Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Mon, 20 Jan 2025 17:27:38 +0000 Subject: [PATCH 14/53] Add AI roadmap link --- src/components/RoadmapDropdownMenu/RoadmapDropdownMenu.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/RoadmapDropdownMenu/RoadmapDropdownMenu.tsx b/src/components/RoadmapDropdownMenu/RoadmapDropdownMenu.tsx index 0d7847bf3..9fdc7bfeb 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, From 699e05a3b4d404d264414534a692ad8b1812b6a7 Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Mon, 20 Jan 2025 23:44:41 +0600 Subject: [PATCH 15/53] fix: user progress modal percentage (#8082) --- src/components/UserProgress/UserProgressModalHeader.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 (
From 34425019b74029dcb0c73d75e02767c19ebb3c2d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 21 Jan 2025 20:54:48 +0600 Subject: [PATCH 16/53] chore: update roadmap content json (#8083) Co-authored-by: kamranahmedse <4921183+kamranahmedse@users.noreply.github.com> --- public/roadmap-content/software-architect.json | 2 +- public/roadmap-content/system-design.json | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/roadmap-content/software-architect.json b/public/roadmap-content/software-architect.json index e4d1a6892..5b0013822 100644 --- a/public/roadmap-content/software-architect.json +++ b/public/roadmap-content/software-architect.json @@ -496,7 +496,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": { diff --git a/public/roadmap-content/system-design.json b/public/roadmap-content/system-design.json index 4bd5d6fd3..75a6ce9a3 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" }, { From 66a8c2e73cf3f4704830fc29d90bab2eef004cb2 Mon Sep 17 00:00:00 2001 From: Glitchagon <135940053+Glitchagon@users.noreply.github.com> Date: Tue, 21 Jan 2025 17:55:39 +0300 Subject: [PATCH 17/53] fix: resource content grammar Fixed grammar and spelling errors in the Types of LLM's page of Prompt Engineering course. --- .../prompt-engineering/content/100-basic-llm/101-llm-types.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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) From 073708e7e99ff5e2d673c61f501d05738595c75d Mon Sep 17 00:00:00 2001 From: Glitchagon <135940053+Glitchagon@users.noreply.github.com> Date: Tue, 21 Jan 2025 18:22:22 +0300 Subject: [PATCH 18/53] fix: resource content grammar Fixed a couple spelling errors in the Use Delimiters section of the Prompt Engineering course. --- .../content/102-prompts/good-prompts/100-use-delimiters.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 +``` From 7a7590d872e63280bb768c5a8776575b7f09fa63 Mon Sep 17 00:00:00 2001 From: Fuchen Shi <152240393+fuchenshi@users.noreply.github.com> Date: Tue, 21 Jan 2025 23:23:56 +0800 Subject: [PATCH 19/53] fix: incorrect descriptions of the P = NP problem (#8084) --- .../content/p--np@0btHNkzWL1w_-pUgU_k2y.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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: From 16fc4b08ffa593512ab43a7f443dff03c6578514 Mon Sep 17 00:00:00 2001 From: LaralenaV Date: Tue, 21 Jan 2025 16:26:24 +0100 Subject: [PATCH 20/53] fix: add top content resources Added resources: article and video --- .../content/product-roadmap@gS3ofDrqDRKbecIskIyGi.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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) From dca2ba5facda13b6368d9cb2ff2958c6508eea2c Mon Sep 17 00:00:00 2001 From: Rikuya Osawa <109570170+rikuyaosawa@users.noreply.github.com> Date: Wed, 22 Jan 2025 00:27:19 +0900 Subject: [PATCH 21/53] feat: add resource for linux service management (#8053) Added hands-on resource for Linux service management. LabEx is an excellent guide which explores Linux service management through systemd and systemctl. --- .../roadmaps/linux/content/108-service-management/index.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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) From 2d8030a1754b462b3374e7b0a2af0fbf5477aeec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BB=BB=E8=B7=83=E5=85=B5?= Date: Tue, 21 Jan 2025 23:28:33 +0800 Subject: [PATCH 22/53] fix: topic content resources --- .../roadmaps/vue/content/modifiers@dSfrFLr8wKkLAOMJwtCTr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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) From e3b56ab716804dd765db95cd29025d6cbd5dfd56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BB=BB=E8=B7=83=E5=85=B5?= Date: Tue, 21 Jan 2025 23:29:04 +0800 Subject: [PATCH 23/53] fix: topic content resources --- .../vue/content/global-properties@gihxGgt177BK_EYsAfpx9.md | 1 + 1 file changed, 1 insertion(+) 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/) From 5a132b6f07ee168b65b5fd35b5fd309f947e985a Mon Sep 17 00:00:00 2001 From: Anshuman Singh <41586858+Anshuman-37@users.noreply.github.com> Date: Tue, 21 Jan 2025 21:01:29 +0530 Subject: [PATCH 24/53] fix: typo mistake 'Fareness' changed to 'Fairness' #8041 (#8043) Co-authored-by: Arik Chakma --- public/roadmap-content/ai-engineer.json | 24 +++++++++++++++---- .../roadmaps/ai-engineer/ai-engineer.json | 2 +- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/public/roadmap-content/ai-engineer.json b/public/roadmap-content/ai-engineer.json index e1bb7b3a6..72880ac2e 100644 --- a/public/roadmap-content/ai-engineer.json +++ b/public/roadmap-content/ai-engineer.json @@ -632,10 +632,26 @@ } ] }, - "bias-and-fareness@lhIU0ulpvDAn1Xc3ooYz_.md": { - "title": "Bias and Fareness", - "description": "", - "links": [] + "lhIU0ulpvDAn1Xc3ooYz_": { + "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": [ + { + "title": "What Do We Do About the Biases in AI?", + "url": "https://hbr.org/2019/10/what-do-we-do-about-the-biases-in-ai", + "type": "article" + }, + { + "title": "AI Bias - What Is It and How to Avoid It?", + "url": "https://levity.ai/blog/ai-bias-how-to-avoid", + "type": "article" + }, + { + "title": "What about fairness, bias and discrimination?", + "url": "https://ico.org.uk/for-organisations/uk-gdpr-guidance-and-resources/artificial-intelligence/guidance-on-ai-and-data-protection/how-do-we-ensure-fairness-in-ai/what-about-fairness-bias-and-discrimination/", + "type": "article" + } + ] }, "sWBT-j2cRuFqRFYtV_5TK": { "title": "Security and Privacy Concerns", 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 From 536a79ef590c590f94bbf8a1864b00ee2ad1226a Mon Sep 17 00:00:00 2001 From: Priyanshu Maurya Date: Tue, 21 Jan 2025 21:28:16 +0530 Subject: [PATCH 25/53] fix: topic content resources previous link https://www.docker.com/blog/docker-cli-commands-cheat-sheet/ has been expired I replaced it with this https://docs.docker.com/get-started/docker_cheatsheet.pdf --- .../roadmaps/docker/content/110-docker-cli/101-containers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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) From b0a3cdc8c42a9ce6ee65dcdf36db71179cfc5c2c Mon Sep 17 00:00:00 2001 From: Priyanshu Maurya Date: Tue, 21 Jan 2025 21:30:08 +0530 Subject: [PATCH 26/53] fix: add topic content resource * Update 101-docker-compose.md * Added type (Update 101-docker-compose.md) --- .../docker/content/108-running-containers/101-docker-compose.md | 1 + 1 file changed, 1 insertion(+) 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) From 069cb6fc06b3dba98a3e76bb32838ad59698d358 Mon Sep 17 00:00:00 2001 From: Attila Maraz Date: Tue, 21 Jan 2025 17:01:50 +0100 Subject: [PATCH 27/53] fix: topic content resources --- src/data/guides/basics-of-authentication.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From e577ba095f2dc96d24856e9aab1a30c12e961767 Mon Sep 17 00:00:00 2001 From: Shivam Kumar <85393390+kshivam14@users.noreply.github.com> Date: Tue, 21 Jan 2025 21:42:17 +0530 Subject: [PATCH 28/53] feat: add topic content resource Added Design Guidelines to the title and resources from IxD Foundation regarding User Interface design guidelines. --- .../content/good-layout-rules@90_M5qABC1vZ1nsXVyqFJ.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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) From 5a813eea0480e1d21f71423276676a67536ec909 Mon Sep 17 00:00:00 2001 From: Abhay Shukla <51085053+abhays02@users.noreply.github.com> Date: Tue, 21 Jan 2025 21:46:18 +0530 Subject: [PATCH 29/53] feat: add topic content resources * Update how-computers-calculate@GDLKJkKgB-i7n0YcV2NDa.md I have added short description so that learner should not roam and can get overview of the topic. * Update src/data/roadmaps/computer-science/content/how-computers-calculate@GDLKJkKgB-i7n0YcV2NDa.md --------- Co-authored-by: Arik Chakma --- .../content/how-computers-calculate@GDLKJkKgB-i7n0YcV2NDa.md | 2 ++ 1 file changed, 2 insertions(+) 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) From 4058dff406c171158196b66d3915c84b8da7ff4a Mon Sep 17 00:00:00 2001 From: xaviduds Date: Tue, 21 Jan 2025 13:35:15 -0300 Subject: [PATCH 30/53] fix: grammar typo Priviliges -> Privileges (#8016) Commits done in PostgreSQL Roadmap --- public/roadmap-content/postgresql-dba.json | 6 +++--- ...hHpl5.md => default-privileges@t18XjeHP4uRyERdqhHpl5.md} | 0 ...0-0S8c.md => object-privileges@S20aJB-VuSpXYyd0-0S8c.md} | 0 src/data/roadmaps/postgresql-dba/postgresql-dba.json | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) rename src/data/roadmaps/postgresql-dba/content/{default-priviliges@t18XjeHP4uRyERdqhHpl5.md => default-privileges@t18XjeHP4uRyERdqhHpl5.md} (100%) rename src/data/roadmaps/postgresql-dba/content/{object-priviliges@S20aJB-VuSpXYyd0-0S8c.md => object-privileges@S20aJB-VuSpXYyd0-0S8c.md} (100%) diff --git a/public/roadmap-content/postgresql-dba.json b/public/roadmap-content/postgresql-dba.json index 4279d8fa1..3ca150d8d 100644 --- a/public/roadmap-content/postgresql-dba.json +++ b/public/roadmap-content/postgresql-dba.json @@ -1075,7 +1075,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 +1117,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": [ { @@ -2900,4 +2900,4 @@ "description": "If you are an experienced developer or willing to learn, you can contribute to PostgreSQL by writing patches. Patches are important to fix bugs, optimize performance, and implement new features. Here are some guidelines on how to write patches for PostgreSQL:\n\n### Step 1: Find an Issue or Feature\n\nBefore writing a patch, you should identify an issue in PostgreSQL that needs fixing or a feature that requires implementation. You can find existing issues or propose new ones in the [PostgreSQL Bug Tracker](https://www.postgresql.org/support/submitbug/) and [PostgreSQL mailing lists](https://www.postgresql.org/list/).\n\n### Step 2: Familiarize Yourself with the Codebase\n\nTo write a patch, you must have a good understanding of the PostgreSQL source code. The code is available on the [official website](https://www.postgresql.org/developer/sourcecode/) and is organized into different modules. Familiarize yourself with the coding conventions, coding style, and the appropriate module where your patch will be applied.\n\n### Step 3: Set up the Development Environment\n\nTo create a patch, you need a development environment with the required tools, such as Git, GCC, and Bison. Follow the instructions in the [PostgreSQL Developer Setup Guide](https://wiki.postgresql.org/wiki/Developer_Setup) to set up your environment.\n\n### Step 4: Write the Patch\n\nEnsure that your patch adheres to the [PostgreSQL Coding Conventions](https://www.postgresql.org/docs/current/source-format.html). This includes following proper indentation, formatting, and organizing your code. Write clear and concise comments to help others understand the purpose of your patch.\n\n### Step 5: Test the Patch\n\nBefore submitting your patch, thoroughly test it to ensure it works correctly and does not introduce new issues. Run the patch through the PostgreSQL regression test suite, as well as any additional tests specific to your patch.\n\n### Step 6: Create a Commit and Generate a Patch\n\nAfter completing your patch and testing it, create a Git commit with a clear and concise commit message. Use `git-format-patch` to generate a patch file that can be submitted to the PostgreSQL project.\n\n### Step 7: Submit the Patch\n\nOnce your patch is ready, submit it through the appropriate [PostgreSQL mailing list](https://www.postgresql.org/list/) for review. Be prepared to receive feedback, make revisions, and resubmit your patch if necessary. Remember, contributing to an open-source project like PostgreSQL is a collaborative process!\n\nBy following these steps, you will be well on your way to contributing to the PostgreSQL project by writing patches. Happy coding!", "links": [] } -} \ No newline at end of file +} 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/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 +} From f1592571dbb3f71647fc93cff281f055450558af Mon Sep 17 00:00:00 2001 From: mrlane51 Date: Tue, 21 Jan 2025 10:54:30 -0600 Subject: [PATCH 31/53] feat: add topic content resources Added a useful detailed video of Resource Management that is easily digestible. --- .../roadmaps/kubernetes/content/106-resource-management/index.md | 1 + 1 file changed, 1 insertion(+) 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) From 5842b0a6927f9d7f2f9a73be916accd6aec829b3 Mon Sep 17 00:00:00 2001 From: Milen Todev <78319110+todevmilen@users.noreply.github.com> Date: Tue, 21 Jan 2025 18:59:16 +0200 Subject: [PATCH 32/53] fix: typo in backend-beginner (#8002) This pull request corrects a typo in the instructions on the right-hand side. The word "knowledge" was incorrectly spelled as "konwledge." Changes: Corrected the typo from "konwledge" to "knowledge" in the instructions. --- src/data/roadmaps/backend/backend-beginner.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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}]} From e5e902a26803723a29abe6b02c6ec744aeaa5a20 Mon Sep 17 00:00:00 2001 From: Jawher Kl Date: Tue, 21 Jan 2025 18:03:07 +0100 Subject: [PATCH 33/53] fix: topic content resource --- .../content/using-pg_ctlcluster@v3SoKmeCh6uxKW5GAAMje.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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) From 5bffdebeb88b4be1a2167236e3b99f606c8147d4 Mon Sep 17 00:00:00 2001 From: psychobioMACHINE <179890347+psychobioMACHINE@users.noreply.github.com> Date: Tue, 21 Jan 2025 12:11:36 -0500 Subject: [PATCH 34/53] feat: add topic content resource Added "freeCodeCamp | Responsive Web Design Certification" to HTML and CSS. [url: " https://www.freecodecamp.org/learn/2022/responsive-web-design/ "] It is a free certification with step-by-step guided projects in HTML & CSS. The final project is even your first webpage portfolio. --- src/data/roadmaps/frontend/content/css@ZhJhf1M2OphYbEmduFq-9.md | 1 + 1 file changed, 1 insertion(+) 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/) From edc7de8226ee16644a8750ffefd1c0bfb90b741d Mon Sep 17 00:00:00 2001 From: psychobioMACHINE <179890347+psychobioMACHINE@users.noreply.github.com> Date: Tue, 21 Jan 2025 12:12:14 -0500 Subject: [PATCH 35/53] feat: add topic content resource Added "freeCodeCamp | Responsive Web Design Certification" to HTML and CSS. [url: " https://www.freecodecamp.org/learn/2022/responsive-web-design/ "] It is a free certification with step-by-step guided projects in HTML & CSS. The final project is even your first webpage portfolio. --- src/data/roadmaps/frontend/content/html@yWG2VUkaF5IJVVut6AiSy.md | 1 + 1 file changed, 1 insertion(+) 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/) From b40ec831377ff99125e774b4106f0ad70548f472 Mon Sep 17 00:00:00 2001 From: Said-BT <47043136+Said-BT@users.noreply.github.com> Date: Tue, 21 Jan 2025 18:13:34 +0100 Subject: [PATCH 36/53] fix: add topic content resources * Update tuples@i7xIGiXU-k5UIKHIhQPjE.md added 2 resources as this section has nothing. * Update tuples@i7xIGiXU-k5UIKHIhQPjE.md * Update src/data/roadmaps/python/content/tuples@i7xIGiXU-k5UIKHIhQPjE.md --------- Co-authored-by: Arik Chakma --- .../roadmaps/python/content/tuples@i7xIGiXU-k5UIKHIhQPjE.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/data/roadmaps/python/content/tuples@i7xIGiXU-k5UIKHIhQPjE.md b/src/data/roadmaps/python/content/tuples@i7xIGiXU-k5UIKHIhQPjE.md index c0702b29d..7ad0dfa86 100644 --- a/src/data/roadmaps/python/content/tuples@i7xIGiXU-k5UIKHIhQPjE.md +++ b/src/data/roadmaps/python/content/tuples@i7xIGiXU-k5UIKHIhQPjE.md @@ -3,3 +3,5 @@ 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/) +- [@video@why are Tuples even a thing?](https://www.youtube.com/watch?v=fR_D_KIAYrE) From 37ca08f95628cc8a8b95f43b05153db479138902 Mon Sep 17 00:00:00 2001 From: Karim Safan <110535652+karim1safan@users.noreply.github.com> Date: Tue, 21 Jan 2025 19:17:52 +0200 Subject: [PATCH 37/53] feat: add topic content resources * Update dml@tcQSH-eAvJUZuePTDjAIb.md adding two resource for DML * Update src/data/roadmaps/computer-science/content/dml@tcQSH-eAvJUZuePTDjAIb.md * Update src/data/roadmaps/computer-science/content/dml@tcQSH-eAvJUZuePTDjAIb.md --------- Co-authored-by: Arik Chakma --- .../computer-science/content/dml@tcQSH-eAvJUZuePTDjAIb.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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) From d3b0c32eb71857018da76f3c578a87002f611fe0 Mon Sep 17 00:00:00 2001 From: Michal Freriks Date: Tue, 21 Jan 2025 18:22:50 +0100 Subject: [PATCH 38/53] fix: topic content The statement was not true, as technically, global variables are also able to be declared --- .../roadmaps/flutter/content/100-dart-basics/101-variables.md | 1 + 1 file changed, 1 insertion(+) 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..f321b5867 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 @@ -4,6 +4,7 @@ In Flutter, variables are used to store values. There are two types of variables - 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. +- Global Variables: While not always recommended, Dart does allow variables to be declared globally (outside any class or function). These variables are accessible throughout the file in which they are declared and can also be accessed across libraries if properly imported. Variables in Flutter can store values of different data types, such as numbers, strings, booleans, and more. From 68cf2c00c6efbed0bedbef183b19485daf6072a0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 22 Jan 2025 22:05:55 +0600 Subject: [PATCH 39/53] chore: update roadmap content json (#8092) Co-authored-by: kamranahmedse <4921183+kamranahmedse@users.noreply.github.com> --- public/roadmap-content/computer-science.json | 19 +++++++++++++++---- public/roadmap-content/frontend.json | 10 ++++++++++ public/roadmap-content/postgresql-dba.json | 4 ++-- public/roadmap-content/product-manager.json | 15 +++++++++++++-- public/roadmap-content/python.json | 10 ++++++++++ public/roadmap-content/ux-design.json | 10 ++++++++-- public/roadmap-content/vue.json | 7 ++++++- 7 files changed, 64 insertions(+), 11 deletions(-) diff --git a/public/roadmap-content/computer-science.json b/public/roadmap-content/computer-science.json index 9f6aeed3a..b34130194 100644 --- a/public/roadmap-content/computer-science.json +++ b/public/roadmap-content/computer-science.json @@ -2668,7 +2668,7 @@ }, "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?", @@ -3366,8 +3366,19 @@ }, "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", @@ -3931,7 +3942,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", diff --git a/public/roadmap-content/frontend.json b/public/roadmap-content/frontend.json index 332ad81bc..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/", diff --git a/public/roadmap-content/postgresql-dba.json b/public/roadmap-content/postgresql-dba.json index 3ca150d8d..1065102d0 100644 --- a/public/roadmap-content/postgresql-dba.json +++ b/public/roadmap-content/postgresql-dba.json @@ -583,7 +583,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" } ] @@ -2900,4 +2900,4 @@ "description": "If you are an experienced developer or willing to learn, you can contribute to PostgreSQL by writing patches. Patches are important to fix bugs, optimize performance, and implement new features. Here are some guidelines on how to write patches for PostgreSQL:\n\n### Step 1: Find an Issue or Feature\n\nBefore writing a patch, you should identify an issue in PostgreSQL that needs fixing or a feature that requires implementation. You can find existing issues or propose new ones in the [PostgreSQL Bug Tracker](https://www.postgresql.org/support/submitbug/) and [PostgreSQL mailing lists](https://www.postgresql.org/list/).\n\n### Step 2: Familiarize Yourself with the Codebase\n\nTo write a patch, you must have a good understanding of the PostgreSQL source code. The code is available on the [official website](https://www.postgresql.org/developer/sourcecode/) and is organized into different modules. Familiarize yourself with the coding conventions, coding style, and the appropriate module where your patch will be applied.\n\n### Step 3: Set up the Development Environment\n\nTo create a patch, you need a development environment with the required tools, such as Git, GCC, and Bison. Follow the instructions in the [PostgreSQL Developer Setup Guide](https://wiki.postgresql.org/wiki/Developer_Setup) to set up your environment.\n\n### Step 4: Write the Patch\n\nEnsure that your patch adheres to the [PostgreSQL Coding Conventions](https://www.postgresql.org/docs/current/source-format.html). This includes following proper indentation, formatting, and organizing your code. Write clear and concise comments to help others understand the purpose of your patch.\n\n### Step 5: Test the Patch\n\nBefore submitting your patch, thoroughly test it to ensure it works correctly and does not introduce new issues. Run the patch through the PostgreSQL regression test suite, as well as any additional tests specific to your patch.\n\n### Step 6: Create a Commit and Generate a Patch\n\nAfter completing your patch and testing it, create a Git commit with a clear and concise commit message. Use `git-format-patch` to generate a patch file that can be submitted to the PostgreSQL project.\n\n### Step 7: Submit the Patch\n\nOnce your patch is ready, submit it through the appropriate [PostgreSQL mailing list](https://www.postgresql.org/list/) for review. Be prepared to receive feedback, make revisions, and resubmit your patch if necessary. Remember, contributing to an open-source project like PostgreSQL is a collaborative process!\n\nBy following these steps, you will be well on your way to contributing to the PostgreSQL project by writing patches. Happy coding!", "links": [] } -} +} \ No newline at end of file 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..e1f0f8b97 100644 --- a/public/roadmap-content/python.json +++ b/public/roadmap-content/python.json @@ -179,6 +179,16 @@ "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": "why are Tuples even a thing?", + "url": "https://www.youtube.com/watch?v=fR_D_KIAYrE", + "type": "video" } ] }, 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 fe9a25e68..ba65e2099 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/", @@ -544,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" } ] From 21ed4a647fc32562770332fffe27566933865491 Mon Sep 17 00:00:00 2001 From: cepjant <44339865+cepjant@users.noreply.github.com> Date: Thu, 23 Jan 2025 02:09:44 +1000 Subject: [PATCH 40/53] fix: update topic content --- .../python/content/dictionaries@bc9CL_HMT-R6nXO1eR-gP.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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..ff91f2cb2 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,6 +1,6 @@ # 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: From f9dbd16afe60462128662244bb7f4701179f0c47 Mon Sep 17 00:00:00 2001 From: gavhu10 Date: Wed, 22 Jan 2025 11:10:31 -0500 Subject: [PATCH 41/53] feat: add resource for dictionaries (#8090) --- .../python/content/dictionaries@bc9CL_HMT-R6nXO1eR-gP.md | 1 + 1 file changed, 1 insertion(+) 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 ff91f2cb2..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 @@ -6,3 +6,4 @@ 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/) From bcf4126b3a4b3622acc8cfc80b1b1095cf2d11f2 Mon Sep 17 00:00:00 2001 From: gavhu10 Date: Wed, 22 Jan 2025 11:39:33 -0500 Subject: [PATCH 42/53] fix: add a tuple resource (#8089) --- src/data/roadmaps/python/content/tuples@i7xIGiXU-k5UIKHIhQPjE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/data/roadmaps/python/content/tuples@i7xIGiXU-k5UIKHIhQPjE.md b/src/data/roadmaps/python/content/tuples@i7xIGiXU-k5UIKHIhQPjE.md index 7ad0dfa86..4bb3fa264 100644 --- a/src/data/roadmaps/python/content/tuples@i7xIGiXU-k5UIKHIhQPjE.md +++ b/src/data/roadmaps/python/content/tuples@i7xIGiXU-k5UIKHIhQPjE.md @@ -4,4 +4,5 @@ Tuples are immutable sequences, meaning that once a tuple is created, its elemen - [@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) From 7ab3f758fd89dabbf64a23955fd7df517ad413e5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 26 Jan 2025 06:33:16 +0600 Subject: [PATCH 43/53] chore: update roadmap content json (#8096) Co-authored-by: kamranahmedse <4921183+kamranahmedse@users.noreply.github.com> --- public/roadmap-content/python.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/public/roadmap-content/python.json b/public/roadmap-content/python.json index e1f0f8b97..ea2ef8a83 100644 --- a/public/roadmap-content/python.json +++ b/public/roadmap-content/python.json @@ -185,6 +185,11 @@ "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", @@ -215,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", @@ -226,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" } ] }, From 9a77ca8a173263872e5d9af9448f932be1f23841 Mon Sep 17 00:00:00 2001 From: niibuthelezi <165214723+niibuthelezi@users.noreply.github.com> Date: Sun, 26 Jan 2025 18:35:27 +0000 Subject: [PATCH 44/53] feat: add topic resource --- .../roadmaps/python/content/iterators@aB1LSQjDEQb_BxueOcnxU.md | 1 + 1 file changed, 1 insertion(+) 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/) From de65909357420035fecb11b2915742abede65d86 Mon Sep 17 00:00:00 2001 From: ZIT2050 <116754905+ZIT2050@users.noreply.github.com> Date: Sun, 26 Jan 2025 19:38:07 +0100 Subject: [PATCH 45/53] fix: replace topic resource * Update csrf-protection@J9yIXZTtwbFzH2u4dI1ep.md @official@Security Guide page not found 404 * Update src/data/roadmaps/php/content/csrf-protection@J9yIXZTtwbFzH2u4dI1ep.md --------- Co-authored-by: Arik Chakma --- .../php/content/csrf-protection@J9yIXZTtwbFzH2u4dI1ep.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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/) From f213bd960412673d9086288a905bc1d3b701ec28 Mon Sep 17 00:00:00 2001 From: Rikuya Osawa <109570170+rikuyaosawa@users.noreply.github.com> Date: Mon, 27 Jan 2025 03:38:58 +0900 Subject: [PATCH 46/53] fix: inappropriate resource tags (#8112) --- .../git-github/content/github-wikis@lONqOqD-4slxa9B5i9ADX.md | 2 +- .../content/workflow-context@BnPiTu1Jw2kIW560a2A5T.md | 2 +- .../content/workflow-runners@6QwlY3dEvjfAOPALcWKXQ.md | 4 ++-- .../content/workflow-triggers@55uHPFNwYPVZx8Cy3c985.md | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) 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/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 From 4552d3f9c8c0410bd5a1776f3639b0656542424e Mon Sep 17 00:00:00 2001 From: Vedansh Date: Mon, 27 Jan 2025 00:14:14 +0530 Subject: [PATCH 47/53] refractor: improve data analyst roadmap (#8104) * refractor 36 topics * refractor remaining topics - 16 --- ...laysis--reporting-with-excel@sgXIjVTbwdwdYoaxN3XBM.md | 2 ++ .../data-analyst/content/apis@4DFcXSSHxg5wv0uXLIRij.md | 2 +- .../content/average@yn1sstYMO9du3rpfQqNs9.md | 4 ++-- .../content/bar-charts@EVk1H-QLtTlpG7lVEenDt.md | 4 ++-- .../big-data-technologies@_aUQZWUhFRvNu0MZ8CPit.md | 6 +++++- .../content/cleanup@nC7tViln4UyQFYP_-fyjB.md | 2 +- .../content/data-cleanup@E6cpb6kvluJM8OGuDcFBT.md | 6 +++++- .../content/data-collection@_sjXCLHHTbZromJYn6fnu.md | 6 +++++- .../data-manipulation-libraries@M1QtGTLyygIjePoCfvjve.md | 8 +++++++- .../data-storage-solutions@iTmtpXe7dR4XKslgpsk2q.md | 4 ++-- .../content/data-transformation@t_BRtEharsrOZxoyX0OzV.md | 2 ++ ...data-visualisation-libraries@l1SnPc4EMqGdaIAhIQfrT.md | 6 ++++-- .../content/data-visualisation@2g19zjEASJw2ve57hxpr0.md | 6 +++++- .../content/databases@tYPeLCxbqvMFlTkCGjdHg.md | 4 ++-- .../content/datedif@yBlJrNo9eO470dLp6OaQZ.md | 2 +- .../deep-learning-optional@SiYUdtYMDImRPmV2_XPkH.md | 6 +++++- .../data-analyst/content/dplyr@v8TfY-b4W5ygOv7r-syHq.md | 2 +- .../data-analyst/content/dplyr@y__UHXe2DD-IB7bvMF1-X.md | 2 +- .../content/ggplot2@E0hIgQEeZlEidr4HtUFrL.md | 4 ++-- .../data-analyst/content/hadoop@wECWIRMlWNoTxz5eKwaSf.md | 4 ++-- .../content/heatmap@G8resQXEVEHCaQfDlt3nj.md | 4 ++-- .../content/image-recognition@bHPJ6yOHtUq5EjJBSrJUE.md | 2 +- .../content/matplotlib@tvDdXwaRPsUSTqJGaLS3P.md | 6 +++--- .../content/matplotlib@uGkXxdMXUMY-3fQFS1jK8.md | 4 ++-- .../data-analyst/content/mode@fY8zVG2tVbmtx5OhY7hj-.md | 2 +- .../model-evaluation-techniques@7ikA373qH88HBx5irCgIH.md | 4 ++-- .../content/neural-networks@gGHsKcS92StK5FolzmVvm.md | 2 +- .../data-analyst/content/pandas@8OXmF2Gn6TYJotBRvDjqA.md | 2 +- .../data-analyst/content/pandas@TucngXKNptbeo3PtdJHX8.md | 2 +- .../content/pie-charts@K9xwm_Vpdup9ujYqlD9F3.md | 6 +++--- .../content/pivot-tables@2DDJUFr0AJTVR2Whj8zub.md | 6 +++--- .../content/power-bi@SJLeose5vZU8w_18C8_t0.md | 2 +- .../predictive-analytics@3WZORRCwme3HsaKew23Z5.md | 4 ++-- .../content/pytorch@LJSqfz6aYJbCe_bK8EWI1.md | 3 ++- .../data-analyst/content/range@tSxtyJhL5wjU0XJcjsJmm.md | 2 +- .../data-analyst/content/rnn@Gocm98_tRg5BGxKcP-7zg.md | 4 ++-- .../content/scatter-plot@A5YQv7D4qRcskdZ64XldH.md | 2 +- .../content/seaborn@-cJb8gEBvdVFf7FlgG3Ud.md | 2 +- .../data-analyst/content/spark@vaiigToDh4522rtWamuSM.md | 2 +- .../content/stacked-charts@329BrtmXjXNLfi1SFfdeo.md | 2 +- .../statistical-analysis@TeewVruErSsD4VLXcaDxp.md | 5 ++++- .../content/supervised-learning@FIYCkGXofKMsXmsqHSMh9.md | 2 +- .../content/tableau@Sz2Y8HLbSmDjSKAJztDql.md | 2 +- .../content/tensorflow@FJ4Sx477FWxyDsQr0R8rl.md | 3 ++- .../types-of-data-analytics@Lsapbmg-eMIYJAHpV97nO.md | 9 +++------ .../unsupervised-learning@FntL9E2yVAYwIrlANDNKE.md | 4 ++-- .../content/variance@ict4JkoVM-AzPbp9bDztg.md | 4 ++-- .../content/visualisation@jowh4CFLQiFzKaaElyCuQ.md | 2 +- .../visualizing-distributions@mCUW07rx74_dUNi7OGVlj.md | 2 +- .../content/vlookup--hlookup@9sIP-jpNjtA1JPCBjTf-H.md | 2 +- .../content/web-scraping@qQ64ZhSlbbWu9pP8KTE67.md | 4 ++-- .../what-is-data-analytics@yCnn-NfSxIybUQ2iTuUGq.md | 6 +++++- 52 files changed, 114 insertions(+), 76 deletions(-) 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/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/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..87792656b 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,17 @@ # 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..0977f38c8 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: + +- [@article@Introduction to Data Analytics](https://www.coursera.org/learn/introduction-to-data-analytics) \ No newline at end of file From a5f483c3351780698423603f102b0b5be431de55 Mon Sep 17 00:00:00 2001 From: Ed Lan <165309301+Edlan01@users.noreply.github.com> Date: Sun, 26 Jan 2025 19:44:50 +0100 Subject: [PATCH 48/53] feat: update topic content --- src/data/guides/devops-principles.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/guides/devops-principles.md b/src/data/guides/devops-principles.md index b5ba89c9f..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). From e2dece0e6a10c5b0a90c96c7d9781164364a5c2f Mon Sep 17 00:00:00 2001 From: Ed Lan <165309301+Edlan01@users.noreply.github.com> Date: Sun, 26 Jan 2025 19:45:07 +0100 Subject: [PATCH 49/53] feat: update topic content --- src/data/guides/devops-test-automation.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/data/guides/devops-test-automation.md b/src/data/guides/devops-test-automation.md index d4138ad84..7ecc1084c 100644 --- a/src/data/guides/devops-test-automation.md +++ b/src/data/guides/devops-test-automation.md @@ -23,11 +23,13 @@ tags: ![What is DevOps test automation?](https://assets.roadmap.sh/guest/devops-test-automation-nvpbi.jpg) -DevOps is a combination of cultural practices, tools, and processes that bridge the gap between development and operations teams. It aims to improve collaboration, automate workflows, and streamline the delivery of high-quality software. +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. -The ability to deliver software quickly and reliably can make or break a business these days. Whether by responding to customer needs, addressing security vulnerabilities, or launching innovative features, the speed at which you get there is critical. This is where test automation within the DevOps framework plays a pivotal role—it helps teams accelerate delivery without sacrificing quality. +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!). -Don’t believe me? Let me explain. +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? @@ -50,7 +52,7 @@ All of this has the potential to directly translate into faster feedback loops, ### Key Components of DevOps Test Automation -1. **Continuous Integration (CI):** Continuous Integration is a 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: +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. From 4696af9c6a05e58eb5de7b8c301feaa1f04f91a6 Mon Sep 17 00:00:00 2001 From: Ed Lan <165309301+Edlan01@users.noreply.github.com> Date: Sun, 26 Jan 2025 19:45:23 +0100 Subject: [PATCH 50/53] feat: update topic content --- src/data/guides/devops-shift-left-testing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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: From 28af19cd1c8edc55bf6b6932a4eda15831cfc5e5 Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Mon, 27 Jan 2025 15:32:13 +0000 Subject: [PATCH 51/53] Add SQL course landing page (#8127) * wip: courses * fix: update course sidebar * wip * fix: merge lessons * wip * wip: course footer * wip * fix: refactor layout * fix: refactor * feat: course progress * fix: update current lesson store * fix: refactor props * wip * wip * feat: course certificate * wip: course rating * wip: course notes * wip * feat: implement course notes * feat: make card clickable * fix: add hover background * fix: refactor course layout * fix: resizeable * fix: go back on save * feat: delete confimation * wip * feat: chat UI * fix: lesson complete guard issue * wip: add public json files * wip: course ai * fix: loading card * Fix failing dev without internet * Light mode and UI changes * Update UI * Update course UI * Add chapter page * Improve sidebar of course * Update navigation: * Update quiz view * Improve UI for quiz attempts * Remove unnecessary console.logs * Add progress loading skeletons * Update UI * Change background color of editor * Fix line color not applied on editor * UI updates * feat: empty view * feat: course ai token limit * feat: handle auth users * wip * feat: course landing page * wip * Add first chapter of SQL * Add introduction chapter * Add quiz for introduction * Add expressions in select * Add content for DISTINCT * Add filter with where * Add lesson about limit and offset * Add lesson for handling null values * Add lesson about comments * Add challenges * Add challenge * Add challenge * Add challenge * Add challenge 7 * Add creating tables lesson * Add common data types lesson * Add data types in sqlite * Add more on data types lesson * feat: course landing page * Add more on numeric types * Update * Add lesson about temporal data types * Add constraints * Add primary keys chapter * Add modifying tables * Add dropping and truncating * Rewrite for PostgreSQL * Update numeric types to PostgreSQL * Improve temporal data type content * Improve temporal data type content * Add setup for temporal data * Improve challenges in SQL basics * Update challenge names * Add new challenges * Add temporal validation challenge * Add new constraint * Add modifying tables query * Removing table * Add insert operations lesson * Add updating data lesson * Add delete operations * Add inserting and updating challenges * Add lesson for cleaning up data * Update course title * Add relation data lesson * Add relationships and types * Add relationships and types * wip * Add joins lesson * Joins in queries * Add inner join details * Add join queries * Add inner join details * Add foreign key constraint lesson * Update composite foreign keys * Add lesson about foreign keys * Add lesson about set operation queries * Add lesson about set operation queries * Add set operator challenges * Add new challenge * Add view lesson * Add notes in views * Add inactive customer challenge * Add high value order challenge * gst * Add new challenges * Add readers like you challenge * Update inactive customer query * Update inactive customer query * Update inactive customer query * Update inactive customer query * Update inactive customer query * add challenge for same price books * Add aggregate functions introduction * Add basic aggregation lesson * Add basic aggregation lesson * Add introduction quiz * Add grouping lesson * Add grouping gotchas * Add grouping and filtering lesson * Add note for lesson * Add challenges for aggregate * Update aggregate challenge * Rearrange chapters * Add scalar functions lessons * Add numeric functions * Add date functions * Add conversion functions * Add conversion functions * Add logical functions chapter * Add exercises * Add new challenges * Add monthly sales analysis * Add subqueries and ctes * Update * Add correlated subqueries * Add common table expressions * Add common-table expressions * Add example * Add recursive CTEs * Add subquery challenge * Add latest category books challenge * Add challenges * Add bestseller rankings challenge * Add new customer analysis * Add daily sales report * Improve queries * Add introduction to window functions * Add over and partition * wip: billing page * Add ranking functions * Improve ranking functions * Add order by * Add window frames lesson * Add window frames explanation * Add challenges for window functions * Add price range analysis challenge * wip * wip: course enroll * fix: start learning * wip * wip * Enrollment changes * wip * wip * feat: mobile responsive * Changelog banner refactor * Update * Header for course * Header for what to expect * UI color * Table of contents * Icons on chapters * Change design for road to sql * Add sql course page * Add lesson content * Update UI * Expanded chapter row * Add course page * Refactor * Add spotlight * Improve features * Add course features * Add certificate note * Zoom in on the image * Update * Add floating purchase * Floating purchase indicatorg * Add about section * Update about section * Add FAQ section * Update UI * Add purchase power parity * Show purchasing power pricing * Add course login popup * Add course login popup * Add account button * Add trigger for course purchase * Course purchase param * Buy button changes * Add faqs * Add purchase trigger on reload * Landing verification * Make header responsive * Make course page upper half responsive * Full page is responsive * Fix login height bug * Responsiveness * Implement login after checkout * Remove unused code * Update dependenciesg * Update * fix: refetch mount to false * Remove unused code * Remove unused code * Remove unused code * Remove unused code * Remove unused code * Remove unused code * Remove unused * Add quizzes to chapters * Update course slug * Update dependencies * Add header for sql course --------- Co-authored-by: Arik Chakma --- .astro/settings.json | 2 +- .env.example | 3 +- package.json | 3 + pnpm-lock.yaml | 2690 +++++++++-------- src/components/AdvertiseForm.tsx | 3 - src/components/AstroIcon.astro | 2 - .../AuthenticationFlow/CourseLoginPopup.tsx | 143 + .../AuthenticationFlow/GitHubButton.tsx | 26 +- .../AuthenticationFlow/GoogleButton.tsx | 25 +- .../AuthenticationFlow/LinkedInButton.tsx | 27 +- src/components/Navigation/Navigation.astro | 8 +- src/components/ReactIcons/RoadmapLogo.tsx | 28 + src/components/SQLCourse/AccountButton.tsx | 67 + src/components/SQLCourse/BuyButton.tsx | 210 ++ src/components/SQLCourse/ChapterRow.tsx | 145 + src/components/SQLCourse/CourseAuthor.tsx | 24 + src/components/SQLCourse/CourseFeature.tsx | 94 + src/components/SQLCourse/FAQSection.tsx | 113 + src/components/SQLCourse/FloatingPurchase.tsx | 56 + src/components/SQLCourse/SQLCoursePage.tsx | 415 +++ src/components/SQLCourse/SectionHeader.tsx | 29 + src/components/SQLCourse/Spotlight.tsx | 57 + .../TopicDetail/TopicProgressButton.tsx | 1 - src/env.d.ts | 1 + src/layouts/BaseLayout.astro | 1 - src/layouts/SkeletonLayout.astro | 2 +- src/lib/browser.ts | 1 - src/lib/discord.ts | 12 + src/lib/jwt.ts | 1 + src/lib/number.ts | 12 + src/pages/courses/sql.astro | 16 + src/pages/devops/career-path.astro | 4 +- src/pages/get-started.astro | 2 + src/pages/index.astro | 4 +- src/pages/roadmaps.astro | 2 + src/queries/billing.ts | 25 + src/queries/course-progress.ts | 41 + src/styles/global.css | 17 +- tailwind.config.cjs | 11 + 39 files changed, 2994 insertions(+), 1329 deletions(-) create mode 100644 src/components/AuthenticationFlow/CourseLoginPopup.tsx create mode 100644 src/components/ReactIcons/RoadmapLogo.tsx create mode 100644 src/components/SQLCourse/AccountButton.tsx create mode 100644 src/components/SQLCourse/BuyButton.tsx create mode 100644 src/components/SQLCourse/ChapterRow.tsx create mode 100644 src/components/SQLCourse/CourseAuthor.tsx create mode 100644 src/components/SQLCourse/CourseFeature.tsx create mode 100644 src/components/SQLCourse/FAQSection.tsx create mode 100644 src/components/SQLCourse/FloatingPurchase.tsx create mode 100644 src/components/SQLCourse/SQLCoursePage.tsx create mode 100644 src/components/SQLCourse/SectionHeader.tsx create mode 100644 src/components/SQLCourse/Spotlight.tsx create mode 100644 src/pages/courses/sql.astro create mode 100644 src/queries/billing.ts create mode 100644 src/queries/course-progress.ts diff --git a/.astro/settings.json b/.astro/settings.json index add73751c..79f45a49a 100644 --- a/.astro/settings.json +++ b/.astro/settings.json @@ -3,6 +3,6 @@ "enabled": false }, "_variables": { - "lastUpdateCheck": 1737069970237 + "lastUpdateCheck": 1737392387456 } } \ No newline at end of file diff --git a/.env.example b/.env.example index f42d92d18..02a71f0a7 100644 --- a/.env.example +++ b/.env.example @@ -1,3 +1,4 @@ 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 \ No newline at end of file diff --git a/package.json b/package.json index 28b522487..3d7f367fc 100644 --- a/package.json +++ b/package.json @@ -67,10 +67,12 @@ "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", "slugify": "^1.6.6", + "tiptap-markdown": "^0.8.10", "tailwind-merge": "^2.5.3", "tailwindcss": "^3.4.13", "turndown": "^7.2.0", @@ -86,6 +88,7 @@ "@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", "csv-parser": "^3.0.0", "gh-pages": "^6.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c65650762..7169ac841 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,22 +10,22 @@ 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) '@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/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@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)(tailwindcss@3.4.17) '@fingerprintjs/fingerprintjs': specifier: ^4.5.0 - version: 4.5.0 + version: 4.5.1 '@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 +34,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(typescript@5.7.3) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -64,10 +64,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 @@ -79,7 +79,7 @@ importers: version: 3.5.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 +88,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 +103,16 @@ 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-tooltip: specifier: ^5.28.0 - version: 5.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 5.28.0(react-dom@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) rehype-external-links: specifier: ^3.0.0 version: 3.0.0 @@ -122,9 +122,12 @@ 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 @@ -136,10 +139,13 @@ importers: 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) turndown: specifier: ^7.2.0 version: 7.2.0 @@ -148,14 +154,14 @@ 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: '@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 +173,25 @@ 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 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,19 +200,19 @@ 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: @@ -233,8 +242,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 +251,119 @@ 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==} - engines: {node: '>=6.9.0'} - - '@babel/code-frame@7.25.7': - resolution: {integrity: sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.25.4': - resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.25.8': - resolution: {integrity: sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.25.2': - resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.25.8': - resolution: {integrity: sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/generator@7.25.6': - resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} + '@babel/compat-data@7.26.5': + resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.25.7': - resolution: {integrity: sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==} + '@babel/core@7.26.7': + resolution: {integrity: sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.25.7': - resolution: {integrity: sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==} + '@babel/generator@7.26.5': + resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.25.2': - resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.25.7': - resolution: {integrity: sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==} + '@babel/helper-compilation-targets@7.26.5': + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.24.7': - resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} 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==} - 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==} + '@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-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==} + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.24.8': - resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.25.7': - resolution: {integrity: sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.25.6': - resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.25.7': - resolution: {integrity: sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==} + '@babel/helpers@7.26.7': + resolution: {integrity: sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.7': - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.25.7': - resolution: {integrity: sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==} - 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==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.25.7': - resolution: {integrity: sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.25.6': - resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.25.7': - resolution: {integrity: sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==} + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} engines: {node: '>=6.9.0'} - '@babel/types@7.25.6': - resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} + '@babel/traverse@7.26.7': + resolution: {integrity: sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==} engines: {node: '>=6.9.0'} - '@babel/types@7.25.8': - resolution: {integrity: sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==} + '@babel/types@7.26.7': + resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==} 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 +650,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 +771,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': @@ -866,8 +792,8 @@ packages: '@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 +874,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==} @@ -970,8 +896,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 +937,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 +1016,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 +1025,148 @@ 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/engine-javascript@1.29.1': + resolution: {integrity: sha512-Hpi8k9x77rCQ7F/7zxIOUruNkNidMyBnP5qAGbLFqg4kRrg1HZhkB8btib5EXbQWTtLb5gBHOdBwshk20njD7Q==} + + '@shikijs/engine-oniguruma@1.29.1': + resolution: {integrity: sha512-gSt2WhLNgEeLstcweQOSp+C+MhOpTsgdNXRqr3zP6M+BUBZ8Md9OU2BYwUYsALBxHza7hwaIWtFHjQ/aOOychw==} - '@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/themes@1.29.1': + resolution: {integrity: sha512-lb11zf72Vc9uxkl+aec2oW1HVTHJ2LtgZgumb4Rr6By3y/96VmlU44bkxEb8WBWH3RUtbqAJEN0jljD9cF7H7g==} - '@shikijs/types@1.22.0': - resolution: {integrity: sha512-Fw/Nr7FGFhlQqHfxzZY8Cwtwk5E9nKDUgeLjZgt3UuhcM3yJR9xj3ZGNravZZok8XmEZMiYkSMTPlPkULB8nww==} + '@shikijs/types@1.29.1': + resolution: {integrity: sha512-aBqAuhYRp5vSir3Pc9+QPu9WESBOjUo03ao0IHLC4TyTioSsp/SkbAZSrIH4ghYYC1T1KTEpRSBa83bas4RnPA==} - '@shikijs/vscode-textmate@9.3.0': - resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} + '@shikijs/vscode-textmate@10.0.1': + resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==} '@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 +1248,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==} @@ -1326,14 +1284,11 @@ packages: '@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 +1296,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,26 +1367,26 @@ 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'} ansi-align@3.0.1: @@ -1422,10 +1400,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 +1435,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 +1488,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 +1504,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 +1527,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 +1553,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 +1574,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 +1595,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 +1634,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 +1688,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 +1700,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'} @@ -1795,8 +1761,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 +1777,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 +1795,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 +1827,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'} @@ -1894,12 +1864,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 +1912,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 +1927,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 +1948,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 +1990,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 +1997,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 +2006,11 @@ 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-parse5@8.0.0: resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} @@ -2055,8 +2021,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 +2041,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 +2058,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 +2080,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 +2122,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 +2144,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,13 +2166,8 @@ 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 @@ -2223,12 +2191,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 +2247,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 +2257,24 @@ packages: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} + 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 +2300,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 +2316,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 +2328,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 +2340,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 +2425,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 +2442,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 +2479,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 +2490,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 +2514,54 @@ 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==} - 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 +2572,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 +2597,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 +2624,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 +2675,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 +2687,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 +2717,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 +2742,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 +2761,64 @@ packages: property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + 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 +2838,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==} @@ -2844,14 +2879,20 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - regex@4.3.2: - resolution: {integrity: sha512-kK/AA3A9K6q2js89+VMymcboLOlF5lZRCYJv3gzszXFHBr6kO6qLGzbm+UIugBEV8SMMKCTR59txoY6ctRHYVw==} + regex-recursion@5.1.1: + resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@5.1.1: + resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} 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 +2922,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 +2934,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 +2950,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: @@ -2948,8 +2996,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 +3018,8 @@ 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==} signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} @@ -3063,19 +3111,15 @@ 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==} + 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 @@ -3089,12 +3133,13 @@ packages: 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 +3165,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 +3175,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 +3189,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 +3244,16 @@ 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-sync-external-store@1.4.0: + resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + 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 +3267,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 +3298,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 +3351,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 +3373,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 +3384,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' @@ -3363,7 +3411,7 @@ snapshots: '@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 +3432,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 +3441,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)': 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(typescript@5.7.3) + send: 0.19.1 server-destroy: 1.0.1 transitivePeerDependencies: - supports-color @@ -3405,38 +3453,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/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@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) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) ultrahtml: 1.5.3 + vite: 5.4.14 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)(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(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 +3501,150 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/code-frame@7.24.7': + '@babel/code-frame@7.26.2': dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.1.0 - - '@babel/code-frame@7.25.7': - 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': + '@babel/generator@7.26.5': dependencies: - '@babel/types': 7.25.6 - '@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: 2.5.2 + jsesc: 3.1.0 - '@babel/generator@7.25.7': + '@babel/helper-annotate-as-pure@7.25.9': dependencies: - '@babel/types': 7.25.8 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.0.2 + '@babel/types': 7.26.7 - '@babel/helper-annotate-as-pure@7.25.7': + '@babel/helper-compilation-targets@7.26.5': 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/helper-compilation-targets@7.25.7': - 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': - dependencies: - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-imports@7.25.7': - dependencies: - '@babel/traverse': 7.25.7 - '@babel/types': 7.25.8 - 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-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-plugin-utils@7.24.8': {} - - '@babel/helper-plugin-utils@7.25.7': {} - - '@babel/helper-simple-access@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-simple-access@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-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/helper-validator-option@7.25.7': {} - - '@babel/helpers@7.25.6': - dependencies: - '@babel/template': 7.25.0 - '@babel/types': 7.25.6 + '@babel/helper-plugin-utils@7.26.5': {} - '@babel/helpers@7.25.7': - dependencies: - '@babel/template': 7.25.7 - '@babel/types': 7.25.8 + '@babel/helper-string-parser@7.25.9': {} - '@babel/highlight@7.24.7': - dependencies: - '@babel/helper-validator-identifier': 7.24.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.1.0 + '@babel/helper-validator-identifier@7.25.9': {} - '@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/helper-validator-option@7.25.9': {} - '@babel/parser@7.25.6': + '@babel/helpers@7.26.7': dependencies: - '@babel/types': 7.25.6 + '@babel/template': 7.25.9 + '@babel/types': 7.26.7 - '@babel/parser@7.25.8': + '@babel/parser@7.26.7': dependencies: - '@babel/types': 7.25.8 + '@babel/types': 7.26.7 - '@babel/plugin-syntax-jsx@7.25.7(@babel/core@7.25.8)': + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-react-jsx@7.25.7(@babel/core@7.25.8)': + '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.7)': 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/template@7.25.9': dependencies: - '@babel/code-frame': 7.24.7 - '@babel/parser': 7.25.6 - '@babel/types': 7.25.6 - - '@babel/template@7.25.7': - dependencies: - '@babel/code-frame': 7.25.7 - '@babel/parser': 7.25.8 - '@babel/types': 7.25.8 - - '@babel/traverse@7.25.6': - 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 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.7 + '@babel/types': 7.26.7 - '@babel/traverse@7.25.7': + '@babel/traverse@7.26.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 + '@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/types@7.25.6': + '@babel/types@7.26.7': dependencies: - '@babel/helper-string-parser': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 - to-fast-properties: 2.0.0 + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 - '@babel/types@7.25.8': - dependencies: - '@babel/helper-string-parser': 7.25.7 - '@babel/helper-validator-identifier': 7.25.7 - to-fast-properties: 2.0.0 - - '@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 +3788,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 +3869,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 +3887,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 @@ -3978,7 +3906,7 @@ snapshots: '@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 +3940,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 +3964,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 +3981,44 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.18.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)': 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) 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)': 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) 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)': 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 +4026,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)': 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) + '@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)': 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) 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)': 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) 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 +4123,174 @@ 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': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 - picomatch: 2.3.1 - optionalDependencies: - rollup: 4.22.4 + picomatch: 4.0.2 + + '@rollup/rollup-android-arm-eabi@4.32.0': + optional: true + + '@rollup/rollup-android-arm64@4.32.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.32.0': + optional: true - '@rollup/rollup-android-arm-eabi@4.22.4': + '@rollup/rollup-darwin-x64@4.32.0': optional: true - '@rollup/rollup-android-arm64@4.22.4': + '@rollup/rollup-freebsd-arm64@4.32.0': optional: true - '@rollup/rollup-darwin-arm64@4.22.4': + '@rollup/rollup-freebsd-x64@4.32.0': optional: true - '@rollup/rollup-darwin-x64@4.22.4': + '@rollup/rollup-linux-arm-gnueabihf@4.32.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.22.4': + '@rollup/rollup-linux-arm-musleabihf@4.32.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.22.4': + '@rollup/rollup-linux-arm64-gnu@4.32.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.22.4': + '@rollup/rollup-linux-arm64-musl@4.32.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.22.4': + '@rollup/rollup-linux-loongarch64-gnu@4.32.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.22.4': + '@rollup/rollup-linux-powerpc64le-gnu@4.32.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.22.4': + '@rollup/rollup-linux-riscv64-gnu@4.32.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.22.4': + '@rollup/rollup-linux-s390x-gnu@4.32.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.22.4': + '@rollup/rollup-linux-x64-gnu@4.32.0': optional: true - '@rollup/rollup-linux-x64-musl@4.22.4': + '@rollup/rollup-linux-x64-musl@4.32.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.22.4': + '@rollup/rollup-win32-arm64-msvc@4.32.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.22.4': + '@rollup/rollup-win32-ia32-msvc@4.32.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.22.4': + '@rollup/rollup-win32-x64-msvc@4.32.0': optional: true - '@shikijs/core@1.22.0': + '@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/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@1.22.0': + '@shikijs/engine-oniguruma@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/vscode-textmate': 10.0.1 - '@shikijs/engine-oniguruma@1.22.0': + '@shikijs/langs@1.29.1': dependencies: - '@shikijs/types': 1.22.0 - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/types': 1.29.1 - '@shikijs/types@1.22.0': + '@shikijs/themes@1.29.1': dependencies: - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/types': 1.29.1 + + '@shikijs/types@1.29.1': + dependencies: + '@shikijs/vscode-textmate': 10.0.1 '@types/hast': 3.0.4 - '@shikijs/vscode-textmate@9.3.0': {} + '@shikijs/vscode-textmate@10.0.1': {} '@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 +4298,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 +4311,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 +4319,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 +4335,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 +4351,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 +4402,24 @@ 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/estree@1.0.5': {} - '@types/estree@1.0.6': {} - '@types/geojson@7946.0.14': {} + '@types/geojson@7946.0.16': {} '@types/hast@3.0.4': dependencies: @@ -4459,68 +4427,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)': 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 transitivePeerDependencies: - supports-color @@ -4528,9 +4518,9 @@ 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 @@ -4542,10 +4532,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 +4559,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(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 '@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 +4598,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 + vitefu: 1.0.5(vite@5.4.14) 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 +4642,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 +4670,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 +4685,12 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.23.3: + browserslist@4.24.4: 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: - 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 +4698,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 +4722,7 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - ci-info@4.0.0: {} + ci-info@4.1.0: {} classcat@5.0.5: {} @@ -4765,16 +4738,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 +4760,7 @@ snapshots: comma-separated-tokens@2.0.3: {} - commander@11.1.0: {} + commander@13.1.0: {} commander@4.1.1: {} @@ -4805,7 +4772,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 +4793,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 +4808,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 +4852,7 @@ snapshots: dependencies: ms: 2.0.0 - debug@4.3.7: + debug@4.4.0: dependencies: ms: 2.1.3 @@ -4893,6 +4860,8 @@ snapshots: dependencies: character-entities: 2.0.2 + deepmerge@4.3.1: {} + delayed-stream@1.0.0: {} depd@2.0.0: {} @@ -4937,7 +4906,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 +4920,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 +4997,8 @@ snapshots: escape-string-regexp@1.0.5: {} + escape-string-regexp@4.0.0: {} + escape-string-regexp@5.0.0: {} esprima@4.0.1: {} @@ -5050,7 +5021,7 @@ snapshots: 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 +5029,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 +5069,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 +5089,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 +5105,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 +5137,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 +5146,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 +5160,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 +5168,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 +5192,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 @@ -5274,7 +5243,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 +5261,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 +5284,7 @@ snapshots: ignore@5.3.2: {} - image-size@1.1.1: + image-size@1.2.0: dependencies: queue: 6.0.2 @@ -5324,7 +5300,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 +5326,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 +5344,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,9 +5361,7 @@ snapshots: dependencies: argparse: 2.0.1 - jsesc@2.5.2: {} - - jsesc@3.0.2: {} + jsesc@3.1.0: {} json5@2.2.3: {} @@ -5401,9 +5377,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 +5409,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 +5430,22 @@ 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-task-lists@2.1.1: {} + markdown-it@14.1.0: dependencies: argparse: 2.0.1 @@ -5479,7 +5455,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 +5463,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 +5492,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 +5517,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 +5527,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 +5553,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 +5583,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 +5793,6 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimist@1.2.8: {} - minipass@7.1.2: {} mrmime@2.0.0: {} @@ -5832,9 +5807,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 +5830,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 +5854,28 @@ snapshots: dependencies: mimic-function: 5.0.1 - oniguruma-to-js@0.4.3: + oniguruma-to-es@2.3.0: dependencies: - regex: 4.3.2 + emoji-regex-xs: 1.0.0 + regex: 5.1.1 + regex-recursion: 5.1.1 - 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 +5885,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 +5899,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 +5926,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 +5945,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 +5961,35 @@ 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 - optionalDependencies: - postcss: 8.4.47 + lilconfig: 3.1.3 + postcss: 8.5.1 + yaml: 2.7.0 - 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 +6004,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 +6019,15 @@ 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 - optionalDependencies: + prettier: 3.4.2 prettier-plugin-astro: 0.14.1 - prettier@3.3.3: {} + prettier@3.4.2: {} prismjs@1.29.0: {} @@ -6064,6 +6044,109 @@ snapshots: property-information@6.5.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 +6163,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 +6178,9 @@ snapshots: react-refresh@0.14.2: {} - react-tooltip@5.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-tooltip@5.28.0(react-dom@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 +6189,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): 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) + '@reactflow/controls': 11.2.14(@types/react@18.3.18)(react-dom@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) + '@reactflow/minimap': 11.7.14(@types/react@18.3.18)(react-dom@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) + '@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-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -6128,18 +6211,27 @@ snapshots: dependencies: picomatch: 2.3.1 - regex@4.3.2: {} + regex-recursion@5.1.1: + dependencies: + regex: 5.1.1 + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@5.1.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 +6240,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 +6270,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 +6287,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 +6316,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 +6339,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 +6389,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 @@ -6312,12 +6418,12 @@ snapshots: 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 +6472,15 @@ 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 signal-exit@4.1.0: {} @@ -6421,7 +6529,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 +6557,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 +6569,33 @@ 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: {} + 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 @@ -6506,9 +6610,15 @@ snapshots: 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): + 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 +6638,16 @@ snapshots: ts-interface-checker@0.1.13: {} - tsconfck@3.1.3(typescript@5.6.2): - optionalDependencies: - typescript: 5.6.2 + tsconfck@3.1.4(typescript@5.7.3): + dependencies: + 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 +6657,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 +6726,13 @@ snapshots: universalify@2.0.1: {} - update-browserslist-db@1.1.0(browserslist@4.23.3): - dependencies: - browserslist: 4.23.3 - escalade: 3.2.0 - picocolors: 1.1.0 - - update-browserslist-db@1.1.0(browserslist@4.24.0): + update-browserslist-db@1.1.2(browserslist@4.24.4): dependencies: - browserslist: 4.24.0 + browserslist: 4.24.4 escalade: 3.2.0 - picocolors: 1.1.0 + picocolors: 1.1.1 - use-sync-external-store@1.2.2(react@18.3.1): + use-sync-external-store@1.4.0(react@18.3.1): dependencies: react: 18.3.1 @@ -6649,18 +6753,19 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite@5.4.8(@types/node@18.19.50): + vite@5.4.14: 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 fsevents: 2.3.3 - vitefu@1.0.2(vite@5.4.8(@types/node@18.19.50)): - optionalDependencies: - vite: 5.4.8(@types/node@18.19.50) + vitefu@1.0.5(vite@5.4.14): + dependencies: + vite: 5.4.14 + + w3c-keyname@2.2.8: {} web-namespaces@2.0.1: {} @@ -6705,11 +6810,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 +6822,21 @@ 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) - optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.18 react: 18.3.1 + use-sync-external-store: 1.4.0(react@18.3.1) zwitch@2.0.4: {} 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/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 = ( +
+

+ {emailNature === 'login' + ? 'Login to your account' + : 'Create an account'} +

+

+ Fill in the details below to continue +

+
+ ); + + return ( + + {emailHeader} + {emailNature === 'login' && ( + + )} + {emailNature === 'signup' && ( + + )} + + + + ); + } + + return ( + +
+

+ Create or login to your account +

+

+ Login or sign up for an account to start learning +

+
+ +
+ + + +
+ +
+
+ OR +
+
+ +
+ {!isUsingEmail && ( + + )} + {isUsingEmail && ( + <> + + + + )} +
+ + ); +} diff --git a/src/components/AuthenticationFlow/GitHubButton.tsx b/src/components/AuthenticationFlow/GitHubButton.tsx index b0001699a..48b0d0d08 100644 --- a/src/components/AuthenticationFlow/GitHubButton.tsx +++ b/src/components/AuthenticationFlow/GitHubButton.tsx @@ -1,21 +1,23 @@ 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 { cn } from '../../../editor/utils/classname.ts'; import { httpGet } from '../../lib/http'; +import { COURSE_PURCHASE_PARAM, setAuthToken } from '../../lib/jwt'; +import { GitHubIcon } from '../ReactIcons/GitHubIcon.tsx'; 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(''); @@ -74,6 +76,17 @@ export function GitHubButton(props: GitHubButtonProps) { localStorage.removeItem(GITHUB_REDIRECT_AT); localStorage.removeItem(GITHUB_LAST_PAGE); setAuthToken(response.token); + + const shouldTriggerPurchase = + localStorage.getItem(CHECKOUT_AFTER_LOGIN_KEY) !== '0'; + if (redirectUrl.includes('/courses/sql') && shouldTriggerPurchase) { + const tempUrl = new URL(redirectUrl, window.location.origin); + tempUrl.searchParams.set(COURSE_PURCHASE_PARAM, '1'); + redirectUrl = tempUrl.toString(); + + localStorage.removeItem(CHECKOUT_AFTER_LOGIN_KEY); + } + window.location.href = redirectUrl; }) .catch((err) => { @@ -120,7 +133,10 @@ export function GitHubButton(props: GitHubButtonProps) { return ( <> diff --git a/src/components/Navigation/Navigation.astro b/src/components/Navigation/Navigation.astro index 4e4c567fa..ee39d904a 100644 --- a/src/components/Navigation/Navigation.astro +++ b/src/components/Navigation/Navigation.astro @@ -1,11 +1,9 @@ --- -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'; ---
@@ -48,7 +46,7 @@ import { RoadmapDropdownMenu } from '../RoadmapDropdownMenu/RoadmapDropdownMenu' + Start Learning + + ); +} diff --git a/src/components/SQLCourse/BuyButton.tsx b/src/components/SQLCourse/BuyButton.tsx new file mode 100644 index 000000000..7112c8b1b --- /dev/null +++ b/src/components/SQLCourse/BuyButton.tsx @@ -0,0 +1,210 @@ +import { useMutation, useQuery } from '@tanstack/react-query'; +import { ArrowRightIcon } from 'lucide-react'; +import { useEffect, useState } from 'react'; +import { cn } from '../../lib/classname'; +import { COURSE_PURCHASE_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'; + +export const COURSE_SLUG = 'master-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 toast = useToast(); + + const { data: coursePricing, isLoading: isLoadingCourse } = useQuery( + coursePriceOptions({ courseSlug: COURSE_SLUG }), + queryClient, + ); + + const { data: courseProgress, isLoading: isLoadingCourseProgress } = useQuery( + courseProgressOptions(COURSE_SLUG), + queryClient, + ); + + const { + mutate: createCheckoutSession, + isPending: isCreatingCheckoutSession, + } = useMutation( + { + mutationFn: (body: CreateCheckoutSessionBody) => { + return httpPost( + '/v1-create-checkout-session', + body, + ); + }, + onMutate: () => { + toast.loading('Creating checkout session...'); + }, + onSuccess: (data) => { + window.location.href = data.checkoutUrl; + }, + 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(); + } + }, []); + + const isLoadingPricing = + isLoadingCourse || !coursePricing || isLoadingCourseProgress; + const isAlreadyEnrolled = !!courseProgress?.enrolledAt; + + function initPurchase() { + if (!isLoggedIn()) { + return; + } + + createCheckoutSession({ + courseId: COURSE_SLUG, + success: `/courses/sql?e=1`, + cancel: `/courses/sql`, + }); + } + + function onBuyClick() { + if (!isLoggedIn()) { + setIsLoginPopupOpen(true); + return; + } + + const hasEnrolled = !!courseProgress?.enrolledAt; + if (hasEnrolled) { + window.location.href = `${import.meta.env.PUBLIC_COURSE_APP_URL}/sql`; + return; + } + + initPurchase(); + } + + const courseLoginPopup = isLoginPopupOpen && ( + setIsLoginPopupOpen(false)} /> + ); + + if (variant === 'main') { + return ( +
+ {courseLoginPopup} + + {!isLoadingPricing && + !isAlreadyEnrolled && + coursePricing?.isEligibleForDiscount && ( + + {coursePricing.regionalDiscountPercentage}% regional discount + applied + + )} +
+ ); + } + + if (variant === 'top-nav') { + return ( + + ); + } + + return ( +
+ {courseLoginPopup} + + {!isAlreadyEnrolled && coursePricing?.isEligibleForDiscount && ( + + {coursePricing.regionalDiscountPercentage}% regional discount applied + + )} +
+ ); +} 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 ( +
+
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', + )} + > +
+
+
{icon}
+
+ +
+

+ + {counter}.{' '} + + {title} +

+

{description}

+ +
+
+ {lessonCount} Lessons +
+
+ {challengeCount} Challenges +
+
+
+ + {isExpandable && ( +
+ +
+ )} +
+
+ + {isExpanded && ( +
+
+ {regularLessons.length > 0 && ( +
+

+ Lessons +

+
+ {regularLessons.map((lesson, index) => ( +
+ + {lesson.title} +
+ ))} +
+
+ )} + + {challenges.length > 0 && ( +
+

+ Exercises +

+
+ {challenges.map((challenge, index) => ( +
+ {challenge.type === 'challenge' ? ( + + ) : ( + + )} + {challenge.title} +
+ ))} +
+
+ )} +
+
+ )} +
+ ); +} diff --git a/src/components/SQLCourse/CourseAuthor.tsx b/src/components/SQLCourse/CourseAuthor.tsx new file mode 100644 index 000000000..ddc87af4a --- /dev/null +++ b/src/components/SQLCourse/CourseAuthor.tsx @@ -0,0 +1,24 @@ +export function CourseAuthor() { + return ( + + ); +} 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 && ( +
{ + setIsZoomed(false); + setIsExpanded(false); + }} + className="fixed inset-0 z-[999] flex cursor-zoom-out items-center justify-center bg-black bg-opacity-75" + > + {title} +
+ )} +
setIsExpanded(false)} + >
+
+ + {isExpanded && ( +
+

{description}

+ {imgUrl && ( + { + 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" + /> + )} +
+ )} +
+ + ); +} 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 ( +
+ + {isExpanded && ( +
+

{answer}

+
+ )} +
+ ); +} + +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 ( + <> + + +
+ {faqs.map((faq, index) => ( + + ))} +
+ + ); +} 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 ( +
+ {/* Desktop version */} +
+
+

+ Go from Zero to Hero in SQL +

+

+ Get instant access to the course and start learning today +

+
+ + +
+ + {/* Mobile version */} +
+
+

+ Master SQL Today +

+

+ Get instant lifetime access +

+
+ + +
+
+ ); +} diff --git a/src/components/SQLCourse/SQLCoursePage.tsx b/src/components/SQLCourse/SQLCoursePage.tsx new file mode 100644 index 000000000..f9d218d41 --- /dev/null +++ b/src/components/SQLCourse/SQLCoursePage.tsx @@ -0,0 +1,415 @@ +import { + ArrowRightIcon, + ArrowUpDownIcon, + BarChartIcon, + BrainIcon, + ClipboardIcon, + CodeIcon, + DatabaseIcon, + Eye, + FileCheckIcon, + FileQuestionIcon, + GitBranchIcon, + GitMergeIcon, + LayersIcon, + TableIcon, + WrenchIcon, +} from 'lucide-react'; +import { ChapterRow } from './ChapterRow'; +import { CourseFeature } from './CourseFeature'; +import { SectionHeader } from './SectionHeader'; +import { Spotlight } from './Spotlight'; +import { FloatingPurchase } from './FloatingPurchase'; +import { CourseAuthor } from './CourseAuthor'; +import { FAQSection } from './FAQSection'; +import { BuyButton } from './BuyButton'; +import { AccountButton } from './AccountButton'; +import { RoadmapLogoIcon } from '../ReactIcons/RoadmapLogo'; + +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: , + 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: , + 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: , + 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: , + 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: , + 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: , + 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: , + 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: , + 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: , + 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 ( +
+
+ + + + +
+
+ +
+ + Complete Course to Master Practical SQL + + Complete SQL Course +
+ +

+ Master SQL Queries +
+ From Basic to Advanced +
+

+ +

+ A structured course to master database querying - perfect for + developers, data analysts, and anyone working with data. +

+ +
+
+ + 55+ Lessons +
+
+ + 100+ Challenges +
+
+ + Integrated IDE +
+
+ + AI Tutor +
+
+ +
+ +
+
+ + + +
+
+ + + + + + +
+
+ +
+

+ Oh, and you get the{' '} + + lifetime access + {' '} + to the course including all the future updates. Also, there is a + certificate of completion which you can share with your potential + employers. +

+
+ + + +
+ {chapters.map((chapter, index) => ( + + ))} +
+ + +

+ 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. +

+

+ I am also the creator of{' '} + + roadmap.sh + + , a platform trusted by millions of developers to guide their + learning journeys. I love to simplify complex topics and make + learning practical and accessible. +

+

+ 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. +

+
+ } + /> + + + + + + +
+ ); +} 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 ( +
+
+
+
+ {title} +
+
+
+
+ {typeof description === 'string' ? ( +

{description}

+ ) : ( + description + )} +
+ ); +} 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 ( + + + + + + + + + + + + + ); +} 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/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/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro index 643b97b3e..99af4ad4c 100644 --- a/src/layouts/BaseLayout.astro +++ b/src/layouts/BaseLayout.astro @@ -167,7 +167,6 @@ const gaPageIdentifier = Astro.url.pathname - 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/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/jwt.ts b/src/lib/jwt.ts index 1d3aaa0af..8822308c7 100644 --- a/src/lib/jwt.ts +++ b/src/lib/jwt.ts @@ -3,6 +3,7 @@ import Cookies from 'js-cookie'; import type { AllowedOnboardingStatus } from '../api/user'; export const TOKEN_COOKIE_NAME = '__roadmapsh_jt__'; +export const COURSE_PURCHASE_PARAM = 't'; export type TokenPayload = { id: string; diff --git a/src/lib/number.ts b/src/lib/number.ts index 9f3b2938a..d686a5934 100644 --- a/src/lib/number.ts +++ b/src/lib/number.ts @@ -9,3 +9,15 @@ 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`; +} diff --git a/src/pages/courses/sql.astro b/src/pages/courses/sql.astro new file mode 100644 index 000000000..7d230ea73 --- /dev/null +++ b/src/pages/courses/sql.astro @@ -0,0 +1,16 @@ +--- +import { SQLCoursePage } from '../../components/SQLCourse/SQLCoursePage.tsx'; +import SkeletonLayout from '../../layouts/SkeletonLayout.astro'; +--- + + + + diff --git a/src/pages/devops/career-path.astro b/src/pages/devops/career-path.astro index f021b4a39..592f9ea57 100644 --- a/src/pages/devops/career-path.astro +++ b/src/pages/devops/career-path.astro @@ -19,8 +19,8 @@ const ogImageUrl = ---
+ diff --git a/src/pages/index.astro b/src/pages/index.astro index 8c2151b9d..8a8e52ecb 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -9,6 +9,7 @@ import { getAllGuides } from '../lib/guide'; import { getRoadmapsByTag } from '../lib/roadmap'; import { getAllVideos } from '../lib/video'; import { getAllQuestionGroups } from '../lib/question-group'; +import ChangelogBanner from '../components/ChangelogBanner.astro'; const roleRoadmaps = await getRoadmapsByTag('role-roadmap'); const skillRoadmaps = await getRoadmapsByTag('skill-roadmap'); @@ -23,7 +24,7 @@ const projectGroups = [ title: 'Backend', id: 'backend', }, -] +]; const guides = await getAllGuides(); const questionGuides = (await getAllQuestionGroups()).filter( @@ -107,4 +108,5 @@ const videos = await getAllVideos();
+ 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'; --- + diff --git a/src/queries/billing.ts b/src/queries/billing.ts new file mode 100644 index 000000000..ab42ef295 --- /dev/null +++ b/src/queries/billing.ts @@ -0,0 +1,25 @@ +import { queryOptions } from '@tanstack/react-query'; +import { httpGet } from '../lib/query-http'; + +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( + `/v1-course-price/${params.courseSlug}`, + ); + }, + }); +} \ No newline at end of file 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( + `/v1-course-progress/${courseSlug}`, + ); + }, + enabled: !!isLoggedIn(), + }); +} diff --git a/src/styles/global.css b/src/styles/global.css index f410f3380..ab2e901cb 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,20 @@ 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; +} + @keyframes barberpole { 100% { background-position: 100% 100%; } -} +} \ 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: { From 1af013d5f88f63422c1238af44a194558354c6f2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2025 22:12:16 +0600 Subject: [PATCH 52/53] chore: update roadmap content json (#8121) Co-authored-by: kamranahmedse <4921183+kamranahmedse@users.noreply.github.com> --- public/roadmap-content/data-analyst.json | 215 +++++++++++++++-------- public/roadmap-content/php.json | 10 +- public/roadmap-content/python.json | 5 + 3 files changed, 151 insertions(+), 79 deletions(-) diff --git a/public/roadmap-content/data-analyst.json b/public/roadmap-content/data-analyst.json index b9763e2ae..093ba49ea 100644 --- a/public/roadmap-content/data-analyst.json +++ b/public/roadmap-content/data-analyst.json @@ -6,12 +6,18 @@ }, "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": "article" + } + ] }, "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", @@ -72,12 +78,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 +131,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 +163,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 +229,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", @@ -407,17 +413,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 +458,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 +495,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 +503,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 +519,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 +535,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 +548,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 +599,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 +610,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 +623,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", @@ -643,7 +677,7 @@ }, "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 +696,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 +712,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 +824,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 +840,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 +851,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 +926,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 +942,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 +958,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 +974,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 +1006,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 +1038,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 +1086,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 +1102,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 +1118,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 +1131,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 +1206,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 +1246,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 +1262,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 +1326,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 +1339,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 +1417,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 +1438,7 @@ "type": "opensource" }, { - "title": "Apache Spark Website", + "title": "Apache Spark", "url": "https://spark.apache.org/", "type": "article" } @@ -1421,15 +1478,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 +1524,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 +1540,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 +1561,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 +1582,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 +1614,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/php.json b/public/roadmap-content/php.json index 6e4442e8a..6658f1e3a 100644 --- a/public/roadmap-content/php.json +++ b/public/roadmap-content/php.json @@ -712,14 +712,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 \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 \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", diff --git a/public/roadmap-content/python.json b/public/roadmap-content/python.json index ea2ef8a83..cd500f4d7 100644 --- a/public/roadmap-content/python.json +++ b/public/roadmap-content/python.json @@ -616,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" } ] }, From 0bef28fa209ce6e875fac6d0af3bc2770073cc2e Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Mon, 27 Jan 2025 16:13:08 +0000 Subject: [PATCH 53/53] Update flag issue --- src/components/SQLCourse/BuyButton.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/SQLCourse/BuyButton.tsx b/src/components/SQLCourse/BuyButton.tsx index 7112c8b1b..db99b03f6 100644 --- a/src/components/SQLCourse/BuyButton.tsx +++ b/src/components/SQLCourse/BuyButton.tsx @@ -195,7 +195,10 @@ export function BuyButton(props: BuyButtonProps) { ) : ( - {coursePricing?.flag} Buy Now ${coursePricing?.regionalPrice} + {coursePricing?.flag && coursePricing.isEligibleForDiscount + ? coursePricing.flag + : null}{' '} + Buy Now ${coursePricing?.regionalPrice} )}