---
title: "Fluent Bit Event Output"
description: "write TenXObject and template values to a Fluent Bit subprocess to ship\
  \ to remote log analyzers"
source: "https://github.com/log-10x/modules/tree/main/pipelines/run/modules/output/event/fluentbit/module.yaml"
icon: "simple/fluentbit"

---
Defines a Fluent Bit process that spawns and writes [TenXObject](https://doc.log10x.com/api/js/#TenXObject "Provide structured, reflective access to log/trace events read from input(s).") instances and template field values.

This output integrates a lightweight, customizable [Fluent Bit](https://fluentbit.io/){target="\_blank"} pipeline for shipping processed events to destinations such as [Datadog](https://docs.fluentbit.io/manual/pipeline/outputs/datadog){target="\_blank"}, [Splunk](https://docs.fluentbit.io/manual/pipeline/outputs/splunk){target="\_blank"}, [Elasticsearch](https://docs.fluentbit.io/manual/pipeline/outputs/elasticsearch){target="\_blank"}, and [CloudWatch](https://docs.fluentbit.io/manual/pipeline/outputs/cloudwatch){target="\_blank"}.

**Use cases:**

- **[Lambda launcher](https://doc.log10x.com/engine/launcher/lambda/)**: Ships optimized CloudWatch Logs events to analytics platforms. The Python handler pipes expanded events to the 10x Engine via stdin; Fluent Bit handles output shipping to the configured destination.
- **[Retriever](https://doc.log10x.com/apps/retriever/#query)**: Ships query results from cloud storage (e.g., S3) to log analyzers and time-series databases.

## :material-wrench-outline: Config Files

To configure the Fluent Bit event output module, [:material-cog: Edit](https://doc.log10x.com/config/app/#module-config "Learn how to edit app and module configurations") these files.  

=== "Cloudwatch"

    Below is the default configuration from: [fluentbit/cloudwatch.yaml](https://github.dev/log-10x/config/blob/main/pipelines/run/output/event/fluentbit/cloudwatch.yaml "fluentbit/cloudwatch.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/run/output/event/fluentbit/cloudwatch.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-cloudwatch.yaml0-edit-button" data-tooltip="Edit configuration file" data-dialog-id="cloudwatch-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="cloudwatch-yaml0-dialog" class="md-dialog md-dialog--editor">
        <div class="editor-dialog-wrapper">
            <div class="editor-dialog-header">
                <span class="editor-dialog-title">Edit cloudwatch.yaml 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('cloudwatch-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/output/event/fluentbit/cloudwatch.yaml"
                                data-copy-nix="/etc/log10x/config/run/output/event/fluentbit/cloudwatch.yaml"
                                data-copy-win="C:\log10x\configs/run/output/event/fluentbit/cloudwatch.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/output/event/fluentbit/cloudwatch.yaml">$TENX_CONFIG/run/output/event/fluentbit/cloudwatch.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/output/event/fluentbit/cloudwatch.yaml">./pipelines/run/output/event/fluentbit/cloudwatch.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">ewogICJ0eXBlIiA6ICJvYmplY3QiLAogICJwcm9wZXJ0aWVzIiA6IHsKICAgICJpbmNsdWRlIiA6IHsKICAgICAgInR5cGUiIDogImFycmF5IiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9LAogICAgInRlbngiIDogewogICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgfSwKICAgICJmbHVlbnRiaXRPdXQiIDogewogICAgICAidHlwZSIgOiAiYXJyYXkiLAogICAgICAiaXRlbXMiIDogewogICAgICAgICJ0eXBlIiA6ICJvYmplY3QiLAogICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZSwKICAgICAgICAicHJvcGVydGllcyIgOiB7CiAgICAgICAgICAiY29tbWFuZCIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkNvbW1hbmQgdG8gbGF1bmNoIEZsdWVudCBCaXRcblxuU3BlY2lmaWVzIHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUgdG8gbGF1bmNoIHRoZSBGbHVlbnQgQml0ICBzdWItcHJvY2Vzcy4iCiAgICAgICAgICB9LAogICAgICAgICAgImlucHV0QXJncyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHNwYXduZWQgRmx1ZW50IEJpdCAgcHJvY2VzcyBzZXR0aW5nIHVwIGlucHV0XG5cbkxpc3Qgb2YgdmFsdWVzIHRvIHBhc3MgYXMgc3RhcnR1cCBhcmd1bWVudHMgdG8gdGhlIHNwYXduZWQgRmx1ZW50IEJpdCAgc3ViLXByb2Nlc3MgaW50ZW5kZWQgdG8gc2V0IHVwIGl0J3Mgc3RkaW4gaW5wdXQuIChEZWZhdWx0OiBbXCItY1wiLFwiJD1wYXRoKFxcXCJmbHVlbnRiaXQtMTB4LWlucHV0LmNvbmZcXFwiKVwiXSkiLAogICAgICAgICAgICAiaXRlbXMiIDogewogICAgICAgICAgICAgICJ0eXBlIiA6ICJzdHJpbmciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkZWZhdWx0IiA6IFsKICAgICAgICAgICAgICAiLWMiLAogICAgICAgICAgICAgICIkPXBhdGgoXCJmbHVlbnRiaXQtMTB4LWlucHV0LmNvbmZcIikiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAib3V0cHV0QXJncyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHNwYXduZWQgRmx1ZW50IEJpdCAgcHJvY2VzcyBzZXR0aW5nIHVwIG91dHB1dFxuXG5MaXN0IG9mIHZhbHVlcyB0byBwYXNzIGFzIHN0YXJ0dXAgYXJndW1lbnRzIHRvIHRoZSBzcGF3bmVkIEZsdWVudCBCaXQgc3ViLXByb2Nlc3MgaW50ZW5kZWQgdG8gc2V0IHVwIGl0J3Mgb3V0cHV0IHBsdWdpbihzKSIsCiAgICAgICAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgICAgICAgInR5cGUiIDogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJsYXp5TGF1bmNoIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJib29sZWFuIiwKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlNldHMgd2hldGhlciB0byBsYXVuY2ggdGhlIHByb2Nlc3Mgb24tZGVtYW5kXG5cbkNvbnRyb2xzIHdoZXRoZXIgdG8gc3Bhd24gdGhlIHRhcmdldCBzdWItcHJvY2VzcyB1cG9uIHRoZSBjcmVhdGlvbiBvZiB0aGUgb3V0cHV0IG9yIG9uLWRlbWFuZC4gSWYgdHJ1ZSwgbGF1bmNoIHRoZSBzdWItcHJvY2VzcyB3aGVuIHRoZSBmaXJzdCBUZW5YT2JqZWN0IGluc3RhbmNlIGlzIHdyaXR0ZW4gdG8gaXRzIHN0ZGluLiAoQWNjZXB0cyBib29sZWFuIG9yIHN0cmluZyB3aXRoICQ9IHByZWZpeCBmb3IgcnVudGltZSBldmFsdWF0aW9uKSIKICAgICAgICAgIH0sCiAgICAgICAgICAic3RhcnR1cCIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6ICJvYmplY3QiLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiIDogZmFsc2UsCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKICAgICAgICAgICAgICAid2FpdCIgOiB7CiAgICAgICAgICAgICAgICAidHlwZSIgOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZSwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKICAgICAgICAgICAgICAgICAgIm1zIiA6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgICAgICAgICAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiV2FpdCB0aW1lIGZvciBwcm9jZXNzIHRvIHN0YXJ0dXBcblxuU2V0cyBhIHN0YXJ0dXAgZGVsYXkgd2FpdCB0aW1lIGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIHByb2Nlc3MgaXMgY29uc2lkZXJlZCBhdmFpbGFibGUgZm9yIGV2ZW50cy4gaWYgcHJvdmlkZWQsIHdpbGwgYWRkIGEgd2FpdCBhcyBwYXJ0IG9mIHN0YXJ0aW5nIHRoZSBwcm9jZXNzIGJlZm9yZSBlbWl0dGluZyBldmVudHMgaW50byBpdC4gbWF4IHZhbHVlIGZvciB0aGlzIGFyZ3VtZW50IGlzIDEwLDAwMCAoaWUgMTAgc2Vjb25kcykuIGlmIFtmbHVlbnRiaXRPdXRTdGFydHVwV2FpdFBhdHRlcm5dKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9mbHVlbnRiaXQvI2ZsdWVudGJpdE91dHN0YXJ0dXB3YWl0cGF0dGVybikgaXMgYWxzbyBwcm92aWRlZCwgdGhlIHByb2Nlc3Mgd2lsbCBiZSBjb25zaWRlcmVkIGEgZmFpbHVyZSBpZiB0aGUgd2FpdCB0aW1lIGhhcyBwYXNzZWQgYmVmb3JlIGEgbGluZSBtYXRjaGluZyBbZmx1ZW50Yml0T3V0U3RhcnR1cFdhaXRQYXR0ZXJuXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRzdGFydHVwd2FpdHBhdHRlcm4pIHdhcyBlbWl0dGVkLiAoQWNjZXB0cyBudW1iZXIgb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiA1MDAwKSIsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiIDogNTAwMAogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAicGF0dGVybiIgOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJXYWl0IGZvciBhbiBvdXRwdXQgZnJvbSB0aGUgcHJvY2VzcyBhdCBzdGFydHVwXG5cblNldHMgYSByZWdleCBwYXR0ZXJuIHRvIHdhaXQgZm9yIHRoZSBwcm9jZXNzIHRvIGVtaXQgZm9yIGl0IHRvIGJlIGNvbnNpZGVyZWQgYXZhaWxhYmxlIGZvciBldmVudHMuIGlmIHByb3ZpZGVkLCB3aWxsIHdhaXQgdW50aWwgdGhlIHByb2Nlc3MgaGFzIGVtaXR0ZWQgYSBsaW5lIHRvIGl0J3Mgb3V0cHV0IHRoYXQgbWF0Y2hlcyB0aGUgcmVnZXggYmVmb3JlIGVtaXR0aW5nIGV2ZW50cyBpbnRvIGl0LiBpZiBbZmx1ZW50Yml0T3V0U3RhcnR1cFdhaXRNc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vb3V0cHV0L2V2ZW50L2ZsdWVudGJpdC8jZmx1ZW50Yml0T3V0U3RhcnR1cFdhaXRNcykgaXMgYWxzbyBwcm92aWRlZCwgd2lsbCBvbmx5IHdhaXQgZm9yIHRoZSBzcGVjaWZpZWQgd2FpdCB0aW1lLCBhZnRlciB3aGljaCBpZiBubyBsaW5lIHdhcyBlbWl0dGVkIHRvIG1hdGNoIHRoZSBwcm92aWRlZCByZWdleCB0aGUgcHJvY2VzcyB3aWxsIGJlIGNvbnNpZGVyZWQgYSBmYWlsdXJlLiAoRGVmYXVsdDogXFxbXFxzKnNwXFxzKl1cXHMrc3RyZWFtXFxzK3Byb2Nlc3NvclxccytzdGFydGVkXFxiKSIsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiIDogIlxcW1xccypzcFxccypdXFxzK3N0cmVhbVxccytwcm9jZXNzb3JcXHMrc3RhcnRlZFxcYiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJkZXN0cm95TW9kZSIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkNvbnRyb2wgaG93IHRvIHRlcm1pbmF0ZSB0aGUgc3ViLXByb2Nlc3Mgb24gb3V0cHV0IGNsb3NlXG5cbkNvbnRyb2xzIGhvdyB0byB0cmVhdCBzcGF3bmVkIHN1Yi1wcm9jZXNzIHdoZW4gdGhpcyBvdXRwdXQgY2xvc2VzLiBQb3NzaWJsZSB2YWx1ZXM6IHwgVmFsdWUgICAgICB8IERlc2NyaXB0aW9uIHwgfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfCB8ICoqZ3JhY2VmdWwqKiAoZGVmYXVsdCkgICB8IFRoZSBzdWItcHJvY2VzcyBpcyBkZXN0cm95ZWQgZ3JhY2VmdWxseSB3aXRoIGEgdGltZW91dCBwZXJpb2Qgb2YgW2ZsdWVudGJpdE91dERlc3Ryb3lXYWl0XShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRkZXN0cm95d2FpdCkuIHwgfCAqKmZvcmNpYmxlKiogICAgICAgICAgICAgfCBUZXJtaW5hdGVzIHRoZSBzdWItcHJvY2VzcyBpbW1lZGlhdGVseS4gfCB8ICoqY2FjaGVkKiogICAgICAgICAgICAgICB8IFRoZSBzdWItcHJvY2VzcyByZW1haW5zIGFsaXZlIGZvciBmdXR1cmUgcGlwZWxpbmVzIHRoYXQgbGF1bmNoIHRoZSBzYW1lIGNvbW1hbmQgYW5kIGFyZ3VtZW50IGNvbWJpbmF0aW9uIHdpdGhpbiB0aGUgaG9zdCBKVk0uIEEgbWF4aW11bSBvZiBbZmx1ZW50Yml0T3V0TWF4Q2FjaGVTaXplXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRtYXhjYWNoZXNpemUpIGNhbiBiZSBrZXB0IGFsaXZlLiBVc2VmdWwgZm9yIGxhdW5jaGluZyBzaGlwcGVycyAoZS5nLiwgRmlsZWJlYXQsIEZsdWVudCBCaXQpIGFjcm9zcyBtdWx0aXBsZSAxMHggcGlwZWxpbmUgcnVucyBpbiBhIGxvbmctbGl2aW5nIHNlcnZlciBlbnZpcm9ubWVudC4gfCAoRGVmYXVsdDogZ3JhY2VmdWwpIiwKICAgICAgICAgICAgImRlZmF1bHQiIDogImdyYWNlZnVsIgogICAgICAgICAgfSwKICAgICAgICAgICJkZXN0cm95V2FpdCIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkR1cmF0aW9uIHRvIHdhaXQgZm9yIHNwYXduZWQgc3ViLXByb2Nlc3MgdG8gdGVybWluYXRlXG5cbkNvbnRyb2xzIHRoZSB0aW1lIGR1cmF0aW9uIHRoYXQgdGhlIG91dHB1dCBzdHJlYW0gd2lsbCB3YWl0IGZvciB0aGUgc3ViLXByb2Nlc3MgdG8gdGVybWluYXRlIGdyYWNlZnVsbHkgKGUuZy4sICc1cycpLiBJZiB0aGUgcHJvY2VzcyB0aW1lb3V0cywgdGhlIG91dHB1dCB3aWxsIGZvcmNpYmx5IHRlcm1pbmF0ZSBpdC4gSWYgc2V0IHRvIDAsIHRoZSBvdXRwdXQgc3RyZWFtIHdpbGwgd2FpdCBpbmRlZmluaXRlbHkgZm9yIHRoZSBzdWItcHJvY2VzcyB0byB0ZXJtaW5hdGUuIFRoaXMgdmFsdWUgb25seSBhcHBsaWVzIHdoZW4gW2ZsdWVudGJpdE91dERlc3Ryb3lNb2RlXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRkZXN0cm95bW9kZSkgaXMgc2V0IHRvIGBncmFjZWZ1bGAuIgogICAgICAgICAgfSwKICAgICAgICAgICJtYXhDYWNoZVNpemUiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgIm51bWJlciIsCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJNYXggbnVtYmVyIG9mIHN1Yi1wcm9jZXNzZXMgdG8ga2VlcCBhbGl2ZSBhY3Jvc3Mgc3Vic2VxdWVudCAxMHggcGlwZWxpbmUgZXhlY3V0aW9uc1xuXG5TZXRzIHRoZSBnbG9iYWwgbWF4aW11bSBudW1iZXIgb2YgcHJvY2Vzc2VzIHRoYXQgY2FuIHJldGFpbmVkIGdsb2JhbGx5IGFjcm9zcyAxMHggcGlwZWxpbmUgZXhlY3V0aW9ucyB3aXRoaW4gdGhlIGhvc3QgSlZNLiBUaGlzIHZhbHVlIGlzIHVzZWZ1bCB3aGVuIGxhdW5jaGluZyBzaGlwcGVycyAoZS5nLiwgRmlsZWJlYXQsIEZsdWVudCBCaXQpIGZvciB1c2UgYWNyb3NzIG11bHRpcGxlIDEweCBwaXBlbGluZSBleGVjdXRpb25zIHdpdGhpbiBhIHNlcnZlciBlbnZpcm9ubWVudC4gVGhpcyB2YWx1ZSBvbmx5IGFwcGxpZXMgd2hlbiBbZmx1ZW50Yml0T3V0RGVzdHJveU1vZGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9mbHVlbnRiaXQvI2ZsdWVudGJpdG91dGRlc3Ryb3ltb2RlKSBpcyBzZXQgdG8gYGNhY2hlZGAuIElmIFtmbHVlbnRiaXRPdXRNYXhDYWNoZVNpemVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9mbHVlbnRiaXQvI2ZsdWVudGJpdG91dG1heGNhY2hlc2l6ZSkgaXMgc2V0IHRvIDAsIG5vIGNhY2hpbmcgaXMgcGVyZm9ybWVkLCBhbmQgc3ViLXByb2Nlc3NlcyBhcmUgZGVzdHJveWVkIGdyYWNlZnVsbHkuIChBY2NlcHRzIG51bWJlciBvciBzdHJpbmcgd2l0aCAkPSBwcmVmaXggZm9yIHJ1bnRpbWUgZXZhbHVhdGlvbikiCiAgICAgICAgICB9LAogICAgICAgICAgImZpZWxkcyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTGlzdCBvZiBUZW5YT2JqZWN0IGZpZWxkIG5hbWVzIHRvIGVuY29kZVxuXG5TcGVjaWZpZXMgYSBsaXN0IG9mIFRlblhPYmplY3QgaW50cmluc2ljL2NhbGN1bGF0ZWQvZXh0cmFjdGVkIGZpZWxkIG5hbWVzIHRvIGV4dHJhY3QgYW5kIHdyaXRlIHRvIHRoZSBvdXRwdXQuIiwKICAgICAgICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgImZpbHRlciIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGFuIFRlblhPYmplY3QgbXVzdCBldmFsdWF0ZSBhcyAndHJ1dGh5JyBhZ2FpbnN0IHRvIGJlIHdyaXR0ZW4gdG8gdGhpcyBvdXRwdXRcblxuU3BlY2lmaWVzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRoYXQgYW4gVGVuWE9iamVjdCBtdXN0IGV2YWx1YXRlIGFzIHRydXRoeSB0byB3cml0ZSBpdHMgaW5zdGFuY2UvdGVtcGxhdGUgZmllbGQgdmFsdWVzIHRvIHRoaXMgb3V0cHV0LiAgRm9yIGV4YW1wbGUsIHRvIG9ubHkgZW1pdCBbdGltZXN0YW1wZWRdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vYXBpL2pzLyNUZW5YQmFzZU9iamVjdCt0aW1lc3RhbXBlZCkgVGVuWE9iamVjdHMsIHNwZWNpZnk6IGBgYCB5YW1sIGZsdWVudGJpdE91dEZpbHRlcjogdGhpcy50aW1lc3RhbXBlZCBgYGAiCiAgICAgICAgICB9LAogICAgICAgICAgIndyaXRlT2JqZWN0cyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJJZiB0cnVlLCBUZW5YT2JqZWN0IGZpZWxkIHZhbHVlcyBzcGVjaWZpZWQgYnkgW2ZsdWVudGJpdE91dEZpZWxkc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vb3V0cHV0L2V2ZW50L2ZsdWVudGJpdC8jZmx1ZW50Yml0b3V0ZmllbGRzKSBhcmUgZW5jb2RlZCB0byB0aGlzIG91dHB1dFxuXG5EZXRlcm1pbmUgd2hldGhlciB0byB3cml0ZSBbZmx1ZW50Yml0T3V0RmllbGRzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRmaWVsZHMpIHZhbHVlcyBvZiBhbiBUZW5YT2JqZWN0IHBhc3NlZCB0byB0aGlzIG91dHB1dC4gVGhpcyBjb25maWd1cmF0aW9uIGlzIHR5cGljYWxseSBkZWZpbmVkIHVzaW5nIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uLiAgVG8gZW5hYmxlL2Rpc2FibGUgdGhlIG91dHB1dCBkZXBlbmRpbmcgb24gd2hldGhlciBhIGxhdW5jaCBhcmd1bWVudCwgZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIEpWTSAtRCBvcHRpb24gZXZhbHVhdGVzIGFzIHRydXRoeSwgdXNlOiBgYGAgeWFtbCAgIGZsdWVudGJpdE91dFdyaXRlT2JqZWN0czogJD1UZW5YRW52LmdldChcIm15UHJvY0NtZFwiKSBgYGAgVG8gbGVhcm4gbW9yZSBzZWUgW1RlblhFbnYuZ2V0XShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWEVudi5nZXQpLiAoRGVmYXVsdDogdHJ1ZSkiLAogICAgICAgICAgICAiZGVmYXVsdCIgOiAidHJ1ZSIKICAgICAgICAgIH0sCiAgICAgICAgICAid3JpdGVUZW1wbGF0ZXMiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgImJvb2xlYW4iLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiSWYgdHJ1ZSwgd3JpdGUgbmV3IFRlblhUZW1wbGF0ZXMgdG8gdGhpcyBvdXRwdXRcblxuQ29udHJvbHMgd2hldGhlciB0byB3cml0ZSB0ZW1wbGF0ZSB2YWx1ZXMgb2YgVGVuWE9iamVjdHMgcGFzc2VkIHRvIHRoaXMgb3V0cHV0LiBUaGUgb3V0cHV0IHdpbGwgb25seSBlbWl0IFRlblhUZW1wbGF0ZXMgdGhhdCB0aGUgcGlwZWxpbmUgZGlkIG5vdCBsb2FkIGF0IHN0YXJ0dXAgdmlhIHRoZVt0ZW1wbGF0ZUZpbGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL3RlbXBsYXRlLyN0ZW1wbGF0ZWZpbGVzKSBhcmd1bWVudCwgYW5kIHdpbGwgb25seSBlbWl0IGFuIFRlblhUZW1wbGF0ZSBvbmNlIGJhc2VkIG9uIGl0cyBbdGVtcGxhdGVIYXNoXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWEJhc2VPYmplY3QrdGVtcGxhdGVIYXNoKSB2YWx1ZS4gKERlZmF1bHQ6IGZhbHNlKSIsCiAgICAgICAgICAgICJkZWZhdWx0IiA6ICJmYWxzZSIKICAgICAgICAgIH0sCiAgICAgICAgICAiZW5jb2RlIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogIm9iamVjdCIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZSwKICAgICAgICAgICAgInByb3BlcnRpZXMiIDogewogICAgICAgICAgICAgICJ0eXBlIiA6IHsKICAgICAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJUaGUgb3V0cHV0IGZvcm1hdCBpbiB3aGljaCB0byBlbmNvZGUgVGVuWE9iamVjdCB2YWx1ZXMuIFBvc3NpYmxlIHZhbHVlczpbanNvbiwgZGVsaW1pdGVkXVxuXG5TcGVjaWZpZXMgaG93IHRvIGVuY29kZSBbZmx1ZW50Yml0T3V0RmllbGRzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRmaWVsZHMpIHZhbHVlcyB0byB0aGlzIG91dHB1dC4gUG9zc2libGUgdmFsdWVzOiAtICoqanNvbioqOiBmb3JtYXRzIG5hbWVzIGFuZCB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IFRlblhPYmplY3QgYXM6IHtcImZpZWxkXCI6XCJzdHJcIixcImZpZWxkMlwiOjEsIFwiZmllbGQzXCI6IHRydWV9IC0gKipkZWxpbWl0ZWQqKjogZm9ybWF0cyB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IFRlblhPYmplY3QgYXM6IFwic3RyXCIsMSx0cnVlICAgIFRoZSBbZmx1ZW50Yml0T3V0RW5jb2RlRGVsaW1pdGVyXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRPdXRlbmNvZGVkZWxpbWl0ZXIpIGFyZ3VtZW50IGRldGVybWluZXMgdGhlIHNlcGFyYXRvciB0byB1c2UuIChEZWZhdWx0OiBkZWxpbWl0ZWQpIiwKICAgICAgICAgICAgICAgICJkZWZhdWx0IiA6ICJkZWxpbWl0ZWQiCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAiZGVsaW1pdGVyIiA6IHsKICAgICAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJUaGUgZGVsaW1pdGVyIHBsYWNlZCBiZXR3ZWVuIGtleSBhbmQgdmFsdWVzIHBhaXJzIGlmICdmbHVlbnRiaXRPdXRFbmNvZGVUeXBlJyBpcyAnZGVsaW1pdGVkJ1xuXG5TZXRzIHRoZSBjaGFyIGRlbGltaXRlciB0byBzZXBhcmF0ZSBUZW5YT2JqZWN0IGZpZWxkIHZhbHVlcyB3aGVuIFtmbHVlbnRiaXRPdXRFbmNvZGVUeXBlXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRlbmNvZGV0eXBlKSBpcyBgZGVsaW1pdGVkYC4gKERlZmF1bHQ6ICApIiwKICAgICAgICAgICAgICAgICJkZWZhdWx0IiA6ICIgIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJlbmNvZGVkTGluZVByZWZpeCIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlRoZSBsaW5lIHByZWZpeCBwcmVwZW5kZWQgdG8gdGhlIGVuY29kZWQgZXZlbnQgaWYgJ2ZsdWVudGJpdE91dEVuY29kZVR5cGUnIGlzICdkZWxpbWl0ZWQnXG5cblNldHMgdGhlIGNoYXIgd2hpY2ggaXMgcHJlcGVuZGVkIHRvIHRoZSBlbWl0dGVkIFRlblhPYmplY3QgZmllbGQgdmFsdWVzIHdoZW4gW2ZsdWVudGJpdE91dEVuY29kZVR5cGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9mbHVlbnRiaXQvI2ZsdWVudGJpdG91dGVuY29kZXR5cGUpIGlzIGBkZWxpbWl0ZWRgLiAoRGVmYXVsdDogKSIsCiAgICAgICAgICAgICJkZWZhdWx0IiA6ICIiCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicmVxdWlyZWQiIDogWwogICAgICAgICAgImNvbW1hbmQiCiAgICAgICAgXQogICAgICB9CiAgICB9CiAgfSwKICAiYWRkaXRpb25hbFByb3BlcnRpZXMiIDogdHJ1ZQp9</template>

    ```yaml
    # 🔟❎ 'run' Fluent Bit output configuration for events stream output to AWS Cloudwatch
    
    # Launch a Fluent Bit process into whose stdin pipe to write TenXObjects field values and TenXTemplates
    # To learn more see https://doc.log10x.com/run/output/event/process/
    
    # Set the 10x pipeline to 'run'
    tenx: run
    
    # =============================== Dependencies ================================
    
    include:
      - run/modules/output/event/fluentbit
    
    
    # ============================ Fluent Bit Options =============================
    
    # Multiple Fluent Bit outputs can be defined below
    
    fluentbitOut:
    
        # ------------------------------ General ----------------------------------
    
        # 'writeObjects' controls whether to write TenXObject field values to output.
      - writeObjects: true
    
        # 'writeTemplates' controls whether to write new template for TenXObjects written to
        #  this output. To learn more about TenXTemplates, see: https://doc.log10x.com/run/template
        writeTemplates: false
    
        # ------------------------------ Process ----------------------------------
    
        # 'command' specifies the command to execute to launch the Fluent Bit sub-process.
        command: /opt/fluent-bit/bin/fluent-bit
    
        # 'inputArgs' specifies list of values to pass as startup arguments to the spawned Fluent Bit sub-process
        inputArgs:
          # Sets the Fluent Bit input to read from stdin and route TenXTemplates
          # See https://github.com/log-10x/config/blob/main/pipelines/run/output/event/fluentbit/fluentbit-10x-input.conf
          - -c
          - $=path("fluentbit-10x-input.conf")
    
        # Setting the Fluent Bit output to aws cloudwatch.
        # for full config options of the Fluent Bit cloudwatch plugin, see -
        # https://docs.fluentbit.io/manual/pipeline/outputs/cloudwatch
        #
        # NOTE - authenticating with AWS is handled by Fluent Bit using credentials providers
        # as defined in - https://docs.fluentbit.io/manual/administration/aws-credentials
        #
        outputArgs:
          ############### Events output ###############
    
          # Set event output to Cloudwatch
          - "-o"
          - "cloudwatch_logs"
          - "-m"
          - "input"
    
          # Setting destination within AWS Cloudwatch
          - "-p"
          - "log_group_name=my-tenx-logs-stream"
          - "-p"
          - "log_stream_prefix=events-"
          - "-p"
          - "auto_create_group=true"
          - "-p"
          - "$=\"region=\" + TenXEnv.get(\"AWS_REGION\", \"us-east-1\")"
    
          # Flush every second
          - "-f"
          - "1"
    
          ############### Templates output ###############
    
          # Set templates output to Cloudwatch
          - "-o"
          - "cloudwatch_logs"
          - "-m"
          - "templates"
    
          # Setting destination within AWS Cloudwatch
          - "-p"
          - "log_group_name=my-tenx-logs-stream"
          - "-p"
          - "log_stream_prefix=templates-"
          - "-p"
          - "auto_create_group=true"
          - "-p"
          - "$=\"region=\" + TenXEnv.get(\"AWS_REGION\", \"us-east-1\")"
    
          # Flush every second
          - "-f"
          - "1"
    
        # 'destroyMode' is set to 'cached' to allow a fluent-bit sub-process to
        #  to be reused across multiple 10x pipeline executions within a host JVM.
        destroyMode: cached
    
        # 'maxCacheSize' sets the size of the cache to used for caching fluent-bit instances
        maxCacheSize: 1
    
        # 'lazyLaunch' determines whether the fluent-bit instance will launch immediately
        # during the pipeline initialization, or only on-demand.
        lazyLaunch: true
    
        # ------------------------------ Encoding ---------------------------------
    
        # 'filter' specifies an expression that any TenXObject passed to this output must
        #  evaluate as truthy against to write its instance/template values to stdout.
        #  For example, 'filter: this.timestamp' will only emit timestamped objects.
        #  To learn more see: https://doc.log10x.com/api/js/#TenXBaseObject+timestamped
        filter: null
    
        #  This corresponds to the stdin format defined by fluent-bit in:
        #  https://docs.fluentbit.io/manual/pipeline/inputs/standard-input
        #  The 'text' argument below could be replaced by any list of intrinsic/calculated/extracted fields.
        #  The "" delimiter instructs 'joinFields' to produce JSON output.
        fields:  #
          - open="["
          - timestamp=dateFormat("+%s.%N")
          - separator=","
          - fields=joinFields("", "text")
          - close="]"
    ```

=== "Datadog"

    Below is the default configuration from: [fluentbit/datadog.yaml](https://github.dev/log-10x/config/blob/main/pipelines/run/output/event/fluentbit/datadog.yaml "fluentbit/datadog.yaml"){target="\_blank"} (<span class="tenx-tooltip" data-tooltip="The config file below contains required fields to activate this module, marked with &#10071;">** Required Fields*</span>).  
  
    <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/run/output/event/fluentbit/datadog.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-datadog.yaml1-edit-button" data-tooltip="Edit configuration file" data-dialog-id="datadog-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="datadog-yaml1-dialog" class="md-dialog md-dialog--editor">
        <div class="editor-dialog-wrapper">
            <div class="editor-dialog-header">
                <span class="editor-dialog-title">Edit datadog.yaml 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('datadog-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/run/output/event/fluentbit/datadog.yaml"
                                data-copy-nix="/etc/log10x/config/run/output/event/fluentbit/datadog.yaml"
                                data-copy-win="C:\log10x\configs/run/output/event/fluentbit/datadog.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/output/event/fluentbit/datadog.yaml">$TENX_CONFIG/run/output/event/fluentbit/datadog.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/output/event/fluentbit/datadog.yaml">./pipelines/run/output/event/fluentbit/datadog.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">ewogICJ0eXBlIiA6ICJvYmplY3QiLAogICJwcm9wZXJ0aWVzIiA6IHsKICAgICJpbmNsdWRlIiA6IHsKICAgICAgInR5cGUiIDogImFycmF5IiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9LAogICAgInRlbngiIDogewogICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgfSwKICAgICJmbHVlbnRiaXRPdXQiIDogewogICAgICAidHlwZSIgOiAiYXJyYXkiLAogICAgICAiaXRlbXMiIDogewogICAgICAgICJ0eXBlIiA6ICJvYmplY3QiLAogICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZSwKICAgICAgICAicHJvcGVydGllcyIgOiB7CiAgICAgICAgICAiY29tbWFuZCIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkNvbW1hbmQgdG8gbGF1bmNoIEZsdWVudCBCaXRcblxuU3BlY2lmaWVzIHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUgdG8gbGF1bmNoIHRoZSBGbHVlbnQgQml0ICBzdWItcHJvY2Vzcy4iCiAgICAgICAgICB9LAogICAgICAgICAgImlucHV0QXJncyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHNwYXduZWQgRmx1ZW50IEJpdCAgcHJvY2VzcyBzZXR0aW5nIHVwIGlucHV0XG5cbkxpc3Qgb2YgdmFsdWVzIHRvIHBhc3MgYXMgc3RhcnR1cCBhcmd1bWVudHMgdG8gdGhlIHNwYXduZWQgRmx1ZW50IEJpdCAgc3ViLXByb2Nlc3MgaW50ZW5kZWQgdG8gc2V0IHVwIGl0J3Mgc3RkaW4gaW5wdXQuIChEZWZhdWx0OiBbXCItY1wiLFwiJD1wYXRoKFxcXCJmbHVlbnRiaXQtMTB4LWlucHV0LmNvbmZcXFwiKVwiXSkiLAogICAgICAgICAgICAiaXRlbXMiIDogewogICAgICAgICAgICAgICJ0eXBlIiA6ICJzdHJpbmciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkZWZhdWx0IiA6IFsKICAgICAgICAgICAgICAiLWMiLAogICAgICAgICAgICAgICIkPXBhdGgoXCJmbHVlbnRiaXQtMTB4LWlucHV0LmNvbmZcIikiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAib3V0cHV0QXJncyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHNwYXduZWQgRmx1ZW50IEJpdCAgcHJvY2VzcyBzZXR0aW5nIHVwIG91dHB1dFxuXG5MaXN0IG9mIHZhbHVlcyB0byBwYXNzIGFzIHN0YXJ0dXAgYXJndW1lbnRzIHRvIHRoZSBzcGF3bmVkIEZsdWVudCBCaXQgc3ViLXByb2Nlc3MgaW50ZW5kZWQgdG8gc2V0IHVwIGl0J3Mgb3V0cHV0IHBsdWdpbihzKSIsCiAgICAgICAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgICAgICAgInR5cGUiIDogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJsYXp5TGF1bmNoIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJib29sZWFuIiwKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlNldHMgd2hldGhlciB0byBsYXVuY2ggdGhlIHByb2Nlc3Mgb24tZGVtYW5kXG5cbkNvbnRyb2xzIHdoZXRoZXIgdG8gc3Bhd24gdGhlIHRhcmdldCBzdWItcHJvY2VzcyB1cG9uIHRoZSBjcmVhdGlvbiBvZiB0aGUgb3V0cHV0IG9yIG9uLWRlbWFuZC4gSWYgdHJ1ZSwgbGF1bmNoIHRoZSBzdWItcHJvY2VzcyB3aGVuIHRoZSBmaXJzdCBUZW5YT2JqZWN0IGluc3RhbmNlIGlzIHdyaXR0ZW4gdG8gaXRzIHN0ZGluLiAoQWNjZXB0cyBib29sZWFuIG9yIHN0cmluZyB3aXRoICQ9IHByZWZpeCBmb3IgcnVudGltZSBldmFsdWF0aW9uKSIKICAgICAgICAgIH0sCiAgICAgICAgICAic3RhcnR1cCIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6ICJvYmplY3QiLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiIDogZmFsc2UsCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKICAgICAgICAgICAgICAid2FpdCIgOiB7CiAgICAgICAgICAgICAgICAidHlwZSIgOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZSwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKICAgICAgICAgICAgICAgICAgIm1zIiA6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgICAgICAgICAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiV2FpdCB0aW1lIGZvciBwcm9jZXNzIHRvIHN0YXJ0dXBcblxuU2V0cyBhIHN0YXJ0dXAgZGVsYXkgd2FpdCB0aW1lIGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIHByb2Nlc3MgaXMgY29uc2lkZXJlZCBhdmFpbGFibGUgZm9yIGV2ZW50cy4gaWYgcHJvdmlkZWQsIHdpbGwgYWRkIGEgd2FpdCBhcyBwYXJ0IG9mIHN0YXJ0aW5nIHRoZSBwcm9jZXNzIGJlZm9yZSBlbWl0dGluZyBldmVudHMgaW50byBpdC4gbWF4IHZhbHVlIGZvciB0aGlzIGFyZ3VtZW50IGlzIDEwLDAwMCAoaWUgMTAgc2Vjb25kcykuIGlmIFtmbHVlbnRiaXRPdXRTdGFydHVwV2FpdFBhdHRlcm5dKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9mbHVlbnRiaXQvI2ZsdWVudGJpdE91dHN0YXJ0dXB3YWl0cGF0dGVybikgaXMgYWxzbyBwcm92aWRlZCwgdGhlIHByb2Nlc3Mgd2lsbCBiZSBjb25zaWRlcmVkIGEgZmFpbHVyZSBpZiB0aGUgd2FpdCB0aW1lIGhhcyBwYXNzZWQgYmVmb3JlIGEgbGluZSBtYXRjaGluZyBbZmx1ZW50Yml0T3V0U3RhcnR1cFdhaXRQYXR0ZXJuXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRzdGFydHVwd2FpdHBhdHRlcm4pIHdhcyBlbWl0dGVkLiAoQWNjZXB0cyBudW1iZXIgb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiA1MDAwKSIsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiIDogNTAwMAogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAicGF0dGVybiIgOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJXYWl0IGZvciBhbiBvdXRwdXQgZnJvbSB0aGUgcHJvY2VzcyBhdCBzdGFydHVwXG5cblNldHMgYSByZWdleCBwYXR0ZXJuIHRvIHdhaXQgZm9yIHRoZSBwcm9jZXNzIHRvIGVtaXQgZm9yIGl0IHRvIGJlIGNvbnNpZGVyZWQgYXZhaWxhYmxlIGZvciBldmVudHMuIGlmIHByb3ZpZGVkLCB3aWxsIHdhaXQgdW50aWwgdGhlIHByb2Nlc3MgaGFzIGVtaXR0ZWQgYSBsaW5lIHRvIGl0J3Mgb3V0cHV0IHRoYXQgbWF0Y2hlcyB0aGUgcmVnZXggYmVmb3JlIGVtaXR0aW5nIGV2ZW50cyBpbnRvIGl0LiBpZiBbZmx1ZW50Yml0T3V0U3RhcnR1cFdhaXRNc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vb3V0cHV0L2V2ZW50L2ZsdWVudGJpdC8jZmx1ZW50Yml0T3V0U3RhcnR1cFdhaXRNcykgaXMgYWxzbyBwcm92aWRlZCwgd2lsbCBvbmx5IHdhaXQgZm9yIHRoZSBzcGVjaWZpZWQgd2FpdCB0aW1lLCBhZnRlciB3aGljaCBpZiBubyBsaW5lIHdhcyBlbWl0dGVkIHRvIG1hdGNoIHRoZSBwcm92aWRlZCByZWdleCB0aGUgcHJvY2VzcyB3aWxsIGJlIGNvbnNpZGVyZWQgYSBmYWlsdXJlLiAoRGVmYXVsdDogXFxbXFxzKnNwXFxzKl1cXHMrc3RyZWFtXFxzK3Byb2Nlc3NvclxccytzdGFydGVkXFxiKSIsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiIDogIlxcW1xccypzcFxccypdXFxzK3N0cmVhbVxccytwcm9jZXNzb3JcXHMrc3RhcnRlZFxcYiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJkZXN0cm95TW9kZSIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkNvbnRyb2wgaG93IHRvIHRlcm1pbmF0ZSB0aGUgc3ViLXByb2Nlc3Mgb24gb3V0cHV0IGNsb3NlXG5cbkNvbnRyb2xzIGhvdyB0byB0cmVhdCBzcGF3bmVkIHN1Yi1wcm9jZXNzIHdoZW4gdGhpcyBvdXRwdXQgY2xvc2VzLiBQb3NzaWJsZSB2YWx1ZXM6IHwgVmFsdWUgICAgICB8IERlc2NyaXB0aW9uIHwgfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfCB8ICoqZ3JhY2VmdWwqKiAoZGVmYXVsdCkgICB8IFRoZSBzdWItcHJvY2VzcyBpcyBkZXN0cm95ZWQgZ3JhY2VmdWxseSB3aXRoIGEgdGltZW91dCBwZXJpb2Qgb2YgW2ZsdWVudGJpdE91dERlc3Ryb3lXYWl0XShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRkZXN0cm95d2FpdCkuIHwgfCAqKmZvcmNpYmxlKiogICAgICAgICAgICAgfCBUZXJtaW5hdGVzIHRoZSBzdWItcHJvY2VzcyBpbW1lZGlhdGVseS4gfCB8ICoqY2FjaGVkKiogICAgICAgICAgICAgICB8IFRoZSBzdWItcHJvY2VzcyByZW1haW5zIGFsaXZlIGZvciBmdXR1cmUgcGlwZWxpbmVzIHRoYXQgbGF1bmNoIHRoZSBzYW1lIGNvbW1hbmQgYW5kIGFyZ3VtZW50IGNvbWJpbmF0aW9uIHdpdGhpbiB0aGUgaG9zdCBKVk0uIEEgbWF4aW11bSBvZiBbZmx1ZW50Yml0T3V0TWF4Q2FjaGVTaXplXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRtYXhjYWNoZXNpemUpIGNhbiBiZSBrZXB0IGFsaXZlLiBVc2VmdWwgZm9yIGxhdW5jaGluZyBzaGlwcGVycyAoZS5nLiwgRmlsZWJlYXQsIEZsdWVudCBCaXQpIGFjcm9zcyBtdWx0aXBsZSAxMHggcGlwZWxpbmUgcnVucyBpbiBhIGxvbmctbGl2aW5nIHNlcnZlciBlbnZpcm9ubWVudC4gfCAoRGVmYXVsdDogZ3JhY2VmdWwpIiwKICAgICAgICAgICAgImRlZmF1bHQiIDogImdyYWNlZnVsIgogICAgICAgICAgfSwKICAgICAgICAgICJkZXN0cm95V2FpdCIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkR1cmF0aW9uIHRvIHdhaXQgZm9yIHNwYXduZWQgc3ViLXByb2Nlc3MgdG8gdGVybWluYXRlXG5cbkNvbnRyb2xzIHRoZSB0aW1lIGR1cmF0aW9uIHRoYXQgdGhlIG91dHB1dCBzdHJlYW0gd2lsbCB3YWl0IGZvciB0aGUgc3ViLXByb2Nlc3MgdG8gdGVybWluYXRlIGdyYWNlZnVsbHkgKGUuZy4sICc1cycpLiBJZiB0aGUgcHJvY2VzcyB0aW1lb3V0cywgdGhlIG91dHB1dCB3aWxsIGZvcmNpYmx5IHRlcm1pbmF0ZSBpdC4gSWYgc2V0IHRvIDAsIHRoZSBvdXRwdXQgc3RyZWFtIHdpbGwgd2FpdCBpbmRlZmluaXRlbHkgZm9yIHRoZSBzdWItcHJvY2VzcyB0byB0ZXJtaW5hdGUuIFRoaXMgdmFsdWUgb25seSBhcHBsaWVzIHdoZW4gW2ZsdWVudGJpdE91dERlc3Ryb3lNb2RlXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRkZXN0cm95bW9kZSkgaXMgc2V0IHRvIGBncmFjZWZ1bGAuIgogICAgICAgICAgfSwKICAgICAgICAgICJtYXhDYWNoZVNpemUiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgIm51bWJlciIsCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJNYXggbnVtYmVyIG9mIHN1Yi1wcm9jZXNzZXMgdG8ga2VlcCBhbGl2ZSBhY3Jvc3Mgc3Vic2VxdWVudCAxMHggcGlwZWxpbmUgZXhlY3V0aW9uc1xuXG5TZXRzIHRoZSBnbG9iYWwgbWF4aW11bSBudW1iZXIgb2YgcHJvY2Vzc2VzIHRoYXQgY2FuIHJldGFpbmVkIGdsb2JhbGx5IGFjcm9zcyAxMHggcGlwZWxpbmUgZXhlY3V0aW9ucyB3aXRoaW4gdGhlIGhvc3QgSlZNLiBUaGlzIHZhbHVlIGlzIHVzZWZ1bCB3aGVuIGxhdW5jaGluZyBzaGlwcGVycyAoZS5nLiwgRmlsZWJlYXQsIEZsdWVudCBCaXQpIGZvciB1c2UgYWNyb3NzIG11bHRpcGxlIDEweCBwaXBlbGluZSBleGVjdXRpb25zIHdpdGhpbiBhIHNlcnZlciBlbnZpcm9ubWVudC4gVGhpcyB2YWx1ZSBvbmx5IGFwcGxpZXMgd2hlbiBbZmx1ZW50Yml0T3V0RGVzdHJveU1vZGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9mbHVlbnRiaXQvI2ZsdWVudGJpdG91dGRlc3Ryb3ltb2RlKSBpcyBzZXQgdG8gYGNhY2hlZGAuIElmIFtmbHVlbnRiaXRPdXRNYXhDYWNoZVNpemVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9mbHVlbnRiaXQvI2ZsdWVudGJpdG91dG1heGNhY2hlc2l6ZSkgaXMgc2V0IHRvIDAsIG5vIGNhY2hpbmcgaXMgcGVyZm9ybWVkLCBhbmQgc3ViLXByb2Nlc3NlcyBhcmUgZGVzdHJveWVkIGdyYWNlZnVsbHkuIChBY2NlcHRzIG51bWJlciBvciBzdHJpbmcgd2l0aCAkPSBwcmVmaXggZm9yIHJ1bnRpbWUgZXZhbHVhdGlvbikiCiAgICAgICAgICB9LAogICAgICAgICAgImZpZWxkcyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTGlzdCBvZiBUZW5YT2JqZWN0IGZpZWxkIG5hbWVzIHRvIGVuY29kZVxuXG5TcGVjaWZpZXMgYSBsaXN0IG9mIFRlblhPYmplY3QgaW50cmluc2ljL2NhbGN1bGF0ZWQvZXh0cmFjdGVkIGZpZWxkIG5hbWVzIHRvIGV4dHJhY3QgYW5kIHdyaXRlIHRvIHRoZSBvdXRwdXQuIiwKICAgICAgICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgImZpbHRlciIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGFuIFRlblhPYmplY3QgbXVzdCBldmFsdWF0ZSBhcyAndHJ1dGh5JyBhZ2FpbnN0IHRvIGJlIHdyaXR0ZW4gdG8gdGhpcyBvdXRwdXRcblxuU3BlY2lmaWVzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRoYXQgYW4gVGVuWE9iamVjdCBtdXN0IGV2YWx1YXRlIGFzIHRydXRoeSB0byB3cml0ZSBpdHMgaW5zdGFuY2UvdGVtcGxhdGUgZmllbGQgdmFsdWVzIHRvIHRoaXMgb3V0cHV0LiAgRm9yIGV4YW1wbGUsIHRvIG9ubHkgZW1pdCBbdGltZXN0YW1wZWRdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vYXBpL2pzLyNUZW5YQmFzZU9iamVjdCt0aW1lc3RhbXBlZCkgVGVuWE9iamVjdHMsIHNwZWNpZnk6IGBgYCB5YW1sIGZsdWVudGJpdE91dEZpbHRlcjogdGhpcy50aW1lc3RhbXBlZCBgYGAiCiAgICAgICAgICB9LAogICAgICAgICAgIndyaXRlT2JqZWN0cyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJJZiB0cnVlLCBUZW5YT2JqZWN0IGZpZWxkIHZhbHVlcyBzcGVjaWZpZWQgYnkgW2ZsdWVudGJpdE91dEZpZWxkc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vb3V0cHV0L2V2ZW50L2ZsdWVudGJpdC8jZmx1ZW50Yml0b3V0ZmllbGRzKSBhcmUgZW5jb2RlZCB0byB0aGlzIG91dHB1dFxuXG5EZXRlcm1pbmUgd2hldGhlciB0byB3cml0ZSBbZmx1ZW50Yml0T3V0RmllbGRzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRmaWVsZHMpIHZhbHVlcyBvZiBhbiBUZW5YT2JqZWN0IHBhc3NlZCB0byB0aGlzIG91dHB1dC4gVGhpcyBjb25maWd1cmF0aW9uIGlzIHR5cGljYWxseSBkZWZpbmVkIHVzaW5nIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uLiAgVG8gZW5hYmxlL2Rpc2FibGUgdGhlIG91dHB1dCBkZXBlbmRpbmcgb24gd2hldGhlciBhIGxhdW5jaCBhcmd1bWVudCwgZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIEpWTSAtRCBvcHRpb24gZXZhbHVhdGVzIGFzIHRydXRoeSwgdXNlOiBgYGAgeWFtbCAgIGZsdWVudGJpdE91dFdyaXRlT2JqZWN0czogJD1UZW5YRW52LmdldChcIm15UHJvY0NtZFwiKSBgYGAgVG8gbGVhcm4gbW9yZSBzZWUgW1RlblhFbnYuZ2V0XShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWEVudi5nZXQpLiAoRGVmYXVsdDogdHJ1ZSkiLAogICAgICAgICAgICAiZGVmYXVsdCIgOiAidHJ1ZSIKICAgICAgICAgIH0sCiAgICAgICAgICAid3JpdGVUZW1wbGF0ZXMiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgImJvb2xlYW4iLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiSWYgdHJ1ZSwgd3JpdGUgbmV3IFRlblhUZW1wbGF0ZXMgdG8gdGhpcyBvdXRwdXRcblxuQ29udHJvbHMgd2hldGhlciB0byB3cml0ZSB0ZW1wbGF0ZSB2YWx1ZXMgb2YgVGVuWE9iamVjdHMgcGFzc2VkIHRvIHRoaXMgb3V0cHV0LiBUaGUgb3V0cHV0IHdpbGwgb25seSBlbWl0IFRlblhUZW1wbGF0ZXMgdGhhdCB0aGUgcGlwZWxpbmUgZGlkIG5vdCBsb2FkIGF0IHN0YXJ0dXAgdmlhIHRoZVt0ZW1wbGF0ZUZpbGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL3RlbXBsYXRlLyN0ZW1wbGF0ZWZpbGVzKSBhcmd1bWVudCwgYW5kIHdpbGwgb25seSBlbWl0IGFuIFRlblhUZW1wbGF0ZSBvbmNlIGJhc2VkIG9uIGl0cyBbdGVtcGxhdGVIYXNoXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWEJhc2VPYmplY3QrdGVtcGxhdGVIYXNoKSB2YWx1ZS4gKERlZmF1bHQ6IGZhbHNlKSIsCiAgICAgICAgICAgICJkZWZhdWx0IiA6ICJmYWxzZSIKICAgICAgICAgIH0sCiAgICAgICAgICAiZW5jb2RlIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogIm9iamVjdCIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZSwKICAgICAgICAgICAgInByb3BlcnRpZXMiIDogewogICAgICAgICAgICAgICJ0eXBlIiA6IHsKICAgICAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJUaGUgb3V0cHV0IGZvcm1hdCBpbiB3aGljaCB0byBlbmNvZGUgVGVuWE9iamVjdCB2YWx1ZXMuIFBvc3NpYmxlIHZhbHVlczpbanNvbiwgZGVsaW1pdGVkXVxuXG5TcGVjaWZpZXMgaG93IHRvIGVuY29kZSBbZmx1ZW50Yml0T3V0RmllbGRzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRmaWVsZHMpIHZhbHVlcyB0byB0aGlzIG91dHB1dC4gUG9zc2libGUgdmFsdWVzOiAtICoqanNvbioqOiBmb3JtYXRzIG5hbWVzIGFuZCB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IFRlblhPYmplY3QgYXM6IHtcImZpZWxkXCI6XCJzdHJcIixcImZpZWxkMlwiOjEsIFwiZmllbGQzXCI6IHRydWV9IC0gKipkZWxpbWl0ZWQqKjogZm9ybWF0cyB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IFRlblhPYmplY3QgYXM6IFwic3RyXCIsMSx0cnVlICAgIFRoZSBbZmx1ZW50Yml0T3V0RW5jb2RlRGVsaW1pdGVyXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRPdXRlbmNvZGVkZWxpbWl0ZXIpIGFyZ3VtZW50IGRldGVybWluZXMgdGhlIHNlcGFyYXRvciB0byB1c2UuIChEZWZhdWx0OiBkZWxpbWl0ZWQpIiwKICAgICAgICAgICAgICAgICJkZWZhdWx0IiA6ICJkZWxpbWl0ZWQiCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAiZGVsaW1pdGVyIiA6IHsKICAgICAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJUaGUgZGVsaW1pdGVyIHBsYWNlZCBiZXR3ZWVuIGtleSBhbmQgdmFsdWVzIHBhaXJzIGlmICdmbHVlbnRiaXRPdXRFbmNvZGVUeXBlJyBpcyAnZGVsaW1pdGVkJ1xuXG5TZXRzIHRoZSBjaGFyIGRlbGltaXRlciB0byBzZXBhcmF0ZSBUZW5YT2JqZWN0IGZpZWxkIHZhbHVlcyB3aGVuIFtmbHVlbnRiaXRPdXRFbmNvZGVUeXBlXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRlbmNvZGV0eXBlKSBpcyBgZGVsaW1pdGVkYC4gKERlZmF1bHQ6ICApIiwKICAgICAgICAgICAgICAgICJkZWZhdWx0IiA6ICIgIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJlbmNvZGVkTGluZVByZWZpeCIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlRoZSBsaW5lIHByZWZpeCBwcmVwZW5kZWQgdG8gdGhlIGVuY29kZWQgZXZlbnQgaWYgJ2ZsdWVudGJpdE91dEVuY29kZVR5cGUnIGlzICdkZWxpbWl0ZWQnXG5cblNldHMgdGhlIGNoYXIgd2hpY2ggaXMgcHJlcGVuZGVkIHRvIHRoZSBlbWl0dGVkIFRlblhPYmplY3QgZmllbGQgdmFsdWVzIHdoZW4gW2ZsdWVudGJpdE91dEVuY29kZVR5cGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9mbHVlbnRiaXQvI2ZsdWVudGJpdG91dGVuY29kZXR5cGUpIGlzIGBkZWxpbWl0ZWRgLiAoRGVmYXVsdDogKSIsCiAgICAgICAgICAgICJkZWZhdWx0IiA6ICIiCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicmVxdWlyZWQiIDogWwogICAgICAgICAgImNvbW1hbmQiCiAgICAgICAgXQogICAgICB9CiAgICB9CiAgfSwKICAiYWRkaXRpb25hbFByb3BlcnRpZXMiIDogdHJ1ZQp9</template>

    ```yaml
    # 🔟❎ 'run' Fluent Bit output configuration for events stream output to Datadog
    
    # Launch a Fluent Bit process into whose stdin pipe to write TenXObjects field values and TenXTemplates
    # To learn more see http://doc.log10x.com/run/output/event/process/
    
    # Set the 10x pipeline to 'run'
    tenx: run
    
    # =============================== Dependencies ================================
    
    include:
      - run/modules/output/event/fluentbit
    
    
    # ============================ Fluent Bit Options =============================
    
    # Multiple Fluent Bit outputs can be defined below
    
    fluentbitOut:
    
        # ------------------------------ General ----------------------------------
    
        # 'writeObjects' controls whether to write TenXObject field values to output.
      - writeObjects: true
    
        # 'writeTemplates' controls whether to write new template for TenXObjects written to
        #  this output. To learn more about TenXTemplates, see: http://doc.log10x.com/run/template
        writeTemplates: false
    
        # ------------------------------ Process ----------------------------------
    
        # 'command' specifies the command to execute to launch the Fluent Bit sub-process.
        command: /opt/fluent-bit/bin/fluent-bit
    
        # 'inputArgs' specifies list of values to pass as startup arguments to the spawned Fluent Bit sub-process
        inputArgs:
          # Sets the Fluent Bit input to read from stdin and route TenXTemplates
          # See https://github.com/log-10x/config/blob/main/pipelines/run/output/event/fluentbit/fluentbit-10x-input.conf
          - -c
          - $=path("fluentbit-10x-input.conf")
    
        # Setting the Fluent Bit output to Datadog
        # for full config options of the Fluent Bit datadog plugin, see -
        # https://docs.fluentbit.io/manual/pipeline/outputs/datadog
        #
        # Authentication requires the DD_API_KEY environment variable.
        # Set DD_SITE to your Datadog region (default: datadoghq.com).
        #
        outputArgs:
          ############### Events output ###############
    
          # Set event output to Datadog
          - "-o"
          - "datadog"
          - "-m"
          - "input"
    
          # Setting API key
          - "-p"
          - "$=\"apikey=\" + TenXEnv.get(\"DD_API_KEY\")" # (❗ REQUIRED)
    
          # Setting intake host (derived from DD_SITE, e.g. datadoghq.com, datadoghq.eu, us5.datadoghq.com)
          - "-p"
          - "$=\"Host=http-intake.logs.\" + TenXEnv.get(\"DD_SITE\", \"datadoghq.com\")"
    
          # TLS and compression
          - "-p"
          - "TLS=on"
          - "-p"
          - "compress=gzip"
    
          # Source and tag metadata
          - "-p"
          - "dd_source=log10x"
          - "-p"
          - "$=\"dd_tags=\" + TenXEnv.get(\"DD_TAGS\", \"\")"
    
          # Use 'text' field as the message body
          - "-p"
          - "dd_message_key=text"
    
          # Flush every second
          - "-f"
          - "1"
    
          ############### Templates output ###############
    
          # Set templates output to Datadog
          - "-o"
          - "datadog"
          - "-m"
          - "templates"
    
          # Setting API key
          - "-p"
          - "$=\"apikey=\" + TenXEnv.get(\"DD_API_KEY\")" # (❗ REQUIRED)
    
          # Setting intake host
          - "-p"
          - "$=\"Host=http-intake.logs.\" + TenXEnv.get(\"DD_SITE\", \"datadoghq.com\")"
    
          # TLS and compression
          - "-p"
          - "TLS=on"
          - "-p"
          - "compress=gzip"
    
          # Source and tag metadata for templates
          - "-p"
          - "dd_source=log10x-templates"
          - "-p"
          - "$=\"dd_tags=\" + TenXEnv.get(\"DD_TAGS\", \"\")"
    
          # Flush every second
          - "-f"
          - "1"
    
        # 'destroyMode' is set to 'cached' to allow a fluent-bit sub-process to
        #  to be reused across multiple 10x pipeline executions within a host JVM.
        destroyMode: cached
    
        # 'maxCacheSize' sets the size of the cache to used for caching fluent-bit instances
        maxCacheSize: 1
    
        # 'lazyLaunch' determines whether the fluent-bit instance will launch immediately
        # during the pipeline initialization, or only on-demand.
        lazyLaunch: true
    
        # ------------------------------ Encoding ---------------------------------
    
        # 'filter' specifies an expression that any TenXObject passed to this output must
        #  evaluate as truthy against to write its instance/template values to stdout.
        #  For example, 'filter: this.timestamp' will only emit timestamped objects.
        #  To learn more see: http://doc.log10x.com/api/js/#TenXBaseObject+timestamped
        filter: null
    
        #  This corresponds to the stdin format defined by fluent-bit in:
        #  https://docs.fluentbit.io/manual/pipeline/inputs/standard-input
        #  The 'text' argument below could be replaced by any list of intrinsic/calculated/extracted fields.
        #  The "" delimiter instructs 'joinFields' to produce JSON output.
        fields:  #
          - open="["
          - timestamp=dateFormat("+%s.%N")
          - separator=","
          - fields=joinFields("", "text")
          - close="]"
    ```

=== "Elasticsearch"

    Below is the default configuration from: [fluentbit/elasticsearch.yaml](https://github.dev/log-10x/config/blob/main/pipelines/run/output/event/fluentbit/elasticsearch.yaml "fluentbit/elasticsearch.yaml"){target="\_blank"} (<span class="tenx-tooltip" data-tooltip="The config file below contains required fields to activate this module, marked with &#10071;">** Required Fields*</span>).  
  
    <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/run/output/event/fluentbit/elasticsearch.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-elasticsearch.yaml2-edit-button" data-tooltip="Edit configuration file" data-dialog-id="elasticsearch-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="elasticsearch-yaml2-dialog" class="md-dialog md-dialog--editor">
        <div class="editor-dialog-wrapper">
            <div class="editor-dialog-header">
                <span class="editor-dialog-title">Edit elasticsearch.yaml 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('elasticsearch-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/output/event/fluentbit/elasticsearch.yaml"
                                data-copy-nix="/etc/log10x/config/run/output/event/fluentbit/elasticsearch.yaml"
                                data-copy-win="C:\log10x\configs/run/output/event/fluentbit/elasticsearch.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/output/event/fluentbit/elasticsearch.yaml">$TENX_CONFIG/run/output/event/fluentbit/elasticsearch.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/output/event/fluentbit/elasticsearch.yaml">./pipelines/run/output/event/fluentbit/elasticsearch.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">ewogICJ0eXBlIiA6ICJvYmplY3QiLAogICJwcm9wZXJ0aWVzIiA6IHsKICAgICJpbmNsdWRlIiA6IHsKICAgICAgInR5cGUiIDogImFycmF5IiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9LAogICAgInRlbngiIDogewogICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgfSwKICAgICJmbHVlbnRiaXRPdXQiIDogewogICAgICAidHlwZSIgOiAiYXJyYXkiLAogICAgICAiaXRlbXMiIDogewogICAgICAgICJ0eXBlIiA6ICJvYmplY3QiLAogICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZSwKICAgICAgICAicHJvcGVydGllcyIgOiB7CiAgICAgICAgICAiY29tbWFuZCIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkNvbW1hbmQgdG8gbGF1bmNoIEZsdWVudCBCaXRcblxuU3BlY2lmaWVzIHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUgdG8gbGF1bmNoIHRoZSBGbHVlbnQgQml0ICBzdWItcHJvY2Vzcy4iCiAgICAgICAgICB9LAogICAgICAgICAgImlucHV0QXJncyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHNwYXduZWQgRmx1ZW50IEJpdCAgcHJvY2VzcyBzZXR0aW5nIHVwIGlucHV0XG5cbkxpc3Qgb2YgdmFsdWVzIHRvIHBhc3MgYXMgc3RhcnR1cCBhcmd1bWVudHMgdG8gdGhlIHNwYXduZWQgRmx1ZW50IEJpdCAgc3ViLXByb2Nlc3MgaW50ZW5kZWQgdG8gc2V0IHVwIGl0J3Mgc3RkaW4gaW5wdXQuIChEZWZhdWx0OiBbXCItY1wiLFwiJD1wYXRoKFxcXCJmbHVlbnRiaXQtMTB4LWlucHV0LmNvbmZcXFwiKVwiXSkiLAogICAgICAgICAgICAiaXRlbXMiIDogewogICAgICAgICAgICAgICJ0eXBlIiA6ICJzdHJpbmciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkZWZhdWx0IiA6IFsKICAgICAgICAgICAgICAiLWMiLAogICAgICAgICAgICAgICIkPXBhdGgoXCJmbHVlbnRiaXQtMTB4LWlucHV0LmNvbmZcIikiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAib3V0cHV0QXJncyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHNwYXduZWQgRmx1ZW50IEJpdCAgcHJvY2VzcyBzZXR0aW5nIHVwIG91dHB1dFxuXG5MaXN0IG9mIHZhbHVlcyB0byBwYXNzIGFzIHN0YXJ0dXAgYXJndW1lbnRzIHRvIHRoZSBzcGF3bmVkIEZsdWVudCBCaXQgc3ViLXByb2Nlc3MgaW50ZW5kZWQgdG8gc2V0IHVwIGl0J3Mgb3V0cHV0IHBsdWdpbihzKSIsCiAgICAgICAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgICAgICAgInR5cGUiIDogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJsYXp5TGF1bmNoIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJib29sZWFuIiwKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlNldHMgd2hldGhlciB0byBsYXVuY2ggdGhlIHByb2Nlc3Mgb24tZGVtYW5kXG5cbkNvbnRyb2xzIHdoZXRoZXIgdG8gc3Bhd24gdGhlIHRhcmdldCBzdWItcHJvY2VzcyB1cG9uIHRoZSBjcmVhdGlvbiBvZiB0aGUgb3V0cHV0IG9yIG9uLWRlbWFuZC4gSWYgdHJ1ZSwgbGF1bmNoIHRoZSBzdWItcHJvY2VzcyB3aGVuIHRoZSBmaXJzdCBUZW5YT2JqZWN0IGluc3RhbmNlIGlzIHdyaXR0ZW4gdG8gaXRzIHN0ZGluLiAoQWNjZXB0cyBib29sZWFuIG9yIHN0cmluZyB3aXRoICQ9IHByZWZpeCBmb3IgcnVudGltZSBldmFsdWF0aW9uKSIKICAgICAgICAgIH0sCiAgICAgICAgICAic3RhcnR1cCIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6ICJvYmplY3QiLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiIDogZmFsc2UsCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKICAgICAgICAgICAgICAid2FpdCIgOiB7CiAgICAgICAgICAgICAgICAidHlwZSIgOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZSwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKICAgICAgICAgICAgICAgICAgIm1zIiA6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgICAgICAgICAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiV2FpdCB0aW1lIGZvciBwcm9jZXNzIHRvIHN0YXJ0dXBcblxuU2V0cyBhIHN0YXJ0dXAgZGVsYXkgd2FpdCB0aW1lIGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIHByb2Nlc3MgaXMgY29uc2lkZXJlZCBhdmFpbGFibGUgZm9yIGV2ZW50cy4gaWYgcHJvdmlkZWQsIHdpbGwgYWRkIGEgd2FpdCBhcyBwYXJ0IG9mIHN0YXJ0aW5nIHRoZSBwcm9jZXNzIGJlZm9yZSBlbWl0dGluZyBldmVudHMgaW50byBpdC4gbWF4IHZhbHVlIGZvciB0aGlzIGFyZ3VtZW50IGlzIDEwLDAwMCAoaWUgMTAgc2Vjb25kcykuIGlmIFtmbHVlbnRiaXRPdXRTdGFydHVwV2FpdFBhdHRlcm5dKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9mbHVlbnRiaXQvI2ZsdWVudGJpdE91dHN0YXJ0dXB3YWl0cGF0dGVybikgaXMgYWxzbyBwcm92aWRlZCwgdGhlIHByb2Nlc3Mgd2lsbCBiZSBjb25zaWRlcmVkIGEgZmFpbHVyZSBpZiB0aGUgd2FpdCB0aW1lIGhhcyBwYXNzZWQgYmVmb3JlIGEgbGluZSBtYXRjaGluZyBbZmx1ZW50Yml0T3V0U3RhcnR1cFdhaXRQYXR0ZXJuXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRzdGFydHVwd2FpdHBhdHRlcm4pIHdhcyBlbWl0dGVkLiAoQWNjZXB0cyBudW1iZXIgb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiA1MDAwKSIsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiIDogNTAwMAogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAicGF0dGVybiIgOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJXYWl0IGZvciBhbiBvdXRwdXQgZnJvbSB0aGUgcHJvY2VzcyBhdCBzdGFydHVwXG5cblNldHMgYSByZWdleCBwYXR0ZXJuIHRvIHdhaXQgZm9yIHRoZSBwcm9jZXNzIHRvIGVtaXQgZm9yIGl0IHRvIGJlIGNvbnNpZGVyZWQgYXZhaWxhYmxlIGZvciBldmVudHMuIGlmIHByb3ZpZGVkLCB3aWxsIHdhaXQgdW50aWwgdGhlIHByb2Nlc3MgaGFzIGVtaXR0ZWQgYSBsaW5lIHRvIGl0J3Mgb3V0cHV0IHRoYXQgbWF0Y2hlcyB0aGUgcmVnZXggYmVmb3JlIGVtaXR0aW5nIGV2ZW50cyBpbnRvIGl0LiBpZiBbZmx1ZW50Yml0T3V0U3RhcnR1cFdhaXRNc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vb3V0cHV0L2V2ZW50L2ZsdWVudGJpdC8jZmx1ZW50Yml0T3V0U3RhcnR1cFdhaXRNcykgaXMgYWxzbyBwcm92aWRlZCwgd2lsbCBvbmx5IHdhaXQgZm9yIHRoZSBzcGVjaWZpZWQgd2FpdCB0aW1lLCBhZnRlciB3aGljaCBpZiBubyBsaW5lIHdhcyBlbWl0dGVkIHRvIG1hdGNoIHRoZSBwcm92aWRlZCByZWdleCB0aGUgcHJvY2VzcyB3aWxsIGJlIGNvbnNpZGVyZWQgYSBmYWlsdXJlLiAoRGVmYXVsdDogXFxbXFxzKnNwXFxzKl1cXHMrc3RyZWFtXFxzK3Byb2Nlc3NvclxccytzdGFydGVkXFxiKSIsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiIDogIlxcW1xccypzcFxccypdXFxzK3N0cmVhbVxccytwcm9jZXNzb3JcXHMrc3RhcnRlZFxcYiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJkZXN0cm95TW9kZSIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkNvbnRyb2wgaG93IHRvIHRlcm1pbmF0ZSB0aGUgc3ViLXByb2Nlc3Mgb24gb3V0cHV0IGNsb3NlXG5cbkNvbnRyb2xzIGhvdyB0byB0cmVhdCBzcGF3bmVkIHN1Yi1wcm9jZXNzIHdoZW4gdGhpcyBvdXRwdXQgY2xvc2VzLiBQb3NzaWJsZSB2YWx1ZXM6IHwgVmFsdWUgICAgICB8IERlc2NyaXB0aW9uIHwgfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfCB8ICoqZ3JhY2VmdWwqKiAoZGVmYXVsdCkgICB8IFRoZSBzdWItcHJvY2VzcyBpcyBkZXN0cm95ZWQgZ3JhY2VmdWxseSB3aXRoIGEgdGltZW91dCBwZXJpb2Qgb2YgW2ZsdWVudGJpdE91dERlc3Ryb3lXYWl0XShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRkZXN0cm95d2FpdCkuIHwgfCAqKmZvcmNpYmxlKiogICAgICAgICAgICAgfCBUZXJtaW5hdGVzIHRoZSBzdWItcHJvY2VzcyBpbW1lZGlhdGVseS4gfCB8ICoqY2FjaGVkKiogICAgICAgICAgICAgICB8IFRoZSBzdWItcHJvY2VzcyByZW1haW5zIGFsaXZlIGZvciBmdXR1cmUgcGlwZWxpbmVzIHRoYXQgbGF1bmNoIHRoZSBzYW1lIGNvbW1hbmQgYW5kIGFyZ3VtZW50IGNvbWJpbmF0aW9uIHdpdGhpbiB0aGUgaG9zdCBKVk0uIEEgbWF4aW11bSBvZiBbZmx1ZW50Yml0T3V0TWF4Q2FjaGVTaXplXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRtYXhjYWNoZXNpemUpIGNhbiBiZSBrZXB0IGFsaXZlLiBVc2VmdWwgZm9yIGxhdW5jaGluZyBzaGlwcGVycyAoZS5nLiwgRmlsZWJlYXQsIEZsdWVudCBCaXQpIGFjcm9zcyBtdWx0aXBsZSAxMHggcGlwZWxpbmUgcnVucyBpbiBhIGxvbmctbGl2aW5nIHNlcnZlciBlbnZpcm9ubWVudC4gfCAoRGVmYXVsdDogZ3JhY2VmdWwpIiwKICAgICAgICAgICAgImRlZmF1bHQiIDogImdyYWNlZnVsIgogICAgICAgICAgfSwKICAgICAgICAgICJkZXN0cm95V2FpdCIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkR1cmF0aW9uIHRvIHdhaXQgZm9yIHNwYXduZWQgc3ViLXByb2Nlc3MgdG8gdGVybWluYXRlXG5cbkNvbnRyb2xzIHRoZSB0aW1lIGR1cmF0aW9uIHRoYXQgdGhlIG91dHB1dCBzdHJlYW0gd2lsbCB3YWl0IGZvciB0aGUgc3ViLXByb2Nlc3MgdG8gdGVybWluYXRlIGdyYWNlZnVsbHkgKGUuZy4sICc1cycpLiBJZiB0aGUgcHJvY2VzcyB0aW1lb3V0cywgdGhlIG91dHB1dCB3aWxsIGZvcmNpYmx5IHRlcm1pbmF0ZSBpdC4gSWYgc2V0IHRvIDAsIHRoZSBvdXRwdXQgc3RyZWFtIHdpbGwgd2FpdCBpbmRlZmluaXRlbHkgZm9yIHRoZSBzdWItcHJvY2VzcyB0byB0ZXJtaW5hdGUuIFRoaXMgdmFsdWUgb25seSBhcHBsaWVzIHdoZW4gW2ZsdWVudGJpdE91dERlc3Ryb3lNb2RlXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRkZXN0cm95bW9kZSkgaXMgc2V0IHRvIGBncmFjZWZ1bGAuIgogICAgICAgICAgfSwKICAgICAgICAgICJtYXhDYWNoZVNpemUiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgIm51bWJlciIsCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJNYXggbnVtYmVyIG9mIHN1Yi1wcm9jZXNzZXMgdG8ga2VlcCBhbGl2ZSBhY3Jvc3Mgc3Vic2VxdWVudCAxMHggcGlwZWxpbmUgZXhlY3V0aW9uc1xuXG5TZXRzIHRoZSBnbG9iYWwgbWF4aW11bSBudW1iZXIgb2YgcHJvY2Vzc2VzIHRoYXQgY2FuIHJldGFpbmVkIGdsb2JhbGx5IGFjcm9zcyAxMHggcGlwZWxpbmUgZXhlY3V0aW9ucyB3aXRoaW4gdGhlIGhvc3QgSlZNLiBUaGlzIHZhbHVlIGlzIHVzZWZ1bCB3aGVuIGxhdW5jaGluZyBzaGlwcGVycyAoZS5nLiwgRmlsZWJlYXQsIEZsdWVudCBCaXQpIGZvciB1c2UgYWNyb3NzIG11bHRpcGxlIDEweCBwaXBlbGluZSBleGVjdXRpb25zIHdpdGhpbiBhIHNlcnZlciBlbnZpcm9ubWVudC4gVGhpcyB2YWx1ZSBvbmx5IGFwcGxpZXMgd2hlbiBbZmx1ZW50Yml0T3V0RGVzdHJveU1vZGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9mbHVlbnRiaXQvI2ZsdWVudGJpdG91dGRlc3Ryb3ltb2RlKSBpcyBzZXQgdG8gYGNhY2hlZGAuIElmIFtmbHVlbnRiaXRPdXRNYXhDYWNoZVNpemVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9mbHVlbnRiaXQvI2ZsdWVudGJpdG91dG1heGNhY2hlc2l6ZSkgaXMgc2V0IHRvIDAsIG5vIGNhY2hpbmcgaXMgcGVyZm9ybWVkLCBhbmQgc3ViLXByb2Nlc3NlcyBhcmUgZGVzdHJveWVkIGdyYWNlZnVsbHkuIChBY2NlcHRzIG51bWJlciBvciBzdHJpbmcgd2l0aCAkPSBwcmVmaXggZm9yIHJ1bnRpbWUgZXZhbHVhdGlvbikiCiAgICAgICAgICB9LAogICAgICAgICAgImZpZWxkcyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTGlzdCBvZiBUZW5YT2JqZWN0IGZpZWxkIG5hbWVzIHRvIGVuY29kZVxuXG5TcGVjaWZpZXMgYSBsaXN0IG9mIFRlblhPYmplY3QgaW50cmluc2ljL2NhbGN1bGF0ZWQvZXh0cmFjdGVkIGZpZWxkIG5hbWVzIHRvIGV4dHJhY3QgYW5kIHdyaXRlIHRvIHRoZSBvdXRwdXQuIiwKICAgICAgICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgImZpbHRlciIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGFuIFRlblhPYmplY3QgbXVzdCBldmFsdWF0ZSBhcyAndHJ1dGh5JyBhZ2FpbnN0IHRvIGJlIHdyaXR0ZW4gdG8gdGhpcyBvdXRwdXRcblxuU3BlY2lmaWVzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRoYXQgYW4gVGVuWE9iamVjdCBtdXN0IGV2YWx1YXRlIGFzIHRydXRoeSB0byB3cml0ZSBpdHMgaW5zdGFuY2UvdGVtcGxhdGUgZmllbGQgdmFsdWVzIHRvIHRoaXMgb3V0cHV0LiAgRm9yIGV4YW1wbGUsIHRvIG9ubHkgZW1pdCBbdGltZXN0YW1wZWRdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vYXBpL2pzLyNUZW5YQmFzZU9iamVjdCt0aW1lc3RhbXBlZCkgVGVuWE9iamVjdHMsIHNwZWNpZnk6IGBgYCB5YW1sIGZsdWVudGJpdE91dEZpbHRlcjogdGhpcy50aW1lc3RhbXBlZCBgYGAiCiAgICAgICAgICB9LAogICAgICAgICAgIndyaXRlT2JqZWN0cyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJJZiB0cnVlLCBUZW5YT2JqZWN0IGZpZWxkIHZhbHVlcyBzcGVjaWZpZWQgYnkgW2ZsdWVudGJpdE91dEZpZWxkc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vb3V0cHV0L2V2ZW50L2ZsdWVudGJpdC8jZmx1ZW50Yml0b3V0ZmllbGRzKSBhcmUgZW5jb2RlZCB0byB0aGlzIG91dHB1dFxuXG5EZXRlcm1pbmUgd2hldGhlciB0byB3cml0ZSBbZmx1ZW50Yml0T3V0RmllbGRzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRmaWVsZHMpIHZhbHVlcyBvZiBhbiBUZW5YT2JqZWN0IHBhc3NlZCB0byB0aGlzIG91dHB1dC4gVGhpcyBjb25maWd1cmF0aW9uIGlzIHR5cGljYWxseSBkZWZpbmVkIHVzaW5nIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uLiAgVG8gZW5hYmxlL2Rpc2FibGUgdGhlIG91dHB1dCBkZXBlbmRpbmcgb24gd2hldGhlciBhIGxhdW5jaCBhcmd1bWVudCwgZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIEpWTSAtRCBvcHRpb24gZXZhbHVhdGVzIGFzIHRydXRoeSwgdXNlOiBgYGAgeWFtbCAgIGZsdWVudGJpdE91dFdyaXRlT2JqZWN0czogJD1UZW5YRW52LmdldChcIm15UHJvY0NtZFwiKSBgYGAgVG8gbGVhcm4gbW9yZSBzZWUgW1RlblhFbnYuZ2V0XShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWEVudi5nZXQpLiAoRGVmYXVsdDogdHJ1ZSkiLAogICAgICAgICAgICAiZGVmYXVsdCIgOiAidHJ1ZSIKICAgICAgICAgIH0sCiAgICAgICAgICAid3JpdGVUZW1wbGF0ZXMiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgImJvb2xlYW4iLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiSWYgdHJ1ZSwgd3JpdGUgbmV3IFRlblhUZW1wbGF0ZXMgdG8gdGhpcyBvdXRwdXRcblxuQ29udHJvbHMgd2hldGhlciB0byB3cml0ZSB0ZW1wbGF0ZSB2YWx1ZXMgb2YgVGVuWE9iamVjdHMgcGFzc2VkIHRvIHRoaXMgb3V0cHV0LiBUaGUgb3V0cHV0IHdpbGwgb25seSBlbWl0IFRlblhUZW1wbGF0ZXMgdGhhdCB0aGUgcGlwZWxpbmUgZGlkIG5vdCBsb2FkIGF0IHN0YXJ0dXAgdmlhIHRoZVt0ZW1wbGF0ZUZpbGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL3RlbXBsYXRlLyN0ZW1wbGF0ZWZpbGVzKSBhcmd1bWVudCwgYW5kIHdpbGwgb25seSBlbWl0IGFuIFRlblhUZW1wbGF0ZSBvbmNlIGJhc2VkIG9uIGl0cyBbdGVtcGxhdGVIYXNoXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWEJhc2VPYmplY3QrdGVtcGxhdGVIYXNoKSB2YWx1ZS4gKERlZmF1bHQ6IGZhbHNlKSIsCiAgICAgICAgICAgICJkZWZhdWx0IiA6ICJmYWxzZSIKICAgICAgICAgIH0sCiAgICAgICAgICAiZW5jb2RlIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogIm9iamVjdCIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZSwKICAgICAgICAgICAgInByb3BlcnRpZXMiIDogewogICAgICAgICAgICAgICJ0eXBlIiA6IHsKICAgICAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJUaGUgb3V0cHV0IGZvcm1hdCBpbiB3aGljaCB0byBlbmNvZGUgVGVuWE9iamVjdCB2YWx1ZXMuIFBvc3NpYmxlIHZhbHVlczpbanNvbiwgZGVsaW1pdGVkXVxuXG5TcGVjaWZpZXMgaG93IHRvIGVuY29kZSBbZmx1ZW50Yml0T3V0RmllbGRzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRmaWVsZHMpIHZhbHVlcyB0byB0aGlzIG91dHB1dC4gUG9zc2libGUgdmFsdWVzOiAtICoqanNvbioqOiBmb3JtYXRzIG5hbWVzIGFuZCB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IFRlblhPYmplY3QgYXM6IHtcImZpZWxkXCI6XCJzdHJcIixcImZpZWxkMlwiOjEsIFwiZmllbGQzXCI6IHRydWV9IC0gKipkZWxpbWl0ZWQqKjogZm9ybWF0cyB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IFRlblhPYmplY3QgYXM6IFwic3RyXCIsMSx0cnVlICAgIFRoZSBbZmx1ZW50Yml0T3V0RW5jb2RlRGVsaW1pdGVyXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRPdXRlbmNvZGVkZWxpbWl0ZXIpIGFyZ3VtZW50IGRldGVybWluZXMgdGhlIHNlcGFyYXRvciB0byB1c2UuIChEZWZhdWx0OiBkZWxpbWl0ZWQpIiwKICAgICAgICAgICAgICAgICJkZWZhdWx0IiA6ICJkZWxpbWl0ZWQiCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAiZGVsaW1pdGVyIiA6IHsKICAgICAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJUaGUgZGVsaW1pdGVyIHBsYWNlZCBiZXR3ZWVuIGtleSBhbmQgdmFsdWVzIHBhaXJzIGlmICdmbHVlbnRiaXRPdXRFbmNvZGVUeXBlJyBpcyAnZGVsaW1pdGVkJ1xuXG5TZXRzIHRoZSBjaGFyIGRlbGltaXRlciB0byBzZXBhcmF0ZSBUZW5YT2JqZWN0IGZpZWxkIHZhbHVlcyB3aGVuIFtmbHVlbnRiaXRPdXRFbmNvZGVUeXBlXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRlbmNvZGV0eXBlKSBpcyBgZGVsaW1pdGVkYC4gKERlZmF1bHQ6ICApIiwKICAgICAgICAgICAgICAgICJkZWZhdWx0IiA6ICIgIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJlbmNvZGVkTGluZVByZWZpeCIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlRoZSBsaW5lIHByZWZpeCBwcmVwZW5kZWQgdG8gdGhlIGVuY29kZWQgZXZlbnQgaWYgJ2ZsdWVudGJpdE91dEVuY29kZVR5cGUnIGlzICdkZWxpbWl0ZWQnXG5cblNldHMgdGhlIGNoYXIgd2hpY2ggaXMgcHJlcGVuZGVkIHRvIHRoZSBlbWl0dGVkIFRlblhPYmplY3QgZmllbGQgdmFsdWVzIHdoZW4gW2ZsdWVudGJpdE91dEVuY29kZVR5cGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9mbHVlbnRiaXQvI2ZsdWVudGJpdG91dGVuY29kZXR5cGUpIGlzIGBkZWxpbWl0ZWRgLiAoRGVmYXVsdDogKSIsCiAgICAgICAgICAgICJkZWZhdWx0IiA6ICIiCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicmVxdWlyZWQiIDogWwogICAgICAgICAgImNvbW1hbmQiCiAgICAgICAgXQogICAgICB9CiAgICB9CiAgfSwKICAiYWRkaXRpb25hbFByb3BlcnRpZXMiIDogdHJ1ZQp9</template>

    ```yaml
    # 🔟❎ 'run' Fluent Bit output configuration for events stream output to Elasticsearch
    
    # Launch a Fluent Bit process into whose stdin pipe to write TenXObjects field values and TenXTemplates
    # To learn more see https://doc.log10x.com/run/output/event/process/
    
    # Set the 10x pipeline to 'run'
    tenx: run
    
    # =============================== Dependencies ================================
    
    include:
      - run/modules/output/event/fluentbit
    
    
    # ============================ Fluent Bit Options =============================
    
    # Multiple Fluent Bit outputs can be defined below
    
    fluentbitOut:
    
        # ------------------------------ General ----------------------------------
    
        # 'writeObjects' controls whether to write TenXObject field values to output.
      - writeObjects: true
    
        # 'writeTemplates' controls whether to write new template for TenXObjects written to
        #  this output. To learn more about TenXTemplates, see: https://doc.log10x.com/run/template
        writeTemplates: false
    
        # ------------------------------ Process ----------------------------------
    
        # 'command' specifies the command to execute to launch the Fluent Bit sub-process.
        command: /opt/fluent-bit/bin/fluent-bit
    
        # 'inputArgs' specifies list of values to pass as startup arguments to the spawned Fluent Bit sub-process
        inputArgs:
          # Sets the Fluent Bit input to read from stdin and route TenXTemplates
          # See https://github.com/log-10x/config/blob/main/pipelines/run/output/event/fluentbit/fluentbit-10x-input.conf
          - -c
          - $=path("fluentbit-10x-input.conf")
    
        # Setting the Fluent Bit output to Elasticsearch
        # for full config options of the Fluent Bit elasticsearch plugin, see -
        # https://docs.fluentbit.io/manual/pipeline/outputs/elasticsearch
        #
        outputArgs:
    
          ############### Events output ###############
    
          # Set event output to Elasticsearch
          - "-o"
          - "es"
          - "-m"
          - "input"
    
          # Setting host
          - "-p"
          - "$=\"host=\" + TenXEnv.get(\"ELASTICSEARCH_HOST\", \"elasticsearch-master\")" # (❗ REQUIRED)
          - "-p"
          - "$=\"port=\" + TenXEnv.get(\"ELASTICSEARCH_PORT\", \"9200\")" # (❗ REQUIRED)
    
          # Setting up credentials
          - "-p"
          - "$=\"HTTP_User=\" + TenXEnv.get(\"ELASTICSEARCH_USERNAME\", \"elastic\")" # (❗ REQUIRED)
          - "-p"
          - "$=\"HTTP_Passwd=\" + TenXEnv.get(\"ELASTICSEARCH_PASSWORD\")" # (❗ REQUIRED)
    
          # Setting the index destination
          - "-p"
          - "Logstash_Format=On"
    
          # Config retry
          - "-p"
          - "retry_limit=False"
    
          # Support for removal of types from elasticsearch
          - "-p"
          - "Suppress_Type_Name=On"
    
          ############### Templates output ###############
    
          # Set templates output to Elasticsearch
          - "-o"
          - "es"
          - "-m"
          - "templates"
    
          # Setting host
          - "-p"
          - "$=\"host=\" + TenXEnv.get(\"ELASTICSEARCH_HOST\", \"elasticsearch-master\")" # (❗ REQUIRED)
          - "-p"
          - "$=\"port=\" + TenXEnv.get(\"ELASTICSEARCH_PORT\", \"9200\")" # (❗ REQUIRED)
    
          # Setting up credentials
          - "-p"
          - "$=\"HTTP_User=\" + TenXEnv.get(\"ELASTICSEARCH_USERNAME\", \"elastic\")" # (❗ REQUIRED)
          - "-p"
          - "$=\"HTTP_Passwd=\" + TenXEnv.get(\"ELASTICSEARCH_PASSWORD\")" # (❗ REQUIRED)
    
          # Setting the templates index destination
          - "-p"
          - "index=l1es_dml"
          - "-p"
          - "id_key=templateHash"
    
          # Config retry
          - "-p"
          - "retry_limit=False"
    
          # Support for removal of types from elasticsearch
          - "-p"
          - "Suppress_Type_Name=On"
    
        # 'destroyMode' is set to 'cached' to allow a fluent-bit sub-process to
        #  to be reused across multiple 10x pipeline executions within a host JVM.
        destroyMode: cached
    
        # 'maxCacheSize' sets the size of the cache to used for caching fluent-bit instances
        maxCacheSize: 1
    
        # 'lazyLaunch' determines whether the fluent-bit instance will launch immediately
        # during the pipeline initialization, or only on-demand.
        lazyLaunch: true
    
        # ------------------------------ Encoding ---------------------------------
    
        # 'filter' specifies an expression that any TenXObject passed to this output must
        #  evaluate as truthy against to write its instance/template values to stdout.
        #  For example, 'filter: this.timestamp' will only emit timestamped objects.
        #  To learn more see: https://doc.log10x.com/api/js/#TenXBaseObject+timestamped
        filter: null
    
        #  This corresponds to the stdin format defined by fluent-bit in:
        #  https://docs.fluentbit.io/manual/pipeline/inputs/standard-input
        #  The 'text' argument below could be replaced by any list of intrinsic/calculated/extracted fields.
        #  The "" delimiter instructs 'joinFields' to produce JSON output.
        fields:  #
          - open="["
          - timestamp=dateFormat("+%s.%N")
          - separator=","
          - fields=joinFields("", "text")
          - close="]"
    ```

=== "Splunk"

    Below is the default configuration from: [fluentbit/splunk.yaml](https://github.dev/log-10x/config/blob/main/pipelines/run/output/event/fluentbit/splunk.yaml "fluentbit/splunk.yaml"){target="\_blank"} (<span class="tenx-tooltip" data-tooltip="The config file below contains required fields to activate this module, marked with &#10071;">** Required Fields*</span>).  
  
    <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/run/output/event/fluentbit/splunk.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-splunk.yaml3-edit-button" data-tooltip="Edit configuration file" data-dialog-id="splunk-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="splunk-yaml3-dialog" class="md-dialog md-dialog--editor">
        <div class="editor-dialog-wrapper">
            <div class="editor-dialog-header">
                <span class="editor-dialog-title">Edit splunk.yaml 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('splunk-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/run/output/event/fluentbit/splunk.yaml"
                                data-copy-nix="/etc/log10x/config/run/output/event/fluentbit/splunk.yaml"
                                data-copy-win="C:\log10x\configs/run/output/event/fluentbit/splunk.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/output/event/fluentbit/splunk.yaml">$TENX_CONFIG/run/output/event/fluentbit/splunk.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/output/event/fluentbit/splunk.yaml">./pipelines/run/output/event/fluentbit/splunk.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">ewogICJ0eXBlIiA6ICJvYmplY3QiLAogICJwcm9wZXJ0aWVzIiA6IHsKICAgICJpbmNsdWRlIiA6IHsKICAgICAgInR5cGUiIDogImFycmF5IiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9LAogICAgInRlbngiIDogewogICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgfSwKICAgICJmbHVlbnRiaXRPdXQiIDogewogICAgICAidHlwZSIgOiAiYXJyYXkiLAogICAgICAiaXRlbXMiIDogewogICAgICAgICJ0eXBlIiA6ICJvYmplY3QiLAogICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZSwKICAgICAgICAicHJvcGVydGllcyIgOiB7CiAgICAgICAgICAiY29tbWFuZCIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkNvbW1hbmQgdG8gbGF1bmNoIEZsdWVudCBCaXRcblxuU3BlY2lmaWVzIHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUgdG8gbGF1bmNoIHRoZSBGbHVlbnQgQml0ICBzdWItcHJvY2Vzcy4iCiAgICAgICAgICB9LAogICAgICAgICAgImlucHV0QXJncyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHNwYXduZWQgRmx1ZW50IEJpdCAgcHJvY2VzcyBzZXR0aW5nIHVwIGlucHV0XG5cbkxpc3Qgb2YgdmFsdWVzIHRvIHBhc3MgYXMgc3RhcnR1cCBhcmd1bWVudHMgdG8gdGhlIHNwYXduZWQgRmx1ZW50IEJpdCAgc3ViLXByb2Nlc3MgaW50ZW5kZWQgdG8gc2V0IHVwIGl0J3Mgc3RkaW4gaW5wdXQuIChEZWZhdWx0OiBbXCItY1wiLFwiJD1wYXRoKFxcXCJmbHVlbnRiaXQtMTB4LWlucHV0LmNvbmZcXFwiKVwiXSkiLAogICAgICAgICAgICAiaXRlbXMiIDogewogICAgICAgICAgICAgICJ0eXBlIiA6ICJzdHJpbmciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkZWZhdWx0IiA6IFsKICAgICAgICAgICAgICAiLWMiLAogICAgICAgICAgICAgICIkPXBhdGgoXCJmbHVlbnRiaXQtMTB4LWlucHV0LmNvbmZcIikiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAib3V0cHV0QXJncyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHNwYXduZWQgRmx1ZW50IEJpdCAgcHJvY2VzcyBzZXR0aW5nIHVwIG91dHB1dFxuXG5MaXN0IG9mIHZhbHVlcyB0byBwYXNzIGFzIHN0YXJ0dXAgYXJndW1lbnRzIHRvIHRoZSBzcGF3bmVkIEZsdWVudCBCaXQgc3ViLXByb2Nlc3MgaW50ZW5kZWQgdG8gc2V0IHVwIGl0J3Mgb3V0cHV0IHBsdWdpbihzKSIsCiAgICAgICAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgICAgICAgInR5cGUiIDogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJsYXp5TGF1bmNoIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJib29sZWFuIiwKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlNldHMgd2hldGhlciB0byBsYXVuY2ggdGhlIHByb2Nlc3Mgb24tZGVtYW5kXG5cbkNvbnRyb2xzIHdoZXRoZXIgdG8gc3Bhd24gdGhlIHRhcmdldCBzdWItcHJvY2VzcyB1cG9uIHRoZSBjcmVhdGlvbiBvZiB0aGUgb3V0cHV0IG9yIG9uLWRlbWFuZC4gSWYgdHJ1ZSwgbGF1bmNoIHRoZSBzdWItcHJvY2VzcyB3aGVuIHRoZSBmaXJzdCBUZW5YT2JqZWN0IGluc3RhbmNlIGlzIHdyaXR0ZW4gdG8gaXRzIHN0ZGluLiAoQWNjZXB0cyBib29sZWFuIG9yIHN0cmluZyB3aXRoICQ9IHByZWZpeCBmb3IgcnVudGltZSBldmFsdWF0aW9uKSIKICAgICAgICAgIH0sCiAgICAgICAgICAic3RhcnR1cCIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6ICJvYmplY3QiLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiIDogZmFsc2UsCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKICAgICAgICAgICAgICAid2FpdCIgOiB7CiAgICAgICAgICAgICAgICAidHlwZSIgOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZSwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKICAgICAgICAgICAgICAgICAgIm1zIiA6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgICAgICAgICAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiV2FpdCB0aW1lIGZvciBwcm9jZXNzIHRvIHN0YXJ0dXBcblxuU2V0cyBhIHN0YXJ0dXAgZGVsYXkgd2FpdCB0aW1lIGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIHByb2Nlc3MgaXMgY29uc2lkZXJlZCBhdmFpbGFibGUgZm9yIGV2ZW50cy4gaWYgcHJvdmlkZWQsIHdpbGwgYWRkIGEgd2FpdCBhcyBwYXJ0IG9mIHN0YXJ0aW5nIHRoZSBwcm9jZXNzIGJlZm9yZSBlbWl0dGluZyBldmVudHMgaW50byBpdC4gbWF4IHZhbHVlIGZvciB0aGlzIGFyZ3VtZW50IGlzIDEwLDAwMCAoaWUgMTAgc2Vjb25kcykuIGlmIFtmbHVlbnRiaXRPdXRTdGFydHVwV2FpdFBhdHRlcm5dKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9mbHVlbnRiaXQvI2ZsdWVudGJpdE91dHN0YXJ0dXB3YWl0cGF0dGVybikgaXMgYWxzbyBwcm92aWRlZCwgdGhlIHByb2Nlc3Mgd2lsbCBiZSBjb25zaWRlcmVkIGEgZmFpbHVyZSBpZiB0aGUgd2FpdCB0aW1lIGhhcyBwYXNzZWQgYmVmb3JlIGEgbGluZSBtYXRjaGluZyBbZmx1ZW50Yml0T3V0U3RhcnR1cFdhaXRQYXR0ZXJuXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRzdGFydHVwd2FpdHBhdHRlcm4pIHdhcyBlbWl0dGVkLiAoQWNjZXB0cyBudW1iZXIgb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiA1MDAwKSIsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiIDogNTAwMAogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAicGF0dGVybiIgOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJXYWl0IGZvciBhbiBvdXRwdXQgZnJvbSB0aGUgcHJvY2VzcyBhdCBzdGFydHVwXG5cblNldHMgYSByZWdleCBwYXR0ZXJuIHRvIHdhaXQgZm9yIHRoZSBwcm9jZXNzIHRvIGVtaXQgZm9yIGl0IHRvIGJlIGNvbnNpZGVyZWQgYXZhaWxhYmxlIGZvciBldmVudHMuIGlmIHByb3ZpZGVkLCB3aWxsIHdhaXQgdW50aWwgdGhlIHByb2Nlc3MgaGFzIGVtaXR0ZWQgYSBsaW5lIHRvIGl0J3Mgb3V0cHV0IHRoYXQgbWF0Y2hlcyB0aGUgcmVnZXggYmVmb3JlIGVtaXR0aW5nIGV2ZW50cyBpbnRvIGl0LiBpZiBbZmx1ZW50Yml0T3V0U3RhcnR1cFdhaXRNc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vb3V0cHV0L2V2ZW50L2ZsdWVudGJpdC8jZmx1ZW50Yml0T3V0U3RhcnR1cFdhaXRNcykgaXMgYWxzbyBwcm92aWRlZCwgd2lsbCBvbmx5IHdhaXQgZm9yIHRoZSBzcGVjaWZpZWQgd2FpdCB0aW1lLCBhZnRlciB3aGljaCBpZiBubyBsaW5lIHdhcyBlbWl0dGVkIHRvIG1hdGNoIHRoZSBwcm92aWRlZCByZWdleCB0aGUgcHJvY2VzcyB3aWxsIGJlIGNvbnNpZGVyZWQgYSBmYWlsdXJlLiAoRGVmYXVsdDogXFxbXFxzKnNwXFxzKl1cXHMrc3RyZWFtXFxzK3Byb2Nlc3NvclxccytzdGFydGVkXFxiKSIsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiIDogIlxcW1xccypzcFxccypdXFxzK3N0cmVhbVxccytwcm9jZXNzb3JcXHMrc3RhcnRlZFxcYiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJkZXN0cm95TW9kZSIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkNvbnRyb2wgaG93IHRvIHRlcm1pbmF0ZSB0aGUgc3ViLXByb2Nlc3Mgb24gb3V0cHV0IGNsb3NlXG5cbkNvbnRyb2xzIGhvdyB0byB0cmVhdCBzcGF3bmVkIHN1Yi1wcm9jZXNzIHdoZW4gdGhpcyBvdXRwdXQgY2xvc2VzLiBQb3NzaWJsZSB2YWx1ZXM6IHwgVmFsdWUgICAgICB8IERlc2NyaXB0aW9uIHwgfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfCB8ICoqZ3JhY2VmdWwqKiAoZGVmYXVsdCkgICB8IFRoZSBzdWItcHJvY2VzcyBpcyBkZXN0cm95ZWQgZ3JhY2VmdWxseSB3aXRoIGEgdGltZW91dCBwZXJpb2Qgb2YgW2ZsdWVudGJpdE91dERlc3Ryb3lXYWl0XShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRkZXN0cm95d2FpdCkuIHwgfCAqKmZvcmNpYmxlKiogICAgICAgICAgICAgfCBUZXJtaW5hdGVzIHRoZSBzdWItcHJvY2VzcyBpbW1lZGlhdGVseS4gfCB8ICoqY2FjaGVkKiogICAgICAgICAgICAgICB8IFRoZSBzdWItcHJvY2VzcyByZW1haW5zIGFsaXZlIGZvciBmdXR1cmUgcGlwZWxpbmVzIHRoYXQgbGF1bmNoIHRoZSBzYW1lIGNvbW1hbmQgYW5kIGFyZ3VtZW50IGNvbWJpbmF0aW9uIHdpdGhpbiB0aGUgaG9zdCBKVk0uIEEgbWF4aW11bSBvZiBbZmx1ZW50Yml0T3V0TWF4Q2FjaGVTaXplXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRtYXhjYWNoZXNpemUpIGNhbiBiZSBrZXB0IGFsaXZlLiBVc2VmdWwgZm9yIGxhdW5jaGluZyBzaGlwcGVycyAoZS5nLiwgRmlsZWJlYXQsIEZsdWVudCBCaXQpIGFjcm9zcyBtdWx0aXBsZSAxMHggcGlwZWxpbmUgcnVucyBpbiBhIGxvbmctbGl2aW5nIHNlcnZlciBlbnZpcm9ubWVudC4gfCAoRGVmYXVsdDogZ3JhY2VmdWwpIiwKICAgICAgICAgICAgImRlZmF1bHQiIDogImdyYWNlZnVsIgogICAgICAgICAgfSwKICAgICAgICAgICJkZXN0cm95V2FpdCIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkR1cmF0aW9uIHRvIHdhaXQgZm9yIHNwYXduZWQgc3ViLXByb2Nlc3MgdG8gdGVybWluYXRlXG5cbkNvbnRyb2xzIHRoZSB0aW1lIGR1cmF0aW9uIHRoYXQgdGhlIG91dHB1dCBzdHJlYW0gd2lsbCB3YWl0IGZvciB0aGUgc3ViLXByb2Nlc3MgdG8gdGVybWluYXRlIGdyYWNlZnVsbHkgKGUuZy4sICc1cycpLiBJZiB0aGUgcHJvY2VzcyB0aW1lb3V0cywgdGhlIG91dHB1dCB3aWxsIGZvcmNpYmx5IHRlcm1pbmF0ZSBpdC4gSWYgc2V0IHRvIDAsIHRoZSBvdXRwdXQgc3RyZWFtIHdpbGwgd2FpdCBpbmRlZmluaXRlbHkgZm9yIHRoZSBzdWItcHJvY2VzcyB0byB0ZXJtaW5hdGUuIFRoaXMgdmFsdWUgb25seSBhcHBsaWVzIHdoZW4gW2ZsdWVudGJpdE91dERlc3Ryb3lNb2RlXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRkZXN0cm95bW9kZSkgaXMgc2V0IHRvIGBncmFjZWZ1bGAuIgogICAgICAgICAgfSwKICAgICAgICAgICJtYXhDYWNoZVNpemUiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgIm51bWJlciIsCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJNYXggbnVtYmVyIG9mIHN1Yi1wcm9jZXNzZXMgdG8ga2VlcCBhbGl2ZSBhY3Jvc3Mgc3Vic2VxdWVudCAxMHggcGlwZWxpbmUgZXhlY3V0aW9uc1xuXG5TZXRzIHRoZSBnbG9iYWwgbWF4aW11bSBudW1iZXIgb2YgcHJvY2Vzc2VzIHRoYXQgY2FuIHJldGFpbmVkIGdsb2JhbGx5IGFjcm9zcyAxMHggcGlwZWxpbmUgZXhlY3V0aW9ucyB3aXRoaW4gdGhlIGhvc3QgSlZNLiBUaGlzIHZhbHVlIGlzIHVzZWZ1bCB3aGVuIGxhdW5jaGluZyBzaGlwcGVycyAoZS5nLiwgRmlsZWJlYXQsIEZsdWVudCBCaXQpIGZvciB1c2UgYWNyb3NzIG11bHRpcGxlIDEweCBwaXBlbGluZSBleGVjdXRpb25zIHdpdGhpbiBhIHNlcnZlciBlbnZpcm9ubWVudC4gVGhpcyB2YWx1ZSBvbmx5IGFwcGxpZXMgd2hlbiBbZmx1ZW50Yml0T3V0RGVzdHJveU1vZGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9mbHVlbnRiaXQvI2ZsdWVudGJpdG91dGRlc3Ryb3ltb2RlKSBpcyBzZXQgdG8gYGNhY2hlZGAuIElmIFtmbHVlbnRiaXRPdXRNYXhDYWNoZVNpemVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9mbHVlbnRiaXQvI2ZsdWVudGJpdG91dG1heGNhY2hlc2l6ZSkgaXMgc2V0IHRvIDAsIG5vIGNhY2hpbmcgaXMgcGVyZm9ybWVkLCBhbmQgc3ViLXByb2Nlc3NlcyBhcmUgZGVzdHJveWVkIGdyYWNlZnVsbHkuIChBY2NlcHRzIG51bWJlciBvciBzdHJpbmcgd2l0aCAkPSBwcmVmaXggZm9yIHJ1bnRpbWUgZXZhbHVhdGlvbikiCiAgICAgICAgICB9LAogICAgICAgICAgImZpZWxkcyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTGlzdCBvZiBUZW5YT2JqZWN0IGZpZWxkIG5hbWVzIHRvIGVuY29kZVxuXG5TcGVjaWZpZXMgYSBsaXN0IG9mIFRlblhPYmplY3QgaW50cmluc2ljL2NhbGN1bGF0ZWQvZXh0cmFjdGVkIGZpZWxkIG5hbWVzIHRvIGV4dHJhY3QgYW5kIHdyaXRlIHRvIHRoZSBvdXRwdXQuIiwKICAgICAgICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgImZpbHRlciIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGFuIFRlblhPYmplY3QgbXVzdCBldmFsdWF0ZSBhcyAndHJ1dGh5JyBhZ2FpbnN0IHRvIGJlIHdyaXR0ZW4gdG8gdGhpcyBvdXRwdXRcblxuU3BlY2lmaWVzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRoYXQgYW4gVGVuWE9iamVjdCBtdXN0IGV2YWx1YXRlIGFzIHRydXRoeSB0byB3cml0ZSBpdHMgaW5zdGFuY2UvdGVtcGxhdGUgZmllbGQgdmFsdWVzIHRvIHRoaXMgb3V0cHV0LiAgRm9yIGV4YW1wbGUsIHRvIG9ubHkgZW1pdCBbdGltZXN0YW1wZWRdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vYXBpL2pzLyNUZW5YQmFzZU9iamVjdCt0aW1lc3RhbXBlZCkgVGVuWE9iamVjdHMsIHNwZWNpZnk6IGBgYCB5YW1sIGZsdWVudGJpdE91dEZpbHRlcjogdGhpcy50aW1lc3RhbXBlZCBgYGAiCiAgICAgICAgICB9LAogICAgICAgICAgIndyaXRlT2JqZWN0cyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJJZiB0cnVlLCBUZW5YT2JqZWN0IGZpZWxkIHZhbHVlcyBzcGVjaWZpZWQgYnkgW2ZsdWVudGJpdE91dEZpZWxkc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vb3V0cHV0L2V2ZW50L2ZsdWVudGJpdC8jZmx1ZW50Yml0b3V0ZmllbGRzKSBhcmUgZW5jb2RlZCB0byB0aGlzIG91dHB1dFxuXG5EZXRlcm1pbmUgd2hldGhlciB0byB3cml0ZSBbZmx1ZW50Yml0T3V0RmllbGRzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRmaWVsZHMpIHZhbHVlcyBvZiBhbiBUZW5YT2JqZWN0IHBhc3NlZCB0byB0aGlzIG91dHB1dC4gVGhpcyBjb25maWd1cmF0aW9uIGlzIHR5cGljYWxseSBkZWZpbmVkIHVzaW5nIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uLiAgVG8gZW5hYmxlL2Rpc2FibGUgdGhlIG91dHB1dCBkZXBlbmRpbmcgb24gd2hldGhlciBhIGxhdW5jaCBhcmd1bWVudCwgZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIEpWTSAtRCBvcHRpb24gZXZhbHVhdGVzIGFzIHRydXRoeSwgdXNlOiBgYGAgeWFtbCAgIGZsdWVudGJpdE91dFdyaXRlT2JqZWN0czogJD1UZW5YRW52LmdldChcIm15UHJvY0NtZFwiKSBgYGAgVG8gbGVhcm4gbW9yZSBzZWUgW1RlblhFbnYuZ2V0XShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWEVudi5nZXQpLiAoRGVmYXVsdDogdHJ1ZSkiLAogICAgICAgICAgICAiZGVmYXVsdCIgOiAidHJ1ZSIKICAgICAgICAgIH0sCiAgICAgICAgICAid3JpdGVUZW1wbGF0ZXMiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgImJvb2xlYW4iLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiSWYgdHJ1ZSwgd3JpdGUgbmV3IFRlblhUZW1wbGF0ZXMgdG8gdGhpcyBvdXRwdXRcblxuQ29udHJvbHMgd2hldGhlciB0byB3cml0ZSB0ZW1wbGF0ZSB2YWx1ZXMgb2YgVGVuWE9iamVjdHMgcGFzc2VkIHRvIHRoaXMgb3V0cHV0LiBUaGUgb3V0cHV0IHdpbGwgb25seSBlbWl0IFRlblhUZW1wbGF0ZXMgdGhhdCB0aGUgcGlwZWxpbmUgZGlkIG5vdCBsb2FkIGF0IHN0YXJ0dXAgdmlhIHRoZVt0ZW1wbGF0ZUZpbGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL3RlbXBsYXRlLyN0ZW1wbGF0ZWZpbGVzKSBhcmd1bWVudCwgYW5kIHdpbGwgb25seSBlbWl0IGFuIFRlblhUZW1wbGF0ZSBvbmNlIGJhc2VkIG9uIGl0cyBbdGVtcGxhdGVIYXNoXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWEJhc2VPYmplY3QrdGVtcGxhdGVIYXNoKSB2YWx1ZS4gKERlZmF1bHQ6IGZhbHNlKSIsCiAgICAgICAgICAgICJkZWZhdWx0IiA6ICJmYWxzZSIKICAgICAgICAgIH0sCiAgICAgICAgICAiZW5jb2RlIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogIm9iamVjdCIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZSwKICAgICAgICAgICAgInByb3BlcnRpZXMiIDogewogICAgICAgICAgICAgICJ0eXBlIiA6IHsKICAgICAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJUaGUgb3V0cHV0IGZvcm1hdCBpbiB3aGljaCB0byBlbmNvZGUgVGVuWE9iamVjdCB2YWx1ZXMuIFBvc3NpYmxlIHZhbHVlczpbanNvbiwgZGVsaW1pdGVkXVxuXG5TcGVjaWZpZXMgaG93IHRvIGVuY29kZSBbZmx1ZW50Yml0T3V0RmllbGRzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRmaWVsZHMpIHZhbHVlcyB0byB0aGlzIG91dHB1dC4gUG9zc2libGUgdmFsdWVzOiAtICoqanNvbioqOiBmb3JtYXRzIG5hbWVzIGFuZCB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IFRlblhPYmplY3QgYXM6IHtcImZpZWxkXCI6XCJzdHJcIixcImZpZWxkMlwiOjEsIFwiZmllbGQzXCI6IHRydWV9IC0gKipkZWxpbWl0ZWQqKjogZm9ybWF0cyB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IFRlblhPYmplY3QgYXM6IFwic3RyXCIsMSx0cnVlICAgIFRoZSBbZmx1ZW50Yml0T3V0RW5jb2RlRGVsaW1pdGVyXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRPdXRlbmNvZGVkZWxpbWl0ZXIpIGFyZ3VtZW50IGRldGVybWluZXMgdGhlIHNlcGFyYXRvciB0byB1c2UuIChEZWZhdWx0OiBkZWxpbWl0ZWQpIiwKICAgICAgICAgICAgICAgICJkZWZhdWx0IiA6ICJkZWxpbWl0ZWQiCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAiZGVsaW1pdGVyIiA6IHsKICAgICAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJUaGUgZGVsaW1pdGVyIHBsYWNlZCBiZXR3ZWVuIGtleSBhbmQgdmFsdWVzIHBhaXJzIGlmICdmbHVlbnRiaXRPdXRFbmNvZGVUeXBlJyBpcyAnZGVsaW1pdGVkJ1xuXG5TZXRzIHRoZSBjaGFyIGRlbGltaXRlciB0byBzZXBhcmF0ZSBUZW5YT2JqZWN0IGZpZWxkIHZhbHVlcyB3aGVuIFtmbHVlbnRiaXRPdXRFbmNvZGVUeXBlXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRlbmNvZGV0eXBlKSBpcyBgZGVsaW1pdGVkYC4gKERlZmF1bHQ6ICApIiwKICAgICAgICAgICAgICAgICJkZWZhdWx0IiA6ICIgIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJlbmNvZGVkTGluZVByZWZpeCIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlRoZSBsaW5lIHByZWZpeCBwcmVwZW5kZWQgdG8gdGhlIGVuY29kZWQgZXZlbnQgaWYgJ2ZsdWVudGJpdE91dEVuY29kZVR5cGUnIGlzICdkZWxpbWl0ZWQnXG5cblNldHMgdGhlIGNoYXIgd2hpY2ggaXMgcHJlcGVuZGVkIHRvIHRoZSBlbWl0dGVkIFRlblhPYmplY3QgZmllbGQgdmFsdWVzIHdoZW4gW2ZsdWVudGJpdE91dEVuY29kZVR5cGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9mbHVlbnRiaXQvI2ZsdWVudGJpdG91dGVuY29kZXR5cGUpIGlzIGBkZWxpbWl0ZWRgLiAoRGVmYXVsdDogKSIsCiAgICAgICAgICAgICJkZWZhdWx0IiA6ICIiCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicmVxdWlyZWQiIDogWwogICAgICAgICAgImNvbW1hbmQiCiAgICAgICAgXQogICAgICB9CiAgICB9CiAgfSwKICAiYWRkaXRpb25hbFByb3BlcnRpZXMiIDogdHJ1ZQp9</template>

    ```yaml
    # 🔟❎ 'run' Fluent Bit output configuration for events stream output to Splunk
    
    # Launch a Fluent Bit process into whose stdin pipe to write TenXObjects field values and TenXTemplates
    # To learn more see https://doc.log10x.com/run/output/event/process/
    
    # Set the 10x pipeline to 'run'
    tenx: run
    
    # =============================== Dependencies ================================
    
    include:
      - run/modules/output/event/fluentbit
    
    
    # ============================ Fluent Bit Options =============================
    
    # Multiple Fluent Bit outputs can be defined below
    
    fluentbitOut:
    
        # ------------------------------ General ----------------------------------
    
        # 'writeObjects' controls whether to write TenXObject field values to output.
      - writeObjects: true
    
        # 'writeTemplates' controls whether to write new template for TenXObjects written to
        #  this output. To learn more about TenXTemplates, see: https://doc.log10x.com/run/template
        writeTemplates: false
    
        # ------------------------------ Process ----------------------------------
    
        # 'command' specifies the command to execute to launch the Fluent Bit sub-process.
        command: /opt/fluent-bit/bin/fluent-bit
    
        # 'inputArgs' specifies list of values to pass as startup arguments to the spawned Fluent Bit sub-process
        inputArgs:
          # Sets the Fluent Bit input to read from stdin and route TenXTemplates
          # See https://github.com/log-10x/config/blob/main/pipelines/run/output/event/fluentbit/fluentbit-10x-input.conf
          - -c
          - $=path("fluentbit-10x-input.conf")
    
        # Setting the Fluent Bit output to Splunk
        # for full config options of the Fluent Bit splunk plugin, see -
        # https://docs.fluentbit.io/manual/pipeline/outputs/splunk
        #
        # Fluent Bit is using Splunk's HTTP event collector (HEC) for emitting events
        # for instructions on setting up HEC on splunk, see -
        # https://dev.splunk.com/enterprise/docs/devtools/httpeventcollector
        #
        outputArgs:
    
          ############### Events output ###############
    
          # Set event output to Splunk
          - "-o"
          - "splunk"
          - "-m"
          - "input"
    
          # Setting host
          - "-p"
          - "$=\"host=\" + TenXEnv.get(\"SPLUNK_HOST\", \"127.0.0.1\")" # (❗ REQUIRED)
          - "-p"
          - "$=\"port=\" + TenXEnv.get(\"SPLUNK_PORT\", \"8088\")" # (❗ REQUIRED)
    
          # Setting up credentials
          - "-p"
          - "$=\"splunk_token=\" + TenXEnv.get(\"SPLUNK_HEC_TOKEN\")" # (❗ REQUIRED)
    
          # Setting the index destination
          - "-p"
          - "event_index=main"
          - "-p"
          - "event_source=fluent-bit-tenx-stream"
          - "-p"
          - "event_sourcetype=tenx_encoded"
    
          # Setting TLS
          - "-p"
          - "tls=on"
          - "-p"
          - "tls.verify=on"
    
          # Don't send raw
          - "-p"
          - "splunk_send_raw=off"
    
          ############### Templates output ###############
    
          # Set templates output to Elasticsearch
          - "-o"
          - "es"
          - "-m"
          - "templates"
    
          # Setting host
          - "-p"
          - "$=\"host=\" + TenXEnv.get(\"SPLUNK_HOST\", \"127.0.0.1\")" # (❗ REQUIRED)
          - "-p"
          - "$=\"port=\" + TenXEnv.get(\"SPLUNK_PORT\", \"8088\")" # (❗ REQUIRED)
    
          # Setting up credentials
          - "-p"
          - "$=\"splunk_token=\" + TenXEnv.get(\"SPLUNK_HEC_TOKEN\")" # (❗ REQUIRED)
    
          # Setting the templates index destination
          - "-p"
          - "event_index=main"
          - "-p"
          - "event_source=fluent-bit-tenx-stream"
          - "-p"
          - "event_sourcetype=tenx_dml_raw_json"
    
          # Setting TLS
          - "-p"
          - "tls=on"
          - "-p"
          - "tls.verify=on"
    
          # Don't send raw
          - "-p"
          - "splunk_send_raw=off"
    
        # 'destroyMode' is set to 'cached' to allow a fluent-bit sub-process to
        #  to be reused across multiple 10x pipeline executions within a host JVM.
        destroyMode: cached
    
        # 'maxCacheSize' sets the size of the cache to used for caching fluent-bit instances
        maxCacheSize: 1
    
        # 'lazyLaunch' determines whether the fluent-bit instance will launch immediately
        # during the pipeline initialization, or only on-demand.
        lazyLaunch: true
    
        # ------------------------------ Encoding ---------------------------------
    
        # 'filter' specifies an expression that any TenXObject passed to this output must
        #  evaluate as truthy against to write its instance/template values to stdout.
        #  For example, 'filter: this.timestamp' will only emit timestamped objects.
        #  To learn more see: https://doc.log10x.com/api/js/#TenXBaseObject+timestamped
        filter: null
    
        #  This corresponds to the stdin format defined by fluent-bit in:
        #  https://docs.fluentbit.io/manual/pipeline/inputs/standard-input
        #  The 'text' argument below could be replaced by any list of intrinsic/calculated/extracted fields.
        #  The "" delimiter instructs 'joinFields' to produce JSON output.
        fields:  #
          - open="["
          - timestamp=dateFormat("+%s.%N")
          - separator=","
          - fields=joinFields("", "text")
          - close="]"
    ```

=== "Stdout"

    Below is the default configuration from: [fluentbit/stdout.yaml](https://github.dev/log-10x/config/blob/main/pipelines/run/output/event/fluentbit/stdout.yaml "fluentbit/stdout.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/run/output/event/fluentbit/stdout.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-stdout.yaml4-edit-button" data-tooltip="Edit configuration file" data-dialog-id="stdout-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="stdout-yaml4-dialog" class="md-dialog md-dialog--editor">
        <div class="editor-dialog-wrapper">
            <div class="editor-dialog-header">
                <span class="editor-dialog-title">Edit stdout.yaml 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('stdout-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/output/event/fluentbit/stdout.yaml"
                                data-copy-nix="/etc/log10x/config/run/output/event/fluentbit/stdout.yaml"
                                data-copy-win="C:\log10x\configs/run/output/event/fluentbit/stdout.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/output/event/fluentbit/stdout.yaml">$TENX_CONFIG/run/output/event/fluentbit/stdout.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/output/event/fluentbit/stdout.yaml">./pipelines/run/output/event/fluentbit/stdout.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">ewogICJ0eXBlIiA6ICJvYmplY3QiLAogICJwcm9wZXJ0aWVzIiA6IHsKICAgICJpbmNsdWRlIiA6IHsKICAgICAgInR5cGUiIDogImFycmF5IiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9LAogICAgInRlbngiIDogewogICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgfSwKICAgICJmbHVlbnRiaXRPdXQiIDogewogICAgICAidHlwZSIgOiAiYXJyYXkiLAogICAgICAiaXRlbXMiIDogewogICAgICAgICJ0eXBlIiA6ICJvYmplY3QiLAogICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZSwKICAgICAgICAicHJvcGVydGllcyIgOiB7CiAgICAgICAgICAiY29tbWFuZCIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkNvbW1hbmQgdG8gbGF1bmNoIEZsdWVudCBCaXRcblxuU3BlY2lmaWVzIHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUgdG8gbGF1bmNoIHRoZSBGbHVlbnQgQml0ICBzdWItcHJvY2Vzcy4iCiAgICAgICAgICB9LAogICAgICAgICAgImlucHV0QXJncyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHNwYXduZWQgRmx1ZW50IEJpdCAgcHJvY2VzcyBzZXR0aW5nIHVwIGlucHV0XG5cbkxpc3Qgb2YgdmFsdWVzIHRvIHBhc3MgYXMgc3RhcnR1cCBhcmd1bWVudHMgdG8gdGhlIHNwYXduZWQgRmx1ZW50IEJpdCAgc3ViLXByb2Nlc3MgaW50ZW5kZWQgdG8gc2V0IHVwIGl0J3Mgc3RkaW4gaW5wdXQuIChEZWZhdWx0OiBbXCItY1wiLFwiJD1wYXRoKFxcXCJmbHVlbnRiaXQtMTB4LWlucHV0LmNvbmZcXFwiKVwiXSkiLAogICAgICAgICAgICAiaXRlbXMiIDogewogICAgICAgICAgICAgICJ0eXBlIiA6ICJzdHJpbmciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkZWZhdWx0IiA6IFsKICAgICAgICAgICAgICAiLWMiLAogICAgICAgICAgICAgICIkPXBhdGgoXCJmbHVlbnRiaXQtMTB4LWlucHV0LmNvbmZcIikiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAib3V0cHV0QXJncyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHNwYXduZWQgRmx1ZW50IEJpdCAgcHJvY2VzcyBzZXR0aW5nIHVwIG91dHB1dFxuXG5MaXN0IG9mIHZhbHVlcyB0byBwYXNzIGFzIHN0YXJ0dXAgYXJndW1lbnRzIHRvIHRoZSBzcGF3bmVkIEZsdWVudCBCaXQgc3ViLXByb2Nlc3MgaW50ZW5kZWQgdG8gc2V0IHVwIGl0J3Mgb3V0cHV0IHBsdWdpbihzKSIsCiAgICAgICAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgICAgICAgInR5cGUiIDogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJsYXp5TGF1bmNoIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJib29sZWFuIiwKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlNldHMgd2hldGhlciB0byBsYXVuY2ggdGhlIHByb2Nlc3Mgb24tZGVtYW5kXG5cbkNvbnRyb2xzIHdoZXRoZXIgdG8gc3Bhd24gdGhlIHRhcmdldCBzdWItcHJvY2VzcyB1cG9uIHRoZSBjcmVhdGlvbiBvZiB0aGUgb3V0cHV0IG9yIG9uLWRlbWFuZC4gSWYgdHJ1ZSwgbGF1bmNoIHRoZSBzdWItcHJvY2VzcyB3aGVuIHRoZSBmaXJzdCBUZW5YT2JqZWN0IGluc3RhbmNlIGlzIHdyaXR0ZW4gdG8gaXRzIHN0ZGluLiAoQWNjZXB0cyBib29sZWFuIG9yIHN0cmluZyB3aXRoICQ9IHByZWZpeCBmb3IgcnVudGltZSBldmFsdWF0aW9uKSIKICAgICAgICAgIH0sCiAgICAgICAgICAic3RhcnR1cCIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6ICJvYmplY3QiLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiIDogZmFsc2UsCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKICAgICAgICAgICAgICAid2FpdCIgOiB7CiAgICAgICAgICAgICAgICAidHlwZSIgOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZSwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKICAgICAgICAgICAgICAgICAgIm1zIiA6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgICAgICAgICAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiV2FpdCB0aW1lIGZvciBwcm9jZXNzIHRvIHN0YXJ0dXBcblxuU2V0cyBhIHN0YXJ0dXAgZGVsYXkgd2FpdCB0aW1lIGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIHByb2Nlc3MgaXMgY29uc2lkZXJlZCBhdmFpbGFibGUgZm9yIGV2ZW50cy4gaWYgcHJvdmlkZWQsIHdpbGwgYWRkIGEgd2FpdCBhcyBwYXJ0IG9mIHN0YXJ0aW5nIHRoZSBwcm9jZXNzIGJlZm9yZSBlbWl0dGluZyBldmVudHMgaW50byBpdC4gbWF4IHZhbHVlIGZvciB0aGlzIGFyZ3VtZW50IGlzIDEwLDAwMCAoaWUgMTAgc2Vjb25kcykuIGlmIFtmbHVlbnRiaXRPdXRTdGFydHVwV2FpdFBhdHRlcm5dKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9mbHVlbnRiaXQvI2ZsdWVudGJpdE91dHN0YXJ0dXB3YWl0cGF0dGVybikgaXMgYWxzbyBwcm92aWRlZCwgdGhlIHByb2Nlc3Mgd2lsbCBiZSBjb25zaWRlcmVkIGEgZmFpbHVyZSBpZiB0aGUgd2FpdCB0aW1lIGhhcyBwYXNzZWQgYmVmb3JlIGEgbGluZSBtYXRjaGluZyBbZmx1ZW50Yml0T3V0U3RhcnR1cFdhaXRQYXR0ZXJuXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRzdGFydHVwd2FpdHBhdHRlcm4pIHdhcyBlbWl0dGVkLiAoQWNjZXB0cyBudW1iZXIgb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiA1MDAwKSIsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiIDogNTAwMAogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAicGF0dGVybiIgOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJXYWl0IGZvciBhbiBvdXRwdXQgZnJvbSB0aGUgcHJvY2VzcyBhdCBzdGFydHVwXG5cblNldHMgYSByZWdleCBwYXR0ZXJuIHRvIHdhaXQgZm9yIHRoZSBwcm9jZXNzIHRvIGVtaXQgZm9yIGl0IHRvIGJlIGNvbnNpZGVyZWQgYXZhaWxhYmxlIGZvciBldmVudHMuIGlmIHByb3ZpZGVkLCB3aWxsIHdhaXQgdW50aWwgdGhlIHByb2Nlc3MgaGFzIGVtaXR0ZWQgYSBsaW5lIHRvIGl0J3Mgb3V0cHV0IHRoYXQgbWF0Y2hlcyB0aGUgcmVnZXggYmVmb3JlIGVtaXR0aW5nIGV2ZW50cyBpbnRvIGl0LiBpZiBbZmx1ZW50Yml0T3V0U3RhcnR1cFdhaXRNc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vb3V0cHV0L2V2ZW50L2ZsdWVudGJpdC8jZmx1ZW50Yml0T3V0U3RhcnR1cFdhaXRNcykgaXMgYWxzbyBwcm92aWRlZCwgd2lsbCBvbmx5IHdhaXQgZm9yIHRoZSBzcGVjaWZpZWQgd2FpdCB0aW1lLCBhZnRlciB3aGljaCBpZiBubyBsaW5lIHdhcyBlbWl0dGVkIHRvIG1hdGNoIHRoZSBwcm92aWRlZCByZWdleCB0aGUgcHJvY2VzcyB3aWxsIGJlIGNvbnNpZGVyZWQgYSBmYWlsdXJlLiAoRGVmYXVsdDogXFxbXFxzKnNwXFxzKl1cXHMrc3RyZWFtXFxzK3Byb2Nlc3NvclxccytzdGFydGVkXFxiKSIsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiIDogIlxcW1xccypzcFxccypdXFxzK3N0cmVhbVxccytwcm9jZXNzb3JcXHMrc3RhcnRlZFxcYiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJkZXN0cm95TW9kZSIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkNvbnRyb2wgaG93IHRvIHRlcm1pbmF0ZSB0aGUgc3ViLXByb2Nlc3Mgb24gb3V0cHV0IGNsb3NlXG5cbkNvbnRyb2xzIGhvdyB0byB0cmVhdCBzcGF3bmVkIHN1Yi1wcm9jZXNzIHdoZW4gdGhpcyBvdXRwdXQgY2xvc2VzLiBQb3NzaWJsZSB2YWx1ZXM6IHwgVmFsdWUgICAgICB8IERlc2NyaXB0aW9uIHwgfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfCB8ICoqZ3JhY2VmdWwqKiAoZGVmYXVsdCkgICB8IFRoZSBzdWItcHJvY2VzcyBpcyBkZXN0cm95ZWQgZ3JhY2VmdWxseSB3aXRoIGEgdGltZW91dCBwZXJpb2Qgb2YgW2ZsdWVudGJpdE91dERlc3Ryb3lXYWl0XShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRkZXN0cm95d2FpdCkuIHwgfCAqKmZvcmNpYmxlKiogICAgICAgICAgICAgfCBUZXJtaW5hdGVzIHRoZSBzdWItcHJvY2VzcyBpbW1lZGlhdGVseS4gfCB8ICoqY2FjaGVkKiogICAgICAgICAgICAgICB8IFRoZSBzdWItcHJvY2VzcyByZW1haW5zIGFsaXZlIGZvciBmdXR1cmUgcGlwZWxpbmVzIHRoYXQgbGF1bmNoIHRoZSBzYW1lIGNvbW1hbmQgYW5kIGFyZ3VtZW50IGNvbWJpbmF0aW9uIHdpdGhpbiB0aGUgaG9zdCBKVk0uIEEgbWF4aW11bSBvZiBbZmx1ZW50Yml0T3V0TWF4Q2FjaGVTaXplXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRtYXhjYWNoZXNpemUpIGNhbiBiZSBrZXB0IGFsaXZlLiBVc2VmdWwgZm9yIGxhdW5jaGluZyBzaGlwcGVycyAoZS5nLiwgRmlsZWJlYXQsIEZsdWVudCBCaXQpIGFjcm9zcyBtdWx0aXBsZSAxMHggcGlwZWxpbmUgcnVucyBpbiBhIGxvbmctbGl2aW5nIHNlcnZlciBlbnZpcm9ubWVudC4gfCAoRGVmYXVsdDogZ3JhY2VmdWwpIiwKICAgICAgICAgICAgImRlZmF1bHQiIDogImdyYWNlZnVsIgogICAgICAgICAgfSwKICAgICAgICAgICJkZXN0cm95V2FpdCIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkR1cmF0aW9uIHRvIHdhaXQgZm9yIHNwYXduZWQgc3ViLXByb2Nlc3MgdG8gdGVybWluYXRlXG5cbkNvbnRyb2xzIHRoZSB0aW1lIGR1cmF0aW9uIHRoYXQgdGhlIG91dHB1dCBzdHJlYW0gd2lsbCB3YWl0IGZvciB0aGUgc3ViLXByb2Nlc3MgdG8gdGVybWluYXRlIGdyYWNlZnVsbHkgKGUuZy4sICc1cycpLiBJZiB0aGUgcHJvY2VzcyB0aW1lb3V0cywgdGhlIG91dHB1dCB3aWxsIGZvcmNpYmx5IHRlcm1pbmF0ZSBpdC4gSWYgc2V0IHRvIDAsIHRoZSBvdXRwdXQgc3RyZWFtIHdpbGwgd2FpdCBpbmRlZmluaXRlbHkgZm9yIHRoZSBzdWItcHJvY2VzcyB0byB0ZXJtaW5hdGUuIFRoaXMgdmFsdWUgb25seSBhcHBsaWVzIHdoZW4gW2ZsdWVudGJpdE91dERlc3Ryb3lNb2RlXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRkZXN0cm95bW9kZSkgaXMgc2V0IHRvIGBncmFjZWZ1bGAuIgogICAgICAgICAgfSwKICAgICAgICAgICJtYXhDYWNoZVNpemUiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgIm51bWJlciIsCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJNYXggbnVtYmVyIG9mIHN1Yi1wcm9jZXNzZXMgdG8ga2VlcCBhbGl2ZSBhY3Jvc3Mgc3Vic2VxdWVudCAxMHggcGlwZWxpbmUgZXhlY3V0aW9uc1xuXG5TZXRzIHRoZSBnbG9iYWwgbWF4aW11bSBudW1iZXIgb2YgcHJvY2Vzc2VzIHRoYXQgY2FuIHJldGFpbmVkIGdsb2JhbGx5IGFjcm9zcyAxMHggcGlwZWxpbmUgZXhlY3V0aW9ucyB3aXRoaW4gdGhlIGhvc3QgSlZNLiBUaGlzIHZhbHVlIGlzIHVzZWZ1bCB3aGVuIGxhdW5jaGluZyBzaGlwcGVycyAoZS5nLiwgRmlsZWJlYXQsIEZsdWVudCBCaXQpIGZvciB1c2UgYWNyb3NzIG11bHRpcGxlIDEweCBwaXBlbGluZSBleGVjdXRpb25zIHdpdGhpbiBhIHNlcnZlciBlbnZpcm9ubWVudC4gVGhpcyB2YWx1ZSBvbmx5IGFwcGxpZXMgd2hlbiBbZmx1ZW50Yml0T3V0RGVzdHJveU1vZGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9mbHVlbnRiaXQvI2ZsdWVudGJpdG91dGRlc3Ryb3ltb2RlKSBpcyBzZXQgdG8gYGNhY2hlZGAuIElmIFtmbHVlbnRiaXRPdXRNYXhDYWNoZVNpemVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9mbHVlbnRiaXQvI2ZsdWVudGJpdG91dG1heGNhY2hlc2l6ZSkgaXMgc2V0IHRvIDAsIG5vIGNhY2hpbmcgaXMgcGVyZm9ybWVkLCBhbmQgc3ViLXByb2Nlc3NlcyBhcmUgZGVzdHJveWVkIGdyYWNlZnVsbHkuIChBY2NlcHRzIG51bWJlciBvciBzdHJpbmcgd2l0aCAkPSBwcmVmaXggZm9yIHJ1bnRpbWUgZXZhbHVhdGlvbikiCiAgICAgICAgICB9LAogICAgICAgICAgImZpZWxkcyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTGlzdCBvZiBUZW5YT2JqZWN0IGZpZWxkIG5hbWVzIHRvIGVuY29kZVxuXG5TcGVjaWZpZXMgYSBsaXN0IG9mIFRlblhPYmplY3QgaW50cmluc2ljL2NhbGN1bGF0ZWQvZXh0cmFjdGVkIGZpZWxkIG5hbWVzIHRvIGV4dHJhY3QgYW5kIHdyaXRlIHRvIHRoZSBvdXRwdXQuIiwKICAgICAgICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgImZpbHRlciIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGFuIFRlblhPYmplY3QgbXVzdCBldmFsdWF0ZSBhcyAndHJ1dGh5JyBhZ2FpbnN0IHRvIGJlIHdyaXR0ZW4gdG8gdGhpcyBvdXRwdXRcblxuU3BlY2lmaWVzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRoYXQgYW4gVGVuWE9iamVjdCBtdXN0IGV2YWx1YXRlIGFzIHRydXRoeSB0byB3cml0ZSBpdHMgaW5zdGFuY2UvdGVtcGxhdGUgZmllbGQgdmFsdWVzIHRvIHRoaXMgb3V0cHV0LiAgRm9yIGV4YW1wbGUsIHRvIG9ubHkgZW1pdCBbdGltZXN0YW1wZWRdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vYXBpL2pzLyNUZW5YQmFzZU9iamVjdCt0aW1lc3RhbXBlZCkgVGVuWE9iamVjdHMsIHNwZWNpZnk6IGBgYCB5YW1sIGZsdWVudGJpdE91dEZpbHRlcjogdGhpcy50aW1lc3RhbXBlZCBgYGAiCiAgICAgICAgICB9LAogICAgICAgICAgIndyaXRlT2JqZWN0cyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJJZiB0cnVlLCBUZW5YT2JqZWN0IGZpZWxkIHZhbHVlcyBzcGVjaWZpZWQgYnkgW2ZsdWVudGJpdE91dEZpZWxkc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vb3V0cHV0L2V2ZW50L2ZsdWVudGJpdC8jZmx1ZW50Yml0b3V0ZmllbGRzKSBhcmUgZW5jb2RlZCB0byB0aGlzIG91dHB1dFxuXG5EZXRlcm1pbmUgd2hldGhlciB0byB3cml0ZSBbZmx1ZW50Yml0T3V0RmllbGRzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRmaWVsZHMpIHZhbHVlcyBvZiBhbiBUZW5YT2JqZWN0IHBhc3NlZCB0byB0aGlzIG91dHB1dC4gVGhpcyBjb25maWd1cmF0aW9uIGlzIHR5cGljYWxseSBkZWZpbmVkIHVzaW5nIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uLiAgVG8gZW5hYmxlL2Rpc2FibGUgdGhlIG91dHB1dCBkZXBlbmRpbmcgb24gd2hldGhlciBhIGxhdW5jaCBhcmd1bWVudCwgZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIEpWTSAtRCBvcHRpb24gZXZhbHVhdGVzIGFzIHRydXRoeSwgdXNlOiBgYGAgeWFtbCAgIGZsdWVudGJpdE91dFdyaXRlT2JqZWN0czogJD1UZW5YRW52LmdldChcIm15UHJvY0NtZFwiKSBgYGAgVG8gbGVhcm4gbW9yZSBzZWUgW1RlblhFbnYuZ2V0XShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWEVudi5nZXQpLiAoRGVmYXVsdDogdHJ1ZSkiLAogICAgICAgICAgICAiZGVmYXVsdCIgOiAidHJ1ZSIKICAgICAgICAgIH0sCiAgICAgICAgICAid3JpdGVUZW1wbGF0ZXMiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgImJvb2xlYW4iLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiSWYgdHJ1ZSwgd3JpdGUgbmV3IFRlblhUZW1wbGF0ZXMgdG8gdGhpcyBvdXRwdXRcblxuQ29udHJvbHMgd2hldGhlciB0byB3cml0ZSB0ZW1wbGF0ZSB2YWx1ZXMgb2YgVGVuWE9iamVjdHMgcGFzc2VkIHRvIHRoaXMgb3V0cHV0LiBUaGUgb3V0cHV0IHdpbGwgb25seSBlbWl0IFRlblhUZW1wbGF0ZXMgdGhhdCB0aGUgcGlwZWxpbmUgZGlkIG5vdCBsb2FkIGF0IHN0YXJ0dXAgdmlhIHRoZVt0ZW1wbGF0ZUZpbGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL3RlbXBsYXRlLyN0ZW1wbGF0ZWZpbGVzKSBhcmd1bWVudCwgYW5kIHdpbGwgb25seSBlbWl0IGFuIFRlblhUZW1wbGF0ZSBvbmNlIGJhc2VkIG9uIGl0cyBbdGVtcGxhdGVIYXNoXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWEJhc2VPYmplY3QrdGVtcGxhdGVIYXNoKSB2YWx1ZS4gKERlZmF1bHQ6IGZhbHNlKSIsCiAgICAgICAgICAgICJkZWZhdWx0IiA6ICJmYWxzZSIKICAgICAgICAgIH0sCiAgICAgICAgICAiZW5jb2RlIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogIm9iamVjdCIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZSwKICAgICAgICAgICAgInByb3BlcnRpZXMiIDogewogICAgICAgICAgICAgICJ0eXBlIiA6IHsKICAgICAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJUaGUgb3V0cHV0IGZvcm1hdCBpbiB3aGljaCB0byBlbmNvZGUgVGVuWE9iamVjdCB2YWx1ZXMuIFBvc3NpYmxlIHZhbHVlczpbanNvbiwgZGVsaW1pdGVkXVxuXG5TcGVjaWZpZXMgaG93IHRvIGVuY29kZSBbZmx1ZW50Yml0T3V0RmllbGRzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRmaWVsZHMpIHZhbHVlcyB0byB0aGlzIG91dHB1dC4gUG9zc2libGUgdmFsdWVzOiAtICoqanNvbioqOiBmb3JtYXRzIG5hbWVzIGFuZCB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IFRlblhPYmplY3QgYXM6IHtcImZpZWxkXCI6XCJzdHJcIixcImZpZWxkMlwiOjEsIFwiZmllbGQzXCI6IHRydWV9IC0gKipkZWxpbWl0ZWQqKjogZm9ybWF0cyB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IFRlblhPYmplY3QgYXM6IFwic3RyXCIsMSx0cnVlICAgIFRoZSBbZmx1ZW50Yml0T3V0RW5jb2RlRGVsaW1pdGVyXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRPdXRlbmNvZGVkZWxpbWl0ZXIpIGFyZ3VtZW50IGRldGVybWluZXMgdGhlIHNlcGFyYXRvciB0byB1c2UuIChEZWZhdWx0OiBkZWxpbWl0ZWQpIiwKICAgICAgICAgICAgICAgICJkZWZhdWx0IiA6ICJkZWxpbWl0ZWQiCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAiZGVsaW1pdGVyIiA6IHsKICAgICAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJUaGUgZGVsaW1pdGVyIHBsYWNlZCBiZXR3ZWVuIGtleSBhbmQgdmFsdWVzIHBhaXJzIGlmICdmbHVlbnRiaXRPdXRFbmNvZGVUeXBlJyBpcyAnZGVsaW1pdGVkJ1xuXG5TZXRzIHRoZSBjaGFyIGRlbGltaXRlciB0byBzZXBhcmF0ZSBUZW5YT2JqZWN0IGZpZWxkIHZhbHVlcyB3aGVuIFtmbHVlbnRiaXRPdXRFbmNvZGVUeXBlXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvZmx1ZW50Yml0LyNmbHVlbnRiaXRvdXRlbmNvZGV0eXBlKSBpcyBgZGVsaW1pdGVkYC4gKERlZmF1bHQ6ICApIiwKICAgICAgICAgICAgICAgICJkZWZhdWx0IiA6ICIgIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJlbmNvZGVkTGluZVByZWZpeCIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlRoZSBsaW5lIHByZWZpeCBwcmVwZW5kZWQgdG8gdGhlIGVuY29kZWQgZXZlbnQgaWYgJ2ZsdWVudGJpdE91dEVuY29kZVR5cGUnIGlzICdkZWxpbWl0ZWQnXG5cblNldHMgdGhlIGNoYXIgd2hpY2ggaXMgcHJlcGVuZGVkIHRvIHRoZSBlbWl0dGVkIFRlblhPYmplY3QgZmllbGQgdmFsdWVzIHdoZW4gW2ZsdWVudGJpdE91dEVuY29kZVR5cGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9mbHVlbnRiaXQvI2ZsdWVudGJpdG91dGVuY29kZXR5cGUpIGlzIGBkZWxpbWl0ZWRgLiAoRGVmYXVsdDogKSIsCiAgICAgICAgICAgICJkZWZhdWx0IiA6ICIiCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicmVxdWlyZWQiIDogWwogICAgICAgICAgImNvbW1hbmQiCiAgICAgICAgXQogICAgICB9CiAgICB9CiAgfSwKICAiYWRkaXRpb25hbFByb3BlcnRpZXMiIDogdHJ1ZQp9</template>

    ```yaml
    # 🔟❎ 'run' Fluent Bit output configuration for events stream output to Standard output
    
    # Launch a Fluent Bit process into whose stdin pipe to write TenXObjects field values and TenXTemplates
    # To learn more see https://doc.log10x.com/run/output/event/process/
    
    # Set the 10x pipeline to 'run'
    tenx: run
    
    # =============================== Dependencies ================================
    
    include:
      - run/modules/output/event/fluentbit
    
    
    # ============================ Fluent Bit Options =============================
    
    # Multiple Fluent Bit outputs can be defined below
    
    fluentbitOut:
    
        # ------------------------------ General ----------------------------------
    
        # 'writeObjects' controls whether to write TenXObject field values to output.
      - writeObjects: true
    
        # 'writeTemplates' controls whether to write new template for TenXObjects written to
        #  this output. To learn more about TenXTemplates, see: https://doc.log10x.com/run/template
        writeTemplates: false
    
        # ------------------------------ Process ----------------------------------
    
        # 'command' specifies the command to execute to launch the Fluent Bit sub-process.
        command: /opt/fluent-bit/bin/fluent-bit
    
        # 'inputArgs' specifies list of values to pass as startup arguments to the spawned Fluent Bit sub-process
        inputArgs:
          # Sets the Fluent Bit input to read from stdin and route TenXTemplates
          # See https://github.com/log-10x/config/blob/main/pipelines/run/output/event/fluentbit/fluentbit-10x-input.conf
          - -c
          - $=path("fluentbit-10x-input.conf")
    
        # Setting the Fluent Bit output to stdout
        outputArgs:
    
          ############### Events output ###############
    
          # Set event output to stdout
          - "-o"
          - "stdout"
          - "-m"
          - "input"
    
          ############### Templates output ###############
    
          # Set templates output to stdout
          - "-o"
          - "stdout"
          - "-m"
          - "templates"
    
        # 'destroyMode' is set to 'cached' to allow a fluent-bit sub-process to
        #  to be reused across multiple 10x pipeline executions within a host JVM.
        destroyMode: cached
    
        # 'maxCacheSize' sets the size of the cache to used for caching fluent-bit instances
        maxCacheSize: 1
    
        # 'lazyLaunch' determines whether the fluent-bit instance will launch immediately
        # during the pipeline initialization, or only on-demand.
        lazyLaunch: true
    
        # ------------------------------ Encoding ---------------------------------
    
        # 'filter' specifies an expression that any TenXObject passed to this output must
        #  evaluate as truthy against to write its instance/template values to stdout.
        #  For example, 'filter: this.timestamp' will only emit timestamped objects.
        #  To learn more see: https://doc.log10x.com/api/js/#TenXBaseObject+timestamped
        filter: null
    
        #  This corresponds to the stdin format defined by fluent-bit in:
        #  https://docs.fluentbit.io/manual/pipeline/inputs/standard-input
        #  The 'text' argument below could be replaced by any list of intrinsic/calculated/extracted fields.
        #  The "" delimiter instructs 'joinFields' to produce JSON output.
        fields:  #
          - open="["
          - timestamp=dateFormat("+%s.%N")
          - separator=","
          - fields=joinFields("", "text")
          - close="]"
    ```

## :material-menu: Options

Specify the options below to [configure](/config "configure") multiple Fluent Bit event output:

|Name|Description|Category|
|---|---|---|
|[fluentbitOutCommand](#fluentbitoutcommand "command to launch Fluent Bit")|Command to launch Fluent Bit|Process|
|[fluentbitOutOutputArgs](#fluentbitoutoutputargs "arguments to pass to the spawned Fluent Bit  process setting up output")|Arguments to pass to the spawned Fluent Bit  process setting up output|Process|
|[fluentbitOutLazyLaunch](#fluentbitoutlazylaunch "sets whether to launch the process on-demand")|Sets whether to launch the process on-demand|Process|
|[fluentbitOutInputArgs](#fluentbitoutinputargs "arguments to pass to the spawned Fluent Bit  process setting up input")|Arguments to pass to the spawned Fluent Bit  process setting up input|Advanced|
|[fluentbitOutStartupWaitMs](#fluentbitoutstartupwaitms "wait time for process to startup")|Wait time for process to startup|Advanced|
|[fluentbitOutStartupWaitPattern](#fluentbitoutstartupwaitpattern "wait for an output from the process at startup")|Wait for an output from the process at startup|Advanced|
|[fluentbitOutDestroyMode](#fluentbitoutdestroymode "control how to terminate the sub-process on output close")|Control how to terminate the sub-process on output close|Lifecycle|
|[fluentbitOutDestroyWait](#fluentbitoutdestroywait "duration to wait for spawned sub-process to terminate")|Duration to wait for spawned sub-process to terminate|Lifecycle|
|[fluentbitOutMaxCacheSize](#fluentbitoutmaxcachesize "max number of sub-processes to keep alive across subsequent 10x pipeline executions")|Max number of sub-processes to keep alive across subsequent 10x pipeline executions|Lifecycle|
|[fluentbitOutFields](#fluentbitoutfields "list of TenXObject field names to encode")|List of TenXObject field names to encode|Encoding|
|[fluentbitOutFilter](#fluentbitoutfilter "a JavaScript expression an TenXObject must evaluate as 'truthy' against to be written to this output")|A JavaScript expression an TenXObject must evaluate as 'truthy' against to be written to this output|Encoding|
|[fluentbitOutWriteObjects](#fluentbitoutwriteobjects "if true, TenXObject field values specified by [fluentbitOutFields](https://doc.log10x.com/run/output/event/fluentbit/#fluentbitoutfields) are encoded to this output")|If true, TenXObject field values specified by \[fluentbitOutFields\](https://doc.log10x.com/run/output/event/fluentbit/#fluentbitoutfields) are encoded to this output|Encoding|
|[fluentbitOutWriteTemplates](#fluentbitoutwritetemplates "if true, write new TenXTemplates to this output")|If true, write new TenXTemplates to this output|Encoding|
|[fluentbitOutEncodeType](#fluentbitoutencodetype "the output format in which to encode TenXObject values. Possible values:[json, delimited]")|The output format in which to encode TenXObject values. Possible values:\[json, delimited\]|Encoding|
|[fluentbitOutEncodedLinePrefix](#fluentbitoutencodedlineprefix "the line prefix prepended to the encoded event if 'fluentbitOutEncodeType' is 'delimited'")|The line prefix prepended to the encoded event if 'fluentbitOutEncodeType' is 'delimited'|Encoding|
|[fluentbitOutEncodeDelimiter](#fluentbitoutencodedelimiter "the delimiter placed between key and values pairs if 'fluentbitOutEncodeType' is 'delimited'")|The delimiter placed between key and values pairs if 'fluentbitOutEncodeType' is 'delimited'|Encoding|

### Process

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

Command to launch Fluent Bit.

|Type|Required|Category|
|---|---|---|
|String|✔|Process|

Specifies the command to execute to launch the Fluent Bit  sub-process.


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

Arguments to pass to the spawned Fluent Bit  process setting up output.

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

List of values to pass as startup arguments to the spawned Fluent Bit sub-process intended
to set up it's output plugin(s).


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

Sets whether to launch the process on-demand.

|Type|Default|Category|
|---|---|---|
|Boolean|false|Process|

Controls whether to spawn the target sub-process upon the creation of the output or on-demand.
If true, launch the sub-process when the first TenXObject instance is written to its stdin.


### Advanced

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

Arguments to pass to the spawned Fluent Bit  process setting up input.

|Type|Default|Category|
|---|---|---|
|List|\[-c, fluentbit-10x-input.conf\]|Advanced|

List of values to pass as startup arguments to the spawned Fluent Bit  sub-process intended
to set up it's stdin input.


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

Wait time for process to startup.

|Type|Default|Category|
|---|---|---|
|Number|5000|Advanced|

Sets a startup delay wait time in milliseconds before the process is considered available for events.
if provided, will add a wait as part of starting the process before emitting events into it.
max value for this argument is 10,000 (ie 10 seconds).
if [fluentbitOutStartupWaitPattern](https://doc.log10x.com/run/output/event/fluentbit/#fluentbitOutstartupwaitpattern "wait for an output from the process at startup") is also provided, the process will be considered
a failure if the wait time has passed before a line matching [fluentbitOutStartupWaitPattern](https://doc.log10x.com/run/output/event/fluentbit/#fluentbitoutstartupwaitpattern "wait for an output from the process at startup") was emitted.


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

Wait for an output from the process at startup.

|Type|Default|Category|
|---|---|---|
|String|\\\[\\s\*sp\\s\*\]\\s+stream\\s+processor\\s+started\\b|Advanced|

Sets a regex pattern to wait for the process to emit for it to be considered available for events.
if provided, will wait until the process has emitted a line to it's output that matches the regex
before emitting events into it.
if [fluentbitOutStartupWaitMs](https://doc.log10x.com/run/output/event/fluentbit/#fluentbitOutStartupWaitMs "wait time for process to startup") is also provided, will only wait for the specified
wait time, after which if no line was emitted to match the provided regex the process will be considered
a failure.


### Lifecycle

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

Control how to terminate the sub-process on output close.

|Type|Default|Category|
|---|---|---|
|String|graceful|Lifecycle|

Controls how to treat spawned sub-process when this output closes. Possible values:

|Value|Description|
|---|---|
|**graceful** (default)|The sub-process is destroyed gracefully with a timeout period of [fluentbitOutDestroyWait](https://doc.log10x.com/run/output/event/fluentbit/#fluentbitoutdestroywait "duration to wait for spawned sub-process to terminate").|
|**forcible**|Terminates the sub-process immediately.|
|**cached**|The sub-process remains alive for future pipelines that launch the same command and argument combination within the host JVM. A maximum of [fluentbitOutMaxCacheSize](https://doc.log10x.com/run/output/event/fluentbit/#fluentbitoutmaxcachesize "max number of sub-processes to keep alive across subsequent 10x pipeline executions") can be kept alive. Useful for launching shippers (e.g., Filebeat, Fluent Bit) across multiple 10x pipeline runs in a long-living server environment.|


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

Duration to wait for spawned sub-process to terminate.

|Type|Default|Category|
|---|---|---|
|String|""|Lifecycle|

Controls the time duration that the output stream will
wait for the sub-process to terminate gracefully (e.g., '5s').
If the process timeouts, the output will forcibly terminate it. If set to 0,
the output stream will wait indefinitely for the sub-process to terminate.
This value only applies when [fluentbitOutDestroyMode](https://doc.log10x.com/run/output/event/fluentbit/#fluentbitoutdestroymode "control how to terminate the sub-process on output close") is set to `graceful`.


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

Max number of sub-processes to keep alive across subsequent 10x pipeline executions.

|Type|Default|Category|
|---|---|---|
|Number|0|Lifecycle|

Sets the global maximum number of processes that can retained globally
across 10x pipeline executions within the host JVM. This value is useful
when launching shippers (e.g., Filebeat, Fluent Bit) for use
across multiple 10x pipeline executions within a server environment.
This value only applies when [fluentbitOutDestroyMode](https://doc.log10x.com/run/output/event/fluentbit/#fluentbitoutdestroymode "control how to terminate the sub-process on output close") is set to `cached`.
If [fluentbitOutMaxCacheSize](https://doc.log10x.com/run/output/event/fluentbit/#fluentbitoutmaxcachesize "max number of sub-processes to keep alive across subsequent 10x pipeline executions") is set to 0, no caching is performed, and sub-processes
are destroyed gracefully.


### Encoding

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

List of TenXObject field names to encode.

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

Specifies a list of TenXObject intrinsic/calculated/extracted field names to extract and write to the output.


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

A JavaScript expression an TenXObject must evaluate as 'truthy' against to be written to this output.

|Type|Default|Category|
|---|---|---|
|String|""|Encoding|

Specifies a JavaScript expression that an TenXObject must evaluate as truthy to write its
instance/template field values to this output.

For example, to only emit [timestamped](https://doc.log10x.com/api/js/#TenXBaseObject+timestamped "Return true if length of timestamp is greater than 0") TenXObjects, specify:

```yaml
fluentbitOutFilter: this.timestamped
```


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

If true, TenXObject field values specified by \[fluentbitOutFields\](https://doc.log10x.com/run/output/event/fluentbit/#fluentbitoutfields) are encoded to this output.

|Type|Default|Category|
|---|---|---|
|String|true|Encoding|

Determine whether to write [fluentbitOutFields](https://doc.log10x.com/run/output/event/fluentbit/#fluentbitoutfields "list of TenXObject field names to encode") values of an TenXObject passed to this output.
This configuration is typically defined using a JavaScript expression.

To enable/disable the output depending on whether a launch argument, environment variable,
or JVM -D option evaluates as truthy, use:

```yaml
  fluentbitOutWriteObjects: $=TenXEnv.get("myProcCmd")
```

To learn more see [TenXEnv.get](https://doc.log10x.com/api/js/#TenXEnv.get).


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

If true, write new TenXTemplates to this output.

|Type|Default|Category|
|---|---|---|
|String|false|Encoding|

Controls whether to write template values of TenXObjects passed to this output.
The output will only emit TenXTemplates that the pipeline did not load at startup via the[templateFile](https://doc.log10x.com/run/template/#templatefiles "input files or glob patterns containing JSON-encoded TenXTemplates") argument,
and will only emit an TenXTemplate once based on its [templateHash](https://doc.log10x.com/api/js/#TenXBaseObject+templateHash "An alphanumeric encoded value of a 64bit hash of the current object's template field.") value.


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

The output format in which to encode TenXObject values. Possible values:\[json, delimited\].

|Type|Default|Category|
|---|---|---|
|String|delimited|Encoding|

Specifies how to encode [fluentbitOutFields](https://doc.log10x.com/run/output/event/fluentbit/#fluentbitoutfields "list of TenXObject field names to encode") values to this output. Possible values:

- **json**: formats names and values for the current TenXObject as: {"field":"str","field2":1, "field3": true}
- **delimited**: formats values for the current TenXObject as: "str",1,true
  The [fluentbitOutEncodeDelimiter](https://doc.log10x.com/run/output/event/fluentbit/#fluentbitOutencodedelimiter "the delimiter placed between key and values pairs if 'fluentbitOutEncodeType' is 'delimited'") argument determines the separator to use.


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

The line prefix prepended to the encoded event if 'fluentbitOutEncodeType' is 'delimited'.

|Type|Default|Category|
|---|---|---|
|String||Encoding|

Sets the char which is prepended to the emitted TenXObject field values when [fluentbitOutEncodeType](https://doc.log10x.com/run/output/event/fluentbit/#fluentbitoutencodetype "the output format in which to encode TenXObject values. Possible values:[json, delimited]") is `delimited`.


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

The delimiter placed between key and values pairs if 'fluentbitOutEncodeType' is 'delimited'.

|Type|Default|Category|
|---|---|---|
|String| |Encoding|

Sets the char delimiter to separate TenXObject field values when [fluentbitOutEncodeType](https://doc.log10x.com/run/output/event/fluentbit/#fluentbitoutencodetype "the output format in which to encode TenXObject values. Possible values:[json, delimited]") is `delimited`.


<br/>:material-github: This module is defined in [fluentbit/module.yaml](https://github.com/log-10x/modules/tree/main/pipelines/run/modules/output/event/fluentbit/module.yaml "fluentbit/module.yaml"){target="\_blank"}.

