From 2bcc21b2d7b4cda9e359471d97e396d4d5088c53 Mon Sep 17 00:00:00 2001 From: Patrick Stephens Date: Tue, 13 Jan 2026 12:20:32 +0000 Subject: [PATCH 1/8] refactor: rename to Telemetry Forge Signed-off-by: Patrick Stephens --- .github/workflows/README.md | 22 ++-- .github/workflows/build.yaml | 38 +++--- .github/workflows/call-build-containers.yaml | 30 ++--- .../workflows/call-build-linux-packages.yaml | 4 +- .../workflows/call-build-macos-packages.yaml | 8 +- .../call-build-windows-packages.yaml | 14 +-- .../call-publish-release-images.yaml | 8 +- .../workflows/call-test-containers-k8s.yaml | 8 +- .github/workflows/call-test-containers.yaml | 16 +-- .github/workflows/call-test-packages.yaml | 10 +- .github/workflows/lint-packages.yaml | 6 +- .github/workflows/pr-comment-build.yaml | 2 +- .github/workflows/test.yaml | 4 +- .github/workflows/unit-tests.yaml | 4 +- .github/workflows/update-version.yaml | 2 +- CODEOWNERS | 2 +- Dockerfile.debian | 42 +++---- Dockerfile.ubi | 50 ++++---- README.md | 59 +++++---- ...uentdo-agent-logo.jpeg => agent-logo.jpeg} | Bin install.sh | 96 +++++++-------- scripts/add-ignored-files.sh | 2 +- scripts/centos6-init-check.sh | 4 +- scripts/common.sh | 2 +- scripts/create-sync-pr.sh | 16 +-- scripts/setup-code.sh | 36 +++--- scripts/sync-upstream-patches.sh | 10 +- scripts/update-version.sh | 22 ++-- source/CMakeLists.txt | 26 ++-- source/cmake/plugins_options.cmake | 4 +- source/cmake/version.rc.in | 8 +- source/cpack/description | 2 +- source/cpack/scripts/sysv-init-install.sh | 4 +- .../include/fluent-bit/flb_graphql_client.h | 7 +- source/include/fluent-bit/flb_version.h.in | 10 +- source/init/az2-systemd.in | 2 +- source/init/systemd.in | 2 +- source/init/sysvinit.in | 2 +- source/init/upstart.in | 2 +- source/packaging/build.sh | 16 +-- source/packaging/distros/almalinux/Dockerfile | 2 +- .../packaging/distros/amazonlinux/Dockerfile | 2 +- .../packaging/distros/azurelinux/Dockerfile | 2 +- source/packaging/distros/centos/6/Dockerfile | 2 +- source/packaging/distros/centos/7/Dockerfile | 2 +- source/packaging/distros/centos/Dockerfile | 2 +- source/packaging/distros/debian/Dockerfile | 14 +-- source/packaging/distros/mariner/Dockerfile | 2 +- .../packaging/distros/rockylinux/Dockerfile | 2 +- source/packaging/distros/suse/Dockerfile | 2 +- source/packaging/distros/ubuntu/Dockerfile | 2 +- source/plugins/CMakeLists.txt | 4 +- source/plugins/custom_fluentdo/CMakeLists.txt | 7 -- .../custom_telemetryforge/CMakeLists.txt | 7 ++ .../telemetryforge.c} | 66 +++++----- .../telemetryforge.h} | 4 +- source/plugins/in_fluentdo/CMakeLists.txt | 5 - .../plugins/in_telemetryforge/CMakeLists.txt | 5 + .../telemetryforge.c} | 114 +++++++++--------- .../telemetryforge.h} | 4 +- source/src/flb_engine.c | 2 +- testing/bats/helpers/test-helpers.bash | 10 +- testing/bats/run-bats.sh | 12 +- .../bats/run-container-integration-tests.sh | 4 +- testing/bats/run-k8s-integration-tests.sh | 12 +- testing/bats/run-package-functional-tests.sh | 10 +- testing/bats/run-package-integration-tests.sh | 2 +- .../bats/tests/functional/common/simple.bats | 8 +- .../tests/functional/linux/verify-deb.bats | 6 +- .../tests/functional/linux/verify-files.bats | 24 ++-- .../tests/functional/linux/verify-rpm.bats | 6 +- .../integration-simple-containers.bats | 22 ++-- .../integration/k8s/chunk-rollover/basic.bats | 4 +- .../integration/k8s/elasticsearch/basic.bats | 4 +- .../k8s/elasticsearch/compress.bats | 4 +- .../k8s/integration-basic-helm.bats | 4 +- .../integration/k8s/integration-systemd.bats | 4 +- .../kubernetes-plugins/namespaceLabels.bats | 4 +- .../k8s/kubernetes-plugins/podLabels.bats | 4 +- .../integration/k8s/opensearch/basic.bats | 4 +- .../integration/k8s/opensearch/hosted.bats | 4 +- .../linux/integration-install-script.bats | 14 +-- .../linux/integration-install-targets.bats | 18 +-- 83 files changed, 517 insertions(+), 521 deletions(-) rename extras/{fluentdo-agent-logo.jpeg => agent-logo.jpeg} (100%) delete mode 100644 source/plugins/custom_fluentdo/CMakeLists.txt create mode 100644 source/plugins/custom_telemetryforge/CMakeLists.txt rename source/plugins/{custom_fluentdo/fluentdo.c => custom_telemetryforge/telemetryforge.c} (69%) rename source/plugins/{custom_fluentdo/fluentdo.h => custom_telemetryforge/telemetryforge.h} (92%) delete mode 100644 source/plugins/in_fluentdo/CMakeLists.txt create mode 100644 source/plugins/in_telemetryforge/CMakeLists.txt rename source/plugins/{in_fluentdo/fluentdo.c => in_telemetryforge/telemetryforge.c} (87%) rename source/plugins/{in_fluentdo/fluentdo.h => in_telemetryforge/telemetryforge.h} (92%) diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 2c4e54f1..c887e898 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -1,8 +1,8 @@ # GitHub Actions CI/CD Documentation -This directory contains the GitHub Actions workflows and reusable actions for the FluentDo Agent project. The CI/CD pipeline automates building, testing, packaging, and releasing the agent across multiple platforms. +This directory contains the GitHub Actions workflows and reusable actions for the Agent project. The CI/CD pipeline automates building, testing, packaging, and releasing the agent across multiple platforms. -[![Coverage Status](https://coveralls.io/repos/github/FluentDo/agent/badge.svg)](https://coveralls.io/github/FluentDo/agent) +[![Coverage Status](https://coveralls.io/repos/github/telemetryforge/agent/badge.svg)](https://coveralls.io/github/telemetryforge/agent) ## Table of Contents @@ -72,7 +72,7 @@ The CI/CD pipeline is designed to: - Push of version tags (`v*`) - Manual workflow dispatch -**Purpose:** Main CI/CD workflow that orchestrates building, testing, and releasing the FluentDo Agent. +**Purpose:** Main CI/CD workflow that orchestrates building, testing, and releasing the Agent. **Jobs:** @@ -100,7 +100,7 @@ The CI/CD pipeline is designed to: **Outputs:** -- Container images pushed to `ghcr.io/fluentdo/agent` +- Container images pushed to `ghcr.io/telemetryforge/agent` - Linux packages (DEB, RPM) - Windows packages (EXE, MSI, ZIP) - macOS packages (PKG) @@ -196,7 +196,7 @@ The CI/CD pipeline is designed to: **Inputs:** -- `image` - Full image name (default: `ghcr.io/fluentdo/agent`) +- `image` - Full image name (default: `ghcr.io/telemetryforge/agent`) - `image-tag` - Image tag to test (required) - `ref` - Repository reference to use (default: `main`) @@ -548,8 +548,8 @@ The CI/CD pipeline is designed to: **Key Features:** -- UBI image promotion to `ghcr.io/fluentdo/agent:version` -- Debian image promotion to `ghcr.io/fluentdo/agent:version-slim` +- UBI image promotion to `ghcr.io/telemetryforge/agent:version` +- Debian image promotion to `ghcr.io/telemetryforge/agent:version-slim` - Red Hat certification submission - Skopeo for multi-arch image copying - Preflight validation before submission @@ -873,9 +873,9 @@ Example structure: Common environment variables used across workflows: -- `FLUENTDO_AGENT_VERSION` - Version being built -- `FLUENTDO_AGENT_IMAGE` - Container image name -- `FLUENTDO_AGENT_TAG` - Container image tag +- `TELEMETRY_FORGE_AGENT_VERSION` - Version being built +- `TELEMETRY_FORGE_AGENT_IMAGE` - Container image name +- `TELEMETRY_FORGE_AGENT_TAG` - Container image tag - `FLUENT_BIT_BINARY` - Path to Fluent Bit binary for testing - `FLB_NIGHTLY_BUILD` - Nightly build information - `VCPKG_BUILD_TYPE` - vcpkg build type (Windows) @@ -970,6 +970,6 @@ When adding new workflows: For issues or questions: -- GitHub Issues: +- GitHub Issues: - Documentation: - Email: diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index ff363bb4..3a7df5de 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -62,7 +62,7 @@ jobs: # Look for the default line in the Dockerfile id: set-version run: | - VERSION=$(grep "ARG FLUENTDO_AGENT_VERSION=" Dockerfile.ubi | cut -d '=' -s -f 2 -) + VERSION=$(grep "ARG TELEMETRY_FORGE_AGENT_VERSION=" Dockerfile.ubi | cut -d '=' -s -f 2 -) # For releases we use the tag if [[ '${{ steps.set-build-type.outputs.build-type }}' == 'release' ]]; then TAG_NAME=${GITHUB_REF#refs/tags/} @@ -106,8 +106,8 @@ jobs: fail-fast: false matrix: image-base: - - "ghcr.io/fluentdo/agent/ubi" - - "ghcr.io/fluentdo/agent/debian" + - "ghcr.io/telemetryforge/agent/ubi" + - "ghcr.io/telemetryforge/agent/debian" permissions: contents: read packages: write @@ -174,8 +174,8 @@ jobs: ref: ${{ github.ref }} nightly-build-info: ${{ needs.get-meta.outputs.date }} - # We want to copy the UBI image to ghcr.io/fluentdo/agent:version and - # the distroless image to ghcr.io/fluentdo/agent:version-slim + # We want to copy the UBI image to ghcr.io/telemetryforge/agent:version and + # the distroless image to ghcr.io/telemetryforge/agent:version-slim copy-common-images: # Only run for releases to reduce unnecessary load on the registry if: ${{ startsWith(github.ref, 'refs/tags/v') }} @@ -211,8 +211,8 @@ jobs: fail-fast: false matrix: image-base: - - "ghcr.io/fluentdo/agent/ubi" - - "ghcr.io/fluentdo/agent/debian" + - "ghcr.io/telemetryforge/agent/ubi" + - "ghcr.io/telemetryforge/agent/debian" test-packages: name: Test packages @@ -248,7 +248,7 @@ jobs: - build-image - test-containers # TODO: remove once failures are resolved to ensure auto-release job still goes ahead with latest commit - # https://github.com/FluentDo/agent/issues/73 + # https://github.com/telemetryforge/agent/issues/73 # - test-packages # Add additional jobs here as required that must complete runs-on: ubuntu-latest @@ -284,8 +284,8 @@ jobs: contents: write id-token: write env: - UBI_IMAGE_NAME: ghcr.io/fluentdo/agent/ubi - DISTROLESS_IMAGE_NAME: ghcr.io/fluentdo/agent/debian + UBI_IMAGE_NAME: ghcr.io/telemetryforge/agent/ubi + DISTROLESS_IMAGE_NAME: ghcr.io/telemetryforge/agent/debian TAG: ${{ needs.build-image.outputs.version }} steps: - uses: actions/checkout@v6 @@ -378,15 +378,15 @@ jobs: --remove-signatures \ --src-creds "${{ github.actor }}:${{ secrets.GITHUB_TOKEN }}" \ "docker://${{ env.UBI_IMAGE_NAME }}:${{ env.TAG }}" \ - "oci-archive:output/fluentdo-agent-container.tar" + "oci-archive:output/telemetryforge-agent-container.tar" skopeo copy \ --all \ --remove-signatures \ --src-creds "${{ github.actor }}:${{ secrets.GITHUB_TOKEN }}" \ "docker://${{ env.DISTROLESS_IMAGE_NAME }}:${{ env.TAG }}" \ - "oci-archive:output/fluentdo-agent-container-slim.tar" - tar -czvf output/fluentdo-agent-container.tar.gz output/fluentdo-agent-container.tar output/fluentdo-agent-container-slim.tar - rm -f output/fluentdo-agent-container.tar output/fluentdo-agent-container-slim.tar + "oci-archive:output/telemetryforge-agent-container-slim.tar" + tar -czvf output/telemetryforge-agent-container.tar.gz output/telemetryforge-agent-container.tar output/telemetryforge-agent-container-slim.tar + rm -f output/telemetryforge-agent-container.tar output/telemetryforge-agent-container-slim.tar shell: bash - name: Construct release info @@ -426,7 +426,7 @@ jobs: with: append_body: true body: | - Fluent Do Agent release for ${{ github.ref_name }} version + Telemetry Forge Agent release for ${{ github.ref_name }} version Version: ${{ needs.get-meta.outputs.version }} OSS Version: ${{ needs.get-meta.outputs.oss-version }} @@ -443,7 +443,7 @@ jobs: *.spdx output/*.json deliverables.tar.gz - output/fluentdo-agent-container.tar.gz + output/telemetryforge-agent-container.tar.gz output/package-macos-* output/package-windows-* fail_on_unmatched_files: false @@ -462,7 +462,7 @@ jobs: uses: google-github-actions/upload-cloud-storage@v3 with: path: output/ - destination: fluentdo-agent-${{ needs.get-meta.outputs.build-type }}/${{ needs.get-meta.outputs.version }}/ + destination: telemetryforge-agent-${{ needs.get-meta.outputs.build-type }}/${{ needs.get-meta.outputs.version }}/ update-docs: needs: @@ -470,7 +470,7 @@ jobs: - release if: ${{ startsWith(github.ref, 'refs/tags/v') }} name: Update documentation on release - uses: fluentdo/documentation/.github/workflows/call-add-mapping-version.yaml@main + uses: telemetryforge/documentation/.github/workflows/call-add-mapping-version.yaml@main with: agent-version: ${{ needs.get-meta.outputs.version }} oss-version: ${{ needs.get-meta.outputs.oss-version }} @@ -482,7 +482,7 @@ jobs: - get-meta - release - build-macos - uses: fluentdo/homebrew-fluentdo-agent/.github/workflows/call-update-homebrew.yaml@main + uses: telemetryforge/homebrew-telemetryforge-agent/.github/workflows/call-update-homebrew.yaml@main with: version: ${{ github.ref_name }} secrets: diff --git a/.github/workflows/call-build-containers.yaml b/.github/workflows/call-build-containers.yaml index 16aee42a..fd54a8d0 100644 --- a/.github/workflows/call-build-containers.yaml +++ b/.github/workflows/call-build-containers.yaml @@ -16,7 +16,7 @@ on: description: The base name to use for images. required: false type: string - default: "ghcr.io/fluentdo/agent" + default: "ghcr.io/telemetryforge/agent" definition: description: The Dockerfile definition to use. required: false @@ -26,7 +26,7 @@ on: description: The Dockerhub username to use for authenticated pulls. required: false type: string - default: "fluentdo" + default: "telemetryforge" amd-runner-label: description: The label to use for the runner (if not specified then the default ubuntu-latest or equivalent is used). required: false @@ -76,7 +76,7 @@ jobs: - name: Checkout code uses: actions/checkout@v6 with: - repository: FluentDo/agent + repository: telemetryforge/agent ref: ${{ inputs.ref }} fetch-depth: 0 @@ -84,7 +84,7 @@ jobs: run: ./scripts/setup-code.sh shell: bash env: - FLUENTDO_AGENT_VERSION: ${{ inputs.version }} + TELEMETRY_FORGE_AGENT_VERSION: ${{ inputs.version }} - name: Deltas run: git diff @@ -120,15 +120,15 @@ jobs: labels: | build-date={{date 'YYYYMMDD-HHmmss'}} version=${{ inputs.version }} - io.k8s.description=FluentDo Agent is a stable, secure by default, OSS (Apache-licensed) downstream distribution of Fluent Bit with predictable releases and long-term supported versions for 24 months. - io.k8s.display-name=FluentDo Agent - io.openshift.tags=observability,logging,log-aggregation,fluentdo,fluent-bit - url=https://fluent.do - vendor=FluentDo at https://fluent.do - maintainer=FluentDo via info@fluent.do - name=FluentDo Agent - description=FluentDo Agent is a stable, secure by default, OSS (Apache-licensed) downstream distribution of Fluent Bit with predictable releases and long-term supported versions for 24 months. - summary=FluentDo Agent is an Enterprise hardened version of Fluent Bit + io.k8s.description=Telemetry Forge Agent is a stable, secure by default, OSS (Apache-licensed) downstream distribution of Fluent Bit with predictable releases and long-term supported versions for 24 months. + io.k8s.display-name=Telemetry Forge Agent + io.openshift.tags=observability,logging,log-aggregation,telemetryforge,fluent-bit + url=https://telemetryforge.io + vendor=Telemetry Forge at https://telemetryforge.io + maintainer=Telemetry Forge via info@fluent.do + name=Telemetry Forge Agent + description=Telemetry Forge Agent is a stable, secure by default, OSS (Apache-licensed) downstream distribution of Fluent Bit with predictable releases and long-term supported versions for 24 months. + summary=Telemetry Forge Agent is an Enterprise hardened version of Fluent Bit - name: Build and push by digest the standard ${{ matrix.target }} image id: production @@ -143,7 +143,7 @@ jobs: # Make sure we push our custom labels to the image labels: ${{ steps.meta.outputs.labels }} build-args: | - FLUENTDO_AGENT_VERSION=${{ inputs.version }} + TELEMETRY_FORGE_AGENT_VERSION=${{ inputs.version }} provenance: false - name: Export ${{ matrix.target }} digest @@ -199,7 +199,7 @@ jobs: platforms: linux/amd64 target: test build-args: | - FLUENTDO_AGENT_VERSION=${{ inputs.version }} + TELEMETRY_FORGE_AGENT_VERSION=${{ inputs.version }} provenance: false push: true tags: ${{ steps.meta-test.outputs.tags }} diff --git a/.github/workflows/call-build-linux-packages.yaml b/.github/workflows/call-build-linux-packages.yaml index 95886fb7..49f5046d 100644 --- a/.github/workflows/call-build-linux-packages.yaml +++ b/.github/workflows/call-build-linux-packages.yaml @@ -68,13 +68,13 @@ jobs: uses: actions/checkout@v6 with: ref: ${{ inputs.ref }} - repository: FluentDo/agent + repository: telemetryforge/agent - name: Ensure we apply specific version from tag run: ./scripts/setup-code.sh shell: bash env: - FLUENTDO_AGENT_VERSION: ${{ inputs.version }} + TELEMETRY_FORGE_AGENT_VERSION: ${{ inputs.version }} - name: Deltas run: git diff diff --git a/.github/workflows/call-build-macos-packages.yaml b/.github/workflows/call-build-macos-packages.yaml index 827c370e..126fbfa5 100644 --- a/.github/workflows/call-build-macos-packages.yaml +++ b/.github/workflows/call-build-macos-packages.yaml @@ -38,7 +38,7 @@ jobs: uses: actions/checkout@v6 with: ref: ${{ inputs.ref }} - repository: FluentDo/agent + repository: telemetryforge/agent - name: Install dependencies run: | @@ -65,7 +65,7 @@ jobs: run: ./scripts/setup-code.sh shell: bash env: - FLUENTDO_AGENT_VERSION: ${{ inputs.version }} + TELEMETRY_FORGE_AGENT_VERSION: ${{ inputs.version }} - name: Ensure we have a build directory run: mkdir -p source/build @@ -93,7 +93,7 @@ jobs: - name: Check linkage continue-on-error: true run: | - DYLD_PRINT_LIBRARIES=1 DYLD_PRINT_LIBRARIES_POST_LAUNCH=1 DYLD_PRINT_RPATHS=1 bin/fluentdo-agent --dry-run + DYLD_PRINT_LIBRARIES=1 DYLD_PRINT_LIBRARIES_POST_LAUNCH=1 DYLD_PRINT_RPATHS=1 bin/telemetryforge-agent --dry-run working-directory: source/build - name: Upload build packages @@ -101,5 +101,5 @@ jobs: with: name: package-macos-${{ matrix.config.package }} path: | - source/build/fluentdo-agent-*.pkg + source/build/telemetryforge-agent-*.pkg if-no-files-found: error diff --git a/.github/workflows/call-build-windows-packages.yaml b/.github/workflows/call-build-windows-packages.yaml index a9a0c1d1..ee8dffe4 100644 --- a/.github/workflows/call-build-windows-packages.yaml +++ b/.github/workflows/call-build-windows-packages.yaml @@ -42,13 +42,13 @@ jobs: uses: actions/checkout@v6 with: ref: ${{ inputs.ref }} - repository: FluentDo/agent + repository: telemetryforge/agent - name: Ensure we apply specific version from tag run: ./scripts/setup-code.sh shell: bash env: - FLUENTDO_AGENT_VERSION: ${{ inputs.version }} + TELEMETRY_FORGE_AGENT_VERSION: ${{ inputs.version }} - name: Deltas run: git diff @@ -144,8 +144,8 @@ jobs: -DFLB_LIBYAML_DIR='C:\vcpkg\installed\${{ matrix.config.vcpkg_triplet }}' ` -DLIBGIT2_INCLUDE_DIR='C:\vcpkg\installed\${{ matrix.config.vcpkg_triplet }}\include' ` -DLIBGIT2_LIBRARY='C:\vcpkg\installed\${{ matrix.config.vcpkg_triplet }}\lib\git2.lib' ` - -DFLUENTDO_AGENT_DISTRO=${{ matrix.config.distro }} ` - -DFLUENTDO_AGENT_PACKAGE_TYPE=PACKAGE ` + -DTELEMETRY_FORGE_AGENT_DISTRO=${{ matrix.config.distro }} ` + -DTELEMETRY_FORGE_AGENT_PACKAGE_TYPE=PACKAGE ` -DFLB_IN_CALYPTIA_FLEET=Off ` -DFLB_IN_DOCKER=Off ` -DFLB_IN_DOCKER_EVENTS=Off ` @@ -185,7 +185,7 @@ jobs: with: name: package-windows-${{ matrix.config.arch }} path: | - source/build/fluentdo-agent-*.exe - source/build/fluentdo-agent-*.msi - source/build/fluentdo-agent-*.zip + source/build/telemetryforge-agent-*.exe + source/build/telemetryforge-agent-*.msi + source/build/telemetryforge-agent-*.zip if-no-files-found: error diff --git a/.github/workflows/call-publish-release-images.yaml b/.github/workflows/call-publish-release-images.yaml index 2f46aed8..f3373e07 100644 --- a/.github/workflows/call-publish-release-images.yaml +++ b/.github/workflows/call-publish-release-images.yaml @@ -10,8 +10,8 @@ on: github-token: required: true env: - UBI_IMAGE_NAME: ghcr.io/fluentdo/agent/ubi - DISTROLESS_IMAGE_NAME: ghcr.io/fluentdo/agent/debian + UBI_IMAGE_NAME: ghcr.io/telemetryforge/agent/ubi + DISTROLESS_IMAGE_NAME: ghcr.io/telemetryforge/agent/debian jobs: promote-ghcr-images: name: Promote container images to top-level ghcr.io registries @@ -20,7 +20,7 @@ jobs: contents: read packages: write env: - OUTPUT_IMAGE_NAME: ghcr.io/fluentdo/agent + OUTPUT_IMAGE_NAME: ghcr.io/telemetryforge/agent TAG: ${{ inputs.version }} steps: - name: Log in to the Container registry @@ -72,7 +72,7 @@ jobs: id-token: write env: # We must match up the official image we have used for publishing upstream - RHEL_SOURCE_IMAGE: ghcr.io/fluentdo/agent + RHEL_SOURCE_IMAGE: ghcr.io/telemetryforge/agent needs: # We must use the top-level image here - see above - promote-ghcr-images diff --git a/.github/workflows/call-test-containers-k8s.yaml b/.github/workflows/call-test-containers-k8s.yaml index f7f2d5e3..5e5e5b30 100644 --- a/.github/workflows/call-test-containers-k8s.yaml +++ b/.github/workflows/call-test-containers-k8s.yaml @@ -10,7 +10,7 @@ on: image: description: The full image name to test. required: false - default: "ghcr.io/fluentdo/agent" + default: "ghcr.io/telemetryforge/agent" type: string image-tag: description: The image tag to test. @@ -29,14 +29,14 @@ jobs: name: Test K8S version ${{ inputs.kind-version }} with ${{ inputs.image }}:${{ inputs.image-tag }} runs-on: ubuntu-latest env: - FLUENTDO_AGENT_IMAGE: ${{ inputs.image }} - FLUENTDO_AGENT_TAG: ${{ inputs.image-tag }} + TELEMETRY_FORGE_AGENT_IMAGE: ${{ inputs.image }} + TELEMETRY_FORGE_AGENT_TAG: ${{ inputs.image-tag }} KIND_VERSION: ${{ inputs.kind-version }} steps: - name: Checkout code uses: actions/checkout@v6 with: - repository: FluentDo/agent + repository: telemetryforge/agent ref: ${{ inputs.ref || github.ref }} token: ${{ secrets.github-token }} diff --git a/.github/workflows/call-test-containers.yaml b/.github/workflows/call-test-containers.yaml index 9fefba69..04a8ba8f 100644 --- a/.github/workflows/call-test-containers.yaml +++ b/.github/workflows/call-test-containers.yaml @@ -10,7 +10,7 @@ on: image: description: The full image name to test. required: false - default: "ghcr.io/fluentdo/agent" + default: "ghcr.io/telemetryforge/agent" type: string image-tag: description: The image tag to test. @@ -32,7 +32,7 @@ jobs: - name: Checkout code uses: actions/checkout@v6 with: - repository: FluentDo/agent + repository: telemetryforge/agent ref: ${{ inputs.ref || github.ref }} - name: Extract the configuration from the JSON file @@ -49,14 +49,14 @@ jobs: name: Run BATS tests for ${{ inputs.image }}/test:${{ inputs.image-tag }} runs-on: ubuntu-latest env: - FLUENTDO_AGENT_TAG: ${{ inputs.image-tag }} + TELEMETRY_FORGE_AGENT_TAG: ${{ inputs.image-tag }} permissions: packages: read steps: - name: Checkout code uses: actions/checkout@v6 with: - repository: FluentDo/agent + repository: telemetryforge/agent ref: ${{ inputs.ref || github.ref }} token: ${{ secrets.github-token }} @@ -68,11 +68,11 @@ jobs: password: ${{ secrets.github-token }} - name: Run all functional BATS tests - run: docker run --rm -t "${FLUENTDO_AGENT_IMAGE}:${FLUENTDO_AGENT_TAG}" + run: docker run --rm -t "${TELEMETRY_FORGE_AGENT_IMAGE}:${TELEMETRY_FORGE_AGENT_TAG}" shell: bash env: # Use the BATS functional test image here - FLUENTDO_AGENT_IMAGE: ${{ inputs.image }}/test + TELEMETRY_FORGE_AGENT_IMAGE: ${{ inputs.image }}/test - name: Install BATS uses: bats-core/bats-action@3.0.1 @@ -91,7 +91,7 @@ jobs: shell: bash env: # We use the actual image here for testing against - FLUENTDO_AGENT_IMAGE: ${{ inputs.image }} + TELEMETRY_FORGE_AGENT_IMAGE: ${{ inputs.image }} # allow for some parallelity without GNU parallel, since it is not installed by default BATS_NO_PARALLELIZE_ACROSS_FILES: 1 BATS_NUMBER_OF_PARALLEL_JOBS: 4 @@ -106,7 +106,7 @@ jobs: - name: Checkout code uses: actions/checkout@v6 with: - repository: FluentDo/agent + repository: telemetryforge/agent ref: ${{ inputs.ref || github.ref }} token: ${{ secrets.github-token }} diff --git a/.github/workflows/call-test-packages.yaml b/.github/workflows/call-test-packages.yaml index 64b93952..88865aad 100644 --- a/.github/workflows/call-test-packages.yaml +++ b/.github/workflows/call-test-packages.yaml @@ -19,7 +19,7 @@ on: description: The Dockerhub username to use for authenticated pulls. required: false type: string - default: "fluentdo" + default: "telemetryforge" amd-runner-label: description: The label to use for the runner. required: false @@ -33,7 +33,7 @@ on: description: The Dockerhub token to use for authenticated pulls (not pushes). required: true env: - FLUENTDO_AGENT_VERSION: ${{ inputs.version }} + TELEMETRY_FORGE_AGENT_VERSION: ${{ inputs.version }} jobs: # This job converts the JSON build-matrix coming in to a matrix of test jobs. # We convert using the following rules: @@ -114,7 +114,7 @@ jobs: - name: Checkout code uses: actions/checkout@v6 with: - repository: FluentDo/agent + repository: telemetryforge/agent ref: ${{ inputs.ref }} - name: Log in to Dockerhub @@ -175,7 +175,7 @@ jobs: package-type: deb package: package-ubuntu-24.04 name: ubuntu - binary: /opt/fluentdo-agent/bin/fluent-bit + binary: /opt/telemetryforge-agent/bin/fluent-bit # - runner: windows-latest # package-type: msi # package: package-windows @@ -187,7 +187,7 @@ jobs: - name: Checkout code uses: actions/checkout@v6 with: - repository: FluentDo/agent + repository: telemetryforge/agent ref: ${{ inputs.ref }} # Must be removed on Namespace runners diff --git a/.github/workflows/lint-packages.yaml b/.github/workflows/lint-packages.yaml index f7ce52a2..f150f592 100644 --- a/.github/workflows/lint-packages.yaml +++ b/.github/workflows/lint-packages.yaml @@ -42,13 +42,13 @@ jobs: - name: List contents continue-on-error: true - run: find "downloads/" -name 'fluentdo-agent_*_amd64.deb' -exec dpkg -c {} \; + run: find "downloads/" -name 'telemetryforge-agent_*_amd64.deb' -exec dpkg -c {} \; shell: bash - name: List control files continue-on-error: true run: | - find "downloads/" -name 'fluentdo-agent_*_amd64.deb' -exec dpkg -e {} \; + find "downloads/" -name 'telemetryforge-agent_*_amd64.deb' -exec dpkg -e {} \; ls -lRh DEBIAN/ shell: bash @@ -59,5 +59,5 @@ jobs: shell: bash - name: Run Lintian - run: find "downloads/" -name 'fluentdo-agent_*_amd64.deb' -exec lintian --fail-on=error --cfg $PWD/.lintian -c {} \; + run: find "downloads/" -name 'telemetryforge-agent_*_amd64.deb' -exec lintian --fail-on=error --cfg $PWD/.lintian -c {} \; shell: bash diff --git a/.github/workflows/pr-comment-build.yaml b/.github/workflows/pr-comment-build.yaml index 80a7018d..f33fde15 100644 --- a/.github/workflows/pr-comment-build.yaml +++ b/.github/workflows/pr-comment-build.yaml @@ -115,7 +115,7 @@ jobs: id: set-version run: | set -euo pipefail - VERSION=$(grep "ARG FLUENTDO_AGENT_VERSION=" Dockerfile.ubi | cut -d '=' -s -f 2 -) + VERSION=$(grep "ARG TELEMETRY_FORGE_AGENT_VERSION=" Dockerfile.ubi | cut -d '=' -s -f 2 -) echo "Using version: $VERSION" echo "version=$VERSION" >> $GITHUB_OUTPUT shell: bash diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 259c13db..e780eb0a 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -5,7 +5,7 @@ on: image: description: The full image name to test. required: false - default: "ghcr.io/fluentdo/agent" + default: "ghcr.io/telemetryforge/agent" type: string image-tag: description: The image tag to test. @@ -28,7 +28,7 @@ jobs: - name: Checkout code uses: actions/checkout@v6 with: - repository: FluentDo/agent + repository: telemetryforge/agent ref: ${{ github.event.inputs.ref || github.ref }} - name: Extract the configuration from the JSON file id: set-meta diff --git a/.github/workflows/unit-tests.yaml b/.github/workflows/unit-tests.yaml index 721b9561..e1e5d211 100644 --- a/.github/workflows/unit-tests.yaml +++ b/.github/workflows/unit-tests.yaml @@ -100,7 +100,7 @@ jobs: CMAKE_BUILD_TYPE=Debug CMAKE_EXPORT_COMPILE_COMMANDS=On - FLUENTDO_AGENT_TESTS=On + TELEMETRY_FORGE_AGENT_TESTS=On FLB_TESTS_INTERNAL=On FLB_TESTS_RUNTIME=On @@ -138,7 +138,7 @@ jobs: gcovr --object-directory . --root .. --gcov-ignore-parse-errors --gcov-ignore-errors \ --sort uncovered-percent \ --xml=cobertura.xml \ - --html=coverage.html --html-title='FluentDo Agent Test Coverage Report' \ + --html=coverage.html --html-title='Agent Test Coverage Report' \ --json=coverage.json \ --txt=coverage.txt \ --print-summary diff --git a/.github/workflows/update-version.yaml b/.github/workflows/update-version.yaml index 7d712f7a..e2dd1e89 100644 --- a/.github/workflows/update-version.yaml +++ b/.github/workflows/update-version.yaml @@ -134,7 +134,7 @@ jobs: run: ./scripts/update-version.sh shell: bash env: - NEW_FLUENTDO_AGENT_VERSION: ${{ steps.get-version.outputs.next_tag }} + NEW_TELEMETRY_FORGE_AGENT_VERSION: ${{ steps.get-version.outputs.next_tag }} - name: Debug run: | diff --git a/CODEOWNERS b/CODEOWNERS index cca97048..769c63b2 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1 +1 @@ -* @FluentDo/fluentdo-agent-contributors +* @telemetryforge/agent-contributors diff --git a/Dockerfile.debian b/Dockerfile.debian index ab519df1..9df9cedb 100644 --- a/Dockerfile.debian +++ b/Dockerfile.debian @@ -43,15 +43,15 @@ ENV FLUENTBIT_VERSION=$FLUENT_BIT_VERSION ARG FLB_NIGHTLY_BUILD ENV FLB_NIGHTLY_BUILD=$FLB_NIGHTLY_BUILD -ARG FLUENTDO_AGENT_VERSION=26.1.3 -ENV FLUENTDO_AGENT_VERSION=${FLUENTDO_AGENT_VERSION} +ARG TELEMETRY_FORGE_AGENT_VERSION=26.1.3 +ENV TELEMETRY_FORGE_AGENT_VERSION=${TELEMETRY_FORGE_AGENT_VERSION} # Build metadata -ARG FLUENTDO_AGENT_DISTRO=debian/trixie -ENV FLUENTDO_AGENT_DISTRO=$FLUENTDO_AGENT_DISTRO +ARG TELEMETRY_FORGE_AGENT_DISTRO=debian/trixie +ENV TELEMETRY_FORGE_AGENT_DISTRO=$TELEMETRY_FORGE_AGENT_DISTRO -ARG FLUENTDO_AGENT_PACKAGE_TYPE=CONTAINER -ENV FLUENTDO_AGENT_PACKAGE_TYPE=$FLUENTDO_AGENT_PACKAGE_TYPE +ARG TELEMETRY_FORGE_AGENT_PACKAGE_TYPE=CONTAINER +ENV TELEMETRY_FORGE_AGENT_PACKAGE_TYPE=$TELEMETRY_FORGE_AGENT_PACKAGE_TYPE # Copy any local source files as needed WORKDIR /source/ @@ -59,17 +59,17 @@ COPY source/ /source/ # Some components assume a git repository is present, so we create one otherwise it fails RUN git init -q /source/ && \ - git config user.name "Fluent Do Agent Builder" && \ + git config user.name "Telemetry Forge Agent Builder" && \ git config user.email "info@fluent.do" && \ git add -A && \ - git commit -q -a -m "Initial commit for Fluent Do Agent" + git commit -q -a -m "Initial commit for Telemetry Forge Agent" # Install and create all necessary directories -RUN mkdir -p /fluent-bit/bin /fluent-bit/etc /fluent-bit/log /opt/fluentdo-agent/etc/ +RUN mkdir -p /fluent-bit/bin /fluent-bit/etc /fluent-bit/log /opt/telemetryforge-agent/etc/ COPY source/conf/ /fluent-bit/etc/ -COPY source/conf/ /opt/fluentdo-agent/etc/ +COPY source/conf/ /opt/telemetryforge-agent/etc/ COPY config/ /fluent-bit/etc/ -COPY config/ /opt/fluentdo-agent/etc/ +COPY config/ /opt/telemetryforge-agent/etc/ # Separate layers now for configure and build to allow local caching FROM source-builder AS builder @@ -89,9 +89,9 @@ RUN cmake -DCMAKE_BUILD_TYPE=Release \ -DFLB_TESTS_INTERNAL=Off \ -DFLB_TESTS_RUNTIME=Off \ -DFLB_NIGHTLY_BUILD="$FLB_NIGHTLY_BUILD" \ - -DFLUENTDO_AGENT_VERSION="$FLUENTDO_AGENT_VERSION" \ - -DFLUENTDO_AGENT_DISTRO="$FLUENTDO_AGENT_DISTRO" \ - -DFLUENTDO_AGENT_PACKAGE_TYPE="$FLUENTDO_AGENT_PACKAGE_TYPE" \ + -DTELEMETRY_FORGE_AGENT_VERSION="$TELEMETRY_FORGE_AGENT_VERSION" \ + -DTELEMETRY_FORGE_AGENT_DISTRO="$TELEMETRY_FORGE_AGENT_DISTRO" \ + -DTELEMETRY_FORGE_AGENT_PACKAGE_TYPE="$TELEMETRY_FORGE_AGENT_PACKAGE_TYPE" \ -DFLB_LOG_NO_CONTROL_CHARS=On \ -DFLB_CORO_STACK_SIZE=131072 \ -DFLB_IN_EXEC=Off \ @@ -109,7 +109,7 @@ RUN [ -n "$MAKE_EXTRA_ARGS" ] && make ${MAKE_EXTRA_ARGS} || make -j "$(getconf _ # Generate schema and include as part of the container image RUN /fluent-bit/bin/fluent-bit -J > /fluent-bit/etc/schema.json && \ - cp -f /fluent-bit/etc/schema.json /opt/fluentdo-agent/etc/schema.json + cp -f /fluent-bit/etc/schema.json /opt/telemetryforge-agent/etc/schema.json # Simple example of how to properly extract packages for reuse in distroless # Taken from: https://github.com/GoogleContainerTools/distroless/issues/863 @@ -185,10 +185,10 @@ RUN find /dpkg/ -type d -empty -delete && \ FROM gcr.io/distroless/cc-debian13 AS production ARG FLUENT_BIT_VERSION -ARG FLUENTDO_AGENT_VERSION +ARG TELEMETRY_FORGE_AGENT_VERSION ENV FLUENTBIT_VERSION=$FLUENT_BIT_VERSION -ENV FLUENTDO_AGENT_VERSION=$FLUENTDO_AGENT_VERSION +ENV TELEMETRY_FORGE_AGENT_VERSION=$TELEMETRY_FORGE_AGENT_VERSION EXPOSE 2020 @@ -207,21 +207,21 @@ COPY --from=builder /etc/ssl/certs /etc/ssl/certs # Finally the binaries as most likely to change COPY --from=builder /fluent-bit /fluent-bit -COPY --from=builder /opt/fluentdo-agent /opt/fluentdo-agent +COPY --from=builder /opt/telemetryforge-agent /opt/telemetryforge-agent # Set up a common base image for debug and test to avoid duplication FROM builder AS debug-test-base COPY --from=qemu-arm32 /usr/bin/qemu-arm-static /usr/bin/ COPY --from=qemu-arm64 /usr/bin/qemu-aarch64-static /usr/bin/ -COPY --from=production /opt/fluentdo-agent /opt/fluentdo-agent +COPY --from=production /opt/telemetryforge-agent /opt/telemetryforge-agent COPY --from=production /fluent-bit /fluent-bit ARG FLUENT_BIT_VERSION -ARG FLUENTDO_AGENT_VERSION +ARG TELEMETRY_FORGE_AGENT_VERSION ENV FLUENTBIT_VERSION=$FLUENT_BIT_VERSION -ENV FLUENTDO_AGENT_VERSION=$FLUENTDO_AGENT_VERSION +ENV TELEMETRY_FORGE_AGENT_VERSION=$TELEMETRY_FORGE_AGENT_VERSION # Support running integration tests using BATS FROM bats/bats:1.13.0 AS bats diff --git a/Dockerfile.ubi b/Dockerfile.ubi index 7a4bdbe2..e8988e4d 100644 --- a/Dockerfile.ubi +++ b/Dockerfile.ubi @@ -53,15 +53,15 @@ ENV FLUENTBIT_VERSION=$FLUENT_BIT_VERSION ARG FLB_NIGHTLY_BUILD ENV FLB_NIGHTLY_BUILD=$FLB_NIGHTLY_BUILD -ARG FLUENTDO_AGENT_VERSION=26.1.3 -ENV FLUENTDO_AGENT_VERSION=${FLUENTDO_AGENT_VERSION} +ARG TELEMETRY_FORGE_AGENT_VERSION=26.1.3 +ENV TELEMETRY_FORGE_AGENT_VERSION=${TELEMETRY_FORGE_AGENT_VERSION} # Build metadata -ARG FLUENTDO_AGENT_DISTRO=ubi/9.5 -ENV FLUENTDO_AGENT_DISTRO=$FLUENTDO_AGENT_DISTRO +ARG TELEMETRY_FORGE_AGENT_DISTRO=ubi/9.5 +ENV TELEMETRY_FORGE_AGENT_DISTRO=$TELEMETRY_FORGE_AGENT_DISTRO -ARG FLUENTDO_AGENT_PACKAGE_TYPE=CONTAINER -ENV FLUENTDO_AGENT_PACKAGE_TYPE=$FLUENTDO_AGENT_PACKAGE_TYPE +ARG TELEMETRY_FORGE_AGENT_PACKAGE_TYPE=CONTAINER +ENV TELEMETRY_FORGE_AGENT_PACKAGE_TYPE=$TELEMETRY_FORGE_AGENT_PACKAGE_TYPE # Copy any local source files as needed WORKDIR /source/ @@ -69,10 +69,10 @@ COPY source/ /source/ # Some components assume a git repository is present, so we create one otherwise it fails RUN git init -q /source/ && \ - git config user.name "Fluent Do Agent Builder" && \ + git config user.name "Telemetry Forge Agent Builder" && \ git config user.email "info@fluent.do" && \ git add -A && \ - git commit -q -a -m "Initial commit for Fluent Do Agent" + git commit -q -a -m "Initial commit for Telemetry Forge Agent" # Install and create all necessary directories RUN mkdir -p /fluent-bit/bin /fluent-bit/etc /fluent-bit/log @@ -92,7 +92,7 @@ RUN cmake -DCMAKE_BUILD_TYPE=Release \ -DFLB_TESTS_INTERNAL=Off \ -DFLB_TESTS_RUNTIME=Off \ -DFLB_NIGHTLY_BUILD="$FLB_NIGHTLY_BUILD" \ - -DFLUENTDO_AGENT_VERSION="$FLUENTDO_AGENT_VERSION" \ + -DTELEMETRY_FORGE_AGENT_VERSION="$TELEMETRY_FORGE_AGENT_VERSION" \ -DFLB_LOG_NO_CONTROL_CHARS=On \ -DFLB_CORO_STACK_SIZE=131072 \ ${CMAKE_EXTRA_ARGS} \ @@ -132,33 +132,33 @@ RUN echo "/usr/local/lib64" > /etc/ld.so.conf.d/local-libs.conf && \ echo "/usr/local/lib" >> /etc/ld.so.conf.d/local-libs.conf && \ ldconfig -RUN mkdir -p /opt/fluentdo-agent/etc -COPY config/ /opt/fluentdo-agent/etc/ +RUN mkdir -p /opt/telemetryforge-agent/etc +COPY config/ /opt/telemetryforge-agent/etc/ COPY config/ /fluent-bit/etc/ # Generate schema and include as part of the container image RUN /fluent-bit/bin/fluent-bit -J > /fluent-bit/etc/schema.json && \ - /fluent-bit/bin/fluent-bit -J > /opt/fluentdo-agent/etc/schema.json + /fluent-bit/bin/fluent-bit -J > /opt/telemetryforge-agent/etc/schema.json ARG FLUENT_BIT_VERSION -ARG FLUENTDO_AGENT_VERSION +ARG TELEMETRY_FORGE_AGENT_VERSION ENV FLUENTBIT_VERSION=$FLUENT_BIT_VERSION -ENV FLUENTDO_AGENT_VERSION=$FLUENTDO_AGENT_VERSION +ENV TELEMETRY_FORGE_AGENT_VERSION=$TELEMETRY_FORGE_AGENT_VERSION # We need to override any base image labels -LABEL vendor='FluentDo at https://fluent.do' -LABEL maintainer='FluentDo via info@fluent.do' -LABEL name='FluentDo Agent' -LABEL io.k8s.display-name='FluentDo Agent' -LABEL summary='FluentDo Agent is an Enterprise hardened version of Fluent Bit' -LABEL url='https://fluent.do' -LABEL io.openshift.tags='observability,logging,log-aggregation,fluentdo,fluent-bit' -LABEL version=${FLUENTDO_AGENT_VERSION} -LABEL io.k8s.description='FluentDo Agent is a stable, secure by default, OSS (Apache-licensed) downstream distribution of Fluent Bit with predictable releases and long-term supported versions for 24 months.' +LABEL vendor='Telemetry Forge at https://telemetryforge.io' +LABEL maintainer='Telemetry Forge via info@fluent.do' +LABEL name='Telemetry Forge Agent' +LABEL io.k8s.display-name='Telemetry Forge Agent' +LABEL summary='Telemetry Forge Agent is an Enterprise hardened version of Fluent Bit' +LABEL url='https://telemetryforge.io' +LABEL io.openshift.tags='observability,logging,log-aggregation,telemetryforge,fluent-bit' +LABEL version=${TELEMETRY_FORGE_AGENT_VERSION} +LABEL io.k8s.description='Telemetry Forge Agent is a stable, secure by default, OSS (Apache-licensed) downstream distribution of Fluent Bit with predictable releases and long-term supported versions for 24 months.' # Run as non-root user - pick a random one -RUN useradd -u 9876 -m -s /bin/false fluentdo-agent +RUN useradd -u 9876 -m -s /bin/false telemetryforge-agent USER 9876 @@ -189,7 +189,7 @@ FROM builder AS debug # hadolint ignore=DL3041 RUN dnf install -y gdb go-toolset procps && dnf clean all -COPY --from=production /opt/fluentdo-agent /opt/fluentdo-agent +COPY --from=production /opt/telemetryforge-agent /opt/telemetryforge-agent COPY --from=production /fluent-bit /fluent-bit ENTRYPOINT [ "bash" ] diff --git a/README.md b/README.md index 208f7a0b..75b3cb99 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,18 @@

