Repository: fluxcd/flux
Pull request #3230 (2020-08-05 11:19:35)

Release 1.20.1
It's everything merged since 1.20.0.


Patch:
diff --git a/.github/workflows/rebase.yaml b/.github/workflows/rebase.yaml
new file mode 100644
index 00000000..74a9049a
--- /dev/null
+++ b/.github/workflows/rebase.yaml
@@ -0,0 +1,21 @@
+name: rebase
+
+on:
+  pull_request:
+    types: [opened]
+  issue_comment:
+    types: [created]
+
+jobs:
+  rebase:
+    if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '/rebase') && (github.event.comment.author_association == 'CONTRIBUTOR' || github.event.comment.author_association == 'MEMBER' || github.event.comment.author_association == 'OWNER')
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout the latest code
+        uses: actions/checkout@v2
+        with:
+          fetch-depth: 0
+      - name: Automatic Rebase
+        uses: cirrus-actions/rebase@1.3.1
+        env:
+          GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0acf45a4..82ddbe2c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,50 @@
+> Note on the future of Flux and Helm Operator: We are working on a
+> next generation Flux assembled from components as part of a bigger
+> [GitOps Toolkit](https://toolkit.fluxcd.io/) project. The roadmap
+> for the GitOps Toolkit can be found
+> [here](https://toolkit.fluxcd.io/roadmap/).
+>
+> We are eager to hear [feedback, suggestions, and/or feature
+> requests](https://github.com/fluxcd/toolkit/discussions) for Flux v2
+> and Toolkit components.
+
+## 1.20.1 (2020-08-05)
+
+This patch release has some fixes for faults in improvements in
+1.20.0.
+
+### Fixes
+
+- Do not return error when failed to load last-synced resources
+  [fluxcd/flux#3223][]
+- Dockerfile: Include /sbin dir in PATH [fluxcd/flux#3211][]
+- Put notice re gitops-engine at top of README [fluxcd/flux#3197][]
+- Avoid panic when directory does not exist [fluxcd/flux#3193][]
+- Put git messages into tmp files [fluxcd/flux#3179][]
+
+### Maintenance and documentation
+
+- Give advice on percent-encoding creds using in URL [fluxcd/flux#3204][]
+- Get shellcheck from new URL [fluxcd/flux#3224][]
+- Add Sngular as Flux user [fluxcd/flux#3212][]
+- Add rebase GitHub action [fluxcd/flux#3190][]
+
+### Thanks
+
+Thanks to @alex-shpak, @mmorejon, @ordovicia, @ricardo-larosa,
+@squaremo and @stefanprodan for their contributions to this release.
+
+[fluxcd/flux#3224]: https://github.com/fluxcd/flux/pull/3224
+[fluxcd/flux#3223]: https://github.com/fluxcd/flux/pull/3223
+[fluxcd/flux#3212]: https://github.com/fluxcd/flux/pull/3212
+[fluxcd/flux#3211]: https://github.com/fluxcd/flux/pull/3211
+[fluxcd/flux#3204]: https://github.com/fluxcd/flux/pull/3204
+[fluxcd/flux#3197]: https://github.com/fluxcd/flux/pull/3197
+[fluxcd/flux#3193]: https://github.com/fluxcd/flux/pull/3193
+[fluxcd/flux#3190]: https://github.com/fluxcd/flux/pull/3190
+[fluxcd/flux#3179]: https://github.com/fluxcd/flux/pull/3179
+[fluxcd/flux#3178]: https://github.com/fluxcd/flux/pull/3178
+
 ## 1.20.0 (2020-07-08)
 
 This minor version release updates dependencies, and includes some
diff --git a/Makefile b/Makefile
index bc096787..b328026d 100644
--- a/Makefile
+++ b/Makefile
@@ -119,6 +119,7 @@ cache/%/kubectl-$(KUBECTL_VERSION): docker/kubectl.version
 	tar -m --strip-components 3 -C ./cache/$* -xzf cache/$*/kubectl-$(KUBECTL_VERSION).tar.gz kubernetes/client/bin/kubectl
 	mv ./cache/$*/kubectl $@
 
+# FIXME OS and architecture in download URL
 cache/%/kustomize-$(KUSTOMIZE_VERSION): docker/kustomize.version
 	mkdir -p cache/$*
 	curl --fail -L -o cache/$*/kustomize-$(KUSTOMIZE_VERSION).tar.gz "https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv$(KUSTOMIZE_VERSION)/kustomize_v$(KUSTOMIZE_VERSION)_linux_amd64.tar.gz"
@@ -132,9 +133,10 @@ cache/%/helm-$(HELM_VERSION):
 	tar -m -C ./cache -xzf cache/$*/helm-$(HELM_VERSION).tar.gz $*/helm
 	mv cache/$*/helm $@
 
+# FIXME architecture in download URL
 cache/%/shellcheck-$(SHELLCHECK_VERSION):
 	mkdir -p cache/$*
-	curl --fail -L -o cache/$*/shellcheck-$(SHELLCHECK_VERSION).tar.xz "https://storage.googleapis.com/shellcheck/shellcheck-v$(SHELLCHECK_VERSION).$(CURRENT_OS).x86_64.tar.xz"
+	curl --fail -L -o cache/$*/shellcheck-$(SHELLCHECK_VERSION).tar.xz "https://github.com/koalaman/shellcheck/releases/download/v$(SHELLCHECK_VERSION)/shellcheck-v$(SHELLCHECK_VERSION).$(CURRENT_OS).x86_64.tar.xz"
 	tar -C cache/$* --strip-components 1 -xvJf cache/$*/shellcheck-$(SHELLCHECK_VERSION).tar.xz shellcheck-v$(SHELLCHECK_VERSION)/shellcheck
 	mv cache/$*/shellcheck $@
 
diff --git a/README.md b/README.md
index 6e93d5d3..7048b90f 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,16 @@
 # Flux
 
-> **Announcement** [Flux has joined CNCF as a sandbox project](https://www.weave.works/blog/flux-joins-the-cncf-sandbox)
+> **On Flux v2** In an announcement in August 2019, the expectation
+> was set that the Flux project would integrate the GitOps Engine,
+> then being factored out of ArgoCD. Since the result would be
+> backward-incompatible, it would require a major version bump: Flux
+> v2.
+>
+> After experimentation and considerable thought, we (the maintainers)
+> have found a path to Flux v2 that we think better serves our vision
+> of GitOps: the [GitOps Toolkit](https://toolkit.fluxcd.io/). In
+> consequence, we do not now plan to integrate GitOps Engine into
+> Flux.
 
 We believe in GitOps:
 
@@ -64,12 +74,12 @@ container images and config changes are propagated to the cluster.
 |[Okteto Cloud](https://okteto.com/)|[Omise](https://www.omise.co)|[Payout](https://payout.one)|
 |[Plex Systems](https://www.plex.com/)|[Qordoba](https://qordoba.com)|[Rakuten](https://rakuten.com)|
 |[RentPath](https://rentpath.com)|[Replicated](https://replicated.com)|[Resulta](https://resulta.com)|
-|[Rungway](https://rungway.com)|[Sage AI Labs](https://www.sage.com)|[Starbucks](https://www.starbucks.com/)|
-|[SupplyStack](https://www.supplystack.com/)|[Talend](https://www.talend.com)|[Troii](https://troii.com/)|
-|[UK Hydrographic Office](https://www.gov.uk/government/organisations/uk-hydrographic-office)|[Under Armour](https://www.underarmour.com)|[VSHN](https://vshn.ch)|
-|[Walmart Chile](https://www.walmartchile.cl)|[Weave Cloud](https://cloud.weave.works)|[Workable](https://www.workable.com)|
-|[Workarea](https://www.workarea.com)|[Working Group Two](https://wgtwo.com)|[Yad2](https://yad2.co.il)|
-|[Yusofleet](https://yusofleet.com)|[Zaaksysteem](https://zaaksysteem.nl)||
+|[Rungway](https://rungway.com)|[Sage AI Labs](https://www.sage.com)|[Sngular](https://www.sngular.com)|
+[Starbucks](https://www.starbucks.com/)|[SupplyStack](https://www.supplystack.com/)|[Talend](https://www.talend.com)|
+|[Troii](https://troii.com/)|[UK Hydrographic Office](https://www.gov.uk/government/organisations/uk-hydrographic-office)|[Under Armour](https://www.underarmour.com)|
+|[VSHN](https://vshn.ch)|[Walmart Chile](https://www.walmartchile.cl)|[Weave Cloud](https://cloud.weave.works)|
+|[Workable](https://www.workable.com)|[Workarea](https://www.workarea.com)|[Working Group Two](https://wgtwo.com)|
+|[Yad2](https://yad2.co.il)|[Yusofleet](https://yusofleet.com)|[Zaaksysteem](https://zaaksysteem.nl)|
 
 If you too are using Flux in production; please submit a PR to add your organization to the list!
 
diff --git a/chart/flux/CHANGELOG.md b/chart/flux/CHANGELOG.md
index c420de7d..b35b495f 100644
--- a/chart/flux/CHANGELOG.md
+++ b/chart/flux/CHANGELOG.md
@@ -1,3 +1,20 @@
+## 1.4.0 (2020-07-09)
+
+### Improvements
+
+ - Updated Flux to `1.20.0`
+   [fluxcd/flux#3177](https://github.com/fluxcd/flux/pull/3177)
+ - Add Grafana dashboard
+   [fluxcd/flux#3169](https://github.com/fluxcd/flux/pull/3169)
+ - Support git clone over ssh behind http proxy
+   [fluxcd/flux#3152](https://github.com/fluxcd/flux/pull/3152)
+ - Roll deployment on update known_hosts
+   [fluxcd/flux#3096](https://github.com/fluxcd/flux/pull/3096)
+ - Preserve namespace when running helm template
+   [fluxcd/flux#3076](https://github.com/fluxcd/flux/pull/3076)
+ - Support annotations in chart SSH secret 
+   [fluxcd/flux#3053](https://github.com/fluxcd/flux/pull/3053)
+
 ## 1.3.0 (2020-04-03)
 
 ### Improvements
diff --git a/chart/flux/Chart.yaml b/chart/flux/Chart.yaml
index 998d7414..b6779e80 100644
--- a/chart/flux/Chart.yaml
+++ b/chart/flux/Chart.yaml
@@ -1,6 +1,6 @@
 apiVersion: v1
-appVersion: "1.19.0"
-version: 1.3.0
+appVersion: "1.20.0"
+version: 1.4.0
 kubeVersion: ">=1.9.0-0"
 name: flux
 description: Flux is a tool that automatically ensures that the state of a cluster matches what is specified in version control
diff --git a/chart/flux/README.md b/chart/flux/README.md
index 971a9c73..547a8913 100755
--- a/chart/flux/README.md
+++ b/chart/flux/README.md
@@ -267,6 +267,7 @@ The following tables lists the configurable parameters of the Flux chart and the
 | `memcached.nodeSelector`                          | `{}`                                                 | Node Selector properties for the memcached deployment
 | `memcached.tolerations`                           | `[]`                                                 | Tolerations properties for the memcached deployment
 | `memcached.priorityClassName`                     | `""`                                                 | The name of the priority class to assign to the memcached pod.
+| `kube.externalConfig`                             | `false`                                              | If enabled, no kubeconfig and env var pointing to the kubeconfig will be created. You need to provide both on your own.
 | `kube.config`                                     | [See values.yaml][kubeconfig-ref]                    | Override for kubectl default config in the Flux pod(s).
 | `priorityClassName`                               | `""`                                                 | Set priority class for Flux
 | `prometheus.enabled`                              | `false`                                              | If enabled, adds prometheus annotations to Flux and helmOperator pod(s)
diff --git a/chart/flux/templates/deployment.yaml b/chart/flux/templates/deployment.yaml
index 5cc04c26..77a41a99 100644
--- a/chart/flux/templates/deployment.yaml
+++ b/chart/flux/templates/deployment.yaml
@@ -44,9 +44,11 @@ spec:
         - name: {{ .Values.image.pullSecret }}
       {{- end }}
       volumes:
+      {{- if not .Values.kube.externalConfig }}
       - name: kubedir
         configMap:
           name: {{ template "flux.fullname" . }}-kube-config
+      {{- end }}
       {{- if .Values.ssh.known_hosts }}
       - name: sshdir
         configMap:
@@ -129,8 +131,10 @@ spec:
             initialDelaySeconds: 5
             timeoutSeconds: 5
           volumeMounts:
+          {{- if not .Values.kube.externalConfig }}
           - name: kubedir
             mountPath: /root/.kubectl
+          {{- end }}
           {{- if .Values.ssh.known_hosts }}
           - name: sshdir
             mountPath: /root/.ssh
diff --git a/chart/flux/templates/kube.yaml b/chart/flux/templates/kube.yaml
index 0acbce89..ad02747a 100644
--- a/chart/flux/templates/kube.yaml
+++ b/chart/flux/templates/kube.yaml
@@ -1,3 +1,4 @@
+{{- if not .Values.kube.externalConfig }}
 apiVersion: v1
 kind: ConfigMap
 metadata:
@@ -26,4 +27,5 @@ data:
       {{- else }}
     {{ .Values.kube.config }}
       {{- end }}
-    {{- end }}
\ No newline at end of file
+    {{- end }}
+{{- end }}
diff --git a/chart/flux/values.yaml b/chart/flux/values.yaml
index 10dba069..cda304a4 100644
--- a/chart/flux/values.yaml
+++ b/chart/flux/values.yaml
@@ -9,7 +9,7 @@ logFormat: fmt
 
 image:
   repository: docker.io/fluxcd/flux
-  tag: 1.20.0
+  tag: 1.20.1
   pullPolicy: IfNotPresent
   pullSecret:
 
@@ -242,6 +242,9 @@ ssh:
 
 
 kube:
+  # Disable KUBECONFIG env var and passing the default config into the Container
+  # This means you need to provide both on your own, by using extraVars and ExtraVolume(Mounts)
+  externalConfig: false
   # Override for kubectl default config
   config: |
     apiVersion: v1
diff --git a/deploy/flux-deployment.yaml b/deploy/flux-deployment.yaml
index 240c719b..ce9e39d2 100644
--- a/deploy/flux-deployment.yaml
+++ b/deploy/flux-deployment.yaml
@@ -66,7 +66,7 @@ spec:
         # There are no ":latest" images for flux. Find the most recent
         # release or image version at https://hub.docker.com/r/fluxcd/flux/tags
         # and replace the tag here.
-        image: docker.io/fluxcd/flux:1.20.0
+        image: docker.io/fluxcd/flux:1.20.1
         imagePullPolicy: IfNotPresent
         resources:
           requests:
diff --git a/docker/Dockerfile.flux b/docker/Dockerfile.flux
index 4def09fb..274a065e 100644
--- a/docker/Dockerfile.flux
+++ b/docker/Dockerfile.flux
@@ -36,7 +36,7 @@ ENTRYPOINT [ "/sbin/tini", "--", "fluxd" ]
 
 # Get the kubeyaml binary (files) and put them on the path
 COPY --from=squaremo/kubeyaml:0.7.0 /usr/lib/kubeyaml /usr/lib/kubeyaml/
-ENV PATH=/bin:/usr/bin:/usr/local/bin:/usr/lib/kubeyaml
+ENV PATH=/bin:/sbin:/usr/bin:/usr/local/bin:/usr/lib/kubeyaml
 
 # Create minimal nsswitch.conf file to prioritize the usage of /etc/hosts over DNS queries.
 # This resolves the conflict between:
diff --git a/docs/guides/use-git-https.md b/docs/guides/use-git-https.md
index 2b426380..e0437ac9 100644
--- a/docs/guides/use-git-https.md
+++ b/docs/guides/use-git-https.md
@@ -15,6 +15,14 @@ as a plain value in your workload.
     to pass the values to the Flux container, e.g. `$(GIT_AUTHKEY)`.
     [Read more about this Kubernetes feature](https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/#using-environment-variables-inside-of-your-config).
 
+!!!note
+    Each of the username and password must be percent-encoded, otherwise
+    the git URL may end up being invalid once they have been interpolated
+    in. You can encode a string with Perl (assuming your token is in the
+    environment variable `TOKEN`):
+    
+        echo "$TOKEN" | perl -MURI::Escape -ne 'chomp;print uri_escape($_),"\n"'
+
 1. Create a personal access token to be used as the `GIT_AUTHKEY`:
 
     - [GitHub](https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line)
diff --git a/pkg/cluster/kubernetes/resource/load.go b/pkg/cluster/kubernetes/resource/load.go
index 13506b8b..dcfadab4 100644
--- a/pkg/cluster/kubernetes/resource/load.go
+++ b/pkg/cluster/kubernetes/resource/load.go
@@ -28,14 +28,18 @@ func Load(base string, paths []string, sopsEnabled bool) (map[string]KubeManifes
 		return nil, errors.Wrapf(err, "walking %q for chartdirs", base)
 	}
 	for _, root := range paths {
+		// In the walk, we ignore errors (indicating a failure to read
+		// a file) if it's not a file of interest. However, we _are_
+		// interested in the error if an explicitly-mentioned path
+		// does not exist.
+		if _, err := os.Stat(root); err != nil {
+			return nil, errors.Wrapf(err, "unable to read root path %q", root)
+		}
 		err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
-			if info.IsDir() {
+			if err == nil && info.IsDir() {
 				if charts.isDirChart(path) {
 					return filepath.SkipDir
 				}
-				if err != nil {
-					return errors.Wrapf(err, "walking dir %q for yaml files", path)
-				}
 				return nil
 			}
 
diff --git a/pkg/daemon/sync.go b/pkg/daemon/sync.go
index d8592a68..6807a0ed 100644
--- a/pkg/daemon/sync.go
+++ b/pkg/daemon/sync.go
@@ -48,7 +48,8 @@ func (d *Daemon) Sync(ctx context.Context, started time.Time, newRevision string
 	// Load last-synced resources for comparison
 	lastResources, err := d.getLastResources(ctx, rat)
 	if err != nil {
-		return errors.Wrap(err, "loading last-synced resources")
+		d.Logger.Log("warning", "failed to load last-synced resources. sync event may be inaccurate", "err", err)
+		lastResources = map[string]resource.Resource{}
 	}
 
 	// Retrieve change set of commits we need to sync
diff --git a/pkg/git/operations.go b/pkg/git/operations.go
index 02324fd7..eb3db7fb 100644
--- a/pkg/git/operations.go
+++ b/pkg/git/operations.go
@@ -8,6 +8,7 @@ import (
 	"encoding/json"
 	"fmt"
 	"io"
+	"io/ioutil"
 	"os"
 	"os/exec"
 	"strings"
@@ -141,7 +142,16 @@ func secretUnseal(ctx context.Context, workingDir string) error {
 }
 
 func commit(ctx context.Context, workingDir string, commitAction CommitAction) error {
-	args := []string{"commit", "--no-verify", "-a", "-m", commitAction.Message}
+	message, err := ioutil.TempFile("", "flux-commit-*.txt")
+	if err != nil {
+		return err
+	}
+	defer os.Remove(message.Name())
+	if _, err := message.WriteString(commitAction.Message); err != nil {
+		return err
+	}
+
+	args := []string{"commit", "--no-verify", "-a", "--file", message.Name()}
 	var env []string
 	if commitAction.Author != "" {
 		args = append(args, "--author", commitAction.Author)
@@ -205,7 +215,17 @@ func addNote(ctx context.Context, workingDir, rev, notesRef string, note interfa
 	if err != nil {
 		return err
 	}
-	args := []string{"notes", "--ref", notesRef, "add", "-m", string(b), rev}
+
+	message, err := ioutil.TempFile("", "flux-note-*.json")
+	if err != nil {
+		return err
+	}
+	defer os.Remove(message.Name())
+	if _, err := message.Write(b); err != nil {
+		return err
+	}
+
+	args := []string{"notes", "--ref", notesRef, "add", "--file", message.Name(), rev}
 	return execGitCmd(ctx, args, gitCmdConfig{dir: workingDir})
 }
 
diff --git a/pkg/install/generated_templates.gogen.go b/pkg/install/generated_templates.gogen.go
index 87308a18..6209c58f 100644
--- a/pkg/install/generated_templates.gogen.go
+++ b/pkg/install/generated_templates.gogen.go
@@ -33,7 +33,7 @@ var templates = func() http.FileSystem {
 			modTime:          time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC),
 			uncompressedSize: 7265,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x59\xdd\x6f\x1b\x37\x12\x7f\xf7\x5f\x31\x50\x0e\x48\x0c\x48\x2b\xbb\x6e\x8b\xc3\xf6\x54\x5c\x9a\x0f\x37\x97\x26\x35\xec\xe4\x0e\x7d\xaa\x29\xee\x48\x4b\x88\x4b\xee\x71\xb8\x52\x05\xa1\xff\xfb\x61\xc8\xfd\xe0\xca\xb2\x53\xe4\xed\xf2\x10\xdb\xbb\xc3\xe1\xcc\x6f\xbe\x7e\xe4\xce\x66\xb3\x33\x51\xab\x7f\xa3\x23\x65\x4d\x0e\xa2\xae\x69\xbe\xbd\x3c\xdb\x28\x53\xe4\xf0\x1a\x6b\x6d\xf7\x15\x1a\x7f\x56\xa1\x17\x85\xf0\x22\x3f\x03\x30\xa2\xc2\x1c\x56\xba\xf9\xe3\x70\x00\xb5\x82\xec\xa3\xa8\x90\x6a\x21\x11\xfe\xfc\xb3\x7d\x1f\xfe\xcc\xe1\x70\x18\xbf\x3d\x1c\x00\x4d\xc1\x62\x54\xa3\x64\x65\x0e\x6b\xad\xa4\xa0\x1c\x2e\xcf\x00\x08\x35\x4a\x6f\x1d\xbf\x01\xa8\x84\x97\xe5\x2f\x62\x89\x9a\xe2\x83\x74\x6f\x96\xf6\x4e\x78\x5c\xef\xe3\x4b\xbf\xaf\x31\x87\x5b\x94\x0e\x85\xc7\x33\x00\x8f\x55\xad\x85\xc7\x56\x59\xe2\x01\xff\x13\xc6\x58\x2f\xbc\xb2\xa6\x57\x0e\x50\x3b\x5b\xa1\x2f\xb1\xa1\x4c\xd9\x79\x6d\x9d\xcf\x61\x72\x75\x71\x75\x39\x81\x67\xe0\x51\xeb\x44\x02\xbc\x05\x92\x4e\xd4\x08\xf3\x0a\xbd\x53\x92\xd8\xb9\xda\x2a\xe3\x9f\x13\xf0\xe2\xac\x55\xac\x47\x3e\x1c\x79\x01\xd0\x61\x11\x5e\xd9\x02\xef\x46\x28\xf0\xbf\x25\x7a\x91\x6d\x9a\x25\x3a\x83\x1e\x83\x71\x96\x72\xd0\xca\xb4\x2a\x18\x3a\xb7\x55\x12\x5f\x4a\x69\x1b\xe3\x3f\x8e\x77\x00\xd8\x5a\xdd\x54\xd8\xdb\x30\x6b\x6d\x58\x2b\x3f\xdb\xe0\xbe\xdf\x88\x18\x3e\x3f\x6c\xdc\x3d\x19\xf4\xcd\x78\x49\x11\x32\x23\x91\x2a\x70\x25\x1a\xed\x3f\xd8\x02\x73\xb8\xf8\xf6\xe2\x02\x9e\xc1\xae\x44\x03\x15\x5b\x83\x05\x38\x14\xc5\xcc\x1a\xbd\x9f\xc2\x0e\x61\x67\xcd\x73\x0f\x4b\x04\xb1\xd4\xc8\x40\xca\xb2\xb2\xc5\x59\xab\xf0\x19\x7c\x2a\x15\x81\x22\x10\xe0\xab\x7a\x45\xd0\x10\x16\xb0\xb2\x0e\xd6\x68\xd0\x09\xaf\xcc\x1a\xee\xee\x7e\x86\x0d\xee\x29\x83\x77\x06\xde\xff\x9d\xe0\xc7\x05\x5c\x66\x97\x17\xd3\x5e\x4b\xb7\x77\x74\x81\x40\x38\x4c\xed\x20\xcb\xa6\x18\xc4\x02\x04\x10\xd6\x82\xb3\xa9\x05\x0a\x76\xd8\xab\x91\xc2\xc0\xce\x29\xcf\x86\x66\xa7\xf1\x5b\xa3\xe9\xc1\xc0\xaa\xf6\xfb\xd7\xca\xa5\x20\x56\x58\xa8\xa6\xca\xe1\x03\x56\xd6\xed\x53\x3f\x11\x56\x56\x6b\xbb\x63\x8f\xda\xad\x15\x05\x57\x1b\xe2\x67\x02\x64\x43\xde\x56\x8a\x11\xd8\x18\xbb\x33\xbf\x97\x96\x3c\xf5\x2a\x56\x4a\xe3\x14\x76\xa5\x92\x25\xec\x6d\x03\x3b\xa5\x75\x74\xca\x5b\x28\x2c\x17\x28\x3f\xe6\x45\xfc\x8b\x03\xbb\x33\x6c\x76\xaf\xc0\x61\x6d\xc1\x09\x5f\xa2\x03\x5f\x0a\xd3\x6e\xbc\x56\xbe\x6c\x96\x60\xf9\x21\x82\x56\x1b\xcc\xe0\x37\xdb\x3c\xd7\x1a\x84\x26\xdb\x6d\x31\x06\x1b\x94\x07\x65\xbc\x0d\x6b\xa4\x35\x5e\x28\x83\x6e\x0a\x4b\xd4\x76\x97\xc1\x1d\x0e\xa8\x96\xde\xd7\x94\xcf\xe7\x85\x95\x94\x71\x62\xc9\x82\xd3\x1a\xcd\x9c\x6b\x96\xfc\x7c\xdd\xa8\x02\x69\xde\x10\xce\x6a\xa7\xb6\xc2\x63\x48\x3d\x76\xa4\x57\xd2\x85\x81\xa8\x9c\x49\x6b\x56\x6a\xdd\xbf\x02\x88\x0f\x3e\x88\x3a\x4f\x1e\xa6\xc5\x37\x4b\x96\x7d\x6d\x48\x42\x55\xce\xa3\x92\x21\xf3\xbe\x18\x8e\x9d\xa2\x92\x9f\x94\x62\x8b\x20\xa0\x50\xab\x15\x3a\x6e\xb4\x9d\x86\xb6\xa0\x86\x66\x1a\xd0\x8f\xea\x52\xfc\xb9\x21\x6d\x55\x81\x1d\xe2\x2b\xb5\xae\x44\x3d\x18\xa2\x7c\x09\xc2\x00\x1a\xef\xf6\xc1\x87\xfb\x28\x74\x3f\x05\x61\x0a\x68\x8c\xb4\x15\x77\xf8\xb0\x3e\x7a\xfb\x21\x44\x52\x98\xa2\xd7\x82\x66\x1b\x34\x28\xa4\x36\x94\x0f\x22\xc0\x30\x7c\x45\x04\x92\x65\x5f\x8c\x40\x68\x02\xde\x82\xaa\xb8\xb7\xc2\xf5\xcd\x75\xa8\x7f\x78\xc1\x6e\x91\x5a\x1b\x65\x86\xcd\xd9\xb9\x2d\x3a\xb5\x52\x32\x34\x79\xa8\x1b\x57\x5b\x42\x3a\xff\x0b\x40\xf6\x5a\x62\xe7\x88\x28\x32\x40\xbc\xdf\x5f\x00\x0e\x84\x5b\x0f\x15\xfa\x08\x62\xeb\x7a\xcd\xad\x83\x12\x68\xc6\xdd\xf7\xd9\x23\xfd\xf7\xe1\xba\x13\xfd\xb7\x83\xb3\x2f\xc2\x07\xad\x3f\x19\x0e\x2d\xea\x0e\x43\x8b\x34\x16\x26\x79\x2c\xc2\x09\xa8\x4a\xac\x31\x66\x3f\x2f\xc8\xe0\xad\x32\x45\xf0\xb9\xe2\x8e\xe2\x50\x0e\x59\x1b\xbb\x89\x46\x41\xc8\x7d\x23\x2c\xe5\x20\x30\xb7\x00\xe1\xfb\x92\x2f\x9b\x65\x56\x58\xb9\x41\x97\x49\x5b\xcd\xdd\x3c\x96\x7f\xf8\x31\xf7\xa2\x87\xae\x8b\x23\x73\x04\xe6\x0f\xbc\xab\x17\x6b\x60\x4b\xb3\x5e\x26\x6c\x93\x43\xab\x50\xd9\x54\x5b\x7e\x99\x7d\x73\x91\x5d\x8c\x65\x6f\x1a\xad\x6f\xac\x56\x72\x9f\xc3\xbb\xd5\x47\xeb\x6f\x1c\x52\xea\x85\x43\xb2\x8d\x93\x48\x69\x0b\x77\xf8\xdf\x06\xc9\x8f\x9e\x01\xc8\xba\xc9\xe1\xbb\x8b\x6a\xf4\xb0\x0a\x5d\x3e\x87\xef\xbf\xfd\xa0\x06\x6a\x61\x5d\xba\x78\x36\x44\xe6\x26\xd0\x8c\xab\x8b\x2b\x1e\x9a\xca\xac\xac\xab\x42\xca\x0a\xdd\x4b\x6b\xb5\x45\x83\x44\x37\xce\x2e\x31\xb5\x80\x21\xbd\x1e\x0f\xec\xb8\x55\x54\x38\x7e\x2c\x7c\x99\xc3\x5c\xd4\x2a\x22\xbd\xfd\x7e\xae\x0a\x34\x5e\xf9\x7d\x56\x37\xcb\x44\x56\x19\xe5\x95\xd0\xaf\x51\x8b\xfd\x1d\xd7\x67\x41\x39\x7c\x97\x08\x78\x55\xa1\x6d\xfc\x89\x77\x3c\x5f\xd5\xff\x87\xa9\x49\xd1\x8e\x02\x73\x9a\x19\x41\x9c\x70\x37\xd1\x32\xf4\x32\x58\x56\xcc\x89\x4a\xe6\x86\x36\xb2\x55\xd0\xb6\xed\x37\x6b\x0e\x19\x28\x13\x73\xee\x39\xc5\x35\x44\xe5\x7c\xd4\x26\x3b\xcc\x7e\x35\x7a\x9f\x83\x77\x0d\xb2\x36\xa6\x3f\xa1\x43\x2d\xdb\xc6\xce\x25\x55\xa3\x5b\x59\x27\x91\x95\x46\xbe\xc3\x74\xe7\x31\xc3\x53\x4a\x32\xb6\x7d\x2b\x5c\x6b\x7b\x14\xfb\x3a\xf3\x93\x1a\x7d\x67\xa4\x6e\x42\xe7\x64\xd6\x16\x07\x5c\xd7\x55\x23\x2d\xf8\x02\x8b\xe9\x78\xcc\x0f\xbc\xf4\x88\x61\xf4\xdd\x15\x0a\x94\x5a\x38\x66\x6b\x4b\xbb\x4d\x1a\xc0\x13\x34\x20\xb6\xc7\xd4\x79\x67\xad\x9f\x67\x44\xe5\xa3\x0e\x08\x33\xda\x75\x32\x8c\xa8\x49\xdc\x79\xda\x89\x24\x1a\xd0\x6c\x95\xb3\x26\x0c\x84\x38\x6b\x27\xef\x3f\xff\xf4\xe6\xd5\xaf\x1f\xdf\xbe\xbb\x9e\xc4\x11\x30\x65\x3c\xec\x16\x9d\x1b\xcf\xeb\x44\x4d\x18\x71\xcb\x7d\x9c\xa6\x5e\x9f\xf2\xf1\xc1\xa0\x7d\xe8\xe3\x90\x9c\x2c\xfc\xa8\xa3\x3c\xf3\xf8\xb0\xd2\xed\xc6\x2d\x3a\xa1\x22\xad\x75\x21\x26\x89\x8a\x63\x42\x93\x06\x3d\xb0\x99\x8e\x75\x0b\x03\x42\x7b\x74\x86\x59\xf5\x03\x8b\x57\xce\x56\x9c\x16\x1d\x63\x99\x82\x20\x4e\xb7\x76\xaa\x32\x0c\xda\xca\x0d\x3d\x0c\x36\x9a\x6d\x7e\x02\x97\x01\xee\x11\x2e\x5b\xa1\x1b\x7c\x80\xc9\x97\x92\xf8\x38\x07\xba\x99\xfb\x44\x06\xf0\xc8\x1f\x8f\xfa\x27\x86\xfd\x23\x79\xc9\x52\x91\xdd\x8c\xe4\xc6\xfd\xe1\x4b\x95\xb7\x13\x4c\x4a\x2c\x50\x53\xd7\x7a\x0f\x3f\x7f\xfa\x74\x03\x4b\x41\x4a\x82\x68\x7c\x09\xd2\x61\xe8\xa4\x42\xc7\xa9\x3e\x1c\x05\x58\xe1\x56\x89\xe0\xf8\xfd\xf5\xbb\x4f\xbf\xbf\xfc\xfc\xe9\xe7\xcf\x77\x6f\x6e\xef\x83\xbb\xfd\xa3\xf7\x6f\x7e\xbb\x1f\x25\xfc\x56\x38\xc5\x07\x39\xea\x08\x72\xa2\x30\xd2\x97\xa3\xf8\xbd\x75\xb6\x1a\xc7\x30\x8a\xdd\xe2\x2a\x1f\x79\x3e\xe2\x8a\xdc\xd8\xd8\x85\x01\x00\xc6\x3c\x1f\xe1\x11\x21\x88\xc7\x53\x2c\x78\x12\x4b\x21\x4b\x2c\x38\xb5\xd2\xdc\xee\x69\x35\x23\xc5\xda\xa7\x89\x16\xeb\x5a\xde\x9c\x2c\x68\x8f\xd7\x61\xe1\x34\x6c\xc2\xc7\xc2\x16\x63\x5f\x22\xa5\xb9\x30\xb0\x57\xbf\xb3\x6c\x65\xc3\x38\x85\x8a\x0b\x97\x08\x21\x11\xa1\xb4\xbb\x70\xf4\xb5\xc6\xa0\x0c\x21\x53\x7e\x9c\x3b\xb3\x59\xef\x40\x38\xf7\xf0\xe6\x8b\xfe\x51\xd6\x92\xbe\x8c\xb6\x32\x93\xba\x21\x8f\x2e\xe3\x06\xae\x53\x48\x3e\x53\xec\x35\x03\x14\xaf\xa2\xe8\xbb\x9b\x91\x53\xdc\x76\x08\x7d\x38\x5a\x8f\x33\x7b\xb0\xa1\x93\xe7\xec\xf2\x8e\x25\xc3\x61\x37\x19\x41\xa9\xc5\xad\xf4\xe2\x6c\xc4\x32\x15\x41\xd5\x50\x38\xfc\x07\xf4\x14\x16\xb1\x9c\x96\x61\xb0\x05\x8e\x17\xce\xfc\x2f\xba\x83\xf4\x79\x6a\x4b\xd7\x5c\x62\x19\x72\x02\x27\x47\xff\x91\x21\x3c\x0c\xe2\x80\x9b\x15\xca\x2d\x1e\x8c\xbd\xd4\xac\xdb\x84\x61\x0e\xc1\xfb\x7c\xfb\x4b\xbc\x9b\x10\x66\x1d\xdf\x5d\x2b\x1f\xce\xcb\xa4\xbc\x75\xfb\xbe\x5d\xbf\x65\x66\x9c\xa8\x7b\xaa\xe6\x38\x6d\x12\xdf\xdb\x92\x39\x59\x4e\x69\x2d\x74\xdc\xf9\x6f\x2f\xd2\xca\x3c\xcf\x87\xbf\xdf\xbf\xf9\xed\xfc\x9f\xf1\xd4\x1e\x68\x75\x43\xe8\xe6\x83\xb1\x59\x5a\xe8\x8c\x0f\x97\x53\xe3\xf4\xe2\x70\x80\xec\x5a\x79\x76\x36\x5c\xdf\x8d\x25\x96\x4e\x18\x59\x76\x42\x3f\x85\xbf\xe2\x45\x9e\x5a\x85\x47\xdc\xbf\xe8\xd4\x4a\xe6\x70\xbc\xee\x2e\x64\x0a\xfd\xcb\x2a\x93\x2c\x98\x4c\x27\xed\x7d\xa0\x26\x4c\x97\x3f\xdd\xd4\x1c\x72\xe2\xc9\x78\xea\xaa\x84\x51\x2b\xe6\xe4\x5c\x43\xa4\x0a\x74\x31\x1c\x47\x27\x9b\x70\x1d\x61\x09\xa1\x31\x05\xba\xa3\x18\x3b\xd4\xc2\xab\x2d\x06\xca\x49\x5d\x06\xae\x47\x71\x3e\xaa\xc9\xde\x39\x6a\x96\x85\x72\x97\xd3\xf8\xf3\x9b\xfe\x72\x73\x00\x27\x5c\x5e\x9e\x02\x27\xdc\x08\x76\xa8\x76\x52\x27\x14\x7c\x26\x74\xa7\xd6\x73\x70\xfb\xc8\xb1\x0c\x9c\x5e\xff\xa6\x12\xea\xa4\x01\xc8\x2f\x3a\x0d\x9d\xd4\x70\x3d\x7b\x32\x1c\xc8\xad\x64\x67\x19\x50\x34\xe1\xe6\x8e\x71\xe2\x89\xad\xfc\xd1\x01\x3c\xc5\xaa\x9d\x7d\xed\x64\x5b\x3c\x31\xea\xba\x15\xad\x2e\x5e\xb5\xf8\xc7\x06\xf7\xa0\x8a\x1f\x7b\xb1\x27\xe8\x4c\x62\x15\xab\x10\xbe\x71\x38\xba\x05\x38\xb1\x57\x78\xbd\x9f\xf5\xf2\x34\x6a\x57\x5d\xb7\x06\xe5\xa1\x14\x14\x46\xb1\x35\x7a\x0f\x42\x4a\xa4\xd8\xd1\x4b\x8c\x77\x68\x2f\xba\x3b\x9b\xfb\x95\xd0\x84\xf7\xe7\x67\x87\xc3\xac\x0b\xc4\x6d\x3b\xc3\x4f\xc5\xa2\x53\x1a\xe4\x1f\xd6\xc3\x69\xb1\x13\x71\x22\xef\x1a\xe9\xa3\xbd\xbb\x70\x9c\x67\x8a\xd7\x78\xa0\xbd\x91\xb0\xb4\x76\xb3\x41\xac\x39\xeb\x7b\x53\x27\x6b\xe5\x27\x53\xa8\x50\x30\xe0\xdc\xd0\x40\x84\x33\x76\x5b\x08\x4d\x4d\xde\xa1\xa8\xfa\x8a\x38\x3f\x32\x8c\x55\xcf\xc8\x0b\x8f\x0b\x6e\x30\x8f\xe6\x8d\xc1\x3f\x7c\x97\x3c\xc9\xc4\x13\x06\x26\xdd\x1e\x93\x6e\x1e\x25\x4a\x5e\x60\xb6\xce\xa6\xf0\x1f\x64\x66\xf9\x4a\xdb\xa6\x38\xcf\xc2\x05\x91\xb7\x1b\x3e\x9f\x10\xd4\xc2\x79\x25\x1b\x2d\x5c\x17\x8c\x56\xcb\xf1\x28\x6d\x77\x5d\xec\x88\xfb\xa8\x64\x5d\xd9\x8e\xf5\x66\x3b\xeb\x36\xd4\x1f\x36\x8f\x96\x85\x8d\x16\x62\x29\x2f\xbf\xb9\x7a\xf8\x7f\xea\xf0\x9b\x98\x7d\x5d\x57\xea\xef\xaa\xad\x79\x22\x35\x3e\xb4\xd2\xd7\x83\xf0\x51\x86\x74\xfa\x66\x83\xbe\x45\xe0\x81\x8f\x67\xcb\xa9\x25\x61\xe3\x47\x52\xe7\x0e\xdd\xf6\xc4\x57\x0c\x3e\x10\x0c\x0c\x88\x6b\xf5\x87\x74\x14\x8b\x0d\x8f\xb1\x98\x65\x84\x3e\xf9\x34\xf2\x3c\xf9\xba\x92\x7c\x26\xe1\xe0\x84\xab\xbb\x40\xca\xb3\x91\x97\x5a\x91\x47\x33\x6b\x4d\x58\xe4\x57\x17\x57\x97\x3d\x48\xb7\xb8\x56\xe4\xdd\xfe\xb5\x22\x86\xf8\x4e\x0a\x13\xd2\xf5\x08\x29\xd7\x8a\xcd\x8a\x28\x37\xa3\x56\x30\x75\xbb\xed\x8d\x2f\x8b\x42\xc5\x4b\x16\x1e\xde\x2f\x99\xbc\x8f\x60\x1c\xde\x0f\xfc\xed\x70\x00\x17\xa8\xc0\x17\x56\xcf\xc2\x77\xaf\x51\x3f\x1d\x7e\xeb\x36\xf8\xb5\x6e\xd5\xbf\xfe\x78\xd7\x11\x2f\x9a\xb6\x07\xa2\xc6\xb5\x34\x0c\x4c\x61\x3d\x81\x0d\xc2\x50\x89\x7d\xb8\x9c\xd2\xdb\xe1\x8a\xd2\x90\xb6\x76\xd3\xd4\xa0\x88\x1a\x24\xb0\x06\xc8\x56\x08\xef\xfb\xaf\x45\xac\xbd\xa9\x69\xb8\x81\x2c\x0c\x75\xf7\x5f\x93\x8f\xd6\xe0\x24\x7d\xf3\x2a\x18\x90\xde\x41\xc6\xcd\x69\x7c\x2d\xd9\x1d\x6c\x82\x7d\xa3\x37\xfd\x99\x6b\x72\x39\x39\xfb\x5f\x00\x00\x00\xff\xff\x1e\x21\x4d\x4f\x61\x1c\x00\x00"),
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x59\xdd\x6f\x1b\x37\x12\x7f\xf7\x5f\x31\x50\x0e\x48\x0c\x48\x2b\xbb\x6e\x8b\xc3\xf6\x54\x5c\x9a\x0f\x37\x97\x26\x35\xec\xe4\x0e\x7d\xaa\x29\xee\x48\x4b\x88\x4b\xee\x71\xb8\x52\x05\xa1\xff\xfb\x61\xc8\xfd\xe0\xca\xb2\x53\xe4\xed\xf2\x10\xdb\xbb\xc3\xe1\xcc\x6f\xbe\x7e\xe4\xce\x66\xb3\x33\x51\xab\x7f\xa3\x23\x65\x4d\x0e\xa2\xae\x69\xbe\xbd\x3c\xdb\x28\x53\xe4\xf0\x1a\x6b\x6d\xf7\x15\x1a\x7f\x56\xa1\x17\x85\xf0\x22\x3f\x03\x30\xa2\xc2\x1c\x56\xba\xf9\xe3\x70\x00\xb5\x82\xec\xa3\xa8\x90\x6a\x21\x11\xfe\xfc\xb3\x7d\x1f\xfe\xcc\xe1\x70\x18\xbf\x3d\x1c\x00\x4d\xc1\x62\x54\xa3\x64\x65\x0e\x6b\xad\xa4\xa0\x1c\x2e\xcf\x00\x08\x35\x4a\x6f\x1d\xbf\x01\xa8\x84\x97\xe5\x2f\x62\x89\x9a\xe2\x83\x74\x6f\x96\xf6\x4e\x78\x5c\xef\xe3\x4b\xbf\xaf\x31\x87\x5b\x94\x0e\x85\xc7\x33\x00\x8f\x55\xad\x85\xc7\x56\x59\xe2\x01\xff\x13\xc6\x58\x2f\xbc\xb2\xa6\x57\x0e\x50\x3b\x5b\xa1\x2f\xb1\xa1\x4c\xd9\x79\x6d\x9d\xcf\x61\x72\x75\x71\x75\x39\x81\x67\xe0\x51\xeb\x44\x02\xbc\x05\x92\x4e\xd4\x08\xf3\x0a\xbd\x53\x92\xd8\xb9\xda\x2a\xe3\x9f\x13\xf0\xe2\xac\x55\xac\x47\x3e\x1c\x79\x01\xd0\x61\x11\x5e\xd9\x02\xef\x46\x28\xf0\xbf\x25\x7a\x91\x6d\x9a\x25\x3a\x83\x1e\x83\x71\x96\x72\xd0\xca\xb4\x2a\x18\x3a\xb7\x55\x12\x5f\x4a\x69\x1b\xe3\x3f\x8e\x77\x00\xd8\x5a\xdd\x54\xd8\xdb\x30\x6b\x6d\x58\x2b\x3f\xdb\xe0\xbe\xdf\x88\x18\x3e\x3f\x6c\xdc\x3d\x19\xf4\xcd\x78\x49\x11\x32\x23\x91\x2a\x70\x25\x1a\xed\x3f\xd8\x02\x73\xb8\xf8\xf6\xe2\x02\x9e\xc1\xae\x44\x03\x15\x5b\x83\x05\x38\x14\xc5\xcc\x1a\xbd\x9f\xc2\x0e\x61\x67\xcd\x73\x0f\x4b\x04\xb1\xd4\xc8\x40\xca\xb2\xb2\xc5\x59\xab\xf0\x19\x7c\x2a\x15\x81\x22\x10\xe0\xab\x7a\x45\xd0\x10\x16\xb0\xb2\x0e\xd6\x68\xd0\x09\xaf\xcc\x1a\xee\xee\x7e\x86\x0d\xee\x29\x83\x77\x06\xde\xff\x9d\xe0\xc7\x05\x5c\x66\x97\x17\xd3\x5e\x4b\xb7\x77\x74\x81\x40\x38\x4c\xed\x20\xcb\xa6\x18\xc4\x02\x04\x10\xd6\x82\xb3\xa9\x05\x0a\x76\xd8\xab\x91\xc2\xc0\xce\x29\xcf\x86\x66\xa7\xf1\x5b\xa3\xe9\xc1\xc0\xaa\xf6\xfb\xd7\xca\xa5\x20\x56\x58\xa8\xa6\xca\xe1\x03\x56\xd6\xed\x53\x3f\x11\x56\x56\x6b\xbb\x63\x8f\xda\xad\x15\x05\x57\x1b\xe2\x67\x02\x64\x43\xde\x56\x8a\x11\xd8\x18\xbb\x33\xbf\x97\x96\x3c\xf5\x2a\x56\x4a\xe3\x14\x76\xa5\x92\x25\xec\x6d\x03\x3b\xa5\x75\x74\xca\x5b\x28\x2c\x17\x28\x3f\xe6\x45\xfc\x8b\x03\xbb\x33\x6c\x76\xaf\xc0\x61\x6d\xc1\x09\x5f\xa2\x03\x5f\x0a\xd3\x6e\xbc\x56\xbe\x6c\x96\x60\xf9\x21\x82\x56\x1b\xcc\xe0\x37\xdb\x3c\xd7\x1a\x84\x26\xdb\x6d\x31\x06\x1b\x94\x07\x65\xbc\x0d\x6b\xa4\x35\x5e\x28\x83\x6e\x0a\x4b\xd4\x76\x97\xc1\x1d\x0e\xa8\x96\xde\xd7\x94\xcf\xe7\x85\x95\x94\x71\x62\xc9\x82\xd3\x1a\xcd\x9c\x6b\x96\xfc\x7c\xdd\xa8\x02\x69\xde\x10\xce\x6a\xa7\xb6\xc2\x63\x48\x3d\x76\xa4\x57\xd2\x85\x81\xa8\x9c\x49\x6b\x56\x6a\xdd\xbf\x02\x88\x0f\x3e\x88\x3a\x4f\x1e\xa6\xc5\x37\x4b\x96\x7d\x6d\x48\x42\x55\xce\xa3\x92\x21\xf3\xbe\x18\x8e\x9d\xa2\x92\x9f\x94\x62\x8b\x20\xa0\x50\xab\x15\x3a\x6e\xb4\x9d\x86\xb6\xa0\x86\x66\x1a\xd0\x8f\xea\x52\xfc\xb9\x21\x6d\x55\x81\x1d\xe2\x2b\xb5\xae\x44\x3d\x18\xa2\x7c\x09\xc2\x00\x1a\xef\xf6\xc1\x87\xfb\x28\x74\x3f\x05\x61\x0a\x68\x8c\xb4\x15\x77\xf8\xb0\x3e\x7a\xfb\x21\x44\x52\x98\xa2\xd7\x82\x66\x1b\x34\x28\xa4\x36\x94\x0f\x22\xc0\x30\x7c\x45\x04\x92\x65\x5f\x8c\x40\x68\x02\xde\x82\xaa\xb8\xb7\xc2\xf5\xcd\x75\xa8\x7f\x78\xc1\x6e\x91\x5a\x1b\x65\x86\xcd\xd9\xb9\x2d\x3a\xb5\x52\x32\x34\x79\xa8\x1b\x57\x5b\x42\x3a\xff\x0b\x40\xf6\x5a\x62\xe7\x88\x28\x32\x40\xbc\xdf\x5f\x00\x0e\x84\x5b\x0f\x15\xfa\x08\x62\xeb\x7a\xcd\xad\x83\x12\x68\xc6\xdd\xf7\xd9\x23\xfd\xf7\xe1\xba\x13\xfd\xb7\x83\xb3\x2f\xc2\x07\xad\x3f\x19\x0e\x2d\xea\x0e\x43\x8b\x34\x16\x26\x79\x2c\xc2\x09\xa8\x4a\xac\x31\x66\x3f\x2f\xc8\xe0\xad\x32\x45\xf0\xb9\xe2\x8e\xe2\x50\x0e\x59\x1b\xbb\x89\x46\x41\xc8\x7d\x23\x2c\xe5\x20\x30\xb7\x00\xe1\xfb\x92\x2f\x9b\x65\x56\x58\xb9\x41\x97\x49\x5b\xcd\xdd\x3c\x96\x7f\xf8\x31\xf7\xa2\x87\xae\x8b\x23\x73\x04\xe6\x0f\xbc\xab\x17\x6b\x60\x4b\xb3\x5e\x26\x6c\x93\x43\xab\x50\xd9\x54\x5b\x7e\x99\x7d\x73\x91\x5d\x8e\x65\x6f\x1a\xad\x6f\xac\x56\x72\x9f\xc3\xbb\xd5\x47\xeb\x6f\x1c\x52\xea\x85\x43\xb2\x8d\x93\x48\x69\x0b\x77\xf8\xdf\x06\xc9\x8f\x9e\x01\xc8\xba\xc9\xe1\xbb\x8b\x6a\xf4\xb0\x0a\x5d\x3e\x87\xef\xbf\xfd\xa0\x06\x6a\x61\x5d\xba\x78\x36\x44\xe6\x26\xd0\x8c\xab\x8b\x2b\x1e\x9a\xca\xac\xac\xab\x42\xca\x0a\xdd\x4b\x6b\xb5\x45\x83\x44\x37\xce\x2e\x31\xb5\x80\x21\xbd\x1e\x0f\xec\xb8\x55\x54\x38\x7e\x2c\x7c\x99\xc3\x5c\xd4\x2a\x22\xbd\xfd\x7e\xae\x0a\x34\x5e\xf9\x7d\x56\x37\xcb\x44\x56\x19\xe5\x95\xd0\xaf\x51\x8b\xfd\x1d\xd7\x67\x41\x39\x7c\x97\x08\x78\x55\xa1\x6d\xfc\x89\x77\x3c\x5f\xd5\xff\x87\xa9\x49\xd1\x8e\x02\x73\x9a\x19\x41\x9c\x70\x37\xd1\x32\xf4\x32\x58\x56\xcc\x89\x4a\xe6\x86\x36\xb2\x55\xd0\xb6\xed\x37\x6b\x0e\x19\x28\x13\x73\xee\x39\xc5\x35\x44\xe5\x7c\xd4\x26\x3b\xcc\x7e\x35\x7a\x9f\x83\x77\x0d\xb2\x36\xa6\x3f\xa1\x43\x2d\xdb\xc6\xce\x25\x55\xa3\x5b\x59\x27\x91\x95\x46\xbe\xc3\x74\xe7\x31\xc3\x53\x4a\x32\xb6\x7d\x2b\x5c\x6b\x7b\x14\xfb\x3a\xf3\x93\x1a\x7d\x67\xa4\x6e\x42\xe7\x64\xd6\x16\x07\x5c\xd7\x55\x23\x2d\xf8\x02\x8b\xe9\x78\xcc\x0f\xbc\xf4\x88\x61\xf4\xdd\x15\x0a\x94\x5a\x38\x66\x6b\x4b\xbb\x4d\x1a\xc0\x13\x34\x20\xb6\xc7\xd4\x79\x67\xad\x9f\x67\x44\xe5\xa3\x0e\x08\x33\xda\x75\x32\x8c\xa8\x49\xdc\x79\xda\x89\x24\x1a\xd0\x6c\x95\xb3\x26\x0c\x84\x38\x6b\x27\xef\x3f\xff\xf4\xe6\xd5\xaf\x1f\xdf\xbe\xbb\x9e\xc4\x11\x30\x65\x3c\xec\x16\x9d\x1b\xcf\xeb\x44\x4d\x18\x71\xcb\x7d\x9c\xa6\x5e\x9f\xf2\xf1\xc1\xa0\x7d\xe8\xe3\x90\x9c\x2c\xfc\xa8\xa3\x3c\xf3\xf8\xb0\xd2\xed\xc6\x2d\x3a\xa1\x22\xad\x75\x21\x26\x89\x8a\x63\x42\x93\x06\x3d\xb0\x99\x8e\x75\x0b\x03\x42\x7b\x74\x86\x59\xf5\x03\x8b\x57\xce\x56\x9c\x16\x1d\x63\x99\x82\x20\x4e\xb7\x76\xaa\x32\x0c\xda\xca\x0d\x3d\x0c\x36\x9a\x6d\x7e\x02\x97\x01\xee\x11\x2e\x5b\xa1\x1b\x7c\x80\xc9\x97\x92\xf8\x38\x07\xba\x99\xfb\x44\x06\xf0\xc8\x1f\x8f\xfa\x27\x86\xfd\x23\x79\xc9\x52\x91\xdd\x8c\xe4\xc6\xfd\xe1\x4b\x95\xb7\x13\x4c\x4a\x2c\x50\x53\xd7\x7a\x0f\x3f\x7f\xfa\x74\x03\x4b\x41\x4a\x82\x68\x7c\x09\xd2\x61\xe8\xa4\x42\xc7\xa9\x3e\x1c\x05\x58\xe1\x56\x89\xe0\xf8\xfd\xf5\xbb\x4f\xbf\xbf\xfc\xfc\xe9\xe7\xcf\x77\x6f\x6e\xef\x83\xbb\xfd\xa3\xf7\x6f\x7e\xbb\x1f\x25\xfc\x56\x38\xc5\x07\x39\xea\x08\x72\xa2\x30\xd2\x97\xa3\xf8\xbd\x75\xb6\x1a\xc7\x30\x8a\xdd\xe2\x2a\x1f\x79\x3e\xe2\x8a\xdc\xd8\xd8\x85\x01\x00\xc6\x3c\x1f\xe1\x11\x21\x88\xc7\x53\x2c\x78\x12\x4b\x21\x4b\x2c\x38\xb5\xd2\xdc\xee\x69\x35\x23\xc5\xda\xa7\x89\x16\xeb\x5a\xde\x9c\x2c\x68\x8f\xd7\x61\xe1\x34\x6c\xc2\xc7\xc2\x16\x63\x5f\x22\xa5\xb9\x30\xb0\x57\xbf\xb3\x6c\x65\xc3\x38\x85\x8a\x0b\x97\x08\x21\x11\xa1\xb4\xbb\x70\xf4\xb5\xc6\xa0\x0c\x21\x53\x7e\x9c\x3b\xb3\x59\xef\x40\x38\xf7\xf0\xe6\x8b\xfe\x51\xd6\x92\xbe\x8c\xb6\x32\x93\xba\x21\x8f\x2e\xe3\x06\xae\x53\x48\x3e\x53\xec\x35\x03\x14\xaf\xa2\xe8\xbb\x9b\x91\x53\xdc\x76\x08\x7d\x38\x5a\x8f\x33\x7b\xb0\xa1\x93\xe7\xec\xf2\x8e\x25\xc3\x61\x37\x19\x41\xa9\xc5\xad\xf4\xe2\x6c\xc4\x32\x15\x41\xd5\x50\x38\xfc\x07\xf4\x14\x16\xb1\x9c\x96\x61\xb0\x05\x8e\x17\xce\xfc\x2f\xba\x83\xf4\x79\x6a\x4b\xd7\x5c\x62\x19\x72\x02\x27\x47\xff\x91\x21\x3c\x0c\xe2\x80\x9b\x15\xca\x2d\x1e\x8c\xbd\xd4\xac\xdb\x84\x61\x0e\xc1\xfb\x7c\xfb\x4b\xbc\x9b\x10\x66\x1d\xdf\x5d\x2b\x1f\xce\xcb\xa4\xbc\x75\xfb\xbe\x5d\xbf\x65\x66\x9c\xa8\x7b\xaa\xe6\x38\x6d\x12\xdf\xdb\x92\x39\x59\x4e\x69\x2d\x74\xdc\xf9\x6f\x2f\xd2\xca\x3c\xcf\x87\xbf\xdf\xbf\xf9\xed\xfc\x9f\xf1\xd4\x1e\x68\x75\x43\xe8\xe6\x83\xb1\x59\x5a\xe8\x8c\x0f\x97\x53\xe3\xf4\xe2\x70\x80\xec\x5a\x79\x76\x36\x5c\xdf\x8d\x25\x96\x4e\x18\x59\x76\x42\x3f\x85\xbf\xe2\x45\x9e\x5a\x85\x47\xdc\xbf\xe8\xd4\x4a\xe6\x70\xbc\xee\x2e\x64\x0a\xfd\xcb\x2a\x93\x2c\x98\x4c\x27\xed\x7d\xa0\x26\x4c\x97\x3f\xdd\xd4\x1c\x72\xe2\xc9\x78\xea\xaa\x84\x51\x2b\xe6\xe4\x5c\x43\xa4\x0a\x74\x31\x1c\x47\x27\x9b\x70\x1d\x61\x09\xa1\x31\x05\xba\xa3\x18\x3b\xd4\xc2\xab\x2d\x06\xca\x49\x5d\x06\xae\x47\x71\x3e\xaa\xc9\xde\x39\x6a\x96\x85\x72\x97\xd3\xf8\xf3\x9b\xfe\x72\x73\x00\x27\x5c\x5e\x9e\x02\x27\xdc\x08\x76\xa8\x76\x52\x27\x14\x7c\x26\x74\xa7\xd6\x73\x70\xfb\xc8\xb1\x0c\x9c\x5e\xff\xa6\x12\xea\xa4\x01\xc8\x2f\x3a\x0d\x9d\xd4\x70\x3d\x7b\x32\x1c\xc8\xad\x64\x67\x19\x50\x34\xe1\xe6\x8e\x71\xe2\x89\xad\xfc\xd1\x01\x3c\xc5\xaa\x9d\x7d\xed\x64\x5b\x3c\x31\xea\xba\x15\xad\x2e\x5e\xb5\xf8\xc7\x06\xf7\xa0\x8a\x1f\x7b\xb1\x27\xe8\x4c\x62\x15\xab\x10\xbe\x71\x38\xba\x05\x38\xb1\x57\x78\xbd\x9f\xf5\xf2\x34\x6a\x57\x5d\xb7\x06\xe5\xa1\x14\x14\x46\xb1\x35\x7a\x0f\x42\x4a\xa4\xd8\xd1\x4b\x8c\x77\x68\x2f\xba\x3b\x9b\xfb\x95\xd0\x84\xf7\xe7\x67\x87\xc3\xac\x0b\xc4\x6d\x3b\xc3\x4f\xc5\xa2\x53\x1a\xe4\x1f\xd6\xc3\x69\xb1\x13\x71\x22\xef\x1a\xe9\xa3\xbd\xbb\x70\x9c\x67\x8a\xd7\x78\xa0\xbd\x91\xb0\xb4\x76\xb3\x41\xac\x39\xeb\x7b\x53\x27\x6b\xe5\x27\x53\xa8\x50\x30\xe0\xdc\xd0\x40\x84\x33\x76\x5b\x08\x4d\x4d\xde\xa1\xa8\xfa\x8a\x38\x3f\x32\x8c\x55\xcf\xc8\x0b\x8f\x0b\x6e\x30\x8f\xe6\x8d\xc1\x3f\x7c\x97\x3c\xc9\xc4\x13\x06\x26\xdd\x1e\x93\x6e\x1e\x25\x4a\x5e\x60\xb6\xce\xa6\xf0\x1f\x64\x66\xf9\x4a\xdb\xa6\x38\xcf\xc2\x05\x91\xb7\x1b\x3e\x9f\x10\xd4\xc2\x79\x25\x1b\x2d\x5c\x17\x8c\x56\xcb\xf1\x28\x6d\x77\x5d\xec\x88\xfb\xa8\x64\x5d\xd9\x8e\xf5\x66\x3b\xeb\x36\xd4\x1f\x36\x8f\x96\x85\x8d\x16\x62\x29\x2f\xbf\xb9\x7a\xf8\x7f\xea\xf0\x9b\x98\x7d\x5d\x57\xea\xef\xaa\xad\x79\x22\x35\x3e\xb4\xd2\xd7\x83\xf0\x51\x86\x74\xfa\x66\x83\xbe\x45\xe0\x81\x8f\x67\xcb\xa9\x25\x61\xe3\x47\x52\xe7\x0e\xdd\xf6\xc4\x57\x0c\x3e\x10\x0c\x0c\x88\x6b\xf5\x87\x74\x14\x8b\x0d\x8f\xb1\x98\x65\x84\x3e\xf9\x34\xf2\x3c\xf9\xba\x92\x7c\x26\xe1\xe0\x84\xab\xbb\x40\xca\xb3\x91\x97\x5a\x91\x47\x33\x6b\x4d\x58\xe4\x57\x17\x57\x97\x3d\x48\xb7\xb8\x56\xe4\xdd\xfe\xb5\x22\x86\xf8\x4e\x0a\x13\xd2\xf5\x08\x29\xd7\x8a\xcd\x8a\x28\x37\xa3\x56\x30\x75\xbb\xed\x8d\x2f\x8b\x42\xc5\x4b\x16\x1e\xde\x2f\x99\xbc\x8f\x60\x1c\xde\x0f\xfc\xed\x70\x00\x17\xa8\xc0\x17\x56\xcf\xc2\x77\xaf\x51\x3f\x1d\x7e\xeb\x36\xf8\xb5\x6e\xd5\xbf\xfe\x78\xd7\x11\x2f\x9a\xb6\x07\xa2\xc6\xb5\x34\x0c\x4c\x61\x3d\x81\x0d\xc2\x50\x89\x7d\xb8\x9c\xd2\xdb\xe1\x8a\xd2\x90\xb6\x76\xd3\xd4\xa0\x88\x1a\x24\xb0\x06\xc8\x56\x08\xef\xfb\xaf\x45\xac\xbd\xa9\x69\xb8\x81\x2c\x0c\x75\xf7\x5f\x93\x8f\xd6\xe0\x24\x7d\xf3\x2a\x18\x90\xde\x41\xc6\xcd\x69\x7c\x2d\xd9\x1d\x6c\x82\x7d\xa3\x37\xfd\x99\x6b\x72\x39\x39\xfb\x5f\x00\x00\x00\xff\xff\x57\x93\x75\x50\x61\x1c\x00\x00"),
 		},
 		"/flux-secret.yaml.tmpl": &vfsgen۰CompressedFileInfo{
 			name:             "flux-secret.yaml.tmpl",
diff --git a/pkg/install/templates/flux-deployment.yaml.tmpl b/pkg/install/templates/flux-deployment.yaml.tmpl
index 4d8a4357..69e33db0 100644
--- a/pkg/install/templates/flux-deployment.yaml.tmpl
+++ b/pkg/install/templates/flux-deployment.yaml.tmpl
@@ -66,7 +66,7 @@ spec:
         # There are no ":latest" images for flux. Find the most recent
         # release or image version at https://hub.docker.com/r/fluxcd/flux/tags
         # and replace the tag here.
-        image: docker.io/fluxcd/flux:1.20.0
+        image: docker.io/fluxcd/flux:1.20.1
         imagePullPolicy: IfNotPresent
         resources:
           requests:
diff --git a/pkg/update/automated.go b/pkg/update/automated.go
index e4bc129e..5a093e1c 100644
--- a/pkg/update/automated.go
+++ b/pkg/update/automated.go
@@ -69,19 +69,10 @@ func (a *Automated) CommitMessage(result Result) string {
 		fmt.Fprintf(buf, "Auto-release %s", images[0])
 
 	default:
-		limit := 10
-
 		fmt.Fprintf(buf, "Auto-release multiple (%d) images\n\n", total)
-		if total > limit {
-			// Take first 10 images to keep commit message size in bounds
-			images = images[:limit]
-		}
 		for _, im := range images {
 			fmt.Fprintf(buf, " - %s\n", im)
 		}
-		if total > limit {
-			fmt.Fprintln(buf, "   ...")
-		}
 	}
 	return buf.String()
 }


Test patch:
diff --git a/pkg/cluster/kubernetes/resource/load_test.go b/pkg/cluster/kubernetes/resource/load_test.go
index 409388bc..5c55be56 100644
--- a/pkg/cluster/kubernetes/resource/load_test.go
+++ b/pkg/cluster/kubernetes/resource/load_test.go
@@ -362,3 +362,15 @@ func TestLoadSomeWithSopsAllEncrypted(t *testing.T) {
 		assert.NotNil(t, objs[expected.String()], "expected to find %s in manifest map after decryption", expected)
 	}
 }
+
+func TestNoPanic(t *testing.T) {
+	dir, cleanup := testfiles.TempDir(t)
+	defer cleanup()
+	if err := testfiles.WriteTestFiles(dir, testfiles.Files); err != nil {
+		t.Fatal(err)
+	}
+	_, err := Load(dir, []string{filepath.Join(dir, "doesnotexist")}, true)
+	if err == nil {
+		t.Error("expected error (but not panic) when loading from directory that doesn't exist")
+	}
+}
diff --git a/pkg/update/automated_test.go b/pkg/update/automated_test.go
index 740eab6e..501c3b0a 100644
--- a/pkg/update/automated_test.go
+++ b/pkg/update/automated_test.go
@@ -7,32 +7,6 @@ import (
 )
 
 func TestCommitMessage(t *testing.T) {
-	automated := Automated{}
-	result := Result{
-		resource.MakeID("ns", "kind", "1"): {
-			Status: ReleaseStatusSuccess,
-			PerContainer: []ContainerUpdate{
-				{Target: mustParseRef("docker.io/image:v1")},
-				{Target: mustParseRef("docker.io/image:v2")},
-				{Target: mustParseRef("docker.io/image:v3")},
-			},
-		},
-	}
-	result.ChangedImages()
-
-	actual := automated.CommitMessage(result)
-	expected := `Auto-release multiple (3) images
-
- - docker.io/image:v1
- - docker.io/image:v2
- - docker.io/image:v3
-`
-	if actual != expected {
-		t.Fatalf("Expected git commit message: '%s', was '%s'", expected, actual)
-	}
-}
-
-func TestCommitMessage10Max(t *testing.T) {
 	automated := Automated{}
 	result := Result{
 		resource.MakeID("ns", "kind", "1"): {
@@ -67,7 +41,7 @@ func TestCommitMessage10Max(t *testing.T) {
  - docker.io/image:v6
  - docker.io/image:v7
  - docker.io/image:v8
-   ...
+ - docker.io/image:v9
 `
 	if actual != expected {
 		t.Fatalf("Expected git commit message: '%s', was '%s'", expected, actual)