diff --git a/.github/olm-publish/action.yaml b/.github/olm-publish/action.yaml index 138023c96..c6d761590 100644 --- a/.github/olm-publish/action.yaml +++ b/.github/olm-publish/action.yaml @@ -1,5 +1,5 @@ name: 'Publish to OLM' -description: 'Publishes the operator to OLM' +description: 'Publishes the operator to OLM. Expects olm/index-template.yaml to exist in the working tree.' inputs: quay_login: description: "Quay login" @@ -15,6 +15,7 @@ runs: shell: bash run: | go version + - name: Setup Go environment uses: actions/setup-go@v5 if: steps.go-version.outcome == 'failure' @@ -32,34 +33,6 @@ runs: username: ${{ inputs.quay_login }} password: ${{ inputs.quay_token }} - - name: Create new integration branch - shell: bash - # Creating a branch here in order to avoid commiting to our local main - # branch further down in this action. In some make targets we use main's sha - # and by creating a branch here we can just assume local main is the same as - # remote main. - run: | - # Discard any uncommitted changes from previous steps (e.g., standard-version) - git reset --hard HEAD - git clean -fd - git checkout -b olm-publish-action-scratch - - - name: Fetch olm-catalog branch - shell: bash - run: git fetch origin olm-catalog - - - name: Git merge olm-catalog branch - shell: bash - run: | - git config user.name rhobs-release-bot - git config user.email release-bot@monitoring.rhobs.io - - # NOTE: uses strategy-option=ours as bundle created for a release using - # make initiate-release conflicts with the previous bundle created for - # development branch, so the version in main takes precedence over the - # one in olm-catalog branch - git merge -Xours origin/olm-catalog -m "ci: merge olm-catalog branch" - - name: Build Operator Image shell: bash run: make operator-image @@ -76,20 +49,12 @@ runs: shell: bash run: make bundle-push - - name: Build Catalog Image shell: bash - run: | - make catalog-image + # update-channels.sh modifies olm/index-template.yaml in place; + # the calling workflow is responsible for committing and opening a PR. + run: make catalog-image - # NOTE: add a commit only if the catalog can built sucessfully - git add bundle/ olm/ - git commit -m "ci(bot): update catalog image" - - - name: Publish catalog image + - name: Publish Catalog Image shell: bash - run: | - make catalog-push - - # update olm-catalog only if catalog could be successfully published - git push origin HEAD:olm-catalog + run: make catalog-push diff --git a/.github/workflows/olm-stable.yaml b/.github/workflows/olm-stable.yaml index 90e6f53c8..cde0540dc 100644 --- a/.github/workflows/olm-stable.yaml +++ b/.github/workflows/olm-stable.yaml @@ -1,4 +1,7 @@ --- +# Triggered when a GitHub pre-release is promoted to a full release. +# Publishes OLM stable images and opens a PR against the corresponding +# release-* branch with the updated catalog index. name: OLM Stable Channel on: @@ -6,16 +9,36 @@ on: types: - released +permissions: + contents: write + pull-requests: write + jobs: release: runs-on: ubuntu-latest environment: quay steps: + - name: Determine release branch + id: branch + run: | + TAG="${{ github.event.release.tag_name }}" + # v1.4.2 -> release-1.4 + BRANCH="release-$(echo "${TAG#v}" | cut -d. -f1,2)" + echo "name=$BRANCH" >> "$GITHUB_OUTPUT" + - uses: actions/checkout@v6 with: + ref: ${{ steps.branch.outputs.name }} fetch-depth: 0 + token: ${{ secrets.REPOSITORY_PUSH_TOKEN }} + + - name: Setup Go environment + uses: actions/setup-go@v6 + with: + go-version-file: 'go.mod' + check-latest: true - - name: publish + - name: Publish catalog uses: ./.github/olm-publish env: IMG_BASE: ${{ vars.IMG_BASE }} @@ -25,3 +48,27 @@ jobs: with: quay_login: ${{ secrets.QUAY_LOGIN }} quay_token: ${{ secrets.QUAY_TOKEN }} + + - name: Open catalog PR + env: + GH_TOKEN: ${{ secrets.REPOSITORY_PUSH_TOKEN }} + run: | + git config user.name rhobs-release-bot + git config user.email release-bot@monitoring.rhobs.io + + VERSION="$(cat VERSION)" + TARGET_BRANCH="${{ steps.branch.outputs.name }}" + PR_BRANCH="ci/olm-catalog-stable-${TARGET_BRANCH}" + git checkout -b "$PR_BRANCH" + git add bundle/ olm/index-template.yaml + git commit -m "ci(bot): update OLM stable catalog to ${VERSION}" + git push --force origin "$PR_BRANCH" + + existing=$(gh pr list --head "$PR_BRANCH" --base "$TARGET_BRANCH" --json number --jq '.[0].number') + if [ -z "$existing" ]; then + gh pr create \ + --base "$TARGET_BRANCH" \ + --head "$PR_BRANCH" \ + --title "ci: update OLM stable catalog (${VERSION})" \ + --body "Automated catalog update for the stable channel." + fi diff --git a/.github/workflows/release-branch.yaml b/.github/workflows/release-branch.yaml new file mode 100644 index 000000000..8748aec6e --- /dev/null +++ b/.github/workflows/release-branch.yaml @@ -0,0 +1,140 @@ +# Handles RC releases cut from release-* branches. +# Triggered by a chore(release): commit pushed to any release-* branch. +# Creates a GitHub pre-release, publishes OLM candidate images, and opens a PR +# against the release branch with the updated catalog index. +name: Release Branch +on: + push: + branches: ['release-*'] + +permissions: + contents: write + pull-requests: write + +jobs: + e2e-tests-olm: + if: "startsWith(github.event.head_commit.message, 'chore(release):')" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - name: e2e tests through OLM + uses: ./.github/e2e-tests-olm + + create-github-prerelease: + needs: + - e2e-tests-olm + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + fetch-depth: 0 + token: ${{ secrets.REPOSITORY_PUSH_TOKEN }} + persist-credentials: false + + # standard-version's release-as relies on controller-gen for code generation. + - name: Setup Go environment + uses: actions/setup-go@v6 + with: + go-version-file: 'go.mod' + check-latest: true + + - name: Generate release notes + run: | + git config user.name rhobs-release-bot + git config user.email release-bot@monitoring.rhobs.io + npx standard-version -i RELEASE_BODY.md \ + --release-as $(cat VERSION) \ + --skip.commit + + - name: Publish tag + id: publish_tag + run: | + git push --follow-tags + echo "tag_name=$(git describe HEAD --abbrev=0)" >> $GITHUB_OUTPUT + + - name: Create Github release + uses: ncipollo/release-action@v1 + with: + tag: ${{ steps.publish_tag.outputs.tag_name }} + bodyFile: RELEASE_BODY.md + # NOTE: We always generate pre-releases and mark them as releases manually + prerelease: true + + publish-olm-candidate: + needs: + - create-github-prerelease + runs-on: ubuntu-latest + environment: quay + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + fetch-depth: 0 + token: ${{ secrets.REPOSITORY_PUSH_TOKEN }} + + - name: Setup Go environment + uses: actions/setup-go@v6 + with: + go-version-file: 'go.mod' + check-latest: true + + - name: Set version + id: version + run: | + version="$(cat VERSION)-rc" + echo "version=$version" >> "$GITHUB_OUTPUT" + + - name: Publish catalog + uses: ./.github/olm-publish + env: + IMG_BASE: ${{ vars.IMG_BASE }} + VERSION: ${{ steps.version.outputs.version }} + CHANNELS: candidate,development + DEFAULT_CHANNEL: candidate + RELEASE_SHA: ${GITHUB_SHA} + with: + quay_login: ${{ secrets.QUAY_LOGIN }} + quay_token: ${{ secrets.QUAY_TOKEN }} + + - name: Open catalog PR + env: + GH_TOKEN: ${{ secrets.REPOSITORY_PUSH_TOKEN }} + run: | + git config user.name rhobs-release-bot + git config user.email release-bot@monitoring.rhobs.io + + TARGET_BRANCH="${{ github.ref_name }}" + PR_BRANCH="ci/olm-catalog-candidate-${TARGET_BRANCH}" + git checkout -b "$PR_BRANCH" + git add bundle/ olm/index-template.yaml + git commit -m "ci(bot): update OLM candidate catalog to ${{ steps.version.outputs.version }}" + git push --force origin "$PR_BRANCH" + + existing=$(gh pr list --head "$PR_BRANCH" --base "$TARGET_BRANCH" --json number --jq '.[0].number') + if [ -z "$existing" ]; then + gh pr create \ + --base "$TARGET_BRANCH" \ + --head "$PR_BRANCH" \ + --title "ci: update OLM candidate catalog (${{ steps.version.outputs.version }})" \ + --body "Automated catalog update for the candidate channel." + fi + + - name: Publish Package + uses: ./.github/package-operator-publish + env: + IMG_BASE: ${{ vars.IMG_BASE }} + VERSION: ${{ steps.version.outputs.version }} + with: + quay_login: ${{ secrets.QUAY_LOGIN }} + quay_token: ${{ secrets.QUAY_TOKEN }} + + - name: Publish test harness + uses: ./.github/osd-test-harness-publish + env: + IMG_BASE: ${{ vars.IMG_BASE }} + VERSION: ${{ steps.version.outputs.version }} + with: + quay_login: ${{ secrets.QUAY_LOGIN }} + quay_token: ${{ secrets.QUAY_TOKEN }} diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 0c8eb986e..ba7c477c3 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -1,4 +1,5 @@ -# Decide between Pre-Release and Development Release +# Publishes a development release on every push to main (except release commits). +# RC and stable releases are handled by release-branch.yaml and olm-stable.yaml. name: Release on: push: @@ -6,6 +7,7 @@ on: permissions: contents: write + pull-requests: write jobs: e2e-tests-olm: @@ -26,6 +28,7 @@ jobs: - uses: actions/checkout@v6 with: fetch-depth: 0 + token: ${{ secrets.REPOSITORY_PUSH_TOKEN }} # Bumping the version in the next step will also run code generation scripts # that depend on controller-gen. @@ -55,119 +58,28 @@ jobs: quay_login: ${{ secrets.QUAY_LOGIN }} quay_token: ${{ secrets.QUAY_TOKEN }} - - name: Push catalog index changes - uses: ad-m/github-push-action@master - with: - github_token: ${{ secrets.REPOSITORY_PUSH_TOKEN }} - branch: olm-catalog - - - name: Publish Package - uses: ./.github/package-operator-publish - env: - IMG_BASE: ${{ vars.IMG_BASE }} - VERSION: ${{ steps.version.outputs.version }} - with: - quay_login: ${{ secrets.QUAY_LOGIN }} - quay_token: ${{ secrets.QUAY_TOKEN }} - - - name: Publish test harness - uses: ./.github/osd-test-harness-publish + - name: Open catalog PR env: - IMG_BASE: ${{ vars.IMG_BASE }} - VERSION: ${{ steps.version.outputs.version }} - with: - quay_login: ${{ secrets.QUAY_LOGIN }} - quay_token: ${{ secrets.QUAY_TOKEN }} - - create-github-prerelease: - needs: - - e2e-tests-olm - runs-on: ubuntu-latest - if: "startsWith(github.event.head_commit.message, 'chore(release):')" - steps: - - name: Checkout - uses: actions/checkout@v6 - with: - fetch-depth: 0 - token: ${{ secrets.REPOSITORY_PUSH_TOKEN }} - persist-credentials: false - - # Bumping the version in the next step will also run code generation scripts - # that depend on controller-gen. - # Therefore, we first need to setup Go so that we can install the - # controller-gen binary. - - name: Setup Go environment - uses: actions/setup-go@v6 - with: - go-version-file: 'go.mod' - check-latest: true - - - name: Generate release notes + GH_TOKEN: ${{ secrets.REPOSITORY_PUSH_TOKEN }} run: | - # Create the release notes for the Github release git config user.name rhobs-release-bot git config user.email release-bot@monitoring.rhobs.io - npx standard-version -i RELEASE_BODY.md \ - --release-as $(cat VERSION) \ - --skip.commit - - - name: Publish tag - id: publish_tag - run: | - # NOTE tag is created by standard-version and points to the - # chore(release): commit - git push --follow-tags - echo "tag_name=$(git describe HEAD --abbrev=0)" >> $GITHUB_OUTPUT - - - name: Create Github release - uses: ncipollo/release-action@v1 - with: - tag: ${{ steps.publish_tag.outputs.tag_name }} - bodyFile: RELEASE_BODY.md - # NOTE: We always generate pre-releases and mark them as releases manually - prerelease: true - - publish-olm-candidate: - needs: - - create-github-prerelease - runs-on: ubuntu-latest - environment: quay - steps: - - name: Checkout - uses: actions/checkout@v6 - with: - fetch-depth: 0 - token: ${{ secrets.REPOSITORY_PUSH_TOKEN }} - - name: Setup Go environment - uses: actions/setup-go@v6 - with: - go-version-file: 'go.mod' - check-latest: true - - - name: Set version - id: version - run: | - version="$(cat VERSION)-rc" - echo "version=$version" >> "$GITHUB_OUTPUT" - - - name: publish catalog - uses: ./.github/olm-publish - env: - IMG_BASE: ${{ vars.IMG_BASE }} - VERSION: ${{ steps.version.outputs.version }} - CHANNELS: candidate,development - DEFAULT_CHANNEL: candidate - RELEASE_SHA: ${GITHUB_SHA} - with: - quay_login: ${{ secrets.QUAY_LOGIN }} - quay_token: ${{ secrets.QUAY_TOKEN }} - - - name: Push catalog index changes - uses: ad-m/github-push-action@master - with: - github_token: ${{ secrets.REPOSITORY_PUSH_TOKEN }} - branch: olm-catalog + PR_BRANCH="ci/olm-catalog-development" + git checkout -b "$PR_BRANCH" + git add bundle/ olm/index-template.yaml + git commit -m "ci(bot): update OLM development catalog to ${{ steps.version.outputs.version }}" + git push --force origin "$PR_BRANCH" + + # Create the PR if it does not exist yet; subsequent pushes update it via force-push. + existing=$(gh pr list --head "$PR_BRANCH" --base main --json number --jq '.[0].number') + if [ -z "$existing" ]; then + gh pr create \ + --base main \ + --head "$PR_BRANCH" \ + --title "ci: update OLM development catalog" \ + --body "Automated catalog update for the development channel. This PR is force-updated on every push to main." + fi - name: Publish Package uses: ./.github/package-operator-publish diff --git a/docs/design/release.md b/docs/design/release.md index ea6077e94..80f40bf8f 100644 --- a/docs/design/release.md +++ b/docs/design/release.md @@ -1,11 +1,21 @@ -# Release Worflow +# Release Workflow ## Important pointers -* `olm-catalog` branch is the "release" branch -* Due to the nature of File Based Catalogs, the catalog's [index](https://github.com/rhobs/observability-operator/blob/olm-catalog/olm/observability-operator-index/index.yaml) file - is stored under [`olm-catalog` branch](https://github.com/rhobs/observability-operator/tree/olm-catalog) -* `update-channels.sh` script is kept under the [olm directory](https://github.com/rhobs/observability-operator/blob/olm-catalog/olm/update-channels.sh) +* Releases are cut from `release-MAJOR.MINOR` branches (e.g. `release-1.4`). +* The `olm/index-template.yaml` file in each branch is the source of truth for + that branch's OLM catalog history. It lives directly in the repository (both + `main` and `release-*` branches) and is updated via automated PRs opened by CI. +* `olm/update-channels.sh` modifies the template in place during CI; the + calling workflow commits the result and opens a PR. + +## Channel mapping + +| Channel | Trigger | Source branch | PR target | +|---|---|---|---| +| `development` | push to `main` (non-release commit) | `main` | `main` | +| `candidate` | `chore(release):` push to `release-*` | `release-X.Y` | `release-X.Y` | +| `stable` | GitHub release promoted from pre-release | `release-X.Y` | `release-X.Y` | ## Release Workflow diff --git a/docs/developer.md b/docs/developer.md index f976ec41d..07c0c8860 100644 --- a/docs/developer.md +++ b/docs/developer.md @@ -206,90 +206,101 @@ Creating new releases is fully automated and requires minimal human interaction. The changelog, release notes and release version are generated by the CI based on the commits added since the latest release. -## How to create a new release +## Release branches -```sh -git checkout main -git pull -git checkout -b cut-new-release -make initiate-release -``` +Releases are cut from dedicated `release-MAJOR.MINOR` branches (e.g. `release-1.4`). +Each release branch holds its own `olm/index-template.yaml` which accumulates +the catalog history for that release line (RC and stable entries). +The `main` branch holds the development catalog history. -This will create a new commit with a message which the CI uses to initiate the -release process. The commit will contain changes to the `CHANGELOG.md` and -`VERSION` files based on the commits added since the previous release. +CI publishes three channels: -After reviewing the commit, push the local branch to your repository fork and -create a pull request against the `main` branch. +| Channel | Trigger | Source branch | +|---|---|---| +| `development` | any push to `main` | `main` | +| `candidate` | `chore(release):` commit on `release-*` | `release-X.Y` | +| `stable` | GitHub release promoted from pre-release | `release-X.Y` | -Once the pull request is approved and merged, monitor the [release -automation](./design/release.md) and ensure that: +For `candidate` and `stable`, CI opens a PR against the release branch with the +updated `olm/index-template.yaml`. Merging this PR records the catalog change. -* The correct tag has been created for the newly created release. +## How to create a new release -* A **pre-release** is created in Github Releases for the newly created tag. +### 1. Create a release branch (if it doesn't exist) -* A new OLM bundle has been generated and added to the candidate channel. +For a new minor version, branch off `main`: -The final **manual** step is to uncheck the `Set as a pre-release` checkbox in -the GitHub release page to mark this release as production-ready. This will -trigger GitHub actions that publish the operator and catalog images to the -stable channel. +```sh +git checkout main && git pull +git checkout -b release-1.5 +git push origin release-1.5 +``` -### How to force a release version +For a patch release the `release-MAJOR.MINOR` branch already exists. -A release version can be forced like this: +### 2. Commit the release on the release branch ```sh -RELEASE_VERSION=1.4.0 -make initiate-release-as RELEASE_VERSION=$RELEASE_VERSION +git checkout release-1.5 +git pull +git checkout -b cut-1.5.0 +make initiate-release ``` -## How to publish a new release to the Community Catalog +This creates a `chore(release): X.Y.Z` commit that updates `CHANGELOG.md` and +`VERSION`. Review it, then push and open a PR **against the release branch**: -After a new release has been published on the GitHub repository, it's time to update the operator version listed in the [OpenShift community catalog](https://github.com/redhat-openshift-ecosystem/community-operators-prod). +```sh +git push origin cut-1.5.0 +gh pr create --base release-1.5 +``` -The gist of the steps involved are as follows: -1. Find the commit in the `olm-catalog` branch corresponding to - the release. -1. Copy the bundle directory to the community operators repository fork. -1. Submit a pull request to the Community catalog. +### 3. Merge the PR and watch CI -In this example below, the release used is `0.0.25`. +Once the PR is merged into the release branch, CI automatically: -### Find the commit which updates the olm-catalog +1. Creates a git tag and a **GitHub pre-release** for the new version. +2. Builds and publishes OLM images for the `candidate` channel. +3. Opens a PR against the release branch with the updated `olm/index-template.yaml`. + Merge this PR to record the catalog change in the repository. -1. Go to [`stable workflow`](https://github.com/rhobs/observability-operator/actions/workflows/olm-stable.yaml) -2. Find the `release` job corresponding to `0.0.25` version - * e.g. https://github.com/rhobs/observability-operator/actions/runs/5795055095/job/15705870971 +### 4. Promote to stable -3. Expand the `Publish` step to find the commit -4. Navigate to the last line of the step and [find the commit](https://github.com/rhobs/observability-operator/actions/runs/5795055095/job/15705870971#step:4:901) - that was pushed to the `olm-catalog` branch +Once testing is complete, uncheck `Set as a pre-release` on the GitHub release +page to mark it as production-ready. This triggers CI to: +1. Build and publish OLM images for the `stable` channel. +2. Open a PR against the release branch with the updated catalog. Merge it. + +### How to force a release version + +```sh +RELEASE_VERSION=1.5.0 +make initiate-release-as RELEASE_VERSION=$RELEASE_VERSION ``` -Writing manifest to image destination -Storing signatures -To https://github.com/rhobs/observability-operator - e8d7666..4d3769f HEAD -> olm-catalog - ☝️ is the commit that got pushed -``` -### Copy the bundle directory from the `olm-catalog` branch to community-catalog +## How to publish a new release to the Community Catalog + +After a new stable release has been published, update the operator version in +the [OpenShift community catalog](https://github.com/redhat-openshift-ecosystem/community-operators-prod). Assumptions: -* You have already forked and cloned `https://github.com/redhat-openshift-ecosystem/community-operators-prod` to your machine. +* You have already forked and cloned `https://github.com/redhat-openshift-ecosystem/community-operators-prod`. * The `origin` remote refers to the upstream repository and the `fork` remote to the forked repository. -1. Copy the bundle directory from the checkout to your - community-catalog fork: +1. Check out the release branch locally (the stable catalog PR should already + be merged, so the `bundle/` directory reflects the release): ```sh -VERSION=0.0.25 -# From the observability-operator local directory. -git checkout -b publish-$VERSION 4d3769f +VERSION=1.5.0 +git checkout release-1.5 +git pull +``` + +2. Copy the `bundle/` directory to your community-catalog fork: +```sh cd ../../redhat-openshift-ecosystem/community-operators-prod git checkout main git fetch && git reset --hard origin/main @@ -299,8 +310,7 @@ mkdir -p operators/observability-operator/$VERSION cp -r ../../rhobs/observability-operator/bundle operators/observability-operator/$VERSION ``` -2. validate the bundle, note this should have been already done in CI, however - it is good to validate before submission. +3. Validate the bundle (this should already have been done in CI): ```sh operator-sdk bundle validate operators/observability-operator/$VERSION \ @@ -309,20 +319,20 @@ operator-sdk bundle validate operators/observability-operator/$VERSION \ --select-optional suite=operatorframework ``` -3. Commit (signed) and push for review +4. Commit (signed) and push for review: -NOTE: The commit message follows a convention (see `git log`) and must be signed +NOTE: The commit message follows a convention (see `git log`) and must be signed. ```sh git add operators/observability-operator/$VERSION -git commit -sS -m "operator observability-operator ($VERSION)" +git commit -sS -m "operator observability-operator ($VERSION)" git push -u fork HEAD ``` -4. submit the pull request, e.g: https://github.com/redhat-openshift-ecosystem/community-operators-prod/pull/3084 +5. Submit the pull request, e.g: https://github.com/redhat-openshift-ecosystem/community-operators-prod/pull/3084 -5. There may be some changes that are required to fix the bundle. Make those - changes and ensure the fixes are ported back to Observability Operator repo. +6. There may be some changes required to fix the bundle. Make those changes and + ensure the fixes are ported back to the Observability Operator repo. E.g.: https://github.com/rhobs/observability-operator/pull/333 ## How to update the forked prometheus-operator diff --git a/olm/icon.svg b/olm/icon.svg new file mode 100644 index 000000000..fa510df0e --- /dev/null +++ b/olm/icon.svg @@ -0,0 +1,7 @@ + + + ObservatoriumFinal_Blue_IconOnly + + + + diff --git a/olm/index-template.yaml b/olm/index-template.yaml new file mode 100644 index 000000000..88a1f4ac0 --- /dev/null +++ b/olm/index-template.yaml @@ -0,0 +1,340 @@ +--- +entries: + - defaultChannel: development + description: | + Observability operator to manage Monitoring, Logging, Tracing for easier observability. + icon: + base64data: PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iODI3cHgiIGhlaWdodD0iNjg2cHgiIHZpZXdCb3g9IjAgMCA4MjcgNjg2IiBjb2xvcj0iIzJCMzg4RiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDx0aXRsZT5PYnNlcnZhdG9yaXVtRmluYWxfQmx1ZV9JY29uT25seTwvdGl0bGU+CiAgICA8ZyBpZD0iT2JzZXJ2YXRvcml1bUZpbmFsX0JsdWVfSWNvbk9ubHkiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik03MTYuMTcsNTczLjg3IEw3MTYuMTcsNDk0LjQ5IEw3MTYuMDksMzg0LjU4IEM3MTYuMTM4NjYsMzY4Ljc4MDIzOSA3MTQuNjA3NzE1LDM1My4wMTUxODcgNzExLjUyLDMzNy41MiBMNzExLjUyLDMzNy40NiBDNzExLjUyLDMzNy4zIDcxMS40NSwzMzcuMTQgNzExLjQyLDMzNi45OCBDNzA5Ljg3MzMzMywzMjkuMjkzMzMzIDcwNy45NDY2NjcsMzIxLjY4IDcwNS42NCwzMTQuMTQgQzcwNS41OTc4OTEsMzE0LjAwNzMxIDcwNS41NDA4NTksMzEzLjg3OTgyOCA3MDUuNDcsMzEzLjc2IEM3MDIuNzM2MjQ4LDMwNC45ODE3IDY5OS41MDA5MjgsMjk2LjM2NzUzNSA2OTUuNzgsMjg3Ljk2IEw2OTIuODcsMjg3LjEgQzY3OS42OSwyOTUuNzcgNjYwLjE3LDMwOC40NiA2NTQuODcsMzExLjg3IEM2NTQuMTAzNDczLDMxMi4zOTI3MjcgNjUzLjc5NzA4OCwzMTMuMzczOTg4IDY1NC4xMywzMTQuMjQgQzY2Mi44Nzg4NjYsMzM2LjM4NDYzOCA2NjcuNDEwMDU3LDM1OS45Njk4OTIgNjY3LjQ5LDM4My43OCBDNjY3Ljk1LDQ4OC43OCA1ODIuNzMsNTc1LjIgNDc3LjcxLDU3Ni4xMiBDNDA2LjU1MzMyLDU3Ni43ODEyNjkgMzQwLjkwMTM1Nyw1MzcuOTIwMDUyIDMwNy4yNSw0NzUuMjIgQzMwNi44MTQ0NTUsNDc0LjM5MjE0OCAzMDUuODYzMjYyLDQ3My45NzY3NzkgMzA0Ljk2LDQ3NC4yMiBMMjM3LjczLDQ5My43MiBDMjM2Ljg3NzA2NCw0OTMuOTczNTg0IDIzNi4yOTQyNDYsNDk0Ljc2MDE4NSAyMzYuMjk5OTU4LDQ5NS42NSBDMjM2LjQ0LDUzNy4yOCAyMzYuNTgsNTczLjg0IDIzNi41OCw1NzMuODQgQzIzNi41OCw2NDEuOTEgMzMzLjMsNjc5LjQgNDM5Ljg2LDY4Ni4zMyBDNDQwLjQxNDI0NCw2ODYuMzY0OTExIDQ0MC45NTk2ODksNjg2LjE3NTQ3OSA0NDEuMzY1NjE1LDY4NS43OTYxMDggQzQ0MS43NzE1NDIsNjg1LjQxNjczOCA0NDIuMDAxMzYzLDY4NC44ODU2MDUgNDQyLDY4NC4zMyBMNDQyLDYyMS43IEM0NDEuOTk5MTY3LDYyMS4xNDk5NDYgNDQyLjIyNDkxMyw2MjAuNjIzODMxIDQ0Mi42MjQxMjcsNjIwLjI0NTQyOSBDNDQzLjAyMzM0MSw2MTkuODY3MDI3IDQ0My41NjA3NzgsNjE5LjY2OTc0NiA0NDQuMTEsNjE5LjcgQzQ2NS41ODkwNzIsNjIwLjkzMDAxMyA0ODcuMTIwOTI4LDYyMC45MzAwMTMgNTA4LjYsNjE5LjcgQzUwOS4xNDkyMjIsNjE5LjY2OTc0NiA1MDkuNjg2NjU5LDYxOS44NjcwMjcgNTEwLjA4NTg3Myw2MjAuMjQ1NDI5IEM1MTAuNDg1MDg3LDYyMC42MjM4MzEgNTEwLjcxMDgzMyw2MjEuMTQ5OTQ2IDUxMC43MSw2MjEuNyBMNTEwLjcxLDY4NC4zNiBDNTEwLjcwODYzNyw2ODQuOTE1NjA1IDUxMC45Mzg0NTgsNjg1LjQ0NjczOCA1MTEuMzQ0Mzg1LDY4NS44MjYxMDggQzUxMS43NTAzMTEsNjg2LjIwNTQ3OSA1MTIuMjk1NzU2LDY4Ni4zOTg4OTQgNTEyLjg1LDY4Ni4zNiBDNjE5LjQ1LDY3OS40MyA3MTYuMTcsNjQxLjk0IDcxNi4xNyw1NzMuODcgWiBNMzAyLjMzMDA0OSw2MjkuNDggQzMwMi4zMzQ4NjYsNjMwLjE3Njc0NCAzMDEuOTc2NzcsNjMwLjgyNTgwMiAzMDEuMzg0Nzc0LDYzMS4xOTMyNDggQzMwMC43OTI3NzksNjMxLjU2MDY5NCAzMDAuMDUyMjE5LDYzMS41OTM1NTkgMjk5LjQzLDYzMS4yOCBDMjc3LjgxLDYyMC40MSAyNTIuNjUsNjAwLjggMjUyLjY1LDU3OS40NSBMMjUyLjY1LDU1NC43MSBDMjUyLjY1NzUxOCw1NTMuODczMDk5IDI1My4xODUzNCw1NTMuMTI5MzgyIDI1My45NzI4NTgsNTUyLjg0NjA1NCBDMjU0Ljc2MDM3Niw1NTIuNTYyNzI2IDI1NS42NDEwMjksNTUyLjc5OTcxMSAyNTYuMTgsNTUzLjQ0IEMyNjcuMTMsNTY2LjggMjgxLjc2LDU3OC4xNyAzMDEuMTgsNTg3LjU0IEMzMDEuODc0NTY4LDU4Ny44NzA4MDUgMzAyLjMxNzgyMiw1ODguNTcwNjgxIDMwMi4zMiw1ODkuMzQgTDMwMi4zMzAwNDksNjI5LjQ4IFogTTM5NC4wNyw2NTkuMDYgQzM3NS41ODE2NDEsNjU2LjI0Nzg3MyAzNTcuMzEwOTg4LDY1Mi4xNTQ2ODUgMzM5LjM5LDY0Ni44MSBDMzM4LjU0ODU1Miw2NDYuNTUwMjIxIDMzNy45NzYwMzcsNjQ1Ljc3MDYyNyAzMzcuOTc5OTgsNjQ0Ljg5IEwzMzcuOTc5OTgsNjA0LjQ2IEMzMzcuOTgyMjIyLDYwMy44Mjk4OTMgMzM4LjI4MTI1OCw2MDMuMjM3Njc5IDMzOC43ODY5OTUsNjAyLjg2MTgyIEMzMzkuMjkyNzMxLDYwMi40ODU5NjEgMzM5Ljk0NjAyMyw2MDIuMzcwNDE1IDM0MC41NSw2MDIuNTUgQzM1OC4zMDA2MTksNjA3Ljc4NDkwNyAzNzYuMzg5ODYxLDYxMS43OTQzNDMgMzk0LjY5LDYxNC41NSBDMzk1LjY3NjA3Niw2MTQuNjk5NTM5IDM5Ni40MDEyNzQsNjE1LjU1MjcxMyAzOTYuMzkwMTMsNjE2LjU1IEwzOTYuMzkwMTMsNjU3LjExIEMzOTYuMzgyOTUzLDY1Ny42OTIxMDEgMzk2LjEyMjYzMiw2NTguMjQyMjQ0IDM5NS42NzY5OTUsNjU4LjYxNjgwOSBDMzk1LjIzMTM1OCw2NTguOTkxMzc1IDM5NC42NDQ2MzcsNjU5LjE1MzE4NiAzOTQuMDcsNjU5LjA2IEwzOTQuMDcsNjU5LjA2IFogTTY1MS42LDU4Ny41NCBDNjcxLjAzLDU3OC4xNyA2ODUuNjYsNTY2LjggNjk2LjYsNTUzLjQ0IEM2OTcuMTM4OTcxLDU1Mi43OTk3MTEgNjk4LjAxOTYyNCw1NTIuNTYyNzI2IDY5OC44MDcxNDIsNTUyLjg0NjA1NCBDNjk5LjU5NDY2LDU1My4xMjkzODIgNzAwLjEyMjQ4Miw1NTMuODczMDk5IDcwMC4xMyw1NTQuNzEgTDcwMC4xMyw1NzkuNDUgQzcwMC4xMyw2MDAuOCA2NzQuOTcsNjIwLjQ1IDY1My4zNSw2MzEuMjggQzY1Mi43Mjc3ODEsNjMxLjU5MzU1OSA2NTEuOTg3MjIxLDYzMS41NjA2OTQgNjUxLjM5NTIyNiw2MzEuMTkzMjQ4IEM2NTAuODAzMjMsNjMwLjgyNTgwMiA2NTAuNDQ1MTM0LDYzMC4xNzY3NDQgNjUwLjQ0OTk1MSw2MjkuNDggTDY1MC40NDk5NTEsNTg5LjM0IEM2NTAuNDU0MDEyLDU4OC41NjgzOTcgNjUwLjkwMTUzNiw1ODcuODY3OTI1IDY1MS42LDU4Ny41NCBMNjUxLjYsNTg3LjU0IFogTTU1OC4xLDYxNC41NCBDNTc2LjQwMDEzOSw2MTEuNzg0MzQzIDU5NC40ODkzODEsNjA3Ljc3NDkwNyA2MTIuMjQsNjAyLjU0IEM2MTIuODQzOTc3LDYwMi4zNjA0MTUgNjEzLjQ5NzI2OSw2MDIuNDc1OTYxIDYxNC4wMDMwMDUsNjAyLjg1MTgyIEM2MTQuNTA4NzQyLDYwMy4yMjc2NzkgNjE0LjgwNzc3OCw2MDMuODE5ODkzIDYxNC44MTAwMiw2MDQuNDUgTDYxNC44MTAwMiw2NDQuODggQzYxNC44MTM5NjMsNjQ1Ljc2MDYyNyA2MTQuMjQxNDQ4LDY0Ni41NDAyMjEgNjEzLjQsNjQ2LjggQzU5NS40NzkwMTIsNjUyLjE0NDY4NSA1NzcuMjA4MzU5LDY1Ni4yMzc4NzMgNTU4LjcyLDY1OS4wNSBDNTU4LjEzNjczNiw2NTkuMTQ0NTkxIDU1Ny41NDE0OTYsNjU4Ljk3NjQyNSA1NTcuMDkzOTU0LDY1OC41OTA2MTMgQzU1Ni42NDY0MTMsNjU4LjIwNDgwMSA1NTYuMzkyMzgsNjU3LjY0MDgzNSA1NTYuMzk5ODMzLDY1Ny4wNSBMNTU2LjM5OTgzMyw2MTYuNTEgQzU1Ni40MDM2MzUsNjE1LjUyNDA3NyA1NTcuMTI1MjI0LDYxNC42ODc4ODMgNTU4LjEsNjE0LjU0IFogTTQ3Ni40LDQ0Ny45IEM1MTEuMzcwNjcsNDQ3LjkgNTM5LjcyLDQxOS41NTA2NyA1MzkuNzIsMzg0LjU4IEM1MzkuNzIsMzQ5LjYwOTMzIDUxMS4zNzA2NywzMjEuMjYgNDc2LjQsMzIxLjI2IEM0NDEuNDI5MzMsMzIxLjI2IDQxMy4wOCwzNDkuNjA5MzMgNDEzLjA4LDM4NC41OCBDNDEzLjA4LDQxOS41NTA2NyA0NDEuNDI5MzMsNDQ3LjkgNDc2LjQsNDQ3LjkgTDQ3Ni40LDQ0Ny45IFogTTQ3NS44NSwzMjcuNjMgQzQ4Ny40OSwzMjcuNjMgNDk2LjkzLDMzNC41MyA0OTYuOTMsMzQzLjAzIEM0OTYuOTMsMzUxLjUzIDQ4Ny40OSwzNTguNDMgNDc1Ljg1LDM1OC40MyBDNDY0LjIxLDM1OC40MyA0NTQuNzgsMzUxLjU0IDQ1NC43OCwzNDMuMDMgQzQ1NC43OCwzMzQuNTIgNDY0LjIxLDMyNy42MyA0NzUuODUsMzI3LjYzIFogTTU0LjQzLDQ3NS42MyBDNTcuNjg0NDYzNSw0ODIuNzA3NDQ5IDYxLjYxMjU3NDgsNDg5LjQ1NTIyOCA2Ni4xNiw0OTUuNzggQzc3LjMwMjE4NDMsNTEwLjgxMDE0MSA5Ni40OTYzMTU5LDUxNy41MDY4NzUgMTE0LjU3LDUxMi42NyBDMTE3LjM4LDUxMi4wMyAyNDkuMzcsNDczLjczIDI5Ny42Myw0NTkuNzMgQzI5OC4xNzI3NTYsNDU5LjU2ODk2MiAyOTguNjIxODMzLDQ1OS4xODU0NCAyOTguODY1ODI4LDQ1OC42NzQ1NzUgQzI5OS4xMDk4MjQsNDU4LjE2MzcxIDI5OS4xMjU4NzUsNDU3LjU3MzM2OSAyOTguOTEsNDU3LjA1IEMyODAuMzcyNTE1LDQxMS40NjM2MjMgMjgwLjA0Njc2MywzNjAuNDk5NjE4IDI5OCwzMTQuNjggQzI5OC4yMTUyNTYsMzE0LjE1MzkzNCAyOTguMTk2NTA1LDMxMy41NjExMjYgMjk3Ljk0ODQzMywzMTMuMDQ5NzE1IEMyOTcuNzAwMzYsMzEyLjUzODMwNSAyOTcuMjQ2NDAzLDMxMi4xNTY2MDUgMjk2LjcsMzEyIEMyNTAuNDcsMjk5Ljg5IDExOC4xOSwyNjUuMjQgMTE1LjMzLDI2NC42IEM5Ny41OTQwNzc5LDI1OS44NzMyMjQgNzguNzM3MzE1NywyNjYuMDI0Mjk3IDY3LjIsMjgwLjMgQzY2Ljc5NzQ0NDMsMjgwLjc5NTUzMSA2Ni43NTI2NjA4LDI4MS40OTE1NyA2Ny4wODgzOTQ4LDI4Mi4wMzQ2MDIgQzY3LjQyNDEyODgsMjgyLjU3NzYzNSA2OC4wNjY4MDAxLDI4Mi44NDg2NSA2OC42OSwyODIuNzEgQzc0Ljg1LDI4MS4yNyA4Ni42NCwyNzguNzEgOTIuOTgsMjc4LjcxIEMxMTcuMjMsMjc4LjcxIDEzNy44MSwyOTIuOTUgMTUwLjk4LDMxOC43MSBDMTYwLjc1LDMzNy44NCAxNjYuMTIsMzYyLjcxIDE2Ni4xLDM4OC44OSBDMTY2LjA4LDQxNS4wNyAxNjAuNjgsNDM5Ljg5IDE1MC45LDQ1OC45OSBDMTQyLjQsNDc1LjYgMTMwLjgzLDQ4Ny40MSAxMTcuMiw0OTMuNzEgQzExMC4zMiw0OTYuODkgMTA1LjIsNDg2LjY2IDExMS45Miw0ODMuMTIgTDExMi41Niw0ODIuOCBDMTIzLjcsNDc3LjUxIDEzMy4yNiw0NjcuNiAxNDAuNDIsNDUzLjYyIEMxNDkuMzYsNDM2LjE1IDE1NC4zLDQxMy4xNiAxNTQuMzIsMzg4Ljg4IEMxNTQuMzQsMzY0LjYgMTQ5LjQzLDM0MS41NiAxNDAuNDksMzI0LjA3IEMxMjkuNDIsMzAyLjQxIDExMi41NywyOTAuNDggOTMuMDMsMjkwLjQ2IEw5My4wMywyOTAuNDYgQzgzLjY0LDI5MC40NiA2OS43OCwyOTMuMTcgNTUuNDYsMjk5Ljk4IEw1NS4yOCwzMDAuMzcgQzQ4LjQ1MTY0NDcsMzAzLjY2MjU2OCA0Mi4wMDA1ODE0LDMwNy42ODYxMDEgMzYuMDQsMzEyLjM3IEMxOS43NCwzMjUuMTggMC4zLDM0OC44NiAwLjI3LDM4OC45IEMwLjI3LDQyOC40NSAyMC45MSw0NTIuMzcgMzguMjcsNDY1LjQ3IEM0My4zNzQ3MTYsNDY5LjMxMTk5MSA0OC43OTM4NTczLDQ3Mi43MTczNTIgNTQuNDcsNDc1LjY1IEw1NC40Myw0NzUuNjMgWiBNMTcuNTYsMzUwLjg0IEMxNy41NiwzNTAuODQgMjAuNDIsMzQwLjg0IDI3LjY5LDM0MC44NCBDMzUuMjMsMzQwLjg0IDQxLjM0LDM0NS4yOCA0MS4zNTAwMTIzLDM1MC43OSBDNDEuMzYsMzU2LjMgMzUuMjYsMzYwLjc5IDI3LjczLDM2MC43OSBDMjAuMiwzNjAuNzkgMTUuNzUsMzU3LjYzIDE3LjU2LDM1MC44NCBaIE0yNy4xNCw0MzguMDggQzI2LjcyMzI2NzQsNDM3LjQzNzQ2OSAyNi43MTAwNDExLDQzNi42MTMzODEgMjcuMTA1OTM5NSw0MzUuOTU3ODA4IEMyNy41MDE4MzgsNDM1LjMwMjIzNCAyOC4yMzczMzc0LDQzNC45MzAyOTkgMjksNDM1IEMzMC40ODA5NDI2LDQzNS4yNTE2ODggMzEuOTc4MjIwOCw0MzUuMzk1NCAzMy40OCw0MzUuNDMgQzU3LjEzLDQzNS40MyA3Ni4yNiw0MTMuMTQgNzYuMjIsMzg1LjczIEM3Ni4xOCwzNTguMzIgNTYuOTcsMzM2LjE0IDMzLjMyLDMzNi4xOCBMMzIuNjEsMzM2LjE4IEMzMS44NTI0NDI0LDMzNi4xNzUyOTUgMzEuMTYyNTY3MiwzMzUuNzQyOTY2IDMwLjgyODAxMjEsMzM1LjA2MzI2OCBDMzAuNDkzNDU3LDMzNC4zODM1NzEgMzAuNTcxNjU0MiwzMzMuNTczMTg3IDMxLjAzLDMzMi45NyBDMzQuNjU0MTYzLDMyOC43MDg4MTUgMzguNjk0MTQzNCwzMjQuODE5NTggNDMuMDksMzIxLjM2IEM1OS45MiwzMDguMTQgODAuMjYsMzAyLjI3IDkzLjAxLDMwMi4yNCBDMTI1LjU2LDMwMi4yNCAxNDIuNTYsMzQ1Ljg0IDE0Mi41MzAwNCwzODguODcgQzE0Mi41LDQzMS45IDEyNS40Niw0NzUuMzcgOTIuOTYsNDc1LjQzIEw5Mi44Nyw0NzUuNDMgQzg0LjIzLDQ3NS40MyA2My42Miw0NzAuMjEgNDUuMTQsNDU2LjI2IEMzOC4yODI4NDU3LDQ1MS4xMTMzMDEgMzIuMjE4MjE1MSw0NDQuOTg4MDI1IDI3LjE0LDQzOC4wOCBaIE02NDYuODcsMjk4IEM2ODcuMTIsMjcxLjMzIDgwNS4xMywxOTMuMTMgODA3LjQ3LDE5MS4zNiBDODIyLjg1MjM4NSwxODAuNzA5Njc3IDgzMC4xNTc3NzMsMTYxLjczNjI5MSA4MjUuODksMTQzLjUyIEM4MjQuMDA1NzcyLDEzNS45NTM1NDQgODIxLjM5NzA1OCwxMjguNTg2MTg2IDgxOC4xLDEyMS41MiBMODE4LjEsMTIxLjUyIEM4MTkuNTQwMzM1LDExNS4yOTUyMjcgODIwLjQ0Njk1NiwxMDguOTU4OTE1IDgyMC44MSwxMDIuNTggQzgyMiw4MC45MyA4MTcuMTYsNDkuNjkgNzg3LDI0LjE0IEM3NTYuNDEsLTEuNzMgNzI1Ljc3LC0yLjIxIDcwNS40NiwxLjk0IEM2OTguMDQzMjIxLDMuNDY1NzYwMzcgNjkwLjgxNDE0NSw1Ljc5Mjc0NTAxIDY4My45LDguODggTDY4My40OCw4Ljc4IEM2NjksMTUuMjkgNjU4LDI0LjEyIDY1MS45MywzMS4yOCBMNjUxLjkzLDMxLjI4IEM2MzkuMyw0Ni4yIDYzNy41MSw2Ni43OCA2NDYuODcsODkuMjIgQzY1NC40NCwxMDcuMzUgNjY4LjgyLDEyNS45OCA2ODcuMzcsMTQxLjY4IEM3MDUuOTIsMTU3LjM4IDcyNi42MywxNjguNDYgNzQ1Ljc1LDE3Mi45NCBDNzYxLjAzLDE3Ni41MSA3NzQuNzUsMTc1LjYzIDc4Ni4wMSwxNzAuNTUgQzc4Ni4yMiwxNzAuNDYgNzg2LjQ0LDE3MC4zNiA3ODYuNjgsMTcwLjI3IEM3OTMuNjgsMTY3LjQ1IDc5OC4yMSwxNzcuOTYgNzkxLjM0LDE4MS4xNCBDNzc3LjczLDE4Ny40NyA3NjEuMjMsMTg4LjY2IDc0My4wNiwxODQuNDEgQzcyMi4xNywxNzkuNTIgNjk5LjY5LDE2Ny41NCA2NzkuNzYsMTUwLjY3IEM2NTkuODMsMTMzLjggNjQ0LjI1LDExMy42IDYzNiw5My43OCBDNjI0Ljg1LDY3LjA1IDYyNy4zMSw0Mi4xNiA2NDMsMjMuNjQgQzY0Ny4xMSwxOC44MSA2NTYuNjgsMTEuNDcgNjYxLjc2LDcuNzEgQzY2Mi4yNzEwOCw3LjMyNzE0NzQ5IDY2Mi40ODM3NDEsNi42NjI2OTc5IDY2Mi4yODk5MzcsNi4wNTQyNDIzIEM2NjIuMDk2MTMzLDUuNDQ1Nzg2NyA2NjEuNTM4MzU2LDUuMDI2NzM2MDMgNjYwLjksNS4wMSBDNjQyLjU0ODIzNCw0LjU4MzAyMDY1IDYyNS42NjI3NjksMTQuOTkyNDU5MyA2MTcuOCwzMS41OCBDNjE2LjQyLDM0LjIzIDU1NS40MSwxNjEuNTIgNTM1LjcxLDIwMi41OCBDNTgzLjkxODMyLDIxOC40NDUwMDQgNjIzLjg4NDI0NCwyNTIuNzUxODQ1IDY0Ni44NywyOTggWiBNNzMyLjU4LDE0IEM3MzcuMjgsOC40NSA3NDYuNzUsMTIuNzMgNzQ2Ljc1LDEyLjczIEM3NTMuMSwxNS43MyA3NTIuNjUsMjEuMTggNzQ3Ljc1LDI2LjkyIEM3NDIuODUsMzIuNjYgNzM1LjUxLDM0LjQxIDczMS4zMiwzMC44NSBDNzI3LjEzLDI3LjI5IDcyNy43MiwxOS43OCA3MzIuNTgsMTQgWiBNNzkzLjEsMTUwLjggTDc5My4wNCwxNTAuODcgQzc3MiwxNzUuNjIgNzI3Ljc4LDE2MC40OCA2OTUsMTMyLjcxIEM2NjIuMjIsMTA0Ljk0IDYzOS45MSw2My43MSA2NjAuOTQsMzguOTEgQzY2OS4yLDI5LjIxIDY4Ni44MywxNy40OSA3MDcuOCwxMy4yIEM3MTMuMjc5NjQzLDEyLjA4MjEwMTIgNzE4Ljg1NzQ5MSwxMS41MTU5NDEzIDcyNC40NSwxMS41MSBDNzI1LjIwODQ5NCwxMS41NDYwMjA0IDcyNS44ODExNjYsMTIuMDA4NDc1MSA3MjYuMTg2NDE2LDEyLjcwMzc2ODQgQzcyNi40OTE2NjcsMTMuMzk5MDYxOCA3MjYuMzc2ODM4LDE0LjIwNzI0ODMgNzI1Ljg5LDE0Ljc5IEM3MjUuNzEsMTQuOTcgNzI1LjU1LDE1LjE1IDcyNS40MSwxNS4zMiBDNzEwLjA5LDMzLjMyIDcxNC42LDYyLjMyIDczNS40OCw4MC4wOSBDNzU2LjM2LDk3Ljg2IDc4NS43LDk3LjY0IDgwMS4wMiw3OS42MiBDODAxLjk2ODY0NSw3OC40NTU0MTAzIDgwMi44MjQ1OTcsNzcuMjE4MjkyMiA4MDMuNTgsNzUuOTIgQzgwNC4wMTUyODgsNzUuMjgxOTk4OSA4MDQuNzc5MDI3LDc0Ljk1MTY1MjYgODA1LjU0MjA0NCw3NS4wNzEzNDE1IEM4MDYuMzA1MDYyLDc1LjE5MTAzMDUgODA2LjkzMDk3LDc1LjczOTM2MDkgODA3LjE1LDc2LjQ4IEM4MDkuMTI0NzA5LDg0LjgzMzY5NDMgODA5Ljg2MjU3Myw5My40MzIwMDEyIDgwOS4zNCwxMDIgQzgwOCwxMjUuMTEgNzk4LjY4LDE0NC4yIDc5My4xLDE1MC44IFogTTEwMi4yMSwxMzQuNDggQzk1LjY0NDY2MTEsMTUwLjQ3MzY4IDEwMS43MTQ1NjYsMTY4Ljg2NTkxNyAxMTYuNTEsMTc3LjgxIEwyNTEuNTEsMjYwLjAyIEMyNTEuOTQwNTQyLDI2MC4yNzkzMjEgMjUyLjQ1NzcwNSwyNjAuMzUzMzY1IDI1Mi45NDM3MTQsMjYwLjIyNTI2OSBDMjUzLjQyOTcyNCwyNjAuMDk3MTc0IDI1My44NDMyMDcsMjU5Ljc3Nzg0NCAyNTQuMDksMjU5LjM0IEMyNjkuMTM3ODgzLDIzMi42NjM2ODUgMjg4Ljg0MjM2MywyMDguODk4NDE2IDMxMi4yNywxODkuMTcgQzMxMy4wNDEyODYsMTg4LjUzMjEyOCAzMTMuMTYxMjQ0LDE4Ny4zOTQ3NDEgMzEyLjU0LDE4Ni42MSBMMjE4LjQsNjUuODcgQzIxNS4wNDMwMTcsNjEuNjU2NjkxNCAyMDkuMjg5NjU4LDYwLjE5Njg4MzkgMjA0LjMzLDYyLjMgQzIwMy4xNTI2NjUsNjIuODA2MDk5OCAyMDEuODE3NTc4LDYyLjc5ODEzMTggMjAwLjY0NjM2Nyw2Mi4yNzgwMTU2IEMxOTkuNDc1MTU3LDYxLjc1Nzg5OTQgMTk4LjU3NDAwNCw2MC43NzI3ODg0IDE5OC4xNiw1OS41NiBDMTk3LjQyNzMxLDU3LjE3NDg5NTcgMTk4LjY2OTA3OCw1NC42MzAxNDU5IDIwMSw1My43NCBDMjA5LjczNjE0NCw1MC4xNDM3NzE1IDIxOS43OTc3ODksNTIuNzcxMzg2NyAyMjUuNjYsNjAuMTggTDMxOS43NiwxODAuODIgQzMyMC4wNTY4OCwxODEuMjA3OTkgMzIwLjQ5NjU3MywxODEuNDYxMTY0IDMyMC45ODExNjcsMTgxLjUyMzE0NyBDMzIxLjQ2NTc2MiwxODEuNTg1MTMgMzIxLjk1NTAyMiwxODEuNDUwNzc1IDMyMi4zNCwxODEuMTUgQzMyMy43MywxODAuMTUgMzI1LjEyLDE3OS4wNyAzMjYuNTMsMTc4LjA1IEMzMjYuOTM1Nzk4LDE3Ny43NTY1NDIgMzI3LjIwNTI5LDE3Ny4zMTExMDcgMzI3LjI3NjkwNCwxNzYuODE1NDY1IEMzMjcuMzQ4NTE4LDE3Ni4zMTk4MjMgMzI3LjIxNjEzNCwxNzUuODE2MzIyIDMyNi45MSwxNzUuNDIgTDIzNS43MSw1Ni40MiBDMjI2LjE2NDMzNiw0My45OTQ2NjgzIDIwOS42NzgxMDIsMzkuMTcwNTE0IDE5NC45NCw0NC40OSBDMTc0LjE4LDI3LjQ0IDE0MC43NCwyOS45OCAxMTcuMTEsNTEuNDkgQzEwNC44Miw2Mi42OCA5Ni45NSw3Ny4zMiA5NC45Niw5Mi42OSBDOTMuMTUsMTA2LjY5IDk2LjQsMTE5LjggMTA0LjEyLDEzMC4xMiBDMTAzLjQyLDEzMS42IDEwMi43OCwxMzMuMDggMTAyLjIxLDEzNC40OCBaIE0xMDQuMDUsOTMuODMgQzEwNS43Niw4MC42MSAxMTIuNTksNjcuOTggMTIzLjI3LDU4LjI1IEMxNDIuMDQsNDEuMTcgMTY3Ljc2LDM3Ljc5IDE4NS4xOCw0OC43NCBDMTY4Ljg2MDMwMiw1Ni43MzE3MjM1IDE1My43ODY1OSw2Ny4wNDkyMTYzIDE0MC40Myw3OS4zNyBDMTI3LjYxMzkzNCw5MS4xNjc4MTI2IDExNi45MDY3MDMsMTA1LjA2NzU5OCAxMDguNzcsMTIwLjQ3IEMxMDQuMzU2OTA1LDExMi4zMzQxOCAxMDIuNzAwNzU4LDEwMi45ODY3NzQgMTA0LjA1LDkzLjgzIEwxMDQuMDUsOTMuODMgWiBNNDE0LjcsNTI5LjQ5IEM0NTQuMDUzNzk4LDU0NS43Mjk2OTQgNDk4LjIzNjIwMiw1NDUuNzI5Njk0IDUzNy41OSw1MjkuNDkgQzU5NS42NDA5NzksNTA0LjQyMDk1MyA2MzMuMDQ2MDg3LDQ0Ny4wMzczMDcgNjMyLjU1MjY5MiwzODMuODA2NTQgQzYzMi4wNTkyOTcsMzIwLjU3NTc3NCA1OTMuNzYzMjU5LDI2My43ODI4MyA1MzUuMzI4MTQxLDIzOS42MjI3MzQgQzQ3Ni44OTMwMjMsMjE1LjQ2MjYzOCA0MDkuNjcyMDMzLDIyOC42MjkzOTMgMzY0LjY3LDI3My4wNSBDMzUwLjQyMTg3MSwyODcuMzg0NjE3IDMzOS4xMTkxMzcsMzA0LjM3MDk5MiAzMzEuNCwzMjMuMDUgQzMxNS4xNjAyODksMzYyLjQ3NjU0MSAzMTUuMTYwMjg5LDQwNi43MjM0NTkgMzMxLjQsNDQ2LjE1IEMzNDYuODcyNjI2LDQ4My45NjYwNTEgMzc2Ljg4NTgwNyw1MTMuOTgyODM1IDQxNC43LDUyOS40NiBMNDE0LjcsNTI5LjQ5IFogTTM1My4xNSwzODQuNjMgQzM1My4wMjY4NDYsMzY3LjU1ODI4NiAzNTYuMjc5MTY5LDM1MC42MzA1NzUgMzYyLjcyLDMzNC44MiBDMzY4LjY4Nzc0MywzMTkuOTQzMTYgMzc3LjQ3NTY5NiwzMDYuMzYwNTQ1IDM4OC42LDI5NC44MiBDNDExLjcwMzQxLDI3MS40Njk3NzkgNDQzLjE4Njg1OSwyNTguMzMwODEzIDQ3Ni4wMzUsMjU4LjMzMDgxMyBDNTA4Ljg4MzE0MSwyNTguMzMwODEzIDU0MC4zNjY1OSwyNzEuNDY5Nzc5IDU2My40NywyOTQuODIgQzU3NC41ODc1ODksMzA2LjM2NTg3MSA1ODMuMzc0NjQ2LDMxOS45NDcxMDMgNTg5LjM1LDMzNC44MiBDNTk1Ljc4NjAyMywzNTAuNjMyMDAxIDU5OS4wMzgxNiwzNjcuNTU4NzQzIDU5OC45MiwzODQuNjMgQzU5OS4xNDI2ODgsNDE3Ljk2MTYyNyA1ODYuNDM1ODM2LDQ1MC4wODE4MjYgNTYzLjQ3LDQ3NC4yNCBDNTUyLjQxNTAyNyw0ODUuNjc1NTA1IDUzOS4xNzY4MSw0OTQuNzc1MjkyIDUyNC41NCw1MDEgQzQ5My41MjM2NjIsNTE0LjA1MTEwNyA0NTguNTU2MzM4LDUxNC4wNTExMDcgNDI3LjU0LDUwMSBDNDEyLjkwMTI4NSw0OTQuNzgzMjgyIDM5OS42NjIxODcsNDg1LjY4NjI5IDM4OC42MSw0NzQuMjUgQzM2NS42NDQxNjQsNDUwLjA5MTgyNiAzNTIuOTM3MzEyLDQxNy45NzE2MjcgMzUzLjE2LDM4NC42NCBMMzUzLjE1LDM4NC42MyBaIE00NzYsMTQ0LjYyOTc0MyBDNDk3LjM0ODMyNCwxNDQuNTk4NzUyIDUxOC42MDU1NDksMTQ3LjQxMzU0MyA1MzkuMjEsMTUzIEM1MzkuNzg1NTI5LDE1My4xNTY4MjkgNTQwLjI2MTAxNCwxNTMuNTYyMzcxIDU0MC41MDY2ODYsMTU0LjEwNTk0NiBDNTQwLjc1MjM1OSwxNTQuNjQ5NTIxIDU0MC43NDI1NzMsMTU1LjI3NDM4NCA1NDAuNDgsMTU1LjgxIEw1MjAuMTQsMTk4LjIgTDUyMC4xNCwxOTguMiBDNDM0Ljc0OTQwMywxNzguMDgyODEzIDM0Ni41OTQ2NDYsMjE4LjQ3MjQ5MiAzMDYuMDcsMjk2LjI4IEMzMDUuNjM2MzgsMjk3LjA5ODk3MyAzMDQuNjk2OTYyLDI5Ny41MTI4MTMgMzAzLjgsMjk3LjI4IEwyNTkuODUsMjg1Ljc3IEMyNTkuMjcyNzIxLDI4NS42MjEzMDYgMjU4Ljc5MTg2MiwyODUuMjIyODUgMjU4LjUzODUwMSwyODQuNjgzMjQ5IEMyNTguMjg1MTM5LDI4NC4xNDM2NDggMjU4LjI4NTY4OSwyODMuNTE5MTU0IDI1OC41NCwyODIuOTggQzI5Ni44LDIwMS4yOCAzNzkuOCwxNDQuNjI5NzQzIDQ3NiwxNDQuNjI5NzQzIFogTTM0OS4xLDE2MSBDMzQ5LjMxNzQyLDE2MS40NjYxMjIgMzQ5LjcyMDAxMiwxNjEuODE5OTY2IDM1MC4yMTAxODYsMTYxLjk3NTc1NyBDMzUwLjcwMDM1OSwxNjIuMTMxNTQ5IDM1MS4yMzMzNjUsMTYyLjA3NTA2NiAzNTEuNjgsMTYxLjgyIEMzNzQuOTI5OTE1LDE0OC44MDAzNjUgNDAwLjA3OTI4NiwxMzkuNTEwNjU0IDQyNi4yMSwxMzQuMjkgTDQzNS4yMSwxMzIuNjYgQzQ2Mi4xODc5NzYsMTI4LjIwMzI1NyA0ODkuNzA4MzU3LDEyOC4xMjg5NjkgNTE2LjcxLDEzMi40NCBDNTE3LjIxODA2MywxMzIuNTIyNTYxIDUxNy43Mzc2MjQsMTMyLjM5MDg5MSA1MTguMTQ1MDQ1LDEzMi4wNzYzMjQgQzUxOC41NTI0NjcsMTMxLjc2MTc1NyA1MTguODExMzE3LDEzMS4yOTI0MiA1MTguODYsMTMwLjc4IEw1MjEuNDksMTAyLjI0IEM1MjIuODgwMjQxLDg3LjEzNDkwODIgNTE0LjUzNTYxNiw3Mi44MTA5MDU4IDUwMC43MSw2Ni41NyBDNDk2LjA5NTM1NCw2NC41MDQxNDE4IDQ5MS4zMjM2MjUsNjIuODA4NzkwNSA0ODYuNDQsNjEuNSBDNDgzLjE3NjA1Myw1Ny4wMTc0NDE3IDQ3OS40NTI0ODcsNTIuODg4MzM5MyA0NzUuMzMsNDkuMTggQzQ2My42NCwzOC43MyA0NDMuNDQsMjcuMzcgNDEzLjYxLDMyLjYyIEw0MTMuNDEsMzIuNjIgQzM4NC4xMiwzNy45MyAzNjkuMDksNTYuNDMgMzYxLjYzLDcxIEMzNTkuNTI2MzA0LDc1LjE0NzcyMTMgMzU3Ljc2MDU3OSw3OS40NTgzNjQyIDM1Ni4zNSw4My44OSBDMzUxLjQxNDM4Nyw4Ny4yODczMSAzNDYuODI1NTQ5LDkxLjE2MjcwMDYgMzQyLjY1LDk1LjQ2IEMzMzIuNzI5Mjc1LDEwNS45MDEzMDEgMzMwLjI2ODEwMSwxMjEuMzc2MDggMzM2LjQ2LDEzNC4zOCBMMzQ5LjEsMTYxIFogTTM2OS44Myw3NS4xOCBDMzc2LjMzLDYyLjQyIDM4OS40Niw0Ni4yOCA0MTUuMDcsNDEuNzEgTDQxNS4yNSw0MS43MSBDNDQxLjQ0LDM3LjEgNDU5LjA2LDQ2Ljk4IDQ2OS4yNSw1Ni4wOCBDNDcwLjE1LDU2Ljg5IDQ3MS4wMiw1Ny43MyA0NzEuODcsNTguNTggQzQ1Ny43MSw1Ni41OCA0MzkuODcsNTYuNTEgNDE4LjA1LDYwLjQxIEMzOTcuNDcsNjQuMDkgMzgxLjU5LDY5LjgyIDM2OS40LDc2LjExIEMzNjkuNTQsNzUuODEgMzY5LjY3LDc1LjUyIDM2OS44Myw3NS4yMiBMMzY5LjgzLDc1LjE4IFogTTM0NS4xNSwxMDkuNjIgQzM0OC43MSwxMDAuMjEgMzYzLjE1LDgzLjEyIDQxOS45Myw3Mi45OSBDNDc5LjYsNjIuMzMgNTAwLjI5LDc0LjUxIDUwNy4wMiw4MS41OCBDNTA3Ljg2ODIxNCw4Mi40NTAzNDg0IDUwOC4yMzkyMyw4My42NzkzNTcgNTA4LjAxNDMwMSw4NC44NzM2Njg0IEM1MDcuNzg5MzczLDg2LjA2Nzk3OTggNTA2Ljk5NjcwNSw4Ny4wNzc4Mjc5IDUwNS44OSw4Ny41OCBMNTA1LjI5LDg3Ljg1IEM1MDMuMzEwMjYxLDg4Ljc4MDg0NiA1MDAuOTcwNTM5LDg4LjQ4MDU4MTcgNDk5LjI5LDg3LjA4IEM0OTMuNzEsODIuMzMgNDc1LjkyLDczLjA4IDQyNi4wNyw4MS4zMSBMNDE3LDgyLjkyIEMzNjguMSw5Mi4zNSAzNTYuNjcsMTA2LjM4IDM1NCwxMTIuMzEgQzM1My4xODc2NSwxMTQuMDcxOTI5IDM1MS41MTY5OTcsMTE1LjI4NDE5NCAzNDkuNTksMTE1LjUxIEMzNDguMDk5NTYsMTE1LjY1NjgyIDM0Ni42Mzk3NTIsMTE1LjAxOTQwMSAzNDUuNzM0MzIzLDExMy44MjY0MzcgQzM0NC44Mjg4OTQsMTEyLjYzMzQ3MyAzNDQuNjA3NjYyLDExMS4wNTYwMDcgMzQ1LjE1LDEwOS42NiBMMzQ1LjE1LDEwOS42MiBaIiBpZD0iU2hhcGUiIGZpbGw9ImN1cnJlbnRDb2xvciIgZmlsbC1ydWxlPSJub256ZXJvIj48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPgo= + mediatype: image/svg+xml + name: observability-operator + schema: olm.package + - entries: + - name: observability-operator.v0.0.13 + - name: observability-operator.v0.0.14-rc + replaces: observability-operator.v0.0.13 + - name: observability-operator.v0.0.14 + replaces: observability-operator.v0.0.14-rc + - name: observability-operator.v0.0.15-rc + replaces: observability-operator.v0.0.14 + - name: observability-operator.v0.0.15 + replaces: observability-operator.v0.0.15-rc + - name: observability-operator.v0.0.16-rc + replaces: observability-operator.v0.0.15 + - name: observability-operator.v0.0.16 + replaces: observability-operator.v0.0.16-rc + - name: observability-operator.v0.0.17-rc + replaces: observability-operator.v0.0.16 + - name: observability-operator.v0.0.17 + replaces: observability-operator.v0.0.17-rc + - name: observability-operator.v0.0.19 + replaces: observability-operator.v0.0.17 + - name: observability-operator.v0.0.20 + replaces: observability-operator.v0.0.19 + - name: observability-operator.v0.0.21 + replaces: observability-operator.v0.0.20 + - name: observability-operator.v0.0.22 + replaces: observability-operator.v0.0.21 + - name: observability-operator.v0.0.23-rc + replaces: observability-operator.v0.0.22 + - name: observability-operator.v0.0.23 + replaces: observability-operator.v0.0.23-rc + - name: observability-operator.v0.0.24-rc + replaces: observability-operator.v0.0.23 + - name: observability-operator.v0.0.24 + replaces: observability-operator.v0.0.24-rc + - name: observability-operator.v0.0.25-rc + replaces: observability-operator.v0.0.24 + - name: observability-operator.v0.0.25 + replaces: observability-operator.v0.0.25-rc + - name: observability-operator.v0.0.26-rc + replaces: observability-operator.v0.0.25 + - name: observability-operator.v0.0.27-rc + replaces: observability-operator.v0.0.26-rc + - name: observability-operator.v0.0.27 + replaces: observability-operator.v0.0.27-rc + - name: observability-operator.v0.0.28-rc + replaces: observability-operator.v0.0.27 + - name: observability-operator.v0.0.28 + replaces: observability-operator.v0.0.28-rc + - name: observability-operator.v0.1.0-rc + replaces: observability-operator.v0.0.28 + - name: observability-operator.v0.1.0 + replaces: observability-operator.v0.1.0-rc + - name: observability-operator.v0.2.0-rc + replaces: observability-operator.v0.1.0 + - name: observability-operator.v0.2.0 + replaces: observability-operator.v0.2.0-rc + - name: observability-operator.v0.3.0-rc + replaces: observability-operator.v0.2.0 + - name: observability-operator.v0.3.0 + replaces: observability-operator.v0.3.0-rc + - name: observability-operator.v0.3.1-rc + replaces: observability-operator.v0.3.0 + - name: observability-operator.v0.3.1 + replaces: observability-operator.v0.3.1-rc + - name: observability-operator.v0.3.2-rc + replaces: observability-operator.v0.3.1 + - name: observability-operator.v0.3.3-rc + replaces: observability-operator.v0.3.2-rc + - name: observability-operator.v0.3.4-rc + replaces: observability-operator.v0.3.3-rc + - name: observability-operator.v0.3.5-rc + replaces: observability-operator.v0.3.4-rc + - name: observability-operator.v0.3.5 + replaces: observability-operator.v0.3.5-rc + - name: observability-operator.v0.4.0-rc + replaces: observability-operator.v0.3.5 + - name: observability-operator.v0.4.0 + replaces: observability-operator.v0.4.0-rc + - name: observability-operator.v0.4.1-rc + replaces: observability-operator.v0.4.0 + - name: observability-operator.v0.4.1 + replaces: observability-operator.v0.4.1-rc + - name: observability-operator.v0.4.2-rc + replaces: observability-operator.v0.4.1 + - name: observability-operator.v0.4.2 + replaces: observability-operator.v0.4.2-rc + - name: observability-operator.v1.3.0-rc + replaces: observability-operator.v0.4.2 + - name: observability-operator.v1.3.0 + replaces: observability-operator.v1.3.0-rc + name: candidate + package: observability-operator + schema: olm.channel + - entries: + - name: observability-operator.v0.0.13 + - name: observability-operator.v0.0.14-rc + replaces: observability-operator.v0.0.13 + - name: observability-operator.v0.0.14 + replaces: observability-operator.v0.0.14-rc + - name: observability-operator.v0.0.15-rc + replaces: observability-operator.v0.0.14 + - name: observability-operator.v0.0.15 + replaces: observability-operator.v0.0.15-rc + - name: observability-operator.v0.0.16-rc + replaces: observability-operator.v0.0.15 + - name: observability-operator.v0.0.16 + replaces: observability-operator.v0.0.16-rc + - name: observability-operator.v0.0.17-rc + replaces: observability-operator.v0.0.16 + - name: observability-operator.v0.0.17 + replaces: observability-operator.v0.0.17-rc + - name: observability-operator.v0.0.19 + replaces: observability-operator.v0.0.17 + - name: observability-operator.v0.0.20 + replaces: observability-operator.v0.0.19 + - name: observability-operator.v0.0.21 + replaces: observability-operator.v0.0.20 + - name: observability-operator.v0.0.22 + replaces: observability-operator.v0.0.21 + - name: observability-operator.v0.0.23-rc + replaces: observability-operator.v0.0.22 + - name: observability-operator.v0.0.23 + replaces: observability-operator.v0.0.23-rc + - name: observability-operator.v0.0.24-rc + replaces: observability-operator.v0.0.23 + - name: observability-operator.v0.0.24 + replaces: observability-operator.v0.0.24-rc + - name: observability-operator.v0.0.25-rc + replaces: observability-operator.v0.0.24 + - name: observability-operator.v0.0.25 + replaces: observability-operator.v0.0.25-rc + - name: observability-operator.v0.0.26-rc + replaces: observability-operator.v0.0.25 + - name: observability-operator.v0.0.27-rc + replaces: observability-operator.v0.0.26-rc + - name: observability-operator.v0.0.27 + replaces: observability-operator.v0.0.27-rc + - name: observability-operator.v0.0.28-rc + replaces: observability-operator.v0.0.27 + - name: observability-operator.v0.0.28 + replaces: observability-operator.v0.0.28-rc + - name: observability-operator.v0.1.0-rc + replaces: observability-operator.v0.0.28 + - name: observability-operator.v0.1.0 + replaces: observability-operator.v0.1.0-rc + - name: observability-operator.v0.2.0-rc + replaces: observability-operator.v0.1.0 + - name: observability-operator.v0.2.0 + replaces: observability-operator.v0.2.0-rc + - name: observability-operator.v0.3.0-rc + replaces: observability-operator.v0.2.0 + - name: observability-operator.v0.3.0 + replaces: observability-operator.v0.3.0-rc + - name: observability-operator.v0.3.1-rc + replaces: observability-operator.v0.3.0 + - name: observability-operator.v0.3.1 + replaces: observability-operator.v0.3.1-rc + - name: observability-operator.v0.3.2-rc + replaces: observability-operator.v0.3.1 + - name: observability-operator.v0.3.3-rc + replaces: observability-operator.v0.3.2-rc + - name: observability-operator.v0.3.4-rc + replaces: observability-operator.v0.3.3-rc + - name: observability-operator.v0.3.5-rc + replaces: observability-operator.v0.3.4-rc + - name: observability-operator.v0.3.5 + replaces: observability-operator.v0.3.5-rc + - name: observability-operator.v0.4.0-rc + replaces: observability-operator.v0.3.5 + - name: observability-operator.v0.4.0 + replaces: observability-operator.v0.4.0-rc + - name: observability-operator.v0.4.1-rc + replaces: observability-operator.v0.4.0 + - name: observability-operator.v0.4.1 + replaces: observability-operator.v0.4.1-rc + - name: observability-operator.v0.4.2-rc + replaces: observability-operator.v0.4.1 + - name: observability-operator.v0.4.2 + replaces: observability-operator.v0.4.2-rc + - name: observability-operator.v1.3.0-rc + replaces: observability-operator.v0.4.2 + - name: observability-operator.v1.3.0 + replaces: observability-operator.v1.3.0-rc + - name: observability-operator.v1.4.0-251127110135 + replaces: observability-operator.v1.3.0 + name: development + package: observability-operator + schema: olm.channel + - entries: + - name: observability-operator.v0.0.13 + - name: observability-operator.v0.0.14 + replaces: observability-operator.v0.0.13 + - name: observability-operator.v0.0.15 + replaces: observability-operator.v0.0.14 + - name: observability-operator.v0.0.16 + replaces: observability-operator.v0.0.15 + - name: observability-operator.v0.0.17 + replaces: observability-operator.v0.0.16 + - name: observability-operator.v0.0.19 + replaces: observability-operator.v0.0.17 + - name: observability-operator.v0.0.20 + replaces: observability-operator.v0.0.19 + - name: observability-operator.v0.0.21 + replaces: observability-operator.v0.0.20 + - name: observability-operator.v0.0.22 + replaces: observability-operator.v0.0.21 + - name: observability-operator.v0.0.23 + replaces: observability-operator.v0.0.22 + - name: observability-operator.v0.0.24 + replaces: observability-operator.v0.0.23 + - name: observability-operator.v0.0.25 + replaces: observability-operator.v0.0.24 + - name: observability-operator.v0.0.27 + replaces: observability-operator.v0.0.25 + - name: observability-operator.v0.0.28 + replaces: observability-operator.v0.0.27 + - name: observability-operator.v0.1.0 + replaces: observability-operator.v0.0.28 + - name: observability-operator.v0.2.0 + replaces: observability-operator.v0.1.0 + - name: observability-operator.v0.3.0 + replaces: observability-operator.v0.2.0 + - name: observability-operator.v0.3.1 + replaces: observability-operator.v0.3.0 + - name: observability-operator.v0.3.5 + replaces: observability-operator.v0.3.1 + - name: observability-operator.v0.4.0 + replaces: observability-operator.v0.3.5 + - name: observability-operator.v0.4.1 + replaces: observability-operator.v0.4.0 + - name: observability-operator.v0.4.2 + replaces: observability-operator.v0.4.1 + - name: observability-operator.v1.3.0 + replaces: observability-operator.v0.4.2 + name: stable + package: observability-operator + schema: olm.channel + - image: quay.io/rhobs/observability-operator-bundle:0.0.13 + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.0.14 + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.0.14-rc + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.0.15 + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.0.15-rc + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.0.16 + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.0.16-rc + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.0.17 + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.0.17-rc + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.0.19 + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.0.20 + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.0.21 + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.0.22 + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.0.23 + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.0.23-rc + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.0.24 + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.0.24-rc + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.0.25 + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.0.25-rc + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.0.26-rc + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.0.27 + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.0.27-rc + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.0.28 + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.0.28-rc + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.1.0-rc + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.1.0 + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.2.0-rc + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.2.0 + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.3.0-rc + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.3.0 + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.3.1-rc + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.3.1 + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.3.2-rc + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.3.3-rc + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.3.4-rc + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.3.5-rc + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.3.5 + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.4.0-rc + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.4.0 + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.4.1-rc + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.4.1 + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.4.2-rc + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:0.4.2 + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:1.3.0-rc + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:1.3.0 + schema: olm.bundle + - image: quay.io/rhobs/observability-operator-bundle:1.4.0-251127110135 + schema: olm.bundle +schema: olm.template.basic diff --git a/olm/observability-operator-index.Dockerfile b/olm/observability-operator-index.Dockerfile new file mode 100644 index 000000000..91785e765 --- /dev/null +++ b/olm/observability-operator-index.Dockerfile @@ -0,0 +1,14 @@ +# The base image is expected to contain +# /bin/opm (with a serve subcommand) and /bin/grpc_health_probe +FROM quay.io/operator-framework/opm:latest + +# Configure the entrypoint and command +ENTRYPOINT ["/bin/opm"] +CMD ["serve", "/configs"] + +# Copy declarative config root into image at /configs +ADD observability-operator-index /configs + +# Set DC-specific label for the location of the DC root directory +# in the image +LABEL operators.operatorframework.io.index.configs.v1=/configs diff --git a/olm/update-channels.sh b/olm/update-channels.sh new file mode 100755 index 000000000..4ea7a09a8 --- /dev/null +++ b/olm/update-channels.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash +set -e -u -o pipefail + + +#usage $0 channel1[,channel2,...] bundle + +to_upper() { + echo "$@" | tr '[:lower:]' '[:upper:]' +} + +err() { + echo "ERROR: $*" +} + +declare -r CATALOG_TEMPLATE="olm/index-template.yaml" + +update_channel() { + local channel="$1"; shift + local bundle="$1"; shift + local bundle_image="$1"; shift + + echo "updating channel: $channel" + + # dev releases are suffixed with `-$(date +%y%m%d%H%M%S)`, those are replaced. + # We track RC and actual releases fully. + if [ "$channel" == "development" ]; then + yq -i 'del(.entries[] | select(.image | test(".*-\d{12}$") and .schema == "olm.bundle"))' "$CATALOG_TEMPLATE" + CHANNEL=$channel yq -i 'del(.entries[] | select(.name == strenv(CHANNEL) and .schema == "olm.channel").entries[] | select(.name | test(".*-\d{12}$")))' "$CATALOG_TEMPLATE" + fi + + old=$(CHANNEL=$channel yq '.entries[] | select(.name == strenv(CHANNEL) and .schema == "olm.channel").entries[-1].name' "$CATALOG_TEMPLATE") + + prev_bundle_image=$(yq '.entries[-1].image' "$CATALOG_TEMPLATE") + if [ "$prev_bundle_image" != "$bundle_image" ]; then + #only add the latest bundle image if its a new entry. The update to another channel might have already added the bundle image we want + BUNDLE="$bundle_image" yq -i '.entries += {"image": strenv(BUNDLE),"schema": "olm.bundle"}' "$CATALOG_TEMPLATE" + fi + (OLD=$old OP=$bundle CHANNEL=$channel yq -i '(.entries[] | select(.name == strenv(CHANNEL) and .schema == "olm.channel").entries) += [{"name": strenv(OP), "replaces": strenv(OLD)}]' "$CATALOG_TEMPLATE") +} + +main() { + cd "$(git rev-parse --show-toplevel)" + local channels="$1"; shift + local bundle="$1"; shift + local bundle_image="$1"; shift + + echo "channels: $channels | bundle: $bundle | bundle_image: $bundle_image" + + # convert comma seperated list to an array + local -a channel_list + readarray -td, channel_list <<< "$channels,"; unset 'channel_list[-1]' + + for ch in "${channel_list[@]}"; do + update_channel "$ch" "$bundle" "$bundle_image" + done + + return $? +} + +main "$@"