- FluentDo Agent + Telemetry Forge Agent

Documentation License - Release - LTS + Release + LTS Slack

-## What is [FluentDo](https://fluent.do) Agent? +## What is the [Telemetry Forge](https://telemetryforge.io) Agent? -[FluentDo](https://fluent.do) Agent is a **hardened, stable, secure by default, OSS (Apache-licensed) downstream distribution of Fluent Bit** with predictable releases and long-term supported versions for 24 months. +The [Telemetry Forge](https://telemetryforge.io) Agent is a **hardened, stable, secure by default, OSS (Apache-licensed) downstream distribution of Fluent Bit** with predictable releases and long-term supported versions for 24 months. It also has built-in functionality for: @@ -26,11 +26,11 @@ It also has built-in functionality for: ### Version Support Matrix | Version | Release Date | Type | End of Support | Status | Branch | -|---------|--------------|------|----------------|--------|--------| -| **[26.10](https://github.com/orgs/FluentDo/projects/4)** | Oct 2026 | LTS | Oct 2028 | 🟡 Planned || -| **[26.04](https://github.com/orgs/FluentDo/projects/4)** | Apr 2026 | LTS | Apr 2028 | 🟢 Active | `main` | -| **[25.10](https://github.com/orgs/FluentDo/projects/3)** | Oct 2025 | LTS | Oct 2027 | 🟢 Active | `release/25.10-lts` | -| 25.07 | Jul 2025 | Regular | Jan 2026 | 🟢 Active || +| ------- | ------------ | ---- | -------------- | ------ | ------ | +| **[26.10](https://github.com/orgs/telemetryforge/projects/4)** | Oct 2026 | LTS | Oct 2028 | 🟡 Planned | | +| **[26.04](https://github.com/orgs/telemetryforge/projects/4)** | Apr 2026 | LTS | Apr 2028 | 🟢 Active | `main` | +| **[25.10](https://github.com/orgs/telemetryforge/projects/3)** | Oct 2025 | LTS | Oct 2027 | 🟢 Active | `release/25.10-lts` | +| 25.07 | Jul 2025 | Regular | Jan 2026 | 🟢 Active | | Main releases follow a date-based format with `Year.Month.Week` forming the version. Once it transitions to an LTS release then we maintain the major and minor versions from then on, only incrementing the patch version. @@ -38,7 +38,7 @@ Once it transitions to an LTS release then we maintain the major and minor versi ### Release Schedule | Release Type | Frequency | Description | -|-------------|-----------|-------------| +| ------------ | --------- | ----------- | | **LTS Release** | Twice yearly (April, October) | Long-term support for 24 months | | **Regular Release** | Quarterly | 6-month support cycle | | **Security Updates** | Weekly | CVE patches and critical fixes | @@ -47,7 +47,7 @@ Once it transitions to an LTS release then we maintain the major and minor versi --- -### Why [FluentDo](https://fluent.do) Agent? +### Why use our agent? - ✅ **Smaller footprint** - Optimized for production deployments - Only production-essential plugins included @@ -86,8 +86,8 @@ Once it transitions to an LTS release then we maintain the major and minor versi ### Docker ```bash -docker run --rm -it -v /var/log/containers:/var/log/containers:ro ghcr.io/fluentdo/agent/ubi:main -c /fluent-bit/etc/fluent-bit.yaml -docker run --rm -it -v /var/log/containers:/var/log/containers:ro ghcr.io/fluentdo/agent/debian:main -c /fluent-bit/etc/fluent-bit.yaml +docker run --rm -it -v /var/log/containers:/var/log/containers:ro ghcr.io/telemetryforge/agent/ubi:main -c /fluent-bit/etc/fluent-bit.yaml +docker run --rm -it -v /var/log/containers:/var/log/containers:ro ghcr.io/telemetryforge/agent/debian:main -c /fluent-bit/etc/fluent-bit.yaml ``` Ensure any files mounted are readable via the container user ([`cat Dockerfile.ubi|grep USER`](./Dockerfile.ubi)). @@ -98,16 +98,10 @@ To specify a different configuration just mount it in as well and pass it on the All packages are available for download at . -Linux packages are available for download and installation or using a simple install script: +Linux and macOS packages are available for download and installation or using a simple install script: ```bash -curl -sSfL https://raw.githubusercontent.com/FluentDo/agent/refs/heads/main/install.sh | bash -``` - -For macOS a brew tap recipe is provided: - -```bash -brew install fluentdo/tap/agent +curl -sSfL https://raw.githubusercontent.com/telemetryforge/agent/refs/heads/main/install.sh | bash ``` Windows packages are also available for download in various formats (ZIP, EXE or MSI). @@ -117,7 +111,7 @@ Windows packages are also available for download in various formats (ZIP, EXE or To compile for a specific target, run the container-based build using the upstream [`source/packaging/build.sh`](./source/packaging/build.sh) script with the specified distribution you want to build for: ```bash -git clone https://github.com/FluentDo/agent.git +git clone https://github.com/telemetryforge/agent.git cd agent ./source/packaging/build.sh -d rockylinux/9 ``` @@ -125,7 +119,7 @@ cd agent To build the UBI or distroless containers: ```bash -git clone https://github.com/FluentDo/agent.git +git clone https://github.com/telemetryforge/agent.git cd agent docker build -f Dockerfile.ubi . docker build -f Dockerfile.debian . @@ -134,7 +128,7 @@ docker build -f Dockerfile.debian . To compile natively (requires relevant dependencies installed): ```bash -git clone https://github.com/FluentDo/agent.git +git clone https://github.com/telemetryforge/agent.git cd agent cd source/build cmake .. @@ -153,7 +147,7 @@ make - **[Documentation](https://docs.fluent.do)** - Complete documentation and guides - **[Downloads](https://fluent.do/downloads)** - Pre-built packages and containers -- **[Release Notes](https://github.com/FluentDo/agent/releases)** - Version history and changelogs +- **[Release Notes](https://github.com/telemetryforge/agent/releases)** - Version history and changelogs - **[OSS Fluent Bit Docs](https://docs.fluentbit.io)** - Core documentation reference --- @@ -161,7 +155,7 @@ make ## Community & Support - **[Slack](https://join.slack.com/share/enQtOTU4MDk0MTQ0OTYzNi03MTY5MTc2Y2I0Y2JhY2QxNzc5MDNkNDdhNTRhNTgzNjkwMDc4Mzk1YTRhZWUzNTE4ZjM3OTljOTA4MzAxYjBl)** - Join our community chat -- **[GitHub Issues](https://github.com/FluentDo/agent/issues)** - Bug reports and feature requests +- **[GitHub Issues](https://github.com/telemetryforge/agent/issues)** - Bug reports and feature requests - **[Contributing Guide](CONTRIBUTING.md)** - How to contribute to the project - **[Commercial Support](https://fluent.do)** - Enterprise support with SLA @@ -198,17 +192,18 @@ This project is licensed under the [Apache License 2.0](LICENSE). ## Copyright -Copyright © [FluentDo](https://fluent.do) Contributors. See [NOTICE](NOTICE) for details. +Copyright © [Telemetry Forge](https://telemetryforge.io) Contributors. See [NOTICE](NOTICE) for details. ## Acknowledgments -[FluentDo](https://fluent.do) Agent is built on top of [Fluent Bit](https://fluentbit.io). We are grateful to the Fluent Bit community and all contributors who make this possible ❤️ +Our agent is built on top of [Fluent Bit](https://fluentbit.io). +We are grateful to the Fluent Bit community and all contributors who make this possible ❤️ ---

- Website • + WebsiteDocs • - Twitter • - Support + Twitter • + Support

