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

pierrejeambrun pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 38977c2f70 Generate providers requirements based on 
provider_metadata.json (#34698)
38977c2f70 is described below

commit 38977c2f70ef5f8d986594f6ecd1dc824831e4c6
Author: Pierre Jeambrun <[email protected]>
AuthorDate: Tue Oct 3 02:00:59 2023 +0200

    Generate providers requirements based on provider_metadata.json (#34698)
    
    Co-authored-by: Hussein Awala <[email protected]>
---
 .../src/airflow_breeze/commands/sbom_commands.py   | 63 +++++++++++++-----
 .../commands/sbom_commands_config.py               |  1 +
 dev/breeze/src/airflow_breeze/utils/cdxgen.py      | 19 +++++-
 images/breeze/output-commands-hash.txt             |  4 +-
 ...output_sbom_generate-providers-requirements.svg | 74 ++++++++++------------
 5 files changed, 100 insertions(+), 61 deletions(-)

diff --git a/dev/breeze/src/airflow_breeze/commands/sbom_commands.py 
b/dev/breeze/src/airflow_breeze/commands/sbom_commands.py
index c89b9fdfbd..cefa82cff5 100644
--- a/dev/breeze/src/airflow_breeze/commands/sbom_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/sbom_commands.py
@@ -17,6 +17,7 @@
 
 from __future__ import annotations
 
+import json
 from pathlib import Path
 
 import click
@@ -45,12 +46,13 @@ from airflow_breeze.utils.common_options import (
     option_skip_cleanup,
     option_verbose,
 )
+from airflow_breeze.utils.confirm import Answer, user_confirm
 from airflow_breeze.utils.console import get_console
 from airflow_breeze.utils.custom_param_types import BetterChoice
 from airflow_breeze.utils.docker_command_utils import 
perform_environment_checks
 from airflow_breeze.utils.github import get_active_airflow_versions
 from airflow_breeze.utils.parallel import ShowLastLineProgressMatcher, 
check_async_run_results, run_with_pool
-from airflow_breeze.utils.path_utils import AIRFLOW_TMP_DIR_PATH
+from airflow_breeze.utils.path_utils import AIRFLOW_TMP_DIR_PATH, 
PROVIDER_METADATA_JSON_FILE_PATH
 from airflow_breeze.utils.shared_options import get_dry_run
 
 
@@ -248,7 +250,7 @@ def update_sbom_information(
 @click.option(
     "--provider-id",
     type=BetterChoice(list(PROVIDER_DEPENDENCIES.keys())),
-    required=True,
+    required=False,
     help="Provider to generate the requirements for",
     multiple=True,
 )
@@ -260,6 +262,11 @@ def update_sbom_information(
 @option_debug_resources
 @option_include_success_outputs
 @option_skip_cleanup
[email protected](
+    "--force",
+    is_flag=True,
+    help="Force update providers requirements even if they already exist.",
+)
 def generate_providers_requirements(
     airflow_version: str | None,
     python: str,
@@ -269,19 +276,41 @@ def generate_providers_requirements(
     debug_resources: bool,
     include_success_outputs: bool,
     skip_cleanup: bool,
+    force: bool,
 ):
-    provider_ids = provider_id
     perform_environment_checks()
-    if airflow_version is None:
-        airflow_version = get_active_airflow_versions(confirm=False)[-1]
-        get_console().print(f"[info]Using {airflow_version} as airflow 
version")
+
+    provider_ids = provider_id
+    if len(provider_ids) == 0:
+        user_confirm(
+            "You are about to generate all providers requirements based on the 
"
+            "`provider_metadata.json` file (for all releases). Do you want to 
proceed?",
+            quit_allowed=False,
+            default_answer=Answer.YES,
+        )
+        with open(PROVIDER_METADATA_JSON_FILE_PATH) as f:
+            provider_metadata = json.load(f)
+            providers_info = [
+                (p_id, p_version, info["associated_airflow_version"])
+                for (p_id, p_versions) in provider_metadata.items()
+                for (p_version, info) in p_versions.items()
+            ]
+    else:
+        if airflow_version is None:
+            airflow_version = get_active_airflow_versions(confirm=False)[-1]
+            get_console().print(f"[info]Using {airflow_version} as airflow 
version")
+        providers_info = [(provider_id, None, airflow_version) for provider_id 
in provider_ids]
+
     build_all_airflow_versions_base_image(python_version=python)
 
     if run_in_parallel:
-        parallelism = min(parallelism, len(provider_ids))
-        get_console().print(f"[info]Running {len(provider_ids)} jobs in 
parallel")
-        with ci_group(f"Generating provider requirements for {provider_ids}"):
-            all_params = [f"Generate provider requirements for {p_id}" for 
p_id in provider_ids]
+        parallelism = min(parallelism, len(providers_info))
+        get_console().print(f"[info]Running {len(providers_info)} jobs in 
parallel")
+        with ci_group(f"Generating provider requirements for 
{providers_info}"):
+            all_params = [
+                f"Generate provider requirements for {p_id} version 
{p_version}"
+                for (p_id, p_version, _) in providers_info
+            ]
             with run_with_pool(
                 parallelism=parallelism,
                 all_params=all_params,
@@ -293,12 +322,13 @@ def generate_providers_requirements(
                         get_requirements_for_provider,
                         kwds={
                             "provider_id": p_id,
-                            "provider_version": None,
-                            "airflow_version": airflow_version,
+                            "provider_version": p_version,
+                            "airflow_version": a_version,
                             "python_version": python,
+                            "force": force,
                         },
                     )
-                    for index, p_id in enumerate(provider_ids)
+                    for (p_id, p_version, a_version) in providers_info
                 ]
         check_async_run_results(
             results=results,
@@ -308,10 +338,11 @@ def generate_providers_requirements(
             skip_cleanup=skip_cleanup,
         )
     else:
-        for p_id in provider_ids:
+        for p_id, p_version, a_version in providers_info:
             get_requirements_for_provider(
                 provider_id=p_id,
-                provider_version=None,
-                airflow_version=airflow_version,
+                provider_version=p_version,
+                airflow_version=a_version,
                 python_version=python,
+                force=force,
             )
diff --git a/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py 
b/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py
index dc01bbc3ed..763b133cf3 100644
--- a/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py
@@ -54,6 +54,7 @@ SBOM_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] 
= {
                 "--airflow-version",
                 "--python",
                 "--provider-id",
+                "--force",
             ],
         },
         {
diff --git a/dev/breeze/src/airflow_breeze/utils/cdxgen.py 
b/dev/breeze/src/airflow_breeze/utils/cdxgen.py
index 2f75411e42..d329069872 100644
--- a/dev/breeze/src/airflow_breeze/utils/cdxgen.py
+++ b/dev/breeze/src/airflow_breeze/utils/cdxgen.py
@@ -136,6 +136,7 @@ def get_requirements_for_provider(
     airflow_version: str,
     provider_version: str | None = None,
     python_version: str = DEFAULT_PYTHON_MAJOR_MINOR_VERSION,
+    force: bool = False,
 ) -> tuple[int, str]:
     provider_path_array = provider_id.split(".")
     if not provider_version:
@@ -148,6 +149,21 @@ def get_requirements_for_provider(
         
f"provider-{provider_id}-{provider_version}-with-airflow-requirements.txt"
     )
     provider_file_name = 
f"provider-{provider_id}-{provider_version}-without-airflow-requirements.txt"
+    target_dir = FILES_DIR / TARGET_DIR_NAME
+    airflow_file = target_dir / airflow_file_name
+    provider_with_airflow_file = target_dir / provider_with_airflow_file_name
+
+    if os.path.exists(airflow_file) and 
os.path.exists(provider_with_airflow_file) and force is False:
+        get_console().print(
+            f"[warning] Requirements for provider {provider_id} version 
{provider_version} already exist, "
+            f"skipping. Set force=True to force generation."
+        )
+        return (
+            0,
+            f"Provider requirements already existed, skipped generation for 
{provider_id} version "
+            f"{provider_version}",
+        )
+
     command = f"""
 mkdir -pv {DOCKER_FILE_PREFIX}
 /opt/airflow/airflow-{airflow_version}/bin/pip freeze | sort > 
{DOCKER_FILE_PREFIX}{airflow_file_name}
@@ -173,9 +189,6 @@ chown --recursive {os.getuid()}:{os.getgid()} 
{DOCKER_FILE_PREFIX}
             ";".join(command.splitlines()[1:-1]),
         ]
     )
-    target_dir = FILES_DIR / TARGET_DIR_NAME
-    airflow_file = target_dir / airflow_file_name
-    provider_with_airflow_file = target_dir / provider_with_airflow_file_name
     get_console().print(f"[info]Airflow requirements in {airflow_file}")
     get_console().print(f"[info]Provider requirements in 
{provider_with_airflow_file}")
     base_packages = {package.split("==")[0] for package in 
airflow_file.read_text().splitlines()}
diff --git a/images/breeze/output-commands-hash.txt 
b/images/breeze/output-commands-hash.txt
index ab98660bf1..a13a0f4347 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -52,9 +52,9 @@ 
release-management:start-release:419f48f6a4ff4457cb9de7ff496aebbe
 release-management:update-constraints:02ec4b119150e3fdbac52026e94820ef
 release-management:verify-provider-packages:96dce5644aad6b37080acf77b3d8de3a
 release-management:885a5fe8a39a3773011cf1f9bd2983ad
-sbom:generate-providers-requirements:671f7da791b6ffde8df91e2bcdf4ec52
+sbom:generate-providers-requirements:f8328b801efa7908d5b14b25a0097c4d
 sbom:update-sbom-information:653be48be70b4b7ff5172d491aadc694
-sbom:d9b5533a533ef67f88b1b40b7c7b1c87
+sbom:104afc4ac8c007dcd99218d1b040047e
 setup:autocomplete:fffcd49e102e09ccd69b3841a9e3ea8e
 setup:check-all-params-in-groups:7aa55fa1b0f17a6f7b7ca225c6b82574
 setup:config:fd32471ee31894decf91984615771add
diff --git a/images/breeze/output_sbom_generate-providers-requirements.svg 
b/images/breeze/output_sbom_generate-providers-requirements.svg
index 46b6740f12..e9f8758c46 100644
--- a/images/breeze/output_sbom_generate-providers-requirements.svg
+++ b/images/breeze/output_sbom_generate-providers-requirements.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 952.8" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 928.4" 
xmlns="http://www.w3.org/2000/svg";>
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -38,14 +38,12 @@
 .breeze-sbom-generate-providers-requirements-r4 { fill: #868887 }
 .breeze-sbom-generate-providers-requirements-r5 { fill: #68a0b3;font-weight: 
bold }
 .breeze-sbom-generate-providers-requirements-r6 { fill: #8d7b39 }
-.breeze-sbom-generate-providers-requirements-r7 { fill: #cc555a }
-.breeze-sbom-generate-providers-requirements-r8 { fill: #8a4346 }
-.breeze-sbom-generate-providers-requirements-r9 { fill: #98a84b;font-weight: 
bold }
+.breeze-sbom-generate-providers-requirements-r7 { fill: #98a84b;font-weight: 
bold }
     </style>
 
     <defs>
     <clipPath id="breeze-sbom-generate-providers-requirements-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="901.8" />
+      <rect x="0" y="0" width="1463.0" height="877.4" />
     </clipPath>
     <clipPath id="breeze-sbom-generate-providers-requirements-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -152,12 +150,9 @@
 <clipPath id="breeze-sbom-generate-providers-requirements-line-34">
     <rect x="0" y="831.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="breeze-sbom-generate-providers-requirements-line-35">
-    <rect x="0" y="855.5" width="1464" height="24.65"/>
-            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="950.8" rx="8"/><text 
class="breeze-sbom-generate-providers-requirements-title" fill="#c5c8c6" 
text-anchor="middle" x="740" 
y="27">Command:&#160;sbom&#160;generate-providers-requirements</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="926.4" rx="8"/><text 
class="breeze-sbom-generate-providers-requirements-title" fill="#c5c8c6" 
text-anchor="middle" x="740" 
y="27">Command:&#160;sbom&#160;generate-providers-requirements</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -173,37 +168,36 @@
 </text><text class="breeze-sbom-generate-providers-requirements-r2" x="12.2" 
y="93.2" textLength="536.8" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-3)">Generate&#160;requirements&#160;for&#160;selected&#160;provider.</text><text
 class="breeze-sbom-generate-providers-requirements-r2" x="1464" y="93.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-3)">
 </text><text class="breeze-sbom-generate-providers-requirements-r2" x="1464" 
y="117.6" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-4)">
 </text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="142" textLength="24.4" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-5)">╭─</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="142" 
textLength="463.6" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-5)">&#160;Generate&#160;provider&#160;requirements&#160;flags&#160;</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="488" y="142" t [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="166.4" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-6)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="61" y="166.4" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-6)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="73.2" y="166.4" 
textLength="97.6" clip-path="url(#breeze-sbom-generate-provi [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="190.8" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-7)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="61" y="190.8" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-7)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="73.2" y="190.8" 
textLength="85.4" clip-path="url(#breeze-sbom-generate-provi [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="215.2" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-8)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r7" x="24.4" y="215.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-8)">*</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="61" y="215.2" 
textLength="12.2" clip-path="url(#breeze-sbom-generate-provi [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="239.6" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-9)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="317.2" y="239.6" 
textLength="1122.4" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-9)">(airbyte&#160;|&#160;alibaba&#160;|&#160;amazon&#160;|&#160;apache.beam&#160;|&#160;apache.cassandra&#160;|&#160;apache.drill&#160;|&#160;apach
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="264" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-10)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="317.2" y="264" 
textLength="1122.4" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-10)">apache.flink&#160;|&#160;apache.hdfs&#160;|&#160;apache.hive&#160;|&#160;apache.impala&#160;|&#160;apache.kafka&#160;|&#160;apache.kylin&#160;|&#
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="288.4" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-11)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="317.2" y="288.4" 
textLength="1122.4" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-11)">apache.livy&#160;|&#160;apache.pig&#160;|&#160;apache.pinot&#160;|&#160;apache.spark&#160;|&#160;apache.sqoop&#160;|&#160;apprise&#160;|&#160
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="312.8" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-12)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="317.2" y="312.8" 
textLength="1122.4" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-12)">asana&#160;|&#160;atlassian.jira&#160;|&#160;celery&#160;|&#160;cloudant&#160;|&#160;cncf.kubernetes&#160;|&#160;common.sql&#160;|&#160;daske
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="337.2" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-13)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="317.2" y="337.2" 
textLength="1122.4" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-13)">databricks&#160;|&#160;datadog&#160;|&#160;dbt.cloud&#160;|&#160;dingding&#160;|&#160;discord&#160;|&#160;docker&#160;|&#160;elasticsearch&#1
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="361.6" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-14)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="317.2" y="361.6" 
textLength="1122.4" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-14)">facebook&#160;|&#160;ftp&#160;|&#160;github&#160;|&#160;google&#160;|&#160;grpc&#160;|&#160;hashicorp&#160;|&#160;http&#160;|&#160;imap&#160;
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="386" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-15)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="317.2" y="386" 
textLength="1122.4" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-15)">jenkins&#160;|&#160;microsoft.azure&#160;|&#160;microsoft.mssql&#160;|&#160;microsoft.psrp&#160;|&#160;microsoft.winrm&#160;|&#160;mongo&#160;|&#
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="410.4" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-16)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="317.2" y="410.4" 
textLength="1122.4" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-16)">mysql&#160;|&#160;neo4j&#160;|&#160;odbc&#160;|&#160;openfaas&#160;|&#160;openlineage&#160;|&#160;opsgenie&#160;|&#160;oracle&#160;|&#160;pag
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="434.8" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-17)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="317.2" y="434.8" 
textLength="1122.4" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-17)">plexus&#160;|&#160;postgres&#160;|&#160;presto&#160;|&#160;redis&#160;|&#160;salesforce&#160;|&#160;samba&#160;|&#160;segment&#160;|&#160;sen
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="459.2" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-18)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="317.2" y="459.2" 
textLength="1122.4" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-18)">singularity&#160;|&#160;slack&#160;|&#160;smtp&#160;|&#160;snowflake&#160;|&#160;sqlite&#160;|&#160;ssh&#160;|&#160;tableau&#160;|&#160;tabul
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="483.6" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-19)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="317.2" y="483.6" 
textLength="1122.4" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-19)">|&#160;vertica&#160;|&#160;yandex&#160;|&#160;zendesk)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="508" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-20)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r8" x="317.2" y="508" 
textLength="1122.4" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-20)">[required]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="532.4" textLength="1464" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-21)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-generate-providers-requirements-r2" x="1464" y="532.4" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-21)">
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="556.8" textLength="24.4" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-22)">╭─</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="556.8" 
textLength="219.6" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-22)">&#160;Parallel&#160;running&#160;</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="244" y="556.8" 
textLength="1195.6" cli [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="581.2" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-23)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="581.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-23)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="581.2" 
textLength="48.8" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="605.6" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-24)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="605.6" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-24)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="605.6" 
textLength="146.4" clip-path="url(#breeze-sbom-generate- [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="630" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-25)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="378.2" y="630" 
textLength="915" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-25)">(INTEGER&#160;RANGE)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="654.4" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-26)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="378.2" y="654.4" 
textLength="915" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-26)">[default:&#160;4;&#160;1&lt;=x&lt;=8]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="678.8" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-27)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="678.8" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-27)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="678.8" 
textLength="61" clip-path="url(#breeze-sbom-generate-pro [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="703.2" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-28)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="703.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-28)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="703.2" 
textLength="73.2" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="727.6" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-29)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="727.6" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-29)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="727.6" 
textLength="97.6" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="752" textLength="1464" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-30)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-generate-providers-requirements-r2" x="1464" y="752" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-30)">
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="776.4" textLength="24.4" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-31)">╭─</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="776.4" 
textLength="195.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-31)">&#160;Common&#160;options&#160;</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="219.6" y="776.4" 
textLength="1220" clip- [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="800.8" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-32)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="800.8" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-32)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="800.8" 
textLength="97.6" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="825.2" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-33)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="825.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-33)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="825.2" 
textLength="48.8" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="849.6" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-34)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="849.6" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-34)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="849.6" 
textLength="85.4" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="874" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-35)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="874" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-35)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="874" 
textLength="61" clip-path="url(#breeze-sbom-generate-providers [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="898.4" textLength="1464" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-36)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-generate-providers-requirements-r2" x="1464" y="898.4" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-36)">
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="166.4" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-6)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="166.4" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-6)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="166.4" 
textLength="97.6" clip-path="url(#breeze-sbom-generate-pro [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="190.8" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-7)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="190.8" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-7)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="190.8" 
textLength="85.4" clip-path="url(#breeze-sbom-generate-pro [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="215.2" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-8)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="215.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-8)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="215.2" 
textLength="109.8" clip-path="url(#breeze-sbom-generate-pr [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="239.6" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-9)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="239.6" 
textLength="1159" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-9)">(airbyte&#160;|&#160;alibaba&#160;|&#160;amazon&#160;|&#160;apache.beam&#160;|&#160;apache.cassandra&#160;|&#160;apache.drill&#160;|&#160;apache.
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="264" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-10)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="264" 
textLength="1159" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-10)">apache.flink&#160;|&#160;apache.hdfs&#160;|&#160;apache.hive&#160;|&#160;apache.impala&#160;|&#160;apache.kafka&#160;|&#160;apache.kylin&#160;|&#16
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="288.4" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-11)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="288.4" 
textLength="1159" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-11)">apache.livy&#160;|&#160;apache.pig&#160;|&#160;apache.pinot&#160;|&#160;apache.spark&#160;|&#160;apache.sqoop&#160;|&#160;apprise&#160;|&#160;a
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="312.8" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-12)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="312.8" 
textLength="1159" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-12)">asana&#160;|&#160;atlassian.jira&#160;|&#160;celery&#160;|&#160;cloudant&#160;|&#160;cncf.kubernetes&#160;|&#160;common.sql&#160;|&#160;daskexe
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="337.2" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-13)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="337.2" 
textLength="1159" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-13)">databricks&#160;|&#160;datadog&#160;|&#160;dbt.cloud&#160;|&#160;dingding&#160;|&#160;discord&#160;|&#160;docker&#160;|&#160;elasticsearch&#160
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="361.6" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-14)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="361.6" 
textLength="1159" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-14)">facebook&#160;|&#160;ftp&#160;|&#160;github&#160;|&#160;google&#160;|&#160;grpc&#160;|&#160;hashicorp&#160;|&#160;http&#160;|&#160;imap&#160;|&
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="386" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-15)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="386" 
textLength="1159" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-15)">microsoft.azure&#160;|&#160;microsoft.mssql&#160;|&#160;microsoft.psrp&#160;|&#160;microsoft.winrm&#160;|&#160;mongo&#160;|&#160;mysql&#160;|&#160;
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="410.4" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-16)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="410.4" 
textLength="1159" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-16)">odbc&#160;|&#160;openfaas&#160;|&#160;openlineage&#160;|&#160;opsgenie&#160;|&#160;oracle&#160;|&#160;pagerduty&#160;|&#160;papermill&#160;|&#1
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="434.8" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-17)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="434.8" 
textLength="1159" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-17)">presto&#160;|&#160;redis&#160;|&#160;salesforce&#160;|&#160;samba&#160;|&#160;segment&#160;|&#160;sendgrid&#160;|&#160;sftp&#160;|&#160;singula
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="459.2" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-18)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="459.2" 
textLength="1159" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-18)">snowflake&#160;|&#160;sqlite&#160;|&#160;ssh&#160;|&#160;tableau&#160;|&#160;tabular&#160;|&#160;telegram&#160;|&#160;trino&#160;|&#160;vertica
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="483.6" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-19)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="483.6" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-19)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="483.6" 
textLength="73.2" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="508" textLength="1464" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-20)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-generate-providers-requirements-r2" x="1464" y="508" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-20)">
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="532.4" textLength="24.4" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-21)">╭─</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="532.4" 
textLength="219.6" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-21)">&#160;Parallel&#160;running&#160;</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="244" y="532.4" 
textLength="1195.6" cli [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="556.8" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-22)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="556.8" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-22)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="556.8" 
textLength="48.8" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="581.2" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-23)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="581.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-23)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="581.2" 
textLength="146.4" clip-path="url(#breeze-sbom-generate- [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="605.6" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-24)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="378.2" y="605.6" 
textLength="915" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-24)">(INTEGER&#160;RANGE)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="630" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-25)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="378.2" y="630" 
textLength="915" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-25)">[default:&#160;4;&#160;1&lt;=x&lt;=8]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="654.4" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-26)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="654.4" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-26)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="654.4" 
textLength="61" clip-path="url(#breeze-sbom-generate-pro [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="678.8" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-27)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="678.8" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-27)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="678.8" 
textLength="73.2" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="703.2" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-28)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="703.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-28)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="703.2" 
textLength="97.6" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="727.6" textLength="1464" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-29)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-generate-providers-requirements-r2" x="1464" y="727.6" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-29)">
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="752" textLength="24.4" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-30)">╭─</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="752" 
textLength="195.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-30)">&#160;Common&#160;options&#160;</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="219.6" y="752" 
textLength="1220" clip-path=" [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="776.4" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-31)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="776.4" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-31)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="776.4" 
textLength="97.6" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="800.8" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-32)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="800.8" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-32)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="800.8" 
textLength="48.8" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="825.2" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-33)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="825.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-33)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="825.2" 
textLength="85.4" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="849.6" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-34)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="849.6" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-34)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="36.6" y="849.6" 
textLength="61" clip-path="url(#breeze-sbom-generate-pro [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r4" x="0" 
y="874" textLength="1464" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-35)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-generate-providers-requirements-r2" x="1464" y="874" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-35)">
 </text>
     </g>
     </g>


Reply via email to