---
title: "Pipeline Bootstrapper"
description: "Authenticate the log10x account and launch a target pipeline"
source: "https://github.com/log-10x/modules/tree/main/pipelines/shared/units/bootstrap/unit.yaml"
icon: "material/launch"

---
Authenticates the log10x account, validates launch arguments, and starts the specified pipeline ([run](https://doc.log10x.com/run/), [compile](https://doc.log10x.com/compile/)).

## :material-wrench-outline: Config Files

To configure the Pipeline Bootstrapper unit, [:material-cog: Edit](https://doc.log10x.com/config/app/#module-config "Learn how to edit app and module configurations") these files:
??? tenx-run "Run"

    <a id="run"></a>
    ### Run {.hidden-heading}

    Launch a [run pipeline](https://doc.log10x.com/run "run pipeline") to report, receive and optimize log/trace events in edge and cloud environments.

    Below is the default configuration from: [bootstrap/config.yaml](https://github.dev/log-10x/config/blob/main/pipelines/pipelines/run/bootstrap/config.yaml "bootstrap/config.yaml"){target="\_blank"}.  
  
    <div class="edit-options">
        <a class="md-button tenx-edit-online-button" data-tooltip="Edit online on github.dev" href="https://github.dev/log-10x/config/blob/main/pipelines/pipelines/run/bootstrap/config.yaml" target="_blank" rel="noopener noreferrer">
            <span class="twemoji" style="margin-right: 0.3rem;">
                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                    <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path>
                </svg>
            </span> Edit Online
        </a>
        <button class="md-button tenx-config.yaml0-edit-button" data-tooltip="Edit configuration file" data-dialog-id="config-yaml0-dialog">
            <span style="margin-right: 0.3rem;">
                <span class="twemoji">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                        <path d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                    </svg>
                </span>
            </span>Edit Locally
        </button>
    </div>
    
    <dialog id="config-yaml0-dialog" class="md-dialog md-dialog--editor">
        <div class="editor-dialog-wrapper">
            <div class="editor-dialog-header">
                <span class="editor-dialog-title">Edit Pipeline Bootstrapper Config Locally</span>
                <div class="editor-header-actions">
                    <button class="editor-toolbar-btn yaml-editor-locations" data-tooltip="Save">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-reset" data-tooltip="Reset to default">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M12.5 8c-2.65 0-5.05 1-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-copy" data-tooltip="Copy to clipboard">
                        <svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path></svg>
                        <svg class="icon-check" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn yaml-editor-fullscreen" data-tooltip="Fullscreen">
                        <svg class="icon-maximize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5,5H10V7H7V10H5V5M14,5H19V10H17V7H14V5M17,14H19V19H14V17H17V14M10,17V19H5V14H7V17H10Z"></path></svg>
                        <svg class="icon-minimize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M5,16H8V19H10V14H5V16M14,14V19H16V16H19V14H14M16,5V8H19V10H14V5H16M10,5V10H5V8H8V5H10Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn editor-dialog-close" onclick="closeDialog('config-yaml0-dialog')" data-tooltip="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path></svg>
                    </button>
                </div>
            </div>
            <div class="editor-dialog-content">
                <div class="yaml-editor-container"></div>
            </div>
            <div class="yaml-editor-statusbar">
                <span class="yaml-editor-status"></span>
            </div>
        </div>
        <!-- Locations Popup -->
        <div class="locations-popup" style="display: none;">
            <div class="locations-popup-content">
                <div class="locations-popup-header">
                    <span class="locations-header-label">Download and save to:</span>
                    <button class="locations-popup-close" aria-label="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
                            <path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path>
                        </svg>
                    </button>
                </div>
                <ul class="locations-list">
                    <li>
                        <span class="location-label">Linux / Docker / macOS
                            <span class="help-icon" data-tooltip="Default system location. The engine automatically reads configs from here at startup. Best for production deployments.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="default-path location-path" data-tooltip=""
                                data-copy-osx="/etc/log10x/config/run/bootstrap/config.yaml"
                                data-copy-nix="/etc/log10x/config/run/bootstrap/config.yaml"
                                data-copy-win="C:\log10x\configs/run/bootstrap/config.yaml"></code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Custom directory
                            <span class="help-icon" data-tooltip="Set TENX_CONFIG environment variable to point to a custom config directory. Useful when you want configs in a non-standard location.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="$TENX_CONFIG/run/bootstrap/config.yaml">$TENX_CONFIG/run/bootstrap/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Within cloned repo
                            <span class="help-icon" data-tooltip="First run: git clone github.com/log-10x/config. Then save the file to this path within the cloned folder. Use for version control.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="./pipelines/run/bootstrap/config.yaml">./pipelines/run/bootstrap/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                </ul>
                <div class="locations-popup-footer">
                    <button class="locations-download-btn" title="Download config file">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                            <path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path>
                        </svg>
                        <span>Download</span>
                    </button>
                </div>
            </div>
        </div>
    </dialog>
    
    <template class="tenx-config-schema" data-encoding="base64">ewogICJ0eXBlIiA6ICJvYmplY3QiLAogICJwcm9wZXJ0aWVzIiA6IHsKICAgICJ0ZW54IiA6IHsKICAgICAgInR5cGUiIDogWwogICAgICAgICJzdHJpbmciLAogICAgICAgICJudWxsIgogICAgICBdLAogICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTmFtZSBvZiBwaXBlbGluZSB0byBleGVjdXRlXG5cblRhcmdldCBbcGlwZWxpbmVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vZW5naW5lL3BpcGVsaW5lLykgdG8gZXhlY3V0ZS4gRm9yIGV4YW1wbGUsIHRvIHNwZWNpZnkgdGhlIFtydW5dKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuLykgcGlwZWxpbmUgYW5kIGEgW1lBTUxdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vY29uZmlnL3lhbWwvKSBjb25maWcgZmlsZSBjb250YWluaW5nIGxhdW5jaCBhcmd1bWVudHMsIHVzZTogIGBgYCBjb25zb2xlICQgdGVueCBydW4gQH4vbXkueWFtbCBgYGAgVGhlIFlBTUwgZmlsZSBtYXkgc3BlY2lmeSB0aGUgcGlwZWxpbmUgbmFtZSB2aWEgYSAndGVueCcgZW50cnksIGFsbG93aW5nIHRoZSAncGlwZWxpbmUnIGFyZ3VtZW50IHRvIGJlIG9taXR0ZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiAgRm9yIGV4YW1wbGUgKG15LnlhbWwpOiAgYGBgIHlhbWwgdGVueDogcnVuICMgc2V0IHRoZSBwaXBlbGluZSB0byAncnVuJyBsaWNlbnNlS2V5OiA8bXktbGljZW5zZS1qd3Q+IC4uLiBgYGAgIEFsbG93cyBmb3IgbGF1bmNoaW5nIHRoZSBydW4gcGlwZWxpbmUgdmlhOiBgYGAgY29uc29sZSAkIHRlbnggQH4vbXkueWFtbCBgYGAiCiAgICB9LAogICAgImxpY2Vuc2UiIDogewogICAgICAidHlwZSIgOiAib2JqZWN0IiwKICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlLAogICAgICAicHJvcGVydGllcyIgOiB7CiAgICAgICAgImZpbGUiIDogewogICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlBhdGggdG8gYSBmaWxlIGNvbnRhaW5pbmcgdGhlIDEweCBsaWNlbnNlIEpXVFxuXG5QYXRoIHRvIGEgZmlsZSBjb250YWluaW5nIHRoZSBzaWduZWQgMTB4IGxpY2Vuc2UgSldULiBQcmVmZXJyZWQgb3ZlciBgbGljZW5zZUtleWAgZm9yIHByb2R1Y3Rpb246IHRoZSB0b2tlbiBpcyBub3QgdmlzaWJsZSBpbiBgcHNgIG91dHB1dCBhbmQgaXMgZWFzeSB0byByb3RhdGUgYnkgcmVwbGFjaW5nIHRoZSBmaWxlLiAgV2l0aG91dCBhIGxpY2Vuc2UgdGhlIGVuZ2luZSBydW5zIG9uIHRoZSBidWlsdC1pbiAzMC1kYXkgZXZhbHVhdGlvbiBsaWNlbnNlLiBTZWUgW2xpY2Vuc2luZ10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9tYW5hZ2UvbGljZW5zZS8pIGZvciBwcm9kdWN0aW9uIGxpY2Vuc2VzLiAgSWYgYm90aCBgbGljZW5zZUZpbGVgIGFuZCBgbGljZW5zZUtleWAgYXJlIHByb3ZpZGVkLCB0aGUgZmlsZSB3aW5zLiIKICAgICAgICB9LAogICAgICAgICJrZXkiIDogewogICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIjEweCBsaWNlbnNlIEpXVCAoaW5saW5lKVxuXG5UaGUgc2lnbmVkIDEweCBsaWNlbnNlIEpXVCwgcGFzc2VkIGlubGluZS4gRGlzY291cmFnZWQgb24gdGhlIGNvbW1hbmQgbGluZSBiZWNhdXNlIHRoZSB2YWx1ZSBpcyB2aXNpYmxlIGluIGBwc2Agb3V0cHV0OyBwcmVmZXIgYGxpY2Vuc2VGaWxlYCBpbiBwcm9kdWN0aW9uLiAgV2l0aG91dCBhIGxpY2Vuc2UgdGhlIGVuZ2luZSBydW5zIG9uIHRoZSBidWlsdC1pbiAzMC1kYXkgZXZhbHVhdGlvbiBsaWNlbnNlLiBTZWUgW2xpY2Vuc2luZ10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9tYW5hZ2UvbGljZW5zZS8pIGZvciBwcm9kdWN0aW9uIGxpY2Vuc2VzLiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiYWlyZ2FwcGVkIiA6IHsKICAgICAgInR5cGUiIDogWwogICAgICAgICJib29sZWFuIiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlJ1biB3aXRob3V0IGNvbnRhY3RpbmcgdGhlIDEweCBzZXJ2aWNlXG5cbldoZW4gYHRydWVgLCB0aGUgbGljZW5zZSBpcyB2ZXJpZmllZCBsb2NhbGx5IChzaWduYXR1cmUgKyBjbGFpbXMpIGFuZCBubyBjYWxscyBhcmUgbWFkZSB0byB0aGUgMTB4IHNlcnZpY2U6IG5vIHN0YXJ0dXAgdmFsaWRhdGlvbiwgbm8gbWV0cmljcyByZXBvcnRpbmcsIG5vIHVzZXItYXR0cmlidXRlIGVucmljaG1lbnQuIFN1aXRhYmxlIGZvciBmdWxseSBhaXJnYXBwZWQgZGVwbG95bWVudHMgd2hlcmUgdGhlIGVuZ2luZSBoYXMgbm8gcGF0aCB0byB0aGUgdmVuZG9yIFNhYVMuICBXaGVuIGBmYWxzZWAgKGRlZmF1bHQpLCB0aGUgZW5naW5lIGFkZGl0aW9uYWxseSBjYWxscyB0aGUgMTB4IHNlcnZpY2UgYXQgc3RhcnR1cCwgYW5kIG9ubHkgd2hlbiBhIHNlcnZpY2UgZW5kcG9pbnQgaXMgYWN0dWFsbHkgY29uZmlndXJlZDsgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBuYW1lcyBub25lLCBzbyBhbiB1bmNvbmZpZ3VyZWQgZW5naW5lIG1ha2VzIG5vIGNhbGwgZWl0aGVyIHdheS4gVGhlIGNhbGwgaXMgYmVzdC1lZmZvcnQgZW5yaWNobWVudDogdGhlIGxvY2FsIHZlcmlmaWNhdGlvbiBpcyB0aGUgZ2F0ZSwgYW5kIGEgc2VydmljZSB0aGF0IGNhbm5vdCBiZSByZWFjaGVkLCBvciB0aGF0IGFuc3dlcnMgd2l0aCBhbiBlcnJvciwgcHJvZHVjZXMgYSB3YXJuaW5nIGFuZCB0aGUgZW5naW5lIHJ1bnMuICBBaXJnYXBwZWQgbW9kZSBpcyBob25vcmVkIGZvciBldmVyeSBsaWNlbnNlIHR5cGUuIChBY2NlcHRzIGJvb2xlYW4gb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiBmYWxzZSkiLAogICAgICAiZGVmYXVsdCIgOiBmYWxzZQogICAgfSwKICAgICJtZXRyaWNFbmRwb2ludCIgOiB7CiAgICAgICJ0eXBlIiA6IFsKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIjEweCBzZXJ2aWNlIFByb21ldGhldXMgbWV0cmljcyBlbmRwb2ludFxuXG5TcGVjaWZpZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIFByb21ldGhldXMgcmVtb3RlIHdyaXRlIGVuZHBvaW50IHRvIHdyaXRlIHBpcGVsaW5lIHVzYWdlIGFuZCBoZWFsdGggbWV0cmljcy4gIFVuc2V0IGJ5IGRlZmF1bHQ6IGFuIGVuZ2luZSB3aXRoIG5vIG1ldHJpYyBlbmRwb2ludCBjb25maWd1cmVkIGNvbGxlY3RzIG1ldHJpY3MgbG9jYWxseSBhbmQgc2VuZHMgdGhlbSBub3doZXJlLiAgISEhIG5vdGUgXCJcIiAgICAgIFRoaXMgYXJndW1lbnQgaXMgb25seSBzZXR0YWJsZSBpbiB0aGUgMTB4ICdvbi1wcmVtaXNlcycgYnVpbGQuIgogICAgfSwKICAgICJydW50aW1lIiA6IHsKICAgICAgInR5cGUiIDogIm9iamVjdCIsCiAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZSwKICAgICAgInByb3BlcnRpZXMiIDogewogICAgICAgICJuYW1lIiA6IHsKICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICJudWxsIgogICAgICAgICAgXSwKICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJOYW1lIHRvIHJlcG9ydCB0byB0aGUgMTB4IHNlcnZpY2UgZW5kcG9pbnQgZm9yIHRoaXMgcnVudGltZSBpbnN0YW5jZVxuXG5TcGVjaWZpZXMgYSBsb2dpY2FsIG5hbWUgdXNlZCBhcyBhIFt0YWcgdmFsdWVdKGh0dHBzOi8vd3d3LmJhZWxkdW5nLmNvbS9taWNyb21ldGVyIzQtbWV0ZXJzKSBmb3IgcGlwZWxpbmUgbWV0cmljcy4gVGhpcyB2YWx1ZSBpZGVudGlmaWVzIGluc3RhbmNlcyBvZiB0aGUgMTB4IHJ1bi9jb21waWxlIHBpcGVsaW5lcyB3aGVuIHJlcG9ydGluZyB0byB0aGUgMTB4IHNlcnZpY2UuIEZvciBleGFtcGxlLCBmb3IgYSAxMHggW1JlY2VpdmVyXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwcHMvcmVjZWl2ZXIvKSB3aXRoIG9wdGltaXphdGlvbiBlbmFibGVkIGZvciBGbHVlbnQgQml0IGZvcndhcmRlcnMgY29sbGVjdGluZyBldmVudHMgZnJvbSBhIGBicm9rZXJgIHVzZXItYXBwLCB0aGlzIHZhbHVlIGNhbiBiZSBzZXQgdG86IGByZWNlaXZlX2ZsdWVudGJpdF9icm9rZXJgIgogICAgICAgIH0sCiAgICAgICAgImF0dHJpYnV0ZXMiIDogewogICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkxpc3Qgb2YgYXR0cmlidXRlcyB0byBhZGQgdG8gYWxsIG1ldHJpY3MgcmVwb3J0aW5nXG5cblNwZWNpZmllcyBhIGxpc3Qgb2Yga2V5LXZhbHVlIHBhaXJzIGluIHRoZSBmb3JtYXQgYGtleTp2YWx1ZWAgdG8gYmUgYWRkZWQgYXMgdGFncyB0byBwaXBlbGluZSBtZXRyaWNzIHJlcG9ydGVkIHRvIHRoZSAxMHggc2VydmljZS4gVGhlc2UgdGFncyBlbmFibGUgZmluZXItZ3JhaW5lZCBmaWx0ZXJpbmcgYW5kIGFuYWx5c2lzIGluIG1vbml0b3Jpbmcgc3lzdGVtcyBsaWtlIFByb21ldGhldXMuIE11bHRpcGxlIGF0dHJpYnV0ZXMgY2FuIGJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgc3RyaW5nIHVzaW5nIGEgc2VtaWNvbG9uIChgO2ApLCBlLmcuLCBga2V5MTp2YWwxO2tleTI6dmFsMmAuICBJZiBhIGtleSBkb2VzIG5vdCBzdGFydCB3aXRoIHRlbnhfLCB0aGUgcHJlZml4IHRlbnhfIGlzIGF1dG9tYXRpY2FsbHkgcHJlcGVuZGVkIHRvIGVuc3VyZSBjb25zaXN0ZW5jeSBpbiB0YWcgbmFtaW5nIGNvbnZlbnRpb25zLiBGb3IgZXhhbXBsZSwgYSBwcm92aWRlZCBhdHRyaWJ1dGUgYXBwOm15LWFwcCB3aWxsIGJlIHJlcG9ydGVkIGFzIHRlbnhfYXBwOm15LWFwcCAgYGBgIHlhbWwgICBydW50aW1lQXR0cmlidXRlczogICAgIC0gYXBwOnJlcG9ydGVyICAgICAtIGVudjplZGdlIGBgYCIsCiAgICAgICAgICAiaXRlbXMiIDogewogICAgICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJpbmNsdWRlUGF0aHMiIDogewogICAgICAidHlwZSIgOiBbCiAgICAgICAgImFycmF5IiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlBpcGVsaW5lIGluY2x1ZGUgZm9sZGVyc1xuXG5TcGVjaWZpZXMgZm9sZGVycyBvbiBkaXNrIGZvciByZXNvbGluZyByZWxhdGl2ZSByZWZlcmVuY2VzIHdpdGhpbiBbaW5jbHVkZSBkaXJlY3RpdmVzXShodHRwczovL2RvYy5sb2cxMHguY29tL2NvbmZpZy95YW1sLyNpbmNsdWRlLWRpcmVjdGl2ZXMpLiAoRGVmYXVsdDogW1wid29ya2luZyBkaXJlY3Rvcnkgb2YgY3VycmVudCBwcm9jZXNzXCJdKSIsCiAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgInR5cGUiIDogInN0cmluZyIKICAgICAgfSwKICAgICAgImRlZmF1bHQiIDogWwogICAgICAgICJ3b3JraW5nIGRpcmVjdG9yeSBvZiBjdXJyZW50IHByb2Nlc3MiCiAgICAgIF0KICAgIH0sCiAgICAiamFyRmlsZXMiIDogewogICAgICAidHlwZSIgOiBbCiAgICAgICAgImFycmF5IiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkphciBmaWxlcyB0byBsb2FkXG5cblNwZWNpZmllcyBhIGxpc3Qgb2YgLmphciBmaWxlcyB0byBsb2FkIGludG8gdGhlIGhvc3QgSlZNIGZvciB1c2UgYnkgW2NvbXBpbGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vYXBpL2NvbXBpbGUvKSwgW2lucHV0XShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9pbnB1dC8pIGFuZCBbb3V0cHV0XShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9vdXRwdXQvKSBBUEkgZXh0ZW5zaW9ucy4gICEhISBub3RlIFwiXCIgICAgICBUaGlzIGFyZ3VtZW50IGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIFtSdW50aW1lXShodHRwczovL2RvYy5sb2cxMHguY29tL2VuZ2luZS9mbGF2b3JzLyNydW50aW1lKSBmbGF2b3IuIiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9LAogICAgInF1aWV0IiA6IHsKICAgICAgInR5cGUiIDogWwogICAgICAgICJib29sZWFuIiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkRpc2FibGUgcHJpbnRpbmcgYmluYXJ5IHZlcnNpb24gaW5mb3JtYXRpb24gdG8gdGhlIGNvbnNvbGVcblxuRGlzYWJsZSBwcmludGluZyBidWlsZC92ZXJzaW9uIGluZm9ybWF0aW9uIHRvIHRoZSBjb25zb2xlIHVwb24gbGF1bmNoIChBY2NlcHRzIGJvb2xlYW4gb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiBmYWxzZSkiLAogICAgICAiZGVmYXVsdCIgOiBmYWxzZQogICAgfSwKICAgICJkaXNhYmxlZEFyZ3MiIDogewogICAgICAidHlwZSIgOiBbCiAgICAgICAgImFycmF5IiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkxpbWl0IGFyZ3VtZW50IHZhbHVlcyB0aGF0IGNhbiBiZSBzZXQgYnkgdXNlcnNcblxuU3BlY2lmaWVzIGEgbGlzdCBvZiBsYXVuY2ggYXJndW1lbnRzIHRoYXQgYXJlIGRpc2FsbG93ZWQgZnJvbSBlaXRoZXIgY29tbWFuZCBsaW5lIG9yIHVzZXIgY29uZmlnIGZpbGVzLiBUaGlzIGFyZ3VtZW50IHByb3ZpZGVzIGEgbWV0aG9kIG9mIGxpbWl0aW5nIHRoZSB0YXJnZXQgW3BpcGVsaW5lXShodHRwczovL2RvYy5sb2cxMHguY29tL3NoYXJlZC9ib290c3RyYXAvI3BpcGVsaW5lKSwgW3NvdXJjZV0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb25maWcvI3NvdXJjZXMpIGFuZCBhbmQgW2NvbW1hbmQgbGluZV0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb25maWcvY2xpLykgc2V0dGFibGUgYnkgdGhlIHVzZXIuICBUaGlzIG1lY2hhbmlzbSBlbmFibGVzIHBpcGVsaW5lIGxhdW5jaGVycyBzdWNoIGFzIHRoZSBbUXVhcmt1cyBsYXVuY2hlcl0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9hcGkvbGF1bmNoLyNxdWFya3VzKSB0byBsaW1pdCB1c2VyIGlucHV0IHJlY2VpdmVkIHZpYSBSRVNUIHJlcXVlc3RzIHRvIGEgdGFyZ2V0IHN1YnNldCBvZiAnc2FmZScgYXJndW1lbnRzLiAgRm9yIGV4YW1wbGUsIGFkZGluZyBbcHJvY091dENvbW1hbmRdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9wcm9jZXNzLyNwcm9jb3V0Y29tbWFuZCkgdG8gdGhpcyBsaXN0IGVuc3VyZXMgdGhhdCBubyBleHRlcm5hbCBwcm9jZXNzIG91dHB1dHMgY2FuIGJlIGxhdW5jaGVkIGJ5IHRoZSBydW50aW1lLiAgQW4gb3B0aW9uYWwgcmVnZXggcGF0dGVybiBjYW4gbGltaXQgYXJndW1lbnRzIHRvIGEgY2VydGFpbiBzdWJzZXQgb2YgdmFsdWVzIGluIHRoZSBmb3JtIG9mOiBgPGFyZy1uYW1lPls6cGF0dGVybl1gIChlLmcuLCBzcGVjaWZpYyBwcm9jZXNzIG5hbWVzKS4gTXVsdGlwbGUgcGF0dGVybnMgY2FuIGJlIHNwZWNpZmllZCBwZXIgYXJndW1lbnQuICBNYXRjaGluZyB0aGUgYHNvdXJjZWAgYXJndW1lbnQgZGV0ZXJtaW5lcyB3aGljaCBzb3VyY2UgbG9jYXRpb25zIHRvIGluc3BlY3QgKGUuZy4sIGZvbGRlcnMsIGZpbGVzLCBHaXRIdWIgcmVwb3MpLiBGb3IgZXhhbXBsZSwgYW4gYWRtaW4gbWF5IHBsYWNlIC55YW1sIGNvbmZpZyBmaWxlcyBjb250YWluaW5nIHByZXNldCBGbHVlbnQgQml0IG91dHB1dHMgaW4gYC9ldGMvbG9nMTB4L2AsIGV4Y2x1ZGluZyB0aGVpciBlbmNsb3NlZCBhcmd1bWVudHMgZnJvbSBsaW1pdHMgc2V0IGJ5IHRoaXMgbGlzdCwgd2hpbGUgZGlzYWxsb3dpbmcgdXNlcnMgdG8gZGlyZWN0bHkgc2V0IHRoZW0gdmlhIHRoZSBjb21tYW5kLWxpbmUgb3IgYnkgc291cmNpbmcgdGhlbSBmcm9tIHRoZWlyIGxvY2FsL0dpdEh1YiBjb25maWcgZmlsZXMgKHNlZSBleGFtcGxlIGJlbG93KS4gIFRvIGxpbWl0OiAgVGhlIHRhcmdldCBwaXBlbGluZSAoZS5nLiwgW3J1bl0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vKSwgW2NvbXBpbGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vY29tcGlsZS8pKTogIGBgYCB5YW1sICAgZGlzYWJsZWRBcmdzOiAgIC0gXCJwaXBlbGluZTpecnVuXCIgIyBkaXNhbGxvdyBjb21waWxlIGBgYCAgVGFyZ2V0IGFyZ3VtZW50cyAoZS5nLiwgW3Byb2Nlc3Mgb3V0cHV0c10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vb3V0cHV0L2V2ZW50L3Byb2Nlc3MvKSk6ICBgYGAgeWFtbCAgIC0gXCJwcm9jT3V0Q29tbWFuZDpeZmx1ZW50LWJpdCRcIiAgICMgbGltaXQgdG8gRmx1ZW50IEJpdCBvbmx5ICAgIyAtIHByb2NPdXRBcmdzOiA8c3BlY2lmeS1yZWdleD4gICMgZnVydGhlciBsaW1pdCBhcmdzIGZvciBGbHVlbnQgQml0IGBgYCAgQ29udHJvbCB3aGljaCBhcmd1bWVudCBbc291cmNlc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb25maWcvI3NvdXJjZXMpIHRvIGluc3BlY3Q6ICBgYGAgeWFtbCAgIC0gXCJzb3VyY2U6XmdpdGh1Yi4qXCIgICAgICAgICAgICAgIyBpbnNwZWN0IG9mIGFsbCBhcmd1bWVudHMgc291cmNlZCBmcm9tIEdpdEh1YiBhZ2FpbnN0IHRoaXMgbGlzdCAgIC0gXCJzb3VyY2U6Xig/IS9ldGMvbG9nMTB4LykuKlwiICAgIyBpbnNwZWN0IG9mIGFsbCBhcmd1bWVudHMgc291cmNlZCBmcm9tIGNvbmZpZyBmaWxlcyBOT1QgY29udGFpbmVkIGluOiAvZXRjL2xvZzEweC8gYGBgIiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9LAogICAgImRlYnVnRW52VmFycyIgOiB7CiAgICAgICJ0eXBlIiA6IFsKICAgICAgICAiYXJyYXkiLAogICAgICAgICJzdHJpbmciLAogICAgICAgICJudWxsIgogICAgICBdLAogICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTGlzdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gZGVidWdcblxuU3BlY2lmaWVzIGEgbGlzdCBvZiBlbnYgdmFyIG5hbWVzIGZvciB3aGljaCB0byBsb2cgaW5mb3JtYXRpb24gcmVsYXRpbmcgdG8gaG93IHRoZXkgYXJlIHJlc29sdmVkLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjYWxsOiBgTDFFbnYuZ2V0KFwibXlWYXJcIiwgXCJteURlZmF1bHRcIilgIGNhbiBiZSByZXNvbHZlZCBmcm9tIGEgbnVtYmVyIG9mIFtzb3VyY2VzXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWEVudi5nZXQpIHJhbmdpbmcgZnJvbSBsYXVuY2ggYXJndW1lbnRzLCB0byBPUy9KVk0gcHJvcGVydGllcyBhbmQgYSBkZWZhdWx0IHZhbHVlIChlLmcuLCBteURlZmF1bHQpLiAgU2V0dGluZyB0aGlzIHZhbHVlIHRvIGBteVZhcmAgd2lsbCBsb2cgSU5GTyBsZXZlbCBpbmZvcm1hdGlvbiBkZXRhaWxpbmcgaG93IHRoZSB2YWx1ZSBvZiB0aGUgYG15VmFyYCB3YXMgcmVzb2x2ZWQuIiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9CiAgfSwKICAicmVxdWlyZWQiIDogWwogICAgInRlbngiCiAgXSwKICAiYWRkaXRpb25hbFByb3BlcnRpZXMiIDogZmFsc2UKfQ==</template>

    ```yaml
    # 🔟❎ run bootstrap configuration
    
    # This config file specifies bootstrap options for the run pipeline.
    # To learn more see https://doc.log10x.com/run/bootstrap
    
    # To learn more see https://doc.log10x.com/config/
    
    tenx: run
    
    # =============================== Launch Settings ==============================
    
    # 'licenseKey' specifies a signed JWT license token used for authenticating against the 10x service
    licenseKey: $=TenXEnv.get("TENX_LICENSE_KEY", "NO-LICENSE")
    
    # 'licenseFile' specifies a path to a file containing the signed JWT license token.
    # Preferred over 'licenseKey' on production hosts: the token does not appear in 'ps' output.
    licenseFile: $=TenXEnv.get("TENX_LICENSE_FILE")
    
    # 'airgapped' suppresses every call to the 10x SaaS gateway: the license is verified locally against the embedded
    # public key, and ALL outbound calls to the 10x SaaS gateway are suppressed (no DNS, no TCP).
    # Use for deployments where security review forbids vendor phone-home.
    airgapped: $=TenXEnv.get("TENX_AIRGAPPED", "false")
    
    # 'includePaths' specifies folders on disk for resolving relative config file/folder references in addition to the working folder
    includePaths: []
    
    # 'quiet' disables printing version information to the console.
    # quiet: true
    
    # 'jarFiles' specifies .jar files to dynamically load for use by compile, input and output API extensions.
    jarFiles: []
    
    # 'metricEndpoint' specifies a Prometheus remote-write endpoint for pipeline usage and health metrics.
    # Unset by default. The endpoint is a self-hosted or vendor Prometheus-compatible store, never a 10x
    # service, and is where the MCP reads engine state back from to tune policy such as regulator rates.
    # metricEndpoint: https://prometheus.example.com/api/v1/write
    
    # 'disabledArgs' specifies a list of launch arguments that are disallowed from either command line or user config files.
    disabledArgs: []
    
    # 'debugEnvVars' list environment variables to debug
    debugEnvVars: []
    ```

??? tenx-compile "Compile"

    <a id="compile"></a>
    ### Compile {.hidden-heading}

    Launch a [compile pipeline](https://doc.log10x.com/compile "compile pipeline") to scan source code and binary files to generate symbol unit and library files.

    Below is the default configuration from: [bootstrap/config.yaml](https://github.dev/log-10x/config/blob/main/pipelines/pipelines/compile/bootstrap/config.yaml "bootstrap/config.yaml"){target="\_blank"}.  
  
    <div class="edit-options">
        <a class="md-button tenx-edit-online-button" data-tooltip="Edit online on github.dev" href="https://github.dev/log-10x/config/blob/main/pipelines/pipelines/compile/bootstrap/config.yaml" target="_blank" rel="noopener noreferrer">
            <span class="twemoji" style="margin-right: 0.3rem;">
                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                    <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path>
                </svg>
            </span> Edit Online
        </a>
        <button class="md-button tenx-config.yaml1-edit-button" data-tooltip="Edit configuration file" data-dialog-id="config-yaml1-dialog">
            <span style="margin-right: 0.3rem;">
                <span class="twemoji">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                        <path d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                    </svg>
                </span>
            </span>Edit Locally
        </button>
    </div>
    
    <dialog id="config-yaml1-dialog" class="md-dialog md-dialog--editor">
        <div class="editor-dialog-wrapper">
            <div class="editor-dialog-header">
                <span class="editor-dialog-title">Edit Pipeline Bootstrapper Config Locally</span>
                <div class="editor-header-actions">
                    <button class="editor-toolbar-btn yaml-editor-locations" data-tooltip="Save">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-reset" data-tooltip="Reset to default">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M12.5 8c-2.65 0-5.05 1-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-copy" data-tooltip="Copy to clipboard">
                        <svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path></svg>
                        <svg class="icon-check" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn yaml-editor-fullscreen" data-tooltip="Fullscreen">
                        <svg class="icon-maximize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5,5H10V7H7V10H5V5M14,5H19V10H17V7H14V5M17,14H19V19H14V17H17V14M10,17V19H5V14H7V17H10Z"></path></svg>
                        <svg class="icon-minimize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M5,16H8V19H10V14H5V16M14,14V19H16V16H19V14H14M16,5V8H19V10H14V5H16M10,5V10H5V8H8V5H10Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn editor-dialog-close" onclick="closeDialog('config-yaml1-dialog')" data-tooltip="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path></svg>
                    </button>
                </div>
            </div>
            <div class="editor-dialog-content">
                <div class="yaml-editor-container"></div>
            </div>
            <div class="yaml-editor-statusbar">
                <span class="yaml-editor-status"></span>
            </div>
        </div>
        <!-- Locations Popup -->
        <div class="locations-popup" style="display: none;">
            <div class="locations-popup-content">
                <div class="locations-popup-header">
                    <span class="locations-header-label">Download and save to:</span>
                    <button class="locations-popup-close" aria-label="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
                            <path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path>
                        </svg>
                    </button>
                </div>
                <ul class="locations-list">
                    <li>
                        <span class="location-label">Linux / Docker / macOS
                            <span class="help-icon" data-tooltip="Default system location. The engine automatically reads configs from here at startup. Best for production deployments.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="default-path location-path" data-tooltip=""
                                data-copy-osx="/etc/log10x/config/compile/bootstrap/config.yaml"
                                data-copy-nix="/etc/log10x/config/compile/bootstrap/config.yaml"
                                data-copy-win="C:\log10x\configs/compile/bootstrap/config.yaml"></code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Custom directory
                            <span class="help-icon" data-tooltip="Set TENX_CONFIG environment variable to point to a custom config directory. Useful when you want configs in a non-standard location.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="$TENX_CONFIG/compile/bootstrap/config.yaml">$TENX_CONFIG/compile/bootstrap/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Within cloned repo
                            <span class="help-icon" data-tooltip="First run: git clone github.com/log-10x/config. Then save the file to this path within the cloned folder. Use for version control.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="./pipelines/compile/bootstrap/config.yaml">./pipelines/compile/bootstrap/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                </ul>
                <div class="locations-popup-footer">
                    <button class="locations-download-btn" title="Download config file">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                            <path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path>
                        </svg>
                        <span>Download</span>
                    </button>
                </div>
            </div>
        </div>
    </dialog>
    
    <template class="tenx-config-schema" data-encoding="base64">ewogICJ0eXBlIiA6ICJvYmplY3QiLAogICJwcm9wZXJ0aWVzIiA6IHsKICAgICJ0ZW54IiA6IHsKICAgICAgInR5cGUiIDogWwogICAgICAgICJzdHJpbmciLAogICAgICAgICJudWxsIgogICAgICBdLAogICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTmFtZSBvZiBwaXBlbGluZSB0byBleGVjdXRlXG5cblRhcmdldCBbcGlwZWxpbmVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vZW5naW5lL3BpcGVsaW5lLykgdG8gZXhlY3V0ZS4gRm9yIGV4YW1wbGUsIHRvIHNwZWNpZnkgdGhlIFtydW5dKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuLykgcGlwZWxpbmUgYW5kIGEgW1lBTUxdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vY29uZmlnL3lhbWwvKSBjb25maWcgZmlsZSBjb250YWluaW5nIGxhdW5jaCBhcmd1bWVudHMsIHVzZTogIGBgYCBjb25zb2xlICQgdGVueCBydW4gQH4vbXkueWFtbCBgYGAgVGhlIFlBTUwgZmlsZSBtYXkgc3BlY2lmeSB0aGUgcGlwZWxpbmUgbmFtZSB2aWEgYSAndGVueCcgZW50cnksIGFsbG93aW5nIHRoZSAncGlwZWxpbmUnIGFyZ3VtZW50IHRvIGJlIG9taXR0ZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiAgRm9yIGV4YW1wbGUgKG15LnlhbWwpOiAgYGBgIHlhbWwgdGVueDogcnVuICMgc2V0IHRoZSBwaXBlbGluZSB0byAncnVuJyBsaWNlbnNlS2V5OiA8bXktbGljZW5zZS1qd3Q+IC4uLiBgYGAgIEFsbG93cyBmb3IgbGF1bmNoaW5nIHRoZSBydW4gcGlwZWxpbmUgdmlhOiBgYGAgY29uc29sZSAkIHRlbnggQH4vbXkueWFtbCBgYGAiCiAgICB9LAogICAgImxpY2Vuc2UiIDogewogICAgICAidHlwZSIgOiAib2JqZWN0IiwKICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlLAogICAgICAicHJvcGVydGllcyIgOiB7CiAgICAgICAgImZpbGUiIDogewogICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlBhdGggdG8gYSBmaWxlIGNvbnRhaW5pbmcgdGhlIDEweCBsaWNlbnNlIEpXVFxuXG5QYXRoIHRvIGEgZmlsZSBjb250YWluaW5nIHRoZSBzaWduZWQgMTB4IGxpY2Vuc2UgSldULiBQcmVmZXJyZWQgb3ZlciBgbGljZW5zZUtleWAgZm9yIHByb2R1Y3Rpb246IHRoZSB0b2tlbiBpcyBub3QgdmlzaWJsZSBpbiBgcHNgIG91dHB1dCBhbmQgaXMgZWFzeSB0byByb3RhdGUgYnkgcmVwbGFjaW5nIHRoZSBmaWxlLiAgV2l0aG91dCBhIGxpY2Vuc2UgdGhlIGVuZ2luZSBydW5zIG9uIHRoZSBidWlsdC1pbiAzMC1kYXkgZXZhbHVhdGlvbiBsaWNlbnNlLiBTZWUgW2xpY2Vuc2luZ10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9tYW5hZ2UvbGljZW5zZS8pIGZvciBwcm9kdWN0aW9uIGxpY2Vuc2VzLiAgSWYgYm90aCBgbGljZW5zZUZpbGVgIGFuZCBgbGljZW5zZUtleWAgYXJlIHByb3ZpZGVkLCB0aGUgZmlsZSB3aW5zLiIKICAgICAgICB9LAogICAgICAgICJrZXkiIDogewogICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIjEweCBsaWNlbnNlIEpXVCAoaW5saW5lKVxuXG5UaGUgc2lnbmVkIDEweCBsaWNlbnNlIEpXVCwgcGFzc2VkIGlubGluZS4gRGlzY291cmFnZWQgb24gdGhlIGNvbW1hbmQgbGluZSBiZWNhdXNlIHRoZSB2YWx1ZSBpcyB2aXNpYmxlIGluIGBwc2Agb3V0cHV0OyBwcmVmZXIgYGxpY2Vuc2VGaWxlYCBpbiBwcm9kdWN0aW9uLiAgV2l0aG91dCBhIGxpY2Vuc2UgdGhlIGVuZ2luZSBydW5zIG9uIHRoZSBidWlsdC1pbiAzMC1kYXkgZXZhbHVhdGlvbiBsaWNlbnNlLiBTZWUgW2xpY2Vuc2luZ10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9tYW5hZ2UvbGljZW5zZS8pIGZvciBwcm9kdWN0aW9uIGxpY2Vuc2VzLiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiYWlyZ2FwcGVkIiA6IHsKICAgICAgInR5cGUiIDogWwogICAgICAgICJib29sZWFuIiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlJ1biB3aXRob3V0IGNvbnRhY3RpbmcgdGhlIDEweCBzZXJ2aWNlXG5cbldoZW4gYHRydWVgLCB0aGUgbGljZW5zZSBpcyB2ZXJpZmllZCBsb2NhbGx5IChzaWduYXR1cmUgKyBjbGFpbXMpIGFuZCBubyBjYWxscyBhcmUgbWFkZSB0byB0aGUgMTB4IHNlcnZpY2U6IG5vIHN0YXJ0dXAgdmFsaWRhdGlvbiwgbm8gbWV0cmljcyByZXBvcnRpbmcsIG5vIHVzZXItYXR0cmlidXRlIGVucmljaG1lbnQuIFN1aXRhYmxlIGZvciBmdWxseSBhaXJnYXBwZWQgZGVwbG95bWVudHMgd2hlcmUgdGhlIGVuZ2luZSBoYXMgbm8gcGF0aCB0byB0aGUgdmVuZG9yIFNhYVMuICBXaGVuIGBmYWxzZWAgKGRlZmF1bHQpLCB0aGUgZW5naW5lIGFkZGl0aW9uYWxseSBjYWxscyB0aGUgMTB4IHNlcnZpY2UgYXQgc3RhcnR1cCwgYW5kIG9ubHkgd2hlbiBhIHNlcnZpY2UgZW5kcG9pbnQgaXMgYWN0dWFsbHkgY29uZmlndXJlZDsgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBuYW1lcyBub25lLCBzbyBhbiB1bmNvbmZpZ3VyZWQgZW5naW5lIG1ha2VzIG5vIGNhbGwgZWl0aGVyIHdheS4gVGhlIGNhbGwgaXMgYmVzdC1lZmZvcnQgZW5yaWNobWVudDogdGhlIGxvY2FsIHZlcmlmaWNhdGlvbiBpcyB0aGUgZ2F0ZSwgYW5kIGEgc2VydmljZSB0aGF0IGNhbm5vdCBiZSByZWFjaGVkLCBvciB0aGF0IGFuc3dlcnMgd2l0aCBhbiBlcnJvciwgcHJvZHVjZXMgYSB3YXJuaW5nIGFuZCB0aGUgZW5naW5lIHJ1bnMuICBBaXJnYXBwZWQgbW9kZSBpcyBob25vcmVkIGZvciBldmVyeSBsaWNlbnNlIHR5cGUuIChBY2NlcHRzIGJvb2xlYW4gb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiBmYWxzZSkiLAogICAgICAiZGVmYXVsdCIgOiBmYWxzZQogICAgfSwKICAgICJtZXRyaWNFbmRwb2ludCIgOiB7CiAgICAgICJ0eXBlIiA6IFsKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIjEweCBzZXJ2aWNlIFByb21ldGhldXMgbWV0cmljcyBlbmRwb2ludFxuXG5TcGVjaWZpZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIFByb21ldGhldXMgcmVtb3RlIHdyaXRlIGVuZHBvaW50IHRvIHdyaXRlIHBpcGVsaW5lIHVzYWdlIGFuZCBoZWFsdGggbWV0cmljcy4gIFVuc2V0IGJ5IGRlZmF1bHQ6IGFuIGVuZ2luZSB3aXRoIG5vIG1ldHJpYyBlbmRwb2ludCBjb25maWd1cmVkIGNvbGxlY3RzIG1ldHJpY3MgbG9jYWxseSBhbmQgc2VuZHMgdGhlbSBub3doZXJlLiAgISEhIG5vdGUgXCJcIiAgICAgIFRoaXMgYXJndW1lbnQgaXMgb25seSBzZXR0YWJsZSBpbiB0aGUgMTB4ICdvbi1wcmVtaXNlcycgYnVpbGQuIgogICAgfSwKICAgICJydW50aW1lIiA6IHsKICAgICAgInR5cGUiIDogIm9iamVjdCIsCiAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZSwKICAgICAgInByb3BlcnRpZXMiIDogewogICAgICAgICJuYW1lIiA6IHsKICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICJudWxsIgogICAgICAgICAgXSwKICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJOYW1lIHRvIHJlcG9ydCB0byB0aGUgMTB4IHNlcnZpY2UgZW5kcG9pbnQgZm9yIHRoaXMgcnVudGltZSBpbnN0YW5jZVxuXG5TcGVjaWZpZXMgYSBsb2dpY2FsIG5hbWUgdXNlZCBhcyBhIFt0YWcgdmFsdWVdKGh0dHBzOi8vd3d3LmJhZWxkdW5nLmNvbS9taWNyb21ldGVyIzQtbWV0ZXJzKSBmb3IgcGlwZWxpbmUgbWV0cmljcy4gVGhpcyB2YWx1ZSBpZGVudGlmaWVzIGluc3RhbmNlcyBvZiB0aGUgMTB4IHJ1bi9jb21waWxlIHBpcGVsaW5lcyB3aGVuIHJlcG9ydGluZyB0byB0aGUgMTB4IHNlcnZpY2UuIEZvciBleGFtcGxlLCBmb3IgYSAxMHggW1JlY2VpdmVyXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwcHMvcmVjZWl2ZXIvKSB3aXRoIG9wdGltaXphdGlvbiBlbmFibGVkIGZvciBGbHVlbnQgQml0IGZvcndhcmRlcnMgY29sbGVjdGluZyBldmVudHMgZnJvbSBhIGBicm9rZXJgIHVzZXItYXBwLCB0aGlzIHZhbHVlIGNhbiBiZSBzZXQgdG86IGByZWNlaXZlX2ZsdWVudGJpdF9icm9rZXJgIgogICAgICAgIH0sCiAgICAgICAgImF0dHJpYnV0ZXMiIDogewogICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkxpc3Qgb2YgYXR0cmlidXRlcyB0byBhZGQgdG8gYWxsIG1ldHJpY3MgcmVwb3J0aW5nXG5cblNwZWNpZmllcyBhIGxpc3Qgb2Yga2V5LXZhbHVlIHBhaXJzIGluIHRoZSBmb3JtYXQgYGtleTp2YWx1ZWAgdG8gYmUgYWRkZWQgYXMgdGFncyB0byBwaXBlbGluZSBtZXRyaWNzIHJlcG9ydGVkIHRvIHRoZSAxMHggc2VydmljZS4gVGhlc2UgdGFncyBlbmFibGUgZmluZXItZ3JhaW5lZCBmaWx0ZXJpbmcgYW5kIGFuYWx5c2lzIGluIG1vbml0b3Jpbmcgc3lzdGVtcyBsaWtlIFByb21ldGhldXMuIE11bHRpcGxlIGF0dHJpYnV0ZXMgY2FuIGJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgc3RyaW5nIHVzaW5nIGEgc2VtaWNvbG9uIChgO2ApLCBlLmcuLCBga2V5MTp2YWwxO2tleTI6dmFsMmAuICBJZiBhIGtleSBkb2VzIG5vdCBzdGFydCB3aXRoIHRlbnhfLCB0aGUgcHJlZml4IHRlbnhfIGlzIGF1dG9tYXRpY2FsbHkgcHJlcGVuZGVkIHRvIGVuc3VyZSBjb25zaXN0ZW5jeSBpbiB0YWcgbmFtaW5nIGNvbnZlbnRpb25zLiBGb3IgZXhhbXBsZSwgYSBwcm92aWRlZCBhdHRyaWJ1dGUgYXBwOm15LWFwcCB3aWxsIGJlIHJlcG9ydGVkIGFzIHRlbnhfYXBwOm15LWFwcCAgYGBgIHlhbWwgICBydW50aW1lQXR0cmlidXRlczogICAgIC0gYXBwOnJlcG9ydGVyICAgICAtIGVudjplZGdlIGBgYCIsCiAgICAgICAgICAiaXRlbXMiIDogewogICAgICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJpbmNsdWRlUGF0aHMiIDogewogICAgICAidHlwZSIgOiBbCiAgICAgICAgImFycmF5IiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlBpcGVsaW5lIGluY2x1ZGUgZm9sZGVyc1xuXG5TcGVjaWZpZXMgZm9sZGVycyBvbiBkaXNrIGZvciByZXNvbGluZyByZWxhdGl2ZSByZWZlcmVuY2VzIHdpdGhpbiBbaW5jbHVkZSBkaXJlY3RpdmVzXShodHRwczovL2RvYy5sb2cxMHguY29tL2NvbmZpZy95YW1sLyNpbmNsdWRlLWRpcmVjdGl2ZXMpLiAoRGVmYXVsdDogW1wid29ya2luZyBkaXJlY3Rvcnkgb2YgY3VycmVudCBwcm9jZXNzXCJdKSIsCiAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgInR5cGUiIDogInN0cmluZyIKICAgICAgfSwKICAgICAgImRlZmF1bHQiIDogWwogICAgICAgICJ3b3JraW5nIGRpcmVjdG9yeSBvZiBjdXJyZW50IHByb2Nlc3MiCiAgICAgIF0KICAgIH0sCiAgICAiamFyRmlsZXMiIDogewogICAgICAidHlwZSIgOiBbCiAgICAgICAgImFycmF5IiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkphciBmaWxlcyB0byBsb2FkXG5cblNwZWNpZmllcyBhIGxpc3Qgb2YgLmphciBmaWxlcyB0byBsb2FkIGludG8gdGhlIGhvc3QgSlZNIGZvciB1c2UgYnkgW2NvbXBpbGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vYXBpL2NvbXBpbGUvKSwgW2lucHV0XShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9pbnB1dC8pIGFuZCBbb3V0cHV0XShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9vdXRwdXQvKSBBUEkgZXh0ZW5zaW9ucy4gICEhISBub3RlIFwiXCIgICAgICBUaGlzIGFyZ3VtZW50IGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIFtSdW50aW1lXShodHRwczovL2RvYy5sb2cxMHguY29tL2VuZ2luZS9mbGF2b3JzLyNydW50aW1lKSBmbGF2b3IuIiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9LAogICAgInF1aWV0IiA6IHsKICAgICAgInR5cGUiIDogWwogICAgICAgICJib29sZWFuIiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkRpc2FibGUgcHJpbnRpbmcgYmluYXJ5IHZlcnNpb24gaW5mb3JtYXRpb24gdG8gdGhlIGNvbnNvbGVcblxuRGlzYWJsZSBwcmludGluZyBidWlsZC92ZXJzaW9uIGluZm9ybWF0aW9uIHRvIHRoZSBjb25zb2xlIHVwb24gbGF1bmNoIChBY2NlcHRzIGJvb2xlYW4gb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiBmYWxzZSkiLAogICAgICAiZGVmYXVsdCIgOiBmYWxzZQogICAgfSwKICAgICJkaXNhYmxlZEFyZ3MiIDogewogICAgICAidHlwZSIgOiBbCiAgICAgICAgImFycmF5IiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkxpbWl0IGFyZ3VtZW50IHZhbHVlcyB0aGF0IGNhbiBiZSBzZXQgYnkgdXNlcnNcblxuU3BlY2lmaWVzIGEgbGlzdCBvZiBsYXVuY2ggYXJndW1lbnRzIHRoYXQgYXJlIGRpc2FsbG93ZWQgZnJvbSBlaXRoZXIgY29tbWFuZCBsaW5lIG9yIHVzZXIgY29uZmlnIGZpbGVzLiBUaGlzIGFyZ3VtZW50IHByb3ZpZGVzIGEgbWV0aG9kIG9mIGxpbWl0aW5nIHRoZSB0YXJnZXQgW3BpcGVsaW5lXShodHRwczovL2RvYy5sb2cxMHguY29tL3NoYXJlZC9ib290c3RyYXAvI3BpcGVsaW5lKSwgW3NvdXJjZV0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb25maWcvI3NvdXJjZXMpIGFuZCBhbmQgW2NvbW1hbmQgbGluZV0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb25maWcvY2xpLykgc2V0dGFibGUgYnkgdGhlIHVzZXIuICBUaGlzIG1lY2hhbmlzbSBlbmFibGVzIHBpcGVsaW5lIGxhdW5jaGVycyBzdWNoIGFzIHRoZSBbUXVhcmt1cyBsYXVuY2hlcl0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9hcGkvbGF1bmNoLyNxdWFya3VzKSB0byBsaW1pdCB1c2VyIGlucHV0IHJlY2VpdmVkIHZpYSBSRVNUIHJlcXVlc3RzIHRvIGEgdGFyZ2V0IHN1YnNldCBvZiAnc2FmZScgYXJndW1lbnRzLiAgRm9yIGV4YW1wbGUsIGFkZGluZyBbcHJvY091dENvbW1hbmRdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9wcm9jZXNzLyNwcm9jb3V0Y29tbWFuZCkgdG8gdGhpcyBsaXN0IGVuc3VyZXMgdGhhdCBubyBleHRlcm5hbCBwcm9jZXNzIG91dHB1dHMgY2FuIGJlIGxhdW5jaGVkIGJ5IHRoZSBydW50aW1lLiAgQW4gb3B0aW9uYWwgcmVnZXggcGF0dGVybiBjYW4gbGltaXQgYXJndW1lbnRzIHRvIGEgY2VydGFpbiBzdWJzZXQgb2YgdmFsdWVzIGluIHRoZSBmb3JtIG9mOiBgPGFyZy1uYW1lPls6cGF0dGVybl1gIChlLmcuLCBzcGVjaWZpYyBwcm9jZXNzIG5hbWVzKS4gTXVsdGlwbGUgcGF0dGVybnMgY2FuIGJlIHNwZWNpZmllZCBwZXIgYXJndW1lbnQuICBNYXRjaGluZyB0aGUgYHNvdXJjZWAgYXJndW1lbnQgZGV0ZXJtaW5lcyB3aGljaCBzb3VyY2UgbG9jYXRpb25zIHRvIGluc3BlY3QgKGUuZy4sIGZvbGRlcnMsIGZpbGVzLCBHaXRIdWIgcmVwb3MpLiBGb3IgZXhhbXBsZSwgYW4gYWRtaW4gbWF5IHBsYWNlIC55YW1sIGNvbmZpZyBmaWxlcyBjb250YWluaW5nIHByZXNldCBGbHVlbnQgQml0IG91dHB1dHMgaW4gYC9ldGMvbG9nMTB4L2AsIGV4Y2x1ZGluZyB0aGVpciBlbmNsb3NlZCBhcmd1bWVudHMgZnJvbSBsaW1pdHMgc2V0IGJ5IHRoaXMgbGlzdCwgd2hpbGUgZGlzYWxsb3dpbmcgdXNlcnMgdG8gZGlyZWN0bHkgc2V0IHRoZW0gdmlhIHRoZSBjb21tYW5kLWxpbmUgb3IgYnkgc291cmNpbmcgdGhlbSBmcm9tIHRoZWlyIGxvY2FsL0dpdEh1YiBjb25maWcgZmlsZXMgKHNlZSBleGFtcGxlIGJlbG93KS4gIFRvIGxpbWl0OiAgVGhlIHRhcmdldCBwaXBlbGluZSAoZS5nLiwgW3J1bl0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vKSwgW2NvbXBpbGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vY29tcGlsZS8pKTogIGBgYCB5YW1sICAgZGlzYWJsZWRBcmdzOiAgIC0gXCJwaXBlbGluZTpecnVuXCIgIyBkaXNhbGxvdyBjb21waWxlIGBgYCAgVGFyZ2V0IGFyZ3VtZW50cyAoZS5nLiwgW3Byb2Nlc3Mgb3V0cHV0c10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vb3V0cHV0L2V2ZW50L3Byb2Nlc3MvKSk6ICBgYGAgeWFtbCAgIC0gXCJwcm9jT3V0Q29tbWFuZDpeZmx1ZW50LWJpdCRcIiAgICMgbGltaXQgdG8gRmx1ZW50IEJpdCBvbmx5ICAgIyAtIHByb2NPdXRBcmdzOiA8c3BlY2lmeS1yZWdleD4gICMgZnVydGhlciBsaW1pdCBhcmdzIGZvciBGbHVlbnQgQml0IGBgYCAgQ29udHJvbCB3aGljaCBhcmd1bWVudCBbc291cmNlc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb25maWcvI3NvdXJjZXMpIHRvIGluc3BlY3Q6ICBgYGAgeWFtbCAgIC0gXCJzb3VyY2U6XmdpdGh1Yi4qXCIgICAgICAgICAgICAgIyBpbnNwZWN0IG9mIGFsbCBhcmd1bWVudHMgc291cmNlZCBmcm9tIEdpdEh1YiBhZ2FpbnN0IHRoaXMgbGlzdCAgIC0gXCJzb3VyY2U6Xig/IS9ldGMvbG9nMTB4LykuKlwiICAgIyBpbnNwZWN0IG9mIGFsbCBhcmd1bWVudHMgc291cmNlZCBmcm9tIGNvbmZpZyBmaWxlcyBOT1QgY29udGFpbmVkIGluOiAvZXRjL2xvZzEweC8gYGBgIiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9LAogICAgImRlYnVnRW52VmFycyIgOiB7CiAgICAgICJ0eXBlIiA6IFsKICAgICAgICAiYXJyYXkiLAogICAgICAgICJzdHJpbmciLAogICAgICAgICJudWxsIgogICAgICBdLAogICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTGlzdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gZGVidWdcblxuU3BlY2lmaWVzIGEgbGlzdCBvZiBlbnYgdmFyIG5hbWVzIGZvciB3aGljaCB0byBsb2cgaW5mb3JtYXRpb24gcmVsYXRpbmcgdG8gaG93IHRoZXkgYXJlIHJlc29sdmVkLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjYWxsOiBgTDFFbnYuZ2V0KFwibXlWYXJcIiwgXCJteURlZmF1bHRcIilgIGNhbiBiZSByZXNvbHZlZCBmcm9tIGEgbnVtYmVyIG9mIFtzb3VyY2VzXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWEVudi5nZXQpIHJhbmdpbmcgZnJvbSBsYXVuY2ggYXJndW1lbnRzLCB0byBPUy9KVk0gcHJvcGVydGllcyBhbmQgYSBkZWZhdWx0IHZhbHVlIChlLmcuLCBteURlZmF1bHQpLiAgU2V0dGluZyB0aGlzIHZhbHVlIHRvIGBteVZhcmAgd2lsbCBsb2cgSU5GTyBsZXZlbCBpbmZvcm1hdGlvbiBkZXRhaWxpbmcgaG93IHRoZSB2YWx1ZSBvZiB0aGUgYG15VmFyYCB3YXMgcmVzb2x2ZWQuIiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9CiAgfSwKICAicmVxdWlyZWQiIDogWwogICAgInRlbngiCiAgXSwKICAiYWRkaXRpb25hbFByb3BlcnRpZXMiIDogZmFsc2UKfQ==</template>

    ```yaml
    # 🔟❎ compile bootstrap configuration
    
    # This config file specifies bootstrap options for the compile pipeline.
    # To learn more see https://doc.log10x.com/compile/bootstrap
    
    # To learn more see https://doc.log10x.com/config/
    
    tenx: compile
    
    # =============================== Launch Settings ==============================
    
    # 'licenseKey' specifies a signed JWT license token used for authenticating against the 10x service
    licenseKey: $=TenXEnv.get("TENX_LICENSE_KEY", "NO-LICENSE")
    
    # 'licenseFile' specifies a path to a file containing the signed JWT license token.
    # Preferred over 'licenseKey' on production hosts: the token does not appear in 'ps' output.
    licenseFile: $=TenXEnv.get("TENX_LICENSE_FILE")
    
    # 'airgapped' suppresses every call to the 10x SaaS gateway: the license is verified locally against the embedded
    # public key, and ALL outbound calls to the 10x SaaS gateway are suppressed (no DNS, no TCP).
    airgapped: $=TenXEnv.get("TENX_AIRGAPPED", "false")
    
    # 'includePaths' specifies folders on disk for resolving relative config file/folder references in addition to the working folder
    includePaths: []
    
    # 'quiet' disables printing version information to the console.
    # quiet: true
    
    # 'jarFiles' specifies .jar files to dynamically load for use by compile, input and output API extensions.
    jarFiles: []
    
    # 'metricEndpoint' specifies a Prometheus remote-write endpoint for pipeline usage and health metrics.
    # Unset by default. The endpoint is a self-hosted or vendor Prometheus-compatible store, never a 10x
    # service, and is where the MCP reads engine state back from to tune policy such as regulator rates.
    # metricEndpoint: https://prometheus.example.com/api/v1/write
    
    # specifies a list of launch arguments that are disallowed from either command line or user config files.
    disabledArgs: []
    ```

## :material-menu: Options

Specify the options below to [configure](/config "configure") the Pipeline Bootstrapper:

|Name|Description|
|---|---|
|[tenx](#tenx "name of pipeline to execute")|Name of pipeline to execute|
|[licenseFile](#licensefile "path to a file containing the 10x license JWT")|Path to a file containing the 10x license JWT|
|[licenseKey](#licensekey "10x license JWT (inline)")|10x license JWT (inline)|
|[airgapped](#airgapped "run without contacting the 10x service")|Run without contacting the 10x service|
|[metricEndpoint](#metricendpoint "10x service Prometheus metrics endpoint")|10x service Prometheus metrics endpoint|
|[runtimeName](#runtimename "name to report to the 10x service endpoint for this runtime instance")|Name to report to the 10x service endpoint for this runtime instance|
|[runtimeAttributes](#runtimeattributes "list of attributes to add to all metrics reporting")|List of attributes to add to all metrics reporting|
|[includePaths](#includepaths "pipeline include folders")|Pipeline include folders|
|[jarFiles](#jarfiles "jar files to load")|Jar files to load|
|[quiet](#quiet "disable printing binary version information to the console")|Disable printing binary version information to the console|
|[disabledArgs](#disabledargs "limit argument values that can be set by users")|Limit argument values that can be set by users|
|[debugEnvVars](#debugenvvars "list environment variables to debug")|List environment variables to debug|

### :material-menu-right-outline:**`tenx`**

Name of pipeline to execute.

|Type|Required|Names|
|---|---|---|
|String|✔|\[tenx, pipeline\]|

Target [pipeline](https://doc.log10x.com/engine/pipeline/) to execute.

For example, to specify the [run](https://doc.log10x.com/run/) pipeline and a [YAML](https://doc.log10x.com/config/yaml/) config file containing launch arguments, use:

```console
$ tenx run @~/my.yaml
```

The YAML file may specify the pipeline name via a 'tenx' entry, allowing the 'pipeline' argument to be omitted from the command line.

For example (my.yaml):

```yaml
tenx: run # set the pipeline to 'run'
licenseKey: <my-license-jwt>
...
```

Allows for launching the run pipeline via:

```console
$ tenx @~/my.yaml
```


### :material-menu-right-outline:**`licenseFile`**

Path to a file containing the 10x license JWT.

|Type|Default|Names|
|---|---|---|
|String|""|\[licenseFile, TENX\_LICENSE\_FILE\]|

Path to a file containing the signed 10x license JWT.
Preferred over `licenseKey` for production: the token is not visible in `ps` output and is easy to rotate by replacing the file.

Without a license the engine runs on the built-in 30-day evaluation license.
See [licensing](https://doc.log10x.com/manage/license/) for production licenses.

If both `licenseFile` and `licenseKey` are provided, the file wins.


### :material-menu-right-outline:**`licenseKey`**

10x license JWT (inline).

|Type|Default|Names|
|---|---|---|
|String|""|\[licenseKey, TENX\_LICENSE\_KEY\]|

The signed 10x license JWT, passed inline.
Discouraged on the command line because the value is visible in `ps` output; prefer `licenseFile` in production.

Without a license the engine runs on the built-in 30-day evaluation license.
See [licensing](https://doc.log10x.com/manage/license/) for production licenses.


### :material-menu-right-outline:**`airgapped`**

Run without contacting the 10x service.

|Type|Default|Names|
|---|---|---|
|Boolean|false|\[airgapped, TENX\_AIRGAPPED\]|

When `true`, the license is verified locally (signature + claims) and no calls are made to the 10x service:
no startup validation, no metrics reporting, no user-attribute enrichment. Suitable for fully airgapped deployments
where the engine has no path to the vendor SaaS.

When `false` (default), the engine additionally calls the 10x service at startup, and only when a service endpoint is actually configured; the default configuration names none, so an unconfigured engine makes no call either way. The call is best-effort enrichment: the local verification is the gate, and a service that cannot be reached, or that answers with an error, produces a warning and the engine runs.

Airgapped mode is honored for every license type.


### :material-menu-right-outline:**`metricEndpoint`**

10x service Prometheus metrics endpoint.

|Type|Default|
|---|---|
|String|""|

Specifies the address of the Prometheus remote write endpoint to write
pipeline usage and health metrics.

Unset by default: an engine with no metric endpoint configured collects
metrics locally and sends them nowhere.

!!! note ""

    This argument is only settable in the 10x 'on-premises' build.


### :material-menu-right-outline:**`runtimeName`**

Name to report to the 10x service endpoint for this runtime instance.

|Type|Default|
|---|---|
|String|""|

Specifies a logical name used as a [tag value](https://www.baeldung.com/micrometer#4-meters){target="\_blank"} for pipeline metrics.
This value identifies instances of the 10x run/compile pipelines
when reporting to the 10x service. For example, for a 10x [Receiver](https://doc.log10x.com/apps/receiver/) with optimization enabled for Fluent Bit forwarders collecting events from a `broker` user-app,
this value can be set to: `receive_fluentbit_broker`.


### :material-menu-right-outline:**`runtimeAttributes`**

List of attributes to add to all metrics reporting.

|Type|Default|
|---|---|
|List|\[\]|

Specifies a list of key-value pairs in the format `key:value` to be added as tags to pipeline metrics reported to the 10x service.
These tags enable finer-grained filtering and analysis in monitoring systems like Prometheus.
Multiple attributes can be combined into a single string using a semicolon (`;`), e.g., `key1:val1;key2:val2`.

If a key does not start with tenx\_, the prefix tenx\_ is automatically prepended to ensure consistency in tag naming conventions.
For example, a provided attribute app:my-app will be reported as tenx\_app:my-app

```yaml
  runtimeAttributes:
    - app:reporter
    - env:edge
```


### :material-menu-right-outline:**`includePaths`**

Pipeline include folders.

|Type|Default|
|---|---|
|List|\[working directory of current process\]|

Specifies folders on disk for resoling relative references within [include directives](https://doc.log10x.com/config/yaml/#include-directives).


### :material-menu-right-outline:**`jarFiles`**

Jar files to load.

|Type|Default|
|---|---|
|List|\[\]|

Specifies a list of .jar files to load into the host JVM for use by [compile](https://doc.log10x.com/api/compile/),
[input](https://doc.log10x.com/api/input/) and [output](https://doc.log10x.com/api/output/) API extensions.

!!! note ""

    This argument is not supported in the [Runtime](https://doc.log10x.com/engine/flavors/#runtime) flavor.


### :material-menu-right-outline:**`quiet`**

Disable printing binary version information to the console.

|Type|Default|
|---|---|
|Boolean|false|

Disable printing build/version information to the console upon launch.


### :material-menu-right-outline:**`disabledArgs`**

Limit argument values that can be set by users.

|Type|Default|
|---|---|
|List|\[\]|

specifies a list of launch arguments that are disallowed from either command line or user config files.
This argument provides a method of limiting the target [pipeline](https://doc.log10x.com/shared/bootstrap/#pipeline), [source](https://doc.log10x.com/config/#sources)
and and [command line](https://doc.log10x.com/config/cli/) settable by the user.

This mechanism enables pipeline launchers such as the [Quarkus launcher](https://doc.log10x.com/api/launch/#quarkus)
to limit user input received via REST requests to a target subset of 'safe' arguments.

For example, adding [procOutCommand](https://doc.log10x.com/run/output/event/process/#procoutcommand "command to launch") to this list
ensures that no external process outputs can be launched by the runtime.

An optional regex pattern can limit arguments to a certain subset of values in the form of: `<arg-name>[:pattern]` (e.g., specific process names).
Multiple patterns can be specified per argument.

Matching the `source` argument determines which source locations to inspect (e.g., folders, files, GitHub repos).
For example, an admin may place .yaml config files containing preset Fluent Bit outputs in `/etc/log10x/`,
excluding their enclosed arguments from limits set by this list, while disallowing users to directly set them via the command-line
or by sourcing them from their local/GitHub config files (see example below).

To limit:

The target pipeline (e.g., [run](https://doc.log10x.com/run/), [compile](https://doc.log10x.com/compile/)):

```yaml
  disabledArgs:
  - "pipeline:^run" # disallow compile
```

Target arguments (e.g., [process outputs](https://doc.log10x.com/run/output/event/process/ "Write TenXObject and template values to a sub-process stdin")):

```yaml
  - "procOutCommand:^fluent-bit$"   # limit to Fluent Bit only
  # - procOutArgs: <specify-regex>  # further limit args for Fluent Bit
```

Control which argument [sources](https://doc.log10x.com/config/#sources) to inspect:

```yaml
  - "source:^github.*"             # inspect of all arguments sourced from GitHub against this list
  - "source:^(?!/etc/log10x/).*"   # inspect of all arguments sourced from config files NOT contained in: /etc/log10x/
```


### :material-menu-right-outline:**`debugEnvVars`**

List environment variables to debug.

|Type|Default|
|---|---|
|List|\[\]|

Specifies a list of env var names for which to log information relating to how they are resolved.

For example, the following call: `L1Env.get("myVar", "myDefault")` can be resolved from a number of [sources](https://doc.log10x.com/api/js/#TenXEnv.get)
ranging from launch arguments, to OS/JVM properties and a default value (e.g., myDefault).

Setting this value to `myVar` will log INFO level information detailing how the value of the `myVar` was resolved.


<br/>:material-github: This unit is defined in [bootstrap/unit.yaml](https://github.com/log-10x/modules/tree/main/pipelines/shared/units/bootstrap/unit.yaml "bootstrap/unit.yaml"){target="\_blank"}.

## :material-wrench-outline: Config Files

To configure the Pipeline Bootstrapper unit, [:material-cog: Edit](https://doc.log10x.com/config/app/#module-config "Learn how to edit app and module configurations") these files:
??? tenx-run "Run"

    <a id="run"></a>
    ### Run {.hidden-heading}

    Launch a [run pipeline](https://doc.log10x.com/run "run pipeline") to report, receive and optimize log/trace events in edge and cloud environments.

    Below is the default configuration from: [bootstrap/config.yaml](https://github.dev/log-10x/config/blob/main/pipelines/pipelines/run/bootstrap/config.yaml "bootstrap/config.yaml"){target="\_blank"}.  
  
    <div class="edit-options">
        <a class="md-button tenx-edit-online-button" data-tooltip="Edit online on github.dev" href="https://github.dev/log-10x/config/blob/main/pipelines/pipelines/run/bootstrap/config.yaml" target="_blank" rel="noopener noreferrer">
            <span class="twemoji" style="margin-right: 0.3rem;">
                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                    <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path>
                </svg>
            </span> Edit Online
        </a>
        <button class="md-button tenx-config.yaml2-edit-button" data-tooltip="Edit configuration file" data-dialog-id="config-yaml2-dialog">
            <span style="margin-right: 0.3rem;">
                <span class="twemoji">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                        <path d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                    </svg>
                </span>
            </span>Edit Locally
        </button>
    </div>
    
    <dialog id="config-yaml2-dialog" class="md-dialog md-dialog--editor">
        <div class="editor-dialog-wrapper">
            <div class="editor-dialog-header">
                <span class="editor-dialog-title">Edit Pipeline Bootstrapper Config Locally</span>
                <div class="editor-header-actions">
                    <button class="editor-toolbar-btn yaml-editor-locations" data-tooltip="Save">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-reset" data-tooltip="Reset to default">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M12.5 8c-2.65 0-5.05 1-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-copy" data-tooltip="Copy to clipboard">
                        <svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path></svg>
                        <svg class="icon-check" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn yaml-editor-fullscreen" data-tooltip="Fullscreen">
                        <svg class="icon-maximize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5,5H10V7H7V10H5V5M14,5H19V10H17V7H14V5M17,14H19V19H14V17H17V14M10,17V19H5V14H7V17H10Z"></path></svg>
                        <svg class="icon-minimize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M5,16H8V19H10V14H5V16M14,14V19H16V16H19V14H14M16,5V8H19V10H14V5H16M10,5V10H5V8H8V5H10Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn editor-dialog-close" onclick="closeDialog('config-yaml2-dialog')" data-tooltip="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path></svg>
                    </button>
                </div>
            </div>
            <div class="editor-dialog-content">
                <div class="yaml-editor-container"></div>
            </div>
            <div class="yaml-editor-statusbar">
                <span class="yaml-editor-status"></span>
            </div>
        </div>
        <!-- Locations Popup -->
        <div class="locations-popup" style="display: none;">
            <div class="locations-popup-content">
                <div class="locations-popup-header">
                    <span class="locations-header-label">Download and save to:</span>
                    <button class="locations-popup-close" aria-label="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
                            <path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path>
                        </svg>
                    </button>
                </div>
                <ul class="locations-list">
                    <li>
                        <span class="location-label">Linux / Docker / macOS
                            <span class="help-icon" data-tooltip="Default system location. The engine automatically reads configs from here at startup. Best for production deployments.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="default-path location-path" data-tooltip=""
                                data-copy-osx="/etc/log10x/config/run/bootstrap/config.yaml"
                                data-copy-nix="/etc/log10x/config/run/bootstrap/config.yaml"
                                data-copy-win="C:\log10x\configs/run/bootstrap/config.yaml"></code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Custom directory
                            <span class="help-icon" data-tooltip="Set TENX_CONFIG environment variable to point to a custom config directory. Useful when you want configs in a non-standard location.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="$TENX_CONFIG/run/bootstrap/config.yaml">$TENX_CONFIG/run/bootstrap/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Within cloned repo
                            <span class="help-icon" data-tooltip="First run: git clone github.com/log-10x/config. Then save the file to this path within the cloned folder. Use for version control.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="./pipelines/run/bootstrap/config.yaml">./pipelines/run/bootstrap/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                </ul>
                <div class="locations-popup-footer">
                    <button class="locations-download-btn" title="Download config file">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                            <path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path>
                        </svg>
                        <span>Download</span>
                    </button>
                </div>
            </div>
        </div>
    </dialog>
    
    <template class="tenx-config-schema" data-encoding="base64">ewogICJ0eXBlIiA6ICJvYmplY3QiLAogICJwcm9wZXJ0aWVzIiA6IHsKICAgICJ0ZW54IiA6IHsKICAgICAgInR5cGUiIDogWwogICAgICAgICJzdHJpbmciLAogICAgICAgICJudWxsIgogICAgICBdLAogICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTmFtZSBvZiBwaXBlbGluZSB0byBleGVjdXRlXG5cblRhcmdldCBbcGlwZWxpbmVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vZW5naW5lL3BpcGVsaW5lLykgdG8gZXhlY3V0ZS4gRm9yIGV4YW1wbGUsIHRvIHNwZWNpZnkgdGhlIFtydW5dKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuLykgcGlwZWxpbmUgYW5kIGEgW1lBTUxdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vY29uZmlnL3lhbWwvKSBjb25maWcgZmlsZSBjb250YWluaW5nIGxhdW5jaCBhcmd1bWVudHMsIHVzZTogIGBgYCBjb25zb2xlICQgdGVueCBydW4gQH4vbXkueWFtbCBgYGAgVGhlIFlBTUwgZmlsZSBtYXkgc3BlY2lmeSB0aGUgcGlwZWxpbmUgbmFtZSB2aWEgYSAndGVueCcgZW50cnksIGFsbG93aW5nIHRoZSAncGlwZWxpbmUnIGFyZ3VtZW50IHRvIGJlIG9taXR0ZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiAgRm9yIGV4YW1wbGUgKG15LnlhbWwpOiAgYGBgIHlhbWwgdGVueDogcnVuICMgc2V0IHRoZSBwaXBlbGluZSB0byAncnVuJyBsaWNlbnNlS2V5OiA8bXktbGljZW5zZS1qd3Q+IC4uLiBgYGAgIEFsbG93cyBmb3IgbGF1bmNoaW5nIHRoZSBydW4gcGlwZWxpbmUgdmlhOiBgYGAgY29uc29sZSAkIHRlbnggQH4vbXkueWFtbCBgYGAiCiAgICB9LAogICAgImxpY2Vuc2UiIDogewogICAgICAidHlwZSIgOiAib2JqZWN0IiwKICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlLAogICAgICAicHJvcGVydGllcyIgOiB7CiAgICAgICAgImZpbGUiIDogewogICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlBhdGggdG8gYSBmaWxlIGNvbnRhaW5pbmcgdGhlIDEweCBsaWNlbnNlIEpXVFxuXG5QYXRoIHRvIGEgZmlsZSBjb250YWluaW5nIHRoZSBzaWduZWQgMTB4IGxpY2Vuc2UgSldULiBQcmVmZXJyZWQgb3ZlciBgbGljZW5zZUtleWAgZm9yIHByb2R1Y3Rpb246IHRoZSB0b2tlbiBpcyBub3QgdmlzaWJsZSBpbiBgcHNgIG91dHB1dCBhbmQgaXMgZWFzeSB0byByb3RhdGUgYnkgcmVwbGFjaW5nIHRoZSBmaWxlLiAgV2l0aG91dCBhIGxpY2Vuc2UgdGhlIGVuZ2luZSBydW5zIG9uIHRoZSBidWlsdC1pbiAzMC1kYXkgZXZhbHVhdGlvbiBsaWNlbnNlLiBTZWUgW2xpY2Vuc2luZ10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9tYW5hZ2UvbGljZW5zZS8pIGZvciBwcm9kdWN0aW9uIGxpY2Vuc2VzLiAgSWYgYm90aCBgbGljZW5zZUZpbGVgIGFuZCBgbGljZW5zZUtleWAgYXJlIHByb3ZpZGVkLCB0aGUgZmlsZSB3aW5zLiIKICAgICAgICB9LAogICAgICAgICJrZXkiIDogewogICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIjEweCBsaWNlbnNlIEpXVCAoaW5saW5lKVxuXG5UaGUgc2lnbmVkIDEweCBsaWNlbnNlIEpXVCwgcGFzc2VkIGlubGluZS4gRGlzY291cmFnZWQgb24gdGhlIGNvbW1hbmQgbGluZSBiZWNhdXNlIHRoZSB2YWx1ZSBpcyB2aXNpYmxlIGluIGBwc2Agb3V0cHV0OyBwcmVmZXIgYGxpY2Vuc2VGaWxlYCBpbiBwcm9kdWN0aW9uLiAgV2l0aG91dCBhIGxpY2Vuc2UgdGhlIGVuZ2luZSBydW5zIG9uIHRoZSBidWlsdC1pbiAzMC1kYXkgZXZhbHVhdGlvbiBsaWNlbnNlLiBTZWUgW2xpY2Vuc2luZ10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9tYW5hZ2UvbGljZW5zZS8pIGZvciBwcm9kdWN0aW9uIGxpY2Vuc2VzLiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiYWlyZ2FwcGVkIiA6IHsKICAgICAgInR5cGUiIDogWwogICAgICAgICJib29sZWFuIiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlJ1biB3aXRob3V0IGNvbnRhY3RpbmcgdGhlIDEweCBzZXJ2aWNlXG5cbldoZW4gYHRydWVgLCB0aGUgbGljZW5zZSBpcyB2ZXJpZmllZCBsb2NhbGx5IChzaWduYXR1cmUgKyBjbGFpbXMpIGFuZCBubyBjYWxscyBhcmUgbWFkZSB0byB0aGUgMTB4IHNlcnZpY2U6IG5vIHN0YXJ0dXAgdmFsaWRhdGlvbiwgbm8gbWV0cmljcyByZXBvcnRpbmcsIG5vIHVzZXItYXR0cmlidXRlIGVucmljaG1lbnQuIFN1aXRhYmxlIGZvciBmdWxseSBhaXJnYXBwZWQgZGVwbG95bWVudHMgd2hlcmUgdGhlIGVuZ2luZSBoYXMgbm8gcGF0aCB0byB0aGUgdmVuZG9yIFNhYVMuICBXaGVuIGBmYWxzZWAgKGRlZmF1bHQpLCB0aGUgZW5naW5lIGFkZGl0aW9uYWxseSBjYWxscyB0aGUgMTB4IHNlcnZpY2UgYXQgc3RhcnR1cCwgYW5kIG9ubHkgd2hlbiBhIHNlcnZpY2UgZW5kcG9pbnQgaXMgYWN0dWFsbHkgY29uZmlndXJlZDsgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBuYW1lcyBub25lLCBzbyBhbiB1bmNvbmZpZ3VyZWQgZW5naW5lIG1ha2VzIG5vIGNhbGwgZWl0aGVyIHdheS4gVGhlIGNhbGwgaXMgYmVzdC1lZmZvcnQgZW5yaWNobWVudDogdGhlIGxvY2FsIHZlcmlmaWNhdGlvbiBpcyB0aGUgZ2F0ZSwgYW5kIGEgc2VydmljZSB0aGF0IGNhbm5vdCBiZSByZWFjaGVkLCBvciB0aGF0IGFuc3dlcnMgd2l0aCBhbiBlcnJvciwgcHJvZHVjZXMgYSB3YXJuaW5nIGFuZCB0aGUgZW5naW5lIHJ1bnMuICBBaXJnYXBwZWQgbW9kZSBpcyBob25vcmVkIGZvciBldmVyeSBsaWNlbnNlIHR5cGUuIChBY2NlcHRzIGJvb2xlYW4gb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiBmYWxzZSkiLAogICAgICAiZGVmYXVsdCIgOiBmYWxzZQogICAgfSwKICAgICJtZXRyaWNFbmRwb2ludCIgOiB7CiAgICAgICJ0eXBlIiA6IFsKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIjEweCBzZXJ2aWNlIFByb21ldGhldXMgbWV0cmljcyBlbmRwb2ludFxuXG5TcGVjaWZpZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIFByb21ldGhldXMgcmVtb3RlIHdyaXRlIGVuZHBvaW50IHRvIHdyaXRlIHBpcGVsaW5lIHVzYWdlIGFuZCBoZWFsdGggbWV0cmljcy4gIFVuc2V0IGJ5IGRlZmF1bHQ6IGFuIGVuZ2luZSB3aXRoIG5vIG1ldHJpYyBlbmRwb2ludCBjb25maWd1cmVkIGNvbGxlY3RzIG1ldHJpY3MgbG9jYWxseSBhbmQgc2VuZHMgdGhlbSBub3doZXJlLiAgISEhIG5vdGUgXCJcIiAgICAgIFRoaXMgYXJndW1lbnQgaXMgb25seSBzZXR0YWJsZSBpbiB0aGUgMTB4ICdvbi1wcmVtaXNlcycgYnVpbGQuIgogICAgfSwKICAgICJydW50aW1lIiA6IHsKICAgICAgInR5cGUiIDogIm9iamVjdCIsCiAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZSwKICAgICAgInByb3BlcnRpZXMiIDogewogICAgICAgICJuYW1lIiA6IHsKICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICJudWxsIgogICAgICAgICAgXSwKICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJOYW1lIHRvIHJlcG9ydCB0byB0aGUgMTB4IHNlcnZpY2UgZW5kcG9pbnQgZm9yIHRoaXMgcnVudGltZSBpbnN0YW5jZVxuXG5TcGVjaWZpZXMgYSBsb2dpY2FsIG5hbWUgdXNlZCBhcyBhIFt0YWcgdmFsdWVdKGh0dHBzOi8vd3d3LmJhZWxkdW5nLmNvbS9taWNyb21ldGVyIzQtbWV0ZXJzKSBmb3IgcGlwZWxpbmUgbWV0cmljcy4gVGhpcyB2YWx1ZSBpZGVudGlmaWVzIGluc3RhbmNlcyBvZiB0aGUgMTB4IHJ1bi9jb21waWxlIHBpcGVsaW5lcyB3aGVuIHJlcG9ydGluZyB0byB0aGUgMTB4IHNlcnZpY2UuIEZvciBleGFtcGxlLCBmb3IgYSAxMHggW1JlY2VpdmVyXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwcHMvcmVjZWl2ZXIvKSB3aXRoIG9wdGltaXphdGlvbiBlbmFibGVkIGZvciBGbHVlbnQgQml0IGZvcndhcmRlcnMgY29sbGVjdGluZyBldmVudHMgZnJvbSBhIGBicm9rZXJgIHVzZXItYXBwLCB0aGlzIHZhbHVlIGNhbiBiZSBzZXQgdG86IGByZWNlaXZlX2ZsdWVudGJpdF9icm9rZXJgIgogICAgICAgIH0sCiAgICAgICAgImF0dHJpYnV0ZXMiIDogewogICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkxpc3Qgb2YgYXR0cmlidXRlcyB0byBhZGQgdG8gYWxsIG1ldHJpY3MgcmVwb3J0aW5nXG5cblNwZWNpZmllcyBhIGxpc3Qgb2Yga2V5LXZhbHVlIHBhaXJzIGluIHRoZSBmb3JtYXQgYGtleTp2YWx1ZWAgdG8gYmUgYWRkZWQgYXMgdGFncyB0byBwaXBlbGluZSBtZXRyaWNzIHJlcG9ydGVkIHRvIHRoZSAxMHggc2VydmljZS4gVGhlc2UgdGFncyBlbmFibGUgZmluZXItZ3JhaW5lZCBmaWx0ZXJpbmcgYW5kIGFuYWx5c2lzIGluIG1vbml0b3Jpbmcgc3lzdGVtcyBsaWtlIFByb21ldGhldXMuIE11bHRpcGxlIGF0dHJpYnV0ZXMgY2FuIGJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgc3RyaW5nIHVzaW5nIGEgc2VtaWNvbG9uIChgO2ApLCBlLmcuLCBga2V5MTp2YWwxO2tleTI6dmFsMmAuICBJZiBhIGtleSBkb2VzIG5vdCBzdGFydCB3aXRoIHRlbnhfLCB0aGUgcHJlZml4IHRlbnhfIGlzIGF1dG9tYXRpY2FsbHkgcHJlcGVuZGVkIHRvIGVuc3VyZSBjb25zaXN0ZW5jeSBpbiB0YWcgbmFtaW5nIGNvbnZlbnRpb25zLiBGb3IgZXhhbXBsZSwgYSBwcm92aWRlZCBhdHRyaWJ1dGUgYXBwOm15LWFwcCB3aWxsIGJlIHJlcG9ydGVkIGFzIHRlbnhfYXBwOm15LWFwcCAgYGBgIHlhbWwgICBydW50aW1lQXR0cmlidXRlczogICAgIC0gYXBwOnJlcG9ydGVyICAgICAtIGVudjplZGdlIGBgYCIsCiAgICAgICAgICAiaXRlbXMiIDogewogICAgICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJpbmNsdWRlUGF0aHMiIDogewogICAgICAidHlwZSIgOiBbCiAgICAgICAgImFycmF5IiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlBpcGVsaW5lIGluY2x1ZGUgZm9sZGVyc1xuXG5TcGVjaWZpZXMgZm9sZGVycyBvbiBkaXNrIGZvciByZXNvbGluZyByZWxhdGl2ZSByZWZlcmVuY2VzIHdpdGhpbiBbaW5jbHVkZSBkaXJlY3RpdmVzXShodHRwczovL2RvYy5sb2cxMHguY29tL2NvbmZpZy95YW1sLyNpbmNsdWRlLWRpcmVjdGl2ZXMpLiAoRGVmYXVsdDogW1wid29ya2luZyBkaXJlY3Rvcnkgb2YgY3VycmVudCBwcm9jZXNzXCJdKSIsCiAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgInR5cGUiIDogInN0cmluZyIKICAgICAgfSwKICAgICAgImRlZmF1bHQiIDogWwogICAgICAgICJ3b3JraW5nIGRpcmVjdG9yeSBvZiBjdXJyZW50IHByb2Nlc3MiCiAgICAgIF0KICAgIH0sCiAgICAiamFyRmlsZXMiIDogewogICAgICAidHlwZSIgOiBbCiAgICAgICAgImFycmF5IiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkphciBmaWxlcyB0byBsb2FkXG5cblNwZWNpZmllcyBhIGxpc3Qgb2YgLmphciBmaWxlcyB0byBsb2FkIGludG8gdGhlIGhvc3QgSlZNIGZvciB1c2UgYnkgW2NvbXBpbGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vYXBpL2NvbXBpbGUvKSwgW2lucHV0XShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9pbnB1dC8pIGFuZCBbb3V0cHV0XShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9vdXRwdXQvKSBBUEkgZXh0ZW5zaW9ucy4gICEhISBub3RlIFwiXCIgICAgICBUaGlzIGFyZ3VtZW50IGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIFtSdW50aW1lXShodHRwczovL2RvYy5sb2cxMHguY29tL2VuZ2luZS9mbGF2b3JzLyNydW50aW1lKSBmbGF2b3IuIiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9LAogICAgInF1aWV0IiA6IHsKICAgICAgInR5cGUiIDogWwogICAgICAgICJib29sZWFuIiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkRpc2FibGUgcHJpbnRpbmcgYmluYXJ5IHZlcnNpb24gaW5mb3JtYXRpb24gdG8gdGhlIGNvbnNvbGVcblxuRGlzYWJsZSBwcmludGluZyBidWlsZC92ZXJzaW9uIGluZm9ybWF0aW9uIHRvIHRoZSBjb25zb2xlIHVwb24gbGF1bmNoIChBY2NlcHRzIGJvb2xlYW4gb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiBmYWxzZSkiLAogICAgICAiZGVmYXVsdCIgOiBmYWxzZQogICAgfSwKICAgICJkaXNhYmxlZEFyZ3MiIDogewogICAgICAidHlwZSIgOiBbCiAgICAgICAgImFycmF5IiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkxpbWl0IGFyZ3VtZW50IHZhbHVlcyB0aGF0IGNhbiBiZSBzZXQgYnkgdXNlcnNcblxuU3BlY2lmaWVzIGEgbGlzdCBvZiBsYXVuY2ggYXJndW1lbnRzIHRoYXQgYXJlIGRpc2FsbG93ZWQgZnJvbSBlaXRoZXIgY29tbWFuZCBsaW5lIG9yIHVzZXIgY29uZmlnIGZpbGVzLiBUaGlzIGFyZ3VtZW50IHByb3ZpZGVzIGEgbWV0aG9kIG9mIGxpbWl0aW5nIHRoZSB0YXJnZXQgW3BpcGVsaW5lXShodHRwczovL2RvYy5sb2cxMHguY29tL3NoYXJlZC9ib290c3RyYXAvI3BpcGVsaW5lKSwgW3NvdXJjZV0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb25maWcvI3NvdXJjZXMpIGFuZCBhbmQgW2NvbW1hbmQgbGluZV0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb25maWcvY2xpLykgc2V0dGFibGUgYnkgdGhlIHVzZXIuICBUaGlzIG1lY2hhbmlzbSBlbmFibGVzIHBpcGVsaW5lIGxhdW5jaGVycyBzdWNoIGFzIHRoZSBbUXVhcmt1cyBsYXVuY2hlcl0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9hcGkvbGF1bmNoLyNxdWFya3VzKSB0byBsaW1pdCB1c2VyIGlucHV0IHJlY2VpdmVkIHZpYSBSRVNUIHJlcXVlc3RzIHRvIGEgdGFyZ2V0IHN1YnNldCBvZiAnc2FmZScgYXJndW1lbnRzLiAgRm9yIGV4YW1wbGUsIGFkZGluZyBbcHJvY091dENvbW1hbmRdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9wcm9jZXNzLyNwcm9jb3V0Y29tbWFuZCkgdG8gdGhpcyBsaXN0IGVuc3VyZXMgdGhhdCBubyBleHRlcm5hbCBwcm9jZXNzIG91dHB1dHMgY2FuIGJlIGxhdW5jaGVkIGJ5IHRoZSBydW50aW1lLiAgQW4gb3B0aW9uYWwgcmVnZXggcGF0dGVybiBjYW4gbGltaXQgYXJndW1lbnRzIHRvIGEgY2VydGFpbiBzdWJzZXQgb2YgdmFsdWVzIGluIHRoZSBmb3JtIG9mOiBgPGFyZy1uYW1lPls6cGF0dGVybl1gIChlLmcuLCBzcGVjaWZpYyBwcm9jZXNzIG5hbWVzKS4gTXVsdGlwbGUgcGF0dGVybnMgY2FuIGJlIHNwZWNpZmllZCBwZXIgYXJndW1lbnQuICBNYXRjaGluZyB0aGUgYHNvdXJjZWAgYXJndW1lbnQgZGV0ZXJtaW5lcyB3aGljaCBzb3VyY2UgbG9jYXRpb25zIHRvIGluc3BlY3QgKGUuZy4sIGZvbGRlcnMsIGZpbGVzLCBHaXRIdWIgcmVwb3MpLiBGb3IgZXhhbXBsZSwgYW4gYWRtaW4gbWF5IHBsYWNlIC55YW1sIGNvbmZpZyBmaWxlcyBjb250YWluaW5nIHByZXNldCBGbHVlbnQgQml0IG91dHB1dHMgaW4gYC9ldGMvbG9nMTB4L2AsIGV4Y2x1ZGluZyB0aGVpciBlbmNsb3NlZCBhcmd1bWVudHMgZnJvbSBsaW1pdHMgc2V0IGJ5IHRoaXMgbGlzdCwgd2hpbGUgZGlzYWxsb3dpbmcgdXNlcnMgdG8gZGlyZWN0bHkgc2V0IHRoZW0gdmlhIHRoZSBjb21tYW5kLWxpbmUgb3IgYnkgc291cmNpbmcgdGhlbSBmcm9tIHRoZWlyIGxvY2FsL0dpdEh1YiBjb25maWcgZmlsZXMgKHNlZSBleGFtcGxlIGJlbG93KS4gIFRvIGxpbWl0OiAgVGhlIHRhcmdldCBwaXBlbGluZSAoZS5nLiwgW3J1bl0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vKSwgW2NvbXBpbGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vY29tcGlsZS8pKTogIGBgYCB5YW1sICAgZGlzYWJsZWRBcmdzOiAgIC0gXCJwaXBlbGluZTpecnVuXCIgIyBkaXNhbGxvdyBjb21waWxlIGBgYCAgVGFyZ2V0IGFyZ3VtZW50cyAoZS5nLiwgW3Byb2Nlc3Mgb3V0cHV0c10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vb3V0cHV0L2V2ZW50L3Byb2Nlc3MvKSk6ICBgYGAgeWFtbCAgIC0gXCJwcm9jT3V0Q29tbWFuZDpeZmx1ZW50LWJpdCRcIiAgICMgbGltaXQgdG8gRmx1ZW50IEJpdCBvbmx5ICAgIyAtIHByb2NPdXRBcmdzOiA8c3BlY2lmeS1yZWdleD4gICMgZnVydGhlciBsaW1pdCBhcmdzIGZvciBGbHVlbnQgQml0IGBgYCAgQ29udHJvbCB3aGljaCBhcmd1bWVudCBbc291cmNlc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb25maWcvI3NvdXJjZXMpIHRvIGluc3BlY3Q6ICBgYGAgeWFtbCAgIC0gXCJzb3VyY2U6XmdpdGh1Yi4qXCIgICAgICAgICAgICAgIyBpbnNwZWN0IG9mIGFsbCBhcmd1bWVudHMgc291cmNlZCBmcm9tIEdpdEh1YiBhZ2FpbnN0IHRoaXMgbGlzdCAgIC0gXCJzb3VyY2U6Xig/IS9ldGMvbG9nMTB4LykuKlwiICAgIyBpbnNwZWN0IG9mIGFsbCBhcmd1bWVudHMgc291cmNlZCBmcm9tIGNvbmZpZyBmaWxlcyBOT1QgY29udGFpbmVkIGluOiAvZXRjL2xvZzEweC8gYGBgIiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9LAogICAgImRlYnVnRW52VmFycyIgOiB7CiAgICAgICJ0eXBlIiA6IFsKICAgICAgICAiYXJyYXkiLAogICAgICAgICJzdHJpbmciLAogICAgICAgICJudWxsIgogICAgICBdLAogICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTGlzdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gZGVidWdcblxuU3BlY2lmaWVzIGEgbGlzdCBvZiBlbnYgdmFyIG5hbWVzIGZvciB3aGljaCB0byBsb2cgaW5mb3JtYXRpb24gcmVsYXRpbmcgdG8gaG93IHRoZXkgYXJlIHJlc29sdmVkLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjYWxsOiBgTDFFbnYuZ2V0KFwibXlWYXJcIiwgXCJteURlZmF1bHRcIilgIGNhbiBiZSByZXNvbHZlZCBmcm9tIGEgbnVtYmVyIG9mIFtzb3VyY2VzXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWEVudi5nZXQpIHJhbmdpbmcgZnJvbSBsYXVuY2ggYXJndW1lbnRzLCB0byBPUy9KVk0gcHJvcGVydGllcyBhbmQgYSBkZWZhdWx0IHZhbHVlIChlLmcuLCBteURlZmF1bHQpLiAgU2V0dGluZyB0aGlzIHZhbHVlIHRvIGBteVZhcmAgd2lsbCBsb2cgSU5GTyBsZXZlbCBpbmZvcm1hdGlvbiBkZXRhaWxpbmcgaG93IHRoZSB2YWx1ZSBvZiB0aGUgYG15VmFyYCB3YXMgcmVzb2x2ZWQuIiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9CiAgfSwKICAicmVxdWlyZWQiIDogWwogICAgInRlbngiCiAgXSwKICAiYWRkaXRpb25hbFByb3BlcnRpZXMiIDogZmFsc2UKfQ==</template>

    ```yaml
    # 🔟❎ run bootstrap configuration
    
    # This config file specifies bootstrap options for the run pipeline.
    # To learn more see https://doc.log10x.com/run/bootstrap
    
    # To learn more see https://doc.log10x.com/config/
    
    tenx: run
    
    # =============================== Launch Settings ==============================
    
    # 'licenseKey' specifies a signed JWT license token used for authenticating against the 10x service
    licenseKey: $=TenXEnv.get("TENX_LICENSE_KEY", "NO-LICENSE")
    
    # 'licenseFile' specifies a path to a file containing the signed JWT license token.
    # Preferred over 'licenseKey' on production hosts: the token does not appear in 'ps' output.
    licenseFile: $=TenXEnv.get("TENX_LICENSE_FILE")
    
    # 'airgapped' suppresses every call to the 10x SaaS gateway: the license is verified locally against the embedded
    # public key, and ALL outbound calls to the 10x SaaS gateway are suppressed (no DNS, no TCP).
    # Use for deployments where security review forbids vendor phone-home.
    airgapped: $=TenXEnv.get("TENX_AIRGAPPED", "false")
    
    # 'includePaths' specifies folders on disk for resolving relative config file/folder references in addition to the working folder
    includePaths: []
    
    # 'quiet' disables printing version information to the console.
    # quiet: true
    
    # 'jarFiles' specifies .jar files to dynamically load for use by compile, input and output API extensions.
    jarFiles: []
    
    # 'metricEndpoint' specifies a Prometheus remote-write endpoint for pipeline usage and health metrics.
    # Unset by default. The endpoint is a self-hosted or vendor Prometheus-compatible store, never a 10x
    # service, and is where the MCP reads engine state back from to tune policy such as regulator rates.
    # metricEndpoint: https://prometheus.example.com/api/v1/write
    
    # 'disabledArgs' specifies a list of launch arguments that are disallowed from either command line or user config files.
    disabledArgs: []
    
    # 'debugEnvVars' list environment variables to debug
    debugEnvVars: []
    ```

??? tenx-compile "Compile"

    <a id="compile"></a>
    ### Compile {.hidden-heading}

    Launch a [compile pipeline](https://doc.log10x.com/compile "compile pipeline") to scan source code and binary files to generate symbol unit and library files.

    Below is the default configuration from: [bootstrap/config.yaml](https://github.dev/log-10x/config/blob/main/pipelines/pipelines/compile/bootstrap/config.yaml "bootstrap/config.yaml"){target="\_blank"}.  
  
    <div class="edit-options">
        <a class="md-button tenx-edit-online-button" data-tooltip="Edit online on github.dev" href="https://github.dev/log-10x/config/blob/main/pipelines/pipelines/compile/bootstrap/config.yaml" target="_blank" rel="noopener noreferrer">
            <span class="twemoji" style="margin-right: 0.3rem;">
                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                    <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path>
                </svg>
            </span> Edit Online
        </a>
        <button class="md-button tenx-config.yaml3-edit-button" data-tooltip="Edit configuration file" data-dialog-id="config-yaml3-dialog">
            <span style="margin-right: 0.3rem;">
                <span class="twemoji">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                        <path d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                    </svg>
                </span>
            </span>Edit Locally
        </button>
    </div>
    
    <dialog id="config-yaml3-dialog" class="md-dialog md-dialog--editor">
        <div class="editor-dialog-wrapper">
            <div class="editor-dialog-header">
                <span class="editor-dialog-title">Edit Pipeline Bootstrapper Config Locally</span>
                <div class="editor-header-actions">
                    <button class="editor-toolbar-btn yaml-editor-locations" data-tooltip="Save">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-reset" data-tooltip="Reset to default">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M12.5 8c-2.65 0-5.05 1-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-copy" data-tooltip="Copy to clipboard">
                        <svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path></svg>
                        <svg class="icon-check" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn yaml-editor-fullscreen" data-tooltip="Fullscreen">
                        <svg class="icon-maximize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5,5H10V7H7V10H5V5M14,5H19V10H17V7H14V5M17,14H19V19H14V17H17V14M10,17V19H5V14H7V17H10Z"></path></svg>
                        <svg class="icon-minimize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M5,16H8V19H10V14H5V16M14,14V19H16V16H19V14H14M16,5V8H19V10H14V5H16M10,5V10H5V8H8V5H10Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn editor-dialog-close" onclick="closeDialog('config-yaml3-dialog')" data-tooltip="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path></svg>
                    </button>
                </div>
            </div>
            <div class="editor-dialog-content">
                <div class="yaml-editor-container"></div>
            </div>
            <div class="yaml-editor-statusbar">
                <span class="yaml-editor-status"></span>
            </div>
        </div>
        <!-- Locations Popup -->
        <div class="locations-popup" style="display: none;">
            <div class="locations-popup-content">
                <div class="locations-popup-header">
                    <span class="locations-header-label">Download and save to:</span>
                    <button class="locations-popup-close" aria-label="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
                            <path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path>
                        </svg>
                    </button>
                </div>
                <ul class="locations-list">
                    <li>
                        <span class="location-label">Linux / Docker / macOS
                            <span class="help-icon" data-tooltip="Default system location. The engine automatically reads configs from here at startup. Best for production deployments.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="default-path location-path" data-tooltip=""
                                data-copy-osx="/etc/log10x/config/compile/bootstrap/config.yaml"
                                data-copy-nix="/etc/log10x/config/compile/bootstrap/config.yaml"
                                data-copy-win="C:\log10x\configs/compile/bootstrap/config.yaml"></code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Custom directory
                            <span class="help-icon" data-tooltip="Set TENX_CONFIG environment variable to point to a custom config directory. Useful when you want configs in a non-standard location.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="$TENX_CONFIG/compile/bootstrap/config.yaml">$TENX_CONFIG/compile/bootstrap/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Within cloned repo
                            <span class="help-icon" data-tooltip="First run: git clone github.com/log-10x/config. Then save the file to this path within the cloned folder. Use for version control.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="./pipelines/compile/bootstrap/config.yaml">./pipelines/compile/bootstrap/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                </ul>
                <div class="locations-popup-footer">
                    <button class="locations-download-btn" title="Download config file">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                            <path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path>
                        </svg>
                        <span>Download</span>
                    </button>
                </div>
            </div>
        </div>
    </dialog>
    
    <template class="tenx-config-schema" data-encoding="base64">ewogICJ0eXBlIiA6ICJvYmplY3QiLAogICJwcm9wZXJ0aWVzIiA6IHsKICAgICJ0ZW54IiA6IHsKICAgICAgInR5cGUiIDogWwogICAgICAgICJzdHJpbmciLAogICAgICAgICJudWxsIgogICAgICBdLAogICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTmFtZSBvZiBwaXBlbGluZSB0byBleGVjdXRlXG5cblRhcmdldCBbcGlwZWxpbmVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vZW5naW5lL3BpcGVsaW5lLykgdG8gZXhlY3V0ZS4gRm9yIGV4YW1wbGUsIHRvIHNwZWNpZnkgdGhlIFtydW5dKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuLykgcGlwZWxpbmUgYW5kIGEgW1lBTUxdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vY29uZmlnL3lhbWwvKSBjb25maWcgZmlsZSBjb250YWluaW5nIGxhdW5jaCBhcmd1bWVudHMsIHVzZTogIGBgYCBjb25zb2xlICQgdGVueCBydW4gQH4vbXkueWFtbCBgYGAgVGhlIFlBTUwgZmlsZSBtYXkgc3BlY2lmeSB0aGUgcGlwZWxpbmUgbmFtZSB2aWEgYSAndGVueCcgZW50cnksIGFsbG93aW5nIHRoZSAncGlwZWxpbmUnIGFyZ3VtZW50IHRvIGJlIG9taXR0ZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiAgRm9yIGV4YW1wbGUgKG15LnlhbWwpOiAgYGBgIHlhbWwgdGVueDogcnVuICMgc2V0IHRoZSBwaXBlbGluZSB0byAncnVuJyBsaWNlbnNlS2V5OiA8bXktbGljZW5zZS1qd3Q+IC4uLiBgYGAgIEFsbG93cyBmb3IgbGF1bmNoaW5nIHRoZSBydW4gcGlwZWxpbmUgdmlhOiBgYGAgY29uc29sZSAkIHRlbnggQH4vbXkueWFtbCBgYGAiCiAgICB9LAogICAgImxpY2Vuc2UiIDogewogICAgICAidHlwZSIgOiAib2JqZWN0IiwKICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlLAogICAgICAicHJvcGVydGllcyIgOiB7CiAgICAgICAgImZpbGUiIDogewogICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlBhdGggdG8gYSBmaWxlIGNvbnRhaW5pbmcgdGhlIDEweCBsaWNlbnNlIEpXVFxuXG5QYXRoIHRvIGEgZmlsZSBjb250YWluaW5nIHRoZSBzaWduZWQgMTB4IGxpY2Vuc2UgSldULiBQcmVmZXJyZWQgb3ZlciBgbGljZW5zZUtleWAgZm9yIHByb2R1Y3Rpb246IHRoZSB0b2tlbiBpcyBub3QgdmlzaWJsZSBpbiBgcHNgIG91dHB1dCBhbmQgaXMgZWFzeSB0byByb3RhdGUgYnkgcmVwbGFjaW5nIHRoZSBmaWxlLiAgV2l0aG91dCBhIGxpY2Vuc2UgdGhlIGVuZ2luZSBydW5zIG9uIHRoZSBidWlsdC1pbiAzMC1kYXkgZXZhbHVhdGlvbiBsaWNlbnNlLiBTZWUgW2xpY2Vuc2luZ10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9tYW5hZ2UvbGljZW5zZS8pIGZvciBwcm9kdWN0aW9uIGxpY2Vuc2VzLiAgSWYgYm90aCBgbGljZW5zZUZpbGVgIGFuZCBgbGljZW5zZUtleWAgYXJlIHByb3ZpZGVkLCB0aGUgZmlsZSB3aW5zLiIKICAgICAgICB9LAogICAgICAgICJrZXkiIDogewogICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIjEweCBsaWNlbnNlIEpXVCAoaW5saW5lKVxuXG5UaGUgc2lnbmVkIDEweCBsaWNlbnNlIEpXVCwgcGFzc2VkIGlubGluZS4gRGlzY291cmFnZWQgb24gdGhlIGNvbW1hbmQgbGluZSBiZWNhdXNlIHRoZSB2YWx1ZSBpcyB2aXNpYmxlIGluIGBwc2Agb3V0cHV0OyBwcmVmZXIgYGxpY2Vuc2VGaWxlYCBpbiBwcm9kdWN0aW9uLiAgV2l0aG91dCBhIGxpY2Vuc2UgdGhlIGVuZ2luZSBydW5zIG9uIHRoZSBidWlsdC1pbiAzMC1kYXkgZXZhbHVhdGlvbiBsaWNlbnNlLiBTZWUgW2xpY2Vuc2luZ10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9tYW5hZ2UvbGljZW5zZS8pIGZvciBwcm9kdWN0aW9uIGxpY2Vuc2VzLiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiYWlyZ2FwcGVkIiA6IHsKICAgICAgInR5cGUiIDogWwogICAgICAgICJib29sZWFuIiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlJ1biB3aXRob3V0IGNvbnRhY3RpbmcgdGhlIDEweCBzZXJ2aWNlXG5cbldoZW4gYHRydWVgLCB0aGUgbGljZW5zZSBpcyB2ZXJpZmllZCBsb2NhbGx5IChzaWduYXR1cmUgKyBjbGFpbXMpIGFuZCBubyBjYWxscyBhcmUgbWFkZSB0byB0aGUgMTB4IHNlcnZpY2U6IG5vIHN0YXJ0dXAgdmFsaWRhdGlvbiwgbm8gbWV0cmljcyByZXBvcnRpbmcsIG5vIHVzZXItYXR0cmlidXRlIGVucmljaG1lbnQuIFN1aXRhYmxlIGZvciBmdWxseSBhaXJnYXBwZWQgZGVwbG95bWVudHMgd2hlcmUgdGhlIGVuZ2luZSBoYXMgbm8gcGF0aCB0byB0aGUgdmVuZG9yIFNhYVMuICBXaGVuIGBmYWxzZWAgKGRlZmF1bHQpLCB0aGUgZW5naW5lIGFkZGl0aW9uYWxseSBjYWxscyB0aGUgMTB4IHNlcnZpY2UgYXQgc3RhcnR1cCwgYW5kIG9ubHkgd2hlbiBhIHNlcnZpY2UgZW5kcG9pbnQgaXMgYWN0dWFsbHkgY29uZmlndXJlZDsgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBuYW1lcyBub25lLCBzbyBhbiB1bmNvbmZpZ3VyZWQgZW5naW5lIG1ha2VzIG5vIGNhbGwgZWl0aGVyIHdheS4gVGhlIGNhbGwgaXMgYmVzdC1lZmZvcnQgZW5yaWNobWVudDogdGhlIGxvY2FsIHZlcmlmaWNhdGlvbiBpcyB0aGUgZ2F0ZSwgYW5kIGEgc2VydmljZSB0aGF0IGNhbm5vdCBiZSByZWFjaGVkLCBvciB0aGF0IGFuc3dlcnMgd2l0aCBhbiBlcnJvciwgcHJvZHVjZXMgYSB3YXJuaW5nIGFuZCB0aGUgZW5naW5lIHJ1bnMuICBBaXJnYXBwZWQgbW9kZSBpcyBob25vcmVkIGZvciBldmVyeSBsaWNlbnNlIHR5cGUuIChBY2NlcHRzIGJvb2xlYW4gb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiBmYWxzZSkiLAogICAgICAiZGVmYXVsdCIgOiBmYWxzZQogICAgfSwKICAgICJtZXRyaWNFbmRwb2ludCIgOiB7CiAgICAgICJ0eXBlIiA6IFsKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIjEweCBzZXJ2aWNlIFByb21ldGhldXMgbWV0cmljcyBlbmRwb2ludFxuXG5TcGVjaWZpZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIFByb21ldGhldXMgcmVtb3RlIHdyaXRlIGVuZHBvaW50IHRvIHdyaXRlIHBpcGVsaW5lIHVzYWdlIGFuZCBoZWFsdGggbWV0cmljcy4gIFVuc2V0IGJ5IGRlZmF1bHQ6IGFuIGVuZ2luZSB3aXRoIG5vIG1ldHJpYyBlbmRwb2ludCBjb25maWd1cmVkIGNvbGxlY3RzIG1ldHJpY3MgbG9jYWxseSBhbmQgc2VuZHMgdGhlbSBub3doZXJlLiAgISEhIG5vdGUgXCJcIiAgICAgIFRoaXMgYXJndW1lbnQgaXMgb25seSBzZXR0YWJsZSBpbiB0aGUgMTB4ICdvbi1wcmVtaXNlcycgYnVpbGQuIgogICAgfSwKICAgICJydW50aW1lIiA6IHsKICAgICAgInR5cGUiIDogIm9iamVjdCIsCiAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZSwKICAgICAgInByb3BlcnRpZXMiIDogewogICAgICAgICJuYW1lIiA6IHsKICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICJudWxsIgogICAgICAgICAgXSwKICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJOYW1lIHRvIHJlcG9ydCB0byB0aGUgMTB4IHNlcnZpY2UgZW5kcG9pbnQgZm9yIHRoaXMgcnVudGltZSBpbnN0YW5jZVxuXG5TcGVjaWZpZXMgYSBsb2dpY2FsIG5hbWUgdXNlZCBhcyBhIFt0YWcgdmFsdWVdKGh0dHBzOi8vd3d3LmJhZWxkdW5nLmNvbS9taWNyb21ldGVyIzQtbWV0ZXJzKSBmb3IgcGlwZWxpbmUgbWV0cmljcy4gVGhpcyB2YWx1ZSBpZGVudGlmaWVzIGluc3RhbmNlcyBvZiB0aGUgMTB4IHJ1bi9jb21waWxlIHBpcGVsaW5lcyB3aGVuIHJlcG9ydGluZyB0byB0aGUgMTB4IHNlcnZpY2UuIEZvciBleGFtcGxlLCBmb3IgYSAxMHggW1JlY2VpdmVyXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwcHMvcmVjZWl2ZXIvKSB3aXRoIG9wdGltaXphdGlvbiBlbmFibGVkIGZvciBGbHVlbnQgQml0IGZvcndhcmRlcnMgY29sbGVjdGluZyBldmVudHMgZnJvbSBhIGBicm9rZXJgIHVzZXItYXBwLCB0aGlzIHZhbHVlIGNhbiBiZSBzZXQgdG86IGByZWNlaXZlX2ZsdWVudGJpdF9icm9rZXJgIgogICAgICAgIH0sCiAgICAgICAgImF0dHJpYnV0ZXMiIDogewogICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkxpc3Qgb2YgYXR0cmlidXRlcyB0byBhZGQgdG8gYWxsIG1ldHJpY3MgcmVwb3J0aW5nXG5cblNwZWNpZmllcyBhIGxpc3Qgb2Yga2V5LXZhbHVlIHBhaXJzIGluIHRoZSBmb3JtYXQgYGtleTp2YWx1ZWAgdG8gYmUgYWRkZWQgYXMgdGFncyB0byBwaXBlbGluZSBtZXRyaWNzIHJlcG9ydGVkIHRvIHRoZSAxMHggc2VydmljZS4gVGhlc2UgdGFncyBlbmFibGUgZmluZXItZ3JhaW5lZCBmaWx0ZXJpbmcgYW5kIGFuYWx5c2lzIGluIG1vbml0b3Jpbmcgc3lzdGVtcyBsaWtlIFByb21ldGhldXMuIE11bHRpcGxlIGF0dHJpYnV0ZXMgY2FuIGJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgc3RyaW5nIHVzaW5nIGEgc2VtaWNvbG9uIChgO2ApLCBlLmcuLCBga2V5MTp2YWwxO2tleTI6dmFsMmAuICBJZiBhIGtleSBkb2VzIG5vdCBzdGFydCB3aXRoIHRlbnhfLCB0aGUgcHJlZml4IHRlbnhfIGlzIGF1dG9tYXRpY2FsbHkgcHJlcGVuZGVkIHRvIGVuc3VyZSBjb25zaXN0ZW5jeSBpbiB0YWcgbmFtaW5nIGNvbnZlbnRpb25zLiBGb3IgZXhhbXBsZSwgYSBwcm92aWRlZCBhdHRyaWJ1dGUgYXBwOm15LWFwcCB3aWxsIGJlIHJlcG9ydGVkIGFzIHRlbnhfYXBwOm15LWFwcCAgYGBgIHlhbWwgICBydW50aW1lQXR0cmlidXRlczogICAgIC0gYXBwOnJlcG9ydGVyICAgICAtIGVudjplZGdlIGBgYCIsCiAgICAgICAgICAiaXRlbXMiIDogewogICAgICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJpbmNsdWRlUGF0aHMiIDogewogICAgICAidHlwZSIgOiBbCiAgICAgICAgImFycmF5IiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlBpcGVsaW5lIGluY2x1ZGUgZm9sZGVyc1xuXG5TcGVjaWZpZXMgZm9sZGVycyBvbiBkaXNrIGZvciByZXNvbGluZyByZWxhdGl2ZSByZWZlcmVuY2VzIHdpdGhpbiBbaW5jbHVkZSBkaXJlY3RpdmVzXShodHRwczovL2RvYy5sb2cxMHguY29tL2NvbmZpZy95YW1sLyNpbmNsdWRlLWRpcmVjdGl2ZXMpLiAoRGVmYXVsdDogW1wid29ya2luZyBkaXJlY3Rvcnkgb2YgY3VycmVudCBwcm9jZXNzXCJdKSIsCiAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgInR5cGUiIDogInN0cmluZyIKICAgICAgfSwKICAgICAgImRlZmF1bHQiIDogWwogICAgICAgICJ3b3JraW5nIGRpcmVjdG9yeSBvZiBjdXJyZW50IHByb2Nlc3MiCiAgICAgIF0KICAgIH0sCiAgICAiamFyRmlsZXMiIDogewogICAgICAidHlwZSIgOiBbCiAgICAgICAgImFycmF5IiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkphciBmaWxlcyB0byBsb2FkXG5cblNwZWNpZmllcyBhIGxpc3Qgb2YgLmphciBmaWxlcyB0byBsb2FkIGludG8gdGhlIGhvc3QgSlZNIGZvciB1c2UgYnkgW2NvbXBpbGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vYXBpL2NvbXBpbGUvKSwgW2lucHV0XShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9pbnB1dC8pIGFuZCBbb3V0cHV0XShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9vdXRwdXQvKSBBUEkgZXh0ZW5zaW9ucy4gICEhISBub3RlIFwiXCIgICAgICBUaGlzIGFyZ3VtZW50IGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIFtSdW50aW1lXShodHRwczovL2RvYy5sb2cxMHguY29tL2VuZ2luZS9mbGF2b3JzLyNydW50aW1lKSBmbGF2b3IuIiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9LAogICAgInF1aWV0IiA6IHsKICAgICAgInR5cGUiIDogWwogICAgICAgICJib29sZWFuIiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkRpc2FibGUgcHJpbnRpbmcgYmluYXJ5IHZlcnNpb24gaW5mb3JtYXRpb24gdG8gdGhlIGNvbnNvbGVcblxuRGlzYWJsZSBwcmludGluZyBidWlsZC92ZXJzaW9uIGluZm9ybWF0aW9uIHRvIHRoZSBjb25zb2xlIHVwb24gbGF1bmNoIChBY2NlcHRzIGJvb2xlYW4gb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiBmYWxzZSkiLAogICAgICAiZGVmYXVsdCIgOiBmYWxzZQogICAgfSwKICAgICJkaXNhYmxlZEFyZ3MiIDogewogICAgICAidHlwZSIgOiBbCiAgICAgICAgImFycmF5IiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkxpbWl0IGFyZ3VtZW50IHZhbHVlcyB0aGF0IGNhbiBiZSBzZXQgYnkgdXNlcnNcblxuU3BlY2lmaWVzIGEgbGlzdCBvZiBsYXVuY2ggYXJndW1lbnRzIHRoYXQgYXJlIGRpc2FsbG93ZWQgZnJvbSBlaXRoZXIgY29tbWFuZCBsaW5lIG9yIHVzZXIgY29uZmlnIGZpbGVzLiBUaGlzIGFyZ3VtZW50IHByb3ZpZGVzIGEgbWV0aG9kIG9mIGxpbWl0aW5nIHRoZSB0YXJnZXQgW3BpcGVsaW5lXShodHRwczovL2RvYy5sb2cxMHguY29tL3NoYXJlZC9ib290c3RyYXAvI3BpcGVsaW5lKSwgW3NvdXJjZV0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb25maWcvI3NvdXJjZXMpIGFuZCBhbmQgW2NvbW1hbmQgbGluZV0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb25maWcvY2xpLykgc2V0dGFibGUgYnkgdGhlIHVzZXIuICBUaGlzIG1lY2hhbmlzbSBlbmFibGVzIHBpcGVsaW5lIGxhdW5jaGVycyBzdWNoIGFzIHRoZSBbUXVhcmt1cyBsYXVuY2hlcl0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9hcGkvbGF1bmNoLyNxdWFya3VzKSB0byBsaW1pdCB1c2VyIGlucHV0IHJlY2VpdmVkIHZpYSBSRVNUIHJlcXVlc3RzIHRvIGEgdGFyZ2V0IHN1YnNldCBvZiAnc2FmZScgYXJndW1lbnRzLiAgRm9yIGV4YW1wbGUsIGFkZGluZyBbcHJvY091dENvbW1hbmRdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9wcm9jZXNzLyNwcm9jb3V0Y29tbWFuZCkgdG8gdGhpcyBsaXN0IGVuc3VyZXMgdGhhdCBubyBleHRlcm5hbCBwcm9jZXNzIG91dHB1dHMgY2FuIGJlIGxhdW5jaGVkIGJ5IHRoZSBydW50aW1lLiAgQW4gb3B0aW9uYWwgcmVnZXggcGF0dGVybiBjYW4gbGltaXQgYXJndW1lbnRzIHRvIGEgY2VydGFpbiBzdWJzZXQgb2YgdmFsdWVzIGluIHRoZSBmb3JtIG9mOiBgPGFyZy1uYW1lPls6cGF0dGVybl1gIChlLmcuLCBzcGVjaWZpYyBwcm9jZXNzIG5hbWVzKS4gTXVsdGlwbGUgcGF0dGVybnMgY2FuIGJlIHNwZWNpZmllZCBwZXIgYXJndW1lbnQuICBNYXRjaGluZyB0aGUgYHNvdXJjZWAgYXJndW1lbnQgZGV0ZXJtaW5lcyB3aGljaCBzb3VyY2UgbG9jYXRpb25zIHRvIGluc3BlY3QgKGUuZy4sIGZvbGRlcnMsIGZpbGVzLCBHaXRIdWIgcmVwb3MpLiBGb3IgZXhhbXBsZSwgYW4gYWRtaW4gbWF5IHBsYWNlIC55YW1sIGNvbmZpZyBmaWxlcyBjb250YWluaW5nIHByZXNldCBGbHVlbnQgQml0IG91dHB1dHMgaW4gYC9ldGMvbG9nMTB4L2AsIGV4Y2x1ZGluZyB0aGVpciBlbmNsb3NlZCBhcmd1bWVudHMgZnJvbSBsaW1pdHMgc2V0IGJ5IHRoaXMgbGlzdCwgd2hpbGUgZGlzYWxsb3dpbmcgdXNlcnMgdG8gZGlyZWN0bHkgc2V0IHRoZW0gdmlhIHRoZSBjb21tYW5kLWxpbmUgb3IgYnkgc291cmNpbmcgdGhlbSBmcm9tIHRoZWlyIGxvY2FsL0dpdEh1YiBjb25maWcgZmlsZXMgKHNlZSBleGFtcGxlIGJlbG93KS4gIFRvIGxpbWl0OiAgVGhlIHRhcmdldCBwaXBlbGluZSAoZS5nLiwgW3J1bl0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vKSwgW2NvbXBpbGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vY29tcGlsZS8pKTogIGBgYCB5YW1sICAgZGlzYWJsZWRBcmdzOiAgIC0gXCJwaXBlbGluZTpecnVuXCIgIyBkaXNhbGxvdyBjb21waWxlIGBgYCAgVGFyZ2V0IGFyZ3VtZW50cyAoZS5nLiwgW3Byb2Nlc3Mgb3V0cHV0c10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vb3V0cHV0L2V2ZW50L3Byb2Nlc3MvKSk6ICBgYGAgeWFtbCAgIC0gXCJwcm9jT3V0Q29tbWFuZDpeZmx1ZW50LWJpdCRcIiAgICMgbGltaXQgdG8gRmx1ZW50IEJpdCBvbmx5ICAgIyAtIHByb2NPdXRBcmdzOiA8c3BlY2lmeS1yZWdleD4gICMgZnVydGhlciBsaW1pdCBhcmdzIGZvciBGbHVlbnQgQml0IGBgYCAgQ29udHJvbCB3aGljaCBhcmd1bWVudCBbc291cmNlc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb25maWcvI3NvdXJjZXMpIHRvIGluc3BlY3Q6ICBgYGAgeWFtbCAgIC0gXCJzb3VyY2U6XmdpdGh1Yi4qXCIgICAgICAgICAgICAgIyBpbnNwZWN0IG9mIGFsbCBhcmd1bWVudHMgc291cmNlZCBmcm9tIEdpdEh1YiBhZ2FpbnN0IHRoaXMgbGlzdCAgIC0gXCJzb3VyY2U6Xig/IS9ldGMvbG9nMTB4LykuKlwiICAgIyBpbnNwZWN0IG9mIGFsbCBhcmd1bWVudHMgc291cmNlZCBmcm9tIGNvbmZpZyBmaWxlcyBOT1QgY29udGFpbmVkIGluOiAvZXRjL2xvZzEweC8gYGBgIiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9LAogICAgImRlYnVnRW52VmFycyIgOiB7CiAgICAgICJ0eXBlIiA6IFsKICAgICAgICAiYXJyYXkiLAogICAgICAgICJzdHJpbmciLAogICAgICAgICJudWxsIgogICAgICBdLAogICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTGlzdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gZGVidWdcblxuU3BlY2lmaWVzIGEgbGlzdCBvZiBlbnYgdmFyIG5hbWVzIGZvciB3aGljaCB0byBsb2cgaW5mb3JtYXRpb24gcmVsYXRpbmcgdG8gaG93IHRoZXkgYXJlIHJlc29sdmVkLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjYWxsOiBgTDFFbnYuZ2V0KFwibXlWYXJcIiwgXCJteURlZmF1bHRcIilgIGNhbiBiZSByZXNvbHZlZCBmcm9tIGEgbnVtYmVyIG9mIFtzb3VyY2VzXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWEVudi5nZXQpIHJhbmdpbmcgZnJvbSBsYXVuY2ggYXJndW1lbnRzLCB0byBPUy9KVk0gcHJvcGVydGllcyBhbmQgYSBkZWZhdWx0IHZhbHVlIChlLmcuLCBteURlZmF1bHQpLiAgU2V0dGluZyB0aGlzIHZhbHVlIHRvIGBteVZhcmAgd2lsbCBsb2cgSU5GTyBsZXZlbCBpbmZvcm1hdGlvbiBkZXRhaWxpbmcgaG93IHRoZSB2YWx1ZSBvZiB0aGUgYG15VmFyYCB3YXMgcmVzb2x2ZWQuIiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9CiAgfSwKICAicmVxdWlyZWQiIDogWwogICAgInRlbngiCiAgXSwKICAiYWRkaXRpb25hbFByb3BlcnRpZXMiIDogZmFsc2UKfQ==</template>

    ```yaml
    # 🔟❎ compile bootstrap configuration
    
    # This config file specifies bootstrap options for the compile pipeline.
    # To learn more see https://doc.log10x.com/compile/bootstrap
    
    # To learn more see https://doc.log10x.com/config/
    
    tenx: compile
    
    # =============================== Launch Settings ==============================
    
    # 'licenseKey' specifies a signed JWT license token used for authenticating against the 10x service
    licenseKey: $=TenXEnv.get("TENX_LICENSE_KEY", "NO-LICENSE")
    
    # 'licenseFile' specifies a path to a file containing the signed JWT license token.
    # Preferred over 'licenseKey' on production hosts: the token does not appear in 'ps' output.
    licenseFile: $=TenXEnv.get("TENX_LICENSE_FILE")
    
    # 'airgapped' suppresses every call to the 10x SaaS gateway: the license is verified locally against the embedded
    # public key, and ALL outbound calls to the 10x SaaS gateway are suppressed (no DNS, no TCP).
    airgapped: $=TenXEnv.get("TENX_AIRGAPPED", "false")
    
    # 'includePaths' specifies folders on disk for resolving relative config file/folder references in addition to the working folder
    includePaths: []
    
    # 'quiet' disables printing version information to the console.
    # quiet: true
    
    # 'jarFiles' specifies .jar files to dynamically load for use by compile, input and output API extensions.
    jarFiles: []
    
    # 'metricEndpoint' specifies a Prometheus remote-write endpoint for pipeline usage and health metrics.
    # Unset by default. The endpoint is a self-hosted or vendor Prometheus-compatible store, never a 10x
    # service, and is where the MCP reads engine state back from to tune policy such as regulator rates.
    # metricEndpoint: https://prometheus.example.com/api/v1/write
    
    # specifies a list of launch arguments that are disallowed from either command line or user config files.
    disabledArgs: []
    ```

## :material-menu: Options

Specify the options below to [configure](/config "configure") the Pipeline Bootstrapper:

|Name|Description|
|---|---|
|[tenx](#tenx "name of pipeline to execute")|Name of pipeline to execute|
|[licenseFile](#licensefile "path to a file containing the 10x license JWT")|Path to a file containing the 10x license JWT|
|[licenseKey](#licensekey "10x license JWT (inline)")|10x license JWT (inline)|
|[airgapped](#airgapped "run without contacting the 10x service")|Run without contacting the 10x service|
|[metricEndpoint](#metricendpoint "10x service Prometheus metrics endpoint")|10x service Prometheus metrics endpoint|
|[runtimeName](#runtimename "name to report to the 10x service endpoint for this runtime instance")|Name to report to the 10x service endpoint for this runtime instance|
|[runtimeAttributes](#runtimeattributes "list of attributes to add to all metrics reporting")|List of attributes to add to all metrics reporting|
|[includePaths](#includepaths "pipeline include folders")|Pipeline include folders|
|[jarFiles](#jarfiles "jar files to load")|Jar files to load|
|[quiet](#quiet "disable printing binary version information to the console")|Disable printing binary version information to the console|
|[disabledArgs](#disabledargs "limit argument values that can be set by users")|Limit argument values that can be set by users|
|[debugEnvVars](#debugenvvars "list environment variables to debug")|List environment variables to debug|

### :material-menu-right-outline:**`tenx`**

Name of pipeline to execute.

|Type|Required|Names|
|---|---|---|
|String|✔|\[tenx, pipeline\]|

Target [pipeline](https://doc.log10x.com/engine/pipeline/) to execute.

For example, to specify the [run](https://doc.log10x.com/run/) pipeline and a [YAML](https://doc.log10x.com/config/yaml/) config file containing launch arguments, use:

```console
$ tenx run @~/my.yaml
```

The YAML file may specify the pipeline name via a 'tenx' entry, allowing the 'pipeline' argument to be omitted from the command line.

For example (my.yaml):

```yaml
tenx: run # set the pipeline to 'run'
licenseKey: <my-license-jwt>
...
```

Allows for launching the run pipeline via:

```console
$ tenx @~/my.yaml
```


### :material-menu-right-outline:**`licenseFile`**

Path to a file containing the 10x license JWT.

|Type|Default|Names|
|---|---|---|
|String|""|\[licenseFile, TENX\_LICENSE\_FILE\]|

Path to a file containing the signed 10x license JWT.
Preferred over `licenseKey` for production: the token is not visible in `ps` output and is easy to rotate by replacing the file.

Without a license the engine runs on the built-in 30-day evaluation license.
See [licensing](https://doc.log10x.com/manage/license/) for production licenses.

If both `licenseFile` and `licenseKey` are provided, the file wins.


### :material-menu-right-outline:**`licenseKey`**

10x license JWT (inline).

|Type|Default|Names|
|---|---|---|
|String|""|\[licenseKey, TENX\_LICENSE\_KEY\]|

The signed 10x license JWT, passed inline.
Discouraged on the command line because the value is visible in `ps` output; prefer `licenseFile` in production.

Without a license the engine runs on the built-in 30-day evaluation license.
See [licensing](https://doc.log10x.com/manage/license/) for production licenses.


### :material-menu-right-outline:**`airgapped`**

Run without contacting the 10x service.

|Type|Default|Names|
|---|---|---|
|Boolean|false|\[airgapped, TENX\_AIRGAPPED\]|

When `true`, the license is verified locally (signature + claims) and no calls are made to the 10x service:
no startup validation, no metrics reporting, no user-attribute enrichment. Suitable for fully airgapped deployments
where the engine has no path to the vendor SaaS.

When `false` (default), the engine additionally calls the 10x service at startup, and only when a service endpoint is actually configured; the default configuration names none, so an unconfigured engine makes no call either way. The call is best-effort enrichment: the local verification is the gate, and a service that cannot be reached, or that answers with an error, produces a warning and the engine runs.

Airgapped mode is honored for every license type.


### :material-menu-right-outline:**`metricEndpoint`**

10x service Prometheus metrics endpoint.

|Type|Default|
|---|---|
|String|""|

Specifies the address of the Prometheus remote write endpoint to write
pipeline usage and health metrics.

Unset by default: an engine with no metric endpoint configured collects
metrics locally and sends them nowhere.

!!! note ""

    This argument is only settable in the 10x 'on-premises' build.


### :material-menu-right-outline:**`runtimeName`**

Name to report to the 10x service endpoint for this runtime instance.

|Type|Default|
|---|---|
|String|""|

Specifies a logical name used as a [tag value](https://www.baeldung.com/micrometer#4-meters){target="\_blank"} for pipeline metrics.
This value identifies instances of the 10x run/compile pipelines
when reporting to the 10x service. For example, for a 10x [Receiver](https://doc.log10x.com/apps/receiver/) with optimization enabled for Fluent Bit forwarders collecting events from a `broker` user-app,
this value can be set to: `receive_fluentbit_broker`.


### :material-menu-right-outline:**`runtimeAttributes`**

List of attributes to add to all metrics reporting.

|Type|Default|
|---|---|
|List|\[\]|

Specifies a list of key-value pairs in the format `key:value` to be added as tags to pipeline metrics reported to the 10x service.
These tags enable finer-grained filtering and analysis in monitoring systems like Prometheus.
Multiple attributes can be combined into a single string using a semicolon (`;`), e.g., `key1:val1;key2:val2`.

If a key does not start with tenx\_, the prefix tenx\_ is automatically prepended to ensure consistency in tag naming conventions.
For example, a provided attribute app:my-app will be reported as tenx\_app:my-app

```yaml
  runtimeAttributes:
    - app:reporter
    - env:edge
```


### :material-menu-right-outline:**`includePaths`**

Pipeline include folders.

|Type|Default|
|---|---|
|List|\[working directory of current process\]|

Specifies folders on disk for resoling relative references within [include directives](https://doc.log10x.com/config/yaml/#include-directives).


### :material-menu-right-outline:**`jarFiles`**

Jar files to load.

|Type|Default|
|---|---|
|List|\[\]|

Specifies a list of .jar files to load into the host JVM for use by [compile](https://doc.log10x.com/api/compile/),
[input](https://doc.log10x.com/api/input/) and [output](https://doc.log10x.com/api/output/) API extensions.

!!! note ""

    This argument is not supported in the [Runtime](https://doc.log10x.com/engine/flavors/#runtime) flavor.


### :material-menu-right-outline:**`quiet`**

Disable printing binary version information to the console.

|Type|Default|
|---|---|
|Boolean|false|

Disable printing build/version information to the console upon launch.


### :material-menu-right-outline:**`disabledArgs`**

Limit argument values that can be set by users.

|Type|Default|
|---|---|
|List|\[\]|

specifies a list of launch arguments that are disallowed from either command line or user config files.
This argument provides a method of limiting the target [pipeline](https://doc.log10x.com/shared/bootstrap/#pipeline), [source](https://doc.log10x.com/config/#sources)
and and [command line](https://doc.log10x.com/config/cli/) settable by the user.

This mechanism enables pipeline launchers such as the [Quarkus launcher](https://doc.log10x.com/api/launch/#quarkus)
to limit user input received via REST requests to a target subset of 'safe' arguments.

For example, adding [procOutCommand](https://doc.log10x.com/run/output/event/process/#procoutcommand "command to launch") to this list
ensures that no external process outputs can be launched by the runtime.

An optional regex pattern can limit arguments to a certain subset of values in the form of: `<arg-name>[:pattern]` (e.g., specific process names).
Multiple patterns can be specified per argument.

Matching the `source` argument determines which source locations to inspect (e.g., folders, files, GitHub repos).
For example, an admin may place .yaml config files containing preset Fluent Bit outputs in `/etc/log10x/`,
excluding their enclosed arguments from limits set by this list, while disallowing users to directly set them via the command-line
or by sourcing them from their local/GitHub config files (see example below).

To limit:

The target pipeline (e.g., [run](https://doc.log10x.com/run/), [compile](https://doc.log10x.com/compile/)):

```yaml
  disabledArgs:
  - "pipeline:^run" # disallow compile
```

Target arguments (e.g., [process outputs](https://doc.log10x.com/run/output/event/process/ "Write TenXObject and template values to a sub-process stdin")):

```yaml
  - "procOutCommand:^fluent-bit$"   # limit to Fluent Bit only
  # - procOutArgs: <specify-regex>  # further limit args for Fluent Bit
```

Control which argument [sources](https://doc.log10x.com/config/#sources) to inspect:

```yaml
  - "source:^github.*"             # inspect of all arguments sourced from GitHub against this list
  - "source:^(?!/etc/log10x/).*"   # inspect of all arguments sourced from config files NOT contained in: /etc/log10x/
```


### :material-menu-right-outline:**`debugEnvVars`**

List environment variables to debug.

|Type|Default|
|---|---|
|List|\[\]|

Specifies a list of env var names for which to log information relating to how they are resolved.

For example, the following call: `L1Env.get("myVar", "myDefault")` can be resolved from a number of [sources](https://doc.log10x.com/api/js/#TenXEnv.get)
ranging from launch arguments, to OS/JVM properties and a default value (e.g., myDefault).

Setting this value to `myVar` will log INFO level information detailing how the value of the `myVar` was resolved.


<br/>:material-github: This unit is defined in [bootstrap/unit.yaml](https://github.com/log-10x/modules/tree/main/pipelines/shared/units/bootstrap/unit.yaml "bootstrap/unit.yaml"){target="\_blank"}.

## :material-wrench-outline: Config Files

To configure the Pipeline Bootstrapper unit, [:material-cog: Edit](https://doc.log10x.com/config/app/#module-config "Learn how to edit app and module configurations") these files:
??? tenx-run "Run"

    <a id="run"></a>
    ### Run {.hidden-heading}

    Launch a [run pipeline](https://doc.log10x.com/run "run pipeline") to report, receive and optimize log/trace events in edge and cloud environments.

    Below is the default configuration from: [bootstrap/config.yaml](https://github.dev/log-10x/config/blob/main/pipelines/pipelines/run/bootstrap/config.yaml "bootstrap/config.yaml"){target="\_blank"}.  
  
    <div class="edit-options">
        <a class="md-button tenx-edit-online-button" data-tooltip="Edit online on github.dev" href="https://github.dev/log-10x/config/blob/main/pipelines/pipelines/run/bootstrap/config.yaml" target="_blank" rel="noopener noreferrer">
            <span class="twemoji" style="margin-right: 0.3rem;">
                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                    <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path>
                </svg>
            </span> Edit Online
        </a>
        <button class="md-button tenx-config.yaml4-edit-button" data-tooltip="Edit configuration file" data-dialog-id="config-yaml4-dialog">
            <span style="margin-right: 0.3rem;">
                <span class="twemoji">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                        <path d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                    </svg>
                </span>
            </span>Edit Locally
        </button>
    </div>
    
    <dialog id="config-yaml4-dialog" class="md-dialog md-dialog--editor">
        <div class="editor-dialog-wrapper">
            <div class="editor-dialog-header">
                <span class="editor-dialog-title">Edit Pipeline Bootstrapper Config Locally</span>
                <div class="editor-header-actions">
                    <button class="editor-toolbar-btn yaml-editor-locations" data-tooltip="Save">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-reset" data-tooltip="Reset to default">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M12.5 8c-2.65 0-5.05 1-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-copy" data-tooltip="Copy to clipboard">
                        <svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path></svg>
                        <svg class="icon-check" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn yaml-editor-fullscreen" data-tooltip="Fullscreen">
                        <svg class="icon-maximize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5,5H10V7H7V10H5V5M14,5H19V10H17V7H14V5M17,14H19V19H14V17H17V14M10,17V19H5V14H7V17H10Z"></path></svg>
                        <svg class="icon-minimize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M5,16H8V19H10V14H5V16M14,14V19H16V16H19V14H14M16,5V8H19V10H14V5H16M10,5V10H5V8H8V5H10Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn editor-dialog-close" onclick="closeDialog('config-yaml4-dialog')" data-tooltip="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path></svg>
                    </button>
                </div>
            </div>
            <div class="editor-dialog-content">
                <div class="yaml-editor-container"></div>
            </div>
            <div class="yaml-editor-statusbar">
                <span class="yaml-editor-status"></span>
            </div>
        </div>
        <!-- Locations Popup -->
        <div class="locations-popup" style="display: none;">
            <div class="locations-popup-content">
                <div class="locations-popup-header">
                    <span class="locations-header-label">Download and save to:</span>
                    <button class="locations-popup-close" aria-label="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
                            <path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path>
                        </svg>
                    </button>
                </div>
                <ul class="locations-list">
                    <li>
                        <span class="location-label">Linux / Docker / macOS
                            <span class="help-icon" data-tooltip="Default system location. The engine automatically reads configs from here at startup. Best for production deployments.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="default-path location-path" data-tooltip=""
                                data-copy-osx="/etc/log10x/config/run/bootstrap/config.yaml"
                                data-copy-nix="/etc/log10x/config/run/bootstrap/config.yaml"
                                data-copy-win="C:\log10x\configs/run/bootstrap/config.yaml"></code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Custom directory
                            <span class="help-icon" data-tooltip="Set TENX_CONFIG environment variable to point to a custom config directory. Useful when you want configs in a non-standard location.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="$TENX_CONFIG/run/bootstrap/config.yaml">$TENX_CONFIG/run/bootstrap/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Within cloned repo
                            <span class="help-icon" data-tooltip="First run: git clone github.com/log-10x/config. Then save the file to this path within the cloned folder. Use for version control.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="./pipelines/run/bootstrap/config.yaml">./pipelines/run/bootstrap/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                </ul>
                <div class="locations-popup-footer">
                    <button class="locations-download-btn" title="Download config file">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                            <path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path>
                        </svg>
                        <span>Download</span>
                    </button>
                </div>
            </div>
        </div>
    </dialog>
    
    <template class="tenx-config-schema" data-encoding="base64">ewogICJ0eXBlIiA6ICJvYmplY3QiLAogICJwcm9wZXJ0aWVzIiA6IHsKICAgICJ0ZW54IiA6IHsKICAgICAgInR5cGUiIDogWwogICAgICAgICJzdHJpbmciLAogICAgICAgICJudWxsIgogICAgICBdLAogICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTmFtZSBvZiBwaXBlbGluZSB0byBleGVjdXRlXG5cblRhcmdldCBbcGlwZWxpbmVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vZW5naW5lL3BpcGVsaW5lLykgdG8gZXhlY3V0ZS4gRm9yIGV4YW1wbGUsIHRvIHNwZWNpZnkgdGhlIFtydW5dKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuLykgcGlwZWxpbmUgYW5kIGEgW1lBTUxdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vY29uZmlnL3lhbWwvKSBjb25maWcgZmlsZSBjb250YWluaW5nIGxhdW5jaCBhcmd1bWVudHMsIHVzZTogIGBgYCBjb25zb2xlICQgdGVueCBydW4gQH4vbXkueWFtbCBgYGAgVGhlIFlBTUwgZmlsZSBtYXkgc3BlY2lmeSB0aGUgcGlwZWxpbmUgbmFtZSB2aWEgYSAndGVueCcgZW50cnksIGFsbG93aW5nIHRoZSAncGlwZWxpbmUnIGFyZ3VtZW50IHRvIGJlIG9taXR0ZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiAgRm9yIGV4YW1wbGUgKG15LnlhbWwpOiAgYGBgIHlhbWwgdGVueDogcnVuICMgc2V0IHRoZSBwaXBlbGluZSB0byAncnVuJyBsaWNlbnNlS2V5OiA8bXktbGljZW5zZS1qd3Q+IC4uLiBgYGAgIEFsbG93cyBmb3IgbGF1bmNoaW5nIHRoZSBydW4gcGlwZWxpbmUgdmlhOiBgYGAgY29uc29sZSAkIHRlbnggQH4vbXkueWFtbCBgYGAiCiAgICB9LAogICAgImxpY2Vuc2UiIDogewogICAgICAidHlwZSIgOiAib2JqZWN0IiwKICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlLAogICAgICAicHJvcGVydGllcyIgOiB7CiAgICAgICAgImZpbGUiIDogewogICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlBhdGggdG8gYSBmaWxlIGNvbnRhaW5pbmcgdGhlIDEweCBsaWNlbnNlIEpXVFxuXG5QYXRoIHRvIGEgZmlsZSBjb250YWluaW5nIHRoZSBzaWduZWQgMTB4IGxpY2Vuc2UgSldULiBQcmVmZXJyZWQgb3ZlciBgbGljZW5zZUtleWAgZm9yIHByb2R1Y3Rpb246IHRoZSB0b2tlbiBpcyBub3QgdmlzaWJsZSBpbiBgcHNgIG91dHB1dCBhbmQgaXMgZWFzeSB0byByb3RhdGUgYnkgcmVwbGFjaW5nIHRoZSBmaWxlLiAgV2l0aG91dCBhIGxpY2Vuc2UgdGhlIGVuZ2luZSBydW5zIG9uIHRoZSBidWlsdC1pbiAzMC1kYXkgZXZhbHVhdGlvbiBsaWNlbnNlLiBTZWUgW2xpY2Vuc2luZ10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9tYW5hZ2UvbGljZW5zZS8pIGZvciBwcm9kdWN0aW9uIGxpY2Vuc2VzLiAgSWYgYm90aCBgbGljZW5zZUZpbGVgIGFuZCBgbGljZW5zZUtleWAgYXJlIHByb3ZpZGVkLCB0aGUgZmlsZSB3aW5zLiIKICAgICAgICB9LAogICAgICAgICJrZXkiIDogewogICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIjEweCBsaWNlbnNlIEpXVCAoaW5saW5lKVxuXG5UaGUgc2lnbmVkIDEweCBsaWNlbnNlIEpXVCwgcGFzc2VkIGlubGluZS4gRGlzY291cmFnZWQgb24gdGhlIGNvbW1hbmQgbGluZSBiZWNhdXNlIHRoZSB2YWx1ZSBpcyB2aXNpYmxlIGluIGBwc2Agb3V0cHV0OyBwcmVmZXIgYGxpY2Vuc2VGaWxlYCBpbiBwcm9kdWN0aW9uLiAgV2l0aG91dCBhIGxpY2Vuc2UgdGhlIGVuZ2luZSBydW5zIG9uIHRoZSBidWlsdC1pbiAzMC1kYXkgZXZhbHVhdGlvbiBsaWNlbnNlLiBTZWUgW2xpY2Vuc2luZ10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9tYW5hZ2UvbGljZW5zZS8pIGZvciBwcm9kdWN0aW9uIGxpY2Vuc2VzLiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiYWlyZ2FwcGVkIiA6IHsKICAgICAgInR5cGUiIDogWwogICAgICAgICJib29sZWFuIiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlJ1biB3aXRob3V0IGNvbnRhY3RpbmcgdGhlIDEweCBzZXJ2aWNlXG5cbldoZW4gYHRydWVgLCB0aGUgbGljZW5zZSBpcyB2ZXJpZmllZCBsb2NhbGx5IChzaWduYXR1cmUgKyBjbGFpbXMpIGFuZCBubyBjYWxscyBhcmUgbWFkZSB0byB0aGUgMTB4IHNlcnZpY2U6IG5vIHN0YXJ0dXAgdmFsaWRhdGlvbiwgbm8gbWV0cmljcyByZXBvcnRpbmcsIG5vIHVzZXItYXR0cmlidXRlIGVucmljaG1lbnQuIFN1aXRhYmxlIGZvciBmdWxseSBhaXJnYXBwZWQgZGVwbG95bWVudHMgd2hlcmUgdGhlIGVuZ2luZSBoYXMgbm8gcGF0aCB0byB0aGUgdmVuZG9yIFNhYVMuICBXaGVuIGBmYWxzZWAgKGRlZmF1bHQpLCB0aGUgZW5naW5lIGFkZGl0aW9uYWxseSBjYWxscyB0aGUgMTB4IHNlcnZpY2UgYXQgc3RhcnR1cCwgYW5kIG9ubHkgd2hlbiBhIHNlcnZpY2UgZW5kcG9pbnQgaXMgYWN0dWFsbHkgY29uZmlndXJlZDsgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBuYW1lcyBub25lLCBzbyBhbiB1bmNvbmZpZ3VyZWQgZW5naW5lIG1ha2VzIG5vIGNhbGwgZWl0aGVyIHdheS4gVGhlIGNhbGwgaXMgYmVzdC1lZmZvcnQgZW5yaWNobWVudDogdGhlIGxvY2FsIHZlcmlmaWNhdGlvbiBpcyB0aGUgZ2F0ZSwgYW5kIGEgc2VydmljZSB0aGF0IGNhbm5vdCBiZSByZWFjaGVkLCBvciB0aGF0IGFuc3dlcnMgd2l0aCBhbiBlcnJvciwgcHJvZHVjZXMgYSB3YXJuaW5nIGFuZCB0aGUgZW5naW5lIHJ1bnMuICBBaXJnYXBwZWQgbW9kZSBpcyBob25vcmVkIGZvciBldmVyeSBsaWNlbnNlIHR5cGUuIChBY2NlcHRzIGJvb2xlYW4gb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiBmYWxzZSkiLAogICAgICAiZGVmYXVsdCIgOiBmYWxzZQogICAgfSwKICAgICJtZXRyaWNFbmRwb2ludCIgOiB7CiAgICAgICJ0eXBlIiA6IFsKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIjEweCBzZXJ2aWNlIFByb21ldGhldXMgbWV0cmljcyBlbmRwb2ludFxuXG5TcGVjaWZpZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIFByb21ldGhldXMgcmVtb3RlIHdyaXRlIGVuZHBvaW50IHRvIHdyaXRlIHBpcGVsaW5lIHVzYWdlIGFuZCBoZWFsdGggbWV0cmljcy4gIFVuc2V0IGJ5IGRlZmF1bHQ6IGFuIGVuZ2luZSB3aXRoIG5vIG1ldHJpYyBlbmRwb2ludCBjb25maWd1cmVkIGNvbGxlY3RzIG1ldHJpY3MgbG9jYWxseSBhbmQgc2VuZHMgdGhlbSBub3doZXJlLiAgISEhIG5vdGUgXCJcIiAgICAgIFRoaXMgYXJndW1lbnQgaXMgb25seSBzZXR0YWJsZSBpbiB0aGUgMTB4ICdvbi1wcmVtaXNlcycgYnVpbGQuIgogICAgfSwKICAgICJydW50aW1lIiA6IHsKICAgICAgInR5cGUiIDogIm9iamVjdCIsCiAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZSwKICAgICAgInByb3BlcnRpZXMiIDogewogICAgICAgICJuYW1lIiA6IHsKICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICJudWxsIgogICAgICAgICAgXSwKICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJOYW1lIHRvIHJlcG9ydCB0byB0aGUgMTB4IHNlcnZpY2UgZW5kcG9pbnQgZm9yIHRoaXMgcnVudGltZSBpbnN0YW5jZVxuXG5TcGVjaWZpZXMgYSBsb2dpY2FsIG5hbWUgdXNlZCBhcyBhIFt0YWcgdmFsdWVdKGh0dHBzOi8vd3d3LmJhZWxkdW5nLmNvbS9taWNyb21ldGVyIzQtbWV0ZXJzKSBmb3IgcGlwZWxpbmUgbWV0cmljcy4gVGhpcyB2YWx1ZSBpZGVudGlmaWVzIGluc3RhbmNlcyBvZiB0aGUgMTB4IHJ1bi9jb21waWxlIHBpcGVsaW5lcyB3aGVuIHJlcG9ydGluZyB0byB0aGUgMTB4IHNlcnZpY2UuIEZvciBleGFtcGxlLCBmb3IgYSAxMHggW1JlY2VpdmVyXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwcHMvcmVjZWl2ZXIvKSB3aXRoIG9wdGltaXphdGlvbiBlbmFibGVkIGZvciBGbHVlbnQgQml0IGZvcndhcmRlcnMgY29sbGVjdGluZyBldmVudHMgZnJvbSBhIGBicm9rZXJgIHVzZXItYXBwLCB0aGlzIHZhbHVlIGNhbiBiZSBzZXQgdG86IGByZWNlaXZlX2ZsdWVudGJpdF9icm9rZXJgIgogICAgICAgIH0sCiAgICAgICAgImF0dHJpYnV0ZXMiIDogewogICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkxpc3Qgb2YgYXR0cmlidXRlcyB0byBhZGQgdG8gYWxsIG1ldHJpY3MgcmVwb3J0aW5nXG5cblNwZWNpZmllcyBhIGxpc3Qgb2Yga2V5LXZhbHVlIHBhaXJzIGluIHRoZSBmb3JtYXQgYGtleTp2YWx1ZWAgdG8gYmUgYWRkZWQgYXMgdGFncyB0byBwaXBlbGluZSBtZXRyaWNzIHJlcG9ydGVkIHRvIHRoZSAxMHggc2VydmljZS4gVGhlc2UgdGFncyBlbmFibGUgZmluZXItZ3JhaW5lZCBmaWx0ZXJpbmcgYW5kIGFuYWx5c2lzIGluIG1vbml0b3Jpbmcgc3lzdGVtcyBsaWtlIFByb21ldGhldXMuIE11bHRpcGxlIGF0dHJpYnV0ZXMgY2FuIGJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgc3RyaW5nIHVzaW5nIGEgc2VtaWNvbG9uIChgO2ApLCBlLmcuLCBga2V5MTp2YWwxO2tleTI6dmFsMmAuICBJZiBhIGtleSBkb2VzIG5vdCBzdGFydCB3aXRoIHRlbnhfLCB0aGUgcHJlZml4IHRlbnhfIGlzIGF1dG9tYXRpY2FsbHkgcHJlcGVuZGVkIHRvIGVuc3VyZSBjb25zaXN0ZW5jeSBpbiB0YWcgbmFtaW5nIGNvbnZlbnRpb25zLiBGb3IgZXhhbXBsZSwgYSBwcm92aWRlZCBhdHRyaWJ1dGUgYXBwOm15LWFwcCB3aWxsIGJlIHJlcG9ydGVkIGFzIHRlbnhfYXBwOm15LWFwcCAgYGBgIHlhbWwgICBydW50aW1lQXR0cmlidXRlczogICAgIC0gYXBwOnJlcG9ydGVyICAgICAtIGVudjplZGdlIGBgYCIsCiAgICAgICAgICAiaXRlbXMiIDogewogICAgICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJpbmNsdWRlUGF0aHMiIDogewogICAgICAidHlwZSIgOiBbCiAgICAgICAgImFycmF5IiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlBpcGVsaW5lIGluY2x1ZGUgZm9sZGVyc1xuXG5TcGVjaWZpZXMgZm9sZGVycyBvbiBkaXNrIGZvciByZXNvbGluZyByZWxhdGl2ZSByZWZlcmVuY2VzIHdpdGhpbiBbaW5jbHVkZSBkaXJlY3RpdmVzXShodHRwczovL2RvYy5sb2cxMHguY29tL2NvbmZpZy95YW1sLyNpbmNsdWRlLWRpcmVjdGl2ZXMpLiAoRGVmYXVsdDogW1wid29ya2luZyBkaXJlY3Rvcnkgb2YgY3VycmVudCBwcm9jZXNzXCJdKSIsCiAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgInR5cGUiIDogInN0cmluZyIKICAgICAgfSwKICAgICAgImRlZmF1bHQiIDogWwogICAgICAgICJ3b3JraW5nIGRpcmVjdG9yeSBvZiBjdXJyZW50IHByb2Nlc3MiCiAgICAgIF0KICAgIH0sCiAgICAiamFyRmlsZXMiIDogewogICAgICAidHlwZSIgOiBbCiAgICAgICAgImFycmF5IiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkphciBmaWxlcyB0byBsb2FkXG5cblNwZWNpZmllcyBhIGxpc3Qgb2YgLmphciBmaWxlcyB0byBsb2FkIGludG8gdGhlIGhvc3QgSlZNIGZvciB1c2UgYnkgW2NvbXBpbGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vYXBpL2NvbXBpbGUvKSwgW2lucHV0XShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9pbnB1dC8pIGFuZCBbb3V0cHV0XShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9vdXRwdXQvKSBBUEkgZXh0ZW5zaW9ucy4gICEhISBub3RlIFwiXCIgICAgICBUaGlzIGFyZ3VtZW50IGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIFtSdW50aW1lXShodHRwczovL2RvYy5sb2cxMHguY29tL2VuZ2luZS9mbGF2b3JzLyNydW50aW1lKSBmbGF2b3IuIiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9LAogICAgInF1aWV0IiA6IHsKICAgICAgInR5cGUiIDogWwogICAgICAgICJib29sZWFuIiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkRpc2FibGUgcHJpbnRpbmcgYmluYXJ5IHZlcnNpb24gaW5mb3JtYXRpb24gdG8gdGhlIGNvbnNvbGVcblxuRGlzYWJsZSBwcmludGluZyBidWlsZC92ZXJzaW9uIGluZm9ybWF0aW9uIHRvIHRoZSBjb25zb2xlIHVwb24gbGF1bmNoIChBY2NlcHRzIGJvb2xlYW4gb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiBmYWxzZSkiLAogICAgICAiZGVmYXVsdCIgOiBmYWxzZQogICAgfSwKICAgICJkaXNhYmxlZEFyZ3MiIDogewogICAgICAidHlwZSIgOiBbCiAgICAgICAgImFycmF5IiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkxpbWl0IGFyZ3VtZW50IHZhbHVlcyB0aGF0IGNhbiBiZSBzZXQgYnkgdXNlcnNcblxuU3BlY2lmaWVzIGEgbGlzdCBvZiBsYXVuY2ggYXJndW1lbnRzIHRoYXQgYXJlIGRpc2FsbG93ZWQgZnJvbSBlaXRoZXIgY29tbWFuZCBsaW5lIG9yIHVzZXIgY29uZmlnIGZpbGVzLiBUaGlzIGFyZ3VtZW50IHByb3ZpZGVzIGEgbWV0aG9kIG9mIGxpbWl0aW5nIHRoZSB0YXJnZXQgW3BpcGVsaW5lXShodHRwczovL2RvYy5sb2cxMHguY29tL3NoYXJlZC9ib290c3RyYXAvI3BpcGVsaW5lKSwgW3NvdXJjZV0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb25maWcvI3NvdXJjZXMpIGFuZCBhbmQgW2NvbW1hbmQgbGluZV0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb25maWcvY2xpLykgc2V0dGFibGUgYnkgdGhlIHVzZXIuICBUaGlzIG1lY2hhbmlzbSBlbmFibGVzIHBpcGVsaW5lIGxhdW5jaGVycyBzdWNoIGFzIHRoZSBbUXVhcmt1cyBsYXVuY2hlcl0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9hcGkvbGF1bmNoLyNxdWFya3VzKSB0byBsaW1pdCB1c2VyIGlucHV0IHJlY2VpdmVkIHZpYSBSRVNUIHJlcXVlc3RzIHRvIGEgdGFyZ2V0IHN1YnNldCBvZiAnc2FmZScgYXJndW1lbnRzLiAgRm9yIGV4YW1wbGUsIGFkZGluZyBbcHJvY091dENvbW1hbmRdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9wcm9jZXNzLyNwcm9jb3V0Y29tbWFuZCkgdG8gdGhpcyBsaXN0IGVuc3VyZXMgdGhhdCBubyBleHRlcm5hbCBwcm9jZXNzIG91dHB1dHMgY2FuIGJlIGxhdW5jaGVkIGJ5IHRoZSBydW50aW1lLiAgQW4gb3B0aW9uYWwgcmVnZXggcGF0dGVybiBjYW4gbGltaXQgYXJndW1lbnRzIHRvIGEgY2VydGFpbiBzdWJzZXQgb2YgdmFsdWVzIGluIHRoZSBmb3JtIG9mOiBgPGFyZy1uYW1lPls6cGF0dGVybl1gIChlLmcuLCBzcGVjaWZpYyBwcm9jZXNzIG5hbWVzKS4gTXVsdGlwbGUgcGF0dGVybnMgY2FuIGJlIHNwZWNpZmllZCBwZXIgYXJndW1lbnQuICBNYXRjaGluZyB0aGUgYHNvdXJjZWAgYXJndW1lbnQgZGV0ZXJtaW5lcyB3aGljaCBzb3VyY2UgbG9jYXRpb25zIHRvIGluc3BlY3QgKGUuZy4sIGZvbGRlcnMsIGZpbGVzLCBHaXRIdWIgcmVwb3MpLiBGb3IgZXhhbXBsZSwgYW4gYWRtaW4gbWF5IHBsYWNlIC55YW1sIGNvbmZpZyBmaWxlcyBjb250YWluaW5nIHByZXNldCBGbHVlbnQgQml0IG91dHB1dHMgaW4gYC9ldGMvbG9nMTB4L2AsIGV4Y2x1ZGluZyB0aGVpciBlbmNsb3NlZCBhcmd1bWVudHMgZnJvbSBsaW1pdHMgc2V0IGJ5IHRoaXMgbGlzdCwgd2hpbGUgZGlzYWxsb3dpbmcgdXNlcnMgdG8gZGlyZWN0bHkgc2V0IHRoZW0gdmlhIHRoZSBjb21tYW5kLWxpbmUgb3IgYnkgc291cmNpbmcgdGhlbSBmcm9tIHRoZWlyIGxvY2FsL0dpdEh1YiBjb25maWcgZmlsZXMgKHNlZSBleGFtcGxlIGJlbG93KS4gIFRvIGxpbWl0OiAgVGhlIHRhcmdldCBwaXBlbGluZSAoZS5nLiwgW3J1bl0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vKSwgW2NvbXBpbGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vY29tcGlsZS8pKTogIGBgYCB5YW1sICAgZGlzYWJsZWRBcmdzOiAgIC0gXCJwaXBlbGluZTpecnVuXCIgIyBkaXNhbGxvdyBjb21waWxlIGBgYCAgVGFyZ2V0IGFyZ3VtZW50cyAoZS5nLiwgW3Byb2Nlc3Mgb3V0cHV0c10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vb3V0cHV0L2V2ZW50L3Byb2Nlc3MvKSk6ICBgYGAgeWFtbCAgIC0gXCJwcm9jT3V0Q29tbWFuZDpeZmx1ZW50LWJpdCRcIiAgICMgbGltaXQgdG8gRmx1ZW50IEJpdCBvbmx5ICAgIyAtIHByb2NPdXRBcmdzOiA8c3BlY2lmeS1yZWdleD4gICMgZnVydGhlciBsaW1pdCBhcmdzIGZvciBGbHVlbnQgQml0IGBgYCAgQ29udHJvbCB3aGljaCBhcmd1bWVudCBbc291cmNlc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb25maWcvI3NvdXJjZXMpIHRvIGluc3BlY3Q6ICBgYGAgeWFtbCAgIC0gXCJzb3VyY2U6XmdpdGh1Yi4qXCIgICAgICAgICAgICAgIyBpbnNwZWN0IG9mIGFsbCBhcmd1bWVudHMgc291cmNlZCBmcm9tIEdpdEh1YiBhZ2FpbnN0IHRoaXMgbGlzdCAgIC0gXCJzb3VyY2U6Xig/IS9ldGMvbG9nMTB4LykuKlwiICAgIyBpbnNwZWN0IG9mIGFsbCBhcmd1bWVudHMgc291cmNlZCBmcm9tIGNvbmZpZyBmaWxlcyBOT1QgY29udGFpbmVkIGluOiAvZXRjL2xvZzEweC8gYGBgIiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9LAogICAgImRlYnVnRW52VmFycyIgOiB7CiAgICAgICJ0eXBlIiA6IFsKICAgICAgICAiYXJyYXkiLAogICAgICAgICJzdHJpbmciLAogICAgICAgICJudWxsIgogICAgICBdLAogICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTGlzdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gZGVidWdcblxuU3BlY2lmaWVzIGEgbGlzdCBvZiBlbnYgdmFyIG5hbWVzIGZvciB3aGljaCB0byBsb2cgaW5mb3JtYXRpb24gcmVsYXRpbmcgdG8gaG93IHRoZXkgYXJlIHJlc29sdmVkLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjYWxsOiBgTDFFbnYuZ2V0KFwibXlWYXJcIiwgXCJteURlZmF1bHRcIilgIGNhbiBiZSByZXNvbHZlZCBmcm9tIGEgbnVtYmVyIG9mIFtzb3VyY2VzXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWEVudi5nZXQpIHJhbmdpbmcgZnJvbSBsYXVuY2ggYXJndW1lbnRzLCB0byBPUy9KVk0gcHJvcGVydGllcyBhbmQgYSBkZWZhdWx0IHZhbHVlIChlLmcuLCBteURlZmF1bHQpLiAgU2V0dGluZyB0aGlzIHZhbHVlIHRvIGBteVZhcmAgd2lsbCBsb2cgSU5GTyBsZXZlbCBpbmZvcm1hdGlvbiBkZXRhaWxpbmcgaG93IHRoZSB2YWx1ZSBvZiB0aGUgYG15VmFyYCB3YXMgcmVzb2x2ZWQuIiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9CiAgfSwKICAicmVxdWlyZWQiIDogWwogICAgInRlbngiCiAgXSwKICAiYWRkaXRpb25hbFByb3BlcnRpZXMiIDogZmFsc2UKfQ==</template>

    ```yaml
    # 🔟❎ run bootstrap configuration
    
    # This config file specifies bootstrap options for the run pipeline.
    # To learn more see https://doc.log10x.com/run/bootstrap
    
    # To learn more see https://doc.log10x.com/config/
    
    tenx: run
    
    # =============================== Launch Settings ==============================
    
    # 'licenseKey' specifies a signed JWT license token used for authenticating against the 10x service
    licenseKey: $=TenXEnv.get("TENX_LICENSE_KEY", "NO-LICENSE")
    
    # 'licenseFile' specifies a path to a file containing the signed JWT license token.
    # Preferred over 'licenseKey' on production hosts: the token does not appear in 'ps' output.
    licenseFile: $=TenXEnv.get("TENX_LICENSE_FILE")
    
    # 'airgapped' suppresses every call to the 10x SaaS gateway: the license is verified locally against the embedded
    # public key, and ALL outbound calls to the 10x SaaS gateway are suppressed (no DNS, no TCP).
    # Use for deployments where security review forbids vendor phone-home.
    airgapped: $=TenXEnv.get("TENX_AIRGAPPED", "false")
    
    # 'includePaths' specifies folders on disk for resolving relative config file/folder references in addition to the working folder
    includePaths: []
    
    # 'quiet' disables printing version information to the console.
    # quiet: true
    
    # 'jarFiles' specifies .jar files to dynamically load for use by compile, input and output API extensions.
    jarFiles: []
    
    # 'metricEndpoint' specifies a Prometheus remote-write endpoint for pipeline usage and health metrics.
    # Unset by default. The endpoint is a self-hosted or vendor Prometheus-compatible store, never a 10x
    # service, and is where the MCP reads engine state back from to tune policy such as regulator rates.
    # metricEndpoint: https://prometheus.example.com/api/v1/write
    
    # 'disabledArgs' specifies a list of launch arguments that are disallowed from either command line or user config files.
    disabledArgs: []
    
    # 'debugEnvVars' list environment variables to debug
    debugEnvVars: []
    ```

??? tenx-compile "Compile"

    <a id="compile"></a>
    ### Compile {.hidden-heading}

    Launch a [compile pipeline](https://doc.log10x.com/compile "compile pipeline") to scan source code and binary files to generate symbol unit and library files.

    Below is the default configuration from: [bootstrap/config.yaml](https://github.dev/log-10x/config/blob/main/pipelines/pipelines/compile/bootstrap/config.yaml "bootstrap/config.yaml"){target="\_blank"}.  
  
    <div class="edit-options">
        <a class="md-button tenx-edit-online-button" data-tooltip="Edit online on github.dev" href="https://github.dev/log-10x/config/blob/main/pipelines/pipelines/compile/bootstrap/config.yaml" target="_blank" rel="noopener noreferrer">
            <span class="twemoji" style="margin-right: 0.3rem;">
                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                    <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path>
                </svg>
            </span> Edit Online
        </a>
        <button class="md-button tenx-config.yaml5-edit-button" data-tooltip="Edit configuration file" data-dialog-id="config-yaml5-dialog">
            <span style="margin-right: 0.3rem;">
                <span class="twemoji">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                        <path d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                    </svg>
                </span>
            </span>Edit Locally
        </button>
    </div>
    
    <dialog id="config-yaml5-dialog" class="md-dialog md-dialog--editor">
        <div class="editor-dialog-wrapper">
            <div class="editor-dialog-header">
                <span class="editor-dialog-title">Edit Pipeline Bootstrapper Config Locally</span>
                <div class="editor-header-actions">
                    <button class="editor-toolbar-btn yaml-editor-locations" data-tooltip="Save">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-reset" data-tooltip="Reset to default">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M12.5 8c-2.65 0-5.05 1-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-copy" data-tooltip="Copy to clipboard">
                        <svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path></svg>
                        <svg class="icon-check" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn yaml-editor-fullscreen" data-tooltip="Fullscreen">
                        <svg class="icon-maximize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5,5H10V7H7V10H5V5M14,5H19V10H17V7H14V5M17,14H19V19H14V17H17V14M10,17V19H5V14H7V17H10Z"></path></svg>
                        <svg class="icon-minimize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M5,16H8V19H10V14H5V16M14,14V19H16V16H19V14H14M16,5V8H19V10H14V5H16M10,5V10H5V8H8V5H10Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn editor-dialog-close" onclick="closeDialog('config-yaml5-dialog')" data-tooltip="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path></svg>
                    </button>
                </div>
            </div>
            <div class="editor-dialog-content">
                <div class="yaml-editor-container"></div>
            </div>
            <div class="yaml-editor-statusbar">
                <span class="yaml-editor-status"></span>
            </div>
        </div>
        <!-- Locations Popup -->
        <div class="locations-popup" style="display: none;">
            <div class="locations-popup-content">
                <div class="locations-popup-header">
                    <span class="locations-header-label">Download and save to:</span>
                    <button class="locations-popup-close" aria-label="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
                            <path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path>
                        </svg>
                    </button>
                </div>
                <ul class="locations-list">
                    <li>
                        <span class="location-label">Linux / Docker / macOS
                            <span class="help-icon" data-tooltip="Default system location. The engine automatically reads configs from here at startup. Best for production deployments.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="default-path location-path" data-tooltip=""
                                data-copy-osx="/etc/log10x/config/compile/bootstrap/config.yaml"
                                data-copy-nix="/etc/log10x/config/compile/bootstrap/config.yaml"
                                data-copy-win="C:\log10x\configs/compile/bootstrap/config.yaml"></code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Custom directory
                            <span class="help-icon" data-tooltip="Set TENX_CONFIG environment variable to point to a custom config directory. Useful when you want configs in a non-standard location.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="$TENX_CONFIG/compile/bootstrap/config.yaml">$TENX_CONFIG/compile/bootstrap/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Within cloned repo
                            <span class="help-icon" data-tooltip="First run: git clone github.com/log-10x/config. Then save the file to this path within the cloned folder. Use for version control.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="./pipelines/compile/bootstrap/config.yaml">./pipelines/compile/bootstrap/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                </ul>
                <div class="locations-popup-footer">
                    <button class="locations-download-btn" title="Download config file">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                            <path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path>
                        </svg>
                        <span>Download</span>
                    </button>
                </div>
            </div>
        </div>
    </dialog>
    
    <template class="tenx-config-schema" data-encoding="base64">ewogICJ0eXBlIiA6ICJvYmplY3QiLAogICJwcm9wZXJ0aWVzIiA6IHsKICAgICJ0ZW54IiA6IHsKICAgICAgInR5cGUiIDogWwogICAgICAgICJzdHJpbmciLAogICAgICAgICJudWxsIgogICAgICBdLAogICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTmFtZSBvZiBwaXBlbGluZSB0byBleGVjdXRlXG5cblRhcmdldCBbcGlwZWxpbmVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vZW5naW5lL3BpcGVsaW5lLykgdG8gZXhlY3V0ZS4gRm9yIGV4YW1wbGUsIHRvIHNwZWNpZnkgdGhlIFtydW5dKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuLykgcGlwZWxpbmUgYW5kIGEgW1lBTUxdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vY29uZmlnL3lhbWwvKSBjb25maWcgZmlsZSBjb250YWluaW5nIGxhdW5jaCBhcmd1bWVudHMsIHVzZTogIGBgYCBjb25zb2xlICQgdGVueCBydW4gQH4vbXkueWFtbCBgYGAgVGhlIFlBTUwgZmlsZSBtYXkgc3BlY2lmeSB0aGUgcGlwZWxpbmUgbmFtZSB2aWEgYSAndGVueCcgZW50cnksIGFsbG93aW5nIHRoZSAncGlwZWxpbmUnIGFyZ3VtZW50IHRvIGJlIG9taXR0ZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiAgRm9yIGV4YW1wbGUgKG15LnlhbWwpOiAgYGBgIHlhbWwgdGVueDogcnVuICMgc2V0IHRoZSBwaXBlbGluZSB0byAncnVuJyBsaWNlbnNlS2V5OiA8bXktbGljZW5zZS1qd3Q+IC4uLiBgYGAgIEFsbG93cyBmb3IgbGF1bmNoaW5nIHRoZSBydW4gcGlwZWxpbmUgdmlhOiBgYGAgY29uc29sZSAkIHRlbnggQH4vbXkueWFtbCBgYGAiCiAgICB9LAogICAgImxpY2Vuc2UiIDogewogICAgICAidHlwZSIgOiAib2JqZWN0IiwKICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlLAogICAgICAicHJvcGVydGllcyIgOiB7CiAgICAgICAgImZpbGUiIDogewogICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlBhdGggdG8gYSBmaWxlIGNvbnRhaW5pbmcgdGhlIDEweCBsaWNlbnNlIEpXVFxuXG5QYXRoIHRvIGEgZmlsZSBjb250YWluaW5nIHRoZSBzaWduZWQgMTB4IGxpY2Vuc2UgSldULiBQcmVmZXJyZWQgb3ZlciBgbGljZW5zZUtleWAgZm9yIHByb2R1Y3Rpb246IHRoZSB0b2tlbiBpcyBub3QgdmlzaWJsZSBpbiBgcHNgIG91dHB1dCBhbmQgaXMgZWFzeSB0byByb3RhdGUgYnkgcmVwbGFjaW5nIHRoZSBmaWxlLiAgV2l0aG91dCBhIGxpY2Vuc2UgdGhlIGVuZ2luZSBydW5zIG9uIHRoZSBidWlsdC1pbiAzMC1kYXkgZXZhbHVhdGlvbiBsaWNlbnNlLiBTZWUgW2xpY2Vuc2luZ10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9tYW5hZ2UvbGljZW5zZS8pIGZvciBwcm9kdWN0aW9uIGxpY2Vuc2VzLiAgSWYgYm90aCBgbGljZW5zZUZpbGVgIGFuZCBgbGljZW5zZUtleWAgYXJlIHByb3ZpZGVkLCB0aGUgZmlsZSB3aW5zLiIKICAgICAgICB9LAogICAgICAgICJrZXkiIDogewogICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIjEweCBsaWNlbnNlIEpXVCAoaW5saW5lKVxuXG5UaGUgc2lnbmVkIDEweCBsaWNlbnNlIEpXVCwgcGFzc2VkIGlubGluZS4gRGlzY291cmFnZWQgb24gdGhlIGNvbW1hbmQgbGluZSBiZWNhdXNlIHRoZSB2YWx1ZSBpcyB2aXNpYmxlIGluIGBwc2Agb3V0cHV0OyBwcmVmZXIgYGxpY2Vuc2VGaWxlYCBpbiBwcm9kdWN0aW9uLiAgV2l0aG91dCBhIGxpY2Vuc2UgdGhlIGVuZ2luZSBydW5zIG9uIHRoZSBidWlsdC1pbiAzMC1kYXkgZXZhbHVhdGlvbiBsaWNlbnNlLiBTZWUgW2xpY2Vuc2luZ10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9tYW5hZ2UvbGljZW5zZS8pIGZvciBwcm9kdWN0aW9uIGxpY2Vuc2VzLiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiYWlyZ2FwcGVkIiA6IHsKICAgICAgInR5cGUiIDogWwogICAgICAgICJib29sZWFuIiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlJ1biB3aXRob3V0IGNvbnRhY3RpbmcgdGhlIDEweCBzZXJ2aWNlXG5cbldoZW4gYHRydWVgLCB0aGUgbGljZW5zZSBpcyB2ZXJpZmllZCBsb2NhbGx5IChzaWduYXR1cmUgKyBjbGFpbXMpIGFuZCBubyBjYWxscyBhcmUgbWFkZSB0byB0aGUgMTB4IHNlcnZpY2U6IG5vIHN0YXJ0dXAgdmFsaWRhdGlvbiwgbm8gbWV0cmljcyByZXBvcnRpbmcsIG5vIHVzZXItYXR0cmlidXRlIGVucmljaG1lbnQuIFN1aXRhYmxlIGZvciBmdWxseSBhaXJnYXBwZWQgZGVwbG95bWVudHMgd2hlcmUgdGhlIGVuZ2luZSBoYXMgbm8gcGF0aCB0byB0aGUgdmVuZG9yIFNhYVMuICBXaGVuIGBmYWxzZWAgKGRlZmF1bHQpLCB0aGUgZW5naW5lIGFkZGl0aW9uYWxseSBjYWxscyB0aGUgMTB4IHNlcnZpY2UgYXQgc3RhcnR1cCwgYW5kIG9ubHkgd2hlbiBhIHNlcnZpY2UgZW5kcG9pbnQgaXMgYWN0dWFsbHkgY29uZmlndXJlZDsgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBuYW1lcyBub25lLCBzbyBhbiB1bmNvbmZpZ3VyZWQgZW5naW5lIG1ha2VzIG5vIGNhbGwgZWl0aGVyIHdheS4gVGhlIGNhbGwgaXMgYmVzdC1lZmZvcnQgZW5yaWNobWVudDogdGhlIGxvY2FsIHZlcmlmaWNhdGlvbiBpcyB0aGUgZ2F0ZSwgYW5kIGEgc2VydmljZSB0aGF0IGNhbm5vdCBiZSByZWFjaGVkLCBvciB0aGF0IGFuc3dlcnMgd2l0aCBhbiBlcnJvciwgcHJvZHVjZXMgYSB3YXJuaW5nIGFuZCB0aGUgZW5naW5lIHJ1bnMuICBBaXJnYXBwZWQgbW9kZSBpcyBob25vcmVkIGZvciBldmVyeSBsaWNlbnNlIHR5cGUuIChBY2NlcHRzIGJvb2xlYW4gb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiBmYWxzZSkiLAogICAgICAiZGVmYXVsdCIgOiBmYWxzZQogICAgfSwKICAgICJtZXRyaWNFbmRwb2ludCIgOiB7CiAgICAgICJ0eXBlIiA6IFsKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIjEweCBzZXJ2aWNlIFByb21ldGhldXMgbWV0cmljcyBlbmRwb2ludFxuXG5TcGVjaWZpZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIFByb21ldGhldXMgcmVtb3RlIHdyaXRlIGVuZHBvaW50IHRvIHdyaXRlIHBpcGVsaW5lIHVzYWdlIGFuZCBoZWFsdGggbWV0cmljcy4gIFVuc2V0IGJ5IGRlZmF1bHQ6IGFuIGVuZ2luZSB3aXRoIG5vIG1ldHJpYyBlbmRwb2ludCBjb25maWd1cmVkIGNvbGxlY3RzIG1ldHJpY3MgbG9jYWxseSBhbmQgc2VuZHMgdGhlbSBub3doZXJlLiAgISEhIG5vdGUgXCJcIiAgICAgIFRoaXMgYXJndW1lbnQgaXMgb25seSBzZXR0YWJsZSBpbiB0aGUgMTB4ICdvbi1wcmVtaXNlcycgYnVpbGQuIgogICAgfSwKICAgICJydW50aW1lIiA6IHsKICAgICAgInR5cGUiIDogIm9iamVjdCIsCiAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZSwKICAgICAgInByb3BlcnRpZXMiIDogewogICAgICAgICJuYW1lIiA6IHsKICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICJudWxsIgogICAgICAgICAgXSwKICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJOYW1lIHRvIHJlcG9ydCB0byB0aGUgMTB4IHNlcnZpY2UgZW5kcG9pbnQgZm9yIHRoaXMgcnVudGltZSBpbnN0YW5jZVxuXG5TcGVjaWZpZXMgYSBsb2dpY2FsIG5hbWUgdXNlZCBhcyBhIFt0YWcgdmFsdWVdKGh0dHBzOi8vd3d3LmJhZWxkdW5nLmNvbS9taWNyb21ldGVyIzQtbWV0ZXJzKSBmb3IgcGlwZWxpbmUgbWV0cmljcy4gVGhpcyB2YWx1ZSBpZGVudGlmaWVzIGluc3RhbmNlcyBvZiB0aGUgMTB4IHJ1bi9jb21waWxlIHBpcGVsaW5lcyB3aGVuIHJlcG9ydGluZyB0byB0aGUgMTB4IHNlcnZpY2UuIEZvciBleGFtcGxlLCBmb3IgYSAxMHggW1JlY2VpdmVyXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwcHMvcmVjZWl2ZXIvKSB3aXRoIG9wdGltaXphdGlvbiBlbmFibGVkIGZvciBGbHVlbnQgQml0IGZvcndhcmRlcnMgY29sbGVjdGluZyBldmVudHMgZnJvbSBhIGBicm9rZXJgIHVzZXItYXBwLCB0aGlzIHZhbHVlIGNhbiBiZSBzZXQgdG86IGByZWNlaXZlX2ZsdWVudGJpdF9icm9rZXJgIgogICAgICAgIH0sCiAgICAgICAgImF0dHJpYnV0ZXMiIDogewogICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkxpc3Qgb2YgYXR0cmlidXRlcyB0byBhZGQgdG8gYWxsIG1ldHJpY3MgcmVwb3J0aW5nXG5cblNwZWNpZmllcyBhIGxpc3Qgb2Yga2V5LXZhbHVlIHBhaXJzIGluIHRoZSBmb3JtYXQgYGtleTp2YWx1ZWAgdG8gYmUgYWRkZWQgYXMgdGFncyB0byBwaXBlbGluZSBtZXRyaWNzIHJlcG9ydGVkIHRvIHRoZSAxMHggc2VydmljZS4gVGhlc2UgdGFncyBlbmFibGUgZmluZXItZ3JhaW5lZCBmaWx0ZXJpbmcgYW5kIGFuYWx5c2lzIGluIG1vbml0b3Jpbmcgc3lzdGVtcyBsaWtlIFByb21ldGhldXMuIE11bHRpcGxlIGF0dHJpYnV0ZXMgY2FuIGJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgc3RyaW5nIHVzaW5nIGEgc2VtaWNvbG9uIChgO2ApLCBlLmcuLCBga2V5MTp2YWwxO2tleTI6dmFsMmAuICBJZiBhIGtleSBkb2VzIG5vdCBzdGFydCB3aXRoIHRlbnhfLCB0aGUgcHJlZml4IHRlbnhfIGlzIGF1dG9tYXRpY2FsbHkgcHJlcGVuZGVkIHRvIGVuc3VyZSBjb25zaXN0ZW5jeSBpbiB0YWcgbmFtaW5nIGNvbnZlbnRpb25zLiBGb3IgZXhhbXBsZSwgYSBwcm92aWRlZCBhdHRyaWJ1dGUgYXBwOm15LWFwcCB3aWxsIGJlIHJlcG9ydGVkIGFzIHRlbnhfYXBwOm15LWFwcCAgYGBgIHlhbWwgICBydW50aW1lQXR0cmlidXRlczogICAgIC0gYXBwOnJlcG9ydGVyICAgICAtIGVudjplZGdlIGBgYCIsCiAgICAgICAgICAiaXRlbXMiIDogewogICAgICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJpbmNsdWRlUGF0aHMiIDogewogICAgICAidHlwZSIgOiBbCiAgICAgICAgImFycmF5IiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlBpcGVsaW5lIGluY2x1ZGUgZm9sZGVyc1xuXG5TcGVjaWZpZXMgZm9sZGVycyBvbiBkaXNrIGZvciByZXNvbGluZyByZWxhdGl2ZSByZWZlcmVuY2VzIHdpdGhpbiBbaW5jbHVkZSBkaXJlY3RpdmVzXShodHRwczovL2RvYy5sb2cxMHguY29tL2NvbmZpZy95YW1sLyNpbmNsdWRlLWRpcmVjdGl2ZXMpLiAoRGVmYXVsdDogW1wid29ya2luZyBkaXJlY3Rvcnkgb2YgY3VycmVudCBwcm9jZXNzXCJdKSIsCiAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgInR5cGUiIDogInN0cmluZyIKICAgICAgfSwKICAgICAgImRlZmF1bHQiIDogWwogICAgICAgICJ3b3JraW5nIGRpcmVjdG9yeSBvZiBjdXJyZW50IHByb2Nlc3MiCiAgICAgIF0KICAgIH0sCiAgICAiamFyRmlsZXMiIDogewogICAgICAidHlwZSIgOiBbCiAgICAgICAgImFycmF5IiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkphciBmaWxlcyB0byBsb2FkXG5cblNwZWNpZmllcyBhIGxpc3Qgb2YgLmphciBmaWxlcyB0byBsb2FkIGludG8gdGhlIGhvc3QgSlZNIGZvciB1c2UgYnkgW2NvbXBpbGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vYXBpL2NvbXBpbGUvKSwgW2lucHV0XShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9pbnB1dC8pIGFuZCBbb3V0cHV0XShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9vdXRwdXQvKSBBUEkgZXh0ZW5zaW9ucy4gICEhISBub3RlIFwiXCIgICAgICBUaGlzIGFyZ3VtZW50IGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIFtSdW50aW1lXShodHRwczovL2RvYy5sb2cxMHguY29tL2VuZ2luZS9mbGF2b3JzLyNydW50aW1lKSBmbGF2b3IuIiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9LAogICAgInF1aWV0IiA6IHsKICAgICAgInR5cGUiIDogWwogICAgICAgICJib29sZWFuIiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkRpc2FibGUgcHJpbnRpbmcgYmluYXJ5IHZlcnNpb24gaW5mb3JtYXRpb24gdG8gdGhlIGNvbnNvbGVcblxuRGlzYWJsZSBwcmludGluZyBidWlsZC92ZXJzaW9uIGluZm9ybWF0aW9uIHRvIHRoZSBjb25zb2xlIHVwb24gbGF1bmNoIChBY2NlcHRzIGJvb2xlYW4gb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiBmYWxzZSkiLAogICAgICAiZGVmYXVsdCIgOiBmYWxzZQogICAgfSwKICAgICJkaXNhYmxlZEFyZ3MiIDogewogICAgICAidHlwZSIgOiBbCiAgICAgICAgImFycmF5IiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkxpbWl0IGFyZ3VtZW50IHZhbHVlcyB0aGF0IGNhbiBiZSBzZXQgYnkgdXNlcnNcblxuU3BlY2lmaWVzIGEgbGlzdCBvZiBsYXVuY2ggYXJndW1lbnRzIHRoYXQgYXJlIGRpc2FsbG93ZWQgZnJvbSBlaXRoZXIgY29tbWFuZCBsaW5lIG9yIHVzZXIgY29uZmlnIGZpbGVzLiBUaGlzIGFyZ3VtZW50IHByb3ZpZGVzIGEgbWV0aG9kIG9mIGxpbWl0aW5nIHRoZSB0YXJnZXQgW3BpcGVsaW5lXShodHRwczovL2RvYy5sb2cxMHguY29tL3NoYXJlZC9ib290c3RyYXAvI3BpcGVsaW5lKSwgW3NvdXJjZV0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb25maWcvI3NvdXJjZXMpIGFuZCBhbmQgW2NvbW1hbmQgbGluZV0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb25maWcvY2xpLykgc2V0dGFibGUgYnkgdGhlIHVzZXIuICBUaGlzIG1lY2hhbmlzbSBlbmFibGVzIHBpcGVsaW5lIGxhdW5jaGVycyBzdWNoIGFzIHRoZSBbUXVhcmt1cyBsYXVuY2hlcl0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9hcGkvbGF1bmNoLyNxdWFya3VzKSB0byBsaW1pdCB1c2VyIGlucHV0IHJlY2VpdmVkIHZpYSBSRVNUIHJlcXVlc3RzIHRvIGEgdGFyZ2V0IHN1YnNldCBvZiAnc2FmZScgYXJndW1lbnRzLiAgRm9yIGV4YW1wbGUsIGFkZGluZyBbcHJvY091dENvbW1hbmRdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9wcm9jZXNzLyNwcm9jb3V0Y29tbWFuZCkgdG8gdGhpcyBsaXN0IGVuc3VyZXMgdGhhdCBubyBleHRlcm5hbCBwcm9jZXNzIG91dHB1dHMgY2FuIGJlIGxhdW5jaGVkIGJ5IHRoZSBydW50aW1lLiAgQW4gb3B0aW9uYWwgcmVnZXggcGF0dGVybiBjYW4gbGltaXQgYXJndW1lbnRzIHRvIGEgY2VydGFpbiBzdWJzZXQgb2YgdmFsdWVzIGluIHRoZSBmb3JtIG9mOiBgPGFyZy1uYW1lPls6cGF0dGVybl1gIChlLmcuLCBzcGVjaWZpYyBwcm9jZXNzIG5hbWVzKS4gTXVsdGlwbGUgcGF0dGVybnMgY2FuIGJlIHNwZWNpZmllZCBwZXIgYXJndW1lbnQuICBNYXRjaGluZyB0aGUgYHNvdXJjZWAgYXJndW1lbnQgZGV0ZXJtaW5lcyB3aGljaCBzb3VyY2UgbG9jYXRpb25zIHRvIGluc3BlY3QgKGUuZy4sIGZvbGRlcnMsIGZpbGVzLCBHaXRIdWIgcmVwb3MpLiBGb3IgZXhhbXBsZSwgYW4gYWRtaW4gbWF5IHBsYWNlIC55YW1sIGNvbmZpZyBmaWxlcyBjb250YWluaW5nIHByZXNldCBGbHVlbnQgQml0IG91dHB1dHMgaW4gYC9ldGMvbG9nMTB4L2AsIGV4Y2x1ZGluZyB0aGVpciBlbmNsb3NlZCBhcmd1bWVudHMgZnJvbSBsaW1pdHMgc2V0IGJ5IHRoaXMgbGlzdCwgd2hpbGUgZGlzYWxsb3dpbmcgdXNlcnMgdG8gZGlyZWN0bHkgc2V0IHRoZW0gdmlhIHRoZSBjb21tYW5kLWxpbmUgb3IgYnkgc291cmNpbmcgdGhlbSBmcm9tIHRoZWlyIGxvY2FsL0dpdEh1YiBjb25maWcgZmlsZXMgKHNlZSBleGFtcGxlIGJlbG93KS4gIFRvIGxpbWl0OiAgVGhlIHRhcmdldCBwaXBlbGluZSAoZS5nLiwgW3J1bl0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vKSwgW2NvbXBpbGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vY29tcGlsZS8pKTogIGBgYCB5YW1sICAgZGlzYWJsZWRBcmdzOiAgIC0gXCJwaXBlbGluZTpecnVuXCIgIyBkaXNhbGxvdyBjb21waWxlIGBgYCAgVGFyZ2V0IGFyZ3VtZW50cyAoZS5nLiwgW3Byb2Nlc3Mgb3V0cHV0c10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vb3V0cHV0L2V2ZW50L3Byb2Nlc3MvKSk6ICBgYGAgeWFtbCAgIC0gXCJwcm9jT3V0Q29tbWFuZDpeZmx1ZW50LWJpdCRcIiAgICMgbGltaXQgdG8gRmx1ZW50IEJpdCBvbmx5ICAgIyAtIHByb2NPdXRBcmdzOiA8c3BlY2lmeS1yZWdleD4gICMgZnVydGhlciBsaW1pdCBhcmdzIGZvciBGbHVlbnQgQml0IGBgYCAgQ29udHJvbCB3aGljaCBhcmd1bWVudCBbc291cmNlc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb25maWcvI3NvdXJjZXMpIHRvIGluc3BlY3Q6ICBgYGAgeWFtbCAgIC0gXCJzb3VyY2U6XmdpdGh1Yi4qXCIgICAgICAgICAgICAgIyBpbnNwZWN0IG9mIGFsbCBhcmd1bWVudHMgc291cmNlZCBmcm9tIEdpdEh1YiBhZ2FpbnN0IHRoaXMgbGlzdCAgIC0gXCJzb3VyY2U6Xig/IS9ldGMvbG9nMTB4LykuKlwiICAgIyBpbnNwZWN0IG9mIGFsbCBhcmd1bWVudHMgc291cmNlZCBmcm9tIGNvbmZpZyBmaWxlcyBOT1QgY29udGFpbmVkIGluOiAvZXRjL2xvZzEweC8gYGBgIiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9LAogICAgImRlYnVnRW52VmFycyIgOiB7CiAgICAgICJ0eXBlIiA6IFsKICAgICAgICAiYXJyYXkiLAogICAgICAgICJzdHJpbmciLAogICAgICAgICJudWxsIgogICAgICBdLAogICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTGlzdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gZGVidWdcblxuU3BlY2lmaWVzIGEgbGlzdCBvZiBlbnYgdmFyIG5hbWVzIGZvciB3aGljaCB0byBsb2cgaW5mb3JtYXRpb24gcmVsYXRpbmcgdG8gaG93IHRoZXkgYXJlIHJlc29sdmVkLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjYWxsOiBgTDFFbnYuZ2V0KFwibXlWYXJcIiwgXCJteURlZmF1bHRcIilgIGNhbiBiZSByZXNvbHZlZCBmcm9tIGEgbnVtYmVyIG9mIFtzb3VyY2VzXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWEVudi5nZXQpIHJhbmdpbmcgZnJvbSBsYXVuY2ggYXJndW1lbnRzLCB0byBPUy9KVk0gcHJvcGVydGllcyBhbmQgYSBkZWZhdWx0IHZhbHVlIChlLmcuLCBteURlZmF1bHQpLiAgU2V0dGluZyB0aGlzIHZhbHVlIHRvIGBteVZhcmAgd2lsbCBsb2cgSU5GTyBsZXZlbCBpbmZvcm1hdGlvbiBkZXRhaWxpbmcgaG93IHRoZSB2YWx1ZSBvZiB0aGUgYG15VmFyYCB3YXMgcmVzb2x2ZWQuIiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9CiAgfSwKICAicmVxdWlyZWQiIDogWwogICAgInRlbngiCiAgXSwKICAiYWRkaXRpb25hbFByb3BlcnRpZXMiIDogZmFsc2UKfQ==</template>

    ```yaml
    # 🔟❎ compile bootstrap configuration
    
    # This config file specifies bootstrap options for the compile pipeline.
    # To learn more see https://doc.log10x.com/compile/bootstrap
    
    # To learn more see https://doc.log10x.com/config/
    
    tenx: compile
    
    # =============================== Launch Settings ==============================
    
    # 'licenseKey' specifies a signed JWT license token used for authenticating against the 10x service
    licenseKey: $=TenXEnv.get("TENX_LICENSE_KEY", "NO-LICENSE")
    
    # 'licenseFile' specifies a path to a file containing the signed JWT license token.
    # Preferred over 'licenseKey' on production hosts: the token does not appear in 'ps' output.
    licenseFile: $=TenXEnv.get("TENX_LICENSE_FILE")
    
    # 'airgapped' suppresses every call to the 10x SaaS gateway: the license is verified locally against the embedded
    # public key, and ALL outbound calls to the 10x SaaS gateway are suppressed (no DNS, no TCP).
    airgapped: $=TenXEnv.get("TENX_AIRGAPPED", "false")
    
    # 'includePaths' specifies folders on disk for resolving relative config file/folder references in addition to the working folder
    includePaths: []
    
    # 'quiet' disables printing version information to the console.
    # quiet: true
    
    # 'jarFiles' specifies .jar files to dynamically load for use by compile, input and output API extensions.
    jarFiles: []
    
    # 'metricEndpoint' specifies a Prometheus remote-write endpoint for pipeline usage and health metrics.
    # Unset by default. The endpoint is a self-hosted or vendor Prometheus-compatible store, never a 10x
    # service, and is where the MCP reads engine state back from to tune policy such as regulator rates.
    # metricEndpoint: https://prometheus.example.com/api/v1/write
    
    # specifies a list of launch arguments that are disallowed from either command line or user config files.
    disabledArgs: []
    ```

## :material-menu: Options

Specify the options below to [configure](/config "configure") the Pipeline Bootstrapper:

|Name|Description|
|---|---|
|[tenx](#tenx "name of pipeline to execute")|Name of pipeline to execute|
|[licenseFile](#licensefile "path to a file containing the 10x license JWT")|Path to a file containing the 10x license JWT|
|[licenseKey](#licensekey "10x license JWT (inline)")|10x license JWT (inline)|
|[airgapped](#airgapped "run without contacting the 10x service")|Run without contacting the 10x service|
|[metricEndpoint](#metricendpoint "10x service Prometheus metrics endpoint")|10x service Prometheus metrics endpoint|
|[runtimeName](#runtimename "name to report to the 10x service endpoint for this runtime instance")|Name to report to the 10x service endpoint for this runtime instance|
|[runtimeAttributes](#runtimeattributes "list of attributes to add to all metrics reporting")|List of attributes to add to all metrics reporting|
|[includePaths](#includepaths "pipeline include folders")|Pipeline include folders|
|[jarFiles](#jarfiles "jar files to load")|Jar files to load|
|[quiet](#quiet "disable printing binary version information to the console")|Disable printing binary version information to the console|
|[disabledArgs](#disabledargs "limit argument values that can be set by users")|Limit argument values that can be set by users|
|[debugEnvVars](#debugenvvars "list environment variables to debug")|List environment variables to debug|

### :material-menu-right-outline:**`tenx`**

Name of pipeline to execute.

|Type|Required|Names|
|---|---|---|
|String|✔|\[tenx, pipeline\]|

Target [pipeline](https://doc.log10x.com/engine/pipeline/) to execute.

For example, to specify the [run](https://doc.log10x.com/run/) pipeline and a [YAML](https://doc.log10x.com/config/yaml/) config file containing launch arguments, use:

```console
$ tenx run @~/my.yaml
```

The YAML file may specify the pipeline name via a 'tenx' entry, allowing the 'pipeline' argument to be omitted from the command line.

For example (my.yaml):

```yaml
tenx: run # set the pipeline to 'run'
licenseKey: <my-license-jwt>
...
```

Allows for launching the run pipeline via:

```console
$ tenx @~/my.yaml
```


### :material-menu-right-outline:**`licenseFile`**

Path to a file containing the 10x license JWT.

|Type|Default|Names|
|---|---|---|
|String|""|\[licenseFile, TENX\_LICENSE\_FILE\]|

Path to a file containing the signed 10x license JWT.
Preferred over `licenseKey` for production: the token is not visible in `ps` output and is easy to rotate by replacing the file.

Without a license the engine runs on the built-in 30-day evaluation license.
See [licensing](https://doc.log10x.com/manage/license/) for production licenses.

If both `licenseFile` and `licenseKey` are provided, the file wins.


### :material-menu-right-outline:**`licenseKey`**

10x license JWT (inline).

|Type|Default|Names|
|---|---|---|
|String|""|\[licenseKey, TENX\_LICENSE\_KEY\]|

The signed 10x license JWT, passed inline.
Discouraged on the command line because the value is visible in `ps` output; prefer `licenseFile` in production.

Without a license the engine runs on the built-in 30-day evaluation license.
See [licensing](https://doc.log10x.com/manage/license/) for production licenses.


### :material-menu-right-outline:**`airgapped`**

Run without contacting the 10x service.

|Type|Default|Names|
|---|---|---|
|Boolean|false|\[airgapped, TENX\_AIRGAPPED\]|

When `true`, the license is verified locally (signature + claims) and no calls are made to the 10x service:
no startup validation, no metrics reporting, no user-attribute enrichment. Suitable for fully airgapped deployments
where the engine has no path to the vendor SaaS.

When `false` (default), the engine additionally calls the 10x service at startup, and only when a service endpoint is actually configured; the default configuration names none, so an unconfigured engine makes no call either way. The call is best-effort enrichment: the local verification is the gate, and a service that cannot be reached, or that answers with an error, produces a warning and the engine runs.

Airgapped mode is honored for every license type.


### :material-menu-right-outline:**`metricEndpoint`**

10x service Prometheus metrics endpoint.

|Type|Default|
|---|---|
|String|""|

Specifies the address of the Prometheus remote write endpoint to write
pipeline usage and health metrics.

Unset by default: an engine with no metric endpoint configured collects
metrics locally and sends them nowhere.

!!! note ""

    This argument is only settable in the 10x 'on-premises' build.


### :material-menu-right-outline:**`runtimeName`**

Name to report to the 10x service endpoint for this runtime instance.

|Type|Default|
|---|---|
|String|""|

Specifies a logical name used as a [tag value](https://www.baeldung.com/micrometer#4-meters){target="\_blank"} for pipeline metrics.
This value identifies instances of the 10x run/compile pipelines
when reporting to the 10x service. For example, for a 10x [Receiver](https://doc.log10x.com/apps/receiver/) with optimization enabled for Fluent Bit forwarders collecting events from a `broker` user-app,
this value can be set to: `receive_fluentbit_broker`.


### :material-menu-right-outline:**`runtimeAttributes`**

List of attributes to add to all metrics reporting.

|Type|Default|
|---|---|
|List|\[\]|

Specifies a list of key-value pairs in the format `key:value` to be added as tags to pipeline metrics reported to the 10x service.
These tags enable finer-grained filtering and analysis in monitoring systems like Prometheus.
Multiple attributes can be combined into a single string using a semicolon (`;`), e.g., `key1:val1;key2:val2`.

If a key does not start with tenx\_, the prefix tenx\_ is automatically prepended to ensure consistency in tag naming conventions.
For example, a provided attribute app:my-app will be reported as tenx\_app:my-app

```yaml
  runtimeAttributes:
    - app:reporter
    - env:edge
```


### :material-menu-right-outline:**`includePaths`**

Pipeline include folders.

|Type|Default|
|---|---|
|List|\[working directory of current process\]|

Specifies folders on disk for resoling relative references within [include directives](https://doc.log10x.com/config/yaml/#include-directives).


### :material-menu-right-outline:**`jarFiles`**

Jar files to load.

|Type|Default|
|---|---|
|List|\[\]|

Specifies a list of .jar files to load into the host JVM for use by [compile](https://doc.log10x.com/api/compile/),
[input](https://doc.log10x.com/api/input/) and [output](https://doc.log10x.com/api/output/) API extensions.

!!! note ""

    This argument is not supported in the [Runtime](https://doc.log10x.com/engine/flavors/#runtime) flavor.


### :material-menu-right-outline:**`quiet`**

Disable printing binary version information to the console.

|Type|Default|
|---|---|
|Boolean|false|

Disable printing build/version information to the console upon launch.


### :material-menu-right-outline:**`disabledArgs`**

Limit argument values that can be set by users.

|Type|Default|
|---|---|
|List|\[\]|

specifies a list of launch arguments that are disallowed from either command line or user config files.
This argument provides a method of limiting the target [pipeline](https://doc.log10x.com/shared/bootstrap/#pipeline), [source](https://doc.log10x.com/config/#sources)
and and [command line](https://doc.log10x.com/config/cli/) settable by the user.

This mechanism enables pipeline launchers such as the [Quarkus launcher](https://doc.log10x.com/api/launch/#quarkus)
to limit user input received via REST requests to a target subset of 'safe' arguments.

For example, adding [procOutCommand](https://doc.log10x.com/run/output/event/process/#procoutcommand "command to launch") to this list
ensures that no external process outputs can be launched by the runtime.

An optional regex pattern can limit arguments to a certain subset of values in the form of: `<arg-name>[:pattern]` (e.g., specific process names).
Multiple patterns can be specified per argument.

Matching the `source` argument determines which source locations to inspect (e.g., folders, files, GitHub repos).
For example, an admin may place .yaml config files containing preset Fluent Bit outputs in `/etc/log10x/`,
excluding their enclosed arguments from limits set by this list, while disallowing users to directly set them via the command-line
or by sourcing them from their local/GitHub config files (see example below).

To limit:

The target pipeline (e.g., [run](https://doc.log10x.com/run/), [compile](https://doc.log10x.com/compile/)):

```yaml
  disabledArgs:
  - "pipeline:^run" # disallow compile
```

Target arguments (e.g., [process outputs](https://doc.log10x.com/run/output/event/process/ "Write TenXObject and template values to a sub-process stdin")):

```yaml
  - "procOutCommand:^fluent-bit$"   # limit to Fluent Bit only
  # - procOutArgs: <specify-regex>  # further limit args for Fluent Bit
```

Control which argument [sources](https://doc.log10x.com/config/#sources) to inspect:

```yaml
  - "source:^github.*"             # inspect of all arguments sourced from GitHub against this list
  - "source:^(?!/etc/log10x/).*"   # inspect of all arguments sourced from config files NOT contained in: /etc/log10x/
```


### :material-menu-right-outline:**`debugEnvVars`**

List environment variables to debug.

|Type|Default|
|---|---|
|List|\[\]|

Specifies a list of env var names for which to log information relating to how they are resolved.

For example, the following call: `L1Env.get("myVar", "myDefault")` can be resolved from a number of [sources](https://doc.log10x.com/api/js/#TenXEnv.get)
ranging from launch arguments, to OS/JVM properties and a default value (e.g., myDefault).

Setting this value to `myVar` will log INFO level information detailing how the value of the `myVar` was resolved.


<br/>:material-github: This unit is defined in [bootstrap/unit.yaml](https://github.com/log-10x/modules/tree/main/pipelines/shared/units/bootstrap/unit.yaml "bootstrap/unit.yaml"){target="\_blank"}.