diff --git a/extras/fluentdo-agent-logo.jpeg b/extras/agent-logo.jpeg similarity index 100% rename from extras/fluentdo-agent-logo.jpeg rename to extras/agent-logo.jpeg diff --git a/install.sh b/install.sh index 57d98667..80b2e99c 100755 --- a/install.sh +++ b/install.sh @@ -1,24 +1,24 @@ #!/bin/bash -# FluentDo Agent Installer +# Telemetry Forge Agent Installer # -# Downloads and installs the FluentDo Agent from packages.fluent.do +# Downloads and installs the Telemetry Forge Agent from packages.fluent.do # You can also download direct from https://packages.fluent.do/index.html # # All packages follow the following URL format: -# https://packages.fluent.do//output// +# https://packages.fluent.do//output// # e.g. -# https://packages.fluent.do/25.10.1/output/package-debian-bookworm.arm64v8/fluentdo-agent_25.10.1_arm64.deb -# https://packages.fluent.do/25.10.1/output/package-almalinux-8/fluentdo-agent-25.10.1-1.x86_64.rpm +# https://packages.fluent.do/25.10.1/output/package-debian-bookworm.arm64v8/telemetryforge-agent_25.10.1_arm64.deb +# https://packages.fluent.do/25.10.1/output/package-almalinux-8/telemetryforge-agent-25.10.1-1.x86_64.rpm set -e # The URL to get packages from -FLUENTDO_AGENT_URL="${FLUENTDO_AGENT_URL:-https://packages.fluent.do}" +TELEMETRY_FORGE_AGENT_URL="${TELEMETRY_FORGE_AGENT_URL:-https://packages.fluent.do}" # Any logs from this script -LOG_FILE="${LOG_FILE:-$PWD/fluentdo-agent-install.log}" +LOG_FILE="${LOG_FILE:-$PWD/telemetryforge-agent-install.log}" # The output binary to test -FLUENTDO_AGENT_BINARY=${FLUENTDO_AGENT_BINARY:-/opt/fluentdo-agent/bin/fluent-bit} +TELEMETRY_FORGE_AGENT_BINARY=${TELEMETRY_FORGE_AGENT_BINARY:-/opt/telemetryforge-agent/bin/fluent-bit} # Where to download files DOWNLOAD_DIR=${DOWNLOAD_DIR:-$(mktemp -d)} @@ -346,14 +346,14 @@ detect_distro() { # Fetch available versions from packages.fluent.do fetch_available_versions() { - log "Fetching available versions from $FLUENTDO_AGENT_URL..." + log "Fetching available versions from $TELEMETRY_FORGE_AGENT_URL..." local versions_response # Fetch the response - versions_response=$(curl -s -L "$FLUENTDO_AGENT_URL/" 2>/dev/null || echo "") + versions_response=$(curl -s -L "$TELEMETRY_FORGE_AGENT_URL/" 2>/dev/null || echo "") if [ -z "$versions_response" ]; then - log_error "Failed to fetch versions from $FLUENTDO_AGENT_URL" + log_error "Failed to fetch versions from $TELEMETRY_FORGE_AGENT_URL" log_debug "curl returned empty response" return 1 fi @@ -382,7 +382,7 @@ fetch_available_versions() { fi if [ -z "$AVAILABLE_VERSIONS" ]; then - log_error "No versions found at $FLUENTDO_AGENT_URL" + log_error "No versions found at $TELEMETRY_FORGE_AGENT_URL" log_debug "Response preview (first 500 chars):" log_debug "$(echo "$versions_response" | head -c 500)" return 1 @@ -410,7 +410,7 @@ get_latest_version() { # List available versions list_versions() { echo "" - echo -e "${BLUE}Available FluentDo Agent Versions:${NC}" + echo -e "${BLUE}Available Agent Versions:${NC}" echo "" local count=0 while IFS= read -r version; do @@ -585,29 +585,29 @@ find_package() { case "$pkg_format" in deb) - # Debian package naming: fluentdo-agent__.deb + # Debian package naming: telemetryforge-agent__.deb package_filenames=( - "fluentdo-agent_${version}_${arch_type}.deb" - "fluentdo-agent_${version}_${deb_arch_type}.deb" - "fluentdo-agent-${version}_${arch_type}.deb" - "fluentdo-agent-${version}_${deb_arch_type}.deb" + "telemetryforge-agent_${version}_${arch_type}.deb" + "telemetryforge-agent_${version}_${deb_arch_type}.deb" + "telemetryforge-agent-${version}_${arch_type}.deb" + "telemetryforge-agent-${version}_${deb_arch_type}.deb" ) log_debug "Looking for .deb files with patterns: ${package_filenames[*]}" ;; rpm) - # RPM package naming: fluentdo-agent--1..rpm + # RPM package naming: telemetryforge-agent--1..rpm package_filenames=( - "fluentdo-agent-${version}-1.${arch_type}.rpm" - "fluentdo-agent-${version}-1.${rpm_arch_type}.rpm" - "fluentdo-agent-${version}-1.noarch.rpm" + "telemetryforge-agent-${version}-1.${arch_type}.rpm" + "telemetryforge-agent-${version}-1.${rpm_arch_type}.rpm" + "telemetryforge-agent-${version}-1.noarch.rpm" ) log_debug "Looking for .rpm files with patterns: ${package_filenames[*]}" ;; apk) - # Alpine package naming: fluentdo-agent--r0_.apk + # Alpine package naming: telemetryforge-agent--r0_.apk package_filenames=( - "fluentdo-agent-${version}-r0.${arch_type}.apk" - "fluentdo-agent-${version}.${arch_type}.apk" + "telemetryforge-agent-${version}-r0.${arch_type}.apk" + "telemetryforge-agent-${version}.${arch_type}.apk" ) log_debug "Looking for .apk files with patterns: ${package_filenames[*]}" ;; @@ -619,7 +619,7 @@ find_package() { log_debug "Trying directory: $package_dir" for filename in "${package_filenames[@]}"; do - local package_url="${FLUENTDO_AGENT_URL}/${version}/output/${package_dir}/${filename}" + local package_url="${TELEMETRY_FORGE_AGENT_URL}/${version}/output/${package_dir}/${filename}" log_debug "Attempting to access: $package_url" # Use HEAD request to check if file exists without downloading @@ -641,7 +641,7 @@ find_package() { log_error "No package file found for version=$version, os=$target_os, arch=$arch_type, format=$pkg_format" log_error "Attempted paths:" for filename in "${package_filenames[@]}"; do - log_error " ${FLUENTDO_AGENT_URL}/${version}/output/${package_dir}/${filename}" + log_error " ${TELEMETRY_FORGE_AGENT_URL}/${version}/output/${package_dir}/${filename}" done return 1 fi @@ -662,7 +662,7 @@ download_package() { log "Downloading package: $package_path" log_debug "Output file: $output_file" - local url="${FLUENTDO_AGENT_URL}/${package_path}" + local url="${TELEMETRY_FORGE_AGENT_URL}/${package_path}" log_debug "Download URL: $url" if ! curl -L -f -o "$output_file" "$url"; then @@ -734,15 +734,15 @@ install_package() { # Verify installation verify_installation() { log "Verifying installation..." - log_debug "Verifying with binary: ${FLUENTDO_AGENT_BINARY}" + log_debug "Verifying with binary: ${TELEMETRY_FORGE_AGENT_BINARY}" - if "${FLUENTDO_AGENT_BINARY}" --help &> /dev/null; then + if "${TELEMETRY_FORGE_AGENT_BINARY}" --help &> /dev/null; then local version - version=$("${FLUENTDO_AGENT_BINARY}" --version 2>/dev/null || echo "unknown") - log_success "FluentDo Agent is installed (version: $version)" + version=$("${TELEMETRY_FORGE_AGENT_BINARY}" --version 2>/dev/null || echo "unknown") + log_success "Telemetry Forge Agent is installed (version: $version)" return 0 else - log_warning "FluentDo Agent command not found at: ${FLUENTDO_AGENT_BINARY}" + log_warning "Telemetry Forge Agent command not found at: ${TELEMETRY_FORGE_AGENT_BINARY}" return 1 fi } @@ -753,8 +753,8 @@ verify_installation() { # Main installation flow main() { - log "Starting FluentDo Agent installation..." - log "Packages URL: $FLUENTDO_AGENT_URL" + log "Starting Telemetry Forge Agent installation..." + log "Packages URL: $TELEMETRY_FORGE_AGENT_URL" log_debug "Debug mode: $DEBUG" log_debug "Log file: $LOG_FILE" log_debug "Download directory: $DOWNLOAD_DIR" @@ -793,9 +793,9 @@ main() { # Determine version to install local install_version - if [ -n "${FLUENTDO_AGENT_VERSION:-}" ]; then - log "Using specified version: $FLUENTDO_AGENT_VERSION" - install_version="$FLUENTDO_AGENT_VERSION" + if [ -n "${TELEMETRY_FORGE_AGENT_VERSION:-}" ]; then + log "Using specified version: $TELEMETRY_FORGE_AGENT_VERSION" + install_version="$TELEMETRY_FORGE_AGENT_VERSION" elif [ "$INTERACTIVE" = "true" ]; then log_debug "Interactive mode enabled" if ! select_version; then @@ -830,7 +830,7 @@ main() { log "Found package: $package_path" - local package_file="$DOWNLOAD_DIR/fluentdo-agent.${PKG_FORMAT}" + local package_file="$DOWNLOAD_DIR/telemetryforge-agent.${PKG_FORMAT}" log_debug "Package file destination: $package_file" if ! download_package "$package_path" "$package_file"; then @@ -852,7 +852,7 @@ main() { fi echo "" - log_success "FluentDo Agent installation completed successfully!" + log_success "Telemetry Forge Agent installation completed successfully!" echo "" log "Next steps:" echo " 1. Configure the agent: /etc/fluent-bit/fluent-bit.conf" @@ -862,7 +862,7 @@ main() { log_success "Package downloaded successfully: $package_file" fi echo "" - log "Documentation: https://fluent.do/docs/agent" + log "Documentation: https://telemetryforge.io/docs/agent" echo "" } @@ -873,14 +873,14 @@ main() { # Show usage usage() { cat << EOF -FluentDo Agent Installer +Telemetry Forge Agent Installer Usage: $0 [OPTIONS] Options: -v, --version VERSION Install specific version (default: latest) -i, --interactive Interactively select version - -u, --url URL Use custom packages URL (default: $FLUENTDO_AGENT_URL) + -u, --url URL Use custom packages URL (default: $TELEMETRY_FORGE_AGENT_URL) -l, --log-file FILE Log file path (default: $LOG_FILE) -f, --force Force installation on unsupported distributions -d, --download Download the package only @@ -907,7 +907,7 @@ Examples: $0 -d Environment Variables: - FLUENTDO_AGENT_URL Override packages URL (default: $FLUENTDO_AGENT_URL) + TELEMETRY_FORGE_AGENT_URL Override packages URL (default: $TELEMETRY_FORGE_AGENT_URL) LOG_FILE Override log file location (default: $LOG_FILE) DOWNLOAD_DIR Override download directory (default: $DOWNLOAD_DIR) SUDO Override sudo command (default: sudo, set to empty to disable) @@ -940,8 +940,8 @@ while [[ $# -gt 0 ]]; do shift ;; -v|--version) - FLUENTDO_AGENT_VERSION="$2" - log_debug "Version specified: $FLUENTDO_AGENT_VERSION" + TELEMETRY_FORGE_AGENT_VERSION="$2" + log_debug "Version specified: $TELEMETRY_FORGE_AGENT_VERSION" shift 2 ;; -i|--interactive) @@ -950,8 +950,8 @@ while [[ $# -gt 0 ]]; do shift ;; -u|--url) - FLUENTDO_AGENT_URL="$2" - log_debug "Custom URL specified: $FLUENTDO_AGENT_URL" + TELEMETRY_FORGE_AGENT_URL="$2" + log_debug "Custom URL specified: $TELEMETRY_FORGE_AGENT_URL" shift 2 ;; -l|--log-file) diff --git a/scripts/add-ignored-files.sh b/scripts/add-ignored-files.sh index 3036fa35..79a3cccd 100755 --- a/scripts/add-ignored-files.sh +++ b/scripts/add-ignored-files.sh @@ -24,7 +24,7 @@ do [[ ! -f "$ignoredFile" ]] && continue actualFile=${ignoredFile##"$SOURCE_DIR"/} - url="https://raw.githubusercontent.com/FluentDo/fluent-bit/refs/tags/$FLUENT_BIT_VERSION/$actualFile" + url="https://raw.githubusercontent.com/fluent/fluent-bit/refs/tags/$FLUENT_BIT_VERSION/$actualFile" if curl -sfILo/dev/null "$url"; then echo "Adding $actualFile" diff --git a/scripts/centos6-init-check.sh b/scripts/centos6-init-check.sh index 598398a4..ab38bcf1 100755 --- a/scripts/centos6-init-check.sh +++ b/scripts/centos6-init-check.sh @@ -31,8 +31,8 @@ done if [[ -f "${WORKDIR}/etc/init.d/fluent-bit" ]]; then echo "INFO: Found fluent-bit init.d script" -elif [[ -f "${WORKDIR}/etc/init.d/fluentdo-agent" ]]; then - echo "INFO: Found fluentdo-agent init.d script" +elif [[ -f "${WORKDIR}/etc/init.d/telemetryforge-agent" ]]; then + echo "INFO: Found telemetryforge-agent init.d script" else echo "ERROR: Unable to find init.d script" ls -lRh "$WORKDIR" diff --git a/scripts/common.sh b/scripts/common.sh index a6953dc9..240e78eb 100644 --- a/scripts/common.sh +++ b/scripts/common.sh @@ -21,6 +21,6 @@ function setup_git() { exit 1 elif ! git config user.name; then git config --global user.email "ci@fluent.do" - git config --global user.name "Fluent Do CI" + git config --global user.name "Telemetry Forge CI" fi } diff --git a/scripts/create-sync-pr.sh b/scripts/create-sync-pr.sh index b0acbb2b..77c0f731 100755 --- a/scripts/create-sync-pr.sh +++ b/scripts/create-sync-pr.sh @@ -2,7 +2,7 @@ set -euo pipefail # ============================================================================= -# FluentDo Agent - Create Sync PR Tool +# Telemetry Forge Agent - Create Sync PR Tool # ============================================================================= # This script creates a GitHub PR for upstream sync commits # ============================================================================= @@ -39,7 +39,7 @@ AUTO_MERGE=false usage() { cat << EOF -${CYAN}FluentDo Create Sync PR Tool${NC} +${CYAN}Telemetry Forge Create Sync PR Tool${NC} ${GREEN}Usage:${NC} $0 --from VERSION --to VERSION [options] @@ -231,13 +231,13 @@ collect_commits() { # Generate PR body generate_pr_body() { - local pr_body_file="/tmp/fluentdo-pr-body.md" + local pr_body_file="/tmp/telemetryforge-pr-body.md" cat > "$pr_body_file" << EOF ## Summary -Syncs FluentDo Agent with upstream Fluent Bit from ${FROM_VERSION} to ${TO_VERSION} +Syncs Telemetry Forge Agent with upstream Fluent Bit from ${FROM_VERSION} to ${TO_VERSION} -This PR applies upstream patches to keep FluentDo Agent in sync with Fluent Bit while preserving our customizations. +This PR applies upstream patches to keep Telemetry Forge Agent in sync with Fluent Bit while preserving our customizations. ## Changes Applied @@ -259,11 +259,11 @@ fi) ## Testing Checklist - [ ] Build passes (\`cd source && cmake . && make\`) - [ ] Unit tests pass -- [ ] No regressions in FluentDo features +- [ ] No regressions in Telemetry Forge features - [ ] Security hardening preserved - [ ] Custom plugins functional -## FluentDo Customizations Verified +## Telemetry Forge Customizations Verified - [ ] Branding remains intact - [ ] Version scheme correct (YY.MM.PATCH) - [ ] Custom features working @@ -382,7 +382,7 @@ create_pr() { # Main execution main() { log "${CYAN}╔══════════════════════════════════════════════════════╗${NC}" - log "${CYAN}║ FluentDo Create Sync PR Tool ║${NC}" + log "${CYAN}║ Telemetry Forge Create Sync PR Tool ║${NC}" log "${CYAN}╚══════════════════════════════════════════════════════╝${NC}" echo diff --git a/scripts/setup-code.sh b/scripts/setup-code.sh index 83c167dc..c30c96f7 100755 --- a/scripts/setup-code.sh +++ b/scripts/setup-code.sh @@ -19,21 +19,21 @@ PATCH_LIST=${PATCH_LIST:-$PATCH_DIR/patches-agent.files} CUSTOM_DIR=${CUSTOM_DIR:-$REPO_ROOT/custom} # Change via ./scripts/update-version.sh only -export FLUENTDO_AGENT_VERSION=${FLUENTDO_AGENT_VERSION:-26.1.3} +export TELEMETRY_FORGE_AGENT_VERSION=${TELEMETRY_FORGE_AGENT_VERSION:-26.1.3} # Handle version string with or without a v prefix - we just want semver -if [[ "$FLUENTDO_AGENT_VERSION" =~ ^v?([0-9]+\.[0-9]+\.[0-9]+)$ ]] ; then - FLUENTDO_AGENT_VERSION=${BASH_REMATCH[1]} - echo "Valid FluentDo agent version string: $FLUENTDO_AGENT_VERSION" +if [[ "$TELEMETRY_FORGE_AGENT_VERSION" =~ ^v?([0-9]+\.[0-9]+\.[0-9]+)$ ]] ; then + TELEMETRY_FORGE_AGENT_VERSION=${BASH_REMATCH[1]} + echo "Valid Telemetry Forge agent version string: $TELEMETRY_FORGE_AGENT_VERSION" else - echo "ERROR: Invalid FluentDo agent semver string: $FLUENTDO_AGENT_VERSION" + echo "ERROR: Invalid Telemetry Forge agent semver string: $TELEMETRY_FORGE_AGENT_VERSION" exit 1 fi # shellcheck disable=SC1091 source "$SCRIPT_DIR"/common.sh -echo "Setting up $FLUENTDO_AGENT_VERSION in directory: $SOURCE_DIR" +echo "Setting up $TELEMETRY_FORGE_AGENT_VERSION in directory: $SOURCE_DIR" # Source is maintained directly in the repository, no cloning needed if [[ ! -d "$SOURCE_DIR" ]]; then @@ -68,27 +68,27 @@ fi FLB_CMAKE="$SOURCE_DIR"/CMakeLists.txt # Compose new version: it must be in the format X.Y.Z, e.g. 22.4.1 or 22.4.1-rc1 -CFB_MAJOR=$(echo "$FLUENTDO_AGENT_VERSION" | cut -d. -f1) -CFB_MINOR=$(echo "$FLUENTDO_AGENT_VERSION" | cut -d. -f2) -CFB_PATCH=$(echo "$FLUENTDO_AGENT_VERSION" | cut -d. -f3) +CFB_MAJOR=$(echo "$TELEMETRY_FORGE_AGENT_VERSION" | cut -d. -f1) +CFB_MINOR=$(echo "$TELEMETRY_FORGE_AGENT_VERSION" | cut -d. -f2) +CFB_PATCH=$(echo "$TELEMETRY_FORGE_AGENT_VERSION" | cut -d. -f3) # Cope with custom versions CFB_PATCH_EXTRA='' if [[ "$CFB_PATCH" == *-* ]]; then - CFB_PATCH=$(echo "$FLUENTDO_AGENT_VERSION" | cut -d. -f3 | cut -d- -f1) - CFB_PATCH_EXTRA=$(echo "$FLUENTDO_AGENT_VERSION" | cut -d. -f3 | cut -d- -f2) + CFB_PATCH=$(echo "$TELEMETRY_FORGE_AGENT_VERSION" | cut -d. -f3 | cut -d- -f1) + CFB_PATCH_EXTRA=$(echo "$TELEMETRY_FORGE_AGENT_VERSION" | cut -d. -f3 | cut -d- -f2) fi if [[ -z "$CFB_MAJOR" ]]; then - echo "ERROR: CFB_MAJOR is empty, invalid version: $FLUENTDO_AGENT_VERSION" + echo "ERROR: CFB_MAJOR is empty, invalid version: $TELEMETRY_FORGE_AGENT_VERSION" exitCode=1 fi if [[ -z "$CFB_MINOR" ]]; then - echo "ERROR: CFB_MINOR is empty, invalid version: $FLUENTDO_AGENT_VERSION" + echo "ERROR: CFB_MINOR is empty, invalid version: $TELEMETRY_FORGE_AGENT_VERSION" exitCode=1 fi if [[ -z "$CFB_PATCH" ]]; then - echo "ERROR: CFB_PATCH is empty, invalid version: $FLUENTDO_AGENT_VERSION" + echo "ERROR: CFB_PATCH is empty, invalid version: $TELEMETRY_FORGE_AGENT_VERSION" exitCode=1 fi @@ -120,10 +120,10 @@ if [[ -n "$CPACK_PACKAGE_NAME_SUFFIX" ]] && [[ $CPACK_PACKAGE_NAME_SUFFIX != -* fi echo "CPACK_PACKAGE_NAME_SUFFIX: $CPACK_PACKAGE_NAME_SUFFIX" -sed_wrapper -i "s/CPACK_PACKAGE_NAME \"fluent-bit\"/CPACK_PACKAGE_NAME \"fluentdo-agent${CPACK_PACKAGE_NAME_SUFFIX}\"/g" "$FLB_CMAKE" +sed_wrapper -i "s/CPACK_PACKAGE_NAME \"fluent-bit\"/CPACK_PACKAGE_NAME \"telemetryforge-agent${CPACK_PACKAGE_NAME_SUFFIX}\"/g" "$FLB_CMAKE" -sed_wrapper -i "s/CPACK_PACKAGE_VENDOR \"Fluent Bit\"/CPACK_PACKAGE_VENDOR \"FluentDo\"/g" "$FLB_CMAKE" -sed_wrapper -i "s/Eduardo Silva /Fluent Do /g" "$FLB_CMAKE" -sed_wrapper -i "s/Chronosphere Inc./FluentDo /g" "$FLB_CMAKE" +sed_wrapper -i "s/CPACK_PACKAGE_VENDOR \"Fluent Bit\"/CPACK_PACKAGE_VENDOR \"Telemetry Forge\"/g" "$FLB_CMAKE" +sed_wrapper -i "s/Eduardo Silva /Telemetry Forge /g" "$FLB_CMAKE" +sed_wrapper -i "s/Chronosphere Inc./Telemetry Forge /g" "$FLB_CMAKE" # Source is maintained directly, no need to remove git directories diff --git a/scripts/sync-upstream-patches.sh b/scripts/sync-upstream-patches.sh index a4a45dbd..89e19260 100755 --- a/scripts/sync-upstream-patches.sh +++ b/scripts/sync-upstream-patches.sh @@ -2,12 +2,12 @@ set -euo pipefail # ============================================================================= -# FluentDo Agent - Upstream Patch Sync Tool +# Telemetry Forge Agent - Upstream Patch Sync Tool # ============================================================================= # This script helps sync specific commits from upstream Fluent Bit releases -# to your FluentDo Agent source tree using git patches. +# to your Telemetry Forge Agent source tree using git patches. # -# Since FluentDo source tree has no git relationship with upstream, +# Since Telemetry Forge source tree has no git relationship with upstream, # we use patch files to apply changes selectively. # ============================================================================= @@ -52,7 +52,7 @@ SKIP_CATEGORIES="" # Comma-separated list of categories to skip usage() { cat << EOF -${CYAN}FluentDo Upstream Patch Sync Tool${NC} +${CYAN}Telemetry Forge Upstream Patch Sync Tool${NC} ${GREEN}Usage:${NC} $0 --from VERSION --to VERSION [options] @@ -565,7 +565,7 @@ show_summary() { # Main execution main() { log "${CYAN}╔══════════════════════════════════════════════════════╗${NC}" - log "${CYAN}║ FluentDo Upstream Patch Sync Tool ║${NC}" + log "${CYAN}║ Telemetry Forge Upstream Patch Sync Tool ║${NC}" log "${CYAN}╚══════════════════════════════════════════════════════╝${NC}" echo diff --git a/scripts/update-version.sh b/scripts/update-version.sh index 184ebb28..efef4491 100755 --- a/scripts/update-version.sh +++ b/scripts/update-version.sh @@ -16,23 +16,23 @@ SCRIPT_DIR=$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd ) source "$SCRIPT_DIR"/common.sh REPO_ROOT=${REPO_ROOT:-$SCRIPT_DIR/..} -NEW_FLUENTDO_AGENT_VERSION=${NEW_FLUENTDO_AGENT_VERSION:?} +NEW_TELEMETRY_FORGE_AGENT_VERSION=${NEW_TELEMETRY_FORGE_AGENT_VERSION:?} # Handle version string with or without a v prefix - we just want semver -if [[ "$NEW_FLUENTDO_AGENT_VERSION" =~ ^v?([0-9]+\.[0-9]+\.[0-9]+)$ ]] ; then - NEW_FLUENTDO_AGENT_VERSION=${BASH_REMATCH[1]} - echo "Valid FluentDo agent version string: $NEW_FLUENTDO_AGENT_VERSION" +if [[ "$NEW_TELEMETRY_FORGE_AGENT_VERSION" =~ ^v?([0-9]+\.[0-9]+\.[0-9]+)$ ]] ; then + NEW_TELEMETRY_FORGE_AGENT_VERSION=${BASH_REMATCH[1]} + echo "Valid Telemetry Forge agent version string: $NEW_TELEMETRY_FORGE_AGENT_VERSION" else - echo "ERROR: Invalid FluentDo agent semver string: $NEW_FLUENTDO_AGENT_VERSION" + echo "ERROR: Invalid Telemetry Forge agent semver string: $NEW_TELEMETRY_FORGE_AGENT_VERSION" exit 1 fi -sed_wrapper -i "s/export FLUENTDO_AGENT_VERSION=\${FLUENTDO_AGENT_VERSION\:\-.*$/export FLUENTDO_AGENT_VERSION=\${FLUENTDO_AGENT_VERSION\:\-$NEW_FLUENTDO_AGENT_VERSION}/g" "$REPO_ROOT"/scripts/setup-code.sh -sed_wrapper -i "s/ARG FLUENTDO_AGENT_VERSION=.*$/ARG FLUENTDO_AGENT_VERSION=$NEW_FLUENTDO_AGENT_VERSION/g" "$REPO_ROOT"/Dockerfile.ubi -sed_wrapper -i "s/ARG FLUENTDO_AGENT_VERSION=.*$/ARG FLUENTDO_AGENT_VERSION=$NEW_FLUENTDO_AGENT_VERSION/g" "$REPO_ROOT"/Dockerfile.debian -sed_wrapper -i "s/RELEASE_VERSION=\${FLUENTDO_AGENT_VERSION:-.*$/RELEASE_VERSION=\${FLUENTDO_AGENT_VERSION:-$NEW_FLUENTDO_AGENT_VERSION}/g" "$REPO_ROOT"/install.sh -sed_wrapper -i "s/FLUENTDO_AGENT_VERSION=\${FLUENTDO_AGENT_VERSION:-.*$/FLUENTDO_AGENT_VERSION=\${FLUENTDO_AGENT_VERSION:-$NEW_FLUENTDO_AGENT_VERSION}/g" "$REPO_ROOT"/testing/bats/run-bats.sh -sed_wrapper -i "s/FLUENTDO_AGENT_VERSION=\${FLUENTDO_AGENT_VERSION:-.*$/FLUENTDO_AGENT_VERSION=\${FLUENTDO_AGENT_VERSION:-$NEW_FLUENTDO_AGENT_VERSION}/g" "$REPO_ROOT"/testing/bats/run-package-functional-tests.sh +sed_wrapper -i "s/export TELEMETRY_FORGE_AGENT_VERSION=\${TELEMETRY_FORGE_AGENT_VERSION\:\-.*$/export TELEMETRY_FORGE_AGENT_VERSION=\${TELEMETRY_FORGE_AGENT_VERSION\:\-$NEW_TELEMETRY_FORGE_AGENT_VERSION}/g" "$REPO_ROOT"/scripts/setup-code.sh +sed_wrapper -i "s/ARG TELEMETRY_FORGE_AGENT_VERSION=.*$/ARG TELEMETRY_FORGE_AGENT_VERSION=$NEW_TELEMETRY_FORGE_AGENT_VERSION/g" "$REPO_ROOT"/Dockerfile.ubi +sed_wrapper -i "s/ARG TELEMETRY_FORGE_AGENT_VERSION=.*$/ARG TELEMETRY_FORGE_AGENT_VERSION=$NEW_TELEMETRY_FORGE_AGENT_VERSION/g" "$REPO_ROOT"/Dockerfile.debian +sed_wrapper -i "s/RELEASE_VERSION=\${TELEMETRY_FORGE_AGENT_VERSION:-.*$/RELEASE_VERSION=\${TELEMETRY_FORGE_AGENT_VERSION:-$NEW_TELEMETRY_FORGE_AGENT_VERSION}/g" "$REPO_ROOT"/install.sh +sed_wrapper -i "s/TELEMETRY_FORGE_AGENT_VERSION=\${TELEMETRY_FORGE_AGENT_VERSION:-.*$/TELEMETRY_FORGE_AGENT_VERSION=\${TELEMETRY_FORGE_AGENT_VERSION:-$NEW_TELEMETRY_FORGE_AGENT_VERSION}/g" "$REPO_ROOT"/testing/bats/run-bats.sh +sed_wrapper -i "s/TELEMETRY_FORGE_AGENT_VERSION=\${TELEMETRY_FORGE_AGENT_VERSION:-.*$/TELEMETRY_FORGE_AGENT_VERSION=\${TELEMETRY_FORGE_AGENT_VERSION:-$NEW_TELEMETRY_FORGE_AGENT_VERSION}/g" "$REPO_ROOT"/testing/bats/run-package-functional-tests.sh # Run setup-code.sh to update the agent version in the code "$REPO_ROOT"/scripts/setup-code.sh diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index a48df555..12855eb4 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -220,14 +220,14 @@ if(DEFINED FLB_NIGHTLY_BUILD AND NOT "${FLB_NIGHTLY_BUILD}" STREQUAL "") endif() # Build metadata: distribution and package type -if(DEFINED FLUENTDO_AGENT_DISTRO AND NOT "${FLUENTDO_AGENT_DISTRO}" STREQUAL "") - FLB_DEFINITION_VAL(FLUENTDO_AGENT_DISTRO ${FLUENTDO_AGENT_DISTRO}) - message(STATUS "Build distro: ${FLUENTDO_AGENT_DISTRO}") +if(DEFINED TELEMETRY_FORGE_AGENT_DISTRO AND NOT "${TELEMETRY_FORGE_AGENT_DISTRO}" STREQUAL "") + FLB_DEFINITION_VAL(TELEMETRY_FORGE_AGENT_DISTRO ${TELEMETRY_FORGE_AGENT_DISTRO}) + message(STATUS "Build distro: ${TELEMETRY_FORGE_AGENT_DISTRO}") endif() -if(DEFINED FLUENTDO_AGENT_PACKAGE_TYPE AND NOT "${FLUENTDO_AGENT_PACKAGE_TYPE}" STREQUAL "") - FLB_DEFINITION_VAL(FLUENTDO_AGENT_PACKAGE_TYPE ${FLUENTDO_AGENT_PACKAGE_TYPE}) - message(STATUS "Build package type: ${FLUENTDO_AGENT_PACKAGE_TYPE}") +if(DEFINED TELEMETRY_FORGE_AGENT_PACKAGE_TYPE AND NOT "${TELEMETRY_FORGE_AGENT_PACKAGE_TYPE}" STREQUAL "") + FLB_DEFINITION_VAL(TELEMETRY_FORGE_AGENT_PACKAGE_TYPE ${TELEMETRY_FORGE_AGENT_PACKAGE_TYPE}) + message(STATUS "Build package type: ${TELEMETRY_FORGE_AGENT_PACKAGE_TYPE}") endif() if(FLB_IN_STORAGE_BACKLOG) @@ -1417,11 +1417,11 @@ endif() # ============================ set(CPACK_PACKAGE_VERSION ${FLB_VERSION_STR}) -set(CPACK_PACKAGE_NAME "fluentdo-agent") +set(CPACK_PACKAGE_NAME "telemetryforge-agent") set(CPACK_PACKAGE_RELEASE 1) -set(CPACK_PACKAGE_CONTACT "Fluent Do ") -set(CPACK_PACKAGE_VENDOR "Fluent Do ") +set(CPACK_PACKAGE_CONTACT "Telemetry Forge ") +set(CPACK_PACKAGE_VENDOR "Telemetry Forge ") set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE") set(CPACK_PACKAGING_INSTALL_PREFIX "/") @@ -1515,7 +1515,7 @@ set(CPACK_RPM_RUNTIME_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}- # CPack: Windows System if(CPACK_GENERATOR MATCHES "NSIS") set(CPACK_MONOLITHIC_INSTALL 1) - set(CPACK_PACKAGE_INSTALL_DIRECTORY "fluentdo-agent") + set(CPACK_PACKAGE_INSTALL_DIRECTORY "telemetryforge-agent") endif() # CPack: Windows System w/ WiX @@ -1539,11 +1539,11 @@ if(FLB_SYSTEM_MACOS) OUTPUT_STRIP_TRAILING_WHITESPACE ) if (UNAME_M_RESULT EQUAL 0 AND UNAME_ARCH STREQUAL "arm64") - set(FLUENT_BIT_PKG ${CMAKE_CURRENT_BINARY_DIR}/fluentdo-agent-${FLB_VERSION_STR}-apple) + set(FLUENT_BIT_PKG ${CMAKE_CURRENT_BINARY_DIR}/telemetryforge-agent-${FLB_VERSION_STR}-apple) elseif(UNAME_M_RESULT EQUAL 0 AND UNAME_ARCH STREQUAL "x86_64") - set(FLUENT_BIT_PKG ${CMAKE_CURRENT_BINARY_DIR}/fluentdo-agent-${FLB_VERSION_STR}-intel) + set(FLUENT_BIT_PKG ${CMAKE_CURRENT_BINARY_DIR}/telemetryforge-agent-${FLB_VERSION_STR}-intel) else() - set(FLUENT_BIT_PKG ${CMAKE_CURRENT_BINARY_DIR}/fluentdo-agent-${FLB_VERSION_STR}-${UNAME_ARCH}) + set(FLUENT_BIT_PKG ${CMAKE_CURRENT_BINARY_DIR}/telemetryforge-agent-${FLB_VERSION_STR}-${UNAME_ARCH}) endif() if (CPACK_GENERATOR MATCHES "productbuild") diff --git a/source/cmake/plugins_options.cmake b/source/cmake/plugins_options.cmake index e68a12df..6804cb61 100644 --- a/source/cmake/plugins_options.cmake +++ b/source/cmake/plugins_options.cmake @@ -11,11 +11,11 @@ option(FLB_MINIMAL "Enable minimal build configuration" No) # Custom Plugins # =============== -DEFINE_OPTION(FLB_CUSTOM_FLUENTDO "Enable Fluentdo custom plugin" ON) +DEFINE_OPTION(FLB_CUSTOM_TELEMETRY_FORGE "Enable Telemetry Forge custom plugin" ON) # Inputs (sources, data collectors) # ================================= -DEFINE_OPTION(FLB_IN_FLUENTDO "Enable FluentDo input plugin" ON) +DEFINE_OPTION(FLB_IN_TELEMETRY_FORGE "Enable Telemetry Forge input plugin" ON) # ================================= DEFINE_OPTION(FLB_IN_BLOB "Enable Blob input plugin" ON) DEFINE_OPTION(FLB_IN_CALYPTIA_FLEET "Enable Calyptia Fleet input plugin" OFF) diff --git a/source/cmake/version.rc.in b/source/cmake/version.rc.in index dd96731d..83c06e9d 100644 --- a/source/cmake/version.rc.in +++ b/source/cmake/version.rc.in @@ -32,10 +32,10 @@ BEGIN VALUE "FileDescription", "Compiled with @CMAKE_C_COMPILER_ID@ @CMAKE_C_COMPILER_VERSION@\0" VALUE "ProductVersion", FLB_VER_PRODUCTVERSION_STR VALUE "FileVersion", FLB_VER_FILEVERSION_STR - VALUE "InternalName", "fluentdo-agent\0" - VALUE "ProductName", "FluentDo Agent is an enterprise-hardened distribution of Fluent Bit\0" - VALUE "CompanyName", "FluentDo.\0" - VALUE "LegalCopyright", "Copyright (C) 2015-2018 Treasure Data Inc.\nCopyright (C) 2019-2025 The Fluent Bit Authors.\nAll rights reserved.\0" + VALUE "InternalName", "telemetryforge-agent\0" + VALUE "ProductName", "Telemetry Forge Agent is an enterprise-hardened distribution of Fluent Bit\0" + VALUE "CompanyName", "Telemetry Forge.\0" + VALUE "LegalCopyright", "Copyright (C) 2015-2018 Treasure Data Inc.\nCopyright (C) 2019-2026 The Fluent Bit Authors.\nAll rights reserved.\0" VALUE "Licence", "Apache-2.0\0" VALUE "Info", "https://docs.fluent.do/0" END diff --git a/source/cpack/description b/source/cpack/description index 367e8125..384761ed 100644 --- a/source/cpack/description +++ b/source/cpack/description @@ -1,4 +1,4 @@ -FluentDo Agent is an enterprise-hardened distribution of Fluent Bit, +Telemetry Forge Agent is an enterprise-hardened distribution of Fluent Bit, maintained by core OSS maintainers. It delivers production-ready log processing with enhanced security, reduced footprint, and enterprise support. diff --git a/source/cpack/scripts/sysv-init-install.sh b/source/cpack/scripts/sysv-init-install.sh index 4088ac2f..b1bec7b9 100755 --- a/source/cpack/scripts/sysv-init-install.sh +++ b/source/cpack/scripts/sysv-init-install.sh @@ -1,7 +1,7 @@ #!/bin/sh NAME="" -if [ -f /etc/init.d/fluentdo-agent ]; then - NAME=fluentdo-agent +if [ -f /etc/init.d/telemetryforge-agent ]; then + NAME=telemetryforge-agent elif [ -f /etc/init.d/fluent-bit ]; then NAME=fluent-bit else diff --git a/source/include/fluent-bit/flb_graphql_client.h b/source/include/fluent-bit/flb_graphql_client.h index b6249f42..623f8ad1 100644 --- a/source/include/fluent-bit/flb_graphql_client.h +++ b/source/include/fluent-bit/flb_graphql_client.h @@ -29,7 +29,8 @@ /* Agent kinds */ #define FLB_GRAPHQL_AGENT_KIND_FLUENTBIT "FLUENTBIT" -#define FLB_GRAPHQL_AGENT_KIND_FLUENTDO "FLUENTDO" +#define FLB_GRAPHQL_AGENT_KIND_FLUENTDO "FLUENTDO" +#define FLB_GRAPHQL_AGENT_KIND_TELEMETRY_FORGE "TELEMETRY_FORGE" /* Agent status */ #define FLB_GRAPHQL_AGENT_STATUS_RUNNING "RUNNING" @@ -100,7 +101,7 @@ struct flb_graphql_label_id { /* Query agents input parameters */ struct flb_graphql_query_agents_input { const char *org_id; /* Required */ - const char *kind; /* Optional: FLUENTBIT or FLUENTDO */ + const char *kind; /* Optional: FLUENTBIT, FLUENTDO or TELEMETRY_FORGE */ const char *name; /* Optional */ int name_exact; /* Optional: exact name match */ const char *version; /* Optional */ @@ -117,7 +118,7 @@ struct flb_graphql_query_agents_input { /* Create agent input parameters */ struct flb_graphql_create_agent_input { - const char *kind; /* Required: FLUENTBIT or FLUENTDO */ + const char *kind; /* Required: FLUENTBIT, FLUENTDO or TELEMETRY_FORGE */ const char *name; /* Required */ const char *version; /* Required */ const char *config; /* Required */ diff --git a/source/include/fluent-bit/flb_version.h.in b/source/include/fluent-bit/flb_version.h.in index 63e4ee42..925accbd 100644 --- a/source/include/fluent-bit/flb_version.h.in +++ b/source/include/fluent-bit/flb_version.h.in @@ -32,7 +32,7 @@ #define STR_HELPER(s) #s #define STR(s) STR_HELPER(s) -/* FluentDo Agent Version */ +/* Telemetry Forge Agent Version */ #define FLB_VERSION_MAJOR @FLB_VERSION_MAJOR@ #define FLB_VERSION_MINOR @FLB_VERSION_MINOR@ #define FLB_VERSION_PATCH @FLB_VERSION_PATCH@ @@ -45,10 +45,10 @@ static inline void flb_version() { #ifdef FLB_NIGHTLY_BUILD - printf("FluentDo Agent v%s | NIGHTLY_BUILD=%s - DO NOT USE IN PRODUCTION!\n", + printf("Telemetry Forge Agent v%s | NIGHTLY_BUILD=%s - DO NOT USE IN PRODUCTION!\n", FLB_VERSION_STR, STR(FLB_NIGHTLY_BUILD)); #else - printf("FluentDo Agent v%s\n", FLB_VERSION_STR); + printf("Telemetry Forge Agent v%s\n", FLB_VERSION_STR); #endif printf("Git commit: %s\n", FLB_GIT_HASH); @@ -57,8 +57,8 @@ static inline void flb_version() static inline void flb_version_banner() { - /* FluentDo Agent - Enterprise-ready downstream distribution */ - fprintf(stderr, "FluentDo Agent v%s\n", FLB_VERSION_STR); + /* Telemetry Forge Agent - Enterprise-ready downstream distribution */ + fprintf(stderr, "Telemetry Forge Agent v%s\n", FLB_VERSION_STR); fprintf(stderr, "* A stable, secure by default and enterprise ready\n"); fprintf(stderr, "* downstream distribution of Fluent Bit\n"); fprintf(stderr, "* https://docs.fluent.do\n\n"); diff --git a/source/init/az2-systemd.in b/source/init/az2-systemd.in index 5bf31753..3a0e5e25 100644 --- a/source/init/az2-systemd.in +++ b/source/init/az2-systemd.in @@ -1,5 +1,5 @@ [Unit] -Description=FluentDo Agent is an enterprise-hardened distribution of Fluent Bit +Description=Telemetry Forge Agent is an enterprise-hardened distribution of Fluent Bit Documentation=https://fluent.do/ Requires=network.target After=network.target diff --git a/source/init/systemd.in b/source/init/systemd.in index a1389436..f3b1a97b 100644 --- a/source/init/systemd.in +++ b/source/init/systemd.in @@ -1,5 +1,5 @@ [Unit] -Description=FluentDo Agent is an enterprise-hardened distribution of Fluent Bit +Description=Telemetry Forge Agent is an enterprise-hardened distribution of Fluent Bit Documentation=https://fluent.do/ Requires=network.target After=network.target diff --git a/source/init/sysvinit.in b/source/init/sysvinit.in index c573a8f4..399c595b 100755 --- a/source/init/sysvinit.in +++ b/source/init/sysvinit.in @@ -5,7 +5,7 @@ # Required-Stop: $local_fs $network $named $time $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 -# Description: Init script for FluentDo Agent. +# Description: Init script for Telemetry Forge Agent. ### END INIT INFO # Adapted from https://github.com/wyhasany/sysvinit-service-generator diff --git a/source/init/upstart.in b/source/init/upstart.in index 23ce6272..5c70e5ad 100644 --- a/source/init/upstart.in +++ b/source/init/upstart.in @@ -1,4 +1,4 @@ -# FluentDo Agent is an enterprise-hardened distribution of Fluent Bit +# Telemetry Forge Agent is an enterprise-hardened distribution of Fluent Bit description "@FLB_PROG_NAME@" diff --git a/source/packaging/build.sh b/source/packaging/build.sh index 80835f55..3b977bb0 100755 --- a/source/packaging/build.sh +++ b/source/packaging/build.sh @@ -79,15 +79,15 @@ fi # Use full distro target (e.g., "amazonlinux/2", "ubuntu/22.04", "debian/bookworm") # Remove architecture suffix if present (e.g., "ubuntu/20.04.arm64v8" -> "ubuntu/20.04") -FLUENTDO_AGENT_DISTRO_TEMP=${FLB_DISTRO%.arm64v8} -FLUENTDO_AGENT_DISTRO_TEMP=${FLUENTDO_AGENT_DISTRO_TEMP%.arm32v7} -FLUENTDO_AGENT_DISTRO=${FLUENTDO_AGENT_DISTRO:-${FLUENTDO_AGENT_DISTRO_TEMP}} -FLUENTDO_AGENT_PACKAGE_TYPE=${FLUENTDO_AGENT_PACKAGE_TYPE:-PACKAGE} +TELEMETRY_FORGE_AGENT_DISTRO_TEMP=${FLB_DISTRO%.arm64v8} +TELEMETRY_FORGE_AGENT_DISTRO_TEMP=${TELEMETRY_FORGE_AGENT_DISTRO_TEMP%.arm32v7} +TELEMETRY_FORGE_AGENT_DISTRO=${TELEMETRY_FORGE_AGENT_DISTRO:-${TELEMETRY_FORGE_AGENT_DISTRO_TEMP}} +TELEMETRY_FORGE_AGENT_PACKAGE_TYPE=${TELEMETRY_FORGE_AGENT_PACKAGE_TYPE:-PACKAGE} echo "IMAGE_CONTEXT_DIR => $IMAGE_CONTEXT_DIR" echo "FLB_NIGHTLY_BUILD => $FLB_NIGHTLY_BUILD" -echo "FLUENTDO_AGENT_DISTRO => $FLUENTDO_AGENT_DISTRO" -echo "FLUENTDO_AGENT_PACKAGE_TYPE => $FLUENTDO_AGENT_PACKAGE_TYPE" +echo "TELEMETRY_FORGE_AGENT_DISTRO => $TELEMETRY_FORGE_AGENT_DISTRO" +echo "TELEMETRY_FORGE_AGENT_PACKAGE_TYPE => $TELEMETRY_FORGE_AGENT_PACKAGE_TYPE" if [ "${DOCKER}" = "docker" ]; then export DOCKER_BUILDKIT=1 @@ -100,8 +100,8 @@ fi if ! ${DOCKER} build \ --build-arg FLB_NIGHTLY_BUILD="$FLB_NIGHTLY_BUILD" \ --build-arg CACHE_ID="$CACHE_ID" \ - --build-arg FLUENTDO_AGENT_DISTRO="$FLUENTDO_AGENT_DISTRO" \ - --build-arg FLUENTDO_AGENT_PACKAGE_TYPE="$FLUENTDO_AGENT_PACKAGE_TYPE" \ + --build-arg TELEMETRY_FORGE_AGENT_DISTRO="$TELEMETRY_FORGE_AGENT_DISTRO" \ + --build-arg TELEMETRY_FORGE_AGENT_PACKAGE_TYPE="$TELEMETRY_FORGE_AGENT_PACKAGE_TYPE" \ $FLB_ARG \ -t "$MAIN_IMAGE" \ -f "$IMAGE_CONTEXT_DIR/Dockerfile" \ diff --git a/source/packaging/distros/almalinux/Dockerfile b/source/packaging/distros/almalinux/Dockerfile index 0856607a..616e33a9 100644 --- a/source/packaging/distros/almalinux/Dockerfile +++ b/source/packaging/distros/almalinux/Dockerfile @@ -141,7 +141,7 @@ WORKDIR /source/fluent-bit/ COPY . ./ WORKDIR /source/fluent-bit/build/ -ARG CMAKE_INSTALL_PREFIX=/opt/fluentdo-agent/ +ARG CMAKE_INSTALL_PREFIX=/opt/telemetryforge-agent/ ARG CMAKE_INSTALL_SYSCONFDIR=/etc/ RUN cmake -DCMAKE_INSTALL_PREFIX="$CMAKE_INSTALL_PREFIX" \ diff --git a/source/packaging/distros/amazonlinux/Dockerfile b/source/packaging/distros/amazonlinux/Dockerfile index 3d64ad96..f1050155 100644 --- a/source/packaging/distros/amazonlinux/Dockerfile +++ b/source/packaging/distros/amazonlinux/Dockerfile @@ -137,7 +137,7 @@ COPY . ./ WORKDIR /tmp/fluent-bit/build/ # CMake configuration variables -ARG CMAKE_INSTALL_PREFIX=/opt/fluentdo-agent/ +ARG CMAKE_INSTALL_PREFIX=/opt/telemetryforge-agent/ ARG CMAKE_INSTALL_SYSCONFDIR=/etc/ RUN cmake -DCMAKE_INSTALL_PREFIX="$CMAKE_INSTALL_PREFIX" \ diff --git a/source/packaging/distros/azurelinux/Dockerfile b/source/packaging/distros/azurelinux/Dockerfile index 2ce1eb26..4772b901 100644 --- a/source/packaging/distros/azurelinux/Dockerfile +++ b/source/packaging/distros/azurelinux/Dockerfile @@ -53,7 +53,7 @@ COPY . ./ WORKDIR /source/fluent-bit/build/ # CMake configuration variables -ARG CMAKE_INSTALL_PREFIX=/opt/fluentdo-agent/ +ARG CMAKE_INSTALL_PREFIX=/opt/telemetryforge-agent/ ARG CMAKE_INSTALL_SYSCONFDIR=/etc/ RUN cmake -DCMAKE_INSTALL_PREFIX="$CMAKE_INSTALL_PREFIX" \ diff --git a/source/packaging/distros/centos/6/Dockerfile b/source/packaging/distros/centos/6/Dockerfile index fef00625..508521a7 100644 --- a/source/packaging/distros/centos/6/Dockerfile +++ b/source/packaging/distros/centos/6/Dockerfile @@ -122,7 +122,7 @@ COPY . ./ WORKDIR /source/fluent-bit/build/ # CMake configuration variables -ARG CMAKE_INSTALL_PREFIX=/opt/fluentdo-agent/ +ARG CMAKE_INSTALL_PREFIX=/opt/telemetryforge-agent/ ARG CMAKE_INSTALL_SYSCONFDIR=/etc/ # Ensure we enable sysvinit set up ARG FLB_CPACK_SYSVINIT=On diff --git a/source/packaging/distros/centos/7/Dockerfile b/source/packaging/distros/centos/7/Dockerfile index bb42af53..39939495 100644 --- a/source/packaging/distros/centos/7/Dockerfile +++ b/source/packaging/distros/centos/7/Dockerfile @@ -106,7 +106,7 @@ COPY . ./ WORKDIR /tmp/fluent-bit/build/ # CMake configuration variables -ARG CMAKE_INSTALL_PREFIX=/opt/fluentdo-agent/ +ARG CMAKE_INSTALL_PREFIX=/opt/telemetryforge-agent/ ARG CMAKE_INSTALL_SYSCONFDIR=/etc/ RUN PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH \ diff --git a/source/packaging/distros/centos/Dockerfile b/source/packaging/distros/centos/Dockerfile index de7e141f..97828b4f 100644 --- a/source/packaging/distros/centos/Dockerfile +++ b/source/packaging/distros/centos/Dockerfile @@ -226,7 +226,7 @@ COPY . ./ WORKDIR /tmp/fluent-bit/build/ # CMake configuration variables -ARG CMAKE_INSTALL_PREFIX=/opt/fluentdo-agent/ +ARG CMAKE_INSTALL_PREFIX=/opt/telemetryforge-agent/ ARG CMAKE_INSTALL_SYSCONFDIR=/etc/ RUN cmake -DCMAKE_INSTALL_PREFIX="$CMAKE_INSTALL_PREFIX" \ diff --git a/source/packaging/distros/debian/Dockerfile b/source/packaging/distros/debian/Dockerfile index b1eaa941..37102e31 100644 --- a/source/packaging/distros/debian/Dockerfile +++ b/source/packaging/distros/debian/Dockerfile @@ -269,11 +269,11 @@ FROM $BASE_BUILDER AS builder ARG FLB_NIGHTLY_BUILD ENV FLB_NIGHTLY_BUILD=$FLB_NIGHTLY_BUILD -ARG FLUENTDO_AGENT_DISTRO -ENV FLUENTDO_AGENT_DISTRO=$FLUENTDO_AGENT_DISTRO +ARG TELEMETRY_FORGE_AGENT_DISTRO +ENV TELEMETRY_FORGE_AGENT_DISTRO=$TELEMETRY_FORGE_AGENT_DISTRO -ARG FLUENTDO_AGENT_PACKAGE_TYPE -ENV FLUENTDO_AGENT_PACKAGE_TYPE=$FLUENTDO_AGENT_PACKAGE_TYPE +ARG TELEMETRY_FORGE_AGENT_PACKAGE_TYPE +ENV TELEMETRY_FORGE_AGENT_PACKAGE_TYPE=$TELEMETRY_FORGE_AGENT_PACKAGE_TYPE # Docker context must be the base of the repo WORKDIR /tmp/fluent-bit/ @@ -282,15 +282,15 @@ COPY . ./ WORKDIR /tmp/fluent-bit/build/ # CMake configuration variables ARG CFLAGS="-std=gnu99" -ARG CMAKE_INSTALL_PREFIX=/opt/fluentdo-agent/ +ARG CMAKE_INSTALL_PREFIX=/opt/telemetryforge-agent/ ARG CMAKE_INSTALL_SYSCONFDIR=/etc/ ENV CFLAGS=$CFLAGS RUN cmake -DCMAKE_INSTALL_PREFIX="$CMAKE_INSTALL_PREFIX" \ -DCMAKE_INSTALL_SYSCONFDIR="$CMAKE_INSTALL_SYSCONFDIR" \ -DFLB_NIGHTLY_BUILD="$FLB_NIGHTLY_BUILD" \ - -DFLUENTDO_AGENT_DISTRO="$FLUENTDO_AGENT_DISTRO" \ - -DFLUENTDO_AGENT_PACKAGE_TYPE="$FLUENTDO_AGENT_PACKAGE_TYPE" \ + -DTELEMETRY_FORGE_AGENT_DISTRO="$TELEMETRY_FORGE_AGENT_DISTRO" \ + -DTELEMETRY_FORGE_AGENT_PACKAGE_TYPE="$TELEMETRY_FORGE_AGENT_PACKAGE_TYPE" \ -DFLB_JEMALLOC_OPTIONS="$FLB_JEMALLOC_OPTIONS" \ ../ diff --git a/source/packaging/distros/mariner/Dockerfile b/source/packaging/distros/mariner/Dockerfile index 2a86897a..c4e25f4e 100644 --- a/source/packaging/distros/mariner/Dockerfile +++ b/source/packaging/distros/mariner/Dockerfile @@ -55,7 +55,7 @@ COPY . ./ WORKDIR /source/fluent-bit/build/ # CMake configuration variables -ARG CMAKE_INSTALL_PREFIX=/opt/fluentdo-agent/ +ARG CMAKE_INSTALL_PREFIX=/opt/telemetryforge-agent/ ARG CMAKE_INSTALL_SYSCONFDIR=/etc/ RUN cmake -DCMAKE_INSTALL_PREFIX="$CMAKE_INSTALL_PREFIX" \ diff --git a/source/packaging/distros/rockylinux/Dockerfile b/source/packaging/distros/rockylinux/Dockerfile index 8c6fc044..7ca5a65e 100644 --- a/source/packaging/distros/rockylinux/Dockerfile +++ b/source/packaging/distros/rockylinux/Dockerfile @@ -138,7 +138,7 @@ COPY . ./ WORKDIR /source/fluent-bit/build/ # CMake configuration variables -ARG CMAKE_INSTALL_PREFIX=/opt/fluentdo-agent/ +ARG CMAKE_INSTALL_PREFIX=/opt/telemetryforge-agent/ ARG CMAKE_INSTALL_SYSCONFDIR=/etc/ RUN cmake -DCMAKE_INSTALL_PREFIX="$CMAKE_INSTALL_PREFIX" \ diff --git a/source/packaging/distros/suse/Dockerfile b/source/packaging/distros/suse/Dockerfile index a169bfa0..842071fd 100644 --- a/source/packaging/distros/suse/Dockerfile +++ b/source/packaging/distros/suse/Dockerfile @@ -86,7 +86,7 @@ COPY . ./ WORKDIR /source/fluent-bit/build/ # CMake configuration variables -ARG CMAKE_INSTALL_PREFIX=/opt/fluentdo-agent/ +ARG CMAKE_INSTALL_PREFIX=/opt/telemetryforge-agent/ ARG CMAKE_INSTALL_SYSCONFDIR=/etc/ RUN cmake -DCMAKE_INSTALL_PREFIX="$CMAKE_INSTALL_PREFIX" \ diff --git a/source/packaging/distros/ubuntu/Dockerfile b/source/packaging/distros/ubuntu/Dockerfile index 3da0b872..2b8fb6a5 100644 --- a/source/packaging/distros/ubuntu/Dockerfile +++ b/source/packaging/distros/ubuntu/Dockerfile @@ -312,7 +312,7 @@ COPY . ./ WORKDIR /tmp/fluent-bit/build/ # CMake configuration variables ARG CFLAGS="-std=gnu99" -ARG CMAKE_INSTALL_PREFIX=/opt/fluentdo-agent/ +ARG CMAKE_INSTALL_PREFIX=/opt/telemetryforge-agent/ ARG CMAKE_INSTALL_SYSCONFDIR=/etc/ ENV CFLAGS=$CFLAGS diff --git a/source/plugins/CMakeLists.txt b/source/plugins/CMakeLists.txt index 978c72c8..cb31c9d3 100644 --- a/source/plugins/CMakeLists.txt +++ b/source/plugins/CMakeLists.txt @@ -247,8 +247,8 @@ if(LIBGIT2_FOUND) REGISTER_CUSTOM_PLUGIN("custom_git_config") endif() -REGISTER_CUSTOM_PLUGIN("custom_fluentdo") -REGISTER_IN_PLUGIN("in_fluentdo") +REGISTER_CUSTOM_PLUGIN("custom_telemetryforge") +REGISTER_IN_PLUGIN("in_telemetryforge") REGISTER_IN_PLUGIN("in_blob") diff --git a/source/plugins/custom_fluentdo/CMakeLists.txt b/source/plugins/custom_fluentdo/CMakeLists.txt deleted file mode 100644 index 9afa76cd..00000000 --- a/source/plugins/custom_fluentdo/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ -# FluentDo Manager custom plugin -set(src - fluentdo.c - ${CMAKE_SOURCE_DIR}/src/flb_graphql_client.c - ) - -FLB_PLUGIN(custom_fluentdo "${src}" "") \ No newline at end of file diff --git a/source/plugins/custom_telemetryforge/CMakeLists.txt b/source/plugins/custom_telemetryforge/CMakeLists.txt new file mode 100644 index 00000000..00d080d5 --- /dev/null +++ b/source/plugins/custom_telemetryforge/CMakeLists.txt @@ -0,0 +1,7 @@ +# Telemetry Forge Manager custom plugin +set(src + telemetryforge.c + ${CMAKE_SOURCE_DIR}/src/flb_graphql_client.c + ) + +FLB_PLUGIN(custom_telemetryforge "${src}" "") \ No newline at end of file diff --git a/source/plugins/custom_fluentdo/fluentdo.c b/source/plugins/custom_telemetryforge/telemetryforge.c similarity index 69% rename from source/plugins/custom_fluentdo/fluentdo.c rename to source/plugins/custom_telemetryforge/telemetryforge.c index beeaadad..0001058c 100644 --- a/source/plugins/custom_fluentdo/fluentdo.c +++ b/source/plugins/custom_telemetryforge/telemetryforge.c @@ -35,17 +35,17 @@ #include #endif -#define FLUENTDO_DEFAULT_URL "https://api.fluent.do/graphql" +#define TELEMETRY_FORGE_DEFAULT_URL "https://api.fluent.do/graphql" /* Cross-platform default session store path */ #ifdef _WIN32 -#define FLUENTDO_DEFAULT_SESSION_STORE "C:\\ProgramData\\fluentbit\\fluentdo" +#define TELEMETRY_FORGE_DEFAULT_SESSION_STORE "C:\\ProgramData\\fluentbit\\telemetryforge" #else -#define FLUENTDO_DEFAULT_SESSION_STORE "/var/lib/fluentbit/fluentdo" +#define TELEMETRY_FORGE_DEFAULT_SESSION_STORE "/var/lib/fluentbit/telemetryforge" #endif /* Plugin context */ -struct flb_fluentdo { +struct flb_telemetryforge { struct flb_graphql_client *graphql_client; char *api_url; char *api_token; @@ -60,15 +60,15 @@ struct flb_fluentdo { }; /* Callback for plugin initialization */ -static int cb_fluentdo_init(struct flb_custom_instance *ins, +static int cb_telemetryforge_init(struct flb_custom_instance *ins, struct flb_config *config, void *data) { int ret; - struct flb_fluentdo *ctx; + struct flb_telemetryforge *ctx; char interval_str[32]; - ctx = flb_calloc(1, sizeof(struct flb_fluentdo)); + ctx = flb_calloc(1, sizeof(struct flb_telemetryforge)); if (!ctx) { flb_errno(); return -1; @@ -89,9 +89,9 @@ static int cb_fluentdo_init(struct flb_custom_instance *ins, return -1; } - /* Set default agent_kind to fluentdo if not provided */ + /* Set default agent_kind to telemetryforge if not provided */ if (!ctx->agent_kind) { - ctx->agent_kind = flb_strdup("fluentdo"); + ctx->agent_kind = flb_strdup("telemetryforge"); } /* Set default interval if not provided */ @@ -100,9 +100,9 @@ static int cb_fluentdo_init(struct flb_custom_instance *ins, } /* Create input plugin instance */ - ctx->input_instance = flb_input_new(config, "fluentdo", NULL, FLB_FALSE); + ctx->input_instance = flb_input_new(config, "telemetryforge", NULL, FLB_FALSE); if (!ctx->input_instance) { - flb_plg_error(ins, "failed to create fluentdo input instance"); + flb_plg_error(ins, "failed to create telemetryforge input instance"); flb_free(ctx); return -1; } @@ -144,7 +144,7 @@ static int cb_fluentdo_init(struct flb_custom_instance *ins, snprintf(interval_str, sizeof(interval_str), "%d", ctx->metrics_interval); flb_input_set_property(ctx->input_instance, "interval_sec", interval_str); - flb_plg_info(ins, "fluentdo input plugin configured: agent_kind=%s, interval=%d", + flb_plg_info(ins, "telemetryforge input plugin configured: agent_kind=%s, interval=%d", ctx->agent_kind, ctx->metrics_interval); flb_custom_set_context(ins, ctx); @@ -152,9 +152,9 @@ static int cb_fluentdo_init(struct flb_custom_instance *ins, } /* Callback for plugin cleanup */ -static int cb_fluentdo_exit(void *data, struct flb_config *config) +static int cb_telemetryforge_exit(void *data, struct flb_config *config) { - struct flb_fluentdo *ctx = data; + struct flb_telemetryforge *ctx = data; if (!ctx) { return 0; @@ -167,53 +167,53 @@ static int cb_fluentdo_exit(void *data, struct flb_config *config) /* Plugin configuration map */ static struct flb_config_map config_map[] = { { - FLB_CONFIG_MAP_STR, "api_url", FLUENTDO_DEFAULT_URL, - 0, FLB_TRUE, offsetof(struct flb_fluentdo, api_url), - "FluentDo Manager GraphQL API endpoint URL" + FLB_CONFIG_MAP_STR, "api_url", TELEMETRY_FORGE_DEFAULT_URL, + 0, FLB_TRUE, offsetof(struct flb_telemetryforge, api_url), + "Telemetry Forge Manager GraphQL API endpoint URL" }, { FLB_CONFIG_MAP_STR, "api_token", NULL, - 0, FLB_TRUE, offsetof(struct flb_fluentdo, api_token), - "FluentDo Manager API token for registration" + 0, FLB_TRUE, offsetof(struct flb_telemetryforge, api_token), + "Telemetry Forge Manager API token for registration" }, { FLB_CONFIG_MAP_STR, "agent_name", NULL, - 0, FLB_TRUE, offsetof(struct flb_fluentdo, agent_name), + 0, FLB_TRUE, offsetof(struct flb_telemetryforge, agent_name), "Agent name (defaults to hostname)" }, { - FLB_CONFIG_MAP_STR, "agent_kind", "fluentdo", - 0, FLB_TRUE, offsetof(struct flb_fluentdo, agent_kind), - "Agent kind: 'fluentbit' or 'fluentdo' (default: 'fluentdo')" + FLB_CONFIG_MAP_STR, "agent_kind", "telemetryforge", + 0, FLB_TRUE, offsetof(struct flb_telemetryforge, agent_kind), + "Agent kind: 'fluentbit' or 'telemetryforge' (default: 'telemetryforge')" }, { FLB_CONFIG_MAP_INT, "metrics_interval", "60", - 0, FLB_TRUE, offsetof(struct flb_fluentdo, metrics_interval), + 0, FLB_TRUE, offsetof(struct flb_telemetryforge, metrics_interval), "Interval in seconds for metrics reporting" }, { - FLB_CONFIG_MAP_STR, "session_store_path", FLUENTDO_DEFAULT_SESSION_STORE, - 0, FLB_TRUE, offsetof(struct flb_fluentdo, session_store_path), + FLB_CONFIG_MAP_STR, "session_store_path", TELEMETRY_FORGE_DEFAULT_SESSION_STORE, + 0, FLB_TRUE, offsetof(struct flb_telemetryforge, session_store_path), "Path to store session state (agent_id and token)" }, { FLB_CONFIG_MAP_STR, "proxy", NULL, - 0, FLB_FALSE, offsetof(struct flb_fluentdo, proxy), + 0, FLB_FALSE, offsetof(struct flb_telemetryforge, proxy), "Specify an HTTP Proxy in format http://host:port" }, { FLB_CONFIG_MAP_STR, "label", NULL, - FLB_CONFIG_MAP_MULT, FLB_TRUE, offsetof(struct flb_fluentdo, label_list), + FLB_CONFIG_MAP_MULT, FLB_TRUE, offsetof(struct flb_telemetryforge, label_list), "Agent labels in key=value format (can be specified multiple times)" }, {0} }; /* Plugin registration */ -struct flb_custom_plugin custom_fluentdo_plugin = { - .name = "fluentdo", - .description = "FluentDo Manager Agent Registration", - .cb_init = cb_fluentdo_init, - .cb_exit = cb_fluentdo_exit, +struct flb_custom_plugin custom_telemetryforge_plugin = { + .name = "telemetryforge", + .description = "Telemetry Forge Manager Agent Registration", + .cb_init = cb_telemetryforge_init, + .cb_exit = cb_telemetryforge_exit, .config_map = config_map }; diff --git a/source/plugins/custom_fluentdo/fluentdo.h b/source/plugins/custom_telemetryforge/telemetryforge.h similarity index 92% rename from source/plugins/custom_fluentdo/fluentdo.h rename to source/plugins/custom_telemetryforge/telemetryforge.h index 85ded544..08f5f7a4 100644 --- a/source/plugins/custom_fluentdo/fluentdo.h +++ b/source/plugins/custom_telemetryforge/telemetryforge.h @@ -17,8 +17,8 @@ * limitations under the License. */ -#ifndef FLB_CUSTOM_FLUENTDO_H -#define FLB_CUSTOM_FLUENTDO_H +#ifndef FLB_CUSTOM_TELEMETRY_FORGE_H +#define FLB_CUSTOM_TELEMETRY_FORGE_H #include #include diff --git a/source/plugins/in_fluentdo/CMakeLists.txt b/source/plugins/in_fluentdo/CMakeLists.txt deleted file mode 100644 index e646bf6f..00000000 --- a/source/plugins/in_fluentdo/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -set(src - fluentdo.c - ) - -FLB_PLUGIN(in_fluentdo "${src}" "") diff --git a/source/plugins/in_telemetryforge/CMakeLists.txt b/source/plugins/in_telemetryforge/CMakeLists.txt new file mode 100644 index 00000000..b20c1401 --- /dev/null +++ b/source/plugins/in_telemetryforge/CMakeLists.txt @@ -0,0 +1,5 @@ +set(src + telemetryforge.c + ) + +FLB_PLUGIN(in_telemetryforge "${src}" "") diff --git a/source/plugins/in_fluentdo/fluentdo.c b/source/plugins/in_telemetryforge/telemetryforge.c similarity index 87% rename from source/plugins/in_fluentdo/fluentdo.c rename to source/plugins/in_telemetryforge/telemetryforge.c index 418abd61..b1d44ae1 100644 --- a/source/plugins/in_fluentdo/fluentdo.c +++ b/source/plugins/in_telemetryforge/telemetryforge.c @@ -42,16 +42,16 @@ #endif #include -#define FLUENTDO_DEFAULT_URL "https://api.fluent.do/graphql" -#define FLUENTDO_DEFAULT_INTERVAL 60 -#define FLUENTDO_SESSION_FILE "session" +#define TELEMETRY_FORGE_DEFAULT_URL "https://api.fluent.do/graphql" +#define TELEMETRY_FORGE_DEFAULT_INTERVAL 60 +#define TELEMETRY_FORGE_SESSION_FILE "session" /* Macro for stringifying build metadata */ #define STRINGIFY(x) #x #define TOSTRING(x) STRINGIFY(x) /* Plugin context */ -struct flb_in_fluentdo { +struct flb_in_telemetryforge { struct flb_graphql_client *graphql_client; struct flb_input_instance *ins; @@ -176,7 +176,7 @@ static struct mk_list *parse_labels(struct flb_input_instance *ins, } /* Load session from file store */ -static int load_session(struct flb_in_fluentdo *ctx) +static int load_session(struct flb_in_telemetryforge *ctx) { int ret; int i; @@ -239,7 +239,7 @@ static int load_session(struct flb_in_fluentdo *ctx) } /* Save session to file store */ -static int save_session(struct flb_in_fluentdo *ctx) +static int save_session(struct flb_in_telemetryforge *ctx) { int ret; msgpack_sbuffer mp_sbuf; @@ -256,7 +256,7 @@ static int save_session(struct flb_in_fluentdo *ctx) /* Create new session file with size hint */ ctx->fs_file = flb_fstore_file_create(ctx->fs, ctx->fs_stream, - FLUENTDO_SESSION_FILE, 1024); + TELEMETRY_FORGE_SESSION_FILE, 1024); if (!ctx->fs_file) { flb_plg_error(ctx->ins, "could not create session file"); return -1; @@ -298,7 +298,7 @@ static int save_session(struct flb_in_fluentdo *ctx) } /* Initialize file store */ -static int store_init(struct flb_in_fluentdo *ctx) +static int store_init(struct flb_in_telemetryforge *ctx) { struct flb_fstore_file *fsf; @@ -314,7 +314,7 @@ static int store_init(struct flb_in_fluentdo *ctx) } /* Create stream */ - ctx->fs_stream = flb_fstore_stream_create(ctx->fs, "fluentdo"); + ctx->fs_stream = flb_fstore_stream_create(ctx->fs, "telemetryforge"); if (!ctx->fs_stream) { flb_plg_error(ctx->ins, "could not create storage stream"); return -1; @@ -322,8 +322,8 @@ static int store_init(struct flb_in_fluentdo *ctx) /* Look for existing session file */ fsf = flb_fstore_file_get(ctx->fs, ctx->fs_stream, - FLUENTDO_SESSION_FILE, - strlen(FLUENTDO_SESSION_FILE)); + TELEMETRY_FORGE_SESSION_FILE, + strlen(TELEMETRY_FORGE_SESSION_FILE)); if (fsf) { ctx->fs_file = fsf; load_session(ctx); @@ -374,8 +374,8 @@ static uint64_t collect_output_bytes(struct flb_config *config) return total; } -/* Send metrics to FluentDo API */ -static int send_metrics(struct flb_in_fluentdo *ctx, struct flb_config *config) +/* Send metrics to Telemetry Forge API */ +static int send_metrics(struct flb_in_telemetryforge *ctx, struct flb_config *config) { int ret; uint64_t input_bytes; @@ -433,10 +433,10 @@ static int send_metrics(struct flb_in_fluentdo *ctx, struct flb_config *config) } /* Collector callback - called periodically */ -static int cb_fluentdo_collect(struct flb_input_instance *ins, +static int cb_telemetryforge_collect(struct flb_input_instance *ins, struct flb_config *config, void *in_context) { - struct flb_in_fluentdo *ctx = in_context; + struct flb_in_telemetryforge *ctx = in_context; flb_plg_debug(ins, "metrics collector triggered"); @@ -449,12 +449,12 @@ static int cb_fluentdo_collect(struct flb_input_instance *ins, } /* Callback for plugin initialization */ -static int cb_fluentdo_init(struct flb_input_instance *ins, +static int cb_telemetryforge_init(struct flb_input_instance *ins, struct flb_config *config, void *data) { int ret; - struct flb_in_fluentdo *ctx; + struct flb_in_telemetryforge *ctx; struct flb_graphql_create_agent_input input; struct flb_graphql_create_agent_result result; struct flb_graphql_client *update_client; @@ -465,7 +465,7 @@ static int cb_fluentdo_init(struct flb_input_instance *ins, const char *distro = NULL; const char *package_type = NULL; - ctx = flb_calloc(1, sizeof(struct flb_in_fluentdo)); + ctx = flb_calloc(1, sizeof(struct flb_in_telemetryforge)); if (!ctx) { flb_errno(); return -1; @@ -481,18 +481,18 @@ static int cb_fluentdo_init(struct flb_input_instance *ins, /* Set default interval if not provided */ if (ctx->interval_sec <= 0) { - ctx->interval_sec = FLUENTDO_DEFAULT_INTERVAL; + ctx->interval_sec = TELEMETRY_FORGE_DEFAULT_INTERVAL; } - /* Set default agent_kind to fluentdo if not provided */ + /* Set default agent_kind to telemetryforge if not provided */ if (!ctx->agent_kind) { - ctx->agent_kind = flb_strdup("fluentdo"); + ctx->agent_kind = flb_strdup("telemetryforge"); } /* Validate agent_kind */ if (strcasecmp(ctx->agent_kind, "fluentbit") != 0 && - strcasecmp(ctx->agent_kind, "fluentdo") != 0) { - flb_plg_error(ins, "invalid agent_kind: %s (must be 'fluentbit' or 'fluentdo')", + strcasecmp(ctx->agent_kind, "telemetryforge") != 0) { + flb_plg_error(ins, "invalid agent_kind: %s (must be 'fluentbit' or 'telemetryforge')", ctx->agent_kind); flb_free(ctx); return -1; @@ -528,14 +528,14 @@ static int cb_fluentdo_init(struct flb_input_instance *ins, commit_hash = "unknown"; #endif -#ifdef FLUENTDO_AGENT_DISTRO - build_distro = TOSTRING(FLUENTDO_AGENT_DISTRO); +#ifdef TELEMETRY_FORGE_AGENT_DISTRO + build_distro = TOSTRING(TELEMETRY_FORGE_AGENT_DISTRO); #else build_distro = "unknown"; #endif -#ifdef FLUENTDO_AGENT_PACKAGE_TYPE - build_package_type = TOSTRING(FLUENTDO_AGENT_PACKAGE_TYPE); +#ifdef TELEMETRY_FORGE_AGENT_PACKAGE_TYPE + build_package_type = TOSTRING(TELEMETRY_FORGE_AGENT_PACKAGE_TYPE); #else build_package_type = "unknown"; #endif @@ -606,14 +606,14 @@ static int cb_fluentdo_init(struct flb_input_instance *ins, input.labels = ctx->labels; /* Set build metadata if available */ -#ifdef FLUENTDO_AGENT_DISTRO - input.distro = TOSTRING(FLUENTDO_AGENT_DISTRO); +#ifdef TELEMETRY_FORGE_AGENT_DISTRO + input.distro = TOSTRING(TELEMETRY_FORGE_AGENT_DISTRO); #else input.distro = NULL; #endif -#ifdef FLUENTDO_AGENT_PACKAGE_TYPE - input.package_type = TOSTRING(FLUENTDO_AGENT_PACKAGE_TYPE); +#ifdef TELEMETRY_FORGE_AGENT_PACKAGE_TYPE + input.package_type = TOSTRING(TELEMETRY_FORGE_AGENT_PACKAGE_TYPE); #else input.package_type = NULL; #endif @@ -683,12 +683,12 @@ static int cb_fluentdo_init(struct flb_input_instance *ins, /* Update agent config and labels using agent token */ if (config_content || (ctx->labels && mk_list_size(ctx->labels) > 0)) { /* Set build metadata if available */ -#ifdef FLUENTDO_AGENT_DISTRO - distro = TOSTRING(FLUENTDO_AGENT_DISTRO); +#ifdef TELEMETRY_FORGE_AGENT_DISTRO + distro = TOSTRING(TELEMETRY_FORGE_AGENT_DISTRO); #endif -#ifdef FLUENTDO_AGENT_PACKAGE_TYPE - package_type = TOSTRING(FLUENTDO_AGENT_PACKAGE_TYPE); +#ifdef TELEMETRY_FORGE_AGENT_PACKAGE_TYPE + package_type = TOSTRING(TELEMETRY_FORGE_AGENT_PACKAGE_TYPE); #endif /* Create GraphQL client with agent token for update */ @@ -723,7 +723,7 @@ static int cb_fluentdo_init(struct flb_input_instance *ins, /* Set up periodic collector */ flb_plg_debug(ins, "setting up collector with interval=%d seconds", ctx->interval_sec); ret = flb_input_set_collector_time(ins, - cb_fluentdo_collect, + cb_telemetryforge_collect, ctx->interval_sec, 0, config); if (ret == -1) { @@ -748,9 +748,9 @@ static int cb_fluentdo_init(struct flb_input_instance *ins, } /* Callback for plugin cleanup */ -static int cb_fluentdo_exit(void *data, struct flb_config *config) +static int cb_telemetryforge_exit(void *data, struct flb_config *config) { - struct flb_in_fluentdo *ctx = data; + struct flb_in_telemetryforge *ctx = data; struct mk_list *head, *tmp; struct flb_graphql_label *label; @@ -793,57 +793,57 @@ static int cb_fluentdo_exit(void *data, struct flb_config *config) /* Plugin configuration map */ static struct flb_config_map config_map[] = { { - FLB_CONFIG_MAP_STR, "api_url", FLUENTDO_DEFAULT_URL, - 0, FLB_TRUE, offsetof(struct flb_in_fluentdo, api_url), - "FluentDo Manager GraphQL API endpoint URL" + FLB_CONFIG_MAP_STR, "api_url", TELEMETRY_FORGE_DEFAULT_URL, + 0, FLB_TRUE, offsetof(struct flb_in_telemetryforge, api_url), + "Telemetry Forge Manager GraphQL API endpoint URL" }, { FLB_CONFIG_MAP_STR, "api_token", NULL, - 0, FLB_TRUE, offsetof(struct flb_in_fluentdo, api_token), - "FluentDo Manager API token for registration" + 0, FLB_TRUE, offsetof(struct flb_in_telemetryforge, api_token), + "Telemetry Forge Manager API token for registration" }, { FLB_CONFIG_MAP_STR, "agent_name", NULL, - 0, FLB_TRUE, offsetof(struct flb_in_fluentdo, agent_name), + 0, FLB_TRUE, offsetof(struct flb_in_telemetryforge, agent_name), "Agent name (defaults to hostname)" }, { - FLB_CONFIG_MAP_STR, "agent_kind", "fluentdo", - 0, FLB_TRUE, offsetof(struct flb_in_fluentdo, agent_kind), - "Agent kind: 'fluentbit' or 'fluentdo' (default: 'fluentdo')" + FLB_CONFIG_MAP_STR, "agent_kind", "telemetryforge", + 0, FLB_TRUE, offsetof(struct flb_in_telemetryforge, agent_kind), + "Agent kind: 'fluentbit', 'fluentdo' or 'telemetryforge' (default: 'telemetryforge')" }, { FLB_CONFIG_MAP_INT, "interval_sec", "60", - 0, FLB_TRUE, offsetof(struct flb_in_fluentdo, interval_sec), + 0, FLB_TRUE, offsetof(struct flb_in_telemetryforge, interval_sec), "Interval in seconds for metrics reporting" }, { FLB_CONFIG_MAP_STR, "store_path", NULL, - 0, FLB_TRUE, offsetof(struct flb_in_fluentdo, store_path), + 0, FLB_TRUE, offsetof(struct flb_in_telemetryforge, store_path), "Path to store session state (agent_id and token)" }, { FLB_CONFIG_MAP_STR, "proxy", NULL, - 0, FLB_FALSE, offsetof(struct flb_in_fluentdo, proxy), + 0, FLB_FALSE, offsetof(struct flb_in_telemetryforge, proxy), "Specify an HTTP Proxy in format http://host:port" }, { FLB_CONFIG_MAP_STR, "label", NULL, - FLB_CONFIG_MAP_MULT, FLB_TRUE, offsetof(struct flb_in_fluentdo, label_list), + FLB_CONFIG_MAP_MULT, FLB_TRUE, offsetof(struct flb_in_telemetryforge, label_list), "Agent labels in key=value format (can be specified multiple times)" }, {0} }; /* Plugin registration */ -struct flb_input_plugin in_fluentdo_plugin = { - .name = "fluentdo", - .description = "FluentDo Manager Agent Integration with Metrics", - .cb_init = cb_fluentdo_init, +struct flb_input_plugin in_telemetryforge_plugin = { + .name = "telemetryforge", + .description = "Telemetry Forge Manager Agent Integration with Metrics", + .cb_init = cb_telemetryforge_init, .cb_pre_run = NULL, - .cb_collect = cb_fluentdo_collect, + .cb_collect = cb_telemetryforge_collect, .cb_flush_buf = NULL, - .cb_exit = cb_fluentdo_exit, + .cb_exit = cb_telemetryforge_exit, .config_map = config_map, .flags = 0 }; diff --git a/source/plugins/in_fluentdo/fluentdo.h b/source/plugins/in_telemetryforge/telemetryforge.h similarity index 92% rename from source/plugins/in_fluentdo/fluentdo.h rename to source/plugins/in_telemetryforge/telemetryforge.h index 1fc89133..4651ab12 100644 --- a/source/plugins/in_fluentdo/fluentdo.h +++ b/source/plugins/in_telemetryforge/telemetryforge.h @@ -17,8 +17,8 @@ * limitations under the License. */ -#ifndef FLB_IN_FLUENTDO_H -#define FLB_IN_FLUENTDO_H +#ifndef FLB_IN_TELEMETRY_FORGE_H +#define FLB_IN_TELEMETRY_FORGE_H #include #include diff --git a/source/src/flb_engine.c b/source/src/flb_engine.c index 5b7df0fe..40a06b19 100644 --- a/source/src/flb_engine.c +++ b/source/src/flb_engine.c @@ -772,7 +772,7 @@ int flb_engine_start(struct flb_config *config) return -1; } - flb_info("[fluentdo agent] version=%s, commit=%.10s, pid=%i", + flb_info("[telemetryforge agent] version=%s, commit=%.10s, pid=%i", FLB_VERSION_STR, FLB_GIT_HASH, getpid()); #ifdef FLB_SYSTEM_WINDOWS diff --git a/testing/bats/helpers/test-helpers.bash b/testing/bats/helpers/test-helpers.bash index b68c31f9..1bfad692 100644 --- a/testing/bats/helpers/test-helpers.bash +++ b/testing/bats/helpers/test-helpers.bash @@ -26,7 +26,7 @@ function skipIfNotLinux() { } function skipIfPackageNotInstalled() { - if [[ "${FLUENTDO_AGENT_PACKAGE_INSTALLED:-}" != "true" ]]; then + if [[ "${TELEMETRY_FORGE_AGENT_PACKAGE_INSTALLED:-}" != "true" ]]; then skip 'Skipping test: package not installed' fi } @@ -65,11 +65,11 @@ function skipIfNotMacOS() { } function skipIfNotContainer() { - if [ -z "${FLUENTDO_AGENT_IMAGE}" ]; then - skip "Skipping test: FLUENTDO_AGENT_IMAGE not set" + if [ -z "${TELEMETRY_FORGE_AGENT_IMAGE}" ]; then + skip "Skipping test: TELEMETRY_FORGE_AGENT_IMAGE not set" fi - if [ -z "${FLUENTDO_AGENT_TAG}" ]; then - fail "FLUENTDO_AGENT_TAG not set" + if [ -z "${TELEMETRY_FORGE_AGENT_TAG}" ]; then + fail "TELEMETRY_FORGE_AGENT_TAG not set" fi CONTAINER_RUNTIME=${CONTAINER_RUNTIME:-docker} # All container tests assume Docker is available and can run containers diff --git a/testing/bats/run-bats.sh b/testing/bats/run-bats.sh index 4c796177..753240fd 100755 --- a/testing/bats/run-bats.sh +++ b/testing/bats/run-bats.sh @@ -14,16 +14,16 @@ done SCRIPT_DIR=$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd ) export FLUENT_BIT_BINARY=${FLUENT_BIT_BINARY:-/fluent-bit/bin/fluent-bit} -export FLUENTDO_AGENT_VERSION=${FLUENTDO_AGENT_VERSION:-26.1.3} -export FLUENTDO_AGENT_URL="${FLUENTDO_AGENT_URL:-https://staging.fluent.do}" +export TELEMETRY_FORGE_AGENT_VERSION=${TELEMETRY_FORGE_AGENT_VERSION:-26.1.3} +export TELEMETRY_FORGE_AGENT_URL="${TELEMETRY_FORGE_AGENT_URL:-https://staging.fluent.do}" echo "INFO: Testing with binary '$FLUENT_BIT_BINARY'" -echo "INFO: Testing with version '$FLUENTDO_AGENT_VERSION'" -echo "INFO: Testing with URL '$FLUENTDO_AGENT_URL'" +echo "INFO: Testing with version '$TELEMETRY_FORGE_AGENT_VERSION'" +echo "INFO: Testing with URL '$TELEMETRY_FORGE_AGENT_URL'" # Optional variables for container/k8s tests -# FLUENTDO_AGENT_IMAGE=... -# FLUENTDO_AGENT_TAG=... +# TELEMETRY_FORGE_AGENT_IMAGE=... +# TELEMETRY_FORGE_AGENT_TAG=... # Attempt to auto-parallelise when available, only across files if [[ -z "${BATS_PARALLEL_BINARY_NAME:-}" ]]; then diff --git a/testing/bats/run-container-integration-tests.sh b/testing/bats/run-container-integration-tests.sh index 37c2f08b..2c779134 100755 --- a/testing/bats/run-container-integration-tests.sh +++ b/testing/bats/run-container-integration-tests.sh @@ -13,8 +13,8 @@ while [ -L "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symli done SCRIPT_DIR=$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd ) -export FLUENTDO_AGENT_IMAGE=${FLUENTDO_AGENT_IMAGE:?} -export FLUENTDO_AGENT_TAG=${FLUENTDO_AGENT_TAG:?} +export TELEMETRY_FORGE_AGENT_IMAGE=${TELEMETRY_FORGE_AGENT_IMAGE:?} +export TELEMETRY_FORGE_AGENT_TAG=${TELEMETRY_FORGE_AGENT_TAG:?} export CONTAINER_RUNTIME=${CONTAINER_RUNTIME:-docker} "$SCRIPT_DIR"/run-bats.sh --filter-tags 'integration,containers' --recursive "$SCRIPT_DIR/tests" diff --git a/testing/bats/run-k8s-integration-tests.sh b/testing/bats/run-k8s-integration-tests.sh index 511b3edd..44ea4a02 100755 --- a/testing/bats/run-k8s-integration-tests.sh +++ b/testing/bats/run-k8s-integration-tests.sh @@ -19,11 +19,11 @@ REPO_ROOT=${REPO_ROOT:-"$SCRIPT_DIR/../.."} # Allow overriding container runtime, default to docker export CONTAINER_RUNTIME=${CONTAINER_RUNTIME:-docker} -export FLUENTDO_AGENT_IMAGE=${FLUENTDO_AGENT_IMAGE:-ghcr.io/fluentdo/agent/ubi} +export TELEMETRY_FORGE_AGENT_IMAGE=${TELEMETRY_FORGE_AGENT_IMAGE:-ghcr.io/telemetryforge/agent/ubi} # Set this to `local` to build and use a local image -export FLUENTDO_AGENT_TAG=${FLUENTDO_AGENT_TAG:-main} +export TELEMETRY_FORGE_AGENT_TAG=${TELEMETRY_FORGE_AGENT_TAG:-main} -CONTAINER_IMAGE="${FLUENTDO_AGENT_IMAGE}:${FLUENTDO_AGENT_TAG}" +CONTAINER_IMAGE="${TELEMETRY_FORGE_AGENT_IMAGE}:${TELEMETRY_FORGE_AGENT_TAG}" KIND_CLUSTER_NAME=${KIND_CLUSTER_NAME:-kind} KIND_VERSION=${KIND_VERSION:-v1.34.0} KIND_NODE_IMAGE=${KIND_NODE_IMAGE:-kindest/node:$KIND_VERSION} @@ -33,9 +33,9 @@ echo "INFO: Using KIND cluster name: $KIND_CLUSTER_NAME" echo "INFO: Using KIND node image: $KIND_NODE_IMAGE" # Always attempt to pull the latest image unless we are using a local image -if [[ "$FLUENTDO_AGENT_TAG" == "local" ]]; then - # Build the local image if needed, assume if FLUENTDO_AGENT_IMAGE ends in "ubi" we build the Dockerfile.ubi - if [[ "$FLUENTDO_AGENT_IMAGE" == *"ubi" ]]; then +if [[ "$TELEMETRY_FORGE_AGENT_TAG" == "local" ]]; then + # Build the local image if needed, assume if TELEMETRY_FORGE_AGENT_IMAGE ends in "ubi" we build the Dockerfile.ubi + if [[ "$TELEMETRY_FORGE_AGENT_IMAGE" == *"ubi" ]]; then echo "INFO: Building local UBI image" "$CONTAINER_RUNTIME" build -t "$CONTAINER_IMAGE" -f "$REPO_ROOT"/Dockerfile.ubi "$REPO_ROOT" else diff --git a/testing/bats/run-package-functional-tests.sh b/testing/bats/run-package-functional-tests.sh index 6e931b70..6384dadf 100755 --- a/testing/bats/run-package-functional-tests.sh +++ b/testing/bats/run-package-functional-tests.sh @@ -16,11 +16,11 @@ SCRIPT_DIR=$(cd -P "$(dirname "$SOURCE")" >/dev/null 2>&1 && pwd) export CONTAINER_RUNTIME=${CONTAINER_RUNTIME:-docker} export BASE_IMAGE=${BASE_IMAGE:-dokken/centos-6} export DISTRO=${DISTRO:-centos/6} -export FLUENT_BIT_BINARY=${FLUENT_BIT_BINARY:-/opt/fluentdo-agent/bin/fluent-bit} +export FLUENT_BIT_BINARY=${FLUENT_BIT_BINARY:-/opt/telemetryforge-agent/bin/fluent-bit} # Only used if no packages downloaded and running manually (not in CI) -export FLUENTDO_AGENT_URL=${FLUENTDO_AGENT_URL:-https://staging.fluent.do} -export FLUENTDO_AGENT_VERSION=${FLUENTDO_AGENT_VERSION:-26.1.3} +export TELEMETRY_FORGE_AGENT_URL=${TELEMETRY_FORGE_AGENT_URL:-https://staging.fluent.do} +export TELEMETRY_FORGE_AGENT_VERSION=${TELEMETRY_FORGE_AGENT_VERSION:-26.1.3} # Location of packages to test export DOWNLOAD_DIR=${DOWNLOAD_DIR:-$PWD/downloads} @@ -50,7 +50,7 @@ if [[ $FOUND_FILES == false ]]; then exit 1 else echo "INFO: Package to use is not present in $DOWNLOAD_DIR so will download now" - echo "INFO: e.g. cd $DOWNLOAD_DIR && curl -sSfLO https://${FLUENTDO_AGENT_URL}/${FLUENTDO_AGENT_VERSION}/output/package-almalinux-8/fluentdo-agent-${FLUENTDO_AGENT_VERSION}.x86_64.rpm" + echo "INFO: e.g. cd $DOWNLOAD_DIR && curl -sSfLO https://${TELEMETRY_FORGE_AGENT_URL}/${TELEMETRY_FORGE_AGENT_VERSION}/output/package-almalinux-8/telemetryforge-agent-${TELEMETRY_FORGE_AGENT_VERSION}.x86_64.rpm" # Set up overrides for install script # almalinux/8 becomes DISTRO_ID=almalinux, DISTRO_VERSION=8 @@ -77,7 +77,7 @@ echo "INFO: running test container 'bats/test/$DISTRO'" "${CONTAINER_RUNTIME}" run --rm -t \ -v "$DOWNLOAD_DIR:/downloads:ro" \ -e FLUENT_BIT_BINARY="$FLUENT_BIT_BINARY" \ - -e FLUENTDO_AGENT_PACKAGE_INSTALLED=true \ + -e TELEMETRY_FORGE_AGENT_PACKAGE_INSTALLED=true \ "bats/test/$DISTRO" echo "INFO: All tests complete" diff --git a/testing/bats/run-package-integration-tests.sh b/testing/bats/run-package-integration-tests.sh index 142a843c..96a4454f 100755 --- a/testing/bats/run-package-integration-tests.sh +++ b/testing/bats/run-package-integration-tests.sh @@ -13,7 +13,7 @@ while [ -L "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symli done SCRIPT_DIR=$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd ) -export FLUENT_BIT_BINARY=${FLUENT_BIT_BINARY:-/opt/fluentdo-agent/bin/fluent-bit} +export FLUENT_BIT_BINARY=${FLUENT_BIT_BINARY:-/opt/telemetryforge-agent/bin/fluent-bit} "$SCRIPT_DIR"/run-bats.sh --filter-tags 'integration,!container,!k8s' --recursive "$SCRIPT_DIR/tests" echo "INFO: All tests complete" diff --git a/testing/bats/tests/functional/common/simple.bats b/testing/bats/tests/functional/common/simple.bats index d65d2124..3a748d0c 100644 --- a/testing/bats/tests/functional/common/simple.bats +++ b/testing/bats/tests/functional/common/simple.bats @@ -19,15 +19,15 @@ function teardown() { [ -x "$FLUENT_BIT_BINARY" ] } -@test "verify FLUENTDO_AGENT_VERSION is set and valid" { - [ -n "${FLUENTDO_AGENT_VERSION:-}" ] - [[ "$FLUENTDO_AGENT_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] +@test "verify TELEMETRY_FORGE_AGENT_VERSION is set and valid" { + [ -n "${TELEMETRY_FORGE_AGENT_VERSION:-}" ] + [[ "$TELEMETRY_FORGE_AGENT_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] } @test "verify version" { run "$FLUENT_BIT_BINARY" --version [ "$status" -eq 0 ] - [[ "$output" =~ FluentDo\ Agent\ v$FLUENTDO_AGENT_VERSION ]] + [[ "$output" =~ Telemetry\ Forge\ Agent\ v$TELEMETRY_FORGE_AGENT_VERSION ]] } @test "verify help" { diff --git a/testing/bats/tests/functional/linux/verify-deb.bats b/testing/bats/tests/functional/linux/verify-deb.bats index 987df111..d4d534f2 100644 --- a/testing/bats/tests/functional/linux/verify-deb.bats +++ b/testing/bats/tests/functional/linux/verify-deb.bats @@ -16,7 +16,7 @@ setup() { skip "Skipping test: no dpkg command" fi - export PACKAGE_NAME="fluentdo-agent" + export PACKAGE_NAME="telemetryforge-agent" } teardown() { @@ -37,11 +37,11 @@ teardown() { @test "DEB package version is correct" { run dpkg -s "$PACKAGE_NAME" assert_success - assert_output --partial "Version: $FLUENTDO_AGENT_VERSION" + assert_output --partial "Version: $TELEMETRY_FORGE_AGENT_VERSION" assert_output --partial 'Status: install ok installed' } -@test "DEB package provides fluentdo-agent" { +@test "DEB package provides telemetryforge-agent" { run apt-cache policy "$PACKAGE_NAME" assert_success } diff --git a/testing/bats/tests/functional/linux/verify-files.bats b/testing/bats/tests/functional/linux/verify-files.bats index 9ae6608b..cdaae8ea 100644 --- a/testing/bats/tests/functional/linux/verify-files.bats +++ b/testing/bats/tests/functional/linux/verify-files.bats @@ -11,8 +11,8 @@ load "$BATS_FILE_ROOT/load.bash" setup() { skipIfNotLinux - export INSTALL_PREFIX="/opt/fluentdo-agent" - export PACKAGE_NAME="fluentdo-agent" + export INSTALL_PREFIX="/opt/telemetryforge-agent" + export PACKAGE_NAME="telemetryforge-agent" # Ensure we skip tests in the container skipIfPackageNotInstalled @@ -34,19 +34,19 @@ teardown() { # /etc/fluent-bit/fluent-bit.conf # /etc/fluent-bit/parsers.conf # /etc/fluent-bit/plugins.conf -# /opt/fluentdo-agent/bin/fluent-bit +# /opt/telemetryforge-agent/bin/fluent-bit # [/usr]/lib/systemd/system/fluent-bit.service # ============================================================================ # Installation Directory Tests # ============================================================================ -@test "Installation directory /opt/fluentdo-agent exists" { - [ -d "/opt/fluentdo-agent" ] +@test "Installation directory /opt/telemetryforge-agent exists" { + [ -d "/opt/telemetryforge-agent" ] } -@test "bin directory exists at /opt/fluentdo-agent/bin" { - [ -d "/opt/fluentdo-agent/bin" ] +@test "bin directory exists at /opt/telemetryforge-agent/bin" { + [ -d "/opt/telemetryforge-agent/bin" ] } # Negative test for hyphenated directory which should not be present @@ -58,7 +58,7 @@ teardown() { # Binary Tests # ============================================================================ -@test "Main binary exists at /opt/fluentdo-agent/bin/fluent-bit" { +@test "Main binary exists at /opt/telemetryforge-agent/bin/fluent-bit" { assert_file_exists "$INSTALL_PREFIX/bin/fluent-bit" } @@ -128,17 +128,17 @@ teardown() { @test "Systemd service file contains correct description" { skipIfCentos6 - grep -q "Description=FluentDo Agent" \ + grep -q "Description=Telemetry Forge Agent" \ /lib/systemd/system/fluent-bit.service 2>/dev/null || \ - grep -q "Description=FluentDo Agent" \ + grep -q "Description=Telemetry Forge Agent" \ /usr/lib/systemd/system/fluent-bit.service 2>/dev/null } @test "Systemd service file points to correct executable" { skipIfCentos6 - grep -q "ExecStart=/opt/fluentdo-agent/bin/fluent-bit" \ + grep -q "ExecStart=/opt/telemetryforge-agent/bin/fluent-bit" \ /lib/systemd/system/fluent-bit.service 2>/dev/null || \ - grep -q "ExecStart=/opt/fluentdo-agent/bin/fluent-bit" \ + grep -q "ExecStart=/opt/telemetryforge-agent/bin/fluent-bit" \ /usr/lib/systemd/system/fluent-bit.service 2>/dev/null } diff --git a/testing/bats/tests/functional/linux/verify-rpm.bats b/testing/bats/tests/functional/linux/verify-rpm.bats index 567882a4..f257c443 100644 --- a/testing/bats/tests/functional/linux/verify-rpm.bats +++ b/testing/bats/tests/functional/linux/verify-rpm.bats @@ -16,7 +16,7 @@ setup() { skip "Skipping test: no RPM command" fi - export PACKAGE_NAME="fluentdo-agent" + export PACKAGE_NAME="telemetryforge-agent" } teardown() { @@ -28,7 +28,7 @@ teardown() { fi } -@test "RPM package provides fluentdo-agent" { +@test "RPM package provides telemetryforge-agent" { run rpm -qa assert_success assert_output --partial "$PACKAGE_NAME" @@ -43,7 +43,7 @@ teardown() { @test "RPM package files are correctly installed" { run rpm -ql "$PACKAGE_NAME" assert_success - assert_output --partial '/opt/fluentdo-agent/bin/fluent-bit' + assert_output --partial '/opt/telemetryforge-agent/bin/fluent-bit' } @test "RPM systemd service is installed" { diff --git a/testing/bats/tests/integration/containers/integration-simple-containers.bats b/testing/bats/tests/integration/containers/integration-simple-containers.bats index c22f19fe..3798b823 100644 --- a/testing/bats/tests/integration/containers/integration-simple-containers.bats +++ b/testing/bats/tests/integration/containers/integration-simple-containers.bats @@ -1,7 +1,7 @@ #!/usr/bin/env bats load "$HELPERS_ROOT/test-helpers.bash" -ensure_variables_set BATS_SUPPORT_ROOT BATS_ASSERT_ROOT BATS_FILE_ROOT FLUENTDO_AGENT_VERSION +ensure_variables_set BATS_SUPPORT_ROOT BATS_ASSERT_ROOT BATS_FILE_ROOT TELEMETRY_FORGE_AGENT_VERSION load "$BATS_SUPPORT_ROOT/load.bash" load "$BATS_ASSERT_ROOT/load.bash" @@ -15,27 +15,27 @@ setup() { skipIfNotContainer } -# All container tests use the environment variable FLUENTDO_AGENT_IMAGE to determine which image to test -@test "integration: verify FLUENTDO_AGENT_IMAGE is set" { - [ -n "${FLUENTDO_AGENT_IMAGE}" ] - [ -n "${FLUENTDO_AGENT_TAG}" ] +# All container tests use the environment variable TELEMETRY_FORGE_AGENT_IMAGE to determine which image to test +@test "integration: verify TELEMETRY_FORGE_AGENT_IMAGE is set" { + [ -n "${TELEMETRY_FORGE_AGENT_IMAGE}" ] + [ -n "${TELEMETRY_FORGE_AGENT_TAG}" ] } -# Verify we can pull and run the FLUENTDO_AGENT_IMAGE -@test "integration: verify pulling and running FLUENTDO_AGENT_IMAGE" { - run "$CONTAINER_RUNTIME" pull "${FLUENTDO_AGENT_IMAGE}:${FLUENTDO_AGENT_TAG}" +# Verify we can pull and run the TELEMETRY_FORGE_AGENT_IMAGE +@test "integration: verify pulling and running TELEMETRY_FORGE_AGENT_IMAGE" { + run "$CONTAINER_RUNTIME" pull "${TELEMETRY_FORGE_AGENT_IMAGE}:${TELEMETRY_FORGE_AGENT_TAG}" assert_success - run "$CONTAINER_RUNTIME" run --rm -t "${FLUENTDO_AGENT_IMAGE}:${FLUENTDO_AGENT_TAG}" --version + run "$CONTAINER_RUNTIME" run --rm -t "${TELEMETRY_FORGE_AGENT_IMAGE}:${TELEMETRY_FORGE_AGENT_TAG}" --version assert_success - assert_output --partial "FluentDo Agent v$FLUENTDO_AGENT_VERSION" + assert_output --partial "Telemetry Forge Agent v$TELEMETRY_FORGE_AGENT_VERSION" } @test "integration: verify default configuration is valid" { assert_file_exist "$BATS_TEST_DIRNAME/resources/fluent-bit.yaml" run "$CONTAINER_RUNTIME" run --rm -t \ -v "$BATS_TEST_DIRNAME/resources/fluent-bit.yaml:/fluent-bit/etc/fluent-bit.yaml:ro" \ - "${FLUENTDO_AGENT_IMAGE}:${FLUENTDO_AGENT_TAG}" \ + "${TELEMETRY_FORGE_AGENT_IMAGE}:${TELEMETRY_FORGE_AGENT_TAG}" \ -c /fluent-bit/etc/fluent-bit.yaml --dry-run assert_success assert_output --partial "configuration test is successful" diff --git a/testing/bats/tests/integration/k8s/chunk-rollover/basic.bats b/testing/bats/tests/integration/k8s/chunk-rollover/basic.bats index 060490f8..79154dbd 100644 --- a/testing/bats/tests/integration/k8s/chunk-rollover/basic.bats +++ b/testing/bats/tests/integration/k8s/chunk-rollover/basic.bats @@ -31,8 +31,8 @@ function teardown() { # replace the namespace for svc FQDN helm upgrade --install --create-namespace --namespace "$NAMESPACE" "$HELM_RELEASE_NAME" fluent/fluent-bit \ --values ${BATS_TEST_DIRNAME}/resources/helm/fluentbit-basic.yaml \ - --set image.repository="$FLUENTDO_AGENT_IMAGE" \ - --set image.tag="$FLUENTDO_AGENT_TAG" \ + --set image.repository="$TELEMETRY_FORGE_AGENT_IMAGE" \ + --set image.tag="$TELEMETRY_FORGE_AGENT_TAG" \ --set securityContext.runAsUser=0 \ --set env[0].name=NAMESPACE,env[0].value="${NAMESPACE}" \ --timeout "${HELM_TIMEOUT:-5m0s}" \ diff --git a/testing/bats/tests/integration/k8s/elasticsearch/basic.bats b/testing/bats/tests/integration/k8s/elasticsearch/basic.bats index 45748121..e5782170 100644 --- a/testing/bats/tests/integration/k8s/elasticsearch/basic.bats +++ b/testing/bats/tests/integration/k8s/elasticsearch/basic.bats @@ -49,8 +49,8 @@ function teardown() { helm upgrade --install --create-namespace --namespace "$NAMESPACE" "$HELM_RELEASE_NAME" fluent/fluent-bit \ --values "${BATS_TEST_DIRNAME}/resources/helm/fluentbit-basic.yaml" \ - --set image.repository="$FLUENTDO_AGENT_IMAGE" \ - --set image.tag="$FLUENTDO_AGENT_TAG" \ + --set image.repository="$TELEMETRY_FORGE_AGENT_IMAGE" \ + --set image.tag="$TELEMETRY_FORGE_AGENT_TAG" \ --set securityContext.runAsUser=0 \ --timeout "${HELM_TIMEOUT:-5m0s}" \ --wait diff --git a/testing/bats/tests/integration/k8s/elasticsearch/compress.bats b/testing/bats/tests/integration/k8s/elasticsearch/compress.bats index c6ce503f..676ab247 100644 --- a/testing/bats/tests/integration/k8s/elasticsearch/compress.bats +++ b/testing/bats/tests/integration/k8s/elasticsearch/compress.bats @@ -49,8 +49,8 @@ function teardown() { helm upgrade --install --create-namespace --namespace "$NAMESPACE" "$HELM_RELEASE_NAME" fluent/fluent-bit \ --values ${BATS_TEST_DIRNAME}/resources/helm/fluentbit-compress.yaml \ - --set image.repository="$FLUENTDO_AGENT_IMAGE" \ - --set image.tag="$FLUENTDO_AGENT_TAG" \ + --set image.repository="$TELEMETRY_FORGE_AGENT_IMAGE" \ + --set image.tag="$TELEMETRY_FORGE_AGENT_TAG" \ --set securityContext.runAsUser=0 \ --timeout "${HELM_TIMEOUT:-10m0s}" \ --wait diff --git a/testing/bats/tests/integration/k8s/integration-basic-helm.bats b/testing/bats/tests/integration/k8s/integration-basic-helm.bats index aa8c209f..d6b22329 100644 --- a/testing/bats/tests/integration/k8s/integration-basic-helm.bats +++ b/testing/bats/tests/integration/k8s/integration-basic-helm.bats @@ -33,8 +33,8 @@ function teardown() { # Run with YAML configuration overrides # We need to run as root to create a DB file in /var/log run helm upgrade --install "$HELM_RELEASE_NAME" fluent/fluent-bit \ - --set image.repository="$FLUENTDO_AGENT_IMAGE" \ - --set image.tag="$FLUENTDO_AGENT_TAG" \ + --set image.repository="$TELEMETRY_FORGE_AGENT_IMAGE" \ + --set image.tag="$TELEMETRY_FORGE_AGENT_TAG" \ --set existingConfigMap=$CONFIGMAP_NAME \ --set args[0]='--workdir=/fluent-bit/etc' \ --set args[1]='--config=/fluent-bit/etc/conf/fluent-bit.yaml' \ diff --git a/testing/bats/tests/integration/k8s/integration-systemd.bats b/testing/bats/tests/integration/k8s/integration-systemd.bats index 4d120c9b..49c5f516 100644 --- a/testing/bats/tests/integration/k8s/integration-systemd.bats +++ b/testing/bats/tests/integration/k8s/integration-systemd.bats @@ -33,8 +33,8 @@ function teardown() { # Run with YAML configuration overrides assert_file_exist "$BATS_TEST_DIRNAME/resources/systemd/values.yaml" run helm upgrade --install "$HELM_RELEASE_NAME" fluent/fluent-bit \ - --set image.repository="$FLUENTDO_AGENT_IMAGE" \ - --set image.tag="$FLUENTDO_AGENT_TAG" \ + --set image.repository="$TELEMETRY_FORGE_AGENT_IMAGE" \ + --set image.tag="$TELEMETRY_FORGE_AGENT_TAG" \ --set existingConfigMap=$CONFIGMAP_NAME \ --values "$BATS_TEST_DIRNAME/resources/systemd/values.yaml" \ --timeout "${HELM_TIMEOUT:-5m0s}" \ diff --git a/testing/bats/tests/integration/k8s/kubernetes-plugins/namespaceLabels.bats b/testing/bats/tests/integration/k8s/kubernetes-plugins/namespaceLabels.bats index f742416a..182fbe86 100644 --- a/testing/bats/tests/integration/k8s/kubernetes-plugins/namespaceLabels.bats +++ b/testing/bats/tests/integration/k8s/kubernetes-plugins/namespaceLabels.bats @@ -115,8 +115,8 @@ function assertOutputHasNamespaceLabels() { function deployFB() { run helm upgrade --install --create-namespace --namespace "$NAMESPACE" "$HELM_RELEASE_NAME" fluent/fluent-bit \ --values "${BATS_TEST_DIRNAME}/resources/fluentbit-namespace-labels.yaml" \ - --set image.repository="$FLUENTDO_AGENT_IMAGE" \ - --set image.tag="$FLUENTDO_AGENT_TAG" \ + --set image.repository="$TELEMETRY_FORGE_AGENT_IMAGE" \ + --set image.tag="$TELEMETRY_FORGE_AGENT_TAG" \ --set securityContext.runAsUser=0 \ --set env[0].name=NAMESPACE,env[0].value="${NAMESPACE}" \ --set env[1].name=NODE_IP,env[1].valueFrom.fieldRef.fieldPath=status.hostIP \ diff --git a/testing/bats/tests/integration/k8s/kubernetes-plugins/podLabels.bats b/testing/bats/tests/integration/k8s/kubernetes-plugins/podLabels.bats index e68e782c..30b05921 100644 --- a/testing/bats/tests/integration/k8s/kubernetes-plugins/podLabels.bats +++ b/testing/bats/tests/integration/k8s/kubernetes-plugins/podLabels.bats @@ -32,8 +32,8 @@ function teardown() { @test "integration: upstream add kubernetes pod labels to records" { run helm upgrade --install --create-namespace --namespace "$NAMESPACE" "$HELM_RELEASE_NAME" fluent/fluent-bit \ --values "${BATS_TEST_DIRNAME}/resources/fluentbit-pod-labels.yaml" \ - --set image.repository="$FLUENTDO_AGENT_IMAGE" \ - --set image.tag="$FLUENTDO_AGENT_TAG" \ + --set image.repository="$TELEMETRY_FORGE_AGENT_IMAGE" \ + --set image.tag="$TELEMETRY_FORGE_AGENT_TAG" \ --set securityContext.runAsUser=0 \ --set env[0].name=NAMESPACE,env[0].value="${NAMESPACE}" \ --set env[1].name=NODE_IP,env[1].valueFrom.fieldRef.fieldPath=status.hostIP \ diff --git a/testing/bats/tests/integration/k8s/opensearch/basic.bats b/testing/bats/tests/integration/k8s/opensearch/basic.bats index 2facaa56..8fbbfd5d 100644 --- a/testing/bats/tests/integration/k8s/opensearch/basic.bats +++ b/testing/bats/tests/integration/k8s/opensearch/basic.bats @@ -62,8 +62,8 @@ function teardown() { helm upgrade --install --create-namespace --namespace "$NAMESPACE" "$HELM_RELEASE_NAME" fluent/fluent-bit \ --values ${BATS_TEST_DIRNAME}/resources/helm/fluentbit-basic.yaml \ - --set image.repository="$FLUENTDO_AGENT_IMAGE" \ - --set image.tag="$FLUENTDO_AGENT_TAG" \ + --set image.repository="$TELEMETRY_FORGE_AGENT_IMAGE" \ + --set image.tag="$TELEMETRY_FORGE_AGENT_TAG" \ --set securityContext.runAsUser=0 \ --timeout "${HELM_TIMEOUT:-5m0s}" \ --wait diff --git a/testing/bats/tests/integration/k8s/opensearch/hosted.bats b/testing/bats/tests/integration/k8s/opensearch/hosted.bats index 40581eed..6bbed620 100644 --- a/testing/bats/tests/integration/k8s/opensearch/hosted.bats +++ b/testing/bats/tests/integration/k8s/opensearch/hosted.bats @@ -42,8 +42,8 @@ function createYAMLConfig() { createYAMLConfig helm upgrade --install --create-namespace --namespace "$NAMESPACE" "$HELM_RELEASE_NAME" fluent/fluent-bit \ -f ${BATS_TEST_DIRNAME}/resources/helm/fluentbit-hosted.yaml \ - --set image.repository="$FLUENTDO_AGENT_IMAGE" \ - --set image.tag="$FLUENTDO_AGENT_TAG" \ + --set image.repository="$TELEMETRY_FORGE_AGENT_IMAGE" \ + --set image.tag="$TELEMETRY_FORGE_AGENT_TAG" \ --set securityContext.runAsUser=0 \ --timeout "${HELM_TIMEOUT:-10m0s}" \ --wait diff --git a/testing/bats/tests/integration/linux/integration-install-script.bats b/testing/bats/tests/integration/linux/integration-install-script.bats index eabff9cc..f16fd393 100644 --- a/testing/bats/tests/integration/linux/integration-install-script.bats +++ b/testing/bats/tests/integration/linux/integration-install-script.bats @@ -1,7 +1,7 @@ #!/usr/bin/env bats load "$HELPERS_ROOT/test-helpers.bash" -ensure_variables_set BATS_SUPPORT_ROOT BATS_ASSERT_ROOT BATS_FILE_ROOT FLUENTDO_AGENT_VERSION FLUENTDO_AGENT_URL +ensure_variables_set BATS_SUPPORT_ROOT BATS_ASSERT_ROOT BATS_FILE_ROOT TELEMETRY_FORGE_AGENT_VERSION TELEMETRY_FORGE_AGENT_URL load "$BATS_SUPPORT_ROOT/load.bash" load "$BATS_ASSERT_ROOT/load.bash" @@ -9,7 +9,7 @@ load "$BATS_FILE_ROOT/load.bash" # bats file_tags=integration,linux -# BATS tests for verifying FluentDo Agent package downloads +# BATS tests for verifying Telemetry Forge Agent package downloads setupFile() { skipIfNotLinux @@ -29,13 +29,13 @@ setupFile() { } # Test that URL is set -@test "integration: FLUENTDO_AGENT_URL is set" { - [ -n "$FLUENTDO_AGENT_URL" ] +@test "integration: TELEMETRY_FORGE_AGENT_URL is set" { + [ -n "$TELEMETRY_FORGE_AGENT_URL" ] } # Test that we can fetch the top-level index -@test "integration: can access index at $FLUENTDO_AGENT_URL/index.html" { - response=$(curl -s -o /dev/null -w "%{http_code}" "$FLUENTDO_AGENT_URL/index.html") +@test "integration: can access index at $TELEMETRY_FORGE_AGENT_URL/index.html" { + response=$(curl -s -o /dev/null -w "%{http_code}" "$TELEMETRY_FORGE_AGENT_URL/index.html") [ "$response" = "200" ] } @@ -47,7 +47,7 @@ setupFile() { run "$install_script" -h assert_success - assert_output --partial 'FluentDo Agent Installer' + assert_output --partial 'Telemetry Forge Agent Installer' } function download_package_test() { diff --git a/testing/bats/tests/integration/linux/integration-install-targets.bats b/testing/bats/tests/integration/linux/integration-install-targets.bats index e7ee7246..ceb20d20 100644 --- a/testing/bats/tests/integration/linux/integration-install-targets.bats +++ b/testing/bats/tests/integration/linux/integration-install-targets.bats @@ -9,7 +9,7 @@ load "$BATS_FILE_ROOT/load.bash" # bats file_tags=integration,linux -# BATS tests for verifying FluentDo Agent package installation via containers +# BATS tests for verifying Telemetry Forge Agent package installation via containers setupFile() { skipIfNotLinux @@ -24,7 +24,7 @@ setupFile() { sed -i -e "s|^#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-Base.repo && \ /install.sh --debug' assert_success - assert_output --partial 'FluentDo Agent installation completed successfully!' + assert_output --partial 'Telemetry Forge Agent installation completed successfully!' refute_output --partial '[ERROR]' } @@ -35,7 +35,7 @@ setupFile() { run ${CONTAINER_RUNTIME:-docker} run --rm -t -v "${install_script}:/install.sh:ro" \ almalinux:8 /bin/sh -c '/install.sh --debug' assert_success - assert_output --partial 'FluentDo Agent installation completed successfully!' + assert_output --partial 'Telemetry Forge Agent installation completed successfully!' refute_output --partial '[ERROR]' } @@ -47,7 +47,7 @@ setupFile() { almalinux:9 /bin/sh -c 'yum install -y epel-release && \ /install.sh --debug' assert_success - assert_output --partial 'FluentDo Agent installation completed successfully!' + assert_output --partial 'Telemetry Forge Agent installation completed successfully!' refute_output --partial '[ERROR]' } @@ -59,7 +59,7 @@ setupFile() { almalinux:10 /bin/sh -c 'yum install -y epel-release && \ /install.sh --debug' assert_success - assert_output --partial 'FluentDo Agent installation completed successfully!' + assert_output --partial 'Telemetry Forge Agent installation completed successfully!' refute_output --partial '[ERROR]' } @@ -70,7 +70,7 @@ setupFile() { run ${CONTAINER_RUNTIME:-docker} run --rm -t -v "${install_script}:/install.sh:ro" \ ubuntu:22.04 /bin/sh -c 'apt-get update && apt-get install -y curl && /install.sh --debug' assert_success - assert_output --partial 'FluentDo Agent installation completed successfully!' + assert_output --partial 'Telemetry Forge Agent installation completed successfully!' refute_output --partial '[ERROR]' } @@ -81,7 +81,7 @@ setupFile() { run ${CONTAINER_RUNTIME:-docker} run --rm -t -v "${install_script}:/install.sh:ro" \ ubuntu:24.04 /bin/sh -c 'apt-get update && apt-get install -y curl && /install.sh --debug' assert_success - assert_output --partial 'FluentDo Agent installation completed successfully!' + assert_output --partial 'Telemetry Forge Agent installation completed successfully!' refute_output --partial '[ERROR]' } @@ -92,7 +92,7 @@ setupFile() { run ${CONTAINER_RUNTIME:-docker} run --rm -t -v "${install_script}:/install.sh:ro" \ debian:bookworm /bin/sh -c 'apt-get update && apt-get install -y curl && /install.sh --debug' assert_success - assert_output --partial 'FluentDo Agent installation completed successfully!' + assert_output --partial 'Telemetry Forge Agent installation completed successfully!' refute_output --partial '[ERROR]' } @@ -103,6 +103,6 @@ setupFile() { run ${CONTAINER_RUNTIME:-docker} run --rm -t -v "${install_script}:/install.sh:ro" \ debian:trixie /bin/sh -c 'apt-get update && apt-get install -y curl && /install.sh --debug' assert_success - assert_output --partial 'FluentDo Agent installation completed successfully!' + assert_output --partial 'Telemetry Forge Agent installation completed successfully!' refute_output --partial '[ERROR]' } From de98e40b97592fef847df0bb889dcf41254b1970 Mon Sep 17 00:00:00 2001 From: Patrick Stephens Date: Tue, 13 Jan 2026 12:22:45 +0000 Subject: [PATCH 2/8] ci: remove homebrew calls Signed-off-by: Patrick Stephens --- .github/workflows/build.yaml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 3a7df5de..b13d0e17 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -474,16 +474,3 @@ jobs: with: agent-version: ${{ needs.get-meta.outputs.version }} oss-version: ${{ needs.get-meta.outputs.oss-version }} - - update-homebrew: - name: Update homebrew on release - if: ${{ startsWith(github.ref, 'refs/tags/v') }} - needs: - - get-meta - - release - - build-macos - uses: telemetryforge/homebrew-telemetryforge-agent/.github/workflows/call-update-homebrew.yaml@main - with: - version: ${{ github.ref_name }} - secrets: - github-token: ${{ secrets.GITHUB_TOKEN }} From ab9b766aae33e61e65aa57386ca4e9ed675b91f4 Mon Sep 17 00:00:00 2001 From: Patrick Stephens Date: Tue, 13 Jan 2026 12:44:12 +0000 Subject: [PATCH 3/8] fix: ensure we stay backwards compatible with fluentdo for now Signed-off-by: Patrick Stephens --- .../plugins/custom_telemetryforge/telemetryforge.c | 9 ++++++--- source/plugins/in_telemetryforge/telemetryforge.c | 13 +++++++++---- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/source/plugins/custom_telemetryforge/telemetryforge.c b/source/plugins/custom_telemetryforge/telemetryforge.c index 0001058c..acad30c2 100644 --- a/source/plugins/custom_telemetryforge/telemetryforge.c +++ b/source/plugins/custom_telemetryforge/telemetryforge.c @@ -35,6 +35,7 @@ #include #endif +/* Ensure we update the default once ready: https://github.com/telemetryforge/agent/issues/183 */ #define TELEMETRY_FORGE_DEFAULT_URL "https://api.fluent.do/graphql" /* Cross-platform default session store path */ @@ -89,9 +90,10 @@ static int cb_telemetryforge_init(struct flb_custom_instance *ins, return -1; } - /* Set default agent_kind to telemetryforge if not provided */ + /* Set default agent_kind to fluentdo if not provided */ if (!ctx->agent_kind) { - ctx->agent_kind = flb_strdup("telemetryforge"); + /* Ensure we update the default once ready: https://github.com/telemetryforge/agent/issues/183 */ + ctx->agent_kind = flb_strdup("fluentdo"); } /* Set default interval if not provided */ @@ -184,7 +186,8 @@ static struct flb_config_map config_map[] = { { FLB_CONFIG_MAP_STR, "agent_kind", "telemetryforge", 0, FLB_TRUE, offsetof(struct flb_telemetryforge, agent_kind), - "Agent kind: 'fluentbit' or 'telemetryforge' (default: 'telemetryforge')" + /* Ensure we update the default once ready: https://github.com/telemetryforge/agent/issues/183 */ + "Agent kind: 'fluentbit', 'fluentdo' or 'telemetryforge' (default: 'fluentdo')" }, { FLB_CONFIG_MAP_INT, "metrics_interval", "60", diff --git a/source/plugins/in_telemetryforge/telemetryforge.c b/source/plugins/in_telemetryforge/telemetryforge.c index b1d44ae1..5ef71251 100644 --- a/source/plugins/in_telemetryforge/telemetryforge.c +++ b/source/plugins/in_telemetryforge/telemetryforge.c @@ -42,6 +42,7 @@ #endif #include +/* Ensure we update the default once ready: https://github.com/telemetryforge/agent/issues/183 */ #define TELEMETRY_FORGE_DEFAULT_URL "https://api.fluent.do/graphql" #define TELEMETRY_FORGE_DEFAULT_INTERVAL 60 #define TELEMETRY_FORGE_SESSION_FILE "session" @@ -484,15 +485,17 @@ static int cb_telemetryforge_init(struct flb_input_instance *ins, ctx->interval_sec = TELEMETRY_FORGE_DEFAULT_INTERVAL; } - /* Set default agent_kind to telemetryforge if not provided */ + /* Set default agent_kind to fluentdo if not provided */ if (!ctx->agent_kind) { - ctx->agent_kind = flb_strdup("telemetryforge"); + /* Ensure we update the default once ready: https://github.com/telemetryforge/agent/issues/183 */ + ctx->agent_kind = flb_strdup("fluentdo"); } /* Validate agent_kind */ if (strcasecmp(ctx->agent_kind, "fluentbit") != 0 && + strcasecmp(ctx->agent_kind, "fluentdo") != 0 && strcasecmp(ctx->agent_kind, "telemetryforge") != 0) { - flb_plg_error(ins, "invalid agent_kind: %s (must be 'fluentbit' or 'telemetryforge')", + flb_plg_error(ins, "invalid agent_kind: %s (must be 'fluentbit', 'fluentdo' or 'telemetryforge')", ctx->agent_kind); flb_free(ctx); return -1; @@ -597,6 +600,7 @@ static int cb_telemetryforge_init(struct flb_input_instance *ins, /* Prepare registration input */ input.kind = (strcasecmp(ctx->agent_kind, "fluentbit") == 0) ? + /* Ensure we update the default once ready: https://github.com/telemetryforge/agent/issues/183 */ FLB_GRAPHQL_AGENT_KIND_FLUENTBIT : FLB_GRAPHQL_AGENT_KIND_FLUENTDO; input.name = ctx->agent_name; input.version = version; @@ -810,7 +814,8 @@ static struct flb_config_map config_map[] = { { FLB_CONFIG_MAP_STR, "agent_kind", "telemetryforge", 0, FLB_TRUE, offsetof(struct flb_in_telemetryforge, agent_kind), - "Agent kind: 'fluentbit', 'fluentdo' or 'telemetryforge' (default: 'telemetryforge')" + /* Ensure we update the default once ready: https://github.com/telemetryforge/agent/issues/183 */ + "Agent kind: 'fluentbit', 'fluentdo' or 'telemetryforge' (default: 'fluentdo')" }, { FLB_CONFIG_MAP_INT, "interval_sec", "60", From dad3af98501829a29169f46c4da2199f040ad9b4 Mon Sep 17 00:00:00 2001 From: Patrick Stephens Date: Tue, 13 Jan 2026 12:45:17 +0000 Subject: [PATCH 4/8] fix: ensure we stay backwards compatible with fluentdo for now Signed-off-by: Patrick Stephens --- source/plugins/custom_telemetryforge/telemetryforge.c | 2 +- source/plugins/in_telemetryforge/telemetryforge.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/plugins/custom_telemetryforge/telemetryforge.c b/source/plugins/custom_telemetryforge/telemetryforge.c index acad30c2..bd5595ea 100644 --- a/source/plugins/custom_telemetryforge/telemetryforge.c +++ b/source/plugins/custom_telemetryforge/telemetryforge.c @@ -184,7 +184,7 @@ static struct flb_config_map config_map[] = { "Agent name (defaults to hostname)" }, { - FLB_CONFIG_MAP_STR, "agent_kind", "telemetryforge", + FLB_CONFIG_MAP_STR, "agent_kind", "fluentdo", 0, FLB_TRUE, offsetof(struct flb_telemetryforge, agent_kind), /* Ensure we update the default once ready: https://github.com/telemetryforge/agent/issues/183 */ "Agent kind: 'fluentbit', 'fluentdo' or 'telemetryforge' (default: 'fluentdo')" diff --git a/source/plugins/in_telemetryforge/telemetryforge.c b/source/plugins/in_telemetryforge/telemetryforge.c index 5ef71251..a3f1c0ae 100644 --- a/source/plugins/in_telemetryforge/telemetryforge.c +++ b/source/plugins/in_telemetryforge/telemetryforge.c @@ -812,7 +812,7 @@ static struct flb_config_map config_map[] = { "Agent name (defaults to hostname)" }, { - FLB_CONFIG_MAP_STR, "agent_kind", "telemetryforge", + FLB_CONFIG_MAP_STR, "agent_kind", "fluentdo", 0, FLB_TRUE, offsetof(struct flb_in_telemetryforge, agent_kind), /* Ensure we update the default once ready: https://github.com/telemetryforge/agent/issues/183 */ "Agent kind: 'fluentbit', 'fluentdo' or 'telemetryforge' (default: 'fluentdo')" From cf4c45ce891db762e0b1f8afb637ea2c6e385121 Mon Sep 17 00:00:00 2001 From: Pat Date: Tue, 13 Jan 2026 13:06:49 +0000 Subject: [PATCH 5/8] Apply suggestion from @cubic-dev-ai[bot] Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> Signed-off-by: Pat --- testing/bats/run-package-functional-tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/bats/run-package-functional-tests.sh b/testing/bats/run-package-functional-tests.sh index 6384dadf..a7dd06be 100755 --- a/testing/bats/run-package-functional-tests.sh +++ b/testing/bats/run-package-functional-tests.sh @@ -50,7 +50,7 @@ if [[ $FOUND_FILES == false ]]; then exit 1 else echo "INFO: Package to use is not present in $DOWNLOAD_DIR so will download now" - echo "INFO: e.g. cd $DOWNLOAD_DIR && curl -sSfLO https://${TELEMETRY_FORGE_AGENT_URL}/${TELEMETRY_FORGE_AGENT_VERSION}/output/package-almalinux-8/telemetryforge-agent-${TELEMETRY_FORGE_AGENT_VERSION}.x86_64.rpm" + echo "INFO: e.g. cd $DOWNLOAD_DIR && curl -sSfLO ${TELEMETRY_FORGE_AGENT_URL}/${TELEMETRY_FORGE_AGENT_VERSION}/output/package-almalinux-8/telemetryforge-agent-${TELEMETRY_FORGE_AGENT_VERSION}.x86_64.rpm" # Set up overrides for install script # almalinux/8 becomes DISTRO_ID=almalinux, DISTRO_VERSION=8 From ce75f1e871d2b952d5e0d509ff213868b571c96a Mon Sep 17 00:00:00 2001 From: Patrick Stephens Date: Tue, 13 Jan 2026 13:08:55 +0000 Subject: [PATCH 6/8] fix: update URLs Signed-off-by: Patrick Stephens --- install.sh | 3 ++- source/plugins/in_telemetryforge/telemetryforge.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/install.sh b/install.sh index 80b2e99c..9a4fb0cf 100755 --- a/install.sh +++ b/install.sh @@ -862,7 +862,8 @@ main() { log_success "Package downloaded successfully: $package_file" fi echo "" - log "Documentation: https://telemetryforge.io/docs/agent" + # Ensure we update once domain is ready: https://github.com/telemetryforge/agent/issues/184 + log "Documentation: https://docs.fluent.do" echo "" } diff --git a/source/plugins/in_telemetryforge/telemetryforge.c b/source/plugins/in_telemetryforge/telemetryforge.c index a3f1c0ae..28df8d2d 100644 --- a/source/plugins/in_telemetryforge/telemetryforge.c +++ b/source/plugins/in_telemetryforge/telemetryforge.c @@ -600,7 +600,8 @@ static int cb_telemetryforge_init(struct flb_input_instance *ins, /* Prepare registration input */ input.kind = (strcasecmp(ctx->agent_kind, "fluentbit") == 0) ? - /* Ensure we update the default once ready: https://github.com/telemetryforge/agent/issues/183 */ + /* Ensure we update the default once ready: https://github.com/telemetryforge/agent/issues/183 + FLB_GRAPHQL_AGENT_KIND_FLUENTBIT : FLB_GRAPHQL_AGENT_KIND_TELEMETRY_FORGE;*/ FLB_GRAPHQL_AGENT_KIND_FLUENTBIT : FLB_GRAPHQL_AGENT_KIND_FLUENTDO; input.name = ctx->agent_name; input.version = version; From 2db935be8f2b5956d8eb3c25cf1470d6427f7928 Mon Sep 17 00:00:00 2001 From: Pat Date: Tue, 13 Jan 2026 13:50:33 +0000 Subject: [PATCH 7/8] Update source/cpack/scripts/sysv-init-install.sh Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> Signed-off-by: Pat --- install.sh | 4 ++-- source/cpack/scripts/sysv-init-install.sh | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/install.sh b/install.sh index 9a4fb0cf..d48a2bf6 100755 --- a/install.sh +++ b/install.sh @@ -8,8 +8,8 @@ # All packages follow the following URL format: # https://packages.fluent.do//output// # e.g. -# https://packages.fluent.do/25.10.1/output/package-debian-bookworm.arm64v8/telemetryforge-agent_25.10.1_arm64.deb -# https://packages.fluent.do/25.10.1/output/package-almalinux-8/telemetryforge-agent-25.10.1-1.x86_64.rpm +# https://packages.fluent.do/26.1.3/output/package-debian-bookworm.arm64v8/telemetryforge-agent_26.1.3_arm64.deb +# https://packages.fluent.do/26.1.3/output/package-almalinux-8/telemetryforge-agent-26.1.3-1.x86_64.rpm set -e diff --git a/source/cpack/scripts/sysv-init-install.sh b/source/cpack/scripts/sysv-init-install.sh index b1bec7b9..aae4f0ef 100755 --- a/source/cpack/scripts/sysv-init-install.sh +++ b/source/cpack/scripts/sysv-init-install.sh @@ -2,6 +2,8 @@ NAME="" if [ -f /etc/init.d/telemetryforge-agent ]; then NAME=telemetryforge-agent +elif [ -f /etc/init.d/fluentdo-agent ]; then + NAME=fluentdo-agent elif [ -f /etc/init.d/fluent-bit ]; then NAME=fluent-bit else From f0c4ecca2739e508a47d410c60843e39a9de3f5c Mon Sep 17 00:00:00 2001 From: Patrick Stephens Date: Tue, 13 Jan 2026 14:09:45 +0000 Subject: [PATCH 8/8] refactor: update logo Signed-off-by: Patrick Stephens --- extras/agent-logo.jpeg | Bin 105489 -> 111700 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/extras/agent-logo.jpeg b/extras/agent-logo.jpeg index f2d166bf7f26fc8a73c2e16f89e0530b6ef0a57f..1bac68af6574bf47034bdb5268245467715fb669 100644 GIT binary patch literal 111700 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
};hFsc-=+et@s!4J^g(z=elU^o zIqD-wXo>nY^dEq8K)cXd?uFt#`9A6%?Gj`zc>>YVNX3 z!35)5uQ!&$?0M!B*IbW6nEsSqeSKNbt9%7Jx=J8290sI4S zp@gWm&VKV6x-^HH65`;831$D}!m-QK`$PWe3n#y4``HuI7`Yu)|mWz)QBpOZLGFEB^*K zssknEkwO;8D>!M6WFQK*2_48iRJnY1*jp-eE-mT~qP+!hm}`z`Jz$nzv0farYvbq`=qn0SDWfg{=ar@HN?a|H1N zdPQu^a7OrW#gj+iom2vI3JS5AGzC^|;E}`VhN=)CA_}Ke9D<{3+04K}pd)5%cqK9m zeQo_Zhe4|AF}0R>)PYyxQCJX2o1>q7G;~Tclxv z&Wqwjzp+zZVfa0uch5B(u>IrKzimwWEGyic9y% z7HT9~-*4QQa@iehm-PA}o(cZc519P5tF`whvG!$eXWuVJbt0yPDSv-P%|wQyST&5_<~CBd$40M9}Q5=l#0B*9uQ(3fmL{>Z_JUEii+J78SY8Dl_6H&6ztB z*)ZT(VMCo3thv+mt(ZpPXeyS)|1v#NNMS+EdN|xh>A_fjj)82s3O;I(%*#vBTkbLn8|GKD5fmGUFfmBs52+?Yo0(Of*ia zV?(y)Pw7}~(CzR0q;|b^rcrpkfIfN{P5A)c_EEhY5Vg2^p&)F^nUUpu`E;xpP(7fiPeoS|Nf$5$Q}A7RjF9w z>%mp+FWQ*cvh=yrU3`93wA?Wkn76BEmZv^^I0gYZZ{Zoi!bxdOx%Hs{$lJJ`N?^Zm%3J>(MIkLcmgYl?6N#6Gv7tv<4Dwytjxix=}O z1W1W38t&H_XJ3g7(u3O0fE-RWU;2@iInyIF)sHr&aIpKVNtm0!mTytj7Ng&jUvGmc zvn1!Wr80+KXRr{LFKk#L3%AA2iHuYaa%wlGIN&Fjp%QK*6hg-TJ|GPcF`qO6k}pO;cWPB_6E5>|Ptsk!i zO2eR-4@C4202-UYJgI|+pGZ+_o$*`_|3Uq82g#Q|LseCT9W}N6Qy*$DUtu(U_pd%O zq;^wlil0uF?wk}I0UcJeQD`mO$Tp(kzBVtuXB~sxSNgiW*#l1r6uRIu9AEf{GwYUT z@$RqUl8^7Vs*jL-(3h4jc^b+J1mvDf62Pj>K$qVar{nPuynQ68t`*&P8Km;okGVGa zf}QCQ8E5ZOcdgvk#CR85H*F(n&HDQ-bqvQ1?z4-}%ug5)HW(ekN4#Axc6?s`+HtbM zAu6@~Hwt0#)ENA%1-1f$l;09{Tm{;UHlZZ~JrunXJV!~+i+Z5nI<~`YDFkSdEt^G2+N0+=LVj%P+yhn%$SHR6)&f`$ zjy%7*y1CrQ;x7wqk@nUNf_C7FyNh=YPq3jYTXVCu$1p>KFDstaUkE#8UD6Mk zCk(TDc|0x4t>a7fafXitBDQ0WURibS{FWbi6LU>w0~=n{UVmsQmM@q+HBnbSN<6eu z_0~4{OuF6~dQRVMc;7DNG@cXZ|6Ar0(;Z&;+tTOSVx3#p13&m8HtXhV!>eOr_4QAu zAq(^dk$2iY!O5gf}-_S|PfK9rb%rdJjVzjIy$O4-HR@O0PX5 zL)r%~+u4uYOn%KS`4iN{H?m)MF9*NQeS6)=77R(5Y<@LK(-f=KilbYS+hnr|AU%2i z3IEnTK*n2r4&yYr4l#4OVX^f6*R|&Gp12_XtHgm$C;twmM^RJ!9rt6cep3LQwq#|( z{5z2~S+Ongkosc`^B)4D=WgG&93#twiAd(W^$UB?MC-ifV~hZ+^*_gl&=PS~5&rck z6tDYq$zRYY7d8~N0zWf*GJE^&ggtV_CCq$*4iI+pzKgTEXn$*HYn6}}HL!RH_%lvz z>vFnUGz*8tBqa6^zmHL253q9-n&)VXQEoIK^H7z% zY1&I~z{mmH@zS%Qbfx2J#q6KQtWU7*0tE@0S`RAPj~m3Oss*N3Gh98Oy*cMUs{})& z$>MY8*YrfyTtbgUD2YV3aMT_2uNg5|;>DW0e5mW*$Lv`ym-iD$WujlmHng=*^LHP1 zY(GB;x^Ac75-j9TwDR1Ix#1bHe+{o{uTgW2(wEU0qG=tJw{vIZa;j{<@sUNCx3KsC zuP`cFJ1VH=2F{xDo`kQNpcriRh0bWItv&v@QXhH$x^W1#C9aFwxab4gH`zFhsJten8h`#c&Euw|8!YY*|*_Mr*MYF~o5X_TX~3i$2ua*`J54cp-q^ znlHS&{YhL}MJAO_tz4zpQE5S^8sh8;2pKDsR!pK1rG9)C5i@cBVia2|^vsnPI5nQG z7j%8j%SzL><1SVGu?2m2L5QIZw-#r|wz6SxIDCpw>yoX@-Dxr9oXU_l`AV|tOIvHf zRQ)Pr8@G!3_FiaH0P$1l_8pIKXf*6IL6CV#2aegfeO(3)scj2`KLFr>NZN93_U% z&RWi$T8vJcp2AWUmQp3&_W3yC5DnHoE8+6-Zc+ooH0p|kec5{6d!BwWt)t0>`yala zh9?q&AHNVQu3ZHL0glq}(<%hCF1J~yfg?qk#G?~Bj6dO~6!UVOIAN~lX$|B&Q(gjC z^~|~&1SDy~5e|&+%7QSD0{$St=sIXt70e4GV+_wTUZxiTIn=?yeIpkVR0E>~mZmTK z|Ad(wnBK;v0(v3oJywWN9Z2U$@S{y~F5_pAoFZBL5eyxltX>0oA>QLvx;%~3Zjn)* zYsqCtp}PW?y3jMg09hUwiNV9R{LX9YZc;EgT|k@J(rYjfK`*#?5C>#{^VX} z(F?=iXC~_Oe*|Pe(6g6P_upyfiKGrcx%xh&DshtZ;kv~&+W)=`71242(d@gg9TlH3 zpw_mQ_|Eb>Z`B?X7c+WuNTx3Sn|=`IJ=R(nENYzMVEOH!a5Xot4i*V)&>tcD?p^o= zsp2C~;?{S0a>#Z%%Iz4$6%G&##0W+Uk1H{!ogK6+S-0{O)4P^KTTSJ7+^WK+$OIbd z7Y_rQ$&g{(15X;W8JywnL*1^3s=1lJ)s6pMvUTzg;E7?2YUhtOVkf7K$+PCZBNIEW+{^ z{|pS{TcYH0yi>v1p1o7SAHda~ACyo2aZ^~txuG)vv}`F!!|YZb&n{Z}ATb8UQ3AHH z`Ae8@pP8TkU@5Hf@#ai@i;(drmFtB%fQ&C6-7oDjXj=au@)S_qCTJv}!Wz0;##JS9 z{1}?C^Z8I!g&MyRG@)Yl5Uam+Fg(q7qFun58*8ZTV%7|)MOr3$Ksb6Ya@+7Bgh!eq z{}?)O`)~lijrUmS9z6fB$g(2DIV8ru@)-RoZ{85J<;5f5#d`W}OaIiOZ~?$$uDYTb za&{@$n*??jL~-Ev;~+VZSQ!z#R%Ga!E*wu;%PqcgYZN^{=~72ZyBo4yH>^t~t zaG=3I(+e~kSxK1WHww!4LB?+lMtONz*<(Qo2aqiW&NGY%RahftWLnqaoE#495EeEJ7a=jQYa9|?N_T5gby?sw3iSfiBR zPlpJ~nI6fd*GA9hmO|EBUsA5PipndK-Fp531TH(@s`RGS52@^MK_#fUH+>}OS!k5{ z<|~WB9}nei<+B_Qp_f=O?BqkcZr9LpPi<)b&RtlOyUZnqdrvcPg|OIm-cK4f<{)pW z`_z2#i?Jt})0@2Qss^uTI(_tj=9Ckc{u9+PB10jIRe2rJC@N~Q3_)*j+m`4#rITjp zu)}fPbiXo^xiV2UFZ{y~Cq~%eimmMWL5R?@sewWygH#WJ7 z*!=_0+H>8T89mfG#jqh^UGu(@=)iy%O>j_~4CCu-3Q%age5PK!krABqdhkuIdT|Sz zN7R`b;9BABOAK4GWER9*ZO8ZRF$vkUf8Ab>ws2|q2QUf$VqUy=a??KnM*ssSYP)sJ zac~(b`?HoywKludkVm1%xoeZhz#+T#%Y^3lL*Dr8!ba9ID9{1fm>Mkub=*g0Epi4U z9qoV=!9iquyS=goqe+!p)^|`SY^u#2mua5s@T(o%rX~?mArUKgMM4y^?lv}h0(!z*5X*2-<%D0`K);&xf*w0*`A z*HRfuHqFlwO$SXJ1GkZRX&l15;&b7>x3$vWVHzm!!A^o?{RwBGL9nA+)0i1L6kDhG zH3V4Vv#`eS+$&r>hfKum3*-tuYIfu4 zSj0`(Nea5O2L3;CD|aVuR1gyLyg-MKRP7ma@8Zn{!_lTa4dd!i90{Q&T_K%m95&sU`+IeC}+8 z0v>~o=b8KrYZ>v#W!;SZ7$d8tEXDxX#3Y)v{v44%TmTc0^pl7vz_i}J<-RYD;(Ae@ zMD6bj25c9r^{w~I+91(3?aA0gvEcAJN$o*-GoBA7lX0iIj9p^}*Inmq4jCjzDaCV( zS4k3qH+wXhp8i$A#TD{qJw*HGxXm(tt7#(TvWE{TUVl&qlm~Q!2fN7bV;7~*aM10e zmeP?>-N?u|Ql@GTVjEtX3+}f*<2kC(sW!xTdLqtW8o*z-S^PNY^-kd>bd;GXrs>96 zTii0_D~MxAMzt5p-xtNtGT$X1r1V<#13V+bpvHbHYKtkFIKvVb(KQZi4Ka4zRF$3t4)8on)?M|HRym45;_gTkv`1st6s;M5!S#*pN^2vA@55z z53SCTaplTQuv}pM@q!>HhH#K;s%zxje|k+sdpA1&u4oM&dc-&WHC8!P0w*e15RjD< zEon7sEiJbP?zycY=PdI+NcYT(HqUBP_49D0@87MDbWa_}RV$?up$Z;4 zNVLFwMWKd>$}>6=Q$hZ!l@iqN*@inJeoo|QNt-6`lBFC@5r(%t%^~k1PGGe8K^)#* zISHu|3-DT)SU!h?yoKm+fRYV;34T9F{SmDB!H5RWP4Dr$A=uJUEOQf13c5`-mfA}T z@N?m+X0`(glCrN#ydhuidaCwABRnZhnPf+n3Uds+Ap8in?KqzN8~Ww1))W8+5(XNq z4h7bk`d4cT{cr3SpfSt8dQ<(=SHeo$*Z&jx1@f=b)JNM*eD90@^jz)tS2VT?ZKdo}otKr<$wuXca&L48rBSmui4*eaUqwD!oRAN-== zhRvd>5H$J#eBrL>PQG*+ZoXc=a5dnh)0BNDz?K)|J|RdyhC2{vKM`7p%}04FX3g*T zwZwu{3^#0O{s*(zb+5N+%AxX-1Ia7qT<`(u!dLusn8q(Ra-8Vu;JJ)T`(0HnwNR8V zO$;%M9@-<%I35W4k!focdy3bJp}Uf9{O8xh8X97;1=c__ScMnn6@q zkHljGah3b08_gNLDWXmDT$>+Z>=uK`=k%~%e_k!$Nft5T%*7Vqw-kcviI3g*dhBZ^b!ov#aXph>Daymt*vGLK%wA~LX8 zp`^&YW(drXSB>b-bMJ8GXe6vQAs|y-RZ(=axyav%WKLvSq8jLXu3NwKPb=e4OBgX` z$^3|WHL+(ydCKe|E_NX&N(2Y**;Gj>~={Se3!G zqo1Y!Stv>!S=MHeG7FP?`wcq}!%ecDvDilhLnG;PgS_JE+`dt_c;yG&TNL*>CMhCZ9$w&O zz?S@6zd^b~lOlFjBzcW+H4m5D84Et0W+Cn#bQ9V3MU(q<=9GX8^B1{%1f4py`f$MNj%ESEWgETHw#s=c^XODE6Y6WEa1|rfHfif#i9S~~LJufqT z#CR@GE-B&e<`1y-w$}q)rNA&o^QI$=puNr68 zG7jok#OAp98&8d4e?Amfsu58xYXN*d5sJQF#Mz4kD4{en`NHCOi=hy8fkCSc*D-7! zRqFfG0xR0o0t5_n+gvwcrzYlER-f?n43m9{;Q%k2SAx zdA3iytu=!?+Fs;Pq5T?Pja(LNHEoGaglrFINb`s9kp!g!9TdO%yQ>M;8u z7m7@S1I-Be-ckAEgm2~zNfn+9?H{*G2pvku*8CxNG9NuxQL<9>C0_oARQ0U~~K+r0k+^gs*0ilZ``k0J}Zd&x)36z}+F)Y2tM+ZV<#M?@2Z$O3NR z?-G^Mp_I9-sEX$)O5zoOL!KgX!P_!}BTO!2yD4&D6gM8MY!ENZf{(lPik0WH(ZCf% z0ldrO{fN}fh^UT0FTM#T45me@@k+f>ko4vnT+1e&5!IC${fF?`49BzG!|Ht54&!4O zzQ<^tosZ0W5y38-^X=%>^zQ=zLXKA~yo<$}VCBwlAG$)O&!nNbAGW}z4^KlH;WP$S z6@gKSA`w9v-@jNdNreh`mK7AODw@%F?-rd+ubY6|p^^7yXzJ(q=&4erct#d%YQY?` zFC#A~Gdj9WP0%@ED!SRBGu+R_9O0RAx0z07ouYQ$3_=p@0J=-8@2C3=JtS3H=YUme znuj&|^@yy_Qa~sDo$(fiBDI1l2*Inw3prLguY`3T%RPNZv+&H}gCLxc4W}@7?x_YG)jplSI^cB_dYGZ^N^FxWQ@=D$x|#`F|f-v^}@~06w!t zhiJL59#1$riK?uNk%^vLoXc)1t-pVJK~em)bw2)cU>+O+*dM%2qWM39B^FPg^Tw`& z0c}RC;$$03RMT#Zg5hU=ky&?rw3os7ormIfSoE#HRT8Y{LX3Bir_c-%)rIg>_f_3IT@;qZTd^PpJ*Uoxq)Uz|_re*IuNuJ7aXDFMyT(lyqM z$dvTlzJseyCWBumlee-)pElL%v%f3zi&vo$jN8riV`7{cKMaq5NmuRp4`+@?wo^!Q zjhHkW&fTB&%&=UdG3EQ42C%+giC;Dl)U73#sguzg?*KMITYeBUI2oq|7Sgel?!Oa3 ze_5zcq+{rxb_f(1OM}+e{{SNwC=E>vqKVo7 z=!N?4;T|6PKz``($F`=A9ltFcJEKIiX9pbjZzIxgn|4$v!>b0Fo=m+#YR5HY09gva z#W^wgo}Zi{0mM8v!xt?>Nqd17=9-#Q4Q?&+8GX|DKN9#d$ArvuC*By7Z}T!!BdVhY z^qE$n%VvI#973q~zorGgWeu9heBIjB5dlgFSF#+Qe4aR`ev%-@ZAK(gWR@I7T-;pg z4PV_@Lc039xC$=cShnHZret;KdQS%NN*1z5MDGzs_Z$9Q+MDw)j{aSTroPcUjPmE# z>E{4cNGWe<>nlXiOwJq%8LTEwzWQQ z<4;L<^5}Nf+#B-c%nqnOZa8`kSW@@VvzFO;ah_Pa2?N@%Igp+X56o3t8E__`tC$c9 z28NJb&vFV4yGlh>o>P1&BKEX%J$fGlKq4EWBTq$iI#VBKhfkN`t{`4oZ8VHDa*WI5 zeddVf+z?A6Snhu50+$>RA%$aSfcQmJIInqS8W~_Tcy(R3Nm7?8nQmv}{f=6`v))PJ zws~I{sgslfGr0o&9X;3Gz33={MIU%Pg{WyttJXvU|y^=jq0m4!#t(PU3gl zlT$c1J!<9raruj>8-{*B8t(f<>JDj7MyKuBWqgef0LijB!G94fU^g2Wq>}Ysj_q~m z^gRX$Q8xQ#M?|(VIVS%Av!#xa$=LbYd2kPXeuNuG3ojhYgFi?#*-;`yz@tqkxquKL zU|=zBs1SfAaXL?fln52_Gh^EuVivhp^YWDgO~p^GSh zYUcJe`HbOKuhPDd#9Bi#8>yE9M2QkK9E8epA=LHrfddM{g}|s7g*1nkdA0TFa5{*b zf<8>m+0Zn5s-AW2aaQuRG`gxg0T6;%yJd%Nc4uaGXKr@qYIdh$W+#Z&k+NL5edWvV zE?l{C`^#m#%kM3h-dwmWS$JHza^`H%H0ZHZt7`jV;$fP_0p0~*dy}wx&m-P>KJY&< z17iT7WrRW=8C>!gD20Z8YwUg^o5w^z8X=}*VrWJjgU(b)m!z|3U%!+ME}>}VGQ~4x z_7J!w6S^_Q79q%gUlte*ds}*DA%H;+&^4U zX5wsa_hW$U%5*&r>ngu6EjA^_e_3YbFDa+x5PRaoJN|s_^EAbJdG1EYz_5$R%Y)_+ z3=rOtjHQ8Wal!{cma*sPK)4Vg0Rm{50$NLDvcsPT(lC+Q@JvOMyjIwH9`Vxz9gxy9 zPLZa`Wo++G{O?Zm?@e}ybTNpifPP+o$mc0boV|p;68ONm5xNbo6+7#X&l6PBqKYYM znu&%{!_f3)uJcUPnqh7YM$txFMVqQ=)4p85FKLtMGfgI$o*L$& z22!I@LMqZDcH;j4#2x0hxp`$wu&f(Ensc5~c}e6Uw-yRHy$?x@rm{F|K z5NcX9-Uo0;ZLxJkF{XWg$marwJ)<=`6IMtK7yJ9f%GWNCDwo;~H;6KyRi6VL8^m?+ z2D2k%H#8=5MxC6>oQ^t}BOAH&{{XUsm@%|NSmyYeLJsKUhEZH}qI%!H(M>Xo%&SW+ zYiy&V-zgqd`#_b{H4K6GoXm7t%|lNNz|DZ=4R;+HKxKF5oEoxuOp!vqkyMteUZ%f) zEvA#=`j-QPr>unl^t(y)yFsxaXVFMcp)g zPmMm23H4d{OS zKvW&&LE7alr5{e3l`F$uqY(kt3|i;JzCQ_kJ`=F~LE!vEGF|tUgDoQNcl7|R^;i|^ZZS5@u$!r z`>f#)}x{o$K51Q!C=qzVk7 zn}V_DLIJsL(*FRzt-&f%kEG7wK1K`VJsAcrY;<|x zYr(?JHDO#np8Y>G`%k3H`b^2_MVOl2b5;qjeq?=`W=T(QRdDiLXsuyXy4Sa#Ov zZRkJjJW9KR;J4yli}^3OK48J#%cr2q{bH#oqT8bixQ8OVw+*j_*1V++vNIv{j;Uxbjs{M1TUYNB&i08^0m+{;XB#~K00hT3gdNe4YViuc z=94CcR98^WPmGc5+YL<=`Ws2LkQ`%Sg_ zzuXqxecn3}Rks&rf6*LiJN@E4W2x|reg^|KvhA8wp}%*UD*T{9x;YcZg#^ zeD`CtN^@+VFoM5LiSpioLTtxRo(8uEP=k9jJUU9jv=?q3kTuqGohOqi##fB58BQ|1 zV0g-Lhh|fb6nv%1N5pVkjr!R5510;S(d7KP`4MO!=GH`1K?otN5%OjItfSm=eRY~6 zf%h&UDU!2Z&-*TBTbrJ6%Ojj9UnrT+sNrUFo*}#!TZa(}X8H2%-T?&!x-{3?QJUy^ zzlp3$EiRY4#l#7c);l*#+e`JC_aJ3_x3A8XTj1#R`X9uocRo+^sqktT=Du;t7Fc$T zumDGSRK2;BdhO_^9pFF|+u3#}lkE^>1GJzTZtzds&vyU|sC@ZCa8>>)HLhH2Q7E8+ z3r%BiLXFEYBL{VWyOc`F>0B^t+s)ARV1m`26B?0NC;$zOXu=(%fGa_Kj<^*+|64WWITG_GVG&{vc(@!qqED^%&DhsC9rA#=2$C z;y2NLe-JARo44GT2fy0@AQN(rlcV0E+B%C&gE~`F+P$GdY-Tie%INh;a@+gm5T_&g zmj{IUKf`o0F*m_8u{j;wX$QXq;1|ow_`_{`9Lv+D#}j9p9M99HHEq^bk!k=70aQSY z+1LK+!Na|^KjK@g=4;vb7qP{+Tbv|QRR?*YW-sC zpualL=LQ;68T?#%N6P8G{-hfVFjF<&=P+Qo^WfL~lnF-$o~+H;^5e<|BV%HH{?V9f zhwS}u15D@#U%|_)OEXF|(vkE!>k2F=5OebKX?m3rQr0`M3iqAHZ`=O#z5&*h`4}x- z7!-~fTn0EjP@aFxJvEMH>Hh#G)iyb2?{ffMCaYEq)qrh`?Uja_RHQPMmApk$9QBB2 z&^k13h5OAh*8~DG42%+qv~v2y`Vq_O{og(%A)*IC4MDgl z<{$Km)~y~-$-Wln0O4y0^|yP&XG0_N>*Aei){_QUj2di$=+TD39lp|pmYaLL{{WFG zrg|_Ov)e~#Khim$r_3{lB51hl0NWAVIy8=w!jV%NY}O*F!#QSqwj!D`+%KibPjwGJ z;RPNs(CB&&mkZb|!%^fo!EwE z)q?ZgSC^l`v4hcAGDFN6dqrI#pby_qnW87=5Eam1`=8^#=2AePxl4M3SH{`kGta?WFweR+cP$*cfpwmM^D5DFL)bP??2=@X108$SS8Zs z---fLy_jGe^%SyjvjeYvLN@{a5W16WNjPo9$3|Lu2`n+xOZSmd%g5`hOj*Yy3?mXFJU1dB@2Vde3|> z+YJe=K1&72#Y+tXrm3t57m*!P5zv+54XF(iidC5mfX?ji&iu1@tvkdhoRO7m9jv^; zN?;e173KK<0DhQIbPudmTLznkla?=nV}1=vm4QaHzYGKTZ;WG}$X6iwCUI0t$_pkL zkT2U42?%fv7r5D z$Z&^Pz%1|d`_P)At8aiRvIu88v$;Eyxh=}$6rEI#xf6O{_G^e3yx5HbpnJnXa+OF0 zh7W>GC!^GK^jeq{9z8GeF9Q;5h=)k4JXyoy9XcNC3=6y3 zfOv8%&rD3>BTThljIFAJHs=h!nGxIgH0q!hswfL9#5xd8gms24t^#O8O>nmmPLot6 zEK4-RZ3vE{Yb;g;Z9rWjjY(>{os2coDAeh%6ow}IX_DofLF~LSz-NVArdLHU0Mt54 z0Bm%6G;BCad2HUL^C&XO$~mrv_s)TisjD469YMAQZ;WltkVBB$z06V_$j ziAmknQoKVJ*bl_L^1zppdGm^iWixK4eD)`B_9v6&B0h|NYB(G?>*Sza={XKOo50-vYmQ}q1G{-2mu0>;@y z$|7mYHxVhYYguOmx1O8Joxg@?e6Z7sEd|*IA66P+7MLkKrh+(HlS4GTra;0iFzJV@ zhM7CzRe6^7r>IM}!LJd}S(>UMma~aVbYDm5Ep>*$;{ZE4_JG!gYDMJ@fvb?Ln;3!KMLvOt|xW@YUpS)L3GAAYxX%0Id)cTVwNqm0fVr*lcQ> zOo?#cjx^jtC18rka764!E-BSZ_Z{T{xffXxRcshlMY)kwzGntl8j9?PA}?Yhwj@)D ze&&S6$7Hy0{!xxYsO>%#Z|MU1je9)G;6daw-aBDW+6?MNIv8frsR*vy&hY#e3 zY8;R^&`5?%&LI7}M?_SNr}%%f^%KeViE^y%hkc`1l}6^5%yXYDH;ziJY{5b=O2ZR-<5UU1w# z@pD@0{ft_-Qt__lRqKMAR>e@S0TmDt=;L-ZM`NEptC!;wRJqI(wSolbPRvTl!i?$( z(8EL`ib$4efSm}A-3EdbYc97Kj95&{tl}o70(2r;m;&Y!oh3V9YRm{Ih??}j#nu^d zGjB1pyF1)A?-f`5@C0b$z$~n-(jipoMMC0{Df8_UWV^b=Y`3QW0E9ya%b8@eDN0f5w0bQY+VwRr*WYHW%Q%ta?rYAL(AZ?t;`NXD}E@&F2ak)OM6>K^T%4UIs zm^EfvK`2au8MYg<`I^Qgs$NKp#`e*goOrc*O#+8`%-#>oS*7(vY_|*k5z=ckmEv}$ zbjwo(mLHs;rW%p7BcVPN)XLln2$;|j(YV$n9m%IGtUs%Sg|SN^=xw9tg{1Ls_(GYJ zCMXKM?mJBnv)H>j;VO1cy zkrg=Zwlw4jj-Tkl(Sd0F;?^q4CfIgAF>TS+FMf-c{JVopw-WKnHJ9RLj*w}%v`WCe zp_WKEHj16#H95=iGM7vnOj_OpQrc9^y-*E8T^dY)f{lJ}IA zT)!6l3jQVk0DV%WO6#dorAn16uBA$qE3W1L0OD?3zXGLrH{#wGFZtEt*Y#J0%a<-( zxpMk$T)A@axpMyipsyOSKdZm#U;e)T0PBDM!~iQ00RRF40|NvC0s{d70RR910RRyp zF+oufVR0aVk)bfL(eOaQ;qg#l|Jncu0RaF3KM?#EpYl)3Sm}S}7QZEb@GJbggDcZa zrc(kX#IMi4;~R@o{{Z|oN|ovlz)JrB^#-4T{{Z8OU;Y3t9;>c}zy2M165?0?09K`S zE7W>#qVN9ziGH{Imj3|chfCsH=q1XPUXhm<{{W40ysm$8&iL$~OcFpkCXBPvpZps9 zbt+WExp8qV26Fa(TiD)jdu4K=!{*>14y+fme86#tnJt<%3=`ZkCX<;s0 zSo5sFd`t9$@!>k`LLGszBbAn9Sn2MTnVzx!N`@3Li>YjZisWVx(@yN4vQ-q@G<+;n zsB%wwzqo)usvYlR>MOY8AB29UhBy+28FuE2JrJW0)XsG%o^%$7bB8dmFUT@1@P$k#I6dJT>{kaMZJP? z3P^rS{{R_%Aqc1y6}cXu1*;!n2?+xvrjuIQ3Trh?i4;hg8e++-)LQMDuEmwA&$bk& z#LJ#9E6U3JLd;Yl9e}AvMrFwLjjbQ25S?PfE65A?VP?S48vz4AUB7Tbo9A+WG?wJs z(mkyZA#5@7f2dB?5m%iu;kPO7ay}ud_-H=sZ19q(P6}ad(RImW-6jWnndB8SCCgNF z6P=RBnY7Y5KP~6{FzTj@;i{nc1@1!kRE-7)y5RQZDxsOa^#GyY6noZV-Zr=>1xz`z zo1w9X&?GEJB0{`}GT3(-PZGg9V%G`ghr={`amALN&LH%3{{Z3C4!0JOKDl!!U z&`T~>H-%05w?h!5yRI3fwH+eap|;8(SLLZl;1N_Q;`H{1t?eyd)W2f{9=6SHhjiBD zO8(+4Ff3?hk8msg!Nj?=+x)tf+E<~7&G-rYrX9eYTaDi;AYc_&0n7=~C%Obq=nt2r zrY?{&35>eewWdFR&)N*bF@&wm+f?OIi~A>&Wz} zf4~EnV_Itgs2N&}BS&zWE-%8&*ShNfrl?}7uUoN}qeQCsgOkam29l3@eqSYH3kUpa zfhs3M*2)ekyWQVvS7dj{2kiHWeP-rKhsGX6z%IZ(ps_c2D5a9KSskTZ1g({B8Us9&>>T3hE_LVAE_~dc7OV3>;%tcb2jCodRg7So+q+5-OwfD_U zJ3#zu8tvBUx>enQ0=nEA>uW`#@LX{amUcvNYHPs5UCT#rXHEkK#6>rL6p&-bs~?69 zFE^MhR%JGUwOj>@#2j>Vk2>yDBc--!;|1*-$WgtLbpo%)GU{r0U?&9zOC`R=vkQ4t zrsy=mrP|QDRt6ye+4r|#51?4+z|D?}LQ|94;0)BXdV&^cQ)@#i03!W03ADDZ%s7C8 zHZy6Y4vL9im^0O8SfQ#OSY*a#n?XG+U&?AX?L1)@bVBGDJO+;>IW&YV3K7+y_9Ek) z=9)oI}IuKrC(w z_S?0#73p$fE~qRc-H@R-0>mvde(+7Yg$Z|bHQu_VzzWfOr@6tuapql(w%MPRwc&;k z=V?FDC~8)gUp@Ca;$B;K7hOzYtYbj;OjV1R6(h z-RM>74)bYO#;pVf>C3Aj(A27I+z316C(b)my#v@(S+CvbT2b7+9pe_7X~AwofYrV( zQ*rKn0R=Nw+6|G1nbH3M(rAuHQd~MOMUnihShd;&Q-?_T&jcDo(?ECB`6Bi6FWIew z0$c~tT4p2^5PXU7A?7vU?6+E_{UG`hX%I8eq>1{JF|?hI=eYqP15q0WX~R65%;oCF zo=s19kV{oiL;kP>FM$5yF&CWr4#RcEbzp@m599LhE?-%=fp`e*i9(m#KFoK4nlQC? zte<(2&RIU;e(HYpv7$%>xA)&7&k!f@z#S1aKR%wL5ti_dC3?bcx4ml-9?js?qQe4O zG`B2%*{Da+i)wZAHIW8{kgeTV4GVOGnA<@y@T20IdfqqwH0 z5ILg3rmC)0RaYv$f!>%=k;wNNVds48{u1^(M51A-29fSKl`f@gX7f~H-h;FnEJ7}Y ziU*PCFQFF_tcJ3wTSW@9m!5|yfNwj>KE|#gBRgBXk3&+T`x+v+L(7igR+|Clg?kOF ztD@1X%(qUe>98{0PnD_;SU}BZRuD8bSaCEcahVoMQG`vIY^#tAU=$b|px1&dj1Zkw zp}Qj3kbMk-E;?8@?EXm@Gweu>Syh5M??< zTjLKl!2`+w4`Krfr04HQFh_5I-t3QdyCiONg8{+W;nZVAwb&T$hRJ@4xCjpeen)4y z29BsM#8~%J6%OvuwJd<#2uIs0xdwp0Zu&%oqix{r=UJp$^cq7fbPG^zgJmul1}!c!t!qG$ zJ;()ugMmIFnPlSix;MmLme{3})7)FTJ2eIdtEClV#GeP4lIjgcHrM?|{9ePdq0>UP znCN-^xnr*{Ty83$-AD$_rOOtfN>wdz(G`w9TlZioZU=fBy9=ytgG;B8Z#h>;`IsV- z{{ZMi;IYXRLrRX!vm6VBt_F+1DzM!Wn9dy@p`7sUW-S(++WAvnlAB5ztXf+}ji#kc zf(D(Ij)ZggYdu-8YF&wCcXFhp^RJbP0!4hGzl{gGyaA7sE-LJWLPGT;oSA@&B_dcw zL$QO_0YK6Kkch(1zO4&UQyfzX=8Olf;mmHVW@t@GEk+PVZ!94l(mluVEn`oTZeR)n zW+lOhfItA?y39l}p?)B0It7U8GNS4?OFq}qMtN=)khJoG`5*9t{R%z?JE8)8t8!cZ z?pZy+zsAPKHB}xhvnB5&6?_yLbawqnNb#&S2x&kMv^jDA0Gy+RB^5;-O99l-OPL1J zJQ+F5n~8zic$@eM=ELaLpu&Rc`v(Sg<+HR(ndxG184e z>=E~Z5MGa}z4?KG9jI7^iP<_i%1E*Ir6m_q)>s=rrocR)>Z%@&fuTb~mAtuA$Ylxu z-I^v&jlS2*-%zF4m$4uz!*|*KNPll8>WfTew)DiEBC06PHt%FnT` zv$Qi>#1h+OF^ccBo!=rT6?a?(5JRQhx|c3nwi&=VU5J`iEPf`(A91$P7Dub9>0G#g z=04K1*#7{r4qz97wf%JLh+^V3Vr|`&BS5Z|grIj?6Xf_yucLd5d~{d%0bYuuJHiKx zRYd@=5D>#^@C1oyx27{#ynAv_keXrLdOAuw=FnG_wU+h%3H>jK=y;MSaV1#rG8#)~ zkHl4tEP4(me@*`Y6nnIHf!I3sNYLuJFAyHci^A=WuOqZ{RYYd} ze75{A5KSf=IUQw%^&4-!?!Z)%UBwl0m+2h{+SA!HldAa{YinbP`9O~R zcM=Le>qke&P`LeOfL=qwv7$q>$vZpx>Me8jO=5h^?R#T48_%*VpD z3R6}iNlefi$0Q7JE$$RPQeLXvjupQ|Gtt&xON!otR?BK>?RyK+#jGnODh*t;G3?g$ z42Oj1rrxEEj1Ucui7@Lb-c!8as+6MTS-w8!{DAwA9qa!9W`tD1DRu~&^n#Vh6qTvx znYreSiu?q<_2`~-5v>J&i9vN=exOW#W1v?%h~On{0b$8l<#!5wuKPf$iaYWfU4qAZ zO71zqD?koR!{l>4;&)cE=5`GfKb|6lw12?lZW6 zYvIpE+}7J6TGI@75uBm0tZpw`wCFa3e3K*XF3t$Hdu1ucw7OYUG@YP{M)fKY$cXH) zW2Zps@9PV)uI0DB+b*SfU$O=T?BOxv2E2?o#slEO1~$}#_vm+KR5SxeQ3z9lDv3sf z(L=$v5$Pxhg;X-4tGd8+D)_JK)$JElOig{7y5Sx)hl%tyNC^)7=K1z=*u z{W{!ELsHSPj-LQrOE$R5&hH?C?{a}fC{LHF6FRy zXSh+iLa%kz;WiH!g{$c_-kok;k>`<9B74zAiB7JHL~ej9SN zUDahkgg!1uNA&V3Ev#H;OSlsq?JSW2KvE_Vgpw*1u$A_dL#r=zF_ES~%wvm*JGxEs zKxm`r0)RLPS%_G)<}Fu=cAOY32eK*sU=uLlr2sStm1JV2y#=dPTPQILd2cbG(jz%- zH0iny59CV@&=}owr$8S46;<{#!C$m6I20ryh$c)90KDZ=wVilVlbFl%*-1rnAic_yc)2*IL1@fP_-*MDz&(+ZdDA(>@C%H z47(BCR?Qy&074dS_Q!2*hXFycDVIzUAFwWtTpPrs>1nlTicvu?TuULqd*JzeX~8S2 z4Ir9$4VR4M_kv4(#?Diya?lN?$wCFF^U}k?*#J7DlhKP+hOO!C$Bf?e@lyH*!@H>RgoP9-2VXIF>(ru7R2Uh zn-^+#ci`1PxqhnL*@NM5I2*P0dZ@T<9rf`%n(gL43^Cl#^$G75Yy5C3m2W8a1s0Za zfP0M?hJ?_c4w!&NYZotW$F#noUw^AEjUIa8odd!d8fq7WHzs+hhg_J#O>msg^98cyV8s#wlS zIVkoVx)0zUq`ri@=2BE88AH+7J0{5!Vb~g)7S9fk)UhQ16>tF%90K~6z%l;zS?;>c$GQvu$Wd+_; z^@dNA_+AFFa%!A+jF!$WTb>;sKj8C5I+b%Tk92S?i*BCBU< z?+oNIRF87%yQ;#U!m_Fx0x`;OF+ar;&IT&m-U*8XKEN;%s$5d;!tRINQ%y0;cc*8vs( z03*Lser83$EW_yUTKf^{lYfC^+Ed-wfvK}HjK84R2&hd*c)Bn~2nArgzDUsXFl7q7 zr~M*MDW4yHtU#4DTt&Zd*_(jKmm*bg8^jWD;V7wA*@B>lp?V&d&}r+X8Se2@;Y}qK zY^z%@h=D|4hH3?g#KtB2Z&0{(S|dS-!r|5GjXB=IU=9!oZp5Ph0J^N#S8xQPTTCPC zO{F{6b69%DAdLZl?0OcV^|YEYTO+QjM@<$unw%qJ-Oq+IVkW%@&6Bc6cy7oet(yE!^u5Jw7YyEf`ce(17HB?%$bI*jeSMq(n9xK*sC_Z z<}F?}fSM|yS+|I0gUiiGdNf$b=FIo)NZKNxE`XyJhX%~i&|odb*w4fwl#Gcp= z%>&Ht+e5TyH$VS^|YaTQxmiDb`j zA!*$*n4vNxL0i%znN`~*X3qx@G0`DX2R#DHc}sjlNHx(Z^cqGge3Z`>{kj{)2NXfQ zg)89gIEGi!L-QRD7ft*YivWe6`E2*J+H8HA$HEgT=C=NX(;os>R;RagbPQa(wuZAYKym=Qu(Mveaf#E#C=ySM35 ziJ>SUhh3(2+Ft9i0vov?@<2FrY04A|^{ts~oDG%ec2c6*z^pg{`} z(H}#nQ%_R?Y)%5$LQutvk1Ce5jR%$R6FWaO%ZN_kO+^k-3mYe^HI+zLLWo|`T~o~L zW~^h#SbRXJ#lh4vdySwZi~#Ejf=JRhx-L-|#ux6%#W_z>B!G;iyZvDX6-W`qQ5E!q zL9~8?Qabd(2Yk9tmC8D!^8lJiA|Fb+-K4dW9Y*2V)I^?23u^OQ%jr|TLbNpK)Y=+H zsnf;nj5Il21C}B_t!=ao*7EMcYz0BQXcp?uIZXfs0ih}xJFJCrwOz@&qFGvV9B$t_ zt+FX-X3iYEGI0$$=#B|mb_A|mk#r)#PR+NLR~)H}Rz$40RrVqJ}up?bt}7zvPFYgcf{Z7}v=fn5WoEBOo1mB7OdKkyHV zlqT0;J`1OvU>yo~X_0cZ9_0T3)drb7JNb#s>bYTdaaQo8;u=G$S3&gL9qfaVDgDa5 zrc4_wWK?CfJ179;16fzfO2RB#XlV!o(M-7)%NW{Ei#U!#C$vxbqg22AnWxk$e2M%s zGTc+o#j+F&29i{-JqI{*?a4p$QU3s%pZO&J0L4%I5`W+k{{Vtd{F(m%nb4R201KqQ z@Du+41dsdzKky^}00JNLQi#9sC7;Ak{M7#d$xr;0&;FDH#$O4b0cyCSDVBg*P`@yD zO~suZCf^-|X3Aq$SYL5xoumWNqKgDwRbF!l>D1`V!U*d0-ITC$anl#Klt6h(-~A{; zr*g@-PiXNskL81ZL+&j!LzrNAuzB$d4{XZNe3ti?o#e{C18{kwrAcXt?I$l*)@wr% zH)2Ru%4D#%lKZc2zI$ZS5rfqx`NU!GACTAXSj?*9N1?vH7%zXg2Dy0VVTl=6?k2Gd+F z4SK1f-@U(?On?!q7G97#ri6GitA5OMTy$nE=ENh~66%EvRtk1&;hF`Zzzu!N>gm*d z33Hg5=$69*dmk{?5{U;X0}&~6p59_M9r72L8olGC$0o{HGRwvtC71(*p8S(_JbyfY zqWY-P9zULFPkc#Knqosp$YeQ=K~NU5Zv$Q;(J`elf9?H8pqo_~>z7Sm{Fn_# z-vlJ8v;)hu7fz_1dWLkkErQ1Bk^M#}Y~dTG!OUXeKw9CVI}74M`T$0`$J{LzOZJN+ z>#(r4^q5_x%jk3f{BV;%232qbR?r6sQwO762?B`3tXKxBup)ATz-rhq?KLA=YYcJ$ zrVv}>f?~dCS?PQ)k!)c=2sd=!On7+jv>mL632yBl&0z zRuujtfZ73}%@2|dHEu9?W^-2J_4XoI*|Fcaqkbb}E6DYvs#Qh^>;C{lm_W5w!3B%0 z(|H9QY|=NoFWOJq#|MZoGX?>3GLv&9j^TfC9cds#y47-+1b6|oiM`}#)VL^s#g^qQ zMe7XRh*oM73<247E-(1erGN-0#BqxWq#y)DMsAh%Q-kGyFb$7?^FQMM05q@qA8;K5$MZu(9zT{_ z{eQVnsj&}Ov>bc+jl!d7#vg#=%wpf45&ld=`Le&|L;kKaFa3<=`SD%<0DMu;$chUo zrKSNXV;CsnKdBKDXS%idWo*dsJGQ}#liPlE24qpC)PDoMG_&u#bAlDm9$H_3* zplVA&L}RAGM=GbF)25DxLbeA6;7^EF8+vj*zA$?+f|YX>(->W)9n1OQLBrWoC}6~r z=+@wOYOVtMPvL|c${9OAm+qH*iJL#>nTOe@vvAl;%+0otN#{;Se zK&iM6d-$fc7A1f%>hm5d6bDcUptlEj=~P5_zr4@75dC@B(M7eLC-iUiKe2zQ{R90?u>Sx~C5?udYf>hf zHBbbNt4+YH3zh;T-d0l7gJ_&vXl^2!>udwFULp~Fgr@?0>jUboWgHHtzVS6i&yoNZ zcO&;F(72lG!&ed{p+DJ!?*=RD;E?|SK*yZnYWG!Ru!m?Kb6v1yA6>bZ=c5sUV@2KAY6*m(dqb}b}{3@gkbPk^DzkzJH1e^3rzDLBklGR_I?&Y4&!O zAch8u6im?_gW{U0xTdz7+rclRiE(`u zldu|;{6K+C-A#?Xj*JGT{{UU52J`$<_jC*RM0y> z^>>=#r~%Yo4c*?s>N5>Ldun}&LrKos?V^(Y@%)%&4(m^GGH%3K*e}RE?9S$068IYJNfd$pwhz^Q?D%fl80%f;jG1!UaS0ohZ z2iQ{ft=c*h%D(vScoCSQ#j?L;iIMKq2o>pXN;<%ljOIJXFTaO>GZS{G2MNM=dnS>w z*_xki1MIPx0d}MCF_sZTu5(@zj_?(LgwKG`-T<6#(gx=?u564o<_M^@LI&L2CpVQ<<=z|&w)x891*k@mYHCd!h=RNw;t+KvE29&q z5h9uKz&eQPMZ9VSp5s0_BLt@heVYA3ju^5(ENW(u;r7&dg*Ib=d=8z8ceoyxNXi6d zG|*3mUYbo~B>j?skMfFzB_mZ`=2^WUHWO>6!x)1j4FxY1FTKXMZJ9?O?T498CJr02 ze2lXfLQO$#*`_?p_f;KdY~fs~mt+HvI>h;M@c~!i1G`MU+{KzZqQI^KsMs;MO6Wsv z&}RPQ!NeVd^rD5`FW{+Um<|zx2J+c&$>7{A7h*r|Sn%A>%98pVa9;pn?z0IPKi_OS zDD^&rSUm})TMcL~2tsPMxB-Q#wQC+GuL3!`fDLLrh^*>w9<71GI>TC9hmHdGMqeU0 zAm9E9gi3+T<9ZsaECDg~+VnM@J(;Lr3td-+&u>ab=pbHgLE_VqmmDS&!C*W)ks*mt z8i?dh7>seO*P~0xEyg&NN@@#!aZfm4(im}kkr35Se5R44ikqqrmJe|Pw3nAo?!V|Z zf+`lS>jJKcx59i9^fK%~4YU$zupfG}N`hJr-Jk_n9sn$74_D{NMQGt4XC*_}!poqO z@CFDTfc>Txx?KjCX1tKgy;otaG2ehd;g_K7eWU)PNObUxAPPBwV8T8S`$i##=<@!f z+hj@P+||+>W@5U&l}eOK^|69EdI74jv$PEcf*uC$yGmRK(N+TcUF?O#Yj&5(9+5iES-KUXT*!cq8{0ayarf@r#E z{qYn%fx&V15E;&%sOK;(($%g6z-U>kd?*cq!C1QkBc9_4uN2UM3u8M=J)hoz@xOgiBsoanhYODo zti|*eL9h&|f3=X?@*rqRVzk#hvVL4_^<0M|HWsWO8q?0)3_$+0q;R01W!0QPyU`|3rheNBC0E9_EtSoE@x zzmT7Bz)l4EQR0odXU|_rfcolfwaMZT89)x~{u6FjD>1e>z<%KlLWaN>u`1J+<&32# z!yl-*4I$U)517YZ1o1D>gsmN+{A6=C=Wo@K^^jFvk?^23RA+D26G@bY_Px>o9!pHb{JlbZm2YF!Jli;RSDPRk@W+@l!OGp!Ymk!hA z;cfo_ZEb?eeX9#ebOUwu!j%+NC@z_80FzL-!rO_O6F(kJX>rHcdx!_b$>}K^7jF5HTS~p;^c)V1}vL8q{{l08R!R z;}@Cl2MV%Q9Te)92Q2>ptAc0r|eaS z;dE96>*W1J&5kql2!2CgMDjR&nPcmy;4Q?%%qRkl0JV7UDWZ%bRq%CFY(Zsjzu*%f z)>8>>@WJKe@=cEr`wRCKc+mDK3=Jkb(2}XspF1jI$BsmV*O{tTh!9-o7YM&|D?ymZ zA1OW|q_it24h^M_jn=R(@LFm+I!94rEOkS_Lz+U1n;7kI@XW)%#aq5hGa zwm@yba{JNq9=e$2T6tRydp1G!KZxnHMsF#`unsZXevC`R8~_g9r(&nCO>cZFfSRBX zuFxGDp~~&41)uf2wsxOsivG0?Iyyikr%ry%r?@-?$fi#u6r8-&#iVzVm?qdjqFo+W z5DH9U)l$@VjeuP@6Te~}gmF-J=N|70GM+${(4fHS@j%O#Rh1a1nwrX$c}cs>R7;S)Lx4YTsM0+L&<6m#@du6G z!w^)L;@wvP@DYCws_y6N9`K29MP5)vgLFseoz~0Y+QGA*YiJJlC{%^z@%;_CgTNmx zw4G}7hmE6~8!b$^cL67J4h6Vs8;ms`OHtig^f)vXfNmXt02V0HIU07A^H-0ET0hpY z;(?OrPkf)DhhLkI>E1i-;z896xgavFcN@RVQAl_-L39~i-zDtCI-L5iYn9LnERbuK z?N;hyN$?%S+?va=*uQFox#d^Gzsx#iA9V6%k2uCTdv;kV)E5;p`LkdVG zrbOT+1zHTOI#F`%!!+%FCQDcMZCi z@ofYM?m}X^r@KtTjGPN?$WM+E2I|8AtV>g?QNyWS}WnftSz=x zIdB4~5XpWht4ldZQ)6|N0Ag2U)b3#(NTf^wi?AMOedS=$D{311jSkJ8BEb;|DC;_# zE(W_HwrN2-gyJ>%2CwK*X?H)MeNUn-21+SMK~-6)XEMO-EzQM4-v0hzt6LYuEv115 z*jW=*>KCFzHFJ_(`5%F|GW{iz4!y(v(0c`!h!3esU_r9G4pBR^e`xzqYYk!95toSC?hMr;sSz}+(uOrn z4PDcS!Zu~px7;D~2qA2XlPJ(ziobYkd*D>SAX|pWW}<#nfZp*m+}aHJK(}^Wj&p6n zgHVd#JI!zyB+#@20hM{JYzUetr2-AVZh3JBGR3W_QEeHoXvIk}8;dvB9igW|qH3vJ z9_#K!tYv{!#sODeVbn+)v1|caOHTunWfi0MacC!;%1Gi(S5k_-oudto(vo+SXH}tj z*m0u`rqK`hhKV+STkZ_#cWxcRJ{*d|uy+w3eykni9qQM-Ej`RG?z{#>O-XX)%a<-( zxmb_)=sfXYUuk8r$+fC$F0ir?4FD)TTgCL4JES{tPx}Th%gjwnhBl(bC~rrI`WjF` zT`_sBha|1Frb9&=lv5`#g6NJ&_)JU-!{!kIx?Zv1g&5@n`i}yKp8+31DknP_KMxDA z*B-)>Wb6xFwkw7f+#EtusvB>!y~BrRX!p3n)hIqd(>BO3=^Ynth6`x78qpPZ=Tn{% zE;hgn4lb8S6$!i#$Swlk7?vlS+QmGU^)uoq6ceHmIlIHHr68yZ5~$l7c$8r1A5-DX zL0v4oAHqe%%hNSaB;wW$Y~BdM?8-K-3xZ8%0?d|b%Vd@$6Be)oHf}eC5IZa8P-5(? zi*M47b`UhWf3!UgKLMB0!38NB8=nc}Ld50k8LoFb^uBNcsMg)se6fTigHbZMJJ2SY zMr(D)vj8#`9T4t>tR6ChL(mKcRp(W@B_>rqTVtK}ft$gbVCJ=#zkku8v^i;Pwq1^0 zgHG8+EElgMUGwy4bOy$?C=OXB+?o}0f(g-U46p1 z0wBMiH+d|Ham1@iuK+U7M9ka-)Vzl4eCbS;(1!98?{^TRO5F17{{Y-r4ZO{~K`W*m zhjwb8N7?`awPKVW>paG_D6V>WMr5d9E|*N&dtrDw!3cItQYm> zgT!15!w*Fnol@yQ?x5R{{{Vk<^ufoKvfQzu2r_Dw;aRT0Gk7y>I|X%nbvv&b1_)}5 zWU|7VE>JSC{{Z`HwV}%2cZjlu(27e^hX|$&h!y3ZGqb(9 zQ+LE40s#BsM9>NV;DrPm5Iq$wcfJLk%d@#L6!C2iSQL4Mq>AXWhP%s*YBO9!3dI#` zHclMBETGyu^11L0RNxG(Nb(;B>6)W$Z{YzG-e8|o$UovU`sXT#ooe5<;eE7ZU{p=C zBDttknOj7T$fVYSyEaoPbnpZp4(qq@u}v>EHwU~(MwkjB)cSA1S5qW9W zI<{owVhTpGwO&gSt2rw<8|I}c)p_91FhItNg|@A`oiy!~x1e3Nc?JIf3`L{FU9Jcn zi)D_yW4c|7Z#bFTd(U)B);9xpu7uD5mAO`8V?e=axOUEPvopzhxuMG6caEDwS)?mw zmNE24XMGupz81z#&v33`8B5eJ?N<4ecss@Z&+>}`BxFChV8Sh&Fbi59>TP=$3RTRI zZ?ySeAqH0yA0P!DE(f#yIG_0${{VrX_<3LOAiu_n+MI+;b)wW4IAA=u7!Ax$sv8Jr zR^68^VQ11f%7?izxFM*UuqZq_9S5Kz(1U#mab~41)s%O7rrtCO?EqEHS>&V5&8!eD z?3D$3SbF^lR|1NNb{{T%qbn~Zhb`aj+GdhbRcx2C~+P_K$;iK!{#S7zD1;TU6~RcPgMBTnua~Lyoo`W3xp-LOV`Z=_+o*2E6NP z6~(A>FQYH=$3N(lOEWqpkP4w{2J-&?i{P0;Yuq8E8$hN5s7MV@`tuvKeE$F>d{C;h zq3y+Kw(NMyBeHjSd%oHc#IHt@!2_!+(ykkuo$4~fezav1`diFCEvIK_cN60d&<}hv z10!VDg0|5UD&hV~{k!{>Q=#NEM6mZE;5bGOOa}#fB{H{42n}M(n4MsJY#23MptYAt zkL-4VIQKt}BVT9uC8&*Jm0!UWxq?)#V!85q8wRM*45|dagafjz0$B%YvsCioYCw*_ zELA=hr~qw3`Jvu2jjEiddS388S=I^>?6vJNP>!B~sJH08iE`+k&=;K-+M;IVkI{sK z&P4h|1E6iX_Eojwrx%A7^182f2dbl_T1@J+6E462Yy>Fal23)Ldq%x!)*FIspbNbm zbgxoEUr$2aPR*UAyyc3!P>;a?>4=a! zxia_$SFs4U2%vMT_KW!%k-o3ETkyl5G9{x&{{XMsG+!0Ha$kweg|ZP8zy263%6M+svGj1VCGwaAI;RRyx+%m=77_f&S-XFt0rpwn0Sh zOg4s&!<5-BERw-Rtq{&0GZA*WgqKf_giQvNv^oGwYSoF(tx0J{Bfz&kp`DodyW$_(@$VRH;(G0?PG;nP8N$FpwL4pb}*EZyU5> zs}I3fDp4v_uS)(iNa@h(YqBKV{hdz`EUc_t4#VHbShp$10$&)(L|D9&CKx4HTV{8I z%8Y;@HZ5zk-a2k1?h^fD#r>%je|tHh(2i5)HyFadf`Nrz2GPzRaq=sO=Ku_5>Wn)* zk4XtzLp`eU*p(kNz61v=s6hQKb8cCfb?yhaFaH3uvcvr*WHuLrv`(Ma?=JrUL+>3& ziuDOws48`f?LrJjO?8Rkw551W7u{;$Qepro4FWbP$;71}T0N%p?x~?PHF;3zkX0F> zVKR+1h$zdrDha`hf*T4f1`5F})Z~?FlO>iJQ$z)?wvk%Up;3gqSTLJjg5&Jo1lE65 zkaPu^pefywoe_m87zYFrt=Tq4#Mv3Na()x=+`md(sZyYSg#IE7bcV3&Tny&5VedpO z)QqOQ6w|yqV)O{BETFkEWzE2H0Il1~w5b7v&SCn!Fhu~^03)O<1FL}Xorn8TH--9U zhh)J20LaNa{{Tp>_Txl7Mipt60h3l;at-|`@s%%XGh-T8hAuT$LPmeH+TwzYL$`2>9@NC-|s ztVYX=v2%jvF<1{eY?Zp*_xj4bO{L@Tkd3^6n#9v053%Q^`rSV>Pz2CAX{lK=)zVN> zr-nsnSc@2BwrVSjrEv$^<5$HNzdSb)vG|xyrxHWU=gY(wXt{-%xIQqW#4~io^n~ z2CEXjPzK>LJ?5V-N6PJc!MOB-C`Of(Zxsje*x2ws5c5^4{%dOQQJ}>o&lZGky=Yzn z&$JthMaBx*0O1xr;=|&=PE=Fg9bq9kX=E*@63}yz0NG18y~$w5t0)kqh?w3BZ~}VJ zxGmc`l(mT+sY+_oJ?0s6Y=kUZD6GfM!JsswF&&|wF*^rDcPDoqDntNxSdYCOfK*j* zE)Ag!bx+D`2cx9P<+FyzYCdHS=FF;l!HaOrAQmF>2Ez3at*I(DHJ~xREGPPe3cxta zQ4LSoKk*R%0GXfong0Ncn7`JESE;h3cu}?fm}|f>BEZpPdaX$t{pjwmgM9NGKe%KIA)n) z8x#w=x?y@gzDU|YC=_YU#Y>K(DsovS`D(D`=1twQia*1eXfu9>pixH&qtbh7O^wc7bdoqoD?ou>&J2YPZ;eDH}^l zjxD%}FAtGjVhu3*4K9~vyDfQ3P;FTKM{%(2Sp9mOL1voIQN zE~Lm8ie=sM(y$V-jeEs`0fYw?elW$_VD3!BiAn%yJ)xk>-xK{qY)DmOtKJ?VZHPJ= z***UNidss(Ry%yknTna(F;Ru^8vRGwhaI60e^D%vuH2KY|k z?EpZ@wOEtc;X4zwD*wjH>?_7FMxY5fEo68s;k8AmkF;C26nh}*Losu(83<%o zMJ*Mh+UpGc1&}6i(jtC~l~M}C;SFV6q?LQn!wO={a;L^Y66HHOuaiJJUwW4)w%3fu z7c>uA<54=c#MdXYXVwx_Kn!3@KCwkC_s1Vk) zu1~#^VH7k3TMmu!v>_Mr2TF%B9jz0mFikK4 zZP^0nu@YGWOr!~WN(cz*KsGIOwk$p1hq=kvu0b9WlMEERtN>6^BgAsK?*rQ%&J{7^ z{dB4;X=ZG?LLYQ}+5&>5wkuIK1k$)gH4z(vyak(=`pfWGFP)jCdrZM_<6qfxa0AMN zuOoZL`@MYJl_RAfrB1%<7N0%Ub}wuT&d5x~vit%)ng4HY#X zJv&bjs=_-WlIhMe0Fv^Hb7>y&#j{l$O>uG3JuH`fHS{Os`YDCNEQTdSvNw*ba`Tm1 zl$NPb>p5W1M%Mvr0DIC12&>Z=QT|hXlzqhGv>`K1Qhx+ZZexecF=?Xkkax@&c8vww zpEbEo?~Jt;Bf?9im1khv2O}=Ln~>|x0JAwT&MoOPZ40Y?FNzQ=pq>(r!7OuwHA1Lt z9qzi*8in?y=X`~n?#vmrQRFrgJP716e_!}?xn#JV@@gfibO5+OIfczUG8T#pme4>C zqJFDU6Rkvz0{}Hu(1{iF?=XKF?-*Mv%C3J_zKw!$BQv~c%PK9vT5tKMZ+Lv@aWq0$ zno+$`npkA~Ml3(f(3c$g4P|=nTr6XTUR|qtxbt0`hZ1iKt>B_ndDqHK6CmUWksE2R zoP42&4K@H=1s^EoN~NF_YS1tM7ztd*d`!`)wzie(?-s-@RvPUZxm$5+@wl`jT1MK} z1gYJreTW1&iP|kcbG*Ent4;&31ghACCPt-Ubp>P&%D@-(9yM9pR=t;eKo!K9qeZQn z?G(fkm$uzi`@!8=Lh!*}`@Q3>mny4%xiUM9R4P@`aE$VzAAeBOW`*EA$cZN9&2O}69vYs+f~0sCM%c3ZB7>rhE>YB zaJ^2;+&U-%S0kW@4BKhOwbBl^^v|qPJaf4+EYkNY{)~}T@k@XFSKeHUwmZxBf zr$zmL>JwsOiEa?P9h#R`$xyV<&5f_U4bP1rnv7Z;ET+TPbk>AU^nk4w0hrog3}Wx4 z$}D}Zfy&ddc}P)^ZUZJ7UODlqI-V5mfb@b`qI`jvZh6VVnXkaL>DFsrR8bT=;uMMl zIk+&VP=LYt4{B5j&NKPyRCJ1Ry>X?Ag|ZBc1OA?1P!tqzo<9K_G1(2tPHN%SrGQt= zH_k>y7i+VjhAjv_4?{bsDO~7U#zTU|2byNk!RUVw{tAN4>gfI+I{30sk|RTZn%uagN{o?~!P+vsxatL~i9tU1cls>{kbtK~FUX1<&TEK#e{J$r_n0g8)Q(YO+=-+LNfwpa8mJH>jZ?HjuE7T3 zTh)V2ix&8mUhy@+p!QJYBd1>3IL!w zIFR{c6?|7Gd22c>GMvB-)+;wT5{3?2*mLN(E}n=!RM8j(UlqxLt_^l#;z?D!QkT13 z;)^E0cm@flOP4M$6T7l)G zmL4LE1%?U+kX>tWJ~idBY<4QqYUUbr!?PUTUDL!ZSeK9X`OQ6^5Z`7S>y#+UCY#sjVq(gH93)U^;;_L0D;|0nJVZ(3sI_ zss(@|kQQZQ0e*c`Ym-KSOAD8ICq~{xb-l0mj3`|J$lsfQQl+7RidV;Wv;_P zu>?`Jksg!wqAqD*+QyLrcx*1HVRYsvp^f2Ct=kGZk%cLp)-b&rw>WJtsliDSuimB6Ekjrgs zGW$&tNC35T2<*;2#z5^y-oDuL4BMWiIQfmHIv8ikYXN?U!fN@U@<5x|IUBMULBAZTt7S8`eA z1q`CA_5vUbqT#dpSijUy=9WJT^?$hNw|>9p^j}wBRrGxq9*;|x2hs$Bhhlda-8*(5 z^Ps;ZTeEBzZU=%aHbEDKUs9P#{{U|;88>nH@FbivT(y@8+{b=z z0UCln1&*thYx2i!tq31^XbbiZ(*EaoScLO?cxBjKxqodF-VgvPt^B)Q@Ax5JqH)mI zps?iNtX6QZ2S$;r(%l`%cS(T-dcx7HFgu~EkN*JU4B@jqR-9b5n~hZuaKqTGLG7b@ z)H^ME$^-owqFu12U?}0&fi{Od3=yJJ5DUD8H}qX#EfUrG4u(QthjmDNBisrynkt~F48h}F<48{(wx zE49V~p}Mp(xPnq9?|Z67OXEco;GLY1qpkk{gMWhhjw1$b)Bu)z%HLs9j0^234mu^q z>eiva&tRq9VT)^He60G6Bj8PINF#6yy2^30Ruq?urff^T7(&(J1|=t4nkx6krQ8#O z{{ZZ)S9U0HM@e{~6+sIPfThhR%%m{5xG;MrRAXQYL+gqYs;vrHSxY>u`jmM6RU()a zg#y|wY7-m#SyQ&qg1JnJ8)DY7!lK^}Iujw1!%%#S9n-UD>Mihx#39)XDopNjFsi#M z;fy%ZS{26@zF{?%72Fn3h!t9CW=V;!Ai1^oATP*8sYVfqK3hO`s5>eS?%0jNR|1I1 z>PuZ(016F)Co+XAt&Q81T3eN2FbX_Mj1-X+C?z)%HU-@xrtFaRr)tW`iJ(CpkYi-c zlv^0D%}pgTP~a#!FxDTErAqvFE?-NRFQs}eU-{wq%>(o>Kq3W+rReDvOB?=6gWl2O z2oxSvr(pPvArFm^+?UF^K%qc>BNd?6Al$oC3A(j`G-GUChhGGIK4?eX3cQdOaS93o zhMEDO0Ph3Wo`Uq+Jqdq~{Z}vZ-=g~8=da2#@A1(n{Ip6x9ZHp%P%2-mfABBz-=_Ls z;ICO9$TbiCCDgfn7yeEDTj_G)nD+lpkM-h6El^?^b zsi)%C^WRm==)Q}Kew*|Qm(gNUs|eQMwdS5scD{5=0pFu;CVS7GS+i!X-zqclFXQhZ;5RigF#-qz z00RHO-(iGda_Eq&m5rs5$$2Ta@#@JBC{-lEpe(*m}uw z{x1dgyV%R_9e^I?|E10U?K1bN(-%EqgK7BM83+f5#0tT>(Aodg<=J(Q|I`n#>!CsZ zL9mS#yB>Jl<`Ar(f_3?`|D*2lKkAHvn2rVo&-R!8vq{1fA7J!|AjUgcxx-9%MbpY1>WE^kO3yZ7kB~{Sla{C zfI86p`xP7lSPZ+c-?6Z8aB{E<7bhoQp-t^`5mB)%d-rEN>7h^W+$FDd*w)S?F#F~QS-C^T$4;LK3JwXql$rIo z=Ht-JJ`K%(jE;MrI(zZ*)uML$_y+}rC$1E?zG#EvZiNIPxc@;F0GtR14$pz`rZ~DfePHc-C4vj** zvbeu_L}U|XBtu22kD!s;>fPN?S&D)dXhbM3=kPzJXk<%k)(w*$f00RXXKx-3mP&gw z%GZ?BiQ?UvL32_x9&SGwEX7Wqz;6#kBzRH#s2qkjM~fMU^&|(jArevUPePa&iPU%u zCLRCWhsEtCu|g06*pD=B=Ci^j)wwu5Gv5)WFV-u)fXv?nI1VpKmpXAbSS?JFh>U_y z6pkh7ZKBPz)Il-;cpJVV%uXxOPNFqS+L}enrE=j@>~_ zF5pTN^i%g)#3AG6O``X8P}>&kn6^=ST%G*(MP%0Cb%0Mt z5i0w=%VLblO&9$v5P?dK_~SU_1-4D&>X8XOTK^(QU&2y^;;XghKu+m|Gs=%pMLis! zjSP}43YZUQ76T*Xscy%}IB&z%8|b*}54jq7!BOQpBm&gaxK!Ol7H~3zAZbv_#a~T| z|L5_BEG7gheh8I>S>Z*-aV$%Zc}b8T$JdStl~|H^)ee!!{RKD{_Sr-*vK!Hq z2V9d@029g}Fa>*ukRz@c_B^`j&1h1!aR3!#-vp${5%@I{ek-?5`M?WJ2gMjjr z3L3pNIVQlfN+4&0f;_WHy;%0?q2;{g)q#ZXqIj>5C>VkI@#gZ-EWE@3H7fEKmE`^V0MKMW&bh6mwKUOj^ zmy5?RB5jX`-%}w{;pY%>Y1v=RZ2(ao#Z6-5tV9k2uFVR1Bo62F74T0yDioEua*1S{ zP`WH56eLx^;A|TW0tf1`gMbk#EraNOevq;Twvhm>hKfvxQkRhl1dt5 zefzu|Nwr$Z)lg0Kpc^2dn10$a7ueNK;jaYSB9gq}q$ByC(YSkpY$DQ7`2`UvvMzti zJAjGE0@y(=!UV_-&vBnH3&msxW(?|P?Xls&BB>rcG)uj9)%zzt^01N|?J}C+X`D2jrz#c4sU}V~G1<0;t z#m%#De7^w_j`3UN!7@U(ks`u*8Jobi&~dldKotlvxHXh(0$( zI4SNM6G*>-vlpZnFyO+|4mALXvwVYkv=xAlwXRQ}2Y?0L7`v0gKzu17-Nof$VD*-e0nV3a_mY=s;u+a2*GcARXu#uWX}pPg@zB zBU(w{S_HcBF{79yV%#KlR4|aTqndl%#X`}@|K%1>$PEVx|WG@{iiGdb9ehucl$NOPyoDiV3gp%b!9=f+AFSdhjt z5rbO=qhK6w)l9RuCpw~2-2_g+-)zMRke}{-ZXj4h0)VJgve~6oRFbyq4~Z~pX|o=u z+CtLnqG4k9f1?W7C#@uO@=mxk$LS!4(^()`dZ*Vyjz5Ux8w8SKg56{w!3-8bSTq1+ zpe@~IYy}8>Ux6D$JLoL^X5!N&I6x#a3D<2g?YIt*K&AolJHP^mLC%4H6p;zw;)W-$ zfWxC!(p01gaBW;2tOtnBJSJnH=r`yUu<_FaJ6;=H+Rd%rxQe}F=Vc!ul|~D zniCdnlx57NU}86c?)WAYD4`6%g5U#`q(((CD7c3MU|x!bH*_k9m65Y@nzxz- z+d;R29tr-536)3ai0>efK&3`&R7;Vc-*u8gF$S)I>#5Jdrg*5BelVPnLJ6)^d<*Gn z>l%W8ZfqqYEfWkmmxN-O07>fx2L3t^X`C2mS`-SICnKE+fV7O3Fon#L=~ceN3c9H4i*8fo;r`vAz-OO&E3HOUh{Du z*q-OwrKlVV(cj?Q0%*V5HVU}Zh;M>1G~9-9I`n5GQJ{kon2z+^2~juYDmqkXWE4cE zHg}LWzadAV^`%mUF{lgKkshnY8>h*#l4x-shd514mq;Z8N1{JT1+oCV90b5{L284B z5gqkLF^++&D0VQPWM!lqM{AMaM(A3dC=)Ou0aR?L5J1ujXtLn^07B=4a_X&w89;+YfK4PZ9l{a*l^DtS761|} zL^l9LN&Gx;(bxr<#(E)>DA8Z_V;dQ~nze%VL}VW1)8L}u$v_tc@hsFSoZZwJw)R6e z5m7ApGeQBJgWympyyON04xmpW05c?lB0K@S(Oop_SvKARi+G?183!pEB&JL6RP98% z*?}0)hmR0o9CnokLJLfml6I(ozy|4E)VAMp!r2uf5=R! zwoz|@umA#$A(jmA>6`{`3qTBjNjNA#AS~m$@gzJA;Hik0uMPmga5#Qs63gV&1pII= zQiHez@>dEl6T&qEfO`a~lu;f91meL7K#ZG)lafsE2N7&w$GTxlJx9S3_7PloH8%M3 zq8zYaw+w)*1b_|t&L~2K)hr-o{MD4&VK?}nc9e{@m0^nss6hx#plb|6YM*(TcC z0F2#$27o{oY|OS!6l4O06?7TkuF}9SMzA!{$Cpw7p2Rj=&|bw&V;4~%qetQ^Aj5HK z01+Um0i+v?yk6-x*I;fi}Vlt~CYu;@a@;G0o)6^5-qvdRtCLgB>m z{%k@S><1-D@ETYFoHT&Lz;?4x9@wC=fGtJ3qfpq6ZXYTI&CI`4LMpIOe&C8(PXc=x zX!ogbStH<0$YXxKQuchILO~9JDL1wb!Isc0S;1ydcd?WhHy}q9a_ods*9ST%EEsaU zqyeDZOp_$Z;3<3sbRtOvgaS?)o&tw*!+wL5LO?^jfF_XYPjH_^;@kjk93VYp626ly z(>`p*YO;mv|1UZycJN=13(f~FE>Ayd9|C|RicF}mo2=8|G^ZhP?1eY;wE{l$P_9r2 zV~~Y_lZLDh!dXH^kAnUYyS*9XfBp((%BiIB0O$c<50(SM^LbQgC280s$oac7r5q0)(SnE!YE#cELi^%D?b-;$yK&H(a!6s|BJLh*xqoR@|SWEUAIP6tq+kNHXcmoC5; z_n#Y)0Kn0puE21H{RwTgH+(1lkfgEM0w5I-=P3xvU;`jj;*L@nGx4HqXoiaimkLP5 z3Eq!j3!X%%^bR^`31CYHR960hL45i)690oid;xm^NU9hing*msMmcE_nWaK%z==R~ zlhj3Z&;@Lj^#Dzb!f+VWWg|S_*Hki)W~Ur6eeBg|VcF;>18bp@02#$D$cPL9H1Boy zzn~HYM6soA?4?f!7@(X$83$_rkt3+OQ7~Z&pM!!0pf)`k@ds+Rh*nU;#6SWSa1KKG z>IRsB%Pk}k$quMFQ14d$)en*`F%C!rFO*w+Ix*0ZQ4k3vT&`ZE?TqU0`#3>UM+PEN{BD^K94S#v>1~H$}DbXC?>TJy8u_jpZy35 zedRh>!B@aHTpQpVl#wK{EYnrpU{?s0K{P`tb#06YRFXzPs8IW%*5fYAy^0~J6wnE5 zTZAo#l7(eL*Mr6}frCLFzz(v7AQ-~zaXbkjZ~%J<+7dv7V+nH=-e3b|1lYu(1+=h( z5UZtkz=_wB2}E}~@I1pg2(>Axvw#_c0>?M(<}lEKAP2z!;*S9oD~u5A4w@0D$5@0O z3}tUc>gKo-ywTbQ-6Y@*UAFpLaN=r)YtSul_m`G|b^;1G^sQkdD0NtO|Nj`+dDt_R zD~j!H5#6xeX@Tp+5GNpUlmh`@S30JR0Uwiq7a`pcI2Rxn7BPd|ESOJ#L9ZkU z>7y{=0^%WO06(S1O$-i&x02K$y0btC8)(_WA_m1#@+A#ocH|NV%j#b=gls@1NszZv zZEo1+4(sj^AhsfbGJR1u$Rr9t+?gRPuz3txPiQ%RQu*NcoLCC<-yt0kPEZMyj1qdsA z|LO~rRK0ZM6AV)@H1>5kIp}7AZ~&a(mw$nDkpycLF6hh{ zgNp4Q%ttGjH;UaAu{*XUxkT#KdtsZP!i|`&MQq634|B`TM_7lI=`9W3zv?Rwgod^B zY3y*+ogq|G<`Vw`>zNx}J2u|&?aSOhr9X0ZORZDOdsmU*{NUQ$HyWIK`G5ZfvDR^) zi{8q9_;a~q(zvK-_jwXUB~Joa;|ZE?FtSyazMh3D%9 zH-qkdI`%R(x5N6ynFB_zgLjE!jM*!FvmE?G?^`=RG-O(_^aC4J*_>iB{TKW?|4@xS zbSQBvU+0_&z4UIiL###xdc5pgq}2`Sked4}_^zU*Da7JoyLEO{!ypK;tH$6hvX6)qRvBVZe$5_~x zuu2U_U44fqUz2LSo{5aUCD?r*aNFB&rdhi^rSS{p5Axuf*x?3dc{|IBLzM;$Cs2r; z5a6*@{t^%q{Juj0g*c7@`p`jyiBDdd=uzyFY$6mTD?V}r%xEbA{Di?d5ukHPMjqlQ z$0UxW%hp9Cg+?-5=Wh;0TKwZcJ$1@oc^pF{gu=irFV?lgKd$%9P+>DY9N23iv!os zN7m&l7`4YAS7tyo>`#U01~@n3QG4i+M_oF(lG6iq9j$#1LwKW+QUJ$grUl_7!Z&x| z!t!RapS$whmU!Vcu{7I!=o-1=bmLi-fU;X7#|uZc%xYcO_oyVIcB|(alOFy(OYCB0 z;e$tS_Rk0}9GU(>Te{vkU+1Z^<3gfn677`6(2DSu3SGMn4Mpo;vKLIB6v)@gzvwki zB$nDqJvFy&AHDVT>#D#9jg|Y78ku%k?k;&_r<1Fm%-D=&9ZMQ3WbTkPRhel2Q{LAy zf!!T8wxBj+{jz*HnN!rk?9lnu$IS=o%}m2gW=nQQzj6KxQ#O_{LDY3_}>tf83djPpxILDM^aNw;sv*OV(^FwFGs+1imRBQK zS8DD(Devo9$%@_iRz61RylS=F8Y|K3PS9zaJCPT+evK@s&=eKD{@kN<#NYl7U0v+L zjS8b$#Z+Mh3zeCyQ}xN2CdEw!y6Y+%C-*nE-X7XlFHttUoK`eEVmbSz*5H256^emxV9LnAL0G<=Yjpm08hZ$m4R(R<)7B&diNig!sEn-OWPa6DtV1# z2WEt1&wt1s*?n=hiP21;?b&T8w%dujuff*>?#1kS16@j0XzA|B%F?!Hc0WVGEEjI$ za6;)h+%+ETV8kUPI>CoF4``7|;m|Rz2IL@cxaWSfH#d_&1-M3JLJ44;L){>--(ac% zgu;7SdWRc;nJ)J}7RYaY)l^PEKvT8qJY~?zJ)AjB^e_IKV?Z(m`9&nNg@*wXdk5FHWx7VLN7puwA8q zfuAE7>_Me>%Dd@I=(Wx5U=sY|0=0KGfvO_$TT!pA z_f-rAIy80s{$M%n5unbRim=KqP^GT?Y_qy^+4{$7&4HH}%#Y=J&Lw|SFaPDKzPx_) z*RZ;<^mO_0+`!Dw!O>~X^_I#HM>Tz6c=D(Fx8H`x#=~xG{haV_U!_%Nfw~+kZs91t zO9Q{-l)o}nmHTe{jBfVx!U;w?IX0>Eu{PTtQPgN|iWKl(_12u2IB~X{t0jdg>$?%( z@`_O5GAKT2=KAcW+U_oSluBS@#sPP20DgoF7{anc1D7 zlO{JqXm2*T`*UmP=wz7WZnR2CU$It!`pS53#!vIovIDYrt6nW_mF2e4^i8inr5kUC zblW3G7A0UL#W#kDxwQ5mSYD7`D9;}%&%jeA4dVz6Dz53GSSlu1eqI`gQGj7JOCN4& zVf{$5i_Kj+D2FmiG{m5rcpK4WD6-hk(2y)}s9Nz2!d)=kt9qz9blZ|@J0{p$IB@5V z7Qcj{iE&_7_o&gZUTFMi?J1e5ePI>#2}EDG-0vC zeqJYzj%*ZXgJnNBHkC z3k8VksAIT{2!}k;eFDanY*G-9NP8aI%8ofVm$h_Gl+4~GK}dkMiF>jOW(D9zG!mX( zh_Lygmk85e?o__qOOYwx{3SwF$s1ReFew{cRvfq`&@GL1llevWJ`S!G+98j3%O)cH zWG+-5e4(iAU`3C_L=it`3?}d_;ErnX2k+WqsrGVc=O?Em*cJA7fv?s@JP{u~HeJ^uRKJJsnAsWVlw&BhUq z$4&@4p9-#tIduB*LBBC7Z;r?Ml|w*@MYepyyTHuH$u|9UUrcti-L!kG=`(+G z+AE&Ezbi&zIW4QZDrby({lkY_NB`NH?c}Vz|I-^Mhp`J;nI(t&zZ71u_>ip==$_tU z(E`HHCU_@sw?C6VO%I5&d^^pgpQ9(<-8Ud!=sj-Z_h^@Y$iovs<{uM=eq=k1e7(Q9 z2I#fUi$ot@LpS2$)Kg|)9IIKGy-8b-jN%%X`w)-s*D~v(W92+|IB^ z;6`&tI`PM@p)`MaX&JnseN(2tazdGkCT2bT*_B_=m=oxi8Fdptu(N^;GozA*K$BzR zuq`sqr4LGTetIm(xuC9Dy2L;vMC!$ndZ2=*A$14r+w#UMZ6gKKK(%HWuYMNqwbM-h1v0GWUf3;YCI>n(SD8r2i%@Kr7LJ|IXPqY0kax z6fX!{3OW*muXOEMI$?M+)zjLbIw7Th;>*QcJ1De;AEWA`Lux0VetK%r8~&bOV<6a7 z^ZgvtY3A0%>9ftI850>__!FPFa}|jhsVCc*>`;s;$(R2%^COj!B2ZEzYG>p>TkBnc z6%Vw?->YVsvnA=XZ^Llep>X4joC7{fr;;^)ejtldTnl_JEqz{#UyVjxdQUle)=och)BQ{>A=PJV~J|1nxsBHw|Jt!H%P;y+&%-O;{L)^_0Co!68- z1;^&Rj^%k-3J@LmOERWgvEY5<(s^Eba~&$W!G0V&9bE$!4@&+hA%cBycYk@(=31AE8xZbqe{%6!{{_meBe}x%OSGnYtsPaBl zNzAAnDO6L7EwZs(i0fU;hz^%s<*LkHmAq7o@5y~`TUw=LdzR*ukvux(UB4yy^pGwZ>zVaIF?>c!E%eUUI)4kT?axXeEuBf(2a*^@= znbOAA1BTM7o;>NI$E>hT_jb^_Uq4<~lE^yeKK|VBu3)Cm7j@I$b*pusA6h=B=Te*B6CK`h zH(EUK#c%-sM{Q4E)1b0rDF-Z+YgZoay*qtfzwATC)U$4wbI%-{o#2or7g7QDH#Y^B z(L*p_p*aD<2~(%wIYJ4wMpThw0kfL9kb**6mNaWg+Wn2%xT|%eTR1Y)P0t%QzrFrA z-q9EMe7dv-H<0}mq(*|2qiLcIdatP*%Hsgzs{$%>Lk~+ZI0x^^VniuG#c)E`38qk8 zDe;pe)fJ~}&t4$(5P5`gd6aCnDtyU_$HIo@hNl21k5xPQ zgP9LHxnNo&G97N58>V9y<(a6>$(Zy+;LLk{8jy42Oqej|Zo@~j31ZO}FiSGPxr2O) z3X`G0(oMc@4d&;9CMH>ic2^A*<0r#}7Q0@xK5CW&>r7D|N5ZxR`>XITR zRH_Z0j!-#RAL1w@S9D2gc)$%%COJ7a&Qu?33v=p8PkIs{zNS)SU|-3nA6qB?>D$#Q zkpriu>&sd~spm@#Mne?s-pndp%yw#0bM&*x?vp*-_0X1YuZc#CoqThC^m&8YNK?6< zRd=`8%o?oOl34|o5*kmGe7a@kWX>_#Df@5Zu@2TnTSkJOc{&(mm2{1150yM_w{d#B zZe@CY=MSE!56_MS8{0CgG~Ub}=;6*g_4(#*l{b4<=V!u>x@>+@+Sk^5CF{Oz-jP~) zi#;Y~azP)@eGa|+ts+KiN5Q3`rNpwnjzRgJl&vZ?t=+)^$0z;*o{kTfnoku3FO^j_ zEbn;BlX16P=BwO_uTD+h`HjOR3%+Jo=n-}YXlJ)rxSQLydd{vNRTqmototWeC*60C zon_E_4_YWQoQR^=4Yscdh|oAkRjm}1baCToWNJYv>nW(bj8H(K`0-skYCq zqaXS{Wu~Sj#>gt3+gc^L^jKefDBse=Fd$F+%!%*|p5?n$&b`twCd$`+3_H_j%PFW| zCi|G-*VC<%15dml$7Tuj6_k|?%*IpNZpWfWdP++o29G2N*V$f*8a1N!SMS~PAB#-+ zE|zKQ8mT9;-4vAx;^;%K-}SDZicz~abf{y)fj6a(854Q8JlJjKb1>I^bS&{|U)X^? z0r@-TTJ)$kQIAba_BkDWKCLic)3xUSA0f#_{>g$;n^x7UYh6!#cPWN>Z_+8JE>BjR zh;+ET&TqGt7?>HaoZ!_QeV=MxsJ{Bm^@381<@t&H1m=qo^?Y%8+i9#$XBda)bZ8caVAH_ zV3@}9^&ahvDJF`sf)0?wk)l19HySTc(^itUh=9TJ(ntO_@bPZ`KOzCf_|h zv;6S=uct0rFZ=|`j^~`XM7K}gs=w`E>+X4}iq-O`)(=O9EfXvHR`{=#VUc${z3a-u#=PnRtuy$8EJ+QU!n+E8SYz3g z59K}IGL9uC_f?W#uV%KYJLo|I_ijVUiGiGD>Ym zzgR+{_f}<3!pZj7T9b|gh2^Jbt2BF()t~r@wQAaxx$N^iJLUbTeK73&OT8@?`C5eH z+Pchl=UZ#{f4VBY_jNVJ=INQL_offboi(ES?)Rz&Wmxptel0MT^*{C^Ry^v!55N6G zQqSJ((QvpBR=Md^gxqrqx_4+-@yHZU z^-5}5{y`q$8STw}TXKf;y#J9eGMhA;92))Mpt3%9$=cc~?L>v#X`8p7<<3r|TnngT zoiAQD4cp&$K(4RRCgS3?{j1?;M<2f~(E03gdhw!?@`Y4Bb9$RuhOn!wvHX|(Pg@Jg zUQHFbeqQE(it+A#C4a7^qSK+RZ}RBzCL@9JXKU_yWM;lmv=q<$`P9=zeKB#5NXM(` z%wqV02Ubu5e3(e(gg2Ex~FSq7Xve@NW7fRl`3If+Y~W zE&*u@Chg!19k6istR(A*oq`K-#+{Ph*brS_1`GSH6W<+*uyD-@G$9m;%xEhfq2r#m zKZ2XQ26y3U4P+9xEo3{8c1|e$NYfwA$P*vy5526qTflM059zZu1?qiJ@uD0-Y*# zxTTNn3`Q8u2ldin%1J_WFi-dDQ?y=2f{8D))?zu+u1BDaNisM&3QQF}MWa$LJqKSF zPgm<1m-6M|t$l}SqSk)avpR9n+}#mQ$Pqnn5X!RlsRXHQoqpe~M5KmCS&P7i_bK|U zfRP-6P!G$9w%CMHYp?dx>S}g9hZ!rln^-CW_oybY{m85yDTr5;Vb9e%j~&FY^bD6o zfY`EhA)d&;c}QX+!!I`Bt4+>W?bAY(UclWvfqTPek@TXG@jV^7xdt<>v^}tLq3Wn+MA!u^!W9$z$SZB2f@bwp}ED~ z2Nefv<)6?qosXGoTnvu2>(^46Yt@=e4qw?fS=KeDUF+pwS|=K7Hf+b*7gHqfU>%ZW zAo9Mb{*UMIm{i8~l8#GH-c7JRhhBeQqM!9?dHwYXe_ppI&%#%Xwg=BIZZEiMmy&Te zkJ1ynmg@UfF>vEYSmAi-)T4*)1sZn5T1^9^U*4A`GR}rOTh=E&_f*(_y!dy}dXdPT ztg{j?toJZYyAt7pY2^f_I}6p?%Q22f4(t~ZNB~UZdB2M z7BS}W)BB5>d3vpD9egy0%*`zno=@hsR;9%7EmytT{82k$(xS3;sK9k!kJ#!B`!`zW z-(`OGIHzz@kuqMy7uJ)NWv&^PHGSem8WHX-9UFA2wYX|?>1y~D^2h;++{Yy;_d~`_ z*Az+=ZG1)U?Q0OljNa}ID4z3{iY=M*4mok>^e4}2&qpZxuXn$2FK-{vP@rG7xsutx zZ}Rqs6&IgN?cCDK7`vskJNa5ach(IYf3|% zby^!7`it6&p#b{})fGm~3LSTZx9zXrVq{WWm}|c8!;P>O%d&_`;j8_I#r?+QIvU=& z)rA~^ek)yYL!Bp;1Lz@OqY_^OqS8dENjLqI;=fc~|JK| zTYmZru1%SQ*)bn`9OVnuJ|$~!WVwwh>PEvF+M|VOf42UJvKr>}R1z^xAIgiE zEfH3%J@q9;XWxS_Hf7q>R)r_I8BM0Y@dY!uVZo~d;$h)Q!>R&vTE;~4jk_Y4_@bmY z)ygqj^|&+}ihqYJCffvNnmBd;NOTq5dVI$H;n~vKmu}N1cWo|g2?+WwUYSo+D*E79 z(qGy4qc`Jwrq5wR9<{X58S~-Gu3;6!zB^ohDa07Z6}(UAd~B+5cY4Kwx4EqSb9C3^ z$JwS2<+PQvJnnM^^j__5tiOJzO1ZmHbjOP`D+6AR6GQ%4%HdD$7Act2iW#a~*xbF7 z>~S~OL^Hg<$+x}nQGdBY@vYu7XOCP-xF4U6=7s<)<`#I>R;&#lU?z3`9| zKVD{Y`7X=C;zP1Wy-)qAoMU^#gy(yES0CkzTF-Rst9mfoSRHRa%7_RkyW4jqBjirb zRG4mA>|5>fU3Y?Vj_rP`w){``Gs!&@Dt-?8%@0Sh>(}(`pFP&T zd^M&;|BU_x9I}gjx`oZIAvgP&Kk}-6$84}zt=@k@$h9G@UAjF>9%09%E{ea8*V(1* z`}XCHP|-j4K6Nlv2l2RNjYXFKuY_=0=d|Ly8i(nyH!p3*OkU64VfK`~^`iD1A8C4G zaj42B?Dhup_z#Do`rw`4zrAM8JX_Pu(Q;(uJof8<^fI&EV@B*(O{}oaH~ISmddzno*Qci3pKHx+GV6bcX>=H1ww@dO zwAJN)*YuNxN7-!($IEh0Jt<}loqu%pZDOnLrw3Ucqu(2Tsw}AZ+<9BoTJ-GeP2mex zW#Ugx+X$x4WVtF8u*%q$h_S5l~N5(r5t=Tp8s z^_)MqOV!KOPhGMhD`(nu;>_0r2bX1rR3%0d>09*0Z(i@!*r8ap?=|K1?9tPfV z<9mD3_8lJ)nFzAz^7($EHmJQx*w^Kk@1vNDM`z3Rm>&B-36u+`byaVP`U^H|l)Ti| z>T9hMV)DFwsxe6YvYegO)1%F2osb%uSZ4bvaQ&!);oi312Q5)2n7_r2SqGMm5$lRe z@XBrhuB`f(dM3jXJBBULus1n|=Z`uc84SuhdbF%VtJQMaHs7;rjJvmtFuU7yf9UI1 zZ)J6|)dKUiwrmxeW$iDYX|=7eXg1|3%+{t~%D6Hnm1=$Lj(J6qf@6ij<)&|=x$2MJ zIPs4d#n0f{j^-vt9e5*qz3XCxT@b4yEU}Hz! zb3r=KBb}u1G&jko=L6_uOI83a-V z3xL>}8!iN-DR2`J{)&Ud3~Hh8piF!Zq`i5Ngf^a+$Hw+&JhA+G)uQf0LoEHy$Vz+Z(SbfH`)?53TK zse@dOL|dS$rf)^G>dTNa9i7K8Ih5;Yoc&i9t93%a;(}@^Jf`H*Rw{I5A{^1XY%8&n zW+hdxpxI)DHU&`|@DxIba+{2hARV4gsJ5XrcOumTLsQ+pYlz7za6xr_wJ2X70Hw8f z7AH+7SQH-dZMr`T&xN7EgsM_W8g4c5A5=iO3lxqgJR0f;jgt7%1*Eydai17GVG4Ms z825lnyEKM&aD8a<5l~ZV65^_2Hk(kUd{7SCrc~4{_4#C_t1`N|4{ma;6229P%tpc! z;#8IKrLZ@5s|#y`o~!EQ43 z-PV&IVtb_HzqBRX3!QjqoqlG^?$W;?ZpA{pNX0KTGS9QWg`?i&rE083&BpmG3EJSz zi;~9AT_n%8gxlq79XU1kQ1{!NCu&(gPqdWhY0I(F9*2HbDL$}au%Mx5JmhIUr0~wB zqPS+$`|VY`mKv*8oHaIHs>}Wv?F>FW@O$!ibz9`&%XeEe+uhGH8k~$974!513hN%Z zhW5Do^o?P1epI!N*z#o`=~A@5EB>Tl=VF$_FOfUZZ}!Y6%>V9j_%IxthRD0``yQ=* z{Gp=-y|nD~t)B+%-b!P2n+rls@80|D(=KPS`@q}K#fj|3_<`TA!XG8{9)6;o`gYh; zILGPE*~*K>rPJlwM`P4KdW7A2gG&yU$nhNM6_=r}y4swp{0k(Df_=@BU(F@gm3(d= ztj;=ZTD#@*z9P}j#do5`&sP+m61`F-_4L$qNorBn*m4;wnpeA}Yu_`^YZ(P5+H+mS zd_}o!$9<1AXO_rm{@^x&8OQe$RHRLn|2D@Si*2Lt?4K%YY--YZPVIRU_!qqRrmT~q zVRLh~S^WC*IV~v@2QxdD9S3A*_O|8g&Q?w)@6A(AdZDu=rhs-VXLP~2N<4V*>rL^d zlzU(E-+dg-qC2JLF(yCEZj>ha_dTh-4)>E4=N?3Ce4a9v3J@o2-!zX^&6{#alm65k zOO%qQ>JDEvvpnWsWgWdrwXpww(qfN#!L6~HjK-7*tq_a1iZ=pF&`k^!s5*dtyh1F6zlHf!2OUa~7?U6$*wogX%w`NJ#{eJ$V6n!$K;$Y80tz2*Ed zOW$$F$Vq%k+U^k9Dn`=+;2e$o3)DnA?IWsND1;!XPP~_z2KPdBZ%xOHW5QOQYzd__ zOOG1rCudou5V?ujbtT+iFqPsfH`;e2C-%hAzhKMVWqPmnnOz0hN(tD^F@|GPX-}BA z{nea}KimEKZ(aZ9h1fY>S&y$b>khV~2uN2bbk!V~+ShujVVCQ*jx+mL=clPhcS+@z z*$KE5W-0Vs5oQ)C?1Q`D@834$xSClASPz#ZB`55C<3C?9)+kDFJz*Dr&g^DzDfMG( z;H#j!0UBi|OeQ{Yd()V9@sDt)VTIdSEa(<)N_@8UoO|JJag7=X1IJV@TE-} zGcb8;&YlvUfY>`1bXgaN7h`0?%9k$|>@{d02T3VD+;m{v!)g5c=Q~e#dup!lxndx! zs5%oP-LSvw(_Pz_`bAPZONM^5J<=tVTr`gF6(2sI_5D7UM!G2J&L+~2S- zrFq$Qy18UsbG+WP(0?Vh{#|MN*_9^-o3Hp5Qud$yO61JUYV5rmUbO6Kp+5Mn_%BEZ z8x7z2^w5Q;yfsQ+H2fW0^8RU{ESvuvRU;8y!U>fYB~2h6LMZCWfZDfiU> zTo9?-@cG*L@QbtF=K70fMc0;^7r*}+Z>?Qy$+`9I;TN0!mhHd8YHJ62Z83gla=qTa zN&VV?GU)N#^6sCf7C#THtqFuz1UFC7c~xc4#jHYN;OIi8|pGH{55I$jj@1I*bcUGDb%gkh63k7T` zI{y32PiLbm-cxTKtQsw|O(wiDUl^oX><;LHp~UIB4~?2FLuHw86WR2Ursf648}kCi zpK}HSALCWu#`;j_1XFS*{sOHpx07y`&4-*_?ptF)!yfr?fG zO}FL5nU%KG%^iZp)N|7gBesX8O&^LgSM*)=ZKrIWNUxNipZ&97QtBtGn3Ht5w?%-O zQ?EqgX(zo)cl$E2&a zSXF)&Zb?RYJ6hb|3Qdfi?JLtBfnAYir`)~r4Fd1YjI5g8i7dv6Oya%J-=q3Qt%Jf% zsmbxbpx;FzbU*kCe?Ad1u0!Dt<>F=VCb%hK+FGo~H4%DLN@G$i3z;T(M1rYP_|j(h z6Q>72Cw4zWW}EZ1rAgOxtUKk)8lW^b>=34ll1c-u0W+=83S4Z(= zfcrQKDF^_(02%WI_cak^W6WJFg@)9k=^j01`gG`u{5fO>B zFSm{shr96rZn7P!qv<-S)5D!nrnfRP81RsQeeggh_)1w3nZ&d`nt-Qac0G@4LKr@? zo24a5yQ7G1OYnylb`3gcZDNO4Y9;rF9QeaoWy{p7B?_E1Ru z%{pH-BG9BhHTmNGfH&`*7ZFa<1^Gem7mU`N|Hyr8U;p8y{P7p#|B!T+QEg=n7Y=1w zrnIF~+?fjQ#VJw)O0XgcP6`xgaCb-rE85}~C>lrz!5xBAT!TwVin|s9gfH`cf6q$p zTFE;1+;jGR_P*weqds$a8=G43m6f&DMo(U*NbNY3)*PKGC(BTN8WfYwL`nCHrG-Ia z^VhA#eES}t!@Kl?pc9BE1X(OkcH30}Q^WcmOfe!J>hz(xWa?$Pgyt5triyNU+5OI* z@pR9}k&}z;V%6o6mfE0l|CeZEgU(k;wfye{2J69QjaOf54fk8rLGHS-xA3lYnKX}T z?z4myzig(C&ohZJlGV<{@9_1BdX9sk$K@@gez+ihY{`t4Eh&Bv@w}^oNA3V64j__;dz=M3G)_R54geA`kH|s zaq-#g{#V-oIfgACs`g;adRN>nn11jh-ykCn$}UiL349KxQB0lD~a2c%Ro`MGw`#od=j_Jryf1$!aL#xjM$(Ka5YlxK&84WZy=Gt zRB?4ldBE1SbkDyZw-h3u#IMjHiXPObNY^i1D7GqE5cpnIn3y8`#-q1g*Lm%g zrJJ{S4Ybn|6}gU-`ucT}N1^ba*>&WCzLr~lBX1OQ^)l7w&2~`+S$Wo=iLfO6U)IXl z!h`CGEbf;IL#5Oxb*qPc`SXs*SMg3AN&Nl%F2M^LDSeK5F5_j-b#WglJ-SiV{8&Eh zv_HXG#K>O~kA1Bh_Y8tOdCIl<;3GQu ztRG*<*<{A6uqhjYoyB$N7Bd~@NBf;Lr(}P7K!$?F4ImJW`To6oSWTCIE&~ffC*)3V zuq%xDhO%@>47(m(V(8Qn(B(4z?gEu_G_a)jrEa`iV$8RF(+#&}{g9Ck>&iiX(+HM@ zCj|=5Me&`M6PdJ`mY*Yyf>rmPAXW48V8h;&YGfXHOA(gV6h}T;uj#G=X%N4SRUxKq z=3QR)^wzvKt4@D57?$VE_rqUr4MIEN+!-4sOZuy_3b)uqhn}8Wx{0-0LV<`y-J-+^ zdxI{Z@H6ufiKWNm=R9eBuJttVJ~3mk>8HYCOIIUy1+ink7oO4lZG2t++}3BCaFxXM zE2;F&`BUugb7zgum{fxOHDF|27eOYV514CieOE$dLeX7Z^uAYYp9esWapAH??|qH* zOV)r!Gu(!3hAH{>0`W1o=dJi}QYiR6aP zBGM{77^JCrF8cIRX6!)HctheE(D<(28067b3Q*%gJMbKEy&$xyJ?~@sJEs(y!9!P%R?8wOk8fnFkNEB78 zqIKT#arcHq&IO9UkFTDxaq7!hX&LpdUR+@SjaIvKE&R3TjcM2%7LXKYSaB4l#w~pq zE8w47<_Roq#>d^0HP zf5#(h?u3~bKAZHdQ*X}_WV!}CIy|lS&U6`$D8gJaQ461^hIV1uEFPZKzj}~l%i2Ta z>=nOV{F~@}pCT;NhSONJWCCt~0B!6>t7BeSy@x05(71@3Z$9eclsY=o<=6>CF8nD= zZO(1CJTu)JP7%#spHXHCG;rnpOo#b0IlGw5E8kI5@a?x-tg@J%7BB1f=p-S9c%N$f zZ{FIYL3f!6$`b)mCYxE0xtGIO*%f;?RmQ#cy%rqtRl;_I(a@lb8Ob8md(N5p(P|CV z$^CV;NEz_Zsp0qE2~2ME#DMb2x|r!~0XZ1T-#R~cdj1bn^ls+DY%<8Od2i!b~THm4;*5J;aQxk^f}zw#X={?yJSv>-9D33 zIpjbQj1Nqim@=`}L%w∈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