From e549c247656a7bb2e5ab26aa6e5b4c4bb3faa4bc Mon Sep 17 00:00:00 2001 From: Alex Eftimie Date: Fri, 2 Dec 2022 14:16:25 +0100 Subject: [PATCH 01/22] feat: values can be either a string or a map Signed-off-by: Alex Eftimie --- cmd/argocd/commands/app.go | 4 +- cmd/argocd/commands/app_test.go | 7 +- cmd/util/app.go | 2 +- manifests/core-install.yaml | 81 ++++++++++++------- manifests/crds/application-crd.yaml | 18 +++-- manifests/crds/applicationset-crd.yaml | 63 ++++++++++----- manifests/ha/install.yaml | 81 ++++++++++++------- manifests/install.yaml | 81 ++++++++++++------- pkg/apis/application/v1alpha1/generated.proto | 4 +- .../application/v1alpha1/openapi_generated.go | 10 ++- pkg/apis/application/v1alpha1/types.go | 32 +++++++- .../v1alpha1/zz_generated.deepcopy.go | 5 ++ reposerver/repository/repository.go | 4 +- reposerver/repository/repository_test.go | 20 ++--- test/e2e/helm_test.go | 4 +- 15 files changed, 282 insertions(+), 134 deletions(-) diff --git a/cmd/argocd/commands/app.go b/cmd/argocd/commands/app.go index 79c89cdc2d57d..bc12d2b76e0e7 100644 --- a/cmd/argocd/commands/app.go +++ b/cmd/argocd/commands/app.go @@ -794,8 +794,8 @@ func unset(source *argoappv1.ApplicationSource, opts unsetOpts) (updated bool, n } } } - if opts.valuesLiteral && source.Helm.Values != "" { - source.Helm.Values = "" + if opts.valuesLiteral && !source.Helm.ValuesIsEmpty() { + source.Helm.SetValuesString("") updated = true } for _, valuesFile := range opts.valuesFiles { diff --git a/cmd/argocd/commands/app_test.go b/cmd/argocd/commands/app_test.go index 808efa5ad57da..cf10dab7bce1b 100644 --- a/cmd/argocd/commands/app_test.go +++ b/cmd/argocd/commands/app_test.go @@ -16,6 +16,7 @@ import ( "github.com/stretchr/testify/assert" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/intstr" ) @@ -778,7 +779,7 @@ func Test_unset(t *testing.T) { }, }, PassCredentials: true, - Values: "some: yaml", + Values: &runtime.RawExtension{Raw: []byte("some: yaml")}, ValueFiles: []string{ "values-1.yaml", "values-2.yaml", @@ -864,9 +865,9 @@ func Test_unset(t *testing.T) { assert.False(t, updated) assert.False(t, nothingToUnset) - assert.Equal(t, "some: yaml", helmSource.Helm.Values) + assert.Equal(t, "some: yaml", helmSource.Helm.ValuesString()) updated, nothingToUnset = unset(helmSource, unsetOpts{valuesLiteral: true}) - assert.Equal(t, "", helmSource.Helm.Values) + assert.Equal(t, "", helmSource.Helm.ValuesString()) assert.True(t, updated) assert.False(t, nothingToUnset) updated, nothingToUnset = unset(helmSource, unsetOpts{valuesLiteral: true}) diff --git a/cmd/util/app.go b/cmd/util/app.go index d501a599a81e4..4ced468a0034f 100644 --- a/cmd/util/app.go +++ b/cmd/util/app.go @@ -427,7 +427,7 @@ func setHelmOpt(src *argoappv1.ApplicationSource, opts helmOpts) { src.Helm.IgnoreMissingValueFiles = opts.ignoreMissingValueFiles } if len(opts.values) > 0 { - src.Helm.Values = opts.values + src.Helm.SetValuesString(opts.values) } if opts.releaseName != "" { src.Helm.ReleaseName = opts.releaseName diff --git a/manifests/core-install.yaml b/manifests/core-install.yaml index 0352d6b068cd5..76704ba50be0f 100644 --- a/manifests/core-install.yaml +++ b/manifests/core-install.yaml @@ -288,7 +288,8 @@ spec: values: description: Values specifies Helm values to be passed to helm template, typically defined as a block - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -983,7 +984,8 @@ spec: values: description: Values specifies Helm values to be passed to helm template, typically defined as a block - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -1695,7 +1697,8 @@ spec: values: description: Values specifies Helm values to be passed to helm template, typically defined as a block - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -2426,7 +2429,8 @@ spec: description: Values specifies Helm values to be passed to helm template, typically defined as a block - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -3161,7 +3165,8 @@ spec: values: description: Values specifies Helm values to be passed to helm template, typically defined as a block - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -3874,7 +3879,8 @@ spec: values: description: Values specifies Helm values to be passed to helm template, typically defined as a block - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -4587,7 +4593,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -5100,7 +5107,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -5617,7 +5625,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -6114,7 +6123,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -6635,7 +6645,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -7148,7 +7159,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -7665,7 +7677,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -8162,7 +8175,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -9280,7 +9294,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -9956,7 +9971,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -10467,7 +10483,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -10988,7 +11005,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -11501,7 +11519,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -12018,7 +12037,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -12515,7 +12535,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -13633,7 +13654,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -14309,7 +14331,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -14824,7 +14847,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -15939,7 +15963,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -16615,7 +16640,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -17175,7 +17201,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object diff --git a/manifests/crds/application-crd.yaml b/manifests/crds/application-crd.yaml index 1351a6631c9aa..e561566dcf57e 100644 --- a/manifests/crds/application-crd.yaml +++ b/manifests/crds/application-crd.yaml @@ -287,7 +287,8 @@ spec: values: description: Values specifies Helm values to be passed to helm template, typically defined as a block - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -982,7 +983,8 @@ spec: values: description: Values specifies Helm values to be passed to helm template, typically defined as a block - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -1694,7 +1696,8 @@ spec: values: description: Values specifies Helm values to be passed to helm template, typically defined as a block - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -2425,7 +2428,8 @@ spec: description: Values specifies Helm values to be passed to helm template, typically defined as a block - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -3160,7 +3164,8 @@ spec: values: description: Values specifies Helm values to be passed to helm template, typically defined as a block - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -3873,7 +3878,8 @@ spec: values: description: Values specifies Helm values to be passed to helm template, typically defined as a block - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") diff --git a/manifests/crds/applicationset-crd.yaml b/manifests/crds/applicationset-crd.yaml index 5c88df5dcac2b..aed8788e3829e 100644 --- a/manifests/crds/applicationset-crd.yaml +++ b/manifests/crds/applicationset-crd.yaml @@ -223,7 +223,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -736,7 +737,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -1253,7 +1255,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -1750,7 +1753,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -2271,7 +2275,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -2784,7 +2789,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -3301,7 +3307,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -3798,7 +3805,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -4916,7 +4924,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -5592,7 +5601,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -6103,7 +6113,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -6624,7 +6635,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -7137,7 +7149,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -7654,7 +7667,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -8151,7 +8165,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -9269,7 +9284,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -9945,7 +9961,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -10460,7 +10477,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -11575,7 +11593,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -12251,7 +12270,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -12811,7 +12831,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object diff --git a/manifests/ha/install.yaml b/manifests/ha/install.yaml index e8afa2dd2b17a..702e8522034c9 100644 --- a/manifests/ha/install.yaml +++ b/manifests/ha/install.yaml @@ -288,7 +288,8 @@ spec: values: description: Values specifies Helm values to be passed to helm template, typically defined as a block - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -983,7 +984,8 @@ spec: values: description: Values specifies Helm values to be passed to helm template, typically defined as a block - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -1695,7 +1697,8 @@ spec: values: description: Values specifies Helm values to be passed to helm template, typically defined as a block - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -2426,7 +2429,8 @@ spec: description: Values specifies Helm values to be passed to helm template, typically defined as a block - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -3161,7 +3165,8 @@ spec: values: description: Values specifies Helm values to be passed to helm template, typically defined as a block - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -3874,7 +3879,8 @@ spec: values: description: Values specifies Helm values to be passed to helm template, typically defined as a block - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -4587,7 +4593,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -5100,7 +5107,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -5617,7 +5625,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -6114,7 +6123,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -6635,7 +6645,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -7148,7 +7159,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -7665,7 +7677,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -8162,7 +8175,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -9280,7 +9294,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -9956,7 +9971,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -10467,7 +10483,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -10988,7 +11005,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -11501,7 +11519,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -12018,7 +12037,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -12515,7 +12535,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -13633,7 +13654,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -14309,7 +14331,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -14824,7 +14847,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -15939,7 +15963,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -16615,7 +16640,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -17175,7 +17201,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object diff --git a/manifests/install.yaml b/manifests/install.yaml index abee52d790b54..49e2c93ef5e68 100644 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -288,7 +288,8 @@ spec: values: description: Values specifies Helm values to be passed to helm template, typically defined as a block - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -983,7 +984,8 @@ spec: values: description: Values specifies Helm values to be passed to helm template, typically defined as a block - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -1695,7 +1697,8 @@ spec: values: description: Values specifies Helm values to be passed to helm template, typically defined as a block - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -2426,7 +2429,8 @@ spec: description: Values specifies Helm values to be passed to helm template, typically defined as a block - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -3161,7 +3165,8 @@ spec: values: description: Values specifies Helm values to be passed to helm template, typically defined as a block - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -3874,7 +3879,8 @@ spec: values: description: Values specifies Helm values to be passed to helm template, typically defined as a block - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -4587,7 +4593,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -5100,7 +5107,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -5617,7 +5625,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -6114,7 +6123,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -6635,7 +6645,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -7148,7 +7159,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -7665,7 +7677,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -8162,7 +8175,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -9280,7 +9294,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -9956,7 +9971,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -10467,7 +10483,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -10988,7 +11005,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -11501,7 +11519,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -12018,7 +12037,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -12515,7 +12535,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -13633,7 +13654,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -14309,7 +14331,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -14824,7 +14847,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -15939,7 +15963,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -16615,7 +16640,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -17175,7 +17201,8 @@ spec: type: string type: array values: - type: string + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object diff --git a/pkg/apis/application/v1alpha1/generated.proto b/pkg/apis/application/v1alpha1/generated.proto index 17802a88d2ddc..022249cd6a033 100644 --- a/pkg/apis/application/v1alpha1/generated.proto +++ b/pkg/apis/application/v1alpha1/generated.proto @@ -421,7 +421,9 @@ message ApplicationSourceHelm { optional string releaseName = 3; // Values specifies Helm values to be passed to helm template, typically defined as a block - optional string values = 4; + // +kubebuilder:pruning:PreserveUnknownFields + // +patchStrategy=replace + optional k8s.io.apimachinery.pkg.runtime.RawExtension values = 4; // FileParameters are file parameters to the helm template repeated HelmFileParameter fileParameters = 5; diff --git a/pkg/apis/application/v1alpha1/openapi_generated.go b/pkg/apis/application/v1alpha1/openapi_generated.go index d2254caf0214d..781fcb43c0687 100644 --- a/pkg/apis/application/v1alpha1/openapi_generated.go +++ b/pkg/apis/application/v1alpha1/openapi_generated.go @@ -1596,10 +1596,14 @@ func schema_pkg_apis_application_v1alpha1_ApplicationSourceHelm(ref common.Refer }, }, "values": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-patch-strategy": "replace", + }, + }, SchemaProps: spec.SchemaProps{ Description: "Values specifies Helm values to be passed to helm template, typically defined as a block", - Type: []string{"string"}, - Format: "", + Ref: ref("k8s.io/apimachinery/pkg/runtime.RawExtension"), }, }, "fileParameters": { @@ -1648,7 +1652,7 @@ func schema_pkg_apis_application_v1alpha1_ApplicationSourceHelm(ref common.Refer }, }, Dependencies: []string{ - "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.HelmFileParameter", "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.HelmParameter"}, + "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.HelmFileParameter", "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.HelmParameter", "k8s.io/apimachinery/pkg/runtime.RawExtension"}, } } diff --git a/pkg/apis/application/v1alpha1/types.go b/pkg/apis/application/v1alpha1/types.go index 15d090f458a9f..cf3c6c2557761 100644 --- a/pkg/apis/application/v1alpha1/types.go +++ b/pkg/apis/application/v1alpha1/types.go @@ -25,6 +25,7 @@ import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/intstr" utilnet "k8s.io/apimachinery/pkg/util/net" @@ -299,7 +300,9 @@ type ApplicationSourceHelm struct { // ReleaseName is the Helm release name to use. If omitted it will use the application name ReleaseName string `json:"releaseName,omitempty" protobuf:"bytes,3,opt,name=releaseName"` // Values specifies Helm values to be passed to helm template, typically defined as a block - Values string `json:"values,omitempty" protobuf:"bytes,4,opt,name=values"` + // +kubebuilder:pruning:PreserveUnknownFields + // +patchStrategy=replace + Values *runtime.RawExtension `json:"values,omitempty" patchStrategy:"replace" protobuf:"bytes,4,opt,name=values"` // FileParameters are file parameters to the helm template FileParameters []HelmFileParameter `json:"fileParameters,omitempty" protobuf:"bytes,5,opt,name=fileParameters"` // Version is the Helm version to use for templating ("3") @@ -391,7 +394,32 @@ func (in *ApplicationSourceHelm) AddFileParameter(p HelmFileParameter) { // IsZero Returns true if the Helm options in an application source are considered zero func (h *ApplicationSourceHelm) IsZero() bool { - return h == nil || (h.Version == "") && (h.ReleaseName == "") && len(h.ValueFiles) == 0 && len(h.Parameters) == 0 && len(h.FileParameters) == 0 && h.Values == "" && !h.PassCredentials && !h.IgnoreMissingValueFiles && !h.SkipCrds + return h == nil || (h.Version == "") && (h.ReleaseName == "") && len(h.ValueFiles) == 0 && len(h.Parameters) == 0 && len(h.FileParameters) == 0 && h.ValuesIsEmpty() && !h.PassCredentials && !h.IgnoreMissingValueFiles && !h.SkipCrds +} + +func (h *ApplicationSourceHelm) SetValuesString(value string) error { + h.Values = &runtime.RawExtension{Raw: []byte(value)} + return nil +} + +func (h *ApplicationSourceHelm) ValuesYAML() []byte { + if h.Values == nil { + return []byte{} + } + b, err := yaml.JSONToYAML(h.Values.Raw) + if err != nil { + // This should be impossible, because rawValue isn't set directly. + return []byte{} + } + return b +} + +func (h *ApplicationSourceHelm) ValuesIsEmpty() bool { + return len(h.ValuesYAML()) == 0 +} + +func (h *ApplicationSourceHelm) ValuesString() string { + return string(h.ValuesYAML()) } // KustomizeImage represents a Kustomize image definition in the format [old_image_name=]: diff --git a/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go index 4d7438d6d2677..0bfc882ce2f25 100644 --- a/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go @@ -945,6 +945,11 @@ func (in *ApplicationSourceHelm) DeepCopyInto(out *ApplicationSourceHelm) { *out = make([]HelmParameter, len(*in)) copy(*out, *in) } + if in.Values != nil { + in, out := &in.Values, &out.Values + *out = new(runtime.RawExtension) + (*in).DeepCopyInto(*out) + } if in.FileParameters != nil { in, out := &in.FileParameters, &out.FileParameters *out = make([]HelmFileParameter, len(*in)) diff --git a/reposerver/repository/repository.go b/reposerver/repository/repository.go index 0937ff10d3667..3555b8e859441 100644 --- a/reposerver/repository/repository.go +++ b/reposerver/repository/repository.go @@ -1090,7 +1090,7 @@ func helmTemplate(appPath string, repoRoot string, env *v1alpha1.Env, q *apiclie templateOpts.Values = resolvedValueFiles - if appHelm.Values != "" { + if !appHelm.ValuesIsEmpty() { rand, err := uuid.NewRandom() if err != nil { return nil, err @@ -1102,7 +1102,7 @@ func helmTemplate(appPath string, repoRoot string, env *v1alpha1.Env, q *apiclie _ = os.RemoveAll(p) } }() - err = os.WriteFile(p, []byte(appHelm.Values), 0644) + err = os.WriteFile(p, appHelm.ValuesYAML(), 0644) if err != nil { return nil, err } diff --git a/reposerver/repository/repository_test.go b/reposerver/repository/repository_test.go index 0e53aa837d3ad..6782c2a19b11f 100644 --- a/reposerver/repository/repository_test.go +++ b/reposerver/repository/repository_test.go @@ -814,7 +814,7 @@ func TestGenerateHelmWithValues(t *testing.T) { Path: ".", Helm: &argoappv1.ApplicationSourceHelm{ ValueFiles: []string{"values-production.yaml"}, - Values: `cluster: {slaveCount: 2}`, + Values: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, }, }, ProjectName: "something", @@ -915,7 +915,7 @@ func TestGenerateHelmWithValuesDirectoryTraversal(t *testing.T) { Path: "./redis", Helm: &argoappv1.ApplicationSourceHelm{ ValueFiles: []string{"../minio/values.yaml"}, - Values: `cluster: {slaveCount: 2}`, + Values: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, }, }, ProjectName: "something", @@ -1017,7 +1017,7 @@ func TestGenerateHelmWithURL(t *testing.T) { Path: ".", Helm: &argoappv1.ApplicationSourceHelm{ ValueFiles: []string{"https://raw.githubusercontent.com/argoproj/argocd-example-apps/master/helm-guestbook/values.yaml"}, - Values: `cluster: {slaveCount: 2}`, + Values: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, }, }, ProjectName: "something", @@ -1039,7 +1039,7 @@ func TestGenerateHelmWithValuesDirectoryTraversalOutsideRepo(t *testing.T) { Path: ".", Helm: &argoappv1.ApplicationSourceHelm{ ValueFiles: []string{"../minio/values.yaml"}, - Values: `cluster: {slaveCount: 2}`, + Values: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, }, }, ProjectName: "something", @@ -1058,7 +1058,7 @@ func TestGenerateHelmWithValuesDirectoryTraversalOutsideRepo(t *testing.T) { Path: "./my-chart", Helm: &argoappv1.ApplicationSourceHelm{ ValueFiles: []string{"../my-chart/my-chart-values.yaml"}, - Values: `cluster: {slaveCount: 2}`, + Values: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, }, }, ProjectName: "something", @@ -1076,7 +1076,7 @@ func TestGenerateHelmWithValuesDirectoryTraversalOutsideRepo(t *testing.T) { Path: "./my-chart", Helm: &argoappv1.ApplicationSourceHelm{ ValueFiles: []string{"/my-chart/my-chart-values.yaml"}, - Values: `cluster: {slaveCount: 2}`, + Values: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, }, }, ProjectName: "something", @@ -1094,7 +1094,7 @@ func TestGenerateHelmWithValuesDirectoryTraversalOutsideRepo(t *testing.T) { Path: "./my-chart", Helm: &argoappv1.ApplicationSourceHelm{ ValueFiles: []string{"/../../../my-chart-values.yaml"}, - Values: `cluster: {slaveCount: 2}`, + Values: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, }, }, ProjectName: "something", @@ -1113,7 +1113,7 @@ func TestGenerateHelmWithValuesDirectoryTraversalOutsideRepo(t *testing.T) { Path: "./my-chart", Helm: &argoappv1.ApplicationSourceHelm{ ValueFiles: []string{"file://../../../../my-chart-values.yaml"}, - Values: `cluster: {slaveCount: 2}`, + Values: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, }, }, ProjectName: "something", @@ -1168,7 +1168,7 @@ func TestGenerateHelmWithAbsoluteFileParameter(t *testing.T) { Path: "./util/helm/testdata/redis", Helm: &argoappv1.ApplicationSourceHelm{ ValueFiles: []string{"values-production.yaml"}, - Values: `cluster: {slaveCount: 2}`, + Values: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, FileParameters: []argoappv1.HelmFileParameter{{ Name: "passwordContent", Path: externalSecretPath, @@ -1195,7 +1195,7 @@ func TestGenerateHelmWithFileParameter(t *testing.T) { Path: "./redis", Helm: &argoappv1.ApplicationSourceHelm{ ValueFiles: []string{"values-production.yaml"}, - Values: `cluster: {slaveCount: 2}`, + Values: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, FileParameters: []argoappv1.HelmFileParameter{ argoappv1.HelmFileParameter{ Name: "passwordContent", diff --git a/test/e2e/helm_test.go b/test/e2e/helm_test.go index 953d208a1af9e..156540c92ce4a 100644 --- a/test/e2e/helm_test.go +++ b/test/e2e/helm_test.go @@ -201,7 +201,7 @@ func TestHelmValuesLiteralFileLocal(t *testing.T) { if err != nil { panic(err) } - assert.Equal(t, string(data), app.Spec.GetSource().Helm.Values) + assert.Equal(t, string(data), app.Spec.GetSource().Helm.ValuesString()) }). When(). AppUnSet("--values-literal"). @@ -243,7 +243,7 @@ func TestHelmValuesLiteralFileRemote(t *testing.T) { AppSet("--values-literal-file", "http://"+address). Then(). And(func(app *Application) { - assert.Equal(t, "a: b", app.Spec.GetSource().Helm.Values) + assert.Equal(t, "a: b", app.Spec.GetSource().Helm.ValuesString()) }). When(). AppUnSet("--values-literal"). From e54182e6cd3086a4e2ddd8b55195fa6d5be2510f Mon Sep 17 00:00:00 2001 From: Alex Eftimie Date: Fri, 2 Dec 2022 14:56:59 +0100 Subject: [PATCH 02/22] Allow viewing and editing values Signed-off-by: Alex Eftimie --- .../application-parameters.tsx | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/ui/src/app/applications/components/application-parameters/application-parameters.tsx b/ui/src/app/applications/components/application-parameters/application-parameters.tsx index 819f063d31d4a..5e3262e742f57 100644 --- a/ui/src/app/applications/components/application-parameters/application-parameters.tsx +++ b/ui/src/app/applications/components/application-parameters/application-parameters.tsx @@ -24,6 +24,9 @@ import * as kustomize from './kustomize-image'; import {VarsInputField} from './vars-input-field'; import {concatMaps} from '../../../shared/utils'; import {getAppDefaultSource} from '../utils'; +import * as jsYaml from 'js-yaml'; + +let isValuesRaw = false; const TextWithMetadataField = ReactFormField((props: {metadata: {value: string}; fieldApi: FieldApi; className: string}) => { const { @@ -130,6 +133,12 @@ export const ApplicationParameters = (props: { const [removedOverrides, setRemovedOverrides] = React.useState(new Array()); let attributes: EditablePanelItem[] = []; + let appValues: string; + if (app && app.spec && app.spec.source && app.spec.source.helm && app.spec.source.helm.values) { + isValuesRaw = typeof app.spec.source.helm.values !== 'string'; // nolint + appValues = isValuesRaw ? jsYaml.safeDump(app.spec.source.helm.values) : app.spec.source.helm.values; + app.spec.source.helm.values = isValuesRaw ? jsYaml.safeDump(app.spec.source.helm.values) : app.spec.source.helm.values; + } const [appParamsDeletedState, setAppParamsDeletedState] = React.useState([]); if (props.details.type === 'Kustomize' && props.details.kustomize) { @@ -216,7 +225,7 @@ export const ApplicationParameters = (props: { title: 'VALUES', view: source.helm && ( -
{source.helm.values}
+
{appValues}
), edit: (formApi: FormApi) => ( @@ -518,7 +527,11 @@ export const ApplicationParameters = (props: { params = params.filter(param => !appParamsDeletedState.includes(param.name)); input.spec.source.plugin.parameters = params; } - + if (input.spec.source.helm && input.spec.source.helm.values) { + if (isValuesRaw) { + input.spec.source.helm.values = jsYaml.safeLoad(input.spec.source.helm.values); // Load values as json + } + } await props.save(input, {}); setRemovedOverrides(new Array()); }) From f0abe4d8917501dd7fe7cc508a9480cd506bed7e Mon Sep 17 00:00:00 2001 From: Alex Eftimie Date: Fri, 2 Dec 2022 15:27:47 +0100 Subject: [PATCH 03/22] fix golang lint Signed-off-by: Alex Eftimie --- cmd/argocd/commands/app.go | 6 ++++-- cmd/util/app.go | 5 ++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/cmd/argocd/commands/app.go b/cmd/argocd/commands/app.go index bc12d2b76e0e7..4585251b7a303 100644 --- a/cmd/argocd/commands/app.go +++ b/cmd/argocd/commands/app.go @@ -795,8 +795,10 @@ func unset(source *argoappv1.ApplicationSource, opts unsetOpts) (updated bool, n } } if opts.valuesLiteral && !source.Helm.ValuesIsEmpty() { - source.Helm.SetValuesString("") - updated = true + err := source.Helm.SetValuesString("") + if err == nil { + updated = true + } } for _, valuesFile := range opts.valuesFiles { specValueFiles := source.Helm.ValueFiles diff --git a/cmd/util/app.go b/cmd/util/app.go index 4ced468a0034f..b7dbf49c7690e 100644 --- a/cmd/util/app.go +++ b/cmd/util/app.go @@ -427,7 +427,10 @@ func setHelmOpt(src *argoappv1.ApplicationSource, opts helmOpts) { src.Helm.IgnoreMissingValueFiles = opts.ignoreMissingValueFiles } if len(opts.values) > 0 { - src.Helm.SetValuesString(opts.values) + err := src.Helm.SetValuesString(opts.values) + if err != nil { + log.Fatal(err) + } } if opts.releaseName != "" { src.Helm.ReleaseName = opts.releaseName From fb0df5a167bf97acd2f256a2e67a7a876be2642c Mon Sep 17 00:00:00 2001 From: Alex Eftimie Date: Fri, 2 Dec 2022 15:40:46 +0100 Subject: [PATCH 04/22] fix codegen make build green Signed-off-by: Alex Eftimie --- assets/swagger.json | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/assets/swagger.json b/assets/swagger.json index 1426ed3f713cd..76d60b4cef725 100644 --- a/assets/swagger.json +++ b/assets/swagger.json @@ -4952,6 +4952,17 @@ } } }, + "runtimeRawExtension": { + "description": "RawExtension is used to hold extensions in external versions.\n\nTo use this, make a field which has RawExtension as its type in your external, versioned\nstruct, and Object in your internal struct. You also need to register your\nvarious plugin types.\n\n// Internal package:\ntype MyAPIObject struct {\n\truntime.TypeMeta `json:\",inline\"`\n\tMyPlugin runtime.Object `json:\"myPlugin\"`\n}\ntype PluginA struct {\n\tAOption string `json:\"aOption\"`\n}\n\n// External package:\ntype MyAPIObject struct {\n\truntime.TypeMeta `json:\",inline\"`\n\tMyPlugin runtime.RawExtension `json:\"myPlugin\"`\n}\ntype PluginA struct {\n\tAOption string `json:\"aOption\"`\n}\n\n// On the wire, the JSON will look something like this:\n{\n\t\"kind\":\"MyAPIObject\",\n\t\"apiVersion\":\"v1\",\n\t\"myPlugin\": {\n\t\t\"kind\":\"PluginA\",\n\t\t\"aOption\":\"foo\",\n\t},\n}\n\nSo what happens? Decode first uses json or yaml to unmarshal the serialized data into\nyour external MyAPIObject. That causes the raw JSON to be stored, but not unpacked.\nThe next step is to copy (using pkg/conversion) into the internal struct. The runtime\npackage's DefaultScheme has conversion functions installed which will unpack the\nJSON stored in RawExtension, turning it into the correct object type, and storing it\nin the Object. (TODO: In the case where the object is of an unknown type, a\nruntime.Unknown object will be created and stored.)\n\n+k8s:deepcopy-gen=true\n+protobuf=true\n+k8s:openapi-gen=true", + "type": "object", + "properties": { + "raw": { + "description": "Raw is the underlying serialization of this object.\n\nTODO: Determine how to detect ContentType and ContentEncoding of 'Raw' data.", + "type": "string", + "format": "byte" + } + } + }, "runtimeStreamError": { "type": "object", "properties": { @@ -6155,8 +6166,7 @@ } }, "values": { - "type": "string", - "title": "Values specifies Helm values to be passed to helm template, typically defined as a block" + "$ref": "#/definitions/runtimeRawExtension" }, "version": { "type": "string", From 138bf70f1eec91aca9850da208978b8ccec46367 Mon Sep 17 00:00:00 2001 From: Alex Eftimie Date: Sat, 3 Dec 2022 10:35:59 +0100 Subject: [PATCH 05/22] Add special cases for handling nil/empty string. strip newline at end of generated yaml. fix unittests Signed-off-by: Alex Eftimie --- pkg/apis/application/v1alpha1/types.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/pkg/apis/application/v1alpha1/types.go b/pkg/apis/application/v1alpha1/types.go index cf3c6c2557761..5f87f324fabf0 100644 --- a/pkg/apis/application/v1alpha1/types.go +++ b/pkg/apis/application/v1alpha1/types.go @@ -398,12 +398,16 @@ func (h *ApplicationSourceHelm) IsZero() bool { } func (h *ApplicationSourceHelm) SetValuesString(value string) error { - h.Values = &runtime.RawExtension{Raw: []byte(value)} + if value == "" { + h.Values = nil + } else { + h.Values = &runtime.RawExtension{Raw: []byte(value)} + } return nil } func (h *ApplicationSourceHelm) ValuesYAML() []byte { - if h.Values == nil { + if h.Values == nil || h.Values.Raw == nil { return []byte{} } b, err := yaml.JSONToYAML(h.Values.Raw) @@ -419,7 +423,10 @@ func (h *ApplicationSourceHelm) ValuesIsEmpty() bool { } func (h *ApplicationSourceHelm) ValuesString() string { - return string(h.ValuesYAML()) + if h.Values == nil || h.Values.Raw == nil { + return "" + } + return strings.TrimSuffix(string(h.ValuesYAML()), "\n") } // KustomizeImage represents a Kustomize image definition in the format [old_image_name=]: From ffd3c42c9482f0a850b52bcab34e412d75db83b6 Mon Sep 17 00:00:00 2001 From: Alex Eftimie Date: Sat, 3 Dec 2022 16:54:12 +0100 Subject: [PATCH 06/22] Add tests. Fix e2e marshalJSON Signed-off-by: Alex Eftimie --- pkg/apis/application/v1alpha1/types.go | 32 -------- pkg/apis/application/v1alpha1/values.go | 57 ++++++++++++++ pkg/apis/application/v1alpha1/values_test.go | 80 ++++++++++++++++++++ 3 files changed, 137 insertions(+), 32 deletions(-) create mode 100644 pkg/apis/application/v1alpha1/values.go create mode 100644 pkg/apis/application/v1alpha1/values_test.go diff --git a/pkg/apis/application/v1alpha1/types.go b/pkg/apis/application/v1alpha1/types.go index 5f87f324fabf0..02c6083751912 100644 --- a/pkg/apis/application/v1alpha1/types.go +++ b/pkg/apis/application/v1alpha1/types.go @@ -397,38 +397,6 @@ func (h *ApplicationSourceHelm) IsZero() bool { return h == nil || (h.Version == "") && (h.ReleaseName == "") && len(h.ValueFiles) == 0 && len(h.Parameters) == 0 && len(h.FileParameters) == 0 && h.ValuesIsEmpty() && !h.PassCredentials && !h.IgnoreMissingValueFiles && !h.SkipCrds } -func (h *ApplicationSourceHelm) SetValuesString(value string) error { - if value == "" { - h.Values = nil - } else { - h.Values = &runtime.RawExtension{Raw: []byte(value)} - } - return nil -} - -func (h *ApplicationSourceHelm) ValuesYAML() []byte { - if h.Values == nil || h.Values.Raw == nil { - return []byte{} - } - b, err := yaml.JSONToYAML(h.Values.Raw) - if err != nil { - // This should be impossible, because rawValue isn't set directly. - return []byte{} - } - return b -} - -func (h *ApplicationSourceHelm) ValuesIsEmpty() bool { - return len(h.ValuesYAML()) == 0 -} - -func (h *ApplicationSourceHelm) ValuesString() string { - if h.Values == nil || h.Values.Raw == nil { - return "" - } - return strings.TrimSuffix(string(h.ValuesYAML()), "\n") -} - // KustomizeImage represents a Kustomize image definition in the format [old_image_name=]: type KustomizeImage string diff --git a/pkg/apis/application/v1alpha1/values.go b/pkg/apis/application/v1alpha1/values.go new file mode 100644 index 0000000000000..57927cb14f63a --- /dev/null +++ b/pkg/apis/application/v1alpha1/values.go @@ -0,0 +1,57 @@ +package v1alpha1 + +import ( + "encoding/json" + "fmt" + reflect "reflect" + "strings" + + "github.com/ghodss/yaml" + runtime "k8s.io/apimachinery/pkg/runtime" +) + +func (h *ApplicationSourceHelm) SetValuesString(value string) error { + if value == "" { + h.Values = nil + } else { + data, err := yaml.YAMLToJSON([]byte(value)) + if err != nil { + return fmt.Errorf("failed converting yaml to json: %v", err) + } + var v interface{} + if err := json.Unmarshal(data, &v); err != nil { + return fmt.Errorf("failed to unmarshal json: %v", err) + } + switch v.(type) { + case string: + case map[string]interface{}: + default: + return fmt.Errorf("invalid type %q", reflect.TypeOf(v)) + } + h.Values = &runtime.RawExtension{Raw: data} + } + return nil +} + +func (h *ApplicationSourceHelm) ValuesYAML() []byte { + if h.Values == nil || h.Values.Raw == nil { + return []byte{} + } + b, err := yaml.JSONToYAML(h.Values.Raw) + if err != nil { + // This should be impossible, because rawValue isn't set directly. + return []byte{} + } + return b +} + +func (h *ApplicationSourceHelm) ValuesIsEmpty() bool { + return len(h.ValuesYAML()) == 0 +} + +func (h *ApplicationSourceHelm) ValuesString() string { + if h.Values == nil || h.Values.Raw == nil { + return "" + } + return strings.TrimSuffix(string(h.ValuesYAML()), "\n") +} diff --git a/pkg/apis/application/v1alpha1/values_test.go b/pkg/apis/application/v1alpha1/values_test.go new file mode 100644 index 0000000000000..efc8891c6ba50 --- /dev/null +++ b/pkg/apis/application/v1alpha1/values_test.go @@ -0,0 +1,80 @@ +package v1alpha1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestValues_SetString(t *testing.T) { + testCases := []struct { + name string + inputValue string + expectError bool + expectValue string + }{ + { + name: "an empty string should not throw an error", + inputValue: `""`, + expectValue: "\"\"", + }, + { + name: "a string with contents should not throw an error", + inputValue: `"hello"`, + expectValue: "hello", + }, + { + name: "an array should throw an error", + inputValue: "[]", + expectError: true, + }, + { + name: "a number should throw an error", + inputValue: "42", + expectError: true, + }, + { + name: "a boolean should throw an error", + inputValue: "false", + expectError: true, + }, + { + name: "null should throw an error", + inputValue: "null", + expectError: true, + }, + { + name: "an empty object should not throw an error", + inputValue: "{}", + expectValue: "{}", + }, + { + name: "an object with contents should not throw an error", + inputValue: `{"some": "inputValue"}`, + expectValue: "some: inputValue", + }, + { + name: "a complex object should not throw an error", + inputValue: `{"a": {"nested": "object"}, "an": ["array"], "bool": true, "number": 1, "some": "string"}`, + expectValue: "a:\n nested: object\nan:\n- array\nbool: true\nnumber: 1\nsome: string", + }, + } + + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + source := &ApplicationSourceHelm{} + err := source.SetValuesString(testCase.inputValue) + + if !testCase.expectError { + assert.Equal(t, testCase.expectValue, source.ValuesString()) + data, err := source.Values.MarshalJSON() + assert.NoError(t, err) + err = source.Values.UnmarshalJSON(data) + assert.NoError(t, err) + assert.Equal(t, testCase.expectValue, source.ValuesString()) + } else { + assert.Error(t, err) + } + }) + } +} From 3ee71459c9edb1859cc7957af3ffaf540705a192 Mon Sep 17 00:00:00 2001 From: Alex Eftimie Date: Sat, 3 Dec 2022 17:16:43 +0100 Subject: [PATCH 07/22] fix codegen. make codegen and make codegen-local give different results to me Signed-off-by: Alex Eftimie --- pkg/client/clientset/versioned/fake/register.go | 14 +++++++------- pkg/client/clientset/versioned/scheme/register.go | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/pkg/client/clientset/versioned/fake/register.go b/pkg/client/clientset/versioned/fake/register.go index 5773b75ce6df2..115e39faa197d 100644 --- a/pkg/client/clientset/versioned/fake/register.go +++ b/pkg/client/clientset/versioned/fake/register.go @@ -21,14 +21,14 @@ var localSchemeBuilder = runtime.SchemeBuilder{ // AddToScheme adds all types of this clientset into the given scheme. This allows composition // of clientsets, like in: // -// import ( -// "k8s.io/client-go/kubernetes" -// clientsetscheme "k8s.io/client-go/kubernetes/scheme" -// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" -// ) +// import ( +// "k8s.io/client-go/kubernetes" +// clientsetscheme "k8s.io/client-go/kubernetes/scheme" +// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" +// ) // -// kclientset, _ := kubernetes.NewForConfig(c) -// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) +// kclientset, _ := kubernetes.NewForConfig(c) +// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) // // After this, RawExtensions in Kubernetes types will serialize kube-aggregator types // correctly. diff --git a/pkg/client/clientset/versioned/scheme/register.go b/pkg/client/clientset/versioned/scheme/register.go index 46f64a49e41e1..a334cbed3235a 100644 --- a/pkg/client/clientset/versioned/scheme/register.go +++ b/pkg/client/clientset/versioned/scheme/register.go @@ -21,14 +21,14 @@ var localSchemeBuilder = runtime.SchemeBuilder{ // AddToScheme adds all types of this clientset into the given scheme. This allows composition // of clientsets, like in: // -// import ( -// "k8s.io/client-go/kubernetes" -// clientsetscheme "k8s.io/client-go/kubernetes/scheme" -// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" -// ) +// import ( +// "k8s.io/client-go/kubernetes" +// clientsetscheme "k8s.io/client-go/kubernetes/scheme" +// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" +// ) // -// kclientset, _ := kubernetes.NewForConfig(c) -// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) +// kclientset, _ := kubernetes.NewForConfig(c) +// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) // // After this, RawExtensions in Kubernetes types will serialize kube-aggregator types // correctly. From 8ad9df1aef299c9726ed8f5cb15c131ac788c505 Mon Sep 17 00:00:00 2001 From: Alex Eftimie Date: Sun, 4 Dec 2022 09:06:25 +0100 Subject: [PATCH 08/22] Update helm_test.go Signed-off-by: Alex Eftimie --- test/e2e/helm_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/e2e/helm_test.go b/test/e2e/helm_test.go index 156540c92ce4a..a8dc3a8332805 100644 --- a/test/e2e/helm_test.go +++ b/test/e2e/helm_test.go @@ -6,6 +6,7 @@ import ( "net" "net/http" "os" + "strings" "testing" "github.com/argoproj/gitops-engine/pkg/health" @@ -201,7 +202,7 @@ func TestHelmValuesLiteralFileLocal(t *testing.T) { if err != nil { panic(err) } - assert.Equal(t, string(data), app.Spec.GetSource().Helm.ValuesString()) + assert.Equal(t, strings.TrimSuffix(string(data), "\n"), app.Spec.GetSource().Helm.ValuesString()) }). When(). AppUnSet("--values-literal"). From 005d12e044226bafacecc78f9d0bef44a85685be Mon Sep 17 00:00:00 2001 From: Alex Eftimie Date: Wed, 7 Dec 2022 00:01:26 +0100 Subject: [PATCH 09/22] Fix UI - validate input Signed-off-by: Alex Eftimie --- .../application-parameters/application-parameters.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ui/src/app/applications/components/application-parameters/application-parameters.tsx b/ui/src/app/applications/components/application-parameters/application-parameters.tsx index 5e3262e742f57..497f1481cb1da 100644 --- a/ui/src/app/applications/components/application-parameters/application-parameters.tsx +++ b/ui/src/app/applications/components/application-parameters/application-parameters.tsx @@ -137,7 +137,7 @@ export const ApplicationParameters = (props: { if (app && app.spec && app.spec.source && app.spec.source.helm && app.spec.source.helm.values) { isValuesRaw = typeof app.spec.source.helm.values !== 'string'; // nolint appValues = isValuesRaw ? jsYaml.safeDump(app.spec.source.helm.values) : app.spec.source.helm.values; - app.spec.source.helm.values = isValuesRaw ? jsYaml.safeDump(app.spec.source.helm.values) : app.spec.source.helm.values; + app.spec.source.helm.values = appValues; } const [appParamsDeletedState, setAppParamsDeletedState] = React.useState([]); @@ -545,6 +545,11 @@ export const ApplicationParameters = (props: { errors[fieldPath] = invalid.length > 0 ? 'All fields must have name' : null; } + if (updatedApp.spec.source.helm && updatedApp.spec.source.helm.values) { + const parsedValues = jsYaml.safeLoad(updatedApp.spec.source.helm.values); + errors['spec.source.helm.values'] = typeof parsedValues == 'object' ? null : 'Values must be a map'; + } + return errors; }} onModeSwitch={ From f091274fe04ddd5c8dcc1ca94c12a1b35dbddcf7 Mon Sep 17 00:00:00 2001 From: Alex Eftimie Date: Wed, 7 Dec 2022 17:21:14 +0100 Subject: [PATCH 10/22] change implementation; introduce valuesObject instead of values Signed-off-by: Alex Eftimie --- assets/swagger.json | 4 ++ manifests/crds/application-crd.yaml | 56 ++++++++++++++----- manifests/crds/applicationset-crd.yaml | 42 ++++++++++++++ pkg/apis/application/v1alpha1/generated.proto | 8 ++- .../application/v1alpha1/openapi_generated.go | 9 ++- pkg/apis/application/v1alpha1/types.go | 7 ++- pkg/apis/application/v1alpha1/values.go | 18 +++--- .../v1alpha1/zz_generated.deepcopy.go | 4 +- 8 files changed, 121 insertions(+), 27 deletions(-) diff --git a/assets/swagger.json b/assets/swagger.json index 76d60b4cef725..8137086d3b351 100644 --- a/assets/swagger.json +++ b/assets/swagger.json @@ -6166,6 +6166,10 @@ } }, "values": { + "type": "string", + "title": "Values specifies Helm values to be passed to helm template, typically defined as a block\n+patchStrategy=replace\nDeprecated: use valuesObject instead" + }, + "valuesObject": { "$ref": "#/definitions/runtimeRawExtension" }, "version": { diff --git a/manifests/crds/application-crd.yaml b/manifests/crds/application-crd.yaml index e561566dcf57e..5692274548c31 100644 --- a/manifests/crds/application-crd.yaml +++ b/manifests/crds/application-crd.yaml @@ -285,8 +285,13 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' + type: string + valuesObject: + description: ValuesObject specifies Helm values to be + passed to helm template, defined as a map type: object x-kubernetes-preserve-unknown-fields: true version: @@ -981,8 +986,13 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed to - helm template, typically defined as a block + description: 'Values specifies Helm values to be passed to + helm template, typically defined as a block Deprecated: + use valuesObject instead' + type: string + valuesObject: + description: ValuesObject specifies Helm values to be passed + to helm template, defined as a map type: object x-kubernetes-preserve-unknown-fields: true version: @@ -1694,8 +1704,13 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' + type: string + valuesObject: + description: ValuesObject specifies Helm values to be + passed to helm template, defined as a map type: object x-kubernetes-preserve-unknown-fields: true version: @@ -2425,9 +2440,14 @@ spec: type: string type: array values: - description: Values specifies Helm values to be - passed to helm template, typically defined as - a block + description: 'Values specifies Helm values to + be passed to helm template, typically defined + as a block Deprecated: use valuesObject instead' + type: string + valuesObject: + description: ValuesObject specifies Helm values + to be passed to helm template, defined as a + map type: object x-kubernetes-preserve-unknown-fields: true version: @@ -3162,8 +3182,13 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' + type: string + valuesObject: + description: ValuesObject specifies Helm values to + be passed to helm template, defined as a map type: object x-kubernetes-preserve-unknown-fields: true version: @@ -3876,8 +3901,13 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' + type: string + valuesObject: + description: ValuesObject specifies Helm values to + be passed to helm template, defined as a map type: object x-kubernetes-preserve-unknown-fields: true version: diff --git a/manifests/crds/applicationset-crd.yaml b/manifests/crds/applicationset-crd.yaml index aed8788e3829e..84eb361d5ba47 100644 --- a/manifests/crds/applicationset-crd.yaml +++ b/manifests/crds/applicationset-crd.yaml @@ -223,6 +223,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -737,6 +739,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -1255,6 +1259,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -1753,6 +1759,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -2275,6 +2283,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -2789,6 +2799,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -3307,6 +3319,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -3805,6 +3819,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -4924,6 +4940,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -5601,6 +5619,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -6113,6 +6133,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -6635,6 +6657,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -7149,6 +7173,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -7667,6 +7693,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -8165,6 +8193,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -9284,6 +9314,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -9961,6 +9993,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -10477,6 +10511,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -11593,6 +11629,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -12270,6 +12308,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -12831,6 +12871,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: diff --git a/pkg/apis/application/v1alpha1/generated.proto b/pkg/apis/application/v1alpha1/generated.proto index 022249cd6a033..27703b1654c09 100644 --- a/pkg/apis/application/v1alpha1/generated.proto +++ b/pkg/apis/application/v1alpha1/generated.proto @@ -421,9 +421,13 @@ message ApplicationSourceHelm { optional string releaseName = 3; // Values specifies Helm values to be passed to helm template, typically defined as a block - // +kubebuilder:pruning:PreserveUnknownFields // +patchStrategy=replace - optional k8s.io.apimachinery.pkg.runtime.RawExtension values = 4; + // Deprecated: use valuesObject instead + optional string values = 4; + + // ValuesObject specifies Helm values to be passed to helm template, defined as a map + // +kubebuilder:pruning:PreserveUnknownFields + optional k8s.io.apimachinery.pkg.runtime.RawExtension valuesObject = 11; // FileParameters are file parameters to the helm template repeated HelmFileParameter fileParameters = 5; diff --git a/pkg/apis/application/v1alpha1/openapi_generated.go b/pkg/apis/application/v1alpha1/openapi_generated.go index 781fcb43c0687..283a60815fb71 100644 --- a/pkg/apis/application/v1alpha1/openapi_generated.go +++ b/pkg/apis/application/v1alpha1/openapi_generated.go @@ -1602,7 +1602,14 @@ func schema_pkg_apis_application_v1alpha1_ApplicationSourceHelm(ref common.Refer }, }, SchemaProps: spec.SchemaProps{ - Description: "Values specifies Helm values to be passed to helm template, typically defined as a block", + Description: "Values specifies Helm values to be passed to helm template, typically defined as a block Deprecated: use valuesObject instead", + Type: []string{"string"}, + Format: "", + }, + }, + "valuesObject": { + SchemaProps: spec.SchemaProps{ + Description: "ValuesObject specifies Helm values to be passed to helm template, defined as a map", Ref: ref("k8s.io/apimachinery/pkg/runtime.RawExtension"), }, }, diff --git a/pkg/apis/application/v1alpha1/types.go b/pkg/apis/application/v1alpha1/types.go index 02c6083751912..30866c918d3f4 100644 --- a/pkg/apis/application/v1alpha1/types.go +++ b/pkg/apis/application/v1alpha1/types.go @@ -300,9 +300,12 @@ type ApplicationSourceHelm struct { // ReleaseName is the Helm release name to use. If omitted it will use the application name ReleaseName string `json:"releaseName,omitempty" protobuf:"bytes,3,opt,name=releaseName"` // Values specifies Helm values to be passed to helm template, typically defined as a block - // +kubebuilder:pruning:PreserveUnknownFields // +patchStrategy=replace - Values *runtime.RawExtension `json:"values,omitempty" patchStrategy:"replace" protobuf:"bytes,4,opt,name=values"` + // Deprecated: use valuesObject instead + Values string `json:"values,omitempty" patchStrategy:"replace" protobuf:"bytes,4,opt,name=values"` + // ValuesObject specifies Helm values to be passed to helm template, defined as a map + // +kubebuilder:pruning:PreserveUnknownFields + ValuesObject *runtime.RawExtension `json:"valuesObject,omitempty" protobuf:"bytes,11,opt,name=valuesObject"` // FileParameters are file parameters to the helm template FileParameters []HelmFileParameter `json:"fileParameters,omitempty" protobuf:"bytes,5,opt,name=fileParameters"` // Version is the Helm version to use for templating ("3") diff --git a/pkg/apis/application/v1alpha1/values.go b/pkg/apis/application/v1alpha1/values.go index 57927cb14f63a..b859e48e98ffe 100644 --- a/pkg/apis/application/v1alpha1/values.go +++ b/pkg/apis/application/v1alpha1/values.go @@ -10,9 +10,12 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" ) +// Set the ValuesObject property to the json representation of the yaml contained in value +// Remove Values property if present func (h *ApplicationSourceHelm) SetValuesString(value string) error { if value == "" { - h.Values = nil + h.ValuesObject = nil + h.Values = "" } else { data, err := yaml.YAMLToJSON([]byte(value)) if err != nil { @@ -28,16 +31,17 @@ func (h *ApplicationSourceHelm) SetValuesString(value string) error { default: return fmt.Errorf("invalid type %q", reflect.TypeOf(v)) } - h.Values = &runtime.RawExtension{Raw: data} + h.ValuesObject = &runtime.RawExtension{Raw: data} + h.Values = "" } return nil } func (h *ApplicationSourceHelm) ValuesYAML() []byte { - if h.Values == nil || h.Values.Raw == nil { - return []byte{} + if h.ValuesObject == nil || h.ValuesObject.Raw == nil { + return []byte(h.Values) } - b, err := yaml.JSONToYAML(h.Values.Raw) + b, err := yaml.JSONToYAML(h.ValuesObject.Raw) if err != nil { // This should be impossible, because rawValue isn't set directly. return []byte{} @@ -50,8 +54,8 @@ func (h *ApplicationSourceHelm) ValuesIsEmpty() bool { } func (h *ApplicationSourceHelm) ValuesString() string { - if h.Values == nil || h.Values.Raw == nil { - return "" + if h.ValuesObject == nil || h.ValuesObject.Raw == nil { + return h.Values } return strings.TrimSuffix(string(h.ValuesYAML()), "\n") } diff --git a/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go index 0bfc882ce2f25..8f69a5e472124 100644 --- a/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go @@ -945,8 +945,8 @@ func (in *ApplicationSourceHelm) DeepCopyInto(out *ApplicationSourceHelm) { *out = make([]HelmParameter, len(*in)) copy(*out, *in) } - if in.Values != nil { - in, out := &in.Values, &out.Values + if in.ValuesObject != nil { + in, out := &in.ValuesObject, &out.ValuesObject *out = new(runtime.RawExtension) (*in).DeepCopyInto(*out) } From 84898a6ad044a667fa6266a134219e2d8b74cf82 Mon Sep 17 00:00:00 2001 From: Alex Eftimie Date: Wed, 7 Dec 2022 21:57:12 +0100 Subject: [PATCH 11/22] More generated files. Fix tests Signed-off-by: Alex Eftimie --- cmd/argocd/commands/app_test.go | 2 +- manifests/core-install.yaml | 98 ++++++++++++++++--- manifests/ha/install.yaml | 98 ++++++++++++++++--- manifests/install.yaml | 98 ++++++++++++++++--- pkg/apis/application/v1alpha1/generated.proto | 2 +- pkg/apis/application/v1alpha1/types.go | 2 +- pkg/apis/application/v1alpha1/values_test.go | 7 +- reposerver/repository/repository_test.go | 40 ++++---- .../application-parameters.tsx | 4 +- 9 files changed, 284 insertions(+), 67 deletions(-) diff --git a/cmd/argocd/commands/app_test.go b/cmd/argocd/commands/app_test.go index cf10dab7bce1b..673bceec7b632 100644 --- a/cmd/argocd/commands/app_test.go +++ b/cmd/argocd/commands/app_test.go @@ -779,7 +779,7 @@ func Test_unset(t *testing.T) { }, }, PassCredentials: true, - Values: &runtime.RawExtension{Raw: []byte("some: yaml")}, + ValuesObject: &runtime.RawExtension{Raw: []byte("some: yaml")}, ValueFiles: []string{ "values-1.yaml", "values-2.yaml", diff --git a/manifests/core-install.yaml b/manifests/core-install.yaml index 76704ba50be0f..e3632b0b21768 100644 --- a/manifests/core-install.yaml +++ b/manifests/core-install.yaml @@ -286,8 +286,13 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' + type: string + valuesObject: + description: ValuesObject specifies Helm values to be + passed to helm template, defined as a map type: object x-kubernetes-preserve-unknown-fields: true version: @@ -982,8 +987,13 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed to - helm template, typically defined as a block + description: 'Values specifies Helm values to be passed to + helm template, typically defined as a block Deprecated: + use valuesObject instead' + type: string + valuesObject: + description: ValuesObject specifies Helm values to be passed + to helm template, defined as a map type: object x-kubernetes-preserve-unknown-fields: true version: @@ -1695,8 +1705,13 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' + type: string + valuesObject: + description: ValuesObject specifies Helm values to be + passed to helm template, defined as a map type: object x-kubernetes-preserve-unknown-fields: true version: @@ -2426,9 +2441,14 @@ spec: type: string type: array values: - description: Values specifies Helm values to be - passed to helm template, typically defined as - a block + description: 'Values specifies Helm values to + be passed to helm template, typically defined + as a block Deprecated: use valuesObject instead' + type: string + valuesObject: + description: ValuesObject specifies Helm values + to be passed to helm template, defined as a + map type: object x-kubernetes-preserve-unknown-fields: true version: @@ -3163,8 +3183,13 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' + type: string + valuesObject: + description: ValuesObject specifies Helm values to + be passed to helm template, defined as a map type: object x-kubernetes-preserve-unknown-fields: true version: @@ -3877,8 +3902,13 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' + type: string + valuesObject: + description: ValuesObject specifies Helm values to + be passed to helm template, defined as a map type: object x-kubernetes-preserve-unknown-fields: true version: @@ -4593,6 +4623,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -5107,6 +5139,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -5625,6 +5659,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -6123,6 +6159,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -6645,6 +6683,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -7159,6 +7199,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -7677,6 +7719,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -8175,6 +8219,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -9294,6 +9340,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -9971,6 +10019,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -10483,6 +10533,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -11005,6 +11057,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -11519,6 +11573,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -12037,6 +12093,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -12535,6 +12593,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -13654,6 +13714,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -14331,6 +14393,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -14847,6 +14911,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -15963,6 +16029,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -16640,6 +16708,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -17201,6 +17271,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: diff --git a/manifests/ha/install.yaml b/manifests/ha/install.yaml index 702e8522034c9..ae33f75944a29 100644 --- a/manifests/ha/install.yaml +++ b/manifests/ha/install.yaml @@ -286,8 +286,13 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' + type: string + valuesObject: + description: ValuesObject specifies Helm values to be + passed to helm template, defined as a map type: object x-kubernetes-preserve-unknown-fields: true version: @@ -982,8 +987,13 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed to - helm template, typically defined as a block + description: 'Values specifies Helm values to be passed to + helm template, typically defined as a block Deprecated: + use valuesObject instead' + type: string + valuesObject: + description: ValuesObject specifies Helm values to be passed + to helm template, defined as a map type: object x-kubernetes-preserve-unknown-fields: true version: @@ -1695,8 +1705,13 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' + type: string + valuesObject: + description: ValuesObject specifies Helm values to be + passed to helm template, defined as a map type: object x-kubernetes-preserve-unknown-fields: true version: @@ -2426,9 +2441,14 @@ spec: type: string type: array values: - description: Values specifies Helm values to be - passed to helm template, typically defined as - a block + description: 'Values specifies Helm values to + be passed to helm template, typically defined + as a block Deprecated: use valuesObject instead' + type: string + valuesObject: + description: ValuesObject specifies Helm values + to be passed to helm template, defined as a + map type: object x-kubernetes-preserve-unknown-fields: true version: @@ -3163,8 +3183,13 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' + type: string + valuesObject: + description: ValuesObject specifies Helm values to + be passed to helm template, defined as a map type: object x-kubernetes-preserve-unknown-fields: true version: @@ -3877,8 +3902,13 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' + type: string + valuesObject: + description: ValuesObject specifies Helm values to + be passed to helm template, defined as a map type: object x-kubernetes-preserve-unknown-fields: true version: @@ -4593,6 +4623,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -5107,6 +5139,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -5625,6 +5659,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -6123,6 +6159,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -6645,6 +6683,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -7159,6 +7199,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -7677,6 +7719,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -8175,6 +8219,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -9294,6 +9340,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -9971,6 +10019,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -10483,6 +10533,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -11005,6 +11057,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -11519,6 +11573,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -12037,6 +12093,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -12535,6 +12593,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -13654,6 +13714,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -14331,6 +14393,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -14847,6 +14911,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -15963,6 +16029,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -16640,6 +16708,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -17201,6 +17271,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: diff --git a/manifests/install.yaml b/manifests/install.yaml index 49e2c93ef5e68..e4b9970596106 100644 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -286,8 +286,13 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' + type: string + valuesObject: + description: ValuesObject specifies Helm values to be + passed to helm template, defined as a map type: object x-kubernetes-preserve-unknown-fields: true version: @@ -982,8 +987,13 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed to - helm template, typically defined as a block + description: 'Values specifies Helm values to be passed to + helm template, typically defined as a block Deprecated: + use valuesObject instead' + type: string + valuesObject: + description: ValuesObject specifies Helm values to be passed + to helm template, defined as a map type: object x-kubernetes-preserve-unknown-fields: true version: @@ -1695,8 +1705,13 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' + type: string + valuesObject: + description: ValuesObject specifies Helm values to be + passed to helm template, defined as a map type: object x-kubernetes-preserve-unknown-fields: true version: @@ -2426,9 +2441,14 @@ spec: type: string type: array values: - description: Values specifies Helm values to be - passed to helm template, typically defined as - a block + description: 'Values specifies Helm values to + be passed to helm template, typically defined + as a block Deprecated: use valuesObject instead' + type: string + valuesObject: + description: ValuesObject specifies Helm values + to be passed to helm template, defined as a + map type: object x-kubernetes-preserve-unknown-fields: true version: @@ -3163,8 +3183,13 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' + type: string + valuesObject: + description: ValuesObject specifies Helm values to + be passed to helm template, defined as a map type: object x-kubernetes-preserve-unknown-fields: true version: @@ -3877,8 +3902,13 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' + type: string + valuesObject: + description: ValuesObject specifies Helm values to + be passed to helm template, defined as a map type: object x-kubernetes-preserve-unknown-fields: true version: @@ -4593,6 +4623,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -5107,6 +5139,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -5625,6 +5659,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -6123,6 +6159,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -6645,6 +6683,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -7159,6 +7199,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -7677,6 +7719,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -8175,6 +8219,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -9294,6 +9340,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -9971,6 +10019,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -10483,6 +10533,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -11005,6 +11057,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -11519,6 +11573,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -12037,6 +12093,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -12535,6 +12593,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -13654,6 +13714,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -14331,6 +14393,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -14847,6 +14911,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -15963,6 +16029,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -16640,6 +16708,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: @@ -17201,6 +17271,8 @@ spec: type: string type: array values: + type: string + valuesObject: type: object x-kubernetes-preserve-unknown-fields: true version: diff --git a/pkg/apis/application/v1alpha1/generated.proto b/pkg/apis/application/v1alpha1/generated.proto index 27703b1654c09..3bb97a040a39f 100644 --- a/pkg/apis/application/v1alpha1/generated.proto +++ b/pkg/apis/application/v1alpha1/generated.proto @@ -427,7 +427,7 @@ message ApplicationSourceHelm { // ValuesObject specifies Helm values to be passed to helm template, defined as a map // +kubebuilder:pruning:PreserveUnknownFields - optional k8s.io.apimachinery.pkg.runtime.RawExtension valuesObject = 11; + optional k8s.io.apimachinery.pkg.runtime.RawExtension valuesObject = 10; // FileParameters are file parameters to the helm template repeated HelmFileParameter fileParameters = 5; diff --git a/pkg/apis/application/v1alpha1/types.go b/pkg/apis/application/v1alpha1/types.go index 30866c918d3f4..5b36c31bc05cb 100644 --- a/pkg/apis/application/v1alpha1/types.go +++ b/pkg/apis/application/v1alpha1/types.go @@ -305,7 +305,7 @@ type ApplicationSourceHelm struct { Values string `json:"values,omitempty" patchStrategy:"replace" protobuf:"bytes,4,opt,name=values"` // ValuesObject specifies Helm values to be passed to helm template, defined as a map // +kubebuilder:pruning:PreserveUnknownFields - ValuesObject *runtime.RawExtension `json:"valuesObject,omitempty" protobuf:"bytes,11,opt,name=valuesObject"` + ValuesObject *runtime.RawExtension `json:"valuesObject,omitempty" protobuf:"bytes,10,opt,name=valuesObject"` // FileParameters are file parameters to the helm template FileParameters []HelmFileParameter `json:"fileParameters,omitempty" protobuf:"bytes,5,opt,name=fileParameters"` // Version is the Helm version to use for templating ("3") diff --git a/pkg/apis/application/v1alpha1/values_test.go b/pkg/apis/application/v1alpha1/values_test.go index efc8891c6ba50..f21f17168a2e8 100644 --- a/pkg/apis/application/v1alpha1/values_test.go +++ b/pkg/apis/application/v1alpha1/values_test.go @@ -61,15 +61,16 @@ func TestValues_SetString(t *testing.T) { } for _, testCase := range testCases { + var err error t.Run(testCase.name, func(t *testing.T) { source := &ApplicationSourceHelm{} - err := source.SetValuesString(testCase.inputValue) + err = source.SetValuesString(testCase.inputValue) if !testCase.expectError { assert.Equal(t, testCase.expectValue, source.ValuesString()) - data, err := source.Values.MarshalJSON() + data, err := source.ValuesObject.MarshalJSON() assert.NoError(t, err) - err = source.Values.UnmarshalJSON(data) + err = source.ValuesObject.UnmarshalJSON(data) assert.NoError(t, err) assert.Equal(t, testCase.expectValue, source.ValuesString()) } else { diff --git a/reposerver/repository/repository_test.go b/reposerver/repository/repository_test.go index 6782c2a19b11f..d879c53a6ccfa 100644 --- a/reposerver/repository/repository_test.go +++ b/reposerver/repository/repository_test.go @@ -813,8 +813,8 @@ func TestGenerateHelmWithValues(t *testing.T) { ApplicationSource: &argoappv1.ApplicationSource{ Path: ".", Helm: &argoappv1.ApplicationSourceHelm{ - ValueFiles: []string{"values-production.yaml"}, - Values: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, + ValueFiles: []string{"values-production.yaml"}, + ValuesObject: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, }, }, ProjectName: "something", @@ -914,8 +914,8 @@ func TestGenerateHelmWithValuesDirectoryTraversal(t *testing.T) { ApplicationSource: &argoappv1.ApplicationSource{ Path: "./redis", Helm: &argoappv1.ApplicationSourceHelm{ - ValueFiles: []string{"../minio/values.yaml"}, - Values: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, + ValueFiles: []string{"../minio/values.yaml"}, + ValuesObject: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, }, }, ProjectName: "something", @@ -1016,8 +1016,8 @@ func TestGenerateHelmWithURL(t *testing.T) { ApplicationSource: &argoappv1.ApplicationSource{ Path: ".", Helm: &argoappv1.ApplicationSourceHelm{ - ValueFiles: []string{"https://raw.githubusercontent.com/argoproj/argocd-example-apps/master/helm-guestbook/values.yaml"}, - Values: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, + ValueFiles: []string{"https://raw.githubusercontent.com/argoproj/argocd-example-apps/master/helm-guestbook/values.yaml"}, + ValuesObject: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, }, }, ProjectName: "something", @@ -1038,8 +1038,8 @@ func TestGenerateHelmWithValuesDirectoryTraversalOutsideRepo(t *testing.T) { ApplicationSource: &argoappv1.ApplicationSource{ Path: ".", Helm: &argoappv1.ApplicationSourceHelm{ - ValueFiles: []string{"../minio/values.yaml"}, - Values: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, + ValueFiles: []string{"../minio/values.yaml"}, + ValuesObject: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, }, }, ProjectName: "something", @@ -1057,8 +1057,8 @@ func TestGenerateHelmWithValuesDirectoryTraversalOutsideRepo(t *testing.T) { ApplicationSource: &argoappv1.ApplicationSource{ Path: "./my-chart", Helm: &argoappv1.ApplicationSourceHelm{ - ValueFiles: []string{"../my-chart/my-chart-values.yaml"}, - Values: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, + ValueFiles: []string{"../my-chart/my-chart-values.yaml"}, + ValuesObject: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, }, }, ProjectName: "something", @@ -1075,8 +1075,8 @@ func TestGenerateHelmWithValuesDirectoryTraversalOutsideRepo(t *testing.T) { ApplicationSource: &argoappv1.ApplicationSource{ Path: "./my-chart", Helm: &argoappv1.ApplicationSourceHelm{ - ValueFiles: []string{"/my-chart/my-chart-values.yaml"}, - Values: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, + ValueFiles: []string{"/my-chart/my-chart-values.yaml"}, + ValuesObject: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, }, }, ProjectName: "something", @@ -1093,8 +1093,8 @@ func TestGenerateHelmWithValuesDirectoryTraversalOutsideRepo(t *testing.T) { ApplicationSource: &argoappv1.ApplicationSource{ Path: "./my-chart", Helm: &argoappv1.ApplicationSourceHelm{ - ValueFiles: []string{"/../../../my-chart-values.yaml"}, - Values: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, + ValueFiles: []string{"/../../../my-chart-values.yaml"}, + ValuesObject: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, }, }, ProjectName: "something", @@ -1112,8 +1112,8 @@ func TestGenerateHelmWithValuesDirectoryTraversalOutsideRepo(t *testing.T) { ApplicationSource: &argoappv1.ApplicationSource{ Path: "./my-chart", Helm: &argoappv1.ApplicationSourceHelm{ - ValueFiles: []string{"file://../../../../my-chart-values.yaml"}, - Values: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, + ValueFiles: []string{"file://../../../../my-chart-values.yaml"}, + ValuesObject: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, }, }, ProjectName: "something", @@ -1167,8 +1167,8 @@ func TestGenerateHelmWithAbsoluteFileParameter(t *testing.T) { ApplicationSource: &argoappv1.ApplicationSource{ Path: "./util/helm/testdata/redis", Helm: &argoappv1.ApplicationSourceHelm{ - ValueFiles: []string{"values-production.yaml"}, - Values: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, + ValueFiles: []string{"values-production.yaml"}, + ValuesObject: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, FileParameters: []argoappv1.HelmFileParameter{{ Name: "passwordContent", Path: externalSecretPath, @@ -1194,8 +1194,8 @@ func TestGenerateHelmWithFileParameter(t *testing.T) { ApplicationSource: &argoappv1.ApplicationSource{ Path: "./redis", Helm: &argoappv1.ApplicationSourceHelm{ - ValueFiles: []string{"values-production.yaml"}, - Values: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, + ValueFiles: []string{"values-production.yaml"}, + ValuesObject: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, FileParameters: []argoappv1.HelmFileParameter{ argoappv1.HelmFileParameter{ Name: "passwordContent", diff --git a/ui/src/app/applications/components/application-parameters/application-parameters.tsx b/ui/src/app/applications/components/application-parameters/application-parameters.tsx index 497f1481cb1da..274175f98baa8 100644 --- a/ui/src/app/applications/components/application-parameters/application-parameters.tsx +++ b/ui/src/app/applications/components/application-parameters/application-parameters.tsx @@ -546,8 +546,8 @@ export const ApplicationParameters = (props: { } if (updatedApp.spec.source.helm && updatedApp.spec.source.helm.values) { - const parsedValues = jsYaml.safeLoad(updatedApp.spec.source.helm.values); - errors['spec.source.helm.values'] = typeof parsedValues == 'object' ? null : 'Values must be a map'; + const parsedValues = jsYaml.safeLoad(updatedApp.spec.source.helm.values); + errors['spec.source.helm.values'] = typeof parsedValues == 'object' ? null : 'Values must be a map'; } return errors; From adf3f0a991e625921e5629776c6655772c328897 Mon Sep 17 00:00:00 2001 From: Alex Eftimie Date: Wed, 7 Dec 2022 22:02:11 +0100 Subject: [PATCH 12/22] Fix eslint Signed-off-by: Alex Eftimie --- .../application-parameters/application-parameters.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/app/applications/components/application-parameters/application-parameters.tsx b/ui/src/app/applications/components/application-parameters/application-parameters.tsx index 274175f98baa8..46b2bbdc5210d 100644 --- a/ui/src/app/applications/components/application-parameters/application-parameters.tsx +++ b/ui/src/app/applications/components/application-parameters/application-parameters.tsx @@ -547,7 +547,7 @@ export const ApplicationParameters = (props: { if (updatedApp.spec.source.helm && updatedApp.spec.source.helm.values) { const parsedValues = jsYaml.safeLoad(updatedApp.spec.source.helm.values); - errors['spec.source.helm.values'] = typeof parsedValues == 'object' ? null : 'Values must be a map'; + errors['spec.source.helm.values'] = typeof parsedValues === 'object' ? null : 'Values must be a map'; } return errors; From 9a71cbe66d268008a47276a8ec125c877ae2b9ca Mon Sep 17 00:00:00 2001 From: Blake Pettersson Date: Tue, 16 May 2023 20:12:42 +0200 Subject: [PATCH 13/22] chore: make codegen Signed-off-by: Blake Pettersson --- manifests/crds/application-crd.yaml | 58 +++++++++++++---- manifests/crds/applicationset-crd.yaml | 63 +++++++++++++++++++ .../clientset/versioned/fake/register.go | 14 ++--- .../clientset/versioned/scheme/register.go | 14 ++--- 4 files changed, 123 insertions(+), 26 deletions(-) diff --git a/manifests/crds/application-crd.yaml b/manifests/crds/application-crd.yaml index 5692274548c31..cfc354e7a390e 100644 --- a/manifests/crds/application-crd.yaml +++ b/manifests/crds/application-crd.yaml @@ -580,9 +580,15 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' type: string + valuesObject: + description: ValuesObject specifies Helm values to be + passed to helm template, defined as a map + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -1272,9 +1278,15 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed to - helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' type: string + valuesObject: + description: ValuesObject specifies Helm values to be passed + to helm template, defined as a map + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -2003,9 +2015,15 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' type: string + valuesObject: + description: ValuesObject specifies Helm values to + be passed to helm template, defined as a map + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -2755,10 +2773,16 @@ spec: type: string type: array values: - description: Values specifies Helm values to + description: 'Values specifies Helm values to be passed to helm template, typically defined - as a block + as a block Deprecated: use valuesObject instead' type: string + valuesObject: + description: ValuesObject specifies Helm values + to be passed to helm template, defined as + a map + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -3491,10 +3515,15 @@ spec: type: string type: array values: - description: Values specifies Helm values to be + description: 'Values specifies Helm values to be passed to helm template, typically defined as - a block + a block Deprecated: use valuesObject instead' type: string + valuesObject: + description: ValuesObject specifies Helm values + to be passed to helm template, defined as a map + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -4210,10 +4239,15 @@ spec: type: string type: array values: - description: Values specifies Helm values to be + description: 'Values specifies Helm values to be passed to helm template, typically defined as - a block + a block Deprecated: use valuesObject instead' type: string + valuesObject: + description: ValuesObject specifies Helm values + to be passed to helm template, defined as a map + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") diff --git a/manifests/crds/applicationset-crd.yaml b/manifests/crds/applicationset-crd.yaml index 84eb361d5ba47..7de1c8fdc3ce1 100644 --- a/manifests/crds/applicationset-crd.yaml +++ b/manifests/crds/applicationset-crd.yaml @@ -404,6 +404,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -920,6 +923,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -1440,6 +1446,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -1940,6 +1949,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -2464,6 +2476,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -2980,6 +2995,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -3500,6 +3518,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -4000,6 +4021,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -5121,6 +5145,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -5800,6 +5827,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -6314,6 +6344,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -6838,6 +6871,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -7354,6 +7390,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -7874,6 +7913,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -8374,6 +8416,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -9495,6 +9540,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -10174,6 +10222,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -10692,6 +10743,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -11810,6 +11864,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -12489,6 +12546,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -13052,6 +13112,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object diff --git a/pkg/client/clientset/versioned/fake/register.go b/pkg/client/clientset/versioned/fake/register.go index 115e39faa197d..5773b75ce6df2 100644 --- a/pkg/client/clientset/versioned/fake/register.go +++ b/pkg/client/clientset/versioned/fake/register.go @@ -21,14 +21,14 @@ var localSchemeBuilder = runtime.SchemeBuilder{ // AddToScheme adds all types of this clientset into the given scheme. This allows composition // of clientsets, like in: // -// import ( -// "k8s.io/client-go/kubernetes" -// clientsetscheme "k8s.io/client-go/kubernetes/scheme" -// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" -// ) +// import ( +// "k8s.io/client-go/kubernetes" +// clientsetscheme "k8s.io/client-go/kubernetes/scheme" +// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" +// ) // -// kclientset, _ := kubernetes.NewForConfig(c) -// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) +// kclientset, _ := kubernetes.NewForConfig(c) +// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) // // After this, RawExtensions in Kubernetes types will serialize kube-aggregator types // correctly. diff --git a/pkg/client/clientset/versioned/scheme/register.go b/pkg/client/clientset/versioned/scheme/register.go index a334cbed3235a..46f64a49e41e1 100644 --- a/pkg/client/clientset/versioned/scheme/register.go +++ b/pkg/client/clientset/versioned/scheme/register.go @@ -21,14 +21,14 @@ var localSchemeBuilder = runtime.SchemeBuilder{ // AddToScheme adds all types of this clientset into the given scheme. This allows composition // of clientsets, like in: // -// import ( -// "k8s.io/client-go/kubernetes" -// clientsetscheme "k8s.io/client-go/kubernetes/scheme" -// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" -// ) +// import ( +// "k8s.io/client-go/kubernetes" +// clientsetscheme "k8s.io/client-go/kubernetes/scheme" +// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" +// ) // -// kclientset, _ := kubernetes.NewForConfig(c) -// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) +// kclientset, _ := kubernetes.NewForConfig(c) +// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) // // After this, RawExtensions in Kubernetes types will serialize kube-aggregator types // correctly. From 653e1b3509b897310fbb38e351377bb878abe896 Mon Sep 17 00:00:00 2001 From: Blake Pettersson Date: Tue, 16 May 2023 20:16:32 +0200 Subject: [PATCH 14/22] chore: use sigs.k8s.io/yaml In the same vein as #13292, since `github.com/ghodss/yaml` is no longer maintained. Signed-off-by: Blake Pettersson --- pkg/apis/application/v1alpha1/values.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/apis/application/v1alpha1/values.go b/pkg/apis/application/v1alpha1/values.go index b859e48e98ffe..942e2a651cf71 100644 --- a/pkg/apis/application/v1alpha1/values.go +++ b/pkg/apis/application/v1alpha1/values.go @@ -6,8 +6,8 @@ import ( reflect "reflect" "strings" - "github.com/ghodss/yaml" runtime "k8s.io/apimachinery/pkg/runtime" + "sigs.k8s.io/yaml" ) // Set the ValuesObject property to the json representation of the yaml contained in value From 0615dd13348a5ca45dea20d5da0396a5a73d4204 Mon Sep 17 00:00:00 2001 From: Blake Pettersson Date: Tue, 16 May 2023 20:28:06 +0200 Subject: [PATCH 15/22] chore: compact values Signed-off-by: Blake Pettersson --- .../application-parameters.tsx | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/ui/src/app/applications/components/application-parameters/application-parameters.tsx b/ui/src/app/applications/components/application-parameters/application-parameters.tsx index 46b2bbdc5210d..f374678540189 100644 --- a/ui/src/app/applications/components/application-parameters/application-parameters.tsx +++ b/ui/src/app/applications/components/application-parameters/application-parameters.tsx @@ -134,10 +134,10 @@ export const ApplicationParameters = (props: { let attributes: EditablePanelItem[] = []; let appValues: string; - if (app && app.spec && app.spec.source && app.spec.source.helm && app.spec.source.helm.values) { - isValuesRaw = typeof app.spec.source.helm.values !== 'string'; // nolint - appValues = isValuesRaw ? jsYaml.safeDump(app.spec.source.helm.values) : app.spec.source.helm.values; - app.spec.source.helm.values = appValues; + if (source && source.helm && source.helm.values) { + isValuesRaw = typeof source.helm.values !== 'string'; // nolint + appValues = isValuesRaw ? jsYaml.safeDump(source.helm.values) : source.helm.values; + source.helm.values = appValues; } const [appParamsDeletedState, setAppParamsDeletedState] = React.useState([]); @@ -527,10 +527,8 @@ export const ApplicationParameters = (props: { params = params.filter(param => !appParamsDeletedState.includes(param.name)); input.spec.source.plugin.parameters = params; } - if (input.spec.source.helm && input.spec.source.helm.values) { - if (isValuesRaw) { - input.spec.source.helm.values = jsYaml.safeLoad(input.spec.source.helm.values); // Load values as json - } + if (input.spec.source.helm && input.spec.source.helm.values && isValuesRaw) { + input.spec.source.helm.values = jsYaml.safeLoad(input.spec.source.helm.values); // Load values as json } await props.save(input, {}); setRemovedOverrides(new Array()); From 292220572dd527ba82ce0441f0fbf5eb5afda792 Mon Sep 17 00:00:00 2001 From: Blake Pettersson Date: Tue, 16 May 2023 21:10:42 +0200 Subject: [PATCH 16/22] chore: make manifests Signed-off-by: Blake Pettersson --- manifests/core-install.yaml | 121 ++++++++++++++++++++++++++++++++---- manifests/ha/install.yaml | 121 ++++++++++++++++++++++++++++++++---- manifests/install.yaml | 121 ++++++++++++++++++++++++++++++++---- 3 files changed, 327 insertions(+), 36 deletions(-) diff --git a/manifests/core-install.yaml b/manifests/core-install.yaml index e3632b0b21768..cc5d7f5ce980e 100644 --- a/manifests/core-install.yaml +++ b/manifests/core-install.yaml @@ -581,9 +581,15 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' type: string + valuesObject: + description: ValuesObject specifies Helm values to be + passed to helm template, defined as a map + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -1273,9 +1279,15 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed to - helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' type: string + valuesObject: + description: ValuesObject specifies Helm values to be passed + to helm template, defined as a map + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -2004,9 +2016,15 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' type: string + valuesObject: + description: ValuesObject specifies Helm values to + be passed to helm template, defined as a map + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -2756,10 +2774,16 @@ spec: type: string type: array values: - description: Values specifies Helm values to + description: 'Values specifies Helm values to be passed to helm template, typically defined - as a block + as a block Deprecated: use valuesObject instead' type: string + valuesObject: + description: ValuesObject specifies Helm values + to be passed to helm template, defined as + a map + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -3492,10 +3516,15 @@ spec: type: string type: array values: - description: Values specifies Helm values to be + description: 'Values specifies Helm values to be passed to helm template, typically defined as - a block + a block Deprecated: use valuesObject instead' type: string + valuesObject: + description: ValuesObject specifies Helm values + to be passed to helm template, defined as a map + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -4211,10 +4240,15 @@ spec: type: string type: array values: - description: Values specifies Helm values to be + description: 'Values specifies Helm values to be passed to helm template, typically defined as - a block + a block Deprecated: use valuesObject instead' type: string + valuesObject: + description: ValuesObject specifies Helm values + to be passed to helm template, defined as a map + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -4804,6 +4838,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -5320,6 +5357,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -5840,6 +5880,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -6340,6 +6383,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -6864,6 +6910,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -7380,6 +7429,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -7900,6 +7952,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -8400,6 +8455,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -9521,6 +9579,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -10200,6 +10261,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -10714,6 +10778,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -11238,6 +11305,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -11754,6 +11824,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -12274,6 +12347,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -12774,6 +12850,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -13895,6 +13974,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -14574,6 +14656,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -15092,6 +15177,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -16210,6 +16298,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -16889,6 +16980,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -17452,6 +17546,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object diff --git a/manifests/ha/install.yaml b/manifests/ha/install.yaml index ae33f75944a29..267e572e5187e 100644 --- a/manifests/ha/install.yaml +++ b/manifests/ha/install.yaml @@ -581,9 +581,15 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' type: string + valuesObject: + description: ValuesObject specifies Helm values to be + passed to helm template, defined as a map + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -1273,9 +1279,15 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed to - helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' type: string + valuesObject: + description: ValuesObject specifies Helm values to be passed + to helm template, defined as a map + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -2004,9 +2016,15 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' type: string + valuesObject: + description: ValuesObject specifies Helm values to + be passed to helm template, defined as a map + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -2756,10 +2774,16 @@ spec: type: string type: array values: - description: Values specifies Helm values to + description: 'Values specifies Helm values to be passed to helm template, typically defined - as a block + as a block Deprecated: use valuesObject instead' type: string + valuesObject: + description: ValuesObject specifies Helm values + to be passed to helm template, defined as + a map + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -3492,10 +3516,15 @@ spec: type: string type: array values: - description: Values specifies Helm values to be + description: 'Values specifies Helm values to be passed to helm template, typically defined as - a block + a block Deprecated: use valuesObject instead' type: string + valuesObject: + description: ValuesObject specifies Helm values + to be passed to helm template, defined as a map + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -4211,10 +4240,15 @@ spec: type: string type: array values: - description: Values specifies Helm values to be + description: 'Values specifies Helm values to be passed to helm template, typically defined as - a block + a block Deprecated: use valuesObject instead' type: string + valuesObject: + description: ValuesObject specifies Helm values + to be passed to helm template, defined as a map + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -4804,6 +4838,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -5320,6 +5357,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -5840,6 +5880,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -6340,6 +6383,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -6864,6 +6910,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -7380,6 +7429,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -7900,6 +7952,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -8400,6 +8455,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -9521,6 +9579,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -10200,6 +10261,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -10714,6 +10778,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -11238,6 +11305,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -11754,6 +11824,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -12274,6 +12347,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -12774,6 +12850,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -13895,6 +13974,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -14574,6 +14656,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -15092,6 +15177,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -16210,6 +16298,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -16889,6 +16980,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -17452,6 +17546,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object diff --git a/manifests/install.yaml b/manifests/install.yaml index e4b9970596106..d53b54d0b5640 100644 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -581,9 +581,15 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' type: string + valuesObject: + description: ValuesObject specifies Helm values to be + passed to helm template, defined as a map + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -1273,9 +1279,15 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed to - helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' type: string + valuesObject: + description: ValuesObject specifies Helm values to be passed + to helm template, defined as a map + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -2004,9 +2016,15 @@ spec: type: string type: array values: - description: Values specifies Helm values to be passed - to helm template, typically defined as a block + description: 'Values specifies Helm values to be passed + to helm template, typically defined as a block Deprecated: + use valuesObject instead' type: string + valuesObject: + description: ValuesObject specifies Helm values to + be passed to helm template, defined as a map + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -2756,10 +2774,16 @@ spec: type: string type: array values: - description: Values specifies Helm values to + description: 'Values specifies Helm values to be passed to helm template, typically defined - as a block + as a block Deprecated: use valuesObject instead' type: string + valuesObject: + description: ValuesObject specifies Helm values + to be passed to helm template, defined as + a map + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -3492,10 +3516,15 @@ spec: type: string type: array values: - description: Values specifies Helm values to be + description: 'Values specifies Helm values to be passed to helm template, typically defined as - a block + a block Deprecated: use valuesObject instead' type: string + valuesObject: + description: ValuesObject specifies Helm values + to be passed to helm template, defined as a map + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -4211,10 +4240,15 @@ spec: type: string type: array values: - description: Values specifies Helm values to be + description: 'Values specifies Helm values to be passed to helm template, typically defined as - a block + a block Deprecated: use valuesObject instead' type: string + valuesObject: + description: ValuesObject specifies Helm values + to be passed to helm template, defined as a map + type: object + x-kubernetes-preserve-unknown-fields: true version: description: Version is the Helm version to use for templating ("3") @@ -4804,6 +4838,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -5320,6 +5357,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -5840,6 +5880,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -6340,6 +6383,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -6864,6 +6910,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -7380,6 +7429,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -7900,6 +7952,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -8400,6 +8455,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -9521,6 +9579,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -10200,6 +10261,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -10714,6 +10778,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -11238,6 +11305,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -11754,6 +11824,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -12274,6 +12347,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -12774,6 +12850,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -13895,6 +13974,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -14574,6 +14656,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -15092,6 +15177,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -16210,6 +16298,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -16889,6 +16980,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -17452,6 +17546,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object From d61dd19c0c51ec5676e03be50dceb95f60cf3be0 Mon Sep 17 00:00:00 2001 From: Blake Pettersson Date: Sun, 21 May 2023 13:51:39 +0200 Subject: [PATCH 17/22] docs: add to helm user guide Signed-off-by: Blake Pettersson --- docs/operator-manual/application.yaml | 18 +++++++++++++++++- docs/user-guide/helm.md | 24 +++++++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/docs/operator-manual/application.yaml b/docs/operator-manual/application.yaml index 299da7eba4b95..46d961d2c533b 100644 --- a/docs/operator-manual/application.yaml +++ b/docs/operator-manual/application.yaml @@ -48,7 +48,7 @@ spec: # Ignore locally missing valueFiles when installing Helm chart. Defaults to false ignoreMissingValueFiles: false - # Values file as block file + # Values file as block file. Prefer to use valuesObject if possible (see below) values: | ingress: enabled: true @@ -64,6 +64,22 @@ spec: hosts: - mydomain.example.com + # Values file as block file. This takes precedence over values + valuesObject: + ingress: + enabled: true + path: / + hosts: + - mydomain.example.com + annotations: + kubernetes.io/ingress.class: nginx + kubernetes.io/tls-acme: "true" + labels: {} + tls: + - secretName: mydomain-tls + hosts: + - mydomain.example.com + # Skip custom resource definition installation if chart contains custom resource definitions. Defaults to false skipCrds: false diff --git a/docs/user-guide/helm.md b/docs/user-guide/helm.md index 554eab2ba31ae..c719590b1f8cf 100644 --- a/docs/user-guide/helm.md +++ b/docs/user-guide/helm.md @@ -52,7 +52,29 @@ source: ## Values -Argo CD supports the equivalent of a values file directly in the Application manifest using the `source.helm.values` key. +Argo CD supports the equivalent of a values file directly in the Application manifest using the `source.helm.valuesObject` key. + +``` +source: + helm: + valuesObject: + ingress: + enabled: true + path: / + hosts: + - mydomain.example.com + annotations: + kubernetes.io/ingress.class: nginx + kubernetes.io/tls-acme: "true" + labels: {} + tls: + - secretName: mydomain-tls + hosts: + - mydomain.example.com +``` + +Alternatively, values can be passed in as a string using the `source.helm.values` key, although this should be considered +deprecated. ``` source: From 68c9c6a46019f23cb2964aae0cb4354179713645 Mon Sep 17 00:00:00 2001 From: Blake Pettersson Date: Sun, 28 May 2023 18:19:15 +0200 Subject: [PATCH 18/22] docs: remove any deprecation mentions Remove any mentions that `Values` is deprecated, for now. Signed-off-by: Blake Pettersson --- assets/swagger.json | 2 +- docs/user-guide/helm.md | 3 +- manifests/core-install.yaml | 107 ++++++++++-------- manifests/crds/application-crd.yaml | 107 ++++++++++-------- manifests/ha/install.yaml | 107 ++++++++++-------- manifests/install.yaml | 107 ++++++++++-------- pkg/apis/application/v1alpha1/generated.proto | 5 +- .../application/v1alpha1/openapi_generated.go | 4 +- pkg/apis/application/v1alpha1/types.go | 5 +- 9 files changed, 256 insertions(+), 191 deletions(-) diff --git a/assets/swagger.json b/assets/swagger.json index 8137086d3b351..9a00d7631e171 100644 --- a/assets/swagger.json +++ b/assets/swagger.json @@ -6167,7 +6167,7 @@ }, "values": { "type": "string", - "title": "Values specifies Helm values to be passed to helm template, typically defined as a block\n+patchStrategy=replace\nDeprecated: use valuesObject instead" + "title": "Values specifies Helm values to be passed to helm template, typically defined as a block. ValuesObject takes precedence over Values, so use one or the other.\n+patchStrategy=replace" }, "valuesObject": { "$ref": "#/definitions/runtimeRawExtension" diff --git a/docs/user-guide/helm.md b/docs/user-guide/helm.md index c719590b1f8cf..e6ac3e940ee11 100644 --- a/docs/user-guide/helm.md +++ b/docs/user-guide/helm.md @@ -73,8 +73,7 @@ source: - mydomain.example.com ``` -Alternatively, values can be passed in as a string using the `source.helm.values` key, although this should be considered -deprecated. +Alternatively, values can be passed in as a string using the `source.helm.values` key. ``` source: diff --git a/manifests/core-install.yaml b/manifests/core-install.yaml index cc5d7f5ce980e..b2f97ea9cc33e 100644 --- a/manifests/core-install.yaml +++ b/manifests/core-install.yaml @@ -286,13 +286,14 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be - passed to helm template, defined as a map + passed to helm template, defined as a map. This takes + precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -581,13 +582,14 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be - passed to helm template, defined as a map + passed to helm template, defined as a map. This takes + precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -993,13 +995,14 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed to - helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed to + helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be passed - to helm template, defined as a map + to helm template, defined as a map. This takes precedence + over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -1279,13 +1282,14 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed to + helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be passed - to helm template, defined as a map + to helm template, defined as a map. This takes precedence + over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -1717,13 +1721,14 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be - passed to helm template, defined as a map + passed to helm template, defined as a map. This takes + precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -2016,13 +2021,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. + ValuesObject takes precedence over Values, so use + one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to - be passed to helm template, defined as a map + be passed to helm template, defined as a map. This + takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -2459,14 +2466,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to - be passed to helm template, typically defined - as a block Deprecated: use valuesObject instead' + description: Values specifies Helm values to be + passed to helm template, typically defined as + a block. ValuesObject takes precedence over + Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be passed to helm template, defined as a - map + map. This takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -2774,14 +2782,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to + description: Values specifies Helm values to be passed to helm template, typically defined - as a block Deprecated: use valuesObject instead' + as a block. ValuesObject takes precedence + over Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be passed to helm template, defined as - a map + a map. This takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -3207,13 +3216,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. + ValuesObject takes precedence over Values, so use + one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to - be passed to helm template, defined as a map + be passed to helm template, defined as a map. This + takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -3516,13 +3527,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be + description: Values specifies Helm values to be passed to helm template, typically defined as - a block Deprecated: use valuesObject instead' + a block. ValuesObject takes precedence over Values, + so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values - to be passed to helm template, defined as a map + to be passed to helm template, defined as a map. + This takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -3931,13 +3944,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. + ValuesObject takes precedence over Values, so use + one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to - be passed to helm template, defined as a map + be passed to helm template, defined as a map. This + takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -4240,13 +4255,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be + description: Values specifies Helm values to be passed to helm template, typically defined as - a block Deprecated: use valuesObject instead' + a block. ValuesObject takes precedence over Values, + so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values - to be passed to helm template, defined as a map + to be passed to helm template, defined as a map. + This takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: diff --git a/manifests/crds/application-crd.yaml b/manifests/crds/application-crd.yaml index cfc354e7a390e..eb8d8dca36b0f 100644 --- a/manifests/crds/application-crd.yaml +++ b/manifests/crds/application-crd.yaml @@ -285,13 +285,14 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be - passed to helm template, defined as a map + passed to helm template, defined as a map. This takes + precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -580,13 +581,14 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be - passed to helm template, defined as a map + passed to helm template, defined as a map. This takes + precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -992,13 +994,14 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed to - helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed to + helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be passed - to helm template, defined as a map + to helm template, defined as a map. This takes precedence + over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -1278,13 +1281,14 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed to + helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be passed - to helm template, defined as a map + to helm template, defined as a map. This takes precedence + over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -1716,13 +1720,14 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be - passed to helm template, defined as a map + passed to helm template, defined as a map. This takes + precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -2015,13 +2020,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. + ValuesObject takes precedence over Values, so use + one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to - be passed to helm template, defined as a map + be passed to helm template, defined as a map. This + takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -2458,14 +2465,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to - be passed to helm template, typically defined - as a block Deprecated: use valuesObject instead' + description: Values specifies Helm values to be + passed to helm template, typically defined as + a block. ValuesObject takes precedence over + Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be passed to helm template, defined as a - map + map. This takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -2773,14 +2781,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to + description: Values specifies Helm values to be passed to helm template, typically defined - as a block Deprecated: use valuesObject instead' + as a block. ValuesObject takes precedence + over Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be passed to helm template, defined as - a map + a map. This takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -3206,13 +3215,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. + ValuesObject takes precedence over Values, so use + one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to - be passed to helm template, defined as a map + be passed to helm template, defined as a map. This + takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -3515,13 +3526,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be + description: Values specifies Helm values to be passed to helm template, typically defined as - a block Deprecated: use valuesObject instead' + a block. ValuesObject takes precedence over Values, + so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values - to be passed to helm template, defined as a map + to be passed to helm template, defined as a map. + This takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -3930,13 +3943,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. + ValuesObject takes precedence over Values, so use + one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to - be passed to helm template, defined as a map + be passed to helm template, defined as a map. This + takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -4239,13 +4254,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be + description: Values specifies Helm values to be passed to helm template, typically defined as - a block Deprecated: use valuesObject instead' + a block. ValuesObject takes precedence over Values, + so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values - to be passed to helm template, defined as a map + to be passed to helm template, defined as a map. + This takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: diff --git a/manifests/ha/install.yaml b/manifests/ha/install.yaml index 267e572e5187e..78a1b22d16275 100644 --- a/manifests/ha/install.yaml +++ b/manifests/ha/install.yaml @@ -286,13 +286,14 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be - passed to helm template, defined as a map + passed to helm template, defined as a map. This takes + precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -581,13 +582,14 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be - passed to helm template, defined as a map + passed to helm template, defined as a map. This takes + precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -993,13 +995,14 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed to - helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed to + helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be passed - to helm template, defined as a map + to helm template, defined as a map. This takes precedence + over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -1279,13 +1282,14 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed to + helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be passed - to helm template, defined as a map + to helm template, defined as a map. This takes precedence + over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -1717,13 +1721,14 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be - passed to helm template, defined as a map + passed to helm template, defined as a map. This takes + precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -2016,13 +2021,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. + ValuesObject takes precedence over Values, so use + one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to - be passed to helm template, defined as a map + be passed to helm template, defined as a map. This + takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -2459,14 +2466,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to - be passed to helm template, typically defined - as a block Deprecated: use valuesObject instead' + description: Values specifies Helm values to be + passed to helm template, typically defined as + a block. ValuesObject takes precedence over + Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be passed to helm template, defined as a - map + map. This takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -2774,14 +2782,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to + description: Values specifies Helm values to be passed to helm template, typically defined - as a block Deprecated: use valuesObject instead' + as a block. ValuesObject takes precedence + over Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be passed to helm template, defined as - a map + a map. This takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -3207,13 +3216,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. + ValuesObject takes precedence over Values, so use + one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to - be passed to helm template, defined as a map + be passed to helm template, defined as a map. This + takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -3516,13 +3527,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be + description: Values specifies Helm values to be passed to helm template, typically defined as - a block Deprecated: use valuesObject instead' + a block. ValuesObject takes precedence over Values, + so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values - to be passed to helm template, defined as a map + to be passed to helm template, defined as a map. + This takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -3931,13 +3944,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. + ValuesObject takes precedence over Values, so use + one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to - be passed to helm template, defined as a map + be passed to helm template, defined as a map. This + takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -4240,13 +4255,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be + description: Values specifies Helm values to be passed to helm template, typically defined as - a block Deprecated: use valuesObject instead' + a block. ValuesObject takes precedence over Values, + so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values - to be passed to helm template, defined as a map + to be passed to helm template, defined as a map. + This takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: diff --git a/manifests/install.yaml b/manifests/install.yaml index d53b54d0b5640..7b620654b330e 100644 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -286,13 +286,14 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be - passed to helm template, defined as a map + passed to helm template, defined as a map. This takes + precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -581,13 +582,14 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be - passed to helm template, defined as a map + passed to helm template, defined as a map. This takes + precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -993,13 +995,14 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed to - helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed to + helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be passed - to helm template, defined as a map + to helm template, defined as a map. This takes precedence + over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -1279,13 +1282,14 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed to + helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be passed - to helm template, defined as a map + to helm template, defined as a map. This takes precedence + over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -1717,13 +1721,14 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be - passed to helm template, defined as a map + passed to helm template, defined as a map. This takes + precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -2016,13 +2021,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. + ValuesObject takes precedence over Values, so use + one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to - be passed to helm template, defined as a map + be passed to helm template, defined as a map. This + takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -2459,14 +2466,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to - be passed to helm template, typically defined - as a block Deprecated: use valuesObject instead' + description: Values specifies Helm values to be + passed to helm template, typically defined as + a block. ValuesObject takes precedence over + Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be passed to helm template, defined as a - map + map. This takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -2774,14 +2782,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to + description: Values specifies Helm values to be passed to helm template, typically defined - as a block Deprecated: use valuesObject instead' + as a block. ValuesObject takes precedence + over Values, so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to be passed to helm template, defined as - a map + a map. This takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -3207,13 +3216,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. + ValuesObject takes precedence over Values, so use + one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to - be passed to helm template, defined as a map + be passed to helm template, defined as a map. This + takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -3516,13 +3527,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be + description: Values specifies Helm values to be passed to helm template, typically defined as - a block Deprecated: use valuesObject instead' + a block. ValuesObject takes precedence over Values, + so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values - to be passed to helm template, defined as a map + to be passed to helm template, defined as a map. + This takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -3931,13 +3944,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be passed - to helm template, typically defined as a block Deprecated: - use valuesObject instead' + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. + ValuesObject takes precedence over Values, so use + one or the other. type: string valuesObject: description: ValuesObject specifies Helm values to - be passed to helm template, defined as a map + be passed to helm template, defined as a map. This + takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: @@ -4240,13 +4255,15 @@ spec: type: string type: array values: - description: 'Values specifies Helm values to be + description: Values specifies Helm values to be passed to helm template, typically defined as - a block Deprecated: use valuesObject instead' + a block. ValuesObject takes precedence over Values, + so use one or the other. type: string valuesObject: description: ValuesObject specifies Helm values - to be passed to helm template, defined as a map + to be passed to helm template, defined as a map. + This takes precedence over Values. type: object x-kubernetes-preserve-unknown-fields: true version: diff --git a/pkg/apis/application/v1alpha1/generated.proto b/pkg/apis/application/v1alpha1/generated.proto index 3bb97a040a39f..26b74d01ce149 100644 --- a/pkg/apis/application/v1alpha1/generated.proto +++ b/pkg/apis/application/v1alpha1/generated.proto @@ -420,12 +420,11 @@ message ApplicationSourceHelm { // ReleaseName is the Helm release name to use. If omitted it will use the application name optional string releaseName = 3; - // Values specifies Helm values to be passed to helm template, typically defined as a block + // Values specifies Helm values to be passed to helm template, typically defined as a block. ValuesObject takes precedence over Values, so use one or the other. // +patchStrategy=replace - // Deprecated: use valuesObject instead optional string values = 4; - // ValuesObject specifies Helm values to be passed to helm template, defined as a map + // ValuesObject specifies Helm values to be passed to helm template, defined as a map. This takes precedence over Values. // +kubebuilder:pruning:PreserveUnknownFields optional k8s.io.apimachinery.pkg.runtime.RawExtension valuesObject = 10; diff --git a/pkg/apis/application/v1alpha1/openapi_generated.go b/pkg/apis/application/v1alpha1/openapi_generated.go index 283a60815fb71..b576a643225ae 100644 --- a/pkg/apis/application/v1alpha1/openapi_generated.go +++ b/pkg/apis/application/v1alpha1/openapi_generated.go @@ -1602,14 +1602,14 @@ func schema_pkg_apis_application_v1alpha1_ApplicationSourceHelm(ref common.Refer }, }, SchemaProps: spec.SchemaProps{ - Description: "Values specifies Helm values to be passed to helm template, typically defined as a block Deprecated: use valuesObject instead", + Description: "Values specifies Helm values to be passed to helm template, typically defined as a block. ValuesObject takes precedence over Values, so use one or the other.", Type: []string{"string"}, Format: "", }, }, "valuesObject": { SchemaProps: spec.SchemaProps{ - Description: "ValuesObject specifies Helm values to be passed to helm template, defined as a map", + Description: "ValuesObject specifies Helm values to be passed to helm template, defined as a map. This takes precedence over Values.", Ref: ref("k8s.io/apimachinery/pkg/runtime.RawExtension"), }, }, diff --git a/pkg/apis/application/v1alpha1/types.go b/pkg/apis/application/v1alpha1/types.go index 5b36c31bc05cb..0e07a673c1a93 100644 --- a/pkg/apis/application/v1alpha1/types.go +++ b/pkg/apis/application/v1alpha1/types.go @@ -299,11 +299,10 @@ type ApplicationSourceHelm struct { Parameters []HelmParameter `json:"parameters,omitempty" protobuf:"bytes,2,opt,name=parameters"` // ReleaseName is the Helm release name to use. If omitted it will use the application name ReleaseName string `json:"releaseName,omitempty" protobuf:"bytes,3,opt,name=releaseName"` - // Values specifies Helm values to be passed to helm template, typically defined as a block + // Values specifies Helm values to be passed to helm template, typically defined as a block. ValuesObject takes precedence over Values, so use one or the other. // +patchStrategy=replace - // Deprecated: use valuesObject instead Values string `json:"values,omitempty" patchStrategy:"replace" protobuf:"bytes,4,opt,name=values"` - // ValuesObject specifies Helm values to be passed to helm template, defined as a map + // ValuesObject specifies Helm values to be passed to helm template, defined as a map. This takes precedence over Values. // +kubebuilder:pruning:PreserveUnknownFields ValuesObject *runtime.RawExtension `json:"valuesObject,omitempty" protobuf:"bytes,10,opt,name=valuesObject"` // FileParameters are file parameters to the helm template From ed4a1bd86992afdad6cef70817fe4c9a732cccbc Mon Sep 17 00:00:00 2001 From: Blake Pettersson Date: Tue, 13 Jun 2023 20:40:08 +0200 Subject: [PATCH 19/22] chore: make codegen Signed-off-by: Blake Pettersson --- manifests/core-install.yaml | 18 + manifests/crds/applicationset-crd.yaml | 18 + manifests/ha/install.yaml | 18 + manifests/install.yaml | 18 + pkg/apis/application/v1alpha1/generated.pb.go | 1340 +++++++++-------- 5 files changed, 770 insertions(+), 642 deletions(-) diff --git a/manifests/core-install.yaml b/manifests/core-install.yaml index b2f97ea9cc33e..e1b454aabbf50 100644 --- a/manifests/core-install.yaml +++ b/manifests/core-install.yaml @@ -8805,6 +8805,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -8982,6 +8985,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -13200,6 +13206,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -13377,6 +13386,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -15524,6 +15536,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -15701,6 +15716,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object diff --git a/manifests/crds/applicationset-crd.yaml b/manifests/crds/applicationset-crd.yaml index 7de1c8fdc3ce1..7a4cabf7b1984 100644 --- a/manifests/crds/applicationset-crd.yaml +++ b/manifests/crds/applicationset-crd.yaml @@ -4354,6 +4354,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -4531,6 +4534,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -8749,6 +8755,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -8926,6 +8935,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -11073,6 +11085,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -11250,6 +11265,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object diff --git a/manifests/ha/install.yaml b/manifests/ha/install.yaml index 78a1b22d16275..1d6a6e61fdfd0 100644 --- a/manifests/ha/install.yaml +++ b/manifests/ha/install.yaml @@ -8805,6 +8805,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -8982,6 +8985,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -13200,6 +13206,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -13377,6 +13386,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -15524,6 +15536,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -15701,6 +15716,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object diff --git a/manifests/install.yaml b/manifests/install.yaml index 7b620654b330e..e606571e20359 100644 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -8805,6 +8805,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -8982,6 +8985,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -13200,6 +13206,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -13377,6 +13386,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -15524,6 +15536,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object @@ -15701,6 +15716,9 @@ spec: type: array values: type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true version: type: string type: object diff --git a/pkg/apis/application/v1alpha1/generated.pb.go b/pkg/apis/application/v1alpha1/generated.pb.go index d9de0c619ec17..49f612f4fb126 100644 --- a/pkg/apis/application/v1alpha1/generated.pb.go +++ b/pkg/apis/application/v1alpha1/generated.pb.go @@ -17,6 +17,7 @@ import ( v12 "k8s.io/api/core/v1" v11 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" math "math" math_bits "math/bits" @@ -4212,652 +4213,654 @@ func init() { } var fileDescriptor_030104ce3b95bcac = []byte{ - // 10312 bytes of a gzipped FileDescriptorProto + // 10347 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x1c, 0xc9, 0x75, 0x98, 0x66, 0x17, 0x0b, 0xec, 0x3e, 0x7c, 0x90, 0x68, 0x92, 0x77, 0x38, 0xea, 0xee, 0x40, - 0xcf, 0x95, 0x4f, 0xa7, 0xe8, 0x04, 0xf8, 0xa8, 0x93, 0x72, 0xf1, 0xd9, 0x92, 0xf1, 0x41, 0x82, - 0x20, 0x01, 0x02, 0xd7, 0x00, 0x49, 0x7d, 0xf8, 0x74, 0x1a, 0xcc, 0xf6, 0x2e, 0x86, 0x98, 0x9d, - 0x19, 0xce, 0xcc, 0x82, 0xc0, 0x59, 0x92, 0x25, 0xdb, 0xb2, 0x95, 0xe8, 0xe3, 0x14, 0x29, 0x55, - 0x96, 0x92, 0xc8, 0x91, 0x3f, 0x2a, 0x15, 0x57, 0x72, 0x15, 0xa5, 0xf2, 0x23, 0x4e, 0x9c, 0x94, - 0x4b, 0x76, 0x7e, 0x28, 0xa5, 0xa4, 0xa2, 0x4a, 0x5c, 0x96, 0x13, 0x3b, 0x88, 0x84, 0x54, 0x2a, - 0xa9, 0x54, 0xc5, 0x55, 0xf9, 0xf8, 0x13, 0x56, 0xaa, 0x92, 0xea, 0xef, 0x9e, 0xd9, 0x5d, 0x62, - 0x01, 0x0c, 0x48, 0x4a, 0xbe, 0x7f, 0xbb, 0xfd, 0xde, 0xbc, 0xd7, 0xd3, 0xd3, 0xfd, 0xfa, 0xbd, - 0xd7, 0xef, 0xbd, 0x86, 0xa5, 0xa6, 0x97, 0x6e, 0xb6, 0x37, 0xa6, 0xdc, 0xb0, 0x35, 0xed, 0xc4, - 0xcd, 0x30, 0x8a, 0xc3, 0xdb, 0xec, 0xc7, 0xbb, 0xdd, 0xfa, 0xf4, 0xf6, 0xc5, 0xe9, 0x68, 0xab, - 0x39, 0xed, 0x44, 0x5e, 0x32, 0xed, 0x44, 0x91, 0xef, 0xb9, 0x4e, 0xea, 0x85, 0xc1, 0xf4, 0xf6, - 0x0b, 0x8e, 0x1f, 0x6d, 0x3a, 0x2f, 0x4c, 0x37, 0x49, 0x40, 0x62, 0x27, 0x25, 0xf5, 0xa9, 0x28, - 0x0e, 0xd3, 0x10, 0xfd, 0x94, 0xa6, 0x36, 0x25, 0xa9, 0xb1, 0x1f, 0xaf, 0xb9, 0xf5, 0xa9, 0xed, - 0x8b, 0x53, 0xd1, 0x56, 0x73, 0x8a, 0x52, 0x9b, 0x32, 0xa8, 0x4d, 0x49, 0x6a, 0xe7, 0xdf, 0x6d, - 0xf4, 0xa5, 0x19, 0x36, 0xc3, 0x69, 0x46, 0x74, 0xa3, 0xdd, 0x60, 0xff, 0xd8, 0x1f, 0xf6, 0x8b, - 0x33, 0x3b, 0x6f, 0x6f, 0xbd, 0x94, 0x4c, 0x79, 0x21, 0xed, 0xde, 0xb4, 0x1b, 0xc6, 0x64, 0x7a, - 0xbb, 0xa3, 0x43, 0xe7, 0xaf, 0x68, 0x1c, 0xb2, 0x93, 0x92, 0x20, 0xf1, 0xc2, 0x20, 0x79, 0x37, - 0xed, 0x02, 0x89, 0xb7, 0x49, 0x6c, 0xbe, 0x9e, 0x81, 0xd0, 0x8d, 0xd2, 0x8b, 0x9a, 0x52, 0xcb, - 0x71, 0x37, 0xbd, 0x80, 0xc4, 0xbb, 0xfa, 0xf1, 0x16, 0x49, 0x9d, 0x6e, 0x4f, 0x4d, 0xf7, 0x7a, - 0x2a, 0x6e, 0x07, 0xa9, 0xd7, 0x22, 0x1d, 0x0f, 0xbc, 0xef, 0xa0, 0x07, 0x12, 0x77, 0x93, 0xb4, - 0x9c, 0x8e, 0xe7, 0xde, 0xd3, 0xeb, 0xb9, 0x76, 0xea, 0xf9, 0xd3, 0x5e, 0x90, 0x26, 0x69, 0x9c, - 0x7f, 0xc8, 0xbe, 0x03, 0xa3, 0x33, 0xb7, 0xd6, 0x66, 0xda, 0xe9, 0xe6, 0x5c, 0x18, 0x34, 0xbc, - 0x26, 0x7a, 0x2f, 0x0c, 0xbb, 0x7e, 0x3b, 0x49, 0x49, 0x7c, 0xdd, 0x69, 0x91, 0x09, 0xeb, 0x82, - 0xf5, 0x5c, 0x6d, 0xf6, 0xcc, 0xb7, 0xf7, 0x26, 0xdf, 0xb6, 0xbf, 0x37, 0x39, 0x3c, 0xa7, 0x41, - 0xd8, 0xc4, 0x43, 0xef, 0x84, 0xa1, 0x38, 0xf4, 0xc9, 0x0c, 0xbe, 0x3e, 0x51, 0x62, 0x8f, 0x9c, - 0x12, 0x8f, 0x0c, 0x61, 0xde, 0x8c, 0x25, 0xdc, 0xfe, 0xa3, 0x12, 0xc0, 0x4c, 0x14, 0xad, 0xc6, - 0xe1, 0x6d, 0xe2, 0xa6, 0xe8, 0x63, 0x50, 0xa5, 0x43, 0x57, 0x77, 0x52, 0x87, 0x71, 0x1b, 0xbe, - 0xf8, 0x13, 0x53, 0xfc, 0x4d, 0xa6, 0xcc, 0x37, 0xd1, 0x13, 0x87, 0x62, 0x4f, 0x6d, 0xbf, 0x30, - 0xb5, 0xb2, 0x41, 0x9f, 0x5f, 0x26, 0xa9, 0x33, 0x8b, 0x04, 0x33, 0xd0, 0x6d, 0x58, 0x51, 0x45, - 0x01, 0x0c, 0x24, 0x11, 0x71, 0x59, 0xc7, 0x86, 0x2f, 0x2e, 0x4d, 0x1d, 0x67, 0x86, 0x4e, 0xe9, - 0x9e, 0xaf, 0x45, 0xc4, 0x9d, 0x1d, 0x11, 0x9c, 0x07, 0xe8, 0x3f, 0xcc, 0xf8, 0xa0, 0x6d, 0x18, - 0x4c, 0x52, 0x27, 0x6d, 0x27, 0x13, 0x65, 0xc6, 0xf1, 0x7a, 0x61, 0x1c, 0x19, 0xd5, 0xd9, 0x31, - 0xc1, 0x73, 0x90, 0xff, 0xc7, 0x82, 0x9b, 0xfd, 0x1f, 0x2c, 0x18, 0xd3, 0xc8, 0x4b, 0x5e, 0x92, - 0xa2, 0x9f, 0xed, 0x18, 0xdc, 0xa9, 0xfe, 0x06, 0x97, 0x3e, 0xcd, 0x86, 0xf6, 0xb4, 0x60, 0x56, - 0x95, 0x2d, 0xc6, 0xc0, 0xb6, 0xa0, 0xe2, 0xa5, 0xa4, 0x95, 0x4c, 0x94, 0x2e, 0x94, 0x9f, 0x1b, - 0xbe, 0x78, 0xa5, 0xa8, 0xf7, 0x9c, 0x1d, 0x15, 0x4c, 0x2b, 0x8b, 0x94, 0x3c, 0xe6, 0x5c, 0xec, - 0xdf, 0x1e, 0x31, 0xdf, 0x8f, 0x0e, 0x38, 0x7a, 0x01, 0x86, 0x93, 0xb0, 0x1d, 0xbb, 0x04, 0x93, - 0x28, 0x4c, 0x26, 0xac, 0x0b, 0x65, 0x3a, 0xf5, 0xe8, 0x4c, 0x5d, 0xd3, 0xcd, 0xd8, 0xc4, 0x41, - 0x5f, 0xb4, 0x60, 0xa4, 0x4e, 0x92, 0xd4, 0x0b, 0x18, 0x7f, 0xd9, 0xf9, 0xf5, 0x63, 0x77, 0x5e, - 0x36, 0xce, 0x6b, 0xe2, 0xb3, 0x67, 0xc5, 0x8b, 0x8c, 0x18, 0x8d, 0x09, 0xce, 0xf0, 0xa7, 0x2b, - 0xae, 0x4e, 0x12, 0x37, 0xf6, 0x22, 0xfa, 0x9f, 0xcd, 0x19, 0x63, 0xc5, 0xcd, 0x6b, 0x10, 0x36, - 0xf1, 0x50, 0x00, 0x15, 0xba, 0xa2, 0x92, 0x89, 0x01, 0xd6, 0xff, 0xc5, 0xe3, 0xf5, 0x5f, 0x0c, - 0x2a, 0x5d, 0xac, 0x7a, 0xf4, 0xe9, 0xbf, 0x04, 0x73, 0x36, 0xe8, 0x0b, 0x16, 0x4c, 0x88, 0x15, - 0x8f, 0x09, 0x1f, 0xd0, 0x5b, 0x9b, 0x5e, 0x4a, 0x7c, 0x2f, 0x49, 0x27, 0x2a, 0xac, 0x0f, 0xd3, - 0xfd, 0xcd, 0xad, 0x85, 0x38, 0x6c, 0x47, 0xd7, 0xbc, 0xa0, 0x3e, 0x7b, 0x41, 0x70, 0x9a, 0x98, - 0xeb, 0x41, 0x18, 0xf7, 0x64, 0x89, 0xbe, 0x62, 0xc1, 0xf9, 0xc0, 0x69, 0x91, 0x24, 0x72, 0xe8, - 0xa7, 0xe5, 0xe0, 0x59, 0xdf, 0x71, 0xb7, 0x58, 0x8f, 0x06, 0x8f, 0xd6, 0x23, 0x5b, 0xf4, 0xe8, - 0xfc, 0xf5, 0x9e, 0xa4, 0xf1, 0x7d, 0xd8, 0xa2, 0xdf, 0xb4, 0x60, 0x3c, 0x8c, 0xa3, 0x4d, 0x27, - 0x20, 0x75, 0x09, 0x4d, 0x26, 0x86, 0xd8, 0xd2, 0xfb, 0xe8, 0xf1, 0x3e, 0xd1, 0x4a, 0x9e, 0xec, - 0x72, 0x18, 0x78, 0x69, 0x18, 0xaf, 0x91, 0x34, 0xf5, 0x82, 0x66, 0x32, 0x7b, 0x6e, 0x7f, 0x6f, - 0x72, 0xbc, 0x03, 0x0b, 0x77, 0xf6, 0x07, 0xfd, 0x1c, 0x0c, 0x27, 0xbb, 0x81, 0x7b, 0xcb, 0x0b, - 0xea, 0xe1, 0xdd, 0x64, 0xa2, 0x5a, 0xc4, 0xf2, 0x5d, 0x53, 0x04, 0xc5, 0x02, 0xd4, 0x0c, 0xb0, - 0xc9, 0xad, 0xfb, 0x87, 0xd3, 0x53, 0xa9, 0x56, 0xf4, 0x87, 0xd3, 0x93, 0xe9, 0x3e, 0x6c, 0xd1, - 0xaf, 0x58, 0x30, 0x9a, 0x78, 0xcd, 0xc0, 0x49, 0xdb, 0x31, 0xb9, 0x46, 0x76, 0x93, 0x09, 0x60, - 0x1d, 0xb9, 0x7a, 0xcc, 0x51, 0x31, 0x48, 0xce, 0x9e, 0x13, 0x7d, 0x1c, 0x35, 0x5b, 0x13, 0x9c, - 0xe5, 0xdb, 0x6d, 0xa1, 0xe9, 0x69, 0x3d, 0x5c, 0xec, 0x42, 0xd3, 0x93, 0xba, 0x27, 0x4b, 0xf4, - 0x33, 0x70, 0x9a, 0x37, 0xa9, 0x91, 0x4d, 0x26, 0x46, 0x98, 0xa0, 0x3d, 0xbb, 0xbf, 0x37, 0x79, - 0x7a, 0x2d, 0x07, 0xc3, 0x1d, 0xd8, 0xe8, 0x0e, 0x4c, 0x46, 0x24, 0x6e, 0x79, 0xe9, 0x4a, 0xe0, - 0xef, 0x4a, 0xf1, 0xed, 0x86, 0x11, 0xa9, 0x8b, 0xee, 0x24, 0x13, 0xa3, 0x17, 0xac, 0xe7, 0xaa, - 0xb3, 0xef, 0x10, 0xdd, 0x9c, 0x5c, 0xbd, 0x3f, 0x3a, 0x3e, 0x88, 0x9e, 0xfd, 0x2f, 0x4a, 0x70, - 0x3a, 0xbf, 0x71, 0xa2, 0xbf, 0x6d, 0xc1, 0xa9, 0xdb, 0x77, 0xd3, 0xf5, 0x70, 0x8b, 0x04, 0xc9, - 0xec, 0x2e, 0x15, 0x6f, 0x6c, 0xcb, 0x18, 0xbe, 0xe8, 0x16, 0xbb, 0x45, 0x4f, 0x5d, 0xcd, 0x72, - 0xb9, 0x14, 0xa4, 0xf1, 0xee, 0xec, 0xe3, 0xe2, 0xed, 0x4e, 0x5d, 0xbd, 0xb5, 0x6e, 0x42, 0x71, - 0xbe, 0x53, 0xe7, 0x3f, 0x67, 0xc1, 0xd9, 0x6e, 0x24, 0xd0, 0x69, 0x28, 0x6f, 0x91, 0x5d, 0xae, - 0x95, 0x61, 0xfa, 0x13, 0xbd, 0x0a, 0x95, 0x6d, 0xc7, 0x6f, 0x13, 0xa1, 0xdd, 0x2c, 0x1c, 0xef, - 0x45, 0x54, 0xcf, 0x30, 0xa7, 0xfa, 0x93, 0xa5, 0x97, 0x2c, 0xfb, 0x5f, 0x97, 0x61, 0xd8, 0xd8, - 0xdf, 0x1e, 0x80, 0xc6, 0x16, 0x66, 0x34, 0xb6, 0xe5, 0xc2, 0xb6, 0xe6, 0x9e, 0x2a, 0xdb, 0xdd, - 0x9c, 0xca, 0xb6, 0x52, 0x1c, 0xcb, 0xfb, 0xea, 0x6c, 0x28, 0x85, 0x5a, 0x18, 0x51, 0x8d, 0x9c, - 0x6e, 0xfd, 0x03, 0x45, 0x7c, 0xc2, 0x15, 0x49, 0x6e, 0x76, 0x74, 0x7f, 0x6f, 0xb2, 0xa6, 0xfe, - 0x62, 0xcd, 0xc8, 0xfe, 0x9e, 0x05, 0x67, 0x8d, 0x3e, 0xce, 0x85, 0x41, 0xdd, 0x63, 0x9f, 0xf6, - 0x02, 0x0c, 0xa4, 0xbb, 0x91, 0x54, 0xfb, 0xd5, 0x48, 0xad, 0xef, 0x46, 0x04, 0x33, 0x08, 0x55, - 0xf4, 0x5b, 0x24, 0x49, 0x9c, 0x26, 0xc9, 0x2b, 0xfa, 0xcb, 0xbc, 0x19, 0x4b, 0x38, 0x8a, 0x01, - 0xf9, 0x4e, 0x92, 0xae, 0xc7, 0x4e, 0x90, 0x30, 0xf2, 0xeb, 0x5e, 0x8b, 0x88, 0x01, 0xfe, 0x0b, - 0xfd, 0xcd, 0x18, 0xfa, 0xc4, 0xec, 0x63, 0xfb, 0x7b, 0x93, 0x68, 0xa9, 0x83, 0x12, 0xee, 0x42, - 0xdd, 0xfe, 0x8a, 0x05, 0x8f, 0x75, 0xd7, 0xc5, 0xd0, 0xb3, 0x30, 0xc8, 0x4d, 0x3e, 0xf1, 0x76, - 0xfa, 0x93, 0xb0, 0x56, 0x2c, 0xa0, 0x68, 0x1a, 0x6a, 0x6a, 0x9f, 0x10, 0xef, 0x38, 0x2e, 0x50, - 0x6b, 0x7a, 0x73, 0xd1, 0x38, 0x74, 0xd0, 0xe8, 0x1f, 0xa1, 0xb9, 0xa9, 0x41, 0x63, 0x46, 0x12, - 0x83, 0xd8, 0xff, 0xd1, 0x82, 0x53, 0x46, 0xaf, 0x1e, 0x80, 0x6a, 0x1e, 0x64, 0x55, 0xf3, 0xc5, - 0xc2, 0xe6, 0x73, 0x0f, 0xdd, 0xfc, 0x0b, 0x16, 0x9c, 0x37, 0xb0, 0x96, 0x9d, 0xd4, 0xdd, 0xbc, - 0xb4, 0x13, 0xc5, 0x24, 0xa1, 0xe6, 0x34, 0x7a, 0xca, 0x90, 0x5b, 0xb3, 0xc3, 0x82, 0x42, 0xf9, - 0x1a, 0xd9, 0xe5, 0x42, 0xec, 0x79, 0xa8, 0xf2, 0xc9, 0x19, 0xc6, 0x62, 0xc4, 0xd5, 0xbb, 0xad, - 0x88, 0x76, 0xac, 0x30, 0x90, 0x0d, 0x83, 0x4c, 0x38, 0xd1, 0xc5, 0x4a, 0xb7, 0x21, 0xa0, 0x1f, - 0xf1, 0x26, 0x6b, 0xc1, 0x02, 0x62, 0xaf, 0x64, 0xba, 0xb3, 0x1a, 0x13, 0xf6, 0x71, 0xeb, 0x97, - 0x3d, 0xe2, 0xd7, 0x13, 0x6a, 0x36, 0x38, 0x41, 0x10, 0xa6, 0xc2, 0x02, 0x30, 0xcc, 0x86, 0x19, - 0xdd, 0x8c, 0x4d, 0x1c, 0x7b, 0xbf, 0xc4, 0x8c, 0x0f, 0xb5, 0xac, 0xc9, 0x83, 0xb0, 0x5c, 0xe3, - 0x8c, 0x1c, 0x5c, 0x2d, 0x4e, 0x28, 0x91, 0xde, 0xd6, 0xeb, 0xeb, 0x39, 0x51, 0x88, 0x0b, 0xe5, - 0x7a, 0x7f, 0x0b, 0xf6, 0x5b, 0x25, 0x98, 0xcc, 0x3e, 0xd0, 0x21, 0x49, 0xa9, 0xb9, 0x64, 0x30, - 0xca, 0x3b, 0x28, 0x0c, 0x7c, 0x6c, 0xe2, 0xf5, 0x10, 0x46, 0xa5, 0x93, 0x14, 0x46, 0xa6, 0xac, - 0x2c, 0x1f, 0x20, 0x2b, 0x9f, 0x55, 0xa3, 0x3e, 0x90, 0x13, 0x4e, 0xd9, 0xfd, 0xe2, 0x02, 0x0c, - 0x24, 0x29, 0x89, 0x26, 0x2a, 0x59, 0x59, 0xb3, 0x96, 0x92, 0x08, 0x33, 0x88, 0xfd, 0xdf, 0x4a, - 0xf0, 0x78, 0x76, 0x0c, 0xb5, 0x78, 0xff, 0x40, 0x46, 0xbc, 0xbf, 0xcb, 0x14, 0xef, 0xf7, 0xf6, - 0x26, 0xdf, 0xde, 0xe3, 0xb1, 0x1f, 0x1a, 0xe9, 0x8f, 0x16, 0x72, 0xa3, 0x38, 0x9d, 0x1d, 0xc5, - 0x7b, 0x7b, 0x93, 0x4f, 0xf5, 0x78, 0xc7, 0xdc, 0x30, 0x3f, 0x0b, 0x83, 0x31, 0x71, 0x92, 0x30, - 0x10, 0x03, 0xad, 0x3e, 0x07, 0x66, 0xad, 0x58, 0x40, 0xed, 0x7f, 0x53, 0xcb, 0x0f, 0xf6, 0x02, - 0x77, 0xb0, 0x85, 0x31, 0xf2, 0x60, 0x80, 0xa9, 0xec, 0x5c, 0x34, 0x5c, 0x3b, 0xde, 0x32, 0xa2, - 0x22, 0x5e, 0x91, 0x9e, 0xad, 0xd2, 0xaf, 0x46, 0x9b, 0x30, 0x63, 0x81, 0x76, 0xa0, 0xea, 0x4a, - 0x4d, 0xba, 0x54, 0x84, 0xcf, 0x49, 0xe8, 0xd1, 0x9a, 0xe3, 0x08, 0x95, 0xc5, 0x4a, 0xfd, 0x56, - 0xdc, 0x10, 0x81, 0x72, 0xd3, 0x4b, 0xc5, 0x67, 0x3d, 0xa6, 0xad, 0xb4, 0xe0, 0x19, 0xaf, 0x38, - 0x44, 0x37, 0x88, 0x05, 0x2f, 0xc5, 0x94, 0x3e, 0xfa, 0x8c, 0x05, 0xc3, 0x89, 0xdb, 0x5a, 0x8d, - 0xc3, 0x6d, 0xaf, 0x4e, 0x62, 0xa1, 0x29, 0x1d, 0x53, 0x34, 0xad, 0xcd, 0x2d, 0x4b, 0x82, 0x9a, - 0x2f, 0xb7, 0x5d, 0x35, 0x04, 0x9b, 0x7c, 0xa9, 0x05, 0xf1, 0xb8, 0x78, 0xf7, 0x79, 0xe2, 0x7a, - 0x74, 0x6f, 0x93, 0x06, 0x13, 0x9b, 0x29, 0xc7, 0xd6, 0x1c, 0xe7, 0xdb, 0xee, 0x16, 0x5d, 0x6f, - 0xba, 0x43, 0x6f, 0xdf, 0xdf, 0x9b, 0x7c, 0x7c, 0xae, 0x3b, 0x4f, 0xdc, 0xab, 0x33, 0x6c, 0xc0, - 0xa2, 0xb6, 0xef, 0x63, 0x72, 0xa7, 0x4d, 0x98, 0x3b, 0xa4, 0x80, 0x01, 0x5b, 0xd5, 0x04, 0x73, - 0x03, 0x66, 0x40, 0xb0, 0xc9, 0x17, 0xdd, 0x81, 0xc1, 0x96, 0x93, 0xc6, 0xde, 0x8e, 0xf0, 0x81, - 0x1c, 0x53, 0x97, 0x5f, 0x66, 0xb4, 0x34, 0x73, 0xb6, 0xf5, 0xf3, 0x46, 0x2c, 0x18, 0xa1, 0x16, - 0x54, 0x5a, 0x24, 0x6e, 0x92, 0x89, 0x6a, 0x11, 0xfe, 0xde, 0x65, 0x4a, 0x4a, 0x33, 0xac, 0x51, - 0xcd, 0x87, 0xb5, 0x61, 0xce, 0x05, 0xbd, 0x0a, 0xd5, 0x84, 0xf8, 0xc4, 0xa5, 0xba, 0x4b, 0x8d, - 0x71, 0x7c, 0x4f, 0x9f, 0x7a, 0x9c, 0xb3, 0x41, 0xfc, 0x35, 0xf1, 0x28, 0x5f, 0x60, 0xf2, 0x1f, - 0x56, 0x24, 0xe9, 0x00, 0x46, 0x7e, 0xbb, 0xe9, 0x05, 0x13, 0x50, 0xc4, 0x00, 0xae, 0x32, 0x5a, - 0xb9, 0x01, 0xe4, 0x8d, 0x58, 0x30, 0xb2, 0xff, 0xb3, 0x05, 0x28, 0x2b, 0xd4, 0x1e, 0x80, 0xc2, - 0x7a, 0x27, 0xab, 0xb0, 0x2e, 0x15, 0xa9, 0x75, 0xf4, 0xd0, 0x59, 0x7f, 0xb7, 0x06, 0xb9, 0xed, - 0xe0, 0x3a, 0x49, 0x52, 0x52, 0x7f, 0x4b, 0x84, 0xbf, 0x25, 0xc2, 0xdf, 0x12, 0xe1, 0x4a, 0x84, - 0x6f, 0xe4, 0x44, 0xf8, 0xfb, 0x8d, 0x55, 0xaf, 0x0f, 0x4c, 0x5f, 0x53, 0x27, 0xaa, 0x66, 0x0f, - 0x0c, 0x04, 0x2a, 0x09, 0xae, 0xae, 0xad, 0x5c, 0xef, 0x2a, 0xb3, 0x5f, 0xcb, 0xca, 0xec, 0xe3, - 0xb2, 0xf8, 0xf3, 0x20, 0xa5, 0xff, 0x46, 0x09, 0x9e, 0xc8, 0x4a, 0x2f, 0x1c, 0xfa, 0x7e, 0xd8, - 0x4e, 0xa9, 0x2d, 0x80, 0x7e, 0xcd, 0x82, 0xd3, 0xad, 0xac, 0x11, 0x9e, 0x08, 0x5f, 0xe7, 0x07, - 0x0b, 0x13, 0xad, 0x39, 0x2b, 0x7f, 0x76, 0x42, 0x88, 0xd9, 0xd3, 0x39, 0x40, 0x82, 0x3b, 0xfa, - 0x82, 0x5e, 0x85, 0x5a, 0xcb, 0xd9, 0xb9, 0x11, 0xd5, 0x9d, 0x54, 0x9a, 0x61, 0xbd, 0xad, 0xe7, - 0x76, 0xea, 0xf9, 0x53, 0xfc, 0x04, 0x7b, 0x6a, 0x31, 0x48, 0x57, 0xe2, 0xb5, 0x34, 0xf6, 0x82, - 0x26, 0xf7, 0x70, 0x2d, 0x4b, 0x32, 0x58, 0x53, 0xb4, 0xbf, 0x6e, 0xe5, 0x65, 0xbb, 0x1a, 0x9d, - 0xd8, 0x49, 0x49, 0x73, 0x17, 0x7d, 0x1c, 0x2a, 0xd4, 0x5e, 0x92, 0xa3, 0x72, 0xab, 0xc8, 0x0d, - 0xc7, 0xf8, 0x12, 0x7a, 0xef, 0xa1, 0xff, 0x12, 0xcc, 0x99, 0xda, 0xdf, 0x1a, 0xcc, 0xef, 0xb1, - 0xec, 0x3c, 0xf3, 0x22, 0x40, 0x33, 0x5c, 0x27, 0xad, 0xc8, 0xa7, 0xc3, 0x62, 0x31, 0xa7, 0xb8, - 0x72, 0x11, 0x2c, 0x28, 0x08, 0x36, 0xb0, 0xd0, 0x5f, 0xb6, 0x00, 0x9a, 0x72, 0xaa, 0xc8, 0xfd, - 0xf3, 0x46, 0x91, 0xaf, 0xa3, 0x27, 0xa2, 0xee, 0x8b, 0x62, 0x88, 0x0d, 0xe6, 0xe8, 0x17, 0x2c, - 0xa8, 0xa6, 0xb2, 0xfb, 0x7c, 0x47, 0x59, 0x2f, 0xb2, 0x27, 0xf2, 0xa5, 0xb5, 0x2a, 0xa1, 0x86, - 0x44, 0xf1, 0x45, 0xbf, 0x6c, 0x01, 0x24, 0xbb, 0x81, 0xbb, 0x1a, 0xfa, 0x9e, 0xbb, 0x2b, 0x36, - 0x9a, 0x9b, 0x85, 0xba, 0x31, 0x14, 0xf5, 0xd9, 0x31, 0x3a, 0x1a, 0xfa, 0x3f, 0x36, 0x38, 0xa3, - 0x4f, 0x42, 0x35, 0x11, 0xd3, 0x4d, 0x6c, 0x2d, 0xeb, 0xc5, 0x3a, 0x53, 0x38, 0x6d, 0x21, 0x95, - 0xc4, 0x3f, 0xac, 0x78, 0xa2, 0x5f, 0xb5, 0xe0, 0x54, 0x94, 0x75, 0x7d, 0x89, 0x5d, 0xa4, 0x38, - 0x19, 0x90, 0x73, 0xad, 0xcd, 0x9e, 0xd9, 0xdf, 0x9b, 0x3c, 0x95, 0x6b, 0xc4, 0xf9, 0x5e, 0xa0, - 0x39, 0x18, 0xd7, 0x33, 0x78, 0x25, 0xe2, 0x6e, 0xb8, 0x21, 0xe6, 0x86, 0x63, 0xa7, 0x98, 0x0b, - 0x79, 0x20, 0xee, 0xc4, 0xb7, 0xbf, 0x53, 0xca, 0x78, 0xb1, 0x95, 0x7b, 0x89, 0xad, 0x08, 0x57, - 0x5a, 0xf6, 0x72, 0x81, 0x17, 0xba, 0x22, 0x94, 0xdf, 0x40, 0xaf, 0x08, 0xd5, 0x94, 0x60, 0x83, - 0x39, 0x55, 0x37, 0xc6, 0x9d, 0xbc, 0x13, 0x4b, 0x2c, 0xd2, 0x57, 0x8b, 0xec, 0x52, 0xe7, 0x99, - 0xc3, 0x13, 0xa2, 0x6b, 0xe3, 0x1d, 0x20, 0xdc, 0xd9, 0x25, 0xfb, 0x3b, 0x59, 0xcf, 0xb9, 0x31, - 0xbf, 0xfa, 0x38, 0x15, 0xf8, 0xa2, 0x05, 0xc3, 0x71, 0xe8, 0xfb, 0x5e, 0xd0, 0xa4, 0x6b, 0x41, - 0x08, 0xf4, 0x8f, 0x9c, 0x88, 0x4c, 0x15, 0x93, 0x9e, 0x29, 0x2d, 0x58, 0xf3, 0xc4, 0x66, 0x07, - 0xec, 0x4f, 0x5b, 0x30, 0xd1, 0x6b, 0xcd, 0x22, 0x02, 0x6f, 0x97, 0x13, 0x52, 0x9d, 0x89, 0xaf, - 0x04, 0xf3, 0xc4, 0x27, 0xca, 0xa5, 0x58, 0x9d, 0x7d, 0x46, 0xbc, 0xe6, 0xdb, 0x57, 0x7b, 0xa3, - 0xe2, 0xfb, 0xd1, 0xb1, 0x7f, 0xab, 0x94, 0x1f, 0x51, 0x25, 0xb3, 0xbf, 0x6a, 0x75, 0x18, 0x53, + 0xcf, 0x95, 0xcf, 0xa7, 0xe8, 0x0e, 0xf0, 0x51, 0x27, 0xe5, 0xe2, 0xb3, 0x25, 0x63, 0x01, 0x12, + 0x04, 0x09, 0x10, 0xb8, 0x06, 0x48, 0xea, 0xc3, 0xa7, 0xd3, 0x60, 0xb6, 0x77, 0x31, 0xc4, 0xec, + 0xcc, 0x72, 0x66, 0x16, 0x04, 0xce, 0x92, 0x2c, 0xd9, 0x96, 0xad, 0x44, 0x1f, 0xa7, 0x48, 0x49, + 0x59, 0x4a, 0x22, 0x47, 0xfe, 0xa8, 0x54, 0x5c, 0xc9, 0x55, 0x9c, 0xca, 0x8f, 0x38, 0x71, 0x52, + 0x2e, 0xd9, 0xf9, 0xa1, 0x94, 0x92, 0x8a, 0x2a, 0x71, 0x59, 0x4e, 0xec, 0x20, 0x12, 0x52, 0xa9, + 0xa4, 0x52, 0x15, 0x57, 0xe5, 0xe3, 0x4f, 0x58, 0xa9, 0x4a, 0xaa, 0xbf, 0x7b, 0x66, 0x77, 0x89, + 0x05, 0x76, 0x40, 0x52, 0xca, 0xfd, 0xdb, 0xed, 0xf7, 0xe6, 0xbd, 0x9e, 0x9e, 0xee, 0xd7, 0xef, + 0xbd, 0x7e, 0xef, 0x35, 0x2c, 0x37, 0xbc, 0x64, 0xab, 0xbd, 0x39, 0xe3, 0x86, 0xcd, 0x59, 0x27, + 0x6a, 0x84, 0xad, 0x28, 0xbc, 0xcd, 0x7e, 0xbc, 0xe0, 0xd6, 0x66, 0x77, 0x2e, 0xce, 0xb6, 0xb6, + 0x1b, 0xb3, 0x4e, 0xcb, 0x8b, 0x67, 0x9d, 0x56, 0xcb, 0xf7, 0x5c, 0x27, 0xf1, 0xc2, 0x60, 0x76, + 0xe7, 0x45, 0xc7, 0x6f, 0x6d, 0x39, 0x2f, 0xce, 0x36, 0x48, 0x40, 0x22, 0x27, 0x21, 0xb5, 0x99, + 0x56, 0x14, 0x26, 0x21, 0xfa, 0x49, 0x4d, 0x6d, 0x46, 0x52, 0x63, 0x3f, 0x5e, 0x77, 0x6b, 0x33, + 0x3b, 0x17, 0x67, 0x5a, 0xdb, 0x8d, 0x19, 0x4a, 0x6d, 0xc6, 0xa0, 0x36, 0x23, 0xa9, 0x9d, 0x7f, + 0xc1, 0xe8, 0x4b, 0x23, 0x6c, 0x84, 0xb3, 0x8c, 0xe8, 0x66, 0xbb, 0xce, 0xfe, 0xb1, 0x3f, 0xec, + 0x17, 0x67, 0x76, 0xde, 0xde, 0x7e, 0x39, 0x9e, 0xf1, 0x42, 0xda, 0xbd, 0x59, 0x37, 0x8c, 0xc8, + 0xec, 0x4e, 0x47, 0x87, 0xce, 0x5f, 0xd1, 0x38, 0x64, 0x37, 0x21, 0x41, 0xec, 0x85, 0x41, 0xfc, + 0x02, 0xed, 0x02, 0x89, 0x76, 0x48, 0x64, 0xbe, 0x9e, 0x81, 0xd0, 0x8d, 0xd2, 0x4b, 0x9a, 0x52, + 0xd3, 0x71, 0xb7, 0xbc, 0x80, 0x44, 0x7b, 0xfa, 0xf1, 0x26, 0x49, 0x9c, 0x6e, 0x4f, 0xcd, 0xf6, + 0x7a, 0x2a, 0x6a, 0x07, 0x89, 0xd7, 0x24, 0x1d, 0x0f, 0xbc, 0xef, 0xb0, 0x07, 0x62, 0x77, 0x8b, + 0x34, 0x9d, 0x8e, 0xe7, 0xde, 0xd3, 0xeb, 0xb9, 0x76, 0xe2, 0xf9, 0xb3, 0x5e, 0x90, 0xc4, 0x49, + 0x94, 0x7d, 0xc8, 0xbe, 0x03, 0xe3, 0x73, 0xb7, 0xd6, 0xe7, 0xda, 0xc9, 0xd6, 0x7c, 0x18, 0xd4, + 0xbd, 0x06, 0x7a, 0x2f, 0x8c, 0xba, 0x7e, 0x3b, 0x4e, 0x48, 0x74, 0xdd, 0x69, 0x92, 0x29, 0xeb, + 0x82, 0xf5, 0x5c, 0xa5, 0x7a, 0xe6, 0x5b, 0xfb, 0xd3, 0xef, 0x38, 0xd8, 0x9f, 0x1e, 0x9d, 0xd7, + 0x20, 0x6c, 0xe2, 0xa1, 0x77, 0xc1, 0x48, 0x14, 0xfa, 0x64, 0x0e, 0x5f, 0x9f, 0x2a, 0xb0, 0x47, + 0x4e, 0x89, 0x47, 0x46, 0x30, 0x6f, 0xc6, 0x12, 0x6e, 0xff, 0x51, 0x01, 0x60, 0xae, 0xd5, 0x5a, + 0x8b, 0xc2, 0xdb, 0xc4, 0x4d, 0xd0, 0xc7, 0xa0, 0x4c, 0x87, 0xae, 0xe6, 0x24, 0x0e, 0xe3, 0x36, + 0x7a, 0xf1, 0xc7, 0x67, 0xf8, 0x9b, 0xcc, 0x98, 0x6f, 0xa2, 0x27, 0x0e, 0xc5, 0x9e, 0xd9, 0x79, + 0x71, 0x66, 0x75, 0x93, 0x3e, 0xbf, 0x42, 0x12, 0xa7, 0x8a, 0x04, 0x33, 0xd0, 0x6d, 0x58, 0x51, + 0x45, 0x01, 0x0c, 0xc5, 0x2d, 0xe2, 0xb2, 0x8e, 0x8d, 0x5e, 0x5c, 0x9e, 0x19, 0x64, 0x86, 0xce, + 0xe8, 0x9e, 0xaf, 0xb7, 0x88, 0x5b, 0x1d, 0x13, 0x9c, 0x87, 0xe8, 0x3f, 0xcc, 0xf8, 0xa0, 0x1d, + 0x18, 0x8e, 0x13, 0x27, 0x69, 0xc7, 0x53, 0x45, 0xc6, 0xf1, 0x7a, 0x6e, 0x1c, 0x19, 0xd5, 0xea, + 0x84, 0xe0, 0x39, 0xcc, 0xff, 0x63, 0xc1, 0xcd, 0xfe, 0xf7, 0x16, 0x4c, 0x68, 0xe4, 0x65, 0x2f, + 0x4e, 0xd0, 0xcf, 0x74, 0x0c, 0xee, 0x4c, 0x7f, 0x83, 0x4b, 0x9f, 0x66, 0x43, 0x7b, 0x5a, 0x30, + 0x2b, 0xcb, 0x16, 0x63, 0x60, 0x9b, 0x50, 0xf2, 0x12, 0xd2, 0x8c, 0xa7, 0x0a, 0x17, 0x8a, 0xcf, + 0x8d, 0x5e, 0xbc, 0x92, 0xd7, 0x7b, 0x56, 0xc7, 0x05, 0xd3, 0xd2, 0x12, 0x25, 0x8f, 0x39, 0x17, + 0xfb, 0xb7, 0xc6, 0xcc, 0xf7, 0xa3, 0x03, 0x8e, 0x5e, 0x84, 0xd1, 0x38, 0x6c, 0x47, 0x2e, 0xc1, + 0xa4, 0x15, 0xc6, 0x53, 0xd6, 0x85, 0x22, 0x9d, 0x7a, 0x74, 0xa6, 0xae, 0xeb, 0x66, 0x6c, 0xe2, + 0xa0, 0x2f, 0x5a, 0x30, 0x56, 0x23, 0x71, 0xe2, 0x05, 0x8c, 0xbf, 0xec, 0xfc, 0xc6, 0xc0, 0x9d, + 0x97, 0x8d, 0x0b, 0x9a, 0x78, 0xf5, 0xac, 0x78, 0x91, 0x31, 0xa3, 0x31, 0xc6, 0x29, 0xfe, 0x74, + 0xc5, 0xd5, 0x48, 0xec, 0x46, 0x5e, 0x8b, 0xfe, 0x67, 0x73, 0xc6, 0x58, 0x71, 0x0b, 0x1a, 0x84, + 0x4d, 0x3c, 0x14, 0x40, 0x89, 0xae, 0xa8, 0x78, 0x6a, 0x88, 0xf5, 0x7f, 0x69, 0xb0, 0xfe, 0x8b, + 0x41, 0xa5, 0x8b, 0x55, 0x8f, 0x3e, 0xfd, 0x17, 0x63, 0xce, 0x06, 0x7d, 0xc1, 0x82, 0x29, 0xb1, + 0xe2, 0x31, 0xe1, 0x03, 0x7a, 0x6b, 0xcb, 0x4b, 0x88, 0xef, 0xc5, 0xc9, 0x54, 0x89, 0xf5, 0x61, + 0xb6, 0xbf, 0xb9, 0xb5, 0x18, 0x85, 0xed, 0xd6, 0x35, 0x2f, 0xa8, 0x55, 0x2f, 0x08, 0x4e, 0x53, + 0xf3, 0x3d, 0x08, 0xe3, 0x9e, 0x2c, 0xd1, 0x57, 0x2c, 0x38, 0x1f, 0x38, 0x4d, 0x12, 0xb7, 0x1c, + 0xfa, 0x69, 0x39, 0xb8, 0xea, 0x3b, 0xee, 0x36, 0xeb, 0xd1, 0xf0, 0xf1, 0x7a, 0x64, 0x8b, 0x1e, + 0x9d, 0xbf, 0xde, 0x93, 0x34, 0xbe, 0x0f, 0x5b, 0xf4, 0x1b, 0x16, 0x4c, 0x86, 0x51, 0x6b, 0xcb, + 0x09, 0x48, 0x4d, 0x42, 0xe3, 0xa9, 0x11, 0xb6, 0xf4, 0x3e, 0x3a, 0xd8, 0x27, 0x5a, 0xcd, 0x92, + 0x5d, 0x09, 0x03, 0x2f, 0x09, 0xa3, 0x75, 0x92, 0x24, 0x5e, 0xd0, 0x88, 0xab, 0xe7, 0x0e, 0xf6, + 0xa7, 0x27, 0x3b, 0xb0, 0x70, 0x67, 0x7f, 0xd0, 0xcf, 0xc2, 0x68, 0xbc, 0x17, 0xb8, 0xb7, 0xbc, + 0xa0, 0x16, 0xde, 0x8d, 0xa7, 0xca, 0x79, 0x2c, 0xdf, 0x75, 0x45, 0x50, 0x2c, 0x40, 0xcd, 0x00, + 0x9b, 0xdc, 0xba, 0x7f, 0x38, 0x3d, 0x95, 0x2a, 0x79, 0x7f, 0x38, 0x3d, 0x99, 0xee, 0xc3, 0x16, + 0xfd, 0xb2, 0x05, 0xe3, 0xb1, 0xd7, 0x08, 0x9c, 0xa4, 0x1d, 0x91, 0x6b, 0x64, 0x2f, 0x9e, 0x02, + 0xd6, 0x91, 0xab, 0x03, 0x8e, 0x8a, 0x41, 0xb2, 0x7a, 0x4e, 0xf4, 0x71, 0xdc, 0x6c, 0x8d, 0x71, + 0x9a, 0x6f, 0xb7, 0x85, 0xa6, 0xa7, 0xf5, 0x68, 0xbe, 0x0b, 0x4d, 0x4f, 0xea, 0x9e, 0x2c, 0xd1, + 0x4f, 0xc3, 0x69, 0xde, 0xa4, 0x46, 0x36, 0x9e, 0x1a, 0x63, 0x82, 0xf6, 0xec, 0xc1, 0xfe, 0xf4, + 0xe9, 0xf5, 0x0c, 0x0c, 0x77, 0x60, 0xa3, 0x3b, 0x30, 0xdd, 0x22, 0x51, 0xd3, 0x4b, 0x56, 0x03, + 0x7f, 0x4f, 0x8a, 0x6f, 0x37, 0x6c, 0x91, 0x9a, 0xe8, 0x4e, 0x3c, 0x35, 0x7e, 0xc1, 0x7a, 0xae, + 0x5c, 0xfd, 0x31, 0xd1, 0xcd, 0xe9, 0xb5, 0xfb, 0xa3, 0xe3, 0xc3, 0xe8, 0xd9, 0xff, 0xbc, 0x00, + 0xa7, 0xb3, 0x1b, 0x27, 0xfa, 0x5b, 0x16, 0x9c, 0xba, 0x7d, 0x37, 0xd9, 0x08, 0xb7, 0x49, 0x10, + 0x57, 0xf7, 0xa8, 0x78, 0x63, 0x5b, 0xc6, 0xe8, 0x45, 0x37, 0xdf, 0x2d, 0x7a, 0xe6, 0x6a, 0x9a, + 0xcb, 0xa5, 0x20, 0x89, 0xf6, 0xaa, 0x8f, 0x8b, 0xb7, 0x3b, 0x75, 0xf5, 0xd6, 0x86, 0x09, 0xc5, + 0xd9, 0x4e, 0x9d, 0xff, 0x9c, 0x05, 0x67, 0xbb, 0x91, 0x40, 0xa7, 0xa1, 0xb8, 0x4d, 0xf6, 0xb8, + 0x56, 0x86, 0xe9, 0x4f, 0xf4, 0x1a, 0x94, 0x76, 0x1c, 0xbf, 0x4d, 0x84, 0x76, 0xb3, 0x38, 0xd8, + 0x8b, 0xa8, 0x9e, 0x61, 0x4e, 0xf5, 0x27, 0x0a, 0x2f, 0x5b, 0xf6, 0xbf, 0x2a, 0xc2, 0xa8, 0xb1, + 0xbf, 0x3d, 0x00, 0x8d, 0x2d, 0x4c, 0x69, 0x6c, 0x2b, 0xb9, 0x6d, 0xcd, 0x3d, 0x55, 0xb6, 0xbb, + 0x19, 0x95, 0x6d, 0x35, 0x3f, 0x96, 0xf7, 0xd5, 0xd9, 0x50, 0x02, 0x95, 0xb0, 0x45, 0x35, 0x72, + 0xba, 0xf5, 0x0f, 0xe5, 0xf1, 0x09, 0x57, 0x25, 0xb9, 0xea, 0xf8, 0xc1, 0xfe, 0x74, 0x45, 0xfd, + 0xc5, 0x9a, 0x91, 0xfd, 0x5d, 0x0b, 0xce, 0x1a, 0x7d, 0x9c, 0x0f, 0x83, 0x9a, 0xc7, 0x3e, 0xed, + 0x05, 0x18, 0x4a, 0xf6, 0x5a, 0x52, 0xed, 0x57, 0x23, 0xb5, 0xb1, 0xd7, 0x22, 0x98, 0x41, 0xa8, + 0xa2, 0xdf, 0x24, 0x71, 0xec, 0x34, 0x48, 0x56, 0xd1, 0x5f, 0xe1, 0xcd, 0x58, 0xc2, 0x51, 0x04, + 0xc8, 0x77, 0xe2, 0x64, 0x23, 0x72, 0x82, 0x98, 0x91, 0xdf, 0xf0, 0x9a, 0x44, 0x0c, 0xf0, 0x9f, + 0xeb, 0x6f, 0xc6, 0xd0, 0x27, 0xaa, 0x8f, 0x1d, 0xec, 0x4f, 0xa3, 0xe5, 0x0e, 0x4a, 0xb8, 0x0b, + 0x75, 0xfb, 0x2b, 0x16, 0x3c, 0xd6, 0x5d, 0x17, 0x43, 0xcf, 0xc2, 0x30, 0x37, 0xf9, 0xc4, 0xdb, + 0xe9, 0x4f, 0xc2, 0x5a, 0xb1, 0x80, 0xa2, 0x59, 0xa8, 0xa8, 0x7d, 0x42, 0xbc, 0xe3, 0xa4, 0x40, + 0xad, 0xe8, 0xcd, 0x45, 0xe3, 0xd0, 0x41, 0xa3, 0x7f, 0x84, 0xe6, 0xa6, 0x06, 0x8d, 0x19, 0x49, + 0x0c, 0x62, 0xff, 0x07, 0x0b, 0x4e, 0x19, 0xbd, 0x7a, 0x00, 0xaa, 0x79, 0x90, 0x56, 0xcd, 0x97, + 0x72, 0x9b, 0xcf, 0x3d, 0x74, 0xf3, 0x2f, 0x58, 0x70, 0xde, 0xc0, 0x5a, 0x71, 0x12, 0x77, 0xeb, + 0xd2, 0x6e, 0x2b, 0x22, 0x31, 0x35, 0xa7, 0xd1, 0x53, 0x86, 0xdc, 0xaa, 0x8e, 0x0a, 0x0a, 0xc5, + 0x6b, 0x64, 0x8f, 0x0b, 0xb1, 0xe7, 0xa1, 0xcc, 0x27, 0x67, 0x18, 0x89, 0x11, 0x57, 0xef, 0xb6, + 0x2a, 0xda, 0xb1, 0xc2, 0x40, 0x36, 0x0c, 0x33, 0xe1, 0x44, 0x17, 0x2b, 0xdd, 0x86, 0x80, 0x7e, + 0xc4, 0x9b, 0xac, 0x05, 0x0b, 0x88, 0xbd, 0x9a, 0xea, 0xce, 0x5a, 0x44, 0xd8, 0xc7, 0xad, 0x5d, + 0xf6, 0x88, 0x5f, 0x8b, 0xa9, 0xd9, 0xe0, 0x04, 0x41, 0x98, 0x08, 0x0b, 0xc0, 0x30, 0x1b, 0xe6, + 0x74, 0x33, 0x36, 0x71, 0xec, 0x83, 0x02, 0x33, 0x3e, 0xd4, 0xb2, 0x26, 0x0f, 0xc2, 0x72, 0x8d, + 0x52, 0x72, 0x70, 0x2d, 0x3f, 0xa1, 0x44, 0x7a, 0x5b, 0xaf, 0x6f, 0x64, 0x44, 0x21, 0xce, 0x95, + 0xeb, 0xfd, 0x2d, 0xd8, 0x6f, 0x16, 0x60, 0x3a, 0xfd, 0x40, 0x87, 0x24, 0xa5, 0xe6, 0x92, 0xc1, + 0x28, 0xeb, 0xa0, 0x30, 0xf0, 0xb1, 0x89, 0xd7, 0x43, 0x18, 0x15, 0x4e, 0x52, 0x18, 0x99, 0xb2, + 0xb2, 0x78, 0x88, 0xac, 0x7c, 0x56, 0x8d, 0xfa, 0x50, 0x46, 0x38, 0xa5, 0xf7, 0x8b, 0x0b, 0x30, + 0x14, 0x27, 0xa4, 0x35, 0x55, 0x4a, 0xcb, 0x9a, 0xf5, 0x84, 0xb4, 0x30, 0x83, 0xd8, 0xff, 0xb5, + 0x00, 0x8f, 0xa7, 0xc7, 0x50, 0x8b, 0xf7, 0x0f, 0xa4, 0xc4, 0xfb, 0xbb, 0x4d, 0xf1, 0x7e, 0x6f, + 0x7f, 0xfa, 0x9d, 0x3d, 0x1e, 0xfb, 0x81, 0x91, 0xfe, 0x68, 0x31, 0x33, 0x8a, 0xb3, 0xe9, 0x51, + 0xbc, 0xb7, 0x3f, 0xfd, 0x54, 0x8f, 0x77, 0xcc, 0x0c, 0xf3, 0xb3, 0x30, 0x1c, 0x11, 0x27, 0x0e, + 0x03, 0x31, 0xd0, 0xea, 0x73, 0x60, 0xd6, 0x8a, 0x05, 0xd4, 0xfe, 0xd7, 0x95, 0xec, 0x60, 0x2f, + 0x72, 0x07, 0x5b, 0x18, 0x21, 0x0f, 0x86, 0x98, 0xca, 0xce, 0x45, 0xc3, 0xb5, 0xc1, 0x96, 0x11, + 0x15, 0xf1, 0x8a, 0x74, 0xb5, 0x4c, 0xbf, 0x1a, 0x6d, 0xc2, 0x8c, 0x05, 0xda, 0x85, 0xb2, 0x2b, + 0x35, 0xe9, 0x42, 0x1e, 0x3e, 0x27, 0xa1, 0x47, 0x6b, 0x8e, 0x63, 0x54, 0x16, 0x2b, 0xf5, 0x5b, + 0x71, 0x43, 0x04, 0x8a, 0x0d, 0x2f, 0x11, 0x9f, 0x75, 0x40, 0x5b, 0x69, 0xd1, 0x33, 0x5e, 0x71, + 0x84, 0x6e, 0x10, 0x8b, 0x5e, 0x82, 0x29, 0x7d, 0xf4, 0x19, 0x0b, 0x46, 0x63, 0xb7, 0xb9, 0x16, + 0x85, 0x3b, 0x5e, 0x8d, 0x44, 0x42, 0x53, 0x1a, 0x50, 0x34, 0xad, 0xcf, 0xaf, 0x48, 0x82, 0x9a, + 0x2f, 0xb7, 0x5d, 0x35, 0x04, 0x9b, 0x7c, 0xa9, 0x05, 0xf1, 0xb8, 0x78, 0xf7, 0x05, 0xe2, 0x7a, + 0x74, 0x6f, 0x93, 0x06, 0x13, 0x9b, 0x29, 0x03, 0x6b, 0x8e, 0x0b, 0x6d, 0x77, 0x9b, 0xae, 0x37, + 0xdd, 0xa1, 0x77, 0x1e, 0xec, 0x4f, 0x3f, 0x3e, 0xdf, 0x9d, 0x27, 0xee, 0xd5, 0x19, 0x36, 0x60, + 0xad, 0xb6, 0xef, 0x63, 0x72, 0xa7, 0x4d, 0x98, 0x3b, 0x24, 0x87, 0x01, 0x5b, 0xd3, 0x04, 0x33, + 0x03, 0x66, 0x40, 0xb0, 0xc9, 0x17, 0xdd, 0x81, 0xe1, 0xa6, 0x93, 0x44, 0xde, 0xae, 0xf0, 0x81, + 0x0c, 0xa8, 0xcb, 0xaf, 0x30, 0x5a, 0x9a, 0x39, 0xdb, 0xfa, 0x79, 0x23, 0x16, 0x8c, 0x50, 0x13, + 0x4a, 0x4d, 0x12, 0x35, 0xc8, 0x54, 0x39, 0x0f, 0x7f, 0xef, 0x0a, 0x25, 0xa5, 0x19, 0x56, 0xa8, + 0xe6, 0xc3, 0xda, 0x30, 0xe7, 0x82, 0x5e, 0x83, 0x72, 0x4c, 0x7c, 0xe2, 0x52, 0xdd, 0xa5, 0xc2, + 0x38, 0xbe, 0xa7, 0x4f, 0x3d, 0xce, 0xd9, 0x24, 0xfe, 0xba, 0x78, 0x94, 0x2f, 0x30, 0xf9, 0x0f, + 0x2b, 0x92, 0x74, 0x00, 0x5b, 0x7e, 0xbb, 0xe1, 0x05, 0x53, 0x90, 0xc7, 0x00, 0xae, 0x31, 0x5a, + 0x99, 0x01, 0xe4, 0x8d, 0x58, 0x30, 0xb2, 0xff, 0x93, 0x05, 0x28, 0x2d, 0xd4, 0x1e, 0x80, 0xc2, + 0x7a, 0x27, 0xad, 0xb0, 0x2e, 0xe7, 0xa9, 0x75, 0xf4, 0xd0, 0x59, 0x7f, 0xb7, 0x02, 0x99, 0xed, + 0xe0, 0x3a, 0x89, 0x13, 0x52, 0x7b, 0x5b, 0x84, 0xbf, 0x2d, 0xc2, 0xdf, 0x16, 0xe1, 0x4a, 0x84, + 0x6f, 0x66, 0x44, 0xf8, 0xfb, 0x8d, 0x55, 0xaf, 0x0f, 0x4c, 0x5f, 0x57, 0x27, 0xaa, 0x66, 0x0f, + 0x0c, 0x04, 0x2a, 0x09, 0xae, 0xae, 0xaf, 0x5e, 0xef, 0x2a, 0xb3, 0x5f, 0x4f, 0xcb, 0xec, 0x41, + 0x59, 0xfc, 0xff, 0x20, 0xa5, 0xff, 0x7a, 0x01, 0x9e, 0x48, 0x4b, 0x2f, 0x1c, 0xfa, 0x7e, 0xd8, + 0x4e, 0xa8, 0x2d, 0x80, 0x7e, 0xd5, 0x82, 0xd3, 0xcd, 0xb4, 0x11, 0x1e, 0x0b, 0x5f, 0xe7, 0x07, + 0x73, 0x13, 0xad, 0x19, 0x2b, 0xbf, 0x3a, 0x25, 0xc4, 0xec, 0xe9, 0x0c, 0x20, 0xc6, 0x1d, 0x7d, + 0x41, 0xaf, 0x41, 0xa5, 0xe9, 0xec, 0xde, 0x68, 0xd5, 0x9c, 0x44, 0x9a, 0x61, 0xbd, 0xad, 0xe7, + 0x76, 0xe2, 0xf9, 0x33, 0xfc, 0x04, 0x7b, 0x66, 0x29, 0x48, 0x56, 0xa3, 0xf5, 0x24, 0xf2, 0x82, + 0x06, 0xf7, 0x70, 0xad, 0x48, 0x32, 0x58, 0x53, 0xb4, 0xbf, 0x6e, 0x65, 0x65, 0xbb, 0x1a, 0x9d, + 0xc8, 0x49, 0x48, 0x63, 0x0f, 0x7d, 0x1c, 0x4a, 0xd4, 0x5e, 0x92, 0xa3, 0x72, 0x2b, 0xcf, 0x0d, + 0xc7, 0xf8, 0x12, 0x7a, 0xef, 0xa1, 0xff, 0x62, 0xcc, 0x99, 0xda, 0xdf, 0x1c, 0xce, 0xee, 0xb1, + 0xec, 0x3c, 0xf3, 0x22, 0x40, 0x23, 0xdc, 0x20, 0xcd, 0x96, 0x4f, 0x87, 0xc5, 0x62, 0x4e, 0x71, + 0xe5, 0x22, 0x58, 0x54, 0x10, 0x6c, 0x60, 0xa1, 0xbf, 0x68, 0x01, 0x34, 0xe4, 0x54, 0x91, 0xfb, + 0xe7, 0x8d, 0x3c, 0x5f, 0x47, 0x4f, 0x44, 0xdd, 0x17, 0xc5, 0x10, 0x1b, 0xcc, 0xd1, 0xcf, 0x5b, + 0x50, 0x4e, 0x64, 0xf7, 0xf9, 0x8e, 0xb2, 0x91, 0x67, 0x4f, 0xe4, 0x4b, 0x6b, 0x55, 0x42, 0x0d, + 0x89, 0xe2, 0x8b, 0x7e, 0xc9, 0x02, 0x88, 0xf7, 0x02, 0x77, 0x2d, 0xf4, 0x3d, 0x77, 0x4f, 0x6c, + 0x34, 0x37, 0x73, 0x75, 0x63, 0x28, 0xea, 0xd5, 0x09, 0x3a, 0x1a, 0xfa, 0x3f, 0x36, 0x38, 0xa3, + 0x4f, 0x42, 0x39, 0x16, 0xd3, 0x4d, 0x6c, 0x2d, 0x1b, 0xf9, 0x3a, 0x53, 0x38, 0x6d, 0x21, 0x95, + 0xc4, 0x3f, 0xac, 0x78, 0xa2, 0x5f, 0xb1, 0xe0, 0x54, 0x2b, 0xed, 0xfa, 0x12, 0xbb, 0x48, 0x7e, + 0x32, 0x20, 0xe3, 0x5a, 0xab, 0x9e, 0x39, 0xd8, 0x9f, 0x3e, 0x95, 0x69, 0xc4, 0xd9, 0x5e, 0xa0, + 0x79, 0x98, 0xd4, 0x33, 0x78, 0xb5, 0xc5, 0xdd, 0x70, 0x23, 0xcc, 0x0d, 0xc7, 0x4e, 0x31, 0x17, + 0xb3, 0x40, 0xdc, 0x89, 0x6f, 0x7f, 0xbb, 0x90, 0xf2, 0x62, 0x2b, 0xf7, 0x12, 0x5b, 0x11, 0xae, + 0xb4, 0xec, 0xe5, 0x02, 0xcf, 0x75, 0x45, 0x28, 0xbf, 0x81, 0x5e, 0x11, 0xaa, 0x29, 0xc6, 0x06, + 0x73, 0xaa, 0x6e, 0x4c, 0x3a, 0x59, 0x27, 0x96, 0x58, 0xa4, 0xaf, 0xe5, 0xd9, 0xa5, 0xce, 0x33, + 0x87, 0x27, 0x44, 0xd7, 0x26, 0x3b, 0x40, 0xb8, 0xb3, 0x4b, 0xf6, 0xb7, 0xd3, 0x9e, 0x73, 0x63, + 0x7e, 0xf5, 0x71, 0x2a, 0xf0, 0x45, 0x0b, 0x46, 0xa3, 0xd0, 0xf7, 0xbd, 0xa0, 0x41, 0xd7, 0x82, + 0x10, 0xe8, 0x1f, 0x39, 0x11, 0x99, 0x2a, 0x26, 0x3d, 0x53, 0x5a, 0xb0, 0xe6, 0x89, 0xcd, 0x0e, + 0xd8, 0x9f, 0xb6, 0x60, 0xaa, 0xd7, 0x9a, 0x45, 0x04, 0xde, 0x29, 0x27, 0xa4, 0x3a, 0x13, 0x5f, + 0x0d, 0x16, 0x88, 0x4f, 0x94, 0x4b, 0xb1, 0x5c, 0x7d, 0x46, 0xbc, 0xe6, 0x3b, 0xd7, 0x7a, 0xa3, + 0xe2, 0xfb, 0xd1, 0xb1, 0x7f, 0xb3, 0x90, 0x1d, 0x51, 0x25, 0xb3, 0xbf, 0x6a, 0x75, 0x18, 0x53, 0x1f, 0x3c, 0x09, 0x39, 0xc9, 0xcc, 0x2e, 0x75, 0x34, 0xde, 0x1b, 0xe7, 0x21, 0x9e, 0xbd, 0xd9, - 0xff, 0x72, 0x00, 0xee, 0xd3, 0x33, 0x75, 0xba, 0x62, 0xf5, 0x3a, 0x5d, 0x39, 0xfc, 0x81, 0xcd, - 0xe7, 0x2d, 0x18, 0xf4, 0xa9, 0x5e, 0xc7, 0x4f, 0x10, 0x86, 0x2f, 0xd6, 0x4f, 0x6a, 0xec, 0xb9, - 0xfa, 0x98, 0xf0, 0xf3, 0x5f, 0xe5, 0x44, 0xe4, 0x8d, 0x58, 0xf4, 0x01, 0x7d, 0xc3, 0xca, 0x1e, + 0xff, 0x62, 0x08, 0xee, 0xd3, 0x33, 0x75, 0xba, 0x62, 0xf5, 0x3a, 0x5d, 0x39, 0xfa, 0x81, 0xcd, + 0xe7, 0x2d, 0x18, 0xf6, 0xa9, 0x5e, 0xc7, 0x4f, 0x10, 0x46, 0x2f, 0xd6, 0x4e, 0x6a, 0xec, 0xb9, + 0xfa, 0x18, 0xf3, 0xf3, 0x5f, 0xe5, 0x44, 0xe4, 0x8d, 0x58, 0xf4, 0x01, 0x7d, 0xc3, 0x4a, 0x1f, 0x47, 0xf0, 0x80, 0x1e, 0xef, 0xc4, 0xfa, 0x64, 0x9c, 0x71, 0xf0, 0x8e, 0x69, 0xef, 0x79, 0x8f, - 0xd3, 0x0f, 0x34, 0x05, 0xd0, 0xf0, 0x02, 0xc7, 0xf7, 0x5e, 0xa7, 0xf6, 0x69, 0x85, 0x09, 0x6a, - 0xb6, 0xf3, 0x5d, 0x56, 0xad, 0xd8, 0xc0, 0x38, 0xff, 0x97, 0x60, 0xd8, 0x78, 0xf3, 0x2e, 0xc7, - 0xd6, 0x67, 0xcd, 0x63, 0xeb, 0x9a, 0x71, 0xda, 0x7c, 0xfe, 0xfd, 0x70, 0x3a, 0xdf, 0xc1, 0xc3, - 0x3c, 0x6f, 0x7f, 0x6d, 0x28, 0x7f, 0x86, 0xb0, 0x4e, 0xe2, 0x16, 0xed, 0xda, 0x5b, 0x76, 0xfd, - 0x5b, 0x76, 0xfd, 0x5b, 0x76, 0xbd, 0xe9, 0x9a, 0x15, 0x36, 0xeb, 0xd0, 0x83, 0xb2, 0x59, 0xf7, - 0x2b, 0x90, 0x51, 0x46, 0xf8, 0x80, 0xbc, 0x13, 0x86, 0x62, 0x12, 0x85, 0x37, 0xf0, 0x92, 0x10, - 0xf2, 0x3a, 0x76, 0x98, 0x37, 0x63, 0x09, 0xa7, 0x9b, 0x41, 0xe4, 0xa4, 0x9b, 0x42, 0xca, 0xab, - 0xcd, 0x60, 0xd5, 0x49, 0x37, 0x31, 0x83, 0xa0, 0xf7, 0xc3, 0x58, 0xea, 0xc4, 0x4d, 0x92, 0x62, - 0xb2, 0xcd, 0xc6, 0x5d, 0x1c, 0x05, 0x3d, 0x26, 0x70, 0xc7, 0xd6, 0x33, 0x50, 0x9c, 0xc3, 0x46, - 0x77, 0x60, 0x60, 0x93, 0xf8, 0x2d, 0x31, 0x26, 0x6b, 0xc5, 0x09, 0x61, 0xf6, 0xae, 0x57, 0x88, - 0xdf, 0xe2, 0x22, 0x82, 0xfe, 0xc2, 0x8c, 0x15, 0x9d, 0x10, 0xb5, 0xad, 0x76, 0x92, 0x86, 0x2d, - 0xef, 0x75, 0xe9, 0x01, 0xf9, 0x60, 0xc1, 0x8c, 0xaf, 0x49, 0xfa, 0xdc, 0x66, 0x56, 0x7f, 0xb1, - 0xe6, 0xcc, 0xfa, 0x51, 0xf7, 0x62, 0xe6, 0xd1, 0xd8, 0x15, 0x8e, 0x8c, 0xa2, 0xfb, 0x31, 0x2f, - 0xe9, 0xf3, 0x7e, 0xa8, 0xbf, 0x58, 0x73, 0x46, 0xbb, 0x6a, 0x62, 0x0e, 0xb3, 0x3e, 0xdc, 0x28, - 0xb8, 0x0f, 0x7c, 0x52, 0x76, 0x9b, 0xa0, 0xe8, 0x19, 0xa8, 0xb8, 0x9b, 0x4e, 0x9c, 0x4e, 0x8c, - 0xb0, 0x49, 0xa3, 0x6c, 0xf7, 0x39, 0xda, 0x88, 0x39, 0x0c, 0x3d, 0x05, 0xe5, 0x98, 0x34, 0x58, - 0xc8, 0x9a, 0x11, 0xcc, 0x80, 0x49, 0x03, 0xd3, 0x76, 0xfb, 0xd7, 0x4b, 0x59, 0x7d, 0x26, 0xfb, - 0xde, 0x7c, 0xb6, 0xbb, 0xed, 0x38, 0x91, 0xf6, 0xbd, 0x31, 0xdb, 0x59, 0x33, 0x96, 0x70, 0xf4, - 0x69, 0x0b, 0x86, 0x6e, 0x27, 0x61, 0x10, 0x90, 0x54, 0xec, 0x1d, 0x37, 0x0b, 0x1e, 0x8a, 0xab, - 0x9c, 0xba, 0xee, 0x83, 0x68, 0xc0, 0x92, 0x2f, 0xed, 0x2e, 0xd9, 0x71, 0xfd, 0x76, 0xbd, 0xe3, - 0x0c, 0xfb, 0x12, 0x6f, 0xc6, 0x12, 0x4e, 0x51, 0xbd, 0x80, 0xa3, 0x0e, 0x64, 0x51, 0x17, 0x03, - 0x81, 0x2a, 0xe0, 0xf6, 0x37, 0x2b, 0x70, 0xae, 0xeb, 0xe2, 0xa0, 0x9a, 0x06, 0xdb, 0xcb, 0x2f, - 0x7b, 0x3e, 0x91, 0x91, 0x19, 0x4c, 0xd3, 0xb8, 0xa9, 0x5a, 0xb1, 0x81, 0x81, 0x7e, 0x1e, 0x20, - 0x72, 0x62, 0xa7, 0x45, 0xc4, 0x0e, 0x5b, 0x3e, 0xfe, 0x86, 0x4e, 0xfb, 0xb1, 0x2a, 0x69, 0x6a, - 0x03, 0x4f, 0x35, 0x25, 0xd8, 0x60, 0x89, 0xde, 0x0b, 0xc3, 0x31, 0xf1, 0x89, 0x93, 0xb0, 0x88, - 0xc7, 0x7c, 0xf8, 0x36, 0xd6, 0x20, 0x6c, 0xe2, 0xa1, 0x67, 0x55, 0x10, 0x4b, 0xee, 0xc0, 0x3f, - 0x1b, 0xc8, 0x82, 0xde, 0xb0, 0x60, 0xac, 0xe1, 0xf9, 0x44, 0x73, 0x17, 0xc1, 0xd6, 0x2b, 0xc7, - 0x7f, 0xc9, 0xcb, 0x26, 0x5d, 0x2d, 0x21, 0x33, 0xcd, 0x09, 0xce, 0xb1, 0xa7, 0x9f, 0x79, 0x9b, - 0xc4, 0x4c, 0xb4, 0x0e, 0x66, 0x3f, 0xf3, 0x4d, 0xde, 0x8c, 0x25, 0x1c, 0xcd, 0xc0, 0xa9, 0xc8, - 0x49, 0x92, 0xb9, 0x98, 0xd4, 0x49, 0x90, 0x7a, 0x8e, 0xcf, 0x43, 0xa1, 0xab, 0x3a, 0x14, 0x72, - 0x35, 0x0b, 0xc6, 0x79, 0x7c, 0xf4, 0x21, 0x78, 0xdc, 0x6b, 0x06, 0x61, 0x4c, 0x96, 0xbd, 0x24, - 0xf1, 0x82, 0xa6, 0x9e, 0x06, 0x4c, 0x52, 0x56, 0x67, 0x27, 0x05, 0xa9, 0xc7, 0x17, 0xbb, 0xa3, - 0xe1, 0x5e, 0xcf, 0xa3, 0xe7, 0xa1, 0x9a, 0x6c, 0x79, 0xd1, 0x5c, 0x5c, 0x4f, 0x98, 0x4f, 0xb8, - 0xaa, 0xbd, 0x4a, 0x6b, 0xa2, 0x1d, 0x2b, 0x0c, 0xfb, 0x6b, 0xa5, 0xac, 0x45, 0x69, 0xae, 0x1f, - 0x94, 0xd0, 0x55, 0x92, 0xde, 0x74, 0x62, 0xe9, 0x6d, 0x38, 0x66, 0x30, 0xb5, 0xa0, 0x7b, 0xd3, - 0x89, 0xcd, 0xf5, 0xc6, 0x18, 0x60, 0xc9, 0x09, 0xdd, 0x86, 0x81, 0xd4, 0x77, 0x0a, 0xca, 0xbe, - 0x30, 0x38, 0x6a, 0x03, 0x7f, 0x69, 0x26, 0xc1, 0x8c, 0x07, 0x7a, 0x92, 0x6a, 0xcc, 0x1b, 0x32, - 0xe2, 0x4a, 0x28, 0xb9, 0x1b, 0x09, 0x66, 0xad, 0xf6, 0xff, 0xab, 0x76, 0x11, 0x79, 0x6a, 0x8f, - 0x41, 0x17, 0x01, 0xa8, 0xf1, 0xb5, 0x1a, 0x93, 0x86, 0xb7, 0x23, 0xf6, 0x78, 0xb5, 0xac, 0xae, - 0x2b, 0x08, 0x36, 0xb0, 0xe4, 0x33, 0x6b, 0xed, 0x06, 0x7d, 0xa6, 0xd4, 0xf9, 0x0c, 0x87, 0x60, - 0x03, 0x0b, 0xbd, 0x08, 0x83, 0x5e, 0xcb, 0x69, 0xaa, 0xc0, 0xb0, 0x27, 0xe9, 0x7a, 0x5a, 0x64, - 0x2d, 0xf7, 0xf6, 0x26, 0xc7, 0x54, 0x87, 0x58, 0x13, 0x16, 0xb8, 0xe8, 0xb7, 0x2c, 0x18, 0x71, - 0xc3, 0x56, 0x2b, 0x0c, 0xb8, 0xc9, 0x22, 0xec, 0xaf, 0xdb, 0x27, 0xb5, 0x03, 0x4f, 0xcd, 0x19, - 0xcc, 0xb8, 0x01, 0xa6, 0xd2, 0x44, 0x4c, 0x10, 0xce, 0xf4, 0xca, 0x5c, 0x76, 0x95, 0x03, 0x96, - 0xdd, 0xef, 0x58, 0x30, 0xce, 0x9f, 0x35, 0x2c, 0x29, 0x91, 0x11, 0x11, 0x9e, 0xf0, 0x6b, 0x75, - 0x18, 0x97, 0xca, 0x0b, 0xd5, 0x01, 0xc7, 0x9d, 0x9d, 0x44, 0x0b, 0x30, 0xde, 0x08, 0x63, 0x97, - 0x98, 0x03, 0x21, 0x64, 0x86, 0x22, 0x74, 0x39, 0x8f, 0x80, 0x3b, 0x9f, 0x41, 0x37, 0xe1, 0x31, - 0xa3, 0xd1, 0x1c, 0x07, 0x2e, 0x36, 0x9e, 0x16, 0xd4, 0x1e, 0xbb, 0xdc, 0x15, 0x0b, 0xf7, 0x78, - 0x3a, 0xeb, 0x6c, 0xa8, 0xf5, 0xe1, 0x6c, 0x78, 0x0d, 0x9e, 0x70, 0x3b, 0x47, 0x66, 0x3b, 0x69, - 0x6f, 0x24, 0x29, 0x53, 0xb2, 0xaa, 0xb3, 0x3f, 0x26, 0x08, 0x3c, 0x31, 0xd7, 0x0b, 0x11, 0xf7, - 0xa6, 0x81, 0x3e, 0x0e, 0xd5, 0x98, 0xb0, 0xaf, 0x92, 0x88, 0xf4, 0x80, 0x63, 0x5a, 0x98, 0x5a, - 0x39, 0xe4, 0x64, 0xb5, 0x58, 0x14, 0x0d, 0x09, 0x56, 0x1c, 0xcf, 0x7f, 0x00, 0xc6, 0x3b, 0xe6, - 0xf3, 0xa1, 0xec, 0xfd, 0x79, 0x78, 0xac, 0xfb, 0xcc, 0x39, 0x94, 0xd5, 0xff, 0x0f, 0x73, 0x51, - 0x6f, 0x86, 0xa2, 0xd7, 0x87, 0x07, 0xc9, 0x81, 0x32, 0x09, 0xb6, 0x85, 0x20, 0xbd, 0x7c, 0xbc, - 0xd1, 0xbb, 0x14, 0x6c, 0xf3, 0x89, 0xcf, 0xcc, 0xe4, 0x4b, 0xc1, 0x36, 0xa6, 0xb4, 0xd1, 0x97, - 0xad, 0x8c, 0xa2, 0xc2, 0xfd, 0x4e, 0x1f, 0x3d, 0x11, 0xcd, 0xb6, 0x6f, 0xdd, 0xc5, 0xfe, 0x57, - 0x25, 0xb8, 0x70, 0x10, 0x91, 0x3e, 0x86, 0xef, 0x19, 0x18, 0x4c, 0xd8, 0x81, 0x9c, 0x90, 0x4c, - 0xc3, 0x54, 0x2a, 0xf1, 0x23, 0xba, 0xd7, 0xb0, 0x00, 0x21, 0x1f, 0xca, 0x2d, 0x27, 0x12, 0xee, - 0x88, 0xc5, 0xe3, 0xc6, 0xb8, 0xd3, 0xff, 0x8e, 0xbf, 0xec, 0x44, 0xdc, 0xc8, 0x35, 0x1a, 0x30, - 0x65, 0x83, 0x52, 0xa8, 0x38, 0x71, 0xec, 0xc8, 0xd3, 0x9f, 0x6b, 0xc5, 0xf0, 0x9b, 0xa1, 0x24, - 0x67, 0xc7, 0xf7, 0xf7, 0x26, 0x47, 0x33, 0x4d, 0x98, 0x33, 0xb3, 0x3f, 0x3f, 0x94, 0x89, 0xf3, - 0x66, 0x47, 0x7a, 0x09, 0x0c, 0x0a, 0x2f, 0x84, 0x55, 0x74, 0x6a, 0x01, 0x4f, 0xd4, 0x61, 0x76, - 0x8c, 0x48, 0x77, 0x14, 0xac, 0xd0, 0xe7, 0x2c, 0x96, 0x54, 0x28, 0x63, 0xdf, 0x85, 0xf5, 0x70, - 0x32, 0x39, 0x8e, 0x66, 0xaa, 0xa2, 0x6c, 0xc4, 0x26, 0x77, 0xba, 0x75, 0x45, 0x3c, 0x3d, 0x26, - 0x6f, 0x43, 0xc8, 0xb4, 0x43, 0x09, 0x47, 0x3b, 0x5d, 0x8e, 0xee, 0x0a, 0x48, 0x4c, 0xeb, 0xe3, - 0xb0, 0xee, 0x1b, 0x16, 0x8c, 0x73, 0x4d, 0x71, 0xde, 0x6b, 0x34, 0x48, 0x4c, 0x02, 0x97, 0x48, - 0x5d, 0xfb, 0x98, 0x87, 0xc3, 0xd2, 0xf5, 0xb3, 0x98, 0x27, 0xaf, 0xf7, 0xb4, 0x0e, 0x10, 0xee, - 0xec, 0x0c, 0xaa, 0xc3, 0x80, 0x17, 0x34, 0x42, 0xb1, 0x93, 0xcf, 0x1e, 0xaf, 0x53, 0x8b, 0x41, - 0x23, 0xd4, 0xab, 0x99, 0xfe, 0xc3, 0x8c, 0x3a, 0x5a, 0x82, 0xb3, 0xb1, 0xf0, 0x86, 0x5c, 0xf1, - 0x12, 0x6a, 0xb3, 0x2e, 0x79, 0x2d, 0x2f, 0x65, 0xbb, 0x70, 0x79, 0x76, 0x62, 0x7f, 0x6f, 0xf2, - 0x2c, 0xee, 0x02, 0xc7, 0x5d, 0x9f, 0x42, 0xaf, 0xc3, 0x90, 0xcc, 0x82, 0xac, 0x16, 0x61, 0xb7, - 0x74, 0xce, 0x7f, 0x35, 0x99, 0xd6, 0x44, 0xc2, 0xa3, 0x64, 0x68, 0xbf, 0x31, 0x0c, 0x9d, 0x67, - 0x5f, 0xe8, 0x13, 0x50, 0x8b, 0x55, 0x66, 0xa6, 0x55, 0x44, 0xb4, 0x99, 0xfc, 0xbe, 0xe2, 0xdc, - 0x4d, 0xe9, 0x03, 0x3a, 0x07, 0x53, 0x73, 0xa4, 0x5a, 0x7b, 0xa2, 0x8f, 0xc8, 0x0a, 0x98, 0xdb, - 0x82, 0xab, 0x3e, 0x5a, 0xd9, 0x0d, 0x5c, 0xcc, 0x78, 0xa0, 0x18, 0x06, 0x37, 0x89, 0xe3, 0xa7, - 0x9b, 0xc5, 0x78, 0x81, 0xaf, 0x30, 0x5a, 0xf9, 0x18, 0x7e, 0xde, 0x8a, 0x05, 0x27, 0xb4, 0x03, - 0x43, 0x9b, 0x7c, 0x02, 0x08, 0x45, 0x7a, 0xf9, 0xb8, 0x83, 0x9b, 0x99, 0x55, 0xfa, 0x73, 0x8b, - 0x06, 0x2c, 0xd9, 0xb1, 0x73, 0x7f, 0xe3, 0xd8, 0x97, 0x2f, 0xdd, 0xe2, 0xd2, 0x17, 0xfa, 0x3f, - 0xf3, 0xfd, 0x18, 0x8c, 0xc4, 0xc4, 0x0d, 0x03, 0xd7, 0xf3, 0x49, 0x7d, 0x46, 0x7a, 0x78, 0x0f, - 0x13, 0xf4, 0x7e, 0x9a, 0x1a, 0x03, 0xd8, 0xa0, 0x81, 0x33, 0x14, 0xd1, 0x67, 0x2d, 0x18, 0x53, - 0xe9, 0x5c, 0xf4, 0x83, 0x10, 0xe1, 0xb0, 0x5c, 0x2a, 0x28, 0x79, 0x8c, 0xd1, 0x9c, 0x45, 0xfb, - 0x7b, 0x93, 0x63, 0xd9, 0x36, 0x9c, 0xe3, 0x8b, 0x3e, 0x0c, 0x10, 0x6e, 0xf0, 0xc3, 0xfd, 0x99, - 0x54, 0x78, 0x2f, 0x0f, 0xf3, 0xaa, 0x63, 0x3c, 0xfb, 0x45, 0x52, 0xc0, 0x06, 0x35, 0x74, 0x0d, - 0x80, 0x2f, 0x9b, 0xf5, 0xdd, 0x48, 0x6a, 0xdb, 0x32, 0x6b, 0x01, 0xd6, 0x14, 0xe4, 0xde, 0xde, - 0x64, 0xa7, 0x37, 0x89, 0x9d, 0x4e, 0x1b, 0x8f, 0xa3, 0x9f, 0x83, 0xa1, 0xa4, 0xdd, 0x6a, 0x39, - 0xca, 0xb7, 0x59, 0x60, 0x3e, 0x0d, 0xa7, 0x6b, 0x88, 0x22, 0xde, 0x80, 0x25, 0x47, 0x74, 0x9b, - 0x0a, 0xd5, 0x44, 0xb8, 0xb9, 0xd8, 0x2a, 0xe2, 0x3a, 0xc1, 0x30, 0x7b, 0xa7, 0xf7, 0x89, 0xe7, - 0xce, 0xe2, 0x2e, 0x38, 0xf7, 0xf6, 0x26, 0x1f, 0xcb, 0xb6, 0x2f, 0x85, 0x22, 0xc3, 0xa5, 0x2b, - 0x4d, 0x74, 0x55, 0x16, 0x45, 0xa0, 0xaf, 0x2d, 0x73, 0x75, 0x9f, 0xd3, 0x45, 0x11, 0x58, 0x73, - 0xef, 0x31, 0x33, 0x1f, 0x46, 0xcb, 0x70, 0xc6, 0x0d, 0x83, 0x34, 0x0e, 0x7d, 0x9f, 0x57, 0xfa, - 0xe0, 0x86, 0x0f, 0xf7, 0x7d, 0xbe, 0x5d, 0x74, 0xfb, 0xcc, 0x5c, 0x27, 0x0a, 0xee, 0xf6, 0x9c, - 0x1d, 0x64, 0xa3, 0x9e, 0xc4, 0xe0, 0xbc, 0x08, 0x23, 0x64, 0x27, 0x25, 0x71, 0xe0, 0xf8, 0x37, - 0xf0, 0x92, 0xf4, 0xfa, 0xb1, 0x35, 0x70, 0xc9, 0x68, 0xc7, 0x19, 0x2c, 0x64, 0x2b, 0x6b, 0xbf, - 0xa4, 0xd3, 0xc0, 0xb8, 0xb5, 0x2f, 0x6d, 0x7b, 0xfb, 0xff, 0x94, 0x32, 0x0a, 0xd9, 0x7a, 0x4c, - 0x08, 0x0a, 0xa1, 0x12, 0x84, 0x75, 0x25, 0xfb, 0xaf, 0x16, 0x23, 0xfb, 0xaf, 0x87, 0x75, 0xa3, - 0x72, 0x02, 0xfd, 0x97, 0x60, 0xce, 0x87, 0xa5, 0x96, 0xcb, 0x1c, 0x7c, 0x06, 0x10, 0x86, 0x46, - 0x91, 0x9c, 0x55, 0x6a, 0xf9, 0x8a, 0xc9, 0x08, 0x67, 0xf9, 0xa2, 0x2d, 0xa8, 0x6c, 0x86, 0x49, - 0x2a, 0xcd, 0x8f, 0x63, 0x5a, 0x3a, 0x57, 0xc2, 0x24, 0x65, 0x5a, 0x84, 0x7a, 0x6d, 0xda, 0x92, - 0x60, 0xce, 0xc3, 0xfe, 0x2f, 0x56, 0xc6, 0xc7, 0x7b, 0x8b, 0x45, 0x00, 0x6e, 0x93, 0x80, 0x2e, - 0x6b, 0x33, 0x9e, 0xe4, 0x2f, 0xe6, 0xd2, 0x90, 0xde, 0xd1, 0xab, 0x8e, 0xcd, 0x5d, 0x4a, 0x61, - 0x8a, 0x91, 0x30, 0x42, 0x4f, 0x3e, 0x65, 0x65, 0x13, 0xc2, 0x4a, 0x45, 0x18, 0x18, 0x66, 0xc2, - 0xe3, 0x81, 0xb9, 0x65, 0xf6, 0x97, 0x2d, 0x18, 0x9a, 0x75, 0xdc, 0xad, 0xb0, 0xd1, 0x40, 0xcf, - 0x43, 0xb5, 0xde, 0x8e, 0xcd, 0xdc, 0x34, 0x65, 0x3d, 0xcf, 0x8b, 0x76, 0xac, 0x30, 0xe8, 0x1c, - 0x6e, 0x38, 0xae, 0x4c, 0x7b, 0x2c, 0xf3, 0x39, 0x7c, 0x99, 0xb5, 0x60, 0x01, 0x41, 0xef, 0x85, - 0xe1, 0x96, 0xb3, 0x23, 0x1f, 0xce, 0x3b, 0x98, 0x97, 0x35, 0x08, 0x9b, 0x78, 0xf6, 0x3f, 0xb7, - 0x60, 0x62, 0xd6, 0x49, 0x3c, 0x77, 0xa6, 0x9d, 0x6e, 0xce, 0x7a, 0xe9, 0x46, 0xdb, 0xdd, 0x22, - 0x29, 0xcf, 0x75, 0xa5, 0xbd, 0x6c, 0x27, 0x74, 0x29, 0x29, 0xbb, 0x4e, 0xf5, 0xf2, 0x86, 0x68, - 0xc7, 0x0a, 0x03, 0xbd, 0x0e, 0xc3, 0x91, 0x93, 0x24, 0x77, 0xc3, 0xb8, 0x8e, 0x49, 0xa3, 0x98, - 0x4c, 0xf3, 0x35, 0xe2, 0xc6, 0x24, 0xc5, 0xa4, 0x21, 0x4e, 0x29, 0x35, 0x7d, 0x6c, 0x32, 0xb3, - 0xff, 0xba, 0x05, 0x23, 0xec, 0xf4, 0x65, 0x9e, 0xa4, 0x8e, 0xe7, 0x77, 0x94, 0x4b, 0xb1, 0xfa, - 0x2c, 0x97, 0x72, 0x01, 0x06, 0x36, 0xc3, 0x16, 0xc9, 0x9f, 0x1c, 0x5e, 0x09, 0xa9, 0x15, 0x4b, - 0x21, 0xe8, 0x05, 0x3a, 0xce, 0x5e, 0x90, 0x3a, 0x74, 0xc6, 0x49, 0x17, 0xe2, 0x29, 0x3e, 0xc6, - 0xaa, 0x19, 0x9b, 0x38, 0xf6, 0xb7, 0x6a, 0x30, 0x24, 0xce, 0x7f, 0xfb, 0x4e, 0x2f, 0x96, 0xe6, - 0x74, 0xa9, 0xa7, 0x39, 0x9d, 0xc0, 0xa0, 0xcb, 0x8a, 0x31, 0x09, 0xad, 0xed, 0x5a, 0x21, 0x01, - 0x03, 0xbc, 0xbe, 0x93, 0xee, 0x16, 0xff, 0x8f, 0x05, 0x2b, 0xf4, 0x25, 0x0b, 0x4e, 0xb9, 0x61, - 0x10, 0x10, 0x57, 0xab, 0x14, 0x03, 0x45, 0x9c, 0x0b, 0xcf, 0x65, 0x89, 0x6a, 0xd7, 0x7f, 0x0e, - 0x80, 0xf3, 0xec, 0xd1, 0xcb, 0x30, 0xca, 0xc7, 0xec, 0x66, 0xc6, 0xef, 0xa9, 0xab, 0x68, 0x98, - 0x40, 0x9c, 0xc5, 0x45, 0x53, 0xdc, 0x7f, 0x2c, 0xea, 0x55, 0x0c, 0xea, 0x73, 0x24, 0xa3, 0x52, - 0x85, 0x81, 0x81, 0x62, 0x40, 0x31, 0x69, 0xc4, 0x24, 0xd9, 0x14, 0xe7, 0xe3, 0x4c, 0x9d, 0x19, - 0x3a, 0x5a, 0xba, 0x22, 0xee, 0xa0, 0x84, 0xbb, 0x50, 0x47, 0x5b, 0xc2, 0x9e, 0xab, 0x16, 0x21, - 0xb2, 0xc4, 0x67, 0xee, 0x69, 0xd6, 0x4d, 0x42, 0x25, 0xd9, 0x74, 0xe2, 0x3a, 0x53, 0xa3, 0xca, - 0x3c, 0x44, 0x7e, 0x8d, 0x36, 0x60, 0xde, 0x8e, 0xe6, 0xe1, 0x74, 0xae, 0x06, 0x48, 0x22, 0xfc, - 0x93, 0x2a, 0xae, 0x3b, 0x57, 0x3d, 0x24, 0xc1, 0x1d, 0x4f, 0x98, 0xb6, 0xfe, 0xf0, 0x01, 0xb6, - 0xfe, 0xae, 0x8a, 0xc2, 0x1a, 0x61, 0xdb, 0xd1, 0x2b, 0x85, 0x0c, 0x40, 0x5f, 0x21, 0x57, 0x5f, - 0xc8, 0x85, 0x5c, 0x8d, 0xb2, 0x0e, 0xdc, 0x2c, 0xa6, 0x03, 0x87, 0x8f, 0xaf, 0x7a, 0x98, 0xf1, - 0x52, 0xff, 0xdb, 0x02, 0xf9, 0x5d, 0xe7, 0x1c, 0x77, 0x93, 0xd0, 0x29, 0x83, 0xde, 0x0f, 0x63, - 0xca, 0x62, 0x9d, 0x0b, 0xdb, 0x01, 0x0f, 0x95, 0x2a, 0xeb, 0x33, 0x42, 0x9c, 0x81, 0xe2, 0x1c, - 0x36, 0x9a, 0x86, 0x1a, 0x1d, 0x27, 0xfe, 0x28, 0xdf, 0xda, 0x94, 0x55, 0x3c, 0xb3, 0xba, 0x28, - 0x9e, 0xd2, 0x38, 0x28, 0x84, 0x71, 0xdf, 0x49, 0x52, 0xd6, 0x03, 0x6a, 0xc0, 0x1e, 0x31, 0x59, - 0x98, 0x05, 0x0f, 0x2f, 0xe5, 0x09, 0xe1, 0x4e, 0xda, 0xf6, 0xf7, 0x06, 0x60, 0x34, 0x23, 0x19, - 0x0f, 0xb9, 0x27, 0x3e, 0x0f, 0x55, 0xb9, 0x4d, 0xe5, 0x4b, 0x16, 0xa8, 0xbd, 0x4c, 0x61, 0xd0, - 0x4d, 0x6b, 0x83, 0x38, 0x31, 0x89, 0x59, 0x75, 0x95, 0xfc, 0x1e, 0x3e, 0xab, 0x41, 0xd8, 0xc4, - 0x63, 0x42, 0x39, 0xf5, 0x93, 0x39, 0xdf, 0x23, 0x41, 0xca, 0xbb, 0x59, 0x8c, 0x50, 0x5e, 0x5f, - 0x5a, 0x33, 0x89, 0x6a, 0xa1, 0x9c, 0x03, 0xe0, 0x3c, 0x7b, 0xf4, 0x4b, 0x16, 0x8c, 0x3a, 0x77, - 0x13, 0x5d, 0x31, 0x50, 0x04, 0x57, 0x1d, 0x73, 0x93, 0xca, 0x14, 0x21, 0xe4, 0x1e, 0xd6, 0x4c, - 0x13, 0xce, 0x32, 0x45, 0x5f, 0xb5, 0x00, 0x91, 0x1d, 0xe2, 0xca, 0xf0, 0x2f, 0xd1, 0x97, 0xc1, - 0x22, 0x0c, 0xbb, 0x4b, 0x1d, 0x74, 0xb9, 0x54, 0xef, 0x6c, 0xc7, 0x5d, 0xfa, 0x60, 0xff, 0x93, - 0xb2, 0x5a, 0x50, 0x3a, 0xe2, 0xd0, 0x31, 0xf2, 0x8f, 0xac, 0xa3, 0xe7, 0x1f, 0xe9, 0x03, 0xea, - 0xce, 0x1c, 0xa4, 0x4c, 0xee, 0x45, 0xe9, 0x21, 0xe5, 0x5e, 0xfc, 0x82, 0x95, 0x29, 0xce, 0x31, - 0x7c, 0xf1, 0xc3, 0xc5, 0x46, 0x3b, 0x4e, 0xf1, 0xf0, 0x88, 0x9c, 0x74, 0xcf, 0xc6, 0x4c, 0x50, - 0x69, 0x6a, 0xa0, 0x1d, 0x4a, 0x1a, 0xfe, 0xfb, 0x32, 0x0c, 0x1b, 0x3b, 0x69, 0x57, 0xb5, 0xc8, - 0x7a, 0xc4, 0xd4, 0xa2, 0xd2, 0x21, 0xd4, 0xa2, 0x9f, 0x87, 0x9a, 0x2b, 0xa5, 0x7c, 0x31, 0xe5, - 0x29, 0xf3, 0x7b, 0x87, 0x16, 0xf4, 0xaa, 0x09, 0x6b, 0x9e, 0x68, 0x21, 0x93, 0x0e, 0x21, 0x76, - 0x88, 0x01, 0xb6, 0x43, 0x74, 0xcb, 0x57, 0x10, 0x3b, 0x45, 0xe7, 0x33, 0xac, 0x86, 0x4b, 0xe4, - 0x89, 0xf7, 0x92, 0x31, 0xc9, 0xbc, 0x86, 0xcb, 0xea, 0xa2, 0x6c, 0xc6, 0x26, 0x8e, 0xfd, 0x3d, - 0x4b, 0x7d, 0xdc, 0x07, 0x90, 0xd1, 0x7c, 0x3b, 0x9b, 0xd1, 0x7c, 0xa9, 0x90, 0x61, 0xee, 0x91, - 0xca, 0x7c, 0x1d, 0x86, 0xe6, 0xc2, 0x56, 0xcb, 0x09, 0xea, 0xe8, 0xc7, 0x61, 0xc8, 0xe5, 0x3f, - 0x85, 0x1f, 0x85, 0x9d, 0xc6, 0x09, 0x28, 0x96, 0x30, 0xf4, 0x24, 0x0c, 0x38, 0x71, 0x53, 0xfa, - 0x4e, 0x58, 0x40, 0xc7, 0x4c, 0xdc, 0x4c, 0x30, 0x6b, 0xb5, 0xdf, 0x28, 0x03, 0xcc, 0x85, 0xad, - 0xc8, 0x89, 0x49, 0x7d, 0x3d, 0x64, 0xe5, 0xb1, 0x4e, 0xf4, 0x0c, 0x4b, 0x1b, 0x4b, 0x8f, 0xf2, - 0x39, 0x96, 0x71, 0x96, 0x51, 0x7e, 0xd0, 0x67, 0x19, 0x9f, 0xb7, 0x00, 0xd1, 0x2f, 0x12, 0x06, - 0x24, 0x48, 0xf5, 0xe1, 0xec, 0x34, 0xd4, 0x5c, 0xd9, 0x2a, 0xb4, 0x16, 0xbd, 0xfe, 0x24, 0x00, - 0x6b, 0x9c, 0x3e, 0xcc, 0xcf, 0x67, 0xa4, 0x70, 0x2c, 0x67, 0x63, 0x20, 0x99, 0x48, 0x15, 0xb2, - 0xd2, 0xfe, 0xfd, 0x12, 0x3c, 0xc6, 0xf7, 0xbb, 0x65, 0x27, 0x70, 0x9a, 0xa4, 0x45, 0x7b, 0xd5, - 0xef, 0x71, 0xbb, 0x4b, 0xed, 0x1e, 0x4f, 0xc6, 0x34, 0x1e, 0x77, 0x61, 0xf0, 0x09, 0xcd, 0xa7, - 0xf0, 0x62, 0xe0, 0xa5, 0x98, 0x11, 0x47, 0x09, 0x54, 0x65, 0xb1, 0x63, 0x21, 0xe8, 0x0a, 0x62, - 0xa4, 0xd6, 0xbc, 0xd8, 0x94, 0x08, 0x56, 0x8c, 0xa8, 0x56, 0xe8, 0x87, 0xee, 0x16, 0x26, 0x51, - 0xc8, 0x84, 0x9a, 0x11, 0x52, 0xb6, 0x24, 0xda, 0xb1, 0xc2, 0xb0, 0x7f, 0xdf, 0x82, 0xbc, 0xb8, - 0x37, 0x0a, 0x01, 0x59, 0xf7, 0x2d, 0x04, 0x74, 0x88, 0x4a, 0x3c, 0x3f, 0x0b, 0xc3, 0x4e, 0x4a, - 0x77, 0x68, 0x6e, 0xd3, 0x96, 0x8f, 0xe6, 0xa2, 0x5f, 0x0e, 0xeb, 0x5e, 0xc3, 0x63, 0xb6, 0xac, - 0x49, 0xce, 0xfe, 0x9f, 0x03, 0x30, 0xde, 0x11, 0x1a, 0x8f, 0x5e, 0x82, 0x11, 0x57, 0x4c, 0x8f, - 0x08, 0x93, 0x86, 0x78, 0x19, 0x23, 0xce, 0x49, 0xc3, 0x70, 0x06, 0xb3, 0x8f, 0x09, 0xba, 0x08, - 0x67, 0x62, 0x6a, 0x45, 0xb7, 0xc9, 0x4c, 0x23, 0x25, 0xf1, 0x1a, 0x71, 0xc3, 0xa0, 0xce, 0xcb, - 0x55, 0x95, 0x67, 0x1f, 0xdf, 0xdf, 0x9b, 0x3c, 0x83, 0x3b, 0xc1, 0xb8, 0xdb, 0x33, 0x28, 0x82, - 0x51, 0xdf, 0x54, 0xb0, 0x84, 0x76, 0x7d, 0x24, 0xdd, 0x4c, 0x6d, 0xc0, 0x99, 0x66, 0x9c, 0x65, - 0x90, 0xd5, 0xd2, 0x2a, 0x0f, 0x49, 0x4b, 0xfb, 0x45, 0xad, 0xa5, 0xf1, 0xb3, 0xe4, 0x8f, 0x14, - 0x9c, 0x1a, 0x71, 0xd2, 0x6a, 0xda, 0x2b, 0x50, 0x95, 0x71, 0x36, 0x7d, 0xc5, 0xa7, 0x98, 0x74, - 0x7a, 0x48, 0xb4, 0x7b, 0x25, 0xe8, 0xa2, 0xe1, 0xd3, 0x75, 0xa6, 0xb7, 0xd3, 0xcc, 0x3a, 0x3b, - 0xdc, 0x96, 0x8a, 0x76, 0x78, 0x8c, 0x11, 0xdf, 0x38, 0x3e, 0x54, 0xb4, 0x85, 0xa2, 0xc3, 0x8e, - 0x54, 0x40, 0xba, 0x0a, 0x3d, 0xba, 0x08, 0xa0, 0xb5, 0x20, 0x11, 0x6e, 0xac, 0x8e, 0x30, 0xb5, - 0xb2, 0x84, 0x0d, 0x2c, 0x6a, 0xb0, 0x7a, 0x41, 0x92, 0x3a, 0xbe, 0x7f, 0xc5, 0x0b, 0x52, 0xe1, - 0x79, 0x53, 0x3b, 0xe4, 0xa2, 0x06, 0x61, 0x13, 0xef, 0xfc, 0xfb, 0x8c, 0xef, 0x72, 0x98, 0xef, - 0xb9, 0x09, 0x4f, 0x2c, 0x78, 0xa9, 0x0a, 0x92, 0x57, 0xf3, 0x88, 0x2a, 0x39, 0x2a, 0xe9, 0xc3, - 0xea, 0x99, 0xf4, 0x61, 0x04, 0xa9, 0x97, 0xb2, 0x31, 0xf5, 0xf9, 0x20, 0x75, 0xfb, 0x25, 0x38, - 0xbb, 0xe0, 0xa5, 0x97, 0x3d, 0x9f, 0x1c, 0x92, 0x89, 0xfd, 0x7b, 0x83, 0x30, 0x62, 0xe6, 0x41, - 0x1d, 0x26, 0x6f, 0xe5, 0x8b, 0x54, 0x8f, 0x11, 0x6f, 0xe7, 0xa9, 0x03, 0xa0, 0x5b, 0xc7, 0x4e, - 0xca, 0xea, 0x3e, 0x62, 0x86, 0x2a, 0xa3, 0x79, 0x62, 0xb3, 0x03, 0xe8, 0x2e, 0x54, 0x1a, 0x2c, - 0x88, 0xba, 0x5c, 0xc4, 0x29, 0x79, 0xb7, 0x11, 0xd5, 0xcb, 0x8c, 0x87, 0x61, 0x73, 0x7e, 0x74, - 0x87, 0x8c, 0xb3, 0x99, 0x39, 0x46, 0x74, 0xa1, 0xc8, 0xc9, 0x51, 0x18, 0xbd, 0x44, 0x7d, 0xe5, - 0x08, 0xa2, 0x3e, 0x23, 0x78, 0x07, 0x1f, 0x92, 0xe0, 0x65, 0x01, 0xf1, 0xe9, 0x26, 0xd3, 0xdf, - 0x44, 0x38, 0xf4, 0x10, 0x1b, 0x04, 0x23, 0x20, 0x3e, 0x03, 0xc6, 0x79, 0x7c, 0xf4, 0x49, 0x25, - 0xba, 0xab, 0x45, 0x38, 0x2d, 0xcd, 0x19, 0x7d, 0xd2, 0x52, 0xfb, 0xf3, 0x25, 0x18, 0x5b, 0x08, - 0xda, 0xab, 0x0b, 0xab, 0xed, 0x0d, 0xdf, 0x73, 0xaf, 0x91, 0x5d, 0x2a, 0x9a, 0xb7, 0xc8, 0xee, - 0xe2, 0xbc, 0x58, 0x41, 0x6a, 0xce, 0x5c, 0xa3, 0x8d, 0x98, 0xc3, 0xa8, 0x30, 0x6a, 0x78, 0x41, - 0x93, 0xc4, 0x51, 0xec, 0x09, 0x7f, 0xa2, 0x21, 0x8c, 0x2e, 0x6b, 0x10, 0x36, 0xf1, 0x28, 0xed, - 0xf0, 0x6e, 0x40, 0xe2, 0xbc, 0x22, 0xbb, 0x42, 0x1b, 0x31, 0x87, 0x51, 0xa4, 0x34, 0x6e, 0x27, - 0xa9, 0x98, 0x8c, 0x0a, 0x69, 0x9d, 0x36, 0x62, 0x0e, 0xa3, 0x2b, 0x3d, 0x69, 0x6f, 0xb0, 0x20, - 0x84, 0x5c, 0xec, 0xf5, 0x1a, 0x6f, 0xc6, 0x12, 0x4e, 0x51, 0xb7, 0xc8, 0xee, 0x3c, 0x35, 0x29, - 0x73, 0xd9, 0x11, 0xd7, 0x78, 0x33, 0x96, 0x70, 0x56, 0x67, 0x2b, 0x3b, 0x1c, 0x3f, 0x74, 0x75, - 0xb6, 0xb2, 0xdd, 0xef, 0x61, 0x9c, 0xfe, 0x86, 0x05, 0x23, 0x66, 0xe8, 0x10, 0x6a, 0xe6, 0x74, - 0xdc, 0x95, 0x8e, 0x32, 0x8d, 0x3f, 0xdd, 0xed, 0x4e, 0x9a, 0xa6, 0x97, 0x86, 0x51, 0xf2, 0x6e, - 0x12, 0x34, 0xbd, 0x80, 0xb0, 0x13, 0x61, 0x1e, 0x72, 0x94, 0x89, 0x4b, 0x9a, 0x0b, 0xeb, 0xe4, - 0x08, 0x4a, 0xb2, 0x7d, 0x0b, 0xc6, 0x3b, 0x52, 0x62, 0xfa, 0x50, 0x2d, 0x0e, 0x4c, 0x48, 0xb4, - 0x31, 0x0c, 0x53, 0xc2, 0xa2, 0x68, 0x05, 0x9a, 0x83, 0x71, 0xbe, 0x90, 0x28, 0xa7, 0x35, 0x77, - 0x93, 0xb4, 0x54, 0x9a, 0x13, 0x73, 0x5e, 0xdf, 0xcc, 0x03, 0x71, 0x27, 0xbe, 0xfd, 0x05, 0x0b, - 0x46, 0x33, 0x59, 0x4a, 0x05, 0x29, 0x41, 0x6c, 0xa5, 0x85, 0x2c, 0x92, 0x8d, 0x85, 0xf3, 0x96, - 0xd9, 0x66, 0xaa, 0x57, 0x9a, 0x06, 0x61, 0x13, 0xcf, 0xfe, 0x72, 0x09, 0xaa, 0x32, 0x1a, 0xa0, - 0x8f, 0xae, 0x7c, 0xce, 0x82, 0x51, 0x75, 0x60, 0xc0, 0x3c, 0x51, 0xa5, 0x22, 0xe2, 0xd6, 0x69, - 0x0f, 0x54, 0xa8, 0x65, 0xd0, 0x08, 0xb5, 0x46, 0x8e, 0x4d, 0x66, 0x38, 0xcb, 0x1b, 0xdd, 0x04, - 0x48, 0x76, 0x93, 0x94, 0xb4, 0x0c, 0x9f, 0x98, 0x6d, 0xac, 0xb8, 0x29, 0x37, 0x8c, 0x09, 0x5d, - 0x5f, 0xd7, 0xc3, 0x3a, 0x59, 0x53, 0x98, 0x5a, 0x85, 0xd2, 0x6d, 0xd8, 0xa0, 0x64, 0xff, 0xfd, - 0x12, 0x9c, 0xce, 0x77, 0x09, 0x7d, 0x04, 0x46, 0x24, 0x77, 0xe3, 0x7e, 0x1d, 0x19, 0x02, 0x31, - 0x82, 0x0d, 0xd8, 0xbd, 0xbd, 0xc9, 0xc9, 0xce, 0xfb, 0x8d, 0xa6, 0x4c, 0x14, 0x9c, 0x21, 0xc6, - 0x4f, 0x6d, 0xc4, 0xf1, 0xe2, 0xec, 0xee, 0x4c, 0x14, 0x89, 0xa3, 0x17, 0xe3, 0xd4, 0xc6, 0x84, - 0xe2, 0x1c, 0x36, 0x5a, 0x85, 0xb3, 0x46, 0xcb, 0x75, 0xe2, 0x35, 0x37, 0x37, 0xc2, 0x58, 0x5a, - 0x56, 0x4f, 0xea, 0x20, 0xa5, 0x4e, 0x1c, 0xdc, 0xf5, 0x49, 0xba, 0xdb, 0xbb, 0x4e, 0xe4, 0xb8, - 0x5e, 0xba, 0x2b, 0x9c, 0x7c, 0x4a, 0x36, 0xcd, 0x89, 0x76, 0xac, 0x30, 0xec, 0x65, 0x18, 0xe8, - 0x73, 0x06, 0xf5, 0xa5, 0xd1, 0xbf, 0x02, 0x55, 0x4a, 0x4e, 0xaa, 0x77, 0x45, 0x90, 0x0c, 0xa1, - 0x2a, 0x4b, 0xe4, 0x23, 0x1b, 0xca, 0x9e, 0x23, 0x0f, 0xc6, 0xd4, 0x6b, 0x2d, 0x26, 0x49, 0x9b, - 0x19, 0xc9, 0x14, 0x88, 0x9e, 0x81, 0x32, 0xd9, 0x89, 0xf2, 0x27, 0x60, 0x97, 0x76, 0x22, 0x2f, - 0x26, 0x09, 0x45, 0x22, 0x3b, 0x11, 0x3a, 0x0f, 0x25, 0xaf, 0x2e, 0x36, 0x29, 0x10, 0x38, 0xa5, - 0xc5, 0x79, 0x5c, 0xf2, 0xea, 0xf6, 0x0e, 0xd4, 0x54, 0x4d, 0x7e, 0xb4, 0x25, 0x65, 0xb7, 0x55, - 0x44, 0xf8, 0x8e, 0xa4, 0xdb, 0x43, 0x6a, 0xb7, 0x01, 0x74, 0x4e, 0x58, 0x51, 0xf2, 0xe5, 0x02, - 0x0c, 0xb8, 0xa1, 0x48, 0x25, 0xad, 0x6a, 0x32, 0x4c, 0x68, 0x33, 0x88, 0x7d, 0x0b, 0xc6, 0xae, - 0x05, 0xe1, 0x5d, 0x56, 0x74, 0x98, 0x15, 0x0b, 0xa2, 0x84, 0x1b, 0xf4, 0x47, 0x5e, 0x45, 0x60, - 0x50, 0xcc, 0x61, 0xaa, 0x44, 0x4d, 0xa9, 0x57, 0x89, 0x1a, 0xfb, 0x53, 0x16, 0x9c, 0x56, 0x99, - 0x2d, 0x52, 0x1a, 0xbf, 0x04, 0x23, 0x1b, 0x6d, 0xcf, 0xaf, 0xcb, 0x12, 0x44, 0x39, 0x37, 0xc5, - 0xac, 0x01, 0xc3, 0x19, 0x4c, 0x6a, 0x54, 0x6d, 0x78, 0x81, 0x13, 0xef, 0xae, 0x6a, 0xf1, 0xaf, - 0x24, 0xc2, 0xac, 0x82, 0x60, 0x03, 0xcb, 0xfe, 0x9c, 0xd9, 0x05, 0x91, 0x4b, 0xd3, 0xc7, 0xc8, - 0xde, 0x80, 0x8a, 0xab, 0x0e, 0x52, 0x8f, 0x54, 0x26, 0x4d, 0xa5, 0x31, 0x33, 0x67, 0x3a, 0xa7, - 0x66, 0xff, 0xd3, 0x12, 0x8c, 0x66, 0x6a, 0x57, 0x20, 0x1f, 0xaa, 0xc4, 0x67, 0xae, 0x3c, 0x39, - 0xc5, 0x8e, 0x5b, 0x88, 0x4f, 0x2d, 0x8b, 0x4b, 0x82, 0x2e, 0x56, 0x1c, 0x1e, 0x8d, 0xf3, 0xaa, - 0x97, 0x60, 0x44, 0x76, 0xe8, 0x43, 0x4e, 0xcb, 0x17, 0xab, 0x50, 0x4d, 0x80, 0x4b, 0x06, 0x0c, - 0x67, 0x30, 0xed, 0x3f, 0x28, 0xc3, 0x04, 0xf7, 0x7d, 0xd6, 0x55, 0x48, 0xc9, 0xb2, 0xd4, 0xb2, - 0xfe, 0x8a, 0xae, 0x30, 0xc3, 0x07, 0x72, 0xe3, 0xb8, 0x75, 0x6f, 0xbb, 0x33, 0xea, 0x2b, 0xd8, - 0xe1, 0xd7, 0x72, 0xc1, 0x0e, 0x7c, 0xb3, 0x6d, 0x9e, 0x50, 0x8f, 0x7e, 0xb8, 0xa2, 0x1f, 0xfe, - 0x4e, 0x09, 0x4e, 0xe5, 0x8a, 0x0a, 0xa3, 0x37, 0xb2, 0x05, 0xf5, 0xac, 0x22, 0x3c, 0x64, 0xf7, - 0xad, 0x33, 0x7b, 0xb8, 0xb2, 0x7a, 0x0f, 0x69, 0xa9, 0xd8, 0x7f, 0x58, 0x82, 0xb1, 0x6c, 0x35, - 0xe4, 0x47, 0x70, 0xa4, 0xde, 0x05, 0x35, 0x56, 0xf0, 0x93, 0xdd, 0xe0, 0xc4, 0x1d, 0x71, 0xbc, - 0x48, 0xa4, 0x6c, 0xc4, 0x1a, 0xfe, 0x48, 0x54, 0x2b, 0xb4, 0xff, 0xae, 0x05, 0xe7, 0xf8, 0x5b, - 0xe6, 0xe7, 0xe1, 0x5f, 0xed, 0x36, 0xba, 0xaf, 0x16, 0xdb, 0xc1, 0x5c, 0x65, 0xa4, 0x83, 0xc6, - 0x97, 0xdd, 0x1c, 0x23, 0x7a, 0x9b, 0x9d, 0x0a, 0x8f, 0x60, 0x67, 0x0f, 0x35, 0x19, 0xec, 0x3f, - 0x2c, 0x83, 0xbe, 0x2c, 0x07, 0x79, 0x22, 0x4b, 0xa7, 0x90, 0x0a, 0x51, 0x6b, 0xbb, 0x81, 0xab, - 0xaf, 0xe5, 0xa9, 0xe6, 0x92, 0x74, 0x7e, 0xc5, 0x82, 0x61, 0x2f, 0xf0, 0x52, 0xcf, 0x61, 0xca, - 0x73, 0x31, 0x97, 0x7d, 0x28, 0x76, 0x8b, 0x9c, 0x72, 0x18, 0x9b, 0xde, 0x5b, 0xc5, 0x0c, 0x9b, - 0x9c, 0xd1, 0xc7, 0x44, 0x3c, 0x62, 0xb9, 0xb0, 0xfc, 0xb2, 0x6a, 0x2e, 0x08, 0x31, 0x82, 0x4a, - 0x4c, 0xd2, 0xb8, 0xa0, 0xb4, 0x4c, 0x4c, 0x49, 0xa9, 0x82, 0x80, 0xfa, 0xda, 0x42, 0xda, 0x8c, - 0x39, 0x23, 0x3b, 0x01, 0xd4, 0x39, 0x16, 0x87, 0x8c, 0xf5, 0x9a, 0x86, 0x9a, 0xd3, 0x4e, 0xc3, - 0x16, 0x1d, 0x26, 0xe1, 0x60, 0xd6, 0xd1, 0x6c, 0x12, 0x80, 0x35, 0x8e, 0xfd, 0x46, 0x05, 0x72, - 0x69, 0x33, 0x68, 0xc7, 0xbc, 0xe8, 0xc9, 0x2a, 0xf6, 0xa2, 0x27, 0xd5, 0x99, 0x6e, 0x97, 0x3d, - 0xa1, 0x26, 0x54, 0xa2, 0x4d, 0x27, 0x91, 0xba, 0xf1, 0x2b, 0x72, 0x98, 0x56, 0x69, 0xe3, 0xbd, - 0xbd, 0xc9, 0x9f, 0xe9, 0xcf, 0xd7, 0x42, 0xe7, 0xea, 0x34, 0xcf, 0x42, 0xd7, 0xac, 0x19, 0x0d, - 0xcc, 0xe9, 0x1f, 0xe6, 0xba, 0x93, 0x4f, 0x8b, 0x12, 0xad, 0x98, 0x24, 0x6d, 0x3f, 0x15, 0xb3, - 0xe1, 0x95, 0x02, 0x57, 0x19, 0x27, 0xac, 0x13, 0x3e, 0xf9, 0x7f, 0x6c, 0x30, 0x45, 0x1f, 0x81, - 0x5a, 0x92, 0x3a, 0x71, 0x7a, 0xc4, 0x14, 0x2d, 0x35, 0xe8, 0x6b, 0x92, 0x08, 0xd6, 0xf4, 0xd0, - 0x87, 0x59, 0xc1, 0x3c, 0x2f, 0xd9, 0x3c, 0x62, 0x18, 0xb1, 0x2c, 0xae, 0x27, 0x28, 0x60, 0x83, - 0x1a, 0x35, 0x3d, 0xd8, 0xdc, 0xe6, 0xb1, 0x33, 0x55, 0x66, 0x5b, 0x2a, 0x51, 0x88, 0x15, 0x04, - 0x1b, 0x58, 0xf6, 0x4f, 0x40, 0x36, 0x63, 0x19, 0x4d, 0xca, 0x04, 0x69, 0xee, 0x7b, 0x62, 0xe1, - 0xc0, 0x99, 0x5c, 0xe6, 0xdf, 0xb1, 0xc0, 0x4c, 0xab, 0x46, 0x77, 0x78, 0xfe, 0xb6, 0x55, 0xc4, - 0x79, 0x81, 0x41, 0x77, 0x6a, 0xd9, 0x89, 0x72, 0x07, 0x57, 0x32, 0x89, 0xfb, 0xfc, 0xfb, 0xa0, - 0x2a, 0xa1, 0x87, 0x52, 0xea, 0x3e, 0x09, 0x67, 0xf2, 0xd7, 0x60, 0x0a, 0x5f, 0x73, 0x33, 0x0e, - 0xdb, 0x51, 0xde, 0x90, 0x64, 0xd7, 0x24, 0x62, 0x0e, 0xa3, 0xe6, 0xd8, 0x96, 0x17, 0xd4, 0xf3, - 0x86, 0xe4, 0x35, 0x2f, 0xa8, 0x63, 0x06, 0xe9, 0xe3, 0xba, 0xaf, 0xdf, 0xb5, 0xe0, 0xc2, 0x41, - 0xb7, 0x75, 0xa2, 0x27, 0x61, 0xe0, 0xae, 0x13, 0xcb, 0x6a, 0xa3, 0x4c, 0x50, 0xde, 0x72, 0xe2, - 0x00, 0xb3, 0x56, 0xb4, 0x0b, 0x83, 0x3c, 0xff, 0x57, 0x68, 0xeb, 0xaf, 0x14, 0x7b, 0x77, 0xe8, - 0x35, 0x62, 0x98, 0x0b, 0x3c, 0xf7, 0x18, 0x0b, 0x86, 0xf6, 0xf7, 0x2d, 0x40, 0x2b, 0xdb, 0x24, - 0x8e, 0xbd, 0xba, 0x91, 0xb1, 0x8c, 0x5e, 0x84, 0x91, 0xdb, 0x6b, 0x2b, 0xd7, 0x57, 0x43, 0x2f, - 0x60, 0x15, 0x0c, 0x8c, 0x24, 0xad, 0xab, 0x46, 0x3b, 0xce, 0x60, 0xa1, 0x39, 0x18, 0xbf, 0x7d, - 0x87, 0x1a, 0xbf, 0x66, 0x1d, 0xf2, 0x92, 0x76, 0x77, 0x5e, 0x7d, 0x25, 0x07, 0xc4, 0x9d, 0xf8, - 0x68, 0x05, 0xce, 0xb5, 0xb8, 0xb9, 0xc1, 0xcb, 0x07, 0x73, 0xdb, 0x43, 0xe5, 0x68, 0x3c, 0xb1, - 0xbf, 0x37, 0x79, 0x6e, 0xb9, 0x1b, 0x02, 0xee, 0xfe, 0x9c, 0xfd, 0x3e, 0x40, 0x3c, 0x58, 0x65, - 0xae, 0x5b, 0xe4, 0x41, 0x4f, 0x4b, 0xdc, 0xfe, 0x7a, 0x05, 0x4e, 0xe5, 0xea, 0xdc, 0x51, 0x53, - 0xaf, 0x33, 0xd4, 0xe1, 0xd8, 0xfb, 0x77, 0x67, 0xf7, 0xfa, 0x0a, 0x9e, 0x08, 0xa0, 0xe2, 0x05, - 0x51, 0x3b, 0x2d, 0x26, 0x0b, 0x8a, 0x77, 0x62, 0x91, 0x12, 0x34, 0x9c, 0x44, 0xf4, 0x2f, 0xe6, - 0x6c, 0x8a, 0x0c, 0xc5, 0xc8, 0x28, 0xe3, 0x03, 0x0f, 0xc9, 0x1d, 0xf0, 0x69, 0x1d, 0x18, 0x51, - 0x29, 0xe2, 0xa0, 0x3e, 0x37, 0x59, 0x4e, 0xfa, 0x80, 0xed, 0x9b, 0x25, 0x18, 0x36, 0x3e, 0x1a, - 0xfa, 0xf5, 0x6c, 0xd1, 0x11, 0xab, 0xb8, 0x57, 0x62, 0xf4, 0xa7, 0x74, 0x59, 0x11, 0xfe, 0x4a, - 0xcf, 0x76, 0xd6, 0x1b, 0xb9, 0xb7, 0x37, 0x79, 0x3a, 0x57, 0x51, 0x24, 0x53, 0x83, 0xe4, 0xfc, - 0x27, 0xe0, 0x54, 0x8e, 0x4c, 0x97, 0x57, 0x5e, 0xcf, 0xde, 0x72, 0x7a, 0x4c, 0xb7, 0x94, 0x39, - 0x64, 0x6f, 0xd2, 0x21, 0xd3, 0x97, 0x5f, 0xf7, 0xe1, 0x8e, 0xcb, 0x25, 0xa0, 0x95, 0xfa, 0x4c, - 0x40, 0x7b, 0x0e, 0xaa, 0x51, 0xe8, 0x7b, 0xae, 0xa7, 0xca, 0x53, 0xb1, 0xc2, 0xad, 0xab, 0xa2, - 0x0d, 0x2b, 0x28, 0xba, 0x0b, 0x35, 0x75, 0x21, 0xac, 0xc8, 0xa1, 0x2f, 0xca, 0xd5, 0xab, 0x94, - 0x16, 0x7d, 0xd1, 0xab, 0xe6, 0x85, 0x6c, 0x18, 0x64, 0x9b, 0xa0, 0x8c, 0xa6, 0x65, 0xd9, 0x88, - 0x6c, 0x77, 0x4c, 0xb0, 0x80, 0xd8, 0x9f, 0x19, 0x82, 0xb3, 0xdd, 0x8a, 0x8d, 0xa2, 0x8f, 0xc3, - 0x20, 0xef, 0x63, 0x31, 0xf5, 0xac, 0xbb, 0xf1, 0x58, 0x60, 0x04, 0x45, 0xb7, 0xd8, 0x6f, 0x2c, - 0x78, 0x0a, 0xee, 0xbe, 0xb3, 0x21, 0x66, 0xc8, 0xc9, 0x70, 0x5f, 0x72, 0x34, 0xf7, 0x25, 0x87, - 0x73, 0xf7, 0x9d, 0x0d, 0xb4, 0x03, 0x95, 0xa6, 0x97, 0x12, 0x47, 0x38, 0x11, 0x6e, 0x9d, 0x08, - 0x73, 0xe2, 0x70, 0x2d, 0x8d, 0xfd, 0xc4, 0x9c, 0x21, 0xfa, 0x86, 0x05, 0xa7, 0x36, 0xb2, 0xc9, - 0x9d, 0x42, 0x78, 0x3a, 0x27, 0x50, 0x50, 0x36, 0xcb, 0x88, 0xd7, 0xfa, 0xcf, 0x35, 0xe2, 0x7c, - 0x77, 0xd0, 0x2f, 0x5a, 0x30, 0xd4, 0xf0, 0x7c, 0xa3, 0x74, 0xe1, 0x09, 0x7c, 0x9c, 0xcb, 0x8c, - 0x81, 0xb6, 0x38, 0xf8, 0xff, 0x04, 0x4b, 0xce, 0xbd, 0x76, 0xaa, 0xc1, 0xe3, 0xee, 0x54, 0x43, - 0x0f, 0xc9, 0x6d, 0xf4, 0xab, 0x25, 0x78, 0xa6, 0x8f, 0x6f, 0x64, 0xe6, 0xe3, 0x59, 0x07, 0xe4, - 0xe3, 0x5d, 0x80, 0x81, 0x98, 0x44, 0x61, 0x5e, 0xf5, 0x65, 0x41, 0xab, 0x0c, 0x82, 0x9e, 0x82, - 0xb2, 0x13, 0x79, 0x42, 0xf3, 0x55, 0xfa, 0xfa, 0xcc, 0xea, 0x22, 0xa6, 0xed, 0xf4, 0x4b, 0xd7, - 0x36, 0x64, 0xca, 0x71, 0x31, 0xf7, 0x6e, 0xf4, 0xca, 0x60, 0xe6, 0x8e, 0x1c, 0x05, 0xc5, 0x9a, - 0xaf, 0xfd, 0xd7, 0x2c, 0x38, 0xdf, 0x7b, 0x8a, 0xa0, 0x17, 0x60, 0x78, 0x23, 0x76, 0x02, 0x77, - 0x93, 0x5d, 0x52, 0x23, 0x07, 0x85, 0xa5, 0x61, 0xe9, 0x66, 0x6c, 0xe2, 0x50, 0x25, 0x96, 0x57, - 0x09, 0x36, 0x30, 0x64, 0xd6, 0x05, 0x55, 0x62, 0xd7, 0xf3, 0x40, 0xdc, 0x89, 0x6f, 0xff, 0x41, - 0xa9, 0x7b, 0xb7, 0xb8, 0x28, 0x39, 0xcc, 0x77, 0x12, 0x5f, 0xa1, 0xd4, 0xe3, 0x2b, 0xdc, 0x81, - 0x6a, 0xca, 0x52, 0xc9, 0x48, 0x43, 0xc8, 0xa3, 0xc2, 0x52, 0xb5, 0xd9, 0x8e, 0xb5, 0x2e, 0x88, - 0x63, 0xc5, 0x86, 0x6e, 0x1c, 0xbe, 0xae, 0x9d, 0x28, 0x36, 0x8e, 0xdc, 0x29, 0xc4, 0x3c, 0x9c, - 0x36, 0xaa, 0x4f, 0xf3, 0x4c, 0x1a, 0x1e, 0x4c, 0xa3, 0xd2, 0x4b, 0x57, 0x73, 0x70, 0xdc, 0xf1, - 0x84, 0xfd, 0x1b, 0x25, 0x78, 0xa2, 0xa7, 0x7c, 0xd4, 0x11, 0x3f, 0xd6, 0x7d, 0x22, 0x7e, 0x8e, - 0x3d, 0xcd, 0xcd, 0x01, 0x1e, 0x78, 0x30, 0x03, 0xfc, 0x3c, 0x54, 0xbd, 0x20, 0x21, 0x6e, 0x3b, - 0xe6, 0x83, 0x66, 0xc4, 0x95, 0x2f, 0x8a, 0x76, 0xac, 0x30, 0xec, 0x3f, 0xea, 0x3d, 0xd5, 0xe8, - 0x5e, 0xf9, 0x23, 0x3b, 0x4a, 0x2f, 0xc3, 0xa8, 0x13, 0x45, 0x1c, 0x8f, 0x45, 0x57, 0xe4, 0x12, - 0xc6, 0x67, 0x4c, 0x20, 0xce, 0xe2, 0x1a, 0x73, 0x78, 0xb0, 0xd7, 0x1c, 0xb6, 0xff, 0xd4, 0x82, - 0x1a, 0x26, 0x0d, 0xbe, 0xde, 0xd1, 0x6d, 0x31, 0x44, 0x56, 0x11, 0x95, 0x9c, 0xe8, 0xc0, 0x26, - 0x1e, 0xab, 0x70, 0xd4, 0x6d, 0xb0, 0x3b, 0xcb, 0x9a, 0x97, 0x0e, 0x55, 0xd6, 0x5c, 0x15, 0xb6, - 0x2e, 0xf7, 0x2e, 0x6c, 0x6d, 0xbf, 0x39, 0x44, 0x5f, 0x2f, 0x0a, 0xe7, 0x62, 0x52, 0x4f, 0xe8, - 0xf7, 0x6d, 0xc7, 0x7e, 0xfe, 0xce, 0xee, 0x1b, 0x78, 0x09, 0xd3, 0xf6, 0x8c, 0x0b, 0xb5, 0x74, - 0xa8, 0x74, 0xd9, 0xf2, 0x81, 0xe9, 0xb2, 0x2f, 0xc3, 0x68, 0x92, 0x6c, 0xae, 0xc6, 0xde, 0xb6, - 0x93, 0x92, 0x6b, 0x64, 0x57, 0x04, 0xe7, 0xe9, 0x14, 0xb7, 0xb5, 0x2b, 0x1a, 0x88, 0xb3, 0xb8, - 0x68, 0x01, 0xc6, 0x75, 0xd2, 0x2a, 0x89, 0x53, 0x16, 0x8b, 0xc7, 0x67, 0x82, 0xca, 0x30, 0xd3, - 0x69, 0xae, 0x02, 0x01, 0x77, 0x3e, 0x43, 0x25, 0x56, 0xa6, 0x91, 0x76, 0x64, 0x30, 0x2b, 0xb1, - 0x32, 0x74, 0x68, 0x5f, 0x3a, 0x9e, 0x40, 0xcb, 0x70, 0x86, 0x4f, 0x8c, 0x99, 0x28, 0x32, 0xde, - 0x68, 0x28, 0x5b, 0x41, 0x67, 0xa1, 0x13, 0x05, 0x77, 0x7b, 0x8e, 0x5a, 0x1f, 0xaa, 0x79, 0x71, - 0x5e, 0x78, 0xff, 0x94, 0xf5, 0xa1, 0xc8, 0x2c, 0xd6, 0xb1, 0x89, 0x87, 0x3e, 0x04, 0x8f, 0xeb, - 0xbf, 0x3c, 0x60, 0x9b, 0xbb, 0xc4, 0xe7, 0x45, 0x3d, 0x00, 0x55, 0x46, 0x79, 0xa1, 0x2b, 0x5a, - 0x1d, 0xf7, 0x7a, 0x1e, 0x6d, 0xc0, 0x79, 0x05, 0xba, 0x14, 0xa4, 0x2c, 0xfa, 0x32, 0x21, 0xb3, - 0x4e, 0x42, 0x6e, 0xc4, 0x3e, 0xab, 0x20, 0x50, 0xd3, 0x57, 0xd0, 0x2c, 0x78, 0xe9, 0x95, 0x6e, - 0x98, 0x78, 0x09, 0xdf, 0x87, 0x0a, 0x9a, 0x86, 0x1a, 0x09, 0x9c, 0x0d, 0x9f, 0xac, 0xcc, 0x2d, - 0xb2, 0xba, 0x02, 0x86, 0x07, 0xfe, 0x92, 0x04, 0x60, 0x8d, 0xa3, 0xe2, 0x41, 0x46, 0x7a, 0x5e, - 0x59, 0xb4, 0x0a, 0x67, 0x9b, 0x6e, 0x44, 0xb5, 0x09, 0xcf, 0x25, 0x33, 0x2e, 0x8b, 0x89, 0xa0, - 0x1f, 0x86, 0x97, 0x36, 0x52, 0xc1, 0x4e, 0x0b, 0x73, 0xab, 0x1d, 0x38, 0xb8, 0xeb, 0x93, 0x74, - 0x8d, 0x45, 0x71, 0xb8, 0xb3, 0x3b, 0x71, 0x26, 0xbb, 0xc6, 0x56, 0x69, 0x23, 0xe6, 0x30, 0x74, - 0x15, 0x10, 0x8b, 0x9c, 0xbb, 0x92, 0xa6, 0x91, 0x52, 0x5f, 0x26, 0xce, 0xb2, 0x57, 0x3a, 0x2f, - 0x9e, 0x40, 0x97, 0x3b, 0x30, 0x70, 0x97, 0xa7, 0xec, 0x3f, 0xb1, 0x60, 0x54, 0xad, 0xd7, 0x07, - 0x10, 0x3b, 0xea, 0x67, 0x63, 0x47, 0x17, 0x8e, 0x2f, 0xf1, 0x58, 0xcf, 0x7b, 0x04, 0x20, 0x7d, - 0x66, 0x18, 0x40, 0x4b, 0x45, 0xb5, 0x21, 0x59, 0x3d, 0x37, 0xa4, 0x47, 0x56, 0x22, 0x75, 0x4b, - 0x22, 0xae, 0x3c, 0xdc, 0x24, 0xe2, 0x35, 0x38, 0x27, 0xd5, 0x05, 0xee, 0xe3, 0xbd, 0x12, 0x26, - 0x4a, 0xc0, 0x55, 0x67, 0x9f, 0x12, 0x84, 0xce, 0x2d, 0x76, 0x43, 0xc2, 0xdd, 0x9f, 0xcd, 0x68, - 0x29, 0x43, 0x07, 0x69, 0x29, 0x7a, 0x4d, 0x2f, 0x35, 0x64, 0x51, 0xe6, 0xdc, 0x9a, 0x5e, 0xba, - 0xbc, 0x86, 0x35, 0x4e, 0x77, 0xc1, 0x5e, 0x2b, 0x48, 0xb0, 0xc3, 0xa1, 0x05, 0xbb, 0x14, 0x31, - 0xc3, 0x3d, 0x45, 0x8c, 0xf4, 0x25, 0x8d, 0xf4, 0xf4, 0x25, 0xbd, 0x1f, 0xc6, 0xbc, 0x60, 0x93, - 0xc4, 0x5e, 0x4a, 0xea, 0x6c, 0x2d, 0x30, 0xf1, 0x53, 0xd5, 0xdb, 0xfa, 0x62, 0x06, 0x8a, 0x73, - 0xd8, 0x59, 0xb9, 0x38, 0xd6, 0x87, 0x5c, 0xec, 0xb1, 0x1b, 0x9d, 0x2a, 0x66, 0x37, 0x3a, 0x7d, - 0xfc, 0xdd, 0x68, 0xfc, 0x44, 0x77, 0x23, 0x54, 0xc8, 0x6e, 0xd4, 0x97, 0xa0, 0x37, 0x0c, 0xba, - 0xb3, 0x07, 0x18, 0x74, 0xbd, 0xb6, 0xa2, 0x73, 0x47, 0xde, 0x8a, 0xba, 0xef, 0x32, 0x8f, 0x1d, - 0x69, 0x97, 0xf9, 0x6c, 0x09, 0xce, 0x69, 0x39, 0x4c, 0x67, 0xbf, 0xd7, 0xa0, 0x92, 0x88, 0xd5, - 0xf5, 0xe7, 0xfe, 0x56, 0x23, 0x94, 0x59, 0x47, 0x45, 0x2b, 0x08, 0x36, 0xb0, 0x58, 0x44, 0x30, - 0x89, 0x59, 0x01, 0xb7, 0xbc, 0x90, 0x9e, 0x13, 0xed, 0x58, 0x61, 0xd0, 0xf9, 0x45, 0x7f, 0x8b, - 0x2c, 0x8b, 0x7c, 0xdd, 0x94, 0x39, 0x0d, 0xc2, 0x26, 0x1e, 0x7a, 0x8e, 0x33, 0x61, 0x02, 0x82, - 0x0a, 0xea, 0x11, 0x71, 0x49, 0x96, 0x94, 0x09, 0x0a, 0x2a, 0xbb, 0xc3, 0x42, 0xbf, 0x2b, 0x9d, - 0xdd, 0x61, 0xa1, 0x0b, 0x0a, 0xc3, 0xfe, 0x5f, 0x16, 0x3c, 0xd1, 0x75, 0x28, 0x1e, 0xc0, 0xe6, - 0xbb, 0x93, 0xdd, 0x7c, 0xd7, 0x8a, 0x32, 0x37, 0x8c, 0xb7, 0xe8, 0xb1, 0x11, 0xff, 0x3b, 0x0b, - 0xc6, 0x34, 0xfe, 0x03, 0x78, 0x55, 0x2f, 0xfb, 0xaa, 0xc5, 0x59, 0x56, 0xb5, 0x8e, 0x77, 0xfb, - 0x13, 0xf6, 0x6e, 0xfc, 0x50, 0x74, 0xc6, 0x95, 0x95, 0xe2, 0x0e, 0x38, 0x01, 0xd8, 0x85, 0x41, - 0x76, 0x80, 0x91, 0x14, 0x73, 0x38, 0x9b, 0xe5, 0xcf, 0x0e, 0x43, 0xf4, 0xe1, 0x10, 0xfb, 0x9b, - 0x60, 0xc1, 0x90, 0x95, 0x17, 0xf4, 0x12, 0x2a, 0xcd, 0xeb, 0x22, 0x88, 0x5a, 0x97, 0x17, 0x14, - 0xed, 0x58, 0x61, 0xd8, 0x2d, 0x98, 0xc8, 0x12, 0x9f, 0x27, 0x0d, 0x16, 0xf0, 0xd3, 0xd7, 0x6b, - 0x4e, 0x43, 0xcd, 0x61, 0x4f, 0x2d, 0xb5, 0x9d, 0xfc, 0xbd, 0x8a, 0x33, 0x12, 0x80, 0x35, 0x8e, - 0xfd, 0xdb, 0x16, 0x9c, 0xe9, 0xf2, 0x32, 0x05, 0x06, 0x8f, 0xa7, 0x5a, 0x0a, 0x74, 0xdb, 0x70, - 0xdf, 0x09, 0x43, 0x75, 0xd2, 0x70, 0x64, 0x48, 0x89, 0x21, 0x73, 0xe7, 0x79, 0x33, 0x96, 0x70, - 0xfb, 0xbf, 0x5b, 0x70, 0x2a, 0xdb, 0xd7, 0x84, 0x4a, 0x4d, 0xfe, 0x32, 0xf3, 0x5e, 0xe2, 0x86, - 0xdb, 0x24, 0xde, 0xa5, 0x6f, 0xce, 0x7b, 0xad, 0xa4, 0xe6, 0x4c, 0x07, 0x06, 0xee, 0xf2, 0x14, - 0xab, 0x30, 0x56, 0x57, 0xa3, 0x2d, 0x67, 0xca, 0xcd, 0x22, 0x67, 0x8a, 0xfe, 0x98, 0xe6, 0xf1, - 0x93, 0x62, 0x89, 0x4d, 0xfe, 0xf6, 0xf7, 0x07, 0x40, 0x65, 0x97, 0xb0, 0xf3, 0xfc, 0x82, 0xa2, - 0x21, 0x32, 0xf7, 0x61, 0x94, 0xfb, 0xb8, 0x0f, 0x43, 0x4e, 0x86, 0x81, 0xfb, 0x1d, 0xb0, 0x71, - 0xef, 0x85, 0xe9, 0x24, 0x54, 0x6f, 0xb8, 0xae, 0x41, 0xd8, 0xc4, 0xa3, 0x3d, 0xf1, 0xbd, 0x6d, - 0xc2, 0x1f, 0x1a, 0xcc, 0xf6, 0x64, 0x49, 0x02, 0xb0, 0xc6, 0xa1, 0x3d, 0xa9, 0x7b, 0x8d, 0x86, - 0x30, 0xc5, 0x55, 0x4f, 0xe8, 0xe8, 0x60, 0x06, 0xe1, 0x45, 0x23, 0xc3, 0x2d, 0xa1, 0x9d, 0x1a, - 0x45, 0x23, 0xc3, 0x2d, 0xcc, 0x20, 0x54, 0x9f, 0x0a, 0xc2, 0xb8, 0xc5, 0xee, 0xbd, 0xac, 0x2b, - 0x2e, 0x42, 0x2b, 0x55, 0xfa, 0xd4, 0xf5, 0x4e, 0x14, 0xdc, 0xed, 0x39, 0x3a, 0x03, 0xa3, 0x98, - 0xd4, 0x3d, 0x37, 0x35, 0xa9, 0x41, 0x76, 0x06, 0xae, 0x76, 0x60, 0xe0, 0x2e, 0x4f, 0xa1, 0x19, - 0x38, 0x25, 0xb3, 0x83, 0x64, 0xee, 0xf7, 0x70, 0x36, 0xd7, 0x14, 0x67, 0xc1, 0x38, 0x8f, 0x4f, - 0xa5, 0x4d, 0x4b, 0x94, 0x7d, 0x60, 0x4a, 0xac, 0x21, 0x6d, 0x64, 0x39, 0x08, 0xac, 0x30, 0xec, - 0x4f, 0x97, 0xe9, 0xee, 0xd8, 0xa3, 0xd4, 0xfd, 0x03, 0x8b, 0xbe, 0xc9, 0xce, 0xc8, 0x81, 0x3e, - 0x66, 0xe4, 0x8b, 0x30, 0x72, 0x3b, 0x09, 0x03, 0x15, 0xd9, 0x52, 0xe9, 0x19, 0xd9, 0x62, 0x60, - 0x75, 0x8f, 0x6c, 0x19, 0x2c, 0x2a, 0xb2, 0x65, 0xe8, 0x88, 0x91, 0x2d, 0xdf, 0xa9, 0x80, 0x2a, - 0x16, 0x7d, 0x9d, 0xa4, 0x77, 0xc3, 0x78, 0xcb, 0x0b, 0x9a, 0x2c, 0xab, 0xea, 0x1b, 0x16, 0x8c, - 0xf0, 0xf5, 0xb2, 0x64, 0x66, 0x26, 0x34, 0x0a, 0xaa, 0x42, 0x9c, 0x61, 0x36, 0xb5, 0x6e, 0x30, - 0xca, 0xdd, 0x71, 0x64, 0x82, 0x70, 0xa6, 0x47, 0xe8, 0x13, 0x00, 0xd2, 0x6f, 0xd9, 0x90, 0x22, - 0x73, 0xb1, 0x98, 0xfe, 0x61, 0xd2, 0xd0, 0xba, 0xe9, 0xba, 0x62, 0x82, 0x0d, 0x86, 0xe8, 0xb3, - 0xf9, 0x7b, 0x81, 0x3f, 0x76, 0x22, 0x63, 0xd3, 0x4f, 0xce, 0x06, 0x86, 0x21, 0x2f, 0x68, 0xd2, - 0x79, 0x22, 0x22, 0x00, 0xde, 0xd1, 0x2d, 0x23, 0x71, 0x29, 0x74, 0xea, 0xb3, 0x8e, 0xef, 0x04, - 0x2e, 0x89, 0x17, 0x39, 0xba, 0x79, 0xe9, 0x1e, 0x6b, 0xc0, 0x92, 0x50, 0x47, 0x99, 0xed, 0x4a, - 0x3f, 0x65, 0xb6, 0xcf, 0x7f, 0x00, 0xc6, 0x3b, 0x3e, 0xe6, 0xa1, 0x52, 0x34, 0x8e, 0x9e, 0xdd, - 0x61, 0xff, 0xb3, 0x41, 0xbd, 0x69, 0x5d, 0x0f, 0xeb, 0xbc, 0xd8, 0x73, 0xac, 0xbf, 0xa8, 0xd0, - 0x3d, 0x0b, 0x9c, 0x22, 0xc6, 0xc5, 0x7d, 0xaa, 0x11, 0x9b, 0x2c, 0xe9, 0x1c, 0x8d, 0x9c, 0x98, - 0x04, 0x27, 0x3d, 0x47, 0x57, 0x15, 0x13, 0x6c, 0x30, 0x44, 0x9b, 0x99, 0x18, 0xed, 0xcb, 0xc7, - 0x8f, 0xd1, 0x66, 0xb5, 0x1a, 0xba, 0x15, 0x8c, 0xfd, 0x92, 0x05, 0x63, 0x41, 0x66, 0xe6, 0x16, - 0x13, 0x96, 0xd5, 0x7d, 0x55, 0xf0, 0xbb, 0x06, 0xb2, 0x6d, 0x38, 0xc7, 0xbf, 0xdb, 0x96, 0x56, - 0x39, 0xe4, 0x96, 0xa6, 0xab, 0xc6, 0x0f, 0xf6, 0xaa, 0x1a, 0x8f, 0x02, 0x75, 0x6d, 0xc6, 0x50, - 0xe1, 0xd7, 0x66, 0x40, 0x97, 0x2b, 0x33, 0x6e, 0x41, 0xcd, 0x8d, 0x89, 0x93, 0x1e, 0xf1, 0x06, - 0x05, 0x76, 0x14, 0x3e, 0x27, 0x09, 0x60, 0x4d, 0xcb, 0xfe, 0xb7, 0x65, 0x38, 0x2d, 0x47, 0x44, - 0x86, 0x74, 0xd2, 0xfd, 0x91, 0xf3, 0xd5, 0xca, 0xad, 0xda, 0x1f, 0xaf, 0x48, 0x00, 0xd6, 0x38, - 0x54, 0x1f, 0x6b, 0x27, 0x64, 0x25, 0x22, 0xc1, 0x92, 0xb7, 0x91, 0x88, 0xf3, 0x47, 0xb5, 0x50, - 0x6e, 0x68, 0x10, 0x36, 0xf1, 0xa8, 0x32, 0xce, 0xf5, 0xe2, 0x24, 0x1f, 0x0e, 0x2e, 0xf4, 0x6d, - 0x2c, 0xe1, 0xe8, 0x6b, 0x5d, 0xef, 0xde, 0x29, 0x26, 0x11, 0xa2, 0x23, 0x92, 0xf5, 0x90, 0x97, - 0xee, 0xbc, 0x61, 0xc1, 0xa9, 0xad, 0x4c, 0x46, 0xaa, 0x14, 0xc9, 0xc7, 0xac, 0x9d, 0x90, 0x4d, - 0x73, 0xd5, 0x53, 0x38, 0xdb, 0x9e, 0xe0, 0x3c, 0x77, 0xfb, 0x7f, 0x58, 0x60, 0x8a, 0xa7, 0xfe, - 0x34, 0x2b, 0xe3, 0xfa, 0xc0, 0xd2, 0x01, 0xd7, 0x07, 0x4a, 0x25, 0xac, 0xdc, 0x9f, 0xd2, 0x3f, - 0x70, 0x08, 0xa5, 0xbf, 0xd2, 0x53, 0x6b, 0x7b, 0x0a, 0xca, 0x6d, 0xaf, 0x2e, 0xf4, 0x76, 0x7d, - 0xda, 0xb8, 0x38, 0x8f, 0x69, 0xbb, 0xfd, 0x8f, 0x2b, 0xda, 0x4e, 0x17, 0xf1, 0xfb, 0x3f, 0x12, - 0xaf, 0xdd, 0x50, 0xa5, 0x30, 0xf8, 0x9b, 0x5f, 0xef, 0x28, 0x85, 0xf1, 0x53, 0x87, 0x4f, 0xcf, - 0xe0, 0x03, 0xd4, 0xab, 0x12, 0xc6, 0xd0, 0x01, 0xb9, 0x19, 0xb7, 0xa1, 0x4a, 0x4d, 0x1b, 0xe6, - 0x70, 0xab, 0x66, 0x3a, 0x55, 0xbd, 0x22, 0xda, 0xef, 0xed, 0x4d, 0xfe, 0xe4, 0xe1, 0xbb, 0x25, - 0x9f, 0xc6, 0x8a, 0x3e, 0x4a, 0xa0, 0x46, 0x7f, 0xb3, 0x34, 0x12, 0x61, 0x34, 0xdd, 0x50, 0xb2, - 0x48, 0x02, 0x0a, 0xc9, 0x51, 0xd1, 0x7c, 0x50, 0x00, 0x35, 0x76, 0xef, 0x17, 0x63, 0xca, 0x6d, - 0xab, 0x55, 0x95, 0xcc, 0x21, 0x01, 0xf7, 0xf6, 0x26, 0x5f, 0x3e, 0x3c, 0x53, 0xf5, 0x38, 0xd6, - 0x2c, 0xec, 0x2f, 0x0f, 0xe8, 0xb9, 0x2b, 0x2a, 0xa0, 0xfc, 0x48, 0xcc, 0xdd, 0x97, 0x72, 0x73, - 0xf7, 0x42, 0xc7, 0xdc, 0x1d, 0xd3, 0xf7, 0x53, 0x65, 0x66, 0xe3, 0x83, 0xde, 0x60, 0x0f, 0xb6, - 0xe3, 0x99, 0x66, 0x71, 0xa7, 0xed, 0xc5, 0x24, 0x59, 0x8d, 0xdb, 0x81, 0x17, 0x34, 0xc5, 0x95, - 0xc0, 0x86, 0x66, 0x91, 0x01, 0xe3, 0x3c, 0x3e, 0xbb, 0x4e, 0x78, 0x37, 0x70, 0x6f, 0x39, 0xdb, - 0x7c, 0x56, 0x19, 0x45, 0x21, 0xd6, 0x44, 0x3b, 0x56, 0x18, 0xf6, 0x9b, 0xec, 0xec, 0xd6, 0xc8, - 0x5f, 0xa3, 0x73, 0xc2, 0x67, 0x17, 0xad, 0xf1, 0x8a, 0x12, 0x6a, 0x4e, 0xf0, 0xdb, 0xd5, 0x38, - 0x0c, 0xdd, 0x85, 0xa1, 0x0d, 0x7e, 0xd3, 0x48, 0x31, 0xd5, 0x33, 0xc5, 0xb5, 0x25, 0xac, 0xc0, - 0xb5, 0xbc, 0xc3, 0xe4, 0x9e, 0xfe, 0x89, 0x25, 0x37, 0xfb, 0xdb, 0x03, 0x70, 0x2a, 0x77, 0x15, - 0x57, 0xa6, 0x96, 0x57, 0xe9, 0xc0, 0x5a, 0x5e, 0x1f, 0x05, 0xa8, 0x93, 0xc8, 0x0f, 0x77, 0x99, - 0x9a, 0x33, 0x70, 0x68, 0x35, 0x47, 0x69, 0xc6, 0xf3, 0x8a, 0x0a, 0x36, 0x28, 0x8a, 0x32, 0x1a, - 0xbc, 0x34, 0x58, 0xae, 0x8c, 0x86, 0x51, 0xc0, 0x76, 0xf0, 0xc1, 0x16, 0xb0, 0xf5, 0xe0, 0x14, - 0xef, 0xa2, 0xca, 0x12, 0x3b, 0x42, 0x32, 0x18, 0x8b, 0xb3, 0x9d, 0xcf, 0x92, 0xc1, 0x79, 0xba, - 0x0f, 0xf3, 0xa6, 0x3d, 0xf4, 0x2e, 0xa8, 0xc9, 0xef, 0x9c, 0x4c, 0xd4, 0x74, 0xa6, 0xad, 0x9c, - 0x06, 0xec, 0x06, 0x3c, 0xf1, 0xd3, 0xfe, 0x62, 0x89, 0x6a, 0xa5, 0xfc, 0x9f, 0xaa, 0x98, 0xf0, - 0x2c, 0x0c, 0x3a, 0xed, 0x74, 0x33, 0xec, 0xb8, 0x3e, 0x65, 0x86, 0xb5, 0x62, 0x01, 0x45, 0x4b, - 0x30, 0x50, 0xd7, 0x59, 0xf0, 0x87, 0x19, 0x45, 0xed, 0xe0, 0x73, 0x52, 0x82, 0x19, 0x15, 0xf4, - 0x24, 0x0c, 0xa4, 0x4e, 0x33, 0x73, 0xad, 0xf5, 0xba, 0xd3, 0x4c, 0x30, 0x6b, 0x35, 0x37, 0xcd, - 0x81, 0x03, 0x36, 0xcd, 0x97, 0x61, 0x34, 0xf1, 0x9a, 0x81, 0x93, 0xb6, 0x63, 0x62, 0x1c, 0x26, - 0xe9, 0xf8, 0x00, 0x13, 0x88, 0xb3, 0xb8, 0xf6, 0xef, 0x8d, 0xc0, 0xd9, 0xb5, 0xb9, 0x65, 0x59, - 0xd1, 0xf1, 0xc4, 0x62, 0xea, 0xbb, 0xf1, 0x78, 0x70, 0x31, 0xf5, 0x3d, 0xb8, 0xfb, 0x46, 0x4c, - 0xbd, 0x6f, 0xc4, 0xd4, 0x7f, 0xd6, 0x82, 0x9a, 0x0a, 0x25, 0x17, 0x81, 0xac, 0x1f, 0x29, 0xbe, - 0x07, 0x2a, 0xae, 0x58, 0x44, 0x14, 0xcb, 0xbf, 0x58, 0x33, 0x3f, 0xb9, 0x20, 0xfb, 0xfb, 0x76, - 0xe8, 0x50, 0x41, 0xf6, 0x2a, 0x03, 0xa1, 0x52, 0x44, 0x06, 0x42, 0x8f, 0x4f, 0xd5, 0x35, 0x03, - 0xe1, 0x4b, 0x16, 0x0c, 0x3b, 0xaf, 0xb7, 0x63, 0x32, 0x4f, 0xb6, 0x57, 0xa2, 0x44, 0x08, 0xd8, - 0x57, 0x8b, 0xef, 0xc0, 0x8c, 0x66, 0x22, 0xea, 0xbc, 0xeb, 0x06, 0x6c, 0x76, 0x21, 0x93, 0x71, - 0x30, 0x54, 0x44, 0xc6, 0x41, 0xb7, 0xee, 0x1c, 0x98, 0x71, 0xf0, 0x32, 0x8c, 0xba, 0x7e, 0x18, - 0x90, 0xd5, 0x38, 0x4c, 0x43, 0x37, 0xf4, 0x85, 0x32, 0xad, 0x44, 0xc2, 0x9c, 0x09, 0xc4, 0x59, - 0xdc, 0x5e, 0xe9, 0x0a, 0xb5, 0xe3, 0xa6, 0x2b, 0xc0, 0x43, 0x4a, 0xac, 0xfb, 0x65, 0x9d, 0x58, - 0x37, 0x5c, 0xc4, 0xd5, 0xd7, 0xdd, 0xbe, 0x48, 0x3f, 0xd9, 0x75, 0xe8, 0xab, 0xfc, 0xfe, 0x12, - 0xaa, 0x8e, 0xce, 0x85, 0x2d, 0xaa, 0x6e, 0x8d, 0xb0, 0x21, 0x79, 0xed, 0x04, 0x26, 0xec, 0xad, - 0x35, 0xcd, 0x46, 0xdd, 0x69, 0xa2, 0x9b, 0x70, 0xb6, 0x23, 0xc7, 0x49, 0xfc, 0xfb, 0x7a, 0x09, - 0x7e, 0xec, 0xc0, 0x2e, 0xa0, 0xbb, 0x00, 0xa9, 0xd3, 0x14, 0x13, 0x55, 0xb8, 0xff, 0x8f, 0x19, - 0xc4, 0xb7, 0x2e, 0xe9, 0xf1, 0x8c, 0x75, 0xf5, 0x97, 0x39, 0xd6, 0xe5, 0x6f, 0x16, 0xbb, 0x17, - 0xfa, 0x1d, 0xd5, 0xb9, 0x70, 0xe8, 0x13, 0xcc, 0x20, 0x74, 0xfb, 0x8f, 0x49, 0x53, 0xdf, 0x6f, - 0xa7, 0x3e, 0x1f, 0x66, 0xad, 0x58, 0x40, 0xd1, 0x7b, 0x61, 0xd8, 0xf1, 0x7d, 0x9e, 0x57, 0x41, - 0x12, 0x51, 0x63, 0x5d, 0x57, 0x18, 0xd2, 0x20, 0x6c, 0xe2, 0xd9, 0x7f, 0x56, 0x82, 0xc9, 0x03, - 0x64, 0x0a, 0x7a, 0x09, 0x46, 0xc2, 0xb8, 0xe9, 0x04, 0xde, 0xeb, 0xbc, 0x48, 0x43, 0x25, 0x5b, - 0x0a, 0x6a, 0xc5, 0x80, 0xe1, 0x0c, 0xa6, 0x8c, 0x84, 0x1f, 0xec, 0x11, 0x09, 0xff, 0x5e, 0x18, - 0x4e, 0x89, 0xd3, 0x12, 0x61, 0x3f, 0xc2, 0xfe, 0xd6, 0xe7, 0x99, 0x1a, 0x84, 0x4d, 0x3c, 0x2a, - 0xc5, 0xc6, 0x1c, 0xd7, 0x25, 0x49, 0x22, 0x43, 0xdd, 0x85, 0x6f, 0xb0, 0xb0, 0x38, 0x7a, 0xe6, - 0x72, 0x9d, 0xc9, 0xb0, 0xc0, 0x39, 0x96, 0xf9, 0x01, 0xaf, 0xf5, 0x39, 0xe0, 0xbf, 0x59, 0x82, - 0xa7, 0xee, 0xbb, 0xbb, 0xf5, 0x9d, 0x85, 0xd0, 0x4e, 0x48, 0x9c, 0x9f, 0x38, 0x37, 0x12, 0x12, - 0x63, 0x06, 0xe1, 0xa3, 0x14, 0x45, 0xc6, 0xfd, 0x81, 0x45, 0x27, 0xbd, 0xf0, 0x51, 0xca, 0xb0, - 0xc0, 0x39, 0x96, 0x47, 0x9d, 0x96, 0x7f, 0xaf, 0x04, 0xcf, 0xf4, 0xa1, 0x03, 0x14, 0x98, 0x1c, - 0x94, 0x4d, 0xd1, 0x2a, 0x3f, 0x9c, 0x14, 0xad, 0xa3, 0x0e, 0xd7, 0x9b, 0x25, 0x38, 0xdf, 0x7b, - 0x2b, 0x46, 0x3f, 0x4d, 0x6d, 0x78, 0x19, 0xeb, 0x63, 0x66, 0x77, 0x9d, 0xe1, 0xf6, 0x7b, 0x06, - 0x84, 0xf3, 0xb8, 0x68, 0x0a, 0x20, 0x72, 0xd2, 0xcd, 0xe4, 0xd2, 0x8e, 0x97, 0xa4, 0xa2, 0x46, - 0xc1, 0x18, 0x3f, 0x89, 0x91, 0xad, 0xd8, 0xc0, 0xa0, 0xec, 0xd8, 0xbf, 0xf9, 0xf0, 0x7a, 0x98, - 0xf2, 0x87, 0xb8, 0x19, 0x71, 0x46, 0xd6, 0x71, 0x36, 0x40, 0x38, 0x8f, 0x4b, 0xd9, 0xb1, 0xb3, - 0x3e, 0xde, 0x51, 0x6e, 0x5f, 0x30, 0x76, 0x4b, 0xaa, 0x15, 0x1b, 0x18, 0xf9, 0xbc, 0xb5, 0xca, - 0xc1, 0x79, 0x6b, 0xf6, 0x3f, 0x2a, 0xc1, 0x13, 0x3d, 0x55, 0xb9, 0xfe, 0x16, 0xe0, 0xa3, 0x97, - 0x6b, 0x76, 0xb4, 0xb9, 0x73, 0xc8, 0x0c, 0xaa, 0x3f, 0xed, 0x31, 0xd3, 0x44, 0x06, 0x55, 0x7e, - 0xab, 0xb0, 0x0e, 0xbb, 0x55, 0x3c, 0x42, 0xe3, 0xd9, 0x91, 0x34, 0x35, 0x70, 0x88, 0xa4, 0xa9, - 0xdc, 0xc7, 0xa8, 0xf4, 0xb9, 0x90, 0xbf, 0xdb, 0x7b, 0x78, 0xa9, 0xe9, 0xd7, 0x97, 0x77, 0x74, - 0x1e, 0x4e, 0x7b, 0x01, 0xab, 0xe9, 0xbf, 0xd6, 0xde, 0x10, 0x69, 0xeb, 0xa5, 0xec, 0x75, 0x95, - 0x8b, 0x39, 0x38, 0xee, 0x78, 0xe2, 0x11, 0x4c, 0x62, 0x3b, 0xe2, 0x90, 0x7e, 0x14, 0x6a, 0x8a, - 0x36, 0x0f, 0xcc, 0x55, 0x1f, 0xb4, 0x23, 0x30, 0x57, 0x7d, 0x4d, 0x03, 0x8b, 0x8e, 0x04, 0x55, - 0x37, 0x73, 0x33, 0xf3, 0x1a, 0xd9, 0x65, 0xba, 0xa7, 0xfd, 0x1e, 0x18, 0x51, 0x3e, 0x8c, 0x7e, - 0x0b, 0xb7, 0xdb, 0x5f, 0x1e, 0x84, 0xd1, 0x4c, 0x59, 0xa6, 0x8c, 0xcb, 0xd0, 0x3a, 0xd0, 0x65, - 0xc8, 0x02, 0xad, 0xdb, 0x81, 0xbc, 0xd5, 0xc1, 0x08, 0xb4, 0x6e, 0x07, 0x04, 0x73, 0x18, 0x55, - 0x1d, 0xeb, 0xf1, 0x2e, 0x6e, 0x07, 0x22, 0x20, 0x52, 0xa9, 0x8e, 0xf3, 0xac, 0x15, 0x0b, 0x28, - 0xfa, 0x94, 0x05, 0x23, 0x09, 0xf3, 0x47, 0x73, 0x87, 0xab, 0xf8, 0xa0, 0x57, 0x8f, 0x5f, 0x75, - 0x4a, 0x95, 0x20, 0x63, 0xb1, 0x14, 0x66, 0x0b, 0xce, 0x70, 0x44, 0xbf, 0x64, 0x41, 0x4d, 0x15, - 0x9f, 0x16, 0x57, 0xaf, 0xac, 0x15, 0x5b, 0xf5, 0x8a, 0x7b, 0xea, 0x94, 0x6b, 0x5f, 0x5f, 0xd5, - 0xaa, 0x19, 0xa3, 0x44, 0x79, 0x43, 0x87, 0x4e, 0xc6, 0x1b, 0x0a, 0x5d, 0x3c, 0xa1, 0xef, 0x82, - 0x5a, 0xcb, 0x09, 0xbc, 0x06, 0x49, 0x52, 0xee, 0xa0, 0x94, 0xc5, 0xf8, 0x64, 0x23, 0xd6, 0x70, - 0xba, 0xd9, 0x25, 0xec, 0xc5, 0x52, 0xc3, 0xa3, 0xc8, 0x36, 0xbb, 0x35, 0xdd, 0x8c, 0x4d, 0x1c, - 0xd3, 0xfd, 0x09, 0x0f, 0xd5, 0xfd, 0x39, 0x7c, 0x80, 0xfb, 0xf3, 0x1f, 0x58, 0x70, 0xae, 0xeb, - 0x57, 0x7b, 0x74, 0x43, 0xe4, 0xec, 0xaf, 0x54, 0xe0, 0x4c, 0x97, 0xfa, 0x6a, 0x68, 0xd7, 0x9c, - 0xcf, 0x56, 0x11, 0xa7, 0xe2, 0xd9, 0x43, 0x5e, 0x39, 0x8c, 0x5d, 0x26, 0xf1, 0xe1, 0x0e, 0x1f, - 0xf4, 0x01, 0x40, 0xf9, 0xc1, 0x1e, 0x00, 0x18, 0xd3, 0x72, 0xe0, 0xa1, 0x4e, 0xcb, 0xca, 0xfd, - 0xa7, 0x25, 0xfa, 0xa6, 0x05, 0x13, 0xad, 0x1e, 0x45, 0x7d, 0x85, 0x53, 0xef, 0xe6, 0xc9, 0x94, - 0x0c, 0x9e, 0x7d, 0x72, 0x7f, 0x6f, 0xb2, 0x67, 0x2d, 0x65, 0xdc, 0xb3, 0x57, 0xf6, 0xf7, 0xcb, - 0xc0, 0x8a, 0xfb, 0xb1, 0x1a, 0x3a, 0xbb, 0xe8, 0x93, 0x66, 0x99, 0x46, 0xab, 0xa8, 0x92, 0x82, - 0x9c, 0xb8, 0x2a, 0xf3, 0xc8, 0x47, 0xb0, 0x5b, 0xd5, 0xc7, 0xbc, 0xd0, 0x2a, 0xf5, 0x21, 0xb4, - 0x7c, 0x59, 0x0f, 0xb3, 0x5c, 0x7c, 0x3d, 0xcc, 0x5a, 0xbe, 0x16, 0xe6, 0xfd, 0x3f, 0xf1, 0xc0, - 0x23, 0xf9, 0x89, 0xff, 0xa6, 0xc5, 0x05, 0x4f, 0xee, 0x2b, 0x68, 0xcd, 0xc0, 0xba, 0x8f, 0x66, - 0xf0, 0x3c, 0xbb, 0x74, 0xb7, 0x71, 0x85, 0x38, 0xbe, 0xd0, 0x20, 0xcc, 0xfb, 0x73, 0x59, 0x3b, - 0x56, 0x18, 0xec, 0x9a, 0x2c, 0xdf, 0x0f, 0xef, 0x5e, 0x6a, 0x45, 0xe9, 0xae, 0xd0, 0x25, 0xf4, - 0x35, 0x59, 0x0a, 0x82, 0x0d, 0x2c, 0xfb, 0x6f, 0x95, 0xf8, 0x0c, 0x14, 0xc7, 0xfa, 0x2f, 0xe5, - 0x2e, 0x36, 0xe9, 0xff, 0x44, 0xfc, 0xe3, 0x00, 0xae, 0xba, 0x6f, 0x53, 0x9c, 0xb7, 0x5c, 0x39, - 0xf6, 0x7d, 0x85, 0x82, 0x9e, 0x7e, 0x0d, 0xdd, 0x86, 0x0d, 0x7e, 0x19, 0x59, 0x5a, 0x3e, 0x50, - 0x96, 0x66, 0xc4, 0xca, 0xc0, 0x01, 0xbb, 0xdd, 0x9f, 0x59, 0x90, 0xd1, 0x88, 0x50, 0x04, 0x15, - 0xda, 0xdd, 0xdd, 0x62, 0xae, 0x12, 0x35, 0x49, 0x53, 0xd1, 0x28, 0xa6, 0x3d, 0xfb, 0x89, 0x39, - 0x23, 0xe4, 0x8b, 0xd3, 0xff, 0x52, 0x11, 0xd7, 0xdd, 0x9a, 0x0c, 0xaf, 0x84, 0xe1, 0x16, 0x3f, - 0x34, 0xd4, 0x91, 0x04, 0xf6, 0x4b, 0x30, 0xde, 0xd1, 0x29, 0x76, 0x87, 0x41, 0x28, 0xef, 0x4f, - 0x35, 0xa6, 0x2b, 0x4b, 0xc1, 0xc3, 0x1c, 0x66, 0xbf, 0x69, 0xc1, 0xe9, 0x3c, 0x79, 0xf4, 0x55, - 0x0b, 0xc6, 0x93, 0x3c, 0xbd, 0x93, 0x1a, 0x3b, 0x15, 0x19, 0xd7, 0x01, 0xc2, 0x9d, 0x9d, 0xb0, - 0xff, 0xaf, 0x98, 0xfc, 0xb7, 0xbc, 0xa0, 0x1e, 0xde, 0x55, 0x8a, 0x89, 0xd5, 0x53, 0x31, 0xa1, - 0xeb, 0xd1, 0xdd, 0x24, 0xf5, 0xb6, 0xdf, 0x91, 0xfb, 0xb7, 0x26, 0xda, 0xb1, 0xc2, 0x60, 0xa9, - 0x4e, 0x6d, 0x51, 0x30, 0x37, 0x37, 0x29, 0xe7, 0x45, 0x3b, 0x56, 0x18, 0xe8, 0x45, 0x18, 0x31, - 0xef, 0x08, 0x16, 0xf3, 0x92, 0x29, 0xe4, 0xe6, 0x75, 0xc2, 0x38, 0x83, 0x85, 0xa6, 0x00, 0x94, - 0x92, 0x23, 0xb7, 0x48, 0xe6, 0x84, 0x51, 0x92, 0x28, 0xc1, 0x06, 0x06, 0x4b, 0x2c, 0xe4, 0x17, - 0xf1, 0xca, 0xf8, 0x51, 0x9e, 0x58, 0x28, 0xda, 0xb0, 0x82, 0x52, 0x69, 0xd2, 0x72, 0x82, 0xb6, - 0xe3, 0xd3, 0x11, 0x12, 0xd9, 0xd0, 0x6a, 0x19, 0x2e, 0x2b, 0x08, 0x36, 0xb0, 0xe8, 0x1b, 0xa7, - 0x5e, 0x8b, 0x7c, 0x38, 0x0c, 0x64, 0xe4, 0x95, 0x3e, 0x52, 0x11, 0xed, 0x58, 0x61, 0xd8, 0xff, - 0xd5, 0x82, 0xfc, 0x75, 0xed, 0x19, 0x2f, 0x87, 0x75, 0x60, 0x06, 0x76, 0x36, 0x7f, 0xb3, 0xd4, - 0x57, 0xfe, 0xa6, 0x99, 0x5a, 0x59, 0xbe, 0x6f, 0x6a, 0xe5, 0x8f, 0xeb, 0x9b, 0xb0, 0x78, 0x0e, - 0xe6, 0x70, 0xb7, 0x5b, 0xb0, 0x90, 0x0d, 0x83, 0xae, 0xa3, 0x6a, 0x74, 0x8c, 0x70, 0xdb, 0x61, - 0x6e, 0x86, 0x21, 0x09, 0x88, 0xbd, 0x02, 0x35, 0x75, 0xb2, 0x20, 0x0d, 0x55, 0xab, 0xbb, 0xa1, - 0xda, 0x57, 0x2a, 0xd9, 0xec, 0xc6, 0xb7, 0x7f, 0xf0, 0xf4, 0xdb, 0xbe, 0xfb, 0x83, 0xa7, 0xdf, - 0xf6, 0xc7, 0x3f, 0x78, 0xfa, 0x6d, 0x9f, 0xda, 0x7f, 0xda, 0xfa, 0xf6, 0xfe, 0xd3, 0xd6, 0x77, - 0xf7, 0x9f, 0xb6, 0xfe, 0x78, 0xff, 0x69, 0xeb, 0xfb, 0xfb, 0x4f, 0x5b, 0x5f, 0xfa, 0x4f, 0x4f, - 0xbf, 0xed, 0xc3, 0x5d, 0x43, 0xef, 0xe8, 0x8f, 0x77, 0xbb, 0xf5, 0xe9, 0xed, 0x8b, 0x2c, 0xfa, - 0x8b, 0x2e, 0xaf, 0x69, 0x63, 0x4e, 0x4d, 0xcb, 0xe5, 0xf5, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, - 0x51, 0xda, 0xe1, 0xf8, 0x58, 0xd1, 0x00, 0x00, + 0xd3, 0x0f, 0x34, 0x03, 0x50, 0xf7, 0x02, 0xc7, 0xf7, 0xde, 0xa0, 0xf6, 0x69, 0x89, 0x09, 0x6a, + 0xb6, 0xf3, 0x5d, 0x56, 0xad, 0xd8, 0xc0, 0x38, 0xff, 0x17, 0x60, 0xd4, 0x78, 0xf3, 0x2e, 0xc7, + 0xd6, 0x67, 0xcd, 0x63, 0xeb, 0x8a, 0x71, 0xda, 0x7c, 0xfe, 0xfd, 0x70, 0x3a, 0xdb, 0xc1, 0xa3, + 0x3c, 0x6f, 0x7f, 0x6d, 0x24, 0x7b, 0x86, 0xb0, 0x41, 0xa2, 0x26, 0xed, 0xda, 0xdb, 0x76, 0xfd, + 0xdb, 0x76, 0xfd, 0xdb, 0x76, 0xbd, 0xe9, 0x9a, 0x15, 0x36, 0xeb, 0xc8, 0x83, 0xb2, 0x59, 0x0f, + 0x4a, 0x90, 0x52, 0x46, 0xf8, 0x80, 0xbc, 0x0b, 0x46, 0x22, 0xd2, 0x0a, 0x6f, 0xe0, 0x65, 0x21, + 0xe4, 0x75, 0xec, 0x30, 0x6f, 0xc6, 0x12, 0x4e, 0x37, 0x83, 0x96, 0x93, 0x6c, 0x09, 0x29, 0xaf, + 0x36, 0x83, 0x35, 0x27, 0xd9, 0xc2, 0x0c, 0x82, 0xde, 0x0f, 0x13, 0x89, 0x13, 0x35, 0x48, 0x82, + 0xc9, 0x0e, 0x1b, 0x77, 0x71, 0x14, 0xf4, 0x98, 0xc0, 0x9d, 0xd8, 0x48, 0x41, 0x71, 0x06, 0x1b, + 0xdd, 0x81, 0xa1, 0x2d, 0xe2, 0x37, 0xc5, 0x98, 0xac, 0xe7, 0x27, 0x84, 0xd9, 0xbb, 0x5e, 0x21, + 0x7e, 0x93, 0x8b, 0x08, 0xfa, 0x0b, 0x33, 0x56, 0x74, 0x42, 0x54, 0xb6, 0xdb, 0x71, 0x12, 0x36, + 0xbd, 0x37, 0xa4, 0x07, 0xe4, 0x83, 0x39, 0x33, 0xbe, 0x26, 0xe9, 0x73, 0x9b, 0x59, 0xfd, 0xc5, + 0x9a, 0x33, 0xeb, 0x47, 0xcd, 0x8b, 0x98, 0x47, 0x63, 0x4f, 0x38, 0x32, 0xf2, 0xee, 0xc7, 0x82, + 0xa4, 0xcf, 0xfb, 0xa1, 0xfe, 0x62, 0xcd, 0x19, 0xed, 0xa9, 0x89, 0x39, 0xca, 0xfa, 0x70, 0x23, + 0xe7, 0x3e, 0xf0, 0x49, 0xd9, 0x6d, 0x82, 0xa2, 0x67, 0xa0, 0xe4, 0x6e, 0x39, 0x51, 0x32, 0x35, + 0xc6, 0x26, 0x8d, 0xb2, 0xdd, 0xe7, 0x69, 0x23, 0xe6, 0x30, 0xf4, 0x14, 0x14, 0x23, 0x52, 0x67, + 0x21, 0x6b, 0x46, 0x30, 0x03, 0x26, 0x75, 0x4c, 0xdb, 0xed, 0x5f, 0x2b, 0xa4, 0xf5, 0x99, 0xf4, + 0x7b, 0xf3, 0xd9, 0xee, 0xb6, 0xa3, 0x58, 0xda, 0xf7, 0xc6, 0x6c, 0x67, 0xcd, 0x58, 0xc2, 0xd1, + 0xa7, 0x2d, 0x18, 0xb9, 0x1d, 0x87, 0x41, 0x40, 0x12, 0xb1, 0x77, 0xdc, 0xcc, 0x79, 0x28, 0xae, + 0x72, 0xea, 0xba, 0x0f, 0xa2, 0x01, 0x4b, 0xbe, 0xb4, 0xbb, 0x64, 0xd7, 0xf5, 0xdb, 0xb5, 0x8e, + 0x33, 0xec, 0x4b, 0xbc, 0x19, 0x4b, 0x38, 0x45, 0xf5, 0x02, 0x8e, 0x3a, 0x94, 0x46, 0x5d, 0x0a, + 0x04, 0xaa, 0x80, 0xdb, 0x7f, 0x75, 0x18, 0xce, 0x75, 0x5d, 0x1c, 0x54, 0xd3, 0x60, 0x7b, 0xf9, + 0x65, 0xcf, 0x27, 0x32, 0x32, 0x83, 0x69, 0x1a, 0x37, 0x55, 0x2b, 0x36, 0x30, 0xd0, 0xcf, 0x01, + 0xb4, 0x9c, 0xc8, 0x69, 0x12, 0xb1, 0xc3, 0x16, 0x07, 0xdf, 0xd0, 0x69, 0x3f, 0xd6, 0x24, 0x4d, + 0x6d, 0xe0, 0xa9, 0xa6, 0x18, 0x1b, 0x2c, 0xd1, 0x7b, 0x61, 0x34, 0x22, 0x3e, 0x71, 0x62, 0x16, + 0xf1, 0x98, 0x0d, 0xdf, 0xc6, 0x1a, 0x84, 0x4d, 0x3c, 0xf4, 0xac, 0x0a, 0x62, 0xc9, 0x1c, 0xf8, + 0xa7, 0x03, 0x59, 0x90, 0x0b, 0x63, 0xfc, 0x17, 0x0f, 0x10, 0x11, 0xcb, 0xf2, 0x85, 0x9e, 0xae, + 0x32, 0x91, 0x24, 0x32, 0x83, 0x9d, 0xbb, 0x97, 0xa4, 0x63, 0xb4, 0x7a, 0xfa, 0x60, 0x7f, 0x7a, + 0xec, 0xa6, 0x41, 0x06, 0xa7, 0x88, 0xa2, 0x37, 0x2d, 0x98, 0xa8, 0x7b, 0x3e, 0xd1, 0xaf, 0x28, + 0x22, 0xba, 0x57, 0x07, 0x1f, 0xc9, 0xcb, 0x26, 0x5d, 0x2d, 0x86, 0x53, 0xcd, 0x31, 0xce, 0xb0, + 0xa7, 0x73, 0x69, 0x87, 0x44, 0x4c, 0x7e, 0x0f, 0xa7, 0xe7, 0xd2, 0x4d, 0xde, 0x8c, 0x25, 0x1c, + 0xcd, 0xc1, 0xa9, 0x96, 0x13, 0xc7, 0xf3, 0x11, 0xa9, 0x91, 0x20, 0xf1, 0x1c, 0x9f, 0xc7, 0x5b, + 0x97, 0x75, 0xbc, 0xe5, 0x5a, 0x1a, 0x8c, 0xb3, 0xf8, 0xe8, 0x43, 0xf0, 0xb8, 0xd7, 0x08, 0xc2, + 0x88, 0xac, 0x78, 0x71, 0xec, 0x05, 0x0d, 0x3d, 0xd7, 0x98, 0x38, 0x2e, 0x57, 0xa7, 0x05, 0xa9, + 0xc7, 0x97, 0xba, 0xa3, 0xe1, 0x5e, 0xcf, 0xa3, 0xe7, 0xa1, 0x1c, 0x6f, 0x7b, 0xad, 0xf9, 0xa8, + 0x16, 0x33, 0xc7, 0x73, 0x59, 0xbb, 0xae, 0xd6, 0x45, 0x3b, 0x56, 0x18, 0xf6, 0xd7, 0x0a, 0x69, + 0xb3, 0xd5, 0x5c, 0xa4, 0x28, 0xa6, 0x4b, 0x31, 0xb9, 0xe9, 0x44, 0xd2, 0xa5, 0x31, 0x60, 0xc4, + 0xb6, 0xa0, 0x7b, 0xd3, 0x89, 0xcc, 0x45, 0xcd, 0x18, 0x60, 0xc9, 0x09, 0xdd, 0x86, 0xa1, 0xc4, + 0x77, 0x72, 0x4a, 0xf1, 0x30, 0x38, 0x6a, 0x2f, 0xc2, 0xf2, 0x5c, 0x8c, 0x19, 0x0f, 0xf4, 0x24, + 0x55, 0xcb, 0x37, 0x65, 0x58, 0x97, 0xd0, 0xa4, 0x37, 0x63, 0xcc, 0x5a, 0xed, 0xff, 0x5b, 0xee, + 0x22, 0x57, 0xd5, 0x46, 0x86, 0x2e, 0x02, 0x50, 0x0b, 0x6f, 0x2d, 0x22, 0x75, 0x6f, 0x57, 0x28, + 0x12, 0x6a, 0xed, 0x5e, 0x57, 0x10, 0x6c, 0x60, 0xc9, 0x67, 0xd6, 0xdb, 0x75, 0xfa, 0x4c, 0xa1, + 0xf3, 0x19, 0x0e, 0xc1, 0x06, 0x16, 0x7a, 0x09, 0x86, 0xbd, 0xa6, 0xd3, 0x50, 0xd1, 0x67, 0x4f, + 0xd2, 0x45, 0xbb, 0xc4, 0x5a, 0xee, 0xed, 0x4f, 0x4f, 0xa8, 0x0e, 0xb1, 0x26, 0x2c, 0x70, 0xd1, + 0x6f, 0x5a, 0x30, 0xe6, 0x86, 0xcd, 0x66, 0x18, 0x70, 0xbb, 0x48, 0x18, 0x79, 0xb7, 0x4f, 0x6a, + 0x9b, 0x9f, 0x99, 0x37, 0x98, 0x71, 0x2b, 0x4f, 0xe5, 0xa2, 0x98, 0x20, 0x9c, 0xea, 0x95, 0xb9, + 0xec, 0x4a, 0x87, 0x2c, 0xbb, 0xdf, 0xb1, 0x60, 0x92, 0x3f, 0x6b, 0x98, 0x6b, 0x22, 0xed, 0x22, + 0x3c, 0xe1, 0xd7, 0xea, 0xb0, 0x60, 0x95, 0xab, 0xab, 0x03, 0x8e, 0x3b, 0x3b, 0x89, 0x16, 0x61, + 0xb2, 0x1e, 0x46, 0x2e, 0x31, 0x07, 0x42, 0xc8, 0x0c, 0x45, 0xe8, 0x72, 0x16, 0x01, 0x77, 0x3e, + 0x83, 0x6e, 0xc2, 0x63, 0x46, 0xa3, 0x39, 0x0e, 0x5c, 0x6c, 0x3c, 0x2d, 0xa8, 0x3d, 0x76, 0xb9, + 0x2b, 0x16, 0xee, 0xf1, 0x74, 0xda, 0xa3, 0x51, 0xe9, 0xc3, 0xa3, 0xf1, 0x3a, 0x3c, 0xe1, 0x76, + 0x8e, 0xcc, 0x4e, 0xdc, 0xde, 0x8c, 0xf9, 0x96, 0x51, 0xae, 0xfe, 0x88, 0x20, 0xf0, 0xc4, 0x7c, + 0x2f, 0x44, 0xdc, 0x9b, 0x06, 0xfa, 0x38, 0x94, 0x23, 0xc2, 0xbe, 0x4a, 0x2c, 0x72, 0x10, 0x06, + 0x34, 0x63, 0xb5, 0x06, 0xca, 0xc9, 0x6a, 0xb1, 0x28, 0x1a, 0x62, 0xac, 0x38, 0x9e, 0xff, 0x00, + 0x4c, 0x76, 0xcc, 0xe7, 0x23, 0x39, 0x15, 0x16, 0xe0, 0xb1, 0xee, 0x33, 0xe7, 0x48, 0xae, 0x85, + 0x7f, 0x90, 0x09, 0xad, 0x33, 0xb4, 0xc9, 0x3e, 0xdc, 0x54, 0x0e, 0x14, 0x49, 0xb0, 0x23, 0x04, + 0xe9, 0xe5, 0xc1, 0x46, 0xef, 0x52, 0xb0, 0xc3, 0x27, 0x3e, 0xb3, 0xc5, 0x2f, 0x05, 0x3b, 0x98, + 0xd2, 0x46, 0x5f, 0xb6, 0x52, 0xda, 0x10, 0x77, 0x6e, 0x7d, 0xf4, 0x44, 0xd4, 0xe7, 0xbe, 0x15, + 0x24, 0xfb, 0x5f, 0x16, 0xe0, 0xc2, 0x61, 0x44, 0xfa, 0x18, 0xbe, 0x67, 0x60, 0x38, 0x66, 0xa7, + 0x7e, 0x42, 0x32, 0x8d, 0x52, 0xa9, 0xc4, 0xcf, 0x01, 0x5f, 0xc7, 0x02, 0x84, 0x7c, 0x28, 0x36, + 0x9d, 0x96, 0xf0, 0x79, 0x2c, 0x0d, 0x1a, 0x48, 0x4f, 0xff, 0x3b, 0xfe, 0x8a, 0xd3, 0xe2, 0x96, + 0xb4, 0xd1, 0x80, 0x29, 0x1b, 0x94, 0x40, 0xc9, 0x89, 0x22, 0x47, 0x1e, 0x31, 0x5d, 0xcb, 0x87, + 0xdf, 0x1c, 0x25, 0x59, 0x9d, 0x3c, 0xd8, 0x9f, 0x1e, 0x4f, 0x35, 0x61, 0xce, 0xcc, 0xfe, 0xfc, + 0x48, 0x2a, 0x98, 0x9c, 0x9d, 0x1b, 0xc6, 0x30, 0x2c, 0x5c, 0x1d, 0x56, 0xde, 0xf9, 0x0b, 0x3c, + 0x1b, 0x88, 0x19, 0x4b, 0x22, 0xa7, 0x52, 0xb0, 0x42, 0x9f, 0xb3, 0x58, 0xe6, 0xa2, 0x0c, 0xb0, + 0x17, 0x26, 0xca, 0xc9, 0x24, 0x52, 0x9a, 0xf9, 0x90, 0xb2, 0x11, 0x9b, 0xdc, 0xe9, 0xd6, 0xd5, + 0xe2, 0x39, 0x38, 0x59, 0x43, 0x45, 0xe6, 0x36, 0x4a, 0x38, 0xda, 0xed, 0x72, 0x3e, 0x98, 0x43, + 0xf6, 0x5b, 0x1f, 0x27, 0x82, 0xdf, 0xb0, 0x60, 0x92, 0x6b, 0x8a, 0x0b, 0x5e, 0xbd, 0x4e, 0x22, + 0x12, 0xb8, 0x44, 0xea, 0xda, 0x03, 0x9e, 0x40, 0x4b, 0xff, 0xd2, 0x52, 0x96, 0xbc, 0xde, 0xd3, + 0x3a, 0x40, 0xb8, 0xb3, 0x33, 0xa8, 0x06, 0x43, 0x5e, 0x50, 0x0f, 0xc5, 0x4e, 0x5e, 0x1d, 0xac, + 0x53, 0x4b, 0x41, 0x3d, 0xd4, 0xab, 0x99, 0xfe, 0xc3, 0x8c, 0x3a, 0x5a, 0x86, 0xb3, 0x91, 0x70, + 0xb9, 0x5c, 0xf1, 0x62, 0x6a, 0x18, 0x2f, 0x7b, 0x4d, 0x2f, 0x61, 0xbb, 0x70, 0xb1, 0x3a, 0x75, + 0xb0, 0x3f, 0x7d, 0x16, 0x77, 0x81, 0xe3, 0xae, 0x4f, 0xa1, 0x37, 0x60, 0x44, 0xa6, 0x5a, 0x96, + 0xf3, 0xb0, 0x5b, 0x3a, 0xe7, 0xbf, 0x9a, 0x4c, 0xeb, 0x22, 0xab, 0x52, 0x32, 0xb4, 0xdf, 0x1c, + 0x85, 0xce, 0x03, 0x36, 0xf4, 0x09, 0xa8, 0x44, 0x2a, 0xfd, 0xd3, 0xca, 0x23, 0xa4, 0x4d, 0x7e, + 0x5f, 0x71, 0xb8, 0xa7, 0xf4, 0x01, 0x9d, 0xe8, 0xa9, 0x39, 0x52, 0xad, 0x3d, 0xd6, 0xe7, 0x70, + 0x39, 0xcc, 0x6d, 0xc1, 0x55, 0x9f, 0xdf, 0xec, 0x05, 0x2e, 0x66, 0x3c, 0x50, 0x04, 0xc3, 0x5b, + 0xc4, 0xf1, 0x93, 0xad, 0x7c, 0x5c, 0xcd, 0x57, 0x18, 0xad, 0x6c, 0xa2, 0x00, 0x6f, 0xc5, 0x82, + 0x13, 0xda, 0x85, 0x91, 0x2d, 0x3e, 0x01, 0x84, 0x22, 0xbd, 0x32, 0xe8, 0xe0, 0xa6, 0x66, 0x95, + 0xfe, 0xdc, 0xa2, 0x01, 0x4b, 0x76, 0x2c, 0xb8, 0xc0, 0x38, 0x5b, 0xe6, 0x4b, 0x37, 0xbf, 0x1c, + 0x89, 0xfe, 0x0f, 0x96, 0x3f, 0x06, 0x63, 0x11, 0x71, 0xc3, 0xc0, 0xf5, 0x7c, 0x52, 0x9b, 0x93, + 0x6e, 0xe4, 0xa3, 0x44, 0xd6, 0x33, 0xaf, 0x00, 0x36, 0x68, 0xe0, 0x14, 0x45, 0xf4, 0x59, 0x0b, + 0x26, 0x54, 0xce, 0x18, 0xfd, 0x20, 0x44, 0x78, 0x45, 0x97, 0x73, 0xca, 0x50, 0x63, 0x34, 0xab, + 0xe8, 0x60, 0x7f, 0x7a, 0x22, 0xdd, 0x86, 0x33, 0x7c, 0xd1, 0x87, 0x01, 0xc2, 0x4d, 0x1e, 0x41, + 0x30, 0x97, 0x08, 0x17, 0xe9, 0x51, 0x5e, 0x75, 0x82, 0xa7, 0xd8, 0x48, 0x0a, 0xd8, 0xa0, 0x86, + 0xae, 0x01, 0xf0, 0x65, 0xb3, 0xb1, 0xd7, 0x92, 0xda, 0xb6, 0x4c, 0x8d, 0x80, 0x75, 0x05, 0xb9, + 0xb7, 0x3f, 0xdd, 0xe9, 0xb2, 0x62, 0x47, 0xe0, 0xc6, 0xe3, 0xe8, 0x67, 0x61, 0x24, 0x6e, 0x37, + 0x9b, 0x8e, 0x72, 0xa0, 0xe6, 0x98, 0xb4, 0xc3, 0xe9, 0x1a, 0xa2, 0x88, 0x37, 0x60, 0xc9, 0x11, + 0xdd, 0xa6, 0x42, 0x35, 0x16, 0xbe, 0x34, 0xb6, 0x8a, 0xb8, 0x4e, 0x30, 0xca, 0xde, 0xe9, 0x7d, + 0xe2, 0xb9, 0xb3, 0xb8, 0x0b, 0xce, 0xbd, 0xfd, 0xe9, 0xc7, 0xd2, 0xed, 0xcb, 0xa1, 0x48, 0xa3, + 0xe9, 0x4a, 0x13, 0x5d, 0x95, 0x95, 0x17, 0xe8, 0x6b, 0xcb, 0x84, 0xe0, 0xe7, 0x74, 0xe5, 0x05, + 0xd6, 0xdc, 0x7b, 0xcc, 0xcc, 0x87, 0xd1, 0x0a, 0x9c, 0x71, 0xc3, 0x20, 0x89, 0x42, 0xdf, 0xe7, + 0xe5, 0x44, 0xb8, 0xe1, 0xc3, 0x1d, 0xac, 0xef, 0x14, 0xdd, 0x3e, 0x33, 0xdf, 0x89, 0x82, 0xbb, + 0x3d, 0x67, 0x07, 0xe9, 0xd0, 0x2a, 0x31, 0x38, 0x2f, 0xc1, 0x18, 0xd9, 0x4d, 0x48, 0x14, 0x38, + 0xfe, 0x0d, 0xbc, 0x2c, 0x5d, 0x8b, 0x6c, 0x0d, 0x5c, 0x32, 0xda, 0x71, 0x0a, 0x0b, 0xd9, 0xca, + 0xda, 0x2f, 0xe8, 0x5c, 0x33, 0x6e, 0xed, 0x4b, 0xdb, 0xde, 0xfe, 0xdf, 0x85, 0x94, 0x42, 0xb6, + 0x11, 0x11, 0x82, 0x42, 0x28, 0x05, 0x61, 0x4d, 0xc9, 0xfe, 0xab, 0xf9, 0xc8, 0xfe, 0xeb, 0x61, + 0xcd, 0x28, 0xcf, 0x40, 0xff, 0xc5, 0x98, 0xf3, 0x61, 0xf9, 0xeb, 0x32, 0xd1, 0x9f, 0x01, 0x84, + 0xa1, 0x91, 0x27, 0x67, 0x95, 0xbf, 0xbe, 0x6a, 0x32, 0xc2, 0x69, 0xbe, 0x68, 0x1b, 0x4a, 0x5b, + 0x61, 0x9c, 0x48, 0xf3, 0x63, 0x40, 0x4b, 0xe7, 0x4a, 0x18, 0x27, 0x4c, 0x8b, 0x50, 0xaf, 0x4d, + 0x5b, 0x62, 0xcc, 0x79, 0xd8, 0xff, 0xd9, 0x4a, 0x39, 0x92, 0x6f, 0xb1, 0x30, 0xc3, 0x1d, 0x12, + 0xd0, 0x65, 0x6d, 0x06, 0xad, 0xfc, 0xf9, 0x4c, 0xae, 0xd3, 0x8f, 0xf5, 0x2a, 0x96, 0x73, 0x97, + 0x52, 0x98, 0x61, 0x24, 0x8c, 0xf8, 0x96, 0x4f, 0x59, 0xe9, 0xac, 0xb3, 0x42, 0x1e, 0x06, 0x86, + 0x99, 0x55, 0x79, 0x68, 0x02, 0x9b, 0xfd, 0x65, 0x0b, 0x46, 0xaa, 0x8e, 0xbb, 0x1d, 0xd6, 0xeb, + 0xe8, 0x79, 0x28, 0xd7, 0xda, 0x91, 0x99, 0x00, 0xa7, 0xac, 0xe7, 0x05, 0xd1, 0x8e, 0x15, 0x06, + 0x9d, 0xc3, 0x75, 0xc7, 0x95, 0xb9, 0x95, 0x45, 0x3e, 0x87, 0x2f, 0xb3, 0x16, 0x2c, 0x20, 0xe8, + 0xbd, 0x30, 0xda, 0x74, 0x76, 0xe5, 0xc3, 0x59, 0x2f, 0xf6, 0x8a, 0x06, 0x61, 0x13, 0xcf, 0xfe, + 0x67, 0x16, 0x4c, 0x55, 0x9d, 0xd8, 0x73, 0xe7, 0xda, 0xc9, 0x56, 0xd5, 0x4b, 0x36, 0xdb, 0xee, + 0x36, 0x49, 0x78, 0x42, 0x2d, 0xed, 0x65, 0x3b, 0xa6, 0x4b, 0x49, 0xd9, 0x75, 0xaa, 0x97, 0x37, + 0x44, 0x3b, 0x56, 0x18, 0xe8, 0x0d, 0x18, 0x6d, 0x39, 0x71, 0x7c, 0x37, 0x8c, 0x6a, 0x98, 0xd4, + 0xf3, 0x49, 0x67, 0x5f, 0x27, 0x6e, 0x44, 0x12, 0x4c, 0xea, 0xe2, 0x28, 0x54, 0xd3, 0xc7, 0x26, + 0x33, 0xfb, 0xaf, 0x59, 0x30, 0xc6, 0x8e, 0x78, 0x16, 0x48, 0xe2, 0x78, 0x7e, 0x47, 0x4d, 0x16, + 0xab, 0xcf, 0x9a, 0x2c, 0x17, 0x60, 0x68, 0x2b, 0x6c, 0x92, 0xec, 0xf1, 0xe4, 0x95, 0x90, 0x5a, + 0xb1, 0x14, 0x82, 0x5e, 0xa4, 0xe3, 0xec, 0x05, 0x89, 0x43, 0x67, 0x9c, 0x74, 0x21, 0x9e, 0xe2, + 0x63, 0xac, 0x9a, 0xb1, 0x89, 0x63, 0x7f, 0xb3, 0x02, 0x23, 0xe2, 0x90, 0xb9, 0xef, 0x1c, 0x66, + 0x69, 0x4e, 0x17, 0x7a, 0x9a, 0xd3, 0x31, 0x0c, 0xbb, 0xac, 0xe2, 0x93, 0xd0, 0xda, 0xae, 0xe5, + 0x12, 0x95, 0xc0, 0x8b, 0x48, 0xe9, 0x6e, 0xf1, 0xff, 0x58, 0xb0, 0x42, 0x5f, 0xb2, 0xe0, 0x94, + 0x1b, 0x06, 0x01, 0x71, 0xb5, 0x4a, 0x31, 0x94, 0xc7, 0xe1, 0xf3, 0x7c, 0x9a, 0xa8, 0x76, 0xfd, + 0x67, 0x00, 0x38, 0xcb, 0x1e, 0xbd, 0x02, 0xe3, 0x7c, 0xcc, 0x6e, 0xa6, 0xfc, 0x9e, 0xba, 0x54, + 0x87, 0x09, 0xc4, 0x69, 0x5c, 0x34, 0xc3, 0xfd, 0xc7, 0xa2, 0x28, 0xc6, 0xb0, 0x3e, 0xac, 0x32, + 0xca, 0x61, 0x18, 0x18, 0x28, 0x02, 0x14, 0x91, 0x7a, 0x44, 0xe2, 0x2d, 0x71, 0x08, 0xcf, 0xd4, + 0x99, 0x91, 0xe3, 0xe5, 0x44, 0xe2, 0x0e, 0x4a, 0xb8, 0x0b, 0x75, 0xb4, 0x2d, 0xec, 0xb9, 0x72, + 0x1e, 0x22, 0x4b, 0x7c, 0xe6, 0x9e, 0x66, 0xdd, 0x34, 0x94, 0xe2, 0x2d, 0x27, 0xaa, 0x31, 0x35, + 0xaa, 0xc8, 0xe3, 0xf0, 0xd7, 0x69, 0x03, 0xe6, 0xed, 0x68, 0x01, 0x4e, 0x67, 0x0a, 0x8d, 0xc4, + 0xc2, 0x3f, 0xa9, 0x82, 0xc7, 0x33, 0x25, 0x4a, 0x62, 0xdc, 0xf1, 0x84, 0x69, 0xeb, 0x8f, 0x1e, + 0x62, 0xeb, 0xef, 0xa9, 0x50, 0xaf, 0x31, 0xb6, 0x1d, 0xbd, 0x9a, 0xcb, 0x00, 0xf4, 0x15, 0xd7, + 0xf5, 0x85, 0x4c, 0x5c, 0xd7, 0x38, 0xeb, 0xc0, 0xcd, 0x7c, 0x3a, 0x70, 0xf4, 0x20, 0xae, 0x87, + 0x19, 0x94, 0xf5, 0xbf, 0x2c, 0x90, 0xdf, 0x75, 0xde, 0x71, 0xb7, 0x08, 0x9d, 0x32, 0xe8, 0xfd, + 0x30, 0xa1, 0x2c, 0xd6, 0xf9, 0xb0, 0x1d, 0xf0, 0x78, 0xac, 0xa2, 0x3e, 0x23, 0xc4, 0x29, 0x28, + 0xce, 0x60, 0xa3, 0x59, 0xa8, 0xd0, 0x71, 0xe2, 0x8f, 0xf2, 0xad, 0x4d, 0x59, 0xc5, 0x73, 0x6b, + 0x4b, 0xe2, 0x29, 0x8d, 0x83, 0x42, 0x98, 0xf4, 0x9d, 0x38, 0x61, 0x3d, 0xa0, 0x06, 0xec, 0x31, + 0x33, 0x92, 0x59, 0x84, 0xf2, 0x72, 0x96, 0x10, 0xee, 0xa4, 0x6d, 0x7f, 0x77, 0x08, 0xc6, 0x53, + 0x92, 0xf1, 0x88, 0x7b, 0xe2, 0xf3, 0x50, 0x96, 0xdb, 0x54, 0xb6, 0x2e, 0x82, 0xda, 0xcb, 0x14, + 0x06, 0xdd, 0xb4, 0x36, 0x89, 0x13, 0x91, 0x88, 0x95, 0x70, 0xc9, 0xee, 0xe1, 0x55, 0x0d, 0xc2, + 0x26, 0x1e, 0x13, 0xca, 0x89, 0x1f, 0xcf, 0xfb, 0x1e, 0x09, 0x12, 0xde, 0xcd, 0x7c, 0x84, 0xf2, + 0xc6, 0xf2, 0xba, 0x49, 0x54, 0x0b, 0xe5, 0x0c, 0x00, 0x67, 0xd9, 0xa3, 0x5f, 0xb4, 0x60, 0xdc, + 0xb9, 0x1b, 0xeb, 0xb2, 0x84, 0x22, 0x82, 0x6b, 0xc0, 0x4d, 0x2a, 0x55, 0xe9, 0x90, 0x7b, 0x58, + 0x53, 0x4d, 0x38, 0xcd, 0x14, 0x7d, 0xd5, 0x02, 0x44, 0x76, 0x89, 0x2b, 0x63, 0xcc, 0x44, 0x5f, + 0x86, 0xf3, 0x30, 0xec, 0x2e, 0x75, 0xd0, 0xe5, 0x52, 0xbd, 0xb3, 0x1d, 0x77, 0xe9, 0x83, 0xfd, + 0x8f, 0x8b, 0x6a, 0x41, 0xe9, 0xb0, 0x46, 0xc7, 0x48, 0x72, 0xb2, 0x8e, 0x9f, 0xe4, 0xa4, 0x0f, + 0xa8, 0x3b, 0x13, 0x9d, 0x52, 0x09, 0x1e, 0x85, 0x87, 0x94, 0xe0, 0xf1, 0xf3, 0x56, 0xaa, 0x02, + 0xc8, 0xe8, 0xc5, 0x0f, 0xe7, 0x1b, 0x52, 0x39, 0xc3, 0x43, 0x25, 0x32, 0xd2, 0x3d, 0x1d, 0x98, + 0x41, 0xa5, 0xa9, 0x81, 0x76, 0x24, 0x69, 0xf8, 0xef, 0x8a, 0x30, 0x6a, 0xec, 0xa4, 0x5d, 0xd5, + 0x22, 0xeb, 0x11, 0x53, 0x8b, 0x0a, 0x47, 0x50, 0x8b, 0x7e, 0x0e, 0x2a, 0xae, 0x94, 0xf2, 0xf9, + 0xd4, 0xc0, 0xcc, 0xee, 0x1d, 0x5a, 0xd0, 0xab, 0x26, 0xac, 0x79, 0xa2, 0xc5, 0x54, 0xce, 0x85, + 0xd8, 0x21, 0x86, 0xd8, 0x0e, 0xd1, 0x2d, 0x29, 0x42, 0xec, 0x14, 0x9d, 0xcf, 0xb0, 0x42, 0x31, + 0x2d, 0x4f, 0xbc, 0x97, 0x0c, 0x7c, 0xe6, 0x85, 0x62, 0xd6, 0x96, 0x64, 0x33, 0x36, 0x71, 0xec, + 0xef, 0x5a, 0xea, 0xe3, 0x3e, 0x80, 0xb4, 0xe9, 0xdb, 0xe9, 0xb4, 0xe9, 0x4b, 0xb9, 0x0c, 0x73, + 0x8f, 0x7c, 0xe9, 0xeb, 0x30, 0x32, 0x1f, 0x36, 0x9b, 0x4e, 0x50, 0x43, 0x3f, 0x0a, 0x23, 0x2e, + 0xff, 0x29, 0xfc, 0x28, 0xec, 0x34, 0x4e, 0x40, 0xb1, 0x84, 0xa1, 0x27, 0x61, 0xc8, 0x89, 0x1a, + 0xd2, 0x77, 0xc2, 0x02, 0x3a, 0xe6, 0xa2, 0x46, 0x8c, 0x59, 0xab, 0xfd, 0x66, 0x11, 0x60, 0x3e, + 0x6c, 0xb6, 0x9c, 0x88, 0xd4, 0x36, 0x42, 0x56, 0x83, 0xeb, 0x44, 0xcf, 0xb0, 0xb4, 0xb1, 0xf4, + 0x28, 0x9f, 0x63, 0x19, 0x67, 0x19, 0xc5, 0x07, 0x7d, 0x96, 0xf1, 0x79, 0x0b, 0x10, 0xfd, 0x22, + 0x61, 0x40, 0x82, 0x44, 0x1f, 0xce, 0xce, 0x42, 0xc5, 0x95, 0xad, 0x42, 0x6b, 0xd1, 0xeb, 0x4f, + 0x02, 0xb0, 0xc6, 0xe9, 0xc3, 0xfc, 0x7c, 0x46, 0x0a, 0xc7, 0x62, 0x3a, 0xd0, 0x92, 0x89, 0x54, + 0x21, 0x2b, 0xed, 0xdf, 0x2f, 0xc0, 0x63, 0x7c, 0xbf, 0x5b, 0x71, 0x02, 0xa7, 0x41, 0x9a, 0xb4, + 0x57, 0xfd, 0x1e, 0xb7, 0xbb, 0xd4, 0xee, 0xf1, 0x64, 0xe0, 0xe4, 0xa0, 0x0b, 0x83, 0x4f, 0x68, + 0x3e, 0x85, 0x97, 0x02, 0x2f, 0xc1, 0x8c, 0x38, 0x8a, 0xa1, 0x2c, 0x2b, 0x2a, 0x0b, 0x41, 0x97, + 0x13, 0x23, 0xb5, 0xe6, 0xc5, 0xa6, 0x44, 0xb0, 0x62, 0x44, 0xb5, 0x42, 0x3f, 0x74, 0xb7, 0x31, + 0x69, 0x85, 0x4c, 0xa8, 0x19, 0x21, 0x65, 0xcb, 0xa2, 0x1d, 0x2b, 0x0c, 0xfb, 0xf7, 0x2d, 0xc8, + 0x8a, 0x7b, 0xa3, 0xda, 0x90, 0x75, 0xdf, 0x6a, 0x43, 0x47, 0x28, 0xf7, 0xf3, 0x33, 0x30, 0xea, + 0x24, 0x74, 0x87, 0xe6, 0x36, 0x6d, 0xf1, 0x78, 0x2e, 0xfa, 0x95, 0xb0, 0xe6, 0xd5, 0x3d, 0x66, + 0xcb, 0x9a, 0xe4, 0xec, 0xff, 0x31, 0x04, 0x93, 0x1d, 0xf1, 0xf7, 0xe8, 0x65, 0x18, 0x73, 0xc5, + 0xf4, 0x68, 0x61, 0x52, 0x17, 0x2f, 0x63, 0xc4, 0x39, 0x69, 0x18, 0x4e, 0x61, 0xf6, 0x31, 0x41, + 0x97, 0xe0, 0x4c, 0x44, 0xad, 0xe8, 0x36, 0x99, 0xab, 0x27, 0x24, 0x5a, 0x27, 0x6e, 0x18, 0xd4, + 0x78, 0x4d, 0xac, 0x62, 0xf5, 0xf1, 0x83, 0xfd, 0xe9, 0x33, 0xb8, 0x13, 0x8c, 0xbb, 0x3d, 0x83, + 0x5a, 0x30, 0xee, 0x9b, 0x0a, 0x96, 0xd0, 0xae, 0x8f, 0xa5, 0x9b, 0xa9, 0x0d, 0x38, 0xd5, 0x8c, + 0xd3, 0x0c, 0xd2, 0x5a, 0x5a, 0xe9, 0x21, 0x69, 0x69, 0xbf, 0xa0, 0xb5, 0x34, 0x7e, 0x96, 0xfc, + 0x91, 0x9c, 0xf3, 0x2f, 0x4e, 0x5a, 0x4d, 0x7b, 0x15, 0xca, 0x32, 0xce, 0xa6, 0xaf, 0xf8, 0x14, + 0x93, 0x4e, 0x0f, 0x89, 0x76, 0xaf, 0x00, 0x5d, 0x34, 0x7c, 0xba, 0xce, 0xf4, 0x76, 0x9a, 0x5a, + 0x67, 0x47, 0xdb, 0x52, 0xd1, 0x2e, 0x8f, 0x31, 0xe2, 0x1b, 0xc7, 0x87, 0xf2, 0xb6, 0x50, 0x74, + 0xd8, 0x91, 0x8a, 0x7a, 0x57, 0xa1, 0x47, 0x17, 0x01, 0xb4, 0x16, 0x24, 0x62, 0x9a, 0xd5, 0x11, + 0xa6, 0x56, 0x96, 0xb0, 0x81, 0x45, 0x0d, 0x56, 0x2f, 0x88, 0x13, 0xc7, 0xf7, 0xaf, 0x78, 0x41, + 0x22, 0x3c, 0x6f, 0x6a, 0x87, 0x5c, 0xd2, 0x20, 0x6c, 0xe2, 0x9d, 0x7f, 0x9f, 0xf1, 0x5d, 0x8e, + 0xf2, 0x3d, 0xb7, 0xe0, 0x89, 0x45, 0x2f, 0x51, 0x91, 0xf8, 0x6a, 0x1e, 0x51, 0x25, 0x47, 0x65, + 0x96, 0x58, 0x3d, 0x33, 0x4b, 0x8c, 0x48, 0xf8, 0x42, 0x3a, 0x70, 0x3f, 0x1b, 0x09, 0x6f, 0xbf, + 0x0c, 0x67, 0x17, 0xbd, 0xe4, 0xb2, 0xe7, 0x93, 0x23, 0x32, 0xb1, 0x7f, 0x6f, 0x18, 0xc6, 0xcc, + 0x64, 0xab, 0xa3, 0x24, 0xc7, 0x7c, 0x91, 0xea, 0x31, 0xe2, 0xed, 0x3c, 0x75, 0x00, 0x74, 0x6b, + 0xe0, 0xcc, 0xaf, 0xee, 0x23, 0x66, 0xa8, 0x32, 0x9a, 0x27, 0x36, 0x3b, 0x80, 0xee, 0x42, 0xa9, + 0xce, 0x82, 0xa8, 0x8b, 0x79, 0x9c, 0x92, 0x77, 0x1b, 0x51, 0xbd, 0xcc, 0x78, 0x18, 0x36, 0xe7, + 0x47, 0x77, 0xc8, 0x28, 0x9d, 0xfe, 0x63, 0x44, 0x17, 0x8a, 0xc4, 0x1f, 0x85, 0xd1, 0x4b, 0xd4, + 0x97, 0x8e, 0x21, 0xea, 0x53, 0x82, 0x77, 0xf8, 0x21, 0x09, 0x5e, 0x16, 0x10, 0x9f, 0x6c, 0x31, + 0xfd, 0x4d, 0x84, 0x43, 0x8f, 0xb0, 0x41, 0x30, 0x02, 0xe2, 0x53, 0x60, 0x9c, 0xc5, 0x47, 0x9f, + 0x54, 0xa2, 0xbb, 0x9c, 0x87, 0xd3, 0xd2, 0x9c, 0xd1, 0x27, 0x2d, 0xb5, 0x3f, 0x5f, 0x80, 0x89, + 0xc5, 0xa0, 0xbd, 0xb6, 0xb8, 0xd6, 0xde, 0xf4, 0x3d, 0xf7, 0x1a, 0xd9, 0xa3, 0xa2, 0x79, 0x9b, + 0xec, 0x2d, 0x2d, 0x88, 0x15, 0xa4, 0xe6, 0xcc, 0x35, 0xda, 0x88, 0x39, 0x8c, 0x0a, 0xa3, 0xba, + 0x17, 0x34, 0x48, 0xd4, 0x8a, 0x3c, 0xe1, 0x4f, 0x34, 0x84, 0xd1, 0x65, 0x0d, 0xc2, 0x26, 0x1e, + 0xa5, 0x1d, 0xde, 0x0d, 0x48, 0x94, 0x55, 0x64, 0x57, 0x69, 0x23, 0xe6, 0x30, 0x8a, 0x94, 0x44, + 0xed, 0x38, 0x11, 0x93, 0x51, 0x21, 0x6d, 0xd0, 0x46, 0xcc, 0x61, 0x74, 0xa5, 0xc7, 0xed, 0x4d, + 0x16, 0x84, 0x90, 0x89, 0xbd, 0x5e, 0xe7, 0xcd, 0x58, 0xc2, 0x29, 0xea, 0x36, 0xd9, 0x5b, 0xa0, + 0x26, 0x65, 0x26, 0x3b, 0xe2, 0x1a, 0x6f, 0xc6, 0x12, 0xce, 0x8a, 0x79, 0xa5, 0x87, 0xe3, 0x07, + 0xae, 0x98, 0x57, 0xba, 0xfb, 0x3d, 0x8c, 0xd3, 0x5f, 0xb7, 0x60, 0xcc, 0x0c, 0x1d, 0x42, 0x8d, + 0x8c, 0x8e, 0xbb, 0xda, 0x51, 0x0b, 0xf2, 0xa7, 0xba, 0x5d, 0x7c, 0xd3, 0xf0, 0x92, 0xb0, 0x15, + 0xbf, 0x40, 0x82, 0x86, 0x17, 0x10, 0x76, 0x22, 0xcc, 0x43, 0x8e, 0x52, 0x71, 0x49, 0xf3, 0x61, + 0x8d, 0x1c, 0x43, 0x49, 0xb6, 0x6f, 0xc1, 0x64, 0x47, 0x4a, 0x4c, 0x1f, 0xaa, 0xc5, 0xa1, 0x59, + 0x8f, 0x36, 0x86, 0x51, 0x4a, 0x58, 0x54, 0xc6, 0x40, 0xf3, 0x30, 0xc9, 0x17, 0x12, 0xe5, 0xb4, + 0xee, 0x6e, 0x91, 0xa6, 0xca, 0xa5, 0x62, 0xce, 0xeb, 0x9b, 0x59, 0x20, 0xee, 0xc4, 0xb7, 0xbf, + 0x60, 0xc1, 0x78, 0x2a, 0x15, 0x2a, 0x27, 0x25, 0x88, 0xad, 0xb4, 0x90, 0x45, 0xb2, 0xb1, 0x70, + 0xde, 0x22, 0xdb, 0x4c, 0xf5, 0x4a, 0xd3, 0x20, 0x6c, 0xe2, 0xd9, 0x5f, 0x2e, 0x40, 0x59, 0x46, + 0x03, 0xf4, 0xd1, 0x95, 0xcf, 0x59, 0x30, 0xae, 0x0e, 0x0c, 0x98, 0x27, 0xaa, 0x90, 0x47, 0xdc, + 0x3a, 0xed, 0x81, 0x0a, 0xb5, 0x0c, 0xea, 0xa1, 0xd6, 0xc8, 0xb1, 0xc9, 0x0c, 0xa7, 0x79, 0xa3, + 0x9b, 0x00, 0xf1, 0x5e, 0x9c, 0x90, 0xa6, 0xe1, 0x13, 0xb3, 0x8d, 0x15, 0x37, 0xe3, 0x86, 0x11, + 0xa1, 0xeb, 0xeb, 0x7a, 0x58, 0x23, 0xeb, 0x0a, 0x53, 0xab, 0x50, 0xba, 0x0d, 0x1b, 0x94, 0xec, + 0xbf, 0x57, 0x80, 0xd3, 0xd9, 0x2e, 0xa1, 0x8f, 0xc0, 0x98, 0xe4, 0x6e, 0x5c, 0xe2, 0x23, 0x43, + 0x20, 0xc6, 0xb0, 0x01, 0xbb, 0xb7, 0x3f, 0x3d, 0xdd, 0x79, 0x89, 0xd2, 0x8c, 0x89, 0x82, 0x53, + 0xc4, 0xf8, 0xa9, 0x8d, 0x38, 0x5e, 0xac, 0xee, 0xcd, 0xb5, 0x5a, 0xe2, 0xe8, 0xc5, 0x38, 0xb5, + 0x31, 0xa1, 0x38, 0x83, 0x8d, 0xd6, 0xe0, 0xac, 0xd1, 0x72, 0x9d, 0x78, 0x8d, 0xad, 0xcd, 0x30, + 0x92, 0x96, 0xd5, 0x93, 0x3a, 0x48, 0xa9, 0x13, 0x07, 0x77, 0x7d, 0x92, 0xee, 0xf6, 0xae, 0xd3, + 0x72, 0x5c, 0x2f, 0xd9, 0x13, 0x4e, 0x3e, 0x25, 0x9b, 0xe6, 0x45, 0x3b, 0x56, 0x18, 0xf6, 0x0a, + 0x0c, 0xf5, 0x39, 0x83, 0xfa, 0xd2, 0xe8, 0x5f, 0x85, 0x32, 0x25, 0x27, 0xd5, 0xbb, 0x3c, 0x48, + 0x86, 0x50, 0x96, 0x75, 0xf8, 0x91, 0x0d, 0x45, 0xcf, 0x91, 0x07, 0x63, 0xea, 0xb5, 0x96, 0xe2, + 0xb8, 0xcd, 0x8c, 0x64, 0x0a, 0x44, 0xcf, 0x40, 0x91, 0xec, 0xb6, 0xb2, 0x27, 0x60, 0x97, 0x76, + 0x5b, 0x5e, 0x44, 0x62, 0x8a, 0x44, 0x76, 0x5b, 0xe8, 0x3c, 0x14, 0xbc, 0x9a, 0xd8, 0xa4, 0x40, + 0xe0, 0x14, 0x96, 0x16, 0x70, 0xc1, 0xab, 0xd9, 0xbb, 0x50, 0x51, 0x85, 0xff, 0xd1, 0xb6, 0x94, + 0xdd, 0x56, 0x1e, 0xe1, 0x3b, 0x92, 0x6e, 0x0f, 0xa9, 0xdd, 0x06, 0xd0, 0x39, 0x61, 0x79, 0xc9, + 0x97, 0x0b, 0x30, 0xe4, 0x86, 0x22, 0x5f, 0xb5, 0xac, 0xc9, 0x30, 0xa1, 0xcd, 0x20, 0xf6, 0x2d, + 0x98, 0xb8, 0x16, 0x84, 0x77, 0x59, 0x65, 0x63, 0x56, 0x91, 0x88, 0x12, 0xae, 0xd3, 0x1f, 0x59, + 0x15, 0x81, 0x41, 0x31, 0x87, 0xa9, 0x3a, 0x38, 0x85, 0x5e, 0x75, 0x70, 0xec, 0x4f, 0x59, 0x70, + 0x5a, 0x65, 0xb6, 0x48, 0x69, 0xfc, 0x32, 0x8c, 0x6d, 0xb6, 0x3d, 0xbf, 0x26, 0xeb, 0x1c, 0x65, + 0xdc, 0x14, 0x55, 0x03, 0x86, 0x53, 0x98, 0xd4, 0xa8, 0xda, 0xf4, 0x02, 0x27, 0xda, 0x5b, 0xd3, + 0xe2, 0x5f, 0x49, 0x84, 0xaa, 0x82, 0x60, 0x03, 0xcb, 0xfe, 0x9c, 0xd9, 0x05, 0x91, 0x4b, 0xd3, + 0xc7, 0xc8, 0xde, 0x80, 0x92, 0xab, 0x0e, 0x52, 0x8f, 0x55, 0x8b, 0x4d, 0xe5, 0x4a, 0x33, 0x67, + 0x3a, 0xa7, 0x66, 0xff, 0x93, 0x02, 0x8c, 0xa7, 0x0a, 0x64, 0x20, 0x1f, 0xca, 0xc4, 0x67, 0xae, + 0x3c, 0x39, 0xc5, 0x06, 0xad, 0xf6, 0xa7, 0x96, 0xc5, 0x25, 0x41, 0x17, 0x2b, 0x0e, 0x8f, 0xc6, + 0x79, 0xd5, 0xcb, 0x30, 0x26, 0x3b, 0xf4, 0x21, 0xa7, 0xe9, 0x8b, 0x55, 0xa8, 0x26, 0xc0, 0x25, + 0x03, 0x86, 0x53, 0x98, 0xf6, 0x1f, 0x14, 0x61, 0x8a, 0xfb, 0x3e, 0x6b, 0x2a, 0xa4, 0x64, 0x45, + 0x6a, 0x59, 0x7f, 0x49, 0x97, 0xb1, 0xe1, 0x03, 0xb9, 0x39, 0x68, 0x71, 0xdd, 0xee, 0x8c, 0xfa, + 0x0a, 0x76, 0xf8, 0xd5, 0x4c, 0xb0, 0x03, 0xdf, 0x6c, 0x1b, 0x27, 0xd4, 0xa3, 0x1f, 0xac, 0xe8, + 0x87, 0xbf, 0x5d, 0x80, 0x53, 0x99, 0xca, 0xc5, 0xe8, 0xcd, 0x74, 0xd5, 0x3e, 0x2b, 0x0f, 0x0f, + 0xd9, 0x7d, 0x8b, 0xd9, 0x1e, 0xad, 0x76, 0xdf, 0x43, 0x5a, 0x2a, 0xf6, 0x1f, 0x16, 0x60, 0x22, + 0x5d, 0x72, 0xf9, 0x11, 0x1c, 0xa9, 0x77, 0x43, 0x85, 0x55, 0x15, 0x65, 0xd7, 0x44, 0x71, 0x47, + 0x1c, 0xaf, 0x44, 0x29, 0x1b, 0xb1, 0x86, 0x3f, 0x12, 0x25, 0x11, 0xed, 0xbf, 0x63, 0xc1, 0x39, + 0xfe, 0x96, 0xd9, 0x79, 0xf8, 0x97, 0xbb, 0x8d, 0xee, 0x6b, 0xf9, 0x76, 0x30, 0x53, 0x7e, 0xe9, + 0xb0, 0xf1, 0x65, 0xd7, 0xd3, 0x88, 0xde, 0xa6, 0xa7, 0xc2, 0x23, 0xd8, 0xd9, 0x23, 0x4d, 0x06, + 0xfb, 0x0f, 0x8b, 0xa0, 0x6f, 0xe4, 0x41, 0x9e, 0xc8, 0xd2, 0xc9, 0xa5, 0x0c, 0xd5, 0xfa, 0x5e, + 0xe0, 0xea, 0xbb, 0x7f, 0xca, 0x99, 0x24, 0x9d, 0x5f, 0xb6, 0x60, 0xd4, 0x0b, 0xbc, 0xc4, 0x73, + 0x98, 0xf2, 0x9c, 0xcf, 0x8d, 0x22, 0x8a, 0xdd, 0x12, 0xa7, 0x1c, 0x46, 0xa6, 0xf7, 0x56, 0x31, + 0xc3, 0x26, 0x67, 0xf4, 0x31, 0x11, 0x8f, 0x58, 0xcc, 0x2d, 0xbf, 0xac, 0x9c, 0x09, 0x42, 0x6c, + 0x41, 0x29, 0x22, 0x49, 0x94, 0x53, 0x5a, 0x26, 0xa6, 0xa4, 0x54, 0xd5, 0x41, 0x7d, 0x37, 0x22, + 0x6d, 0xc6, 0x9c, 0x91, 0x1d, 0x03, 0xea, 0x1c, 0x8b, 0x23, 0xc6, 0x7a, 0xcd, 0x42, 0xc5, 0x69, + 0x27, 0x61, 0x93, 0x0e, 0x93, 0x70, 0x30, 0xeb, 0x68, 0x36, 0x09, 0xc0, 0x1a, 0xc7, 0x7e, 0xb3, + 0x04, 0x99, 0xb4, 0x19, 0xb4, 0x6b, 0xde, 0x26, 0x65, 0xe5, 0x7b, 0x9b, 0x94, 0xea, 0x4c, 0xb7, + 0x1b, 0xa5, 0x50, 0x03, 0x4a, 0xad, 0x2d, 0x27, 0x96, 0xba, 0xf1, 0xab, 0x72, 0x98, 0xd6, 0x68, + 0xe3, 0xbd, 0xfd, 0xe9, 0x9f, 0xee, 0xcf, 0xd7, 0x42, 0xe7, 0xea, 0x2c, 0xcf, 0x42, 0xd7, 0xac, + 0x19, 0x0d, 0xcc, 0xe9, 0x1f, 0xe5, 0x4e, 0x95, 0x4f, 0x8b, 0x3a, 0xb0, 0x98, 0xc4, 0x6d, 0x3f, + 0x11, 0xb3, 0xe1, 0xd5, 0x1c, 0x57, 0x19, 0x27, 0xac, 0x13, 0x3e, 0xf9, 0x7f, 0x6c, 0x30, 0x45, + 0x1f, 0x81, 0x4a, 0x9c, 0x38, 0x51, 0x72, 0xcc, 0x14, 0x2d, 0x35, 0xe8, 0xeb, 0x92, 0x08, 0xd6, + 0xf4, 0xd0, 0x87, 0x59, 0x55, 0x3e, 0x2f, 0xde, 0x3a, 0x66, 0x18, 0xb1, 0xac, 0xe0, 0x27, 0x28, + 0x60, 0x83, 0x1a, 0x35, 0x3d, 0xd8, 0xdc, 0xe6, 0xb1, 0x33, 0x65, 0x66, 0x5b, 0x2a, 0x51, 0x88, + 0x15, 0x04, 0x1b, 0x58, 0xf6, 0x8f, 0x43, 0x3a, 0x63, 0x19, 0x4d, 0xcb, 0x04, 0x69, 0xee, 0x7b, + 0x62, 0xe1, 0xc0, 0xa9, 0x5c, 0xe6, 0xdf, 0xb1, 0xc0, 0x4c, 0xab, 0x46, 0x77, 0x78, 0xfe, 0xb6, + 0x95, 0xc7, 0x79, 0x81, 0x41, 0x77, 0x66, 0xc5, 0x69, 0x65, 0x0e, 0xae, 0x64, 0x12, 0xf7, 0xf9, + 0xf7, 0x41, 0x59, 0x42, 0x8f, 0xa4, 0xd4, 0x7d, 0x12, 0xce, 0x64, 0xef, 0xda, 0x14, 0xbe, 0xe6, + 0x46, 0x14, 0xb6, 0x5b, 0x59, 0x43, 0x92, 0xdd, 0xc5, 0x88, 0x39, 0x8c, 0x9a, 0x63, 0xdb, 0x5e, + 0x50, 0xcb, 0x1a, 0x92, 0xd7, 0xbc, 0xa0, 0x86, 0x19, 0xa4, 0x8f, 0x3b, 0xc5, 0x7e, 0xd7, 0x82, + 0x0b, 0x87, 0x5d, 0x09, 0x8a, 0x9e, 0x84, 0xa1, 0xbb, 0x4e, 0x24, 0x4b, 0x9a, 0x32, 0x41, 0x79, + 0xcb, 0x89, 0x02, 0xcc, 0x5a, 0xd1, 0x1e, 0x0c, 0xf3, 0xfc, 0x5f, 0xa1, 0xad, 0xbf, 0x9a, 0xef, + 0x05, 0xa5, 0xd7, 0x88, 0x61, 0x2e, 0xf0, 0xdc, 0x63, 0x2c, 0x18, 0xda, 0xdf, 0xb3, 0x00, 0xad, + 0xee, 0x90, 0x28, 0xf2, 0x6a, 0x46, 0xc6, 0x32, 0x7a, 0x09, 0xc6, 0x6e, 0xaf, 0xaf, 0x5e, 0x5f, + 0x0b, 0xbd, 0x80, 0x55, 0x30, 0x30, 0x92, 0xb4, 0xae, 0x1a, 0xed, 0x38, 0x85, 0x85, 0xe6, 0x61, + 0xf2, 0xf6, 0x1d, 0x6a, 0xfc, 0x9a, 0xc5, 0xce, 0x0b, 0xda, 0xdd, 0x79, 0xf5, 0xd5, 0x0c, 0x10, + 0x77, 0xe2, 0xa3, 0x55, 0x38, 0xd7, 0xe4, 0xe6, 0x06, 0xaf, 0x51, 0xcc, 0x6d, 0x0f, 0x95, 0xa3, + 0xf1, 0xc4, 0xc1, 0xfe, 0xf4, 0xb9, 0x95, 0x6e, 0x08, 0xb8, 0xfb, 0x73, 0xf6, 0xfb, 0x00, 0xf1, + 0x60, 0x95, 0xf9, 0x6e, 0x91, 0x07, 0x3d, 0x2d, 0x71, 0xfb, 0xeb, 0x25, 0x38, 0x95, 0x29, 0xa6, + 0x47, 0x4d, 0xbd, 0xce, 0x50, 0x87, 0x81, 0xf7, 0xef, 0xce, 0xee, 0xf5, 0x15, 0x3c, 0x11, 0x40, + 0xc9, 0x0b, 0x5a, 0xed, 0x24, 0x9f, 0x2c, 0x28, 0xde, 0x89, 0x25, 0x4a, 0xd0, 0x70, 0x12, 0xd1, + 0xbf, 0x98, 0xb3, 0xc9, 0x33, 0x14, 0x23, 0xa5, 0x8c, 0x0f, 0x3d, 0x24, 0x77, 0xc0, 0xa7, 0x75, + 0x60, 0x44, 0x29, 0x8f, 0x83, 0xfa, 0xcc, 0x64, 0x39, 0xe9, 0x03, 0xb6, 0xdf, 0x2e, 0xc0, 0xa8, + 0xf1, 0xd1, 0xd0, 0xaf, 0xa5, 0x8b, 0x8e, 0x58, 0xf9, 0xbd, 0x12, 0xa3, 0x3f, 0xa3, 0xcb, 0x8a, + 0xf0, 0x57, 0x7a, 0xb6, 0xb3, 0xde, 0xc8, 0xbd, 0xfd, 0xe9, 0xd3, 0x99, 0x8a, 0x22, 0xa9, 0x1a, + 0x24, 0xe7, 0x3f, 0x01, 0xa7, 0x32, 0x64, 0xba, 0xbc, 0xf2, 0x46, 0xfa, 0x2a, 0xd5, 0x01, 0xdd, + 0x52, 0xe6, 0x90, 0xbd, 0x45, 0x87, 0x4c, 0xdf, 0xb0, 0xdd, 0x87, 0x3b, 0x2e, 0x93, 0x80, 0x56, + 0xe8, 0x33, 0x01, 0xed, 0x39, 0x28, 0xb7, 0x42, 0xdf, 0x73, 0x3d, 0x55, 0x9e, 0x8a, 0x55, 0x87, + 0x5d, 0x13, 0x6d, 0x58, 0x41, 0xd1, 0x5d, 0xa8, 0xa8, 0x5b, 0x67, 0x45, 0x0e, 0x7d, 0x5e, 0xae, + 0x5e, 0xa5, 0xb4, 0xe8, 0xdb, 0x64, 0x35, 0x2f, 0x64, 0xc3, 0x30, 0xdb, 0x04, 0x65, 0x34, 0x2d, + 0xcb, 0x46, 0x64, 0xbb, 0x63, 0x8c, 0x05, 0xc4, 0xfe, 0xcc, 0x08, 0x9c, 0xed, 0x56, 0xd1, 0x14, + 0x7d, 0x1c, 0x86, 0x79, 0x1f, 0xf3, 0x29, 0x9a, 0xdd, 0x8d, 0xc7, 0x22, 0x23, 0x28, 0xba, 0xc5, + 0x7e, 0x63, 0xc1, 0x53, 0x70, 0xf7, 0x9d, 0x4d, 0x31, 0x43, 0x4e, 0x86, 0xfb, 0xb2, 0xa3, 0xb9, + 0x2f, 0x3b, 0x9c, 0xbb, 0xef, 0x6c, 0xa2, 0x5d, 0x28, 0x35, 0xbc, 0x84, 0x38, 0xc2, 0x89, 0x70, + 0xeb, 0x44, 0x98, 0x13, 0x87, 0x6b, 0x69, 0xec, 0x27, 0xe6, 0x0c, 0xd1, 0x37, 0x2c, 0x38, 0xb5, + 0x99, 0x4e, 0xee, 0x14, 0xc2, 0xd3, 0x39, 0x81, 0xaa, 0xb5, 0x69, 0x46, 0xfc, 0x42, 0x81, 0x4c, + 0x23, 0xce, 0x76, 0x07, 0xfd, 0x82, 0x05, 0x23, 0x75, 0xcf, 0x37, 0x4a, 0x17, 0x9e, 0xc0, 0xc7, + 0xb9, 0xcc, 0x18, 0x68, 0x8b, 0x83, 0xff, 0x8f, 0xb1, 0xe4, 0xdc, 0x6b, 0xa7, 0x1a, 0x1e, 0x74, + 0xa7, 0x1a, 0x79, 0x48, 0x6e, 0xa3, 0x5f, 0x29, 0xc0, 0x33, 0x7d, 0x7c, 0x23, 0x33, 0x1f, 0xcf, + 0x3a, 0x24, 0x1f, 0xef, 0x02, 0x0c, 0x45, 0xa4, 0x15, 0x66, 0x55, 0x5f, 0x16, 0xb4, 0xca, 0x20, + 0xe8, 0x29, 0x28, 0x3a, 0x2d, 0x4f, 0x68, 0xbe, 0x4a, 0x5f, 0x9f, 0x5b, 0x5b, 0xc2, 0xb4, 0x9d, + 0x7e, 0xe9, 0xca, 0xa6, 0x4c, 0x39, 0xce, 0xe7, 0x72, 0x8f, 0x5e, 0x19, 0xcc, 0xdc, 0x91, 0xa3, + 0xa0, 0x58, 0xf3, 0xb5, 0xff, 0x8a, 0x05, 0xe7, 0x7b, 0x4f, 0x11, 0xf4, 0x22, 0x8c, 0x6e, 0x46, + 0x4e, 0xe0, 0x6e, 0xb1, 0x9b, 0x70, 0xe4, 0xa0, 0xb0, 0x34, 0x2c, 0xdd, 0x8c, 0x4d, 0x1c, 0xaa, + 0xc4, 0xf2, 0x52, 0xc4, 0x06, 0x86, 0xcc, 0xba, 0xa0, 0x4a, 0xec, 0x46, 0x16, 0x88, 0x3b, 0xf1, + 0xed, 0x3f, 0x28, 0x74, 0xef, 0x16, 0x17, 0x25, 0x47, 0xf9, 0x4e, 0xe2, 0x2b, 0x14, 0x7a, 0x7c, + 0x85, 0x3b, 0x50, 0x4e, 0x58, 0x2a, 0x19, 0xa9, 0x0b, 0x79, 0x94, 0x5b, 0xaa, 0x36, 0xdb, 0xb1, + 0x36, 0x04, 0x71, 0xac, 0xd8, 0xd0, 0x8d, 0xc3, 0xd7, 0xb5, 0x13, 0xc5, 0xc6, 0x91, 0x39, 0x85, + 0x58, 0x80, 0xd3, 0x46, 0x89, 0x6b, 0x9e, 0x49, 0xc3, 0x83, 0x69, 0x54, 0x7a, 0xe9, 0x5a, 0x06, + 0x8e, 0x3b, 0x9e, 0xb0, 0x7f, 0xbd, 0x00, 0x4f, 0xf4, 0x94, 0x8f, 0x3a, 0xe2, 0xc7, 0xba, 0x4f, + 0xc4, 0xcf, 0xc0, 0xd3, 0xdc, 0x1c, 0xe0, 0xa1, 0x07, 0x33, 0xc0, 0xcf, 0x43, 0xd9, 0x0b, 0x62, + 0xe2, 0xb6, 0x23, 0x3e, 0x68, 0x46, 0x5c, 0xf9, 0x92, 0x68, 0xc7, 0x0a, 0xc3, 0xfe, 0xa3, 0xde, + 0x53, 0x8d, 0xee, 0x95, 0x3f, 0xb4, 0xa3, 0xf4, 0x0a, 0x8c, 0x3b, 0xad, 0x16, 0xc7, 0x63, 0xd1, + 0x15, 0x99, 0x84, 0xf1, 0x39, 0x13, 0x88, 0xd3, 0xb8, 0xc6, 0x1c, 0x1e, 0xee, 0x35, 0x87, 0xed, + 0x3f, 0xb5, 0xa0, 0x82, 0x49, 0x9d, 0xaf, 0x77, 0x74, 0x5b, 0x0c, 0x91, 0x95, 0x47, 0x25, 0x27, + 0x3a, 0xb0, 0xb1, 0xc7, 0x2a, 0x1c, 0x75, 0x1b, 0xec, 0xce, 0xda, 0xe9, 0x85, 0x23, 0xd5, 0x4e, + 0x57, 0xd5, 0xb3, 0x8b, 0xbd, 0xab, 0x67, 0xdb, 0x6f, 0x8d, 0xd0, 0xd7, 0x6b, 0x85, 0xf3, 0x11, + 0xa9, 0xc5, 0xf4, 0xfb, 0xb6, 0x23, 0x3f, 0x7b, 0x31, 0xf8, 0x0d, 0xbc, 0x8c, 0x69, 0x7b, 0xca, + 0x85, 0x5a, 0x38, 0x52, 0xba, 0x6c, 0xf1, 0xd0, 0x74, 0xd9, 0x57, 0x60, 0x3c, 0x8e, 0xb7, 0xd6, + 0x22, 0x6f, 0xc7, 0x49, 0xc8, 0x35, 0xb2, 0x27, 0x82, 0xf3, 0x74, 0x8a, 0xdb, 0xfa, 0x15, 0x0d, + 0xc4, 0x69, 0x5c, 0xb4, 0x08, 0x93, 0x3a, 0x69, 0x95, 0x44, 0x09, 0x8b, 0xc5, 0xe3, 0x33, 0x41, + 0x65, 0x98, 0xe9, 0x34, 0x57, 0x81, 0x80, 0x3b, 0x9f, 0xa1, 0x12, 0x2b, 0xd5, 0x48, 0x3b, 0x32, + 0x9c, 0x96, 0x58, 0x29, 0x3a, 0xb4, 0x2f, 0x1d, 0x4f, 0xa0, 0x15, 0x38, 0xc3, 0x27, 0xc6, 0x5c, + 0xab, 0x65, 0xbc, 0xd1, 0x48, 0xba, 0x82, 0xce, 0x62, 0x27, 0x0a, 0xee, 0xf6, 0x1c, 0xb5, 0x3e, + 0x54, 0xf3, 0xd2, 0x82, 0xf0, 0xfe, 0x29, 0xeb, 0x43, 0x91, 0x59, 0xaa, 0x61, 0x13, 0x0f, 0x7d, + 0x08, 0x1e, 0xd7, 0x7f, 0x79, 0xc0, 0x36, 0x77, 0x89, 0x2f, 0x88, 0x7a, 0x00, 0xaa, 0x8c, 0xf2, + 0x62, 0x57, 0xb4, 0x1a, 0xee, 0xf5, 0x3c, 0xda, 0x84, 0xf3, 0x0a, 0x74, 0x29, 0x48, 0x58, 0xf4, + 0x65, 0x4c, 0xaa, 0x4e, 0x4c, 0x6e, 0x44, 0x3e, 0xab, 0x20, 0x50, 0xd1, 0xf7, 0xdc, 0x2c, 0x7a, + 0xc9, 0x95, 0x6e, 0x98, 0x78, 0x19, 0xdf, 0x87, 0x0a, 0x9a, 0x85, 0x0a, 0x09, 0x9c, 0x4d, 0x9f, + 0xac, 0xce, 0x2f, 0xb1, 0xba, 0x02, 0x86, 0x07, 0xfe, 0x92, 0x04, 0x60, 0x8d, 0xa3, 0xe2, 0x41, + 0xc6, 0x7a, 0xde, 0x8b, 0xb4, 0x06, 0x67, 0x1b, 0x6e, 0x8b, 0x6a, 0x13, 0x9e, 0x4b, 0xe6, 0x5c, + 0x16, 0x13, 0x41, 0x3f, 0x0c, 0x2f, 0x6d, 0xa4, 0x82, 0x9d, 0x16, 0xe7, 0xd7, 0x3a, 0x70, 0x70, + 0xd7, 0x27, 0xe9, 0x1a, 0x6b, 0x45, 0xe1, 0xee, 0xde, 0xd4, 0x99, 0xf4, 0x1a, 0x5b, 0xa3, 0x8d, + 0x98, 0xc3, 0xd0, 0x55, 0x40, 0x2c, 0x72, 0xee, 0x4a, 0x92, 0xb4, 0x94, 0xfa, 0x32, 0x75, 0x96, + 0xbd, 0xd2, 0x79, 0xf1, 0x04, 0xba, 0xdc, 0x81, 0x81, 0xbb, 0x3c, 0x65, 0xff, 0x89, 0x05, 0xe3, + 0x6a, 0xbd, 0x3e, 0x80, 0xd8, 0x51, 0x3f, 0x1d, 0x3b, 0xba, 0x38, 0xb8, 0xc4, 0x63, 0x3d, 0xef, + 0x11, 0x80, 0xf4, 0x99, 0x51, 0x00, 0x2d, 0x15, 0xd5, 0x86, 0x64, 0xf5, 0xdc, 0x90, 0x1e, 0x59, + 0x89, 0xd4, 0x2d, 0x89, 0xb8, 0xf4, 0x70, 0x93, 0x88, 0xd7, 0xe1, 0x9c, 0x54, 0x17, 0xb8, 0x8f, + 0xf7, 0x4a, 0x18, 0x2b, 0x01, 0x57, 0xae, 0x3e, 0x25, 0x08, 0x9d, 0x5b, 0xea, 0x86, 0x84, 0xbb, + 0x3f, 0x9b, 0xd2, 0x52, 0x46, 0x0e, 0xd3, 0x52, 0xf4, 0x9a, 0x5e, 0xae, 0xcb, 0xa2, 0xcc, 0x99, + 0x35, 0xbd, 0x7c, 0x79, 0x1d, 0x6b, 0x9c, 0xee, 0x82, 0xbd, 0x92, 0x93, 0x60, 0x87, 0x23, 0x0b, + 0x76, 0x29, 0x62, 0x46, 0x7b, 0x8a, 0x18, 0xe9, 0x4b, 0x1a, 0xeb, 0xe9, 0x4b, 0x7a, 0x3f, 0x4c, + 0x78, 0xc1, 0x16, 0x89, 0xbc, 0x84, 0xd4, 0xd8, 0x5a, 0x60, 0xe2, 0xa7, 0xac, 0xb7, 0xf5, 0xa5, + 0x14, 0x14, 0x67, 0xb0, 0xd3, 0x72, 0x71, 0xa2, 0x0f, 0xb9, 0xd8, 0x63, 0x37, 0x3a, 0x95, 0xcf, + 0x6e, 0x74, 0x7a, 0xf0, 0xdd, 0x68, 0xf2, 0x44, 0x77, 0x23, 0x94, 0xcb, 0x6e, 0xd4, 0x97, 0xa0, + 0x37, 0x0c, 0xba, 0xb3, 0x87, 0x18, 0x74, 0xbd, 0xb6, 0xa2, 0x73, 0xc7, 0xde, 0x8a, 0xba, 0xef, + 0x32, 0x8f, 0x1d, 0x6b, 0x97, 0xf9, 0x6c, 0x01, 0xce, 0x69, 0x39, 0x4c, 0x67, 0xbf, 0x57, 0xa7, + 0x92, 0x88, 0xd5, 0xf5, 0xe7, 0xfe, 0x56, 0x23, 0x94, 0x59, 0x47, 0x45, 0x2b, 0x08, 0x36, 0xb0, + 0x58, 0x44, 0x30, 0x89, 0x58, 0x01, 0xb7, 0xac, 0x90, 0x9e, 0x17, 0xed, 0x58, 0x61, 0xd0, 0xf9, + 0x45, 0x7f, 0x8b, 0x2c, 0x8b, 0x6c, 0xdd, 0x94, 0x79, 0x0d, 0xc2, 0x26, 0x1e, 0x7a, 0x8e, 0x33, + 0x61, 0x02, 0x82, 0x0a, 0xea, 0x31, 0x71, 0x13, 0x97, 0x94, 0x09, 0x0a, 0x2a, 0xbb, 0xc3, 0x42, + 0xbf, 0x4b, 0x9d, 0xdd, 0x61, 0xa1, 0x0b, 0x0a, 0xc3, 0xfe, 0x9f, 0x16, 0x3c, 0xd1, 0x75, 0x28, + 0x1e, 0xc0, 0xe6, 0xbb, 0x9b, 0xde, 0x7c, 0xd7, 0xf3, 0x32, 0x37, 0x8c, 0xb7, 0xe8, 0xb1, 0x11, + 0xff, 0x5b, 0x0b, 0x26, 0x34, 0xfe, 0x03, 0x78, 0x55, 0x2f, 0xfd, 0xaa, 0xf9, 0x59, 0x56, 0x95, + 0x8e, 0x77, 0xfb, 0x13, 0xf6, 0x6e, 0xfc, 0x50, 0x74, 0xce, 0x95, 0x95, 0xe2, 0x0e, 0x39, 0x01, + 0xd8, 0x83, 0x61, 0x76, 0x80, 0x11, 0xe7, 0x73, 0x38, 0x9b, 0xe6, 0xcf, 0x0e, 0x43, 0xf4, 0xe1, + 0x10, 0xfb, 0x1b, 0x63, 0xc1, 0x90, 0x95, 0x17, 0xf4, 0x62, 0x2a, 0xcd, 0x6b, 0x22, 0x88, 0x5a, + 0x97, 0x17, 0x14, 0xed, 0x58, 0x61, 0xd8, 0x4d, 0x98, 0x4a, 0x13, 0x5f, 0x20, 0x75, 0x16, 0xf0, + 0xd3, 0xd7, 0x6b, 0xce, 0x42, 0xc5, 0x61, 0x4f, 0x2d, 0xb7, 0x9d, 0xec, 0xe5, 0x8d, 0x73, 0x12, + 0x80, 0x35, 0x8e, 0xfd, 0x5b, 0x16, 0x9c, 0xe9, 0xf2, 0x32, 0x39, 0x06, 0x8f, 0x27, 0x5a, 0x0a, + 0x74, 0xdb, 0x70, 0xdf, 0x05, 0x23, 0x35, 0x52, 0x77, 0x64, 0x48, 0x89, 0x21, 0x73, 0x17, 0x78, + 0x33, 0x96, 0x70, 0xfb, 0xbf, 0x59, 0x70, 0x2a, 0xdd, 0xd7, 0x98, 0x4a, 0x4d, 0xfe, 0x32, 0x0b, + 0x5e, 0xec, 0x86, 0x3b, 0x24, 0xda, 0xa3, 0x6f, 0xce, 0x7b, 0xad, 0xa4, 0xe6, 0x5c, 0x07, 0x06, + 0xee, 0xf2, 0x14, 0xab, 0x30, 0x56, 0x53, 0xa3, 0x2d, 0x67, 0xca, 0xcd, 0x3c, 0x67, 0x8a, 0xfe, + 0x98, 0xe6, 0xf1, 0x93, 0x62, 0x89, 0x4d, 0xfe, 0xf6, 0xf7, 0x86, 0x40, 0x65, 0x97, 0xb0, 0xf3, + 0xfc, 0x9c, 0xa2, 0x21, 0x52, 0xf7, 0x61, 0x14, 0xfb, 0xb8, 0x0f, 0x43, 0x4e, 0x86, 0xa1, 0xfb, + 0x1d, 0xb0, 0x71, 0xef, 0x85, 0xe9, 0x24, 0x54, 0x6f, 0xb8, 0xa1, 0x41, 0xd8, 0xc4, 0xa3, 0x3d, + 0xf1, 0xbd, 0x1d, 0xc2, 0x1f, 0x1a, 0x4e, 0xf7, 0x64, 0x59, 0x02, 0xb0, 0xc6, 0xa1, 0x3d, 0xa9, + 0x79, 0xf5, 0xba, 0x30, 0xc5, 0x55, 0x4f, 0xe8, 0xe8, 0x60, 0x06, 0xe1, 0x45, 0x23, 0xc3, 0x6d, + 0xa1, 0x9d, 0x1a, 0x45, 0x23, 0xc3, 0x6d, 0xcc, 0x20, 0x54, 0x9f, 0x0a, 0xc2, 0xa8, 0xc9, 0x2e, + 0xd7, 0xac, 0x29, 0x2e, 0x42, 0x2b, 0x55, 0xfa, 0xd4, 0xf5, 0x4e, 0x14, 0xdc, 0xed, 0x39, 0x3a, + 0x03, 0x5b, 0x11, 0xa9, 0x79, 0x6e, 0x62, 0x52, 0x83, 0xf4, 0x0c, 0x5c, 0xeb, 0xc0, 0xc0, 0x5d, + 0x9e, 0x42, 0x73, 0x70, 0x4a, 0x66, 0x07, 0xc9, 0xdc, 0xef, 0xd1, 0x74, 0xae, 0x29, 0x4e, 0x83, + 0x71, 0x16, 0x9f, 0x4a, 0x9b, 0xa6, 0x28, 0xfb, 0xc0, 0x94, 0x58, 0x43, 0xda, 0xc8, 0x72, 0x10, + 0x58, 0x61, 0xd8, 0x9f, 0x2e, 0xd2, 0xdd, 0xb1, 0x47, 0xa9, 0xfb, 0x07, 0x16, 0x7d, 0x93, 0x9e, + 0x91, 0x43, 0x7d, 0xcc, 0xc8, 0x97, 0x60, 0xec, 0x76, 0x1c, 0x06, 0x2a, 0xb2, 0xa5, 0xd4, 0x33, + 0xb2, 0xc5, 0xc0, 0xea, 0x1e, 0xd9, 0x32, 0x9c, 0x57, 0x64, 0xcb, 0xc8, 0x31, 0x23, 0x5b, 0xbe, + 0x5d, 0x02, 0x55, 0x2c, 0xfa, 0x3a, 0x49, 0xee, 0x86, 0xd1, 0xb6, 0x17, 0x34, 0x58, 0x56, 0xd5, + 0x37, 0x2c, 0x18, 0xe3, 0xeb, 0x65, 0xd9, 0xcc, 0x4c, 0xa8, 0xe7, 0x54, 0x85, 0x38, 0xc5, 0x6c, + 0x66, 0xc3, 0x60, 0x94, 0xb9, 0xe3, 0xc8, 0x04, 0xe1, 0x54, 0x8f, 0xd0, 0x27, 0x00, 0xa4, 0xdf, + 0xb2, 0x2e, 0x45, 0xe6, 0x52, 0x3e, 0xfd, 0xc3, 0xa4, 0xae, 0x75, 0xd3, 0x0d, 0xc5, 0x04, 0x1b, + 0x0c, 0xd1, 0x67, 0xb3, 0x97, 0x0f, 0x7f, 0xec, 0x44, 0xc6, 0xa6, 0x9f, 0x9c, 0x0d, 0x0c, 0x23, + 0x5e, 0xd0, 0xa0, 0xf3, 0x44, 0x44, 0x00, 0xfc, 0x58, 0xb7, 0x8c, 0xc4, 0xe5, 0xd0, 0xa9, 0x55, + 0x1d, 0xdf, 0x09, 0x5c, 0x12, 0x2d, 0x71, 0x74, 0xf3, 0x66, 0x3f, 0xd6, 0x80, 0x25, 0xa1, 0x8e, + 0x32, 0xdb, 0xa5, 0x7e, 0xca, 0x6c, 0x9f, 0xff, 0x00, 0x4c, 0x76, 0x7c, 0xcc, 0x23, 0xa5, 0x68, + 0x1c, 0x3f, 0xbb, 0xc3, 0xfe, 0xa7, 0xc3, 0x7a, 0xd3, 0xba, 0x1e, 0xd6, 0x78, 0xb1, 0xe7, 0x48, + 0x7f, 0x51, 0xa1, 0x7b, 0xe6, 0x38, 0x45, 0x8c, 0xdb, 0x01, 0x55, 0x23, 0x36, 0x59, 0xd2, 0x39, + 0xda, 0x72, 0x22, 0x12, 0x9c, 0xf4, 0x1c, 0x5d, 0x53, 0x4c, 0xb0, 0xc1, 0x10, 0x6d, 0xa5, 0x62, + 0xb4, 0x2f, 0x0f, 0x1e, 0xa3, 0xcd, 0x6a, 0x35, 0x74, 0x2b, 0x18, 0xfb, 0x25, 0x0b, 0x26, 0x82, + 0xd4, 0xcc, 0xcd, 0x27, 0x2c, 0xab, 0xfb, 0xaa, 0xe0, 0x77, 0x0d, 0xa4, 0xdb, 0x70, 0x86, 0x7f, + 0xb7, 0x2d, 0xad, 0x74, 0xc4, 0x2d, 0x4d, 0x57, 0x8d, 0x1f, 0xee, 0x55, 0x35, 0x1e, 0x05, 0xea, + 0xda, 0x8c, 0x91, 0xdc, 0xaf, 0xcd, 0x80, 0x2e, 0x57, 0x66, 0xdc, 0x82, 0x8a, 0x1b, 0x11, 0x27, + 0x39, 0xe6, 0x0d, 0x0a, 0xec, 0x28, 0x7c, 0x5e, 0x12, 0xc0, 0x9a, 0x96, 0xfd, 0x6f, 0x8a, 0x70, + 0x5a, 0x8e, 0x88, 0x0c, 0xe9, 0xa4, 0xfb, 0x23, 0xe7, 0xab, 0x95, 0x5b, 0xb5, 0x3f, 0x5e, 0x91, + 0x00, 0xac, 0x71, 0xa8, 0x3e, 0xd6, 0x8e, 0xc9, 0x6a, 0x8b, 0x04, 0xcb, 0xde, 0x66, 0x2c, 0xce, + 0x1f, 0xd5, 0x42, 0xb9, 0xa1, 0x41, 0xd8, 0xc4, 0xa3, 0xca, 0x38, 0xd7, 0x8b, 0xe3, 0x6c, 0x38, + 0xb8, 0xd0, 0xb7, 0xb1, 0x84, 0xa3, 0xaf, 0x75, 0xbd, 0x7b, 0x27, 0x9f, 0x44, 0x88, 0x8e, 0x48, + 0xd6, 0x23, 0x5e, 0xba, 0xf3, 0xa6, 0x05, 0xa7, 0xb6, 0x53, 0x19, 0xa9, 0x52, 0x24, 0x0f, 0x58, + 0x3b, 0x21, 0x9d, 0xe6, 0xaa, 0xa7, 0x70, 0xba, 0x3d, 0xc6, 0x59, 0xee, 0xf6, 0x7f, 0xb7, 0xc0, + 0x14, 0x4f, 0xfd, 0x69, 0x56, 0xc6, 0xf5, 0x81, 0x85, 0x43, 0xae, 0x0f, 0x94, 0x4a, 0x58, 0xb1, + 0x3f, 0xa5, 0x7f, 0xe8, 0x08, 0x4a, 0x7f, 0xa9, 0xa7, 0xd6, 0xf6, 0x14, 0x14, 0xdb, 0x5e, 0x4d, + 0xe8, 0xed, 0xfa, 0xb4, 0x71, 0x69, 0x01, 0xd3, 0x76, 0xfb, 0x1f, 0x95, 0xb4, 0x9d, 0x2e, 0xe2, + 0xf7, 0x7f, 0x28, 0x5e, 0xbb, 0xae, 0x4a, 0x61, 0xf0, 0x37, 0xbf, 0xde, 0x51, 0x0a, 0xe3, 0x27, + 0x8f, 0x9e, 0x9e, 0xc1, 0x07, 0xa8, 0x57, 0x25, 0x8c, 0x91, 0x43, 0x72, 0x33, 0x6e, 0x43, 0x99, + 0x9a, 0x36, 0xcc, 0xe1, 0x56, 0x4e, 0x75, 0xaa, 0x7c, 0x45, 0xb4, 0xdf, 0xdb, 0x9f, 0xfe, 0x89, + 0xa3, 0x77, 0x4b, 0x3e, 0x8d, 0x15, 0x7d, 0x14, 0x43, 0x85, 0xfe, 0x66, 0x69, 0x24, 0xc2, 0x68, + 0xba, 0xa1, 0x64, 0x91, 0x04, 0xe4, 0x92, 0xa3, 0xa2, 0xf9, 0xa0, 0x00, 0x2a, 0xec, 0xde, 0x2f, + 0xc6, 0x94, 0xdb, 0x56, 0x6b, 0x2a, 0x99, 0x43, 0x02, 0xee, 0xed, 0x4f, 0xbf, 0x72, 0x74, 0xa6, + 0xea, 0x71, 0xac, 0x59, 0xd8, 0x5f, 0x1e, 0xd2, 0x73, 0x57, 0x54, 0x40, 0xf9, 0xa1, 0x98, 0xbb, + 0x2f, 0x67, 0xe6, 0xee, 0x85, 0x8e, 0xb9, 0x3b, 0xa1, 0xef, 0xa7, 0x4a, 0xcd, 0xc6, 0x07, 0xbd, + 0xc1, 0x1e, 0x6e, 0xc7, 0x33, 0xcd, 0xe2, 0x4e, 0xdb, 0x8b, 0x48, 0xbc, 0x16, 0xb5, 0x03, 0x2f, + 0x68, 0x88, 0x2b, 0x81, 0x0d, 0xcd, 0x22, 0x05, 0xc6, 0x59, 0x7c, 0x76, 0x9d, 0xf0, 0x5e, 0xe0, + 0xde, 0x72, 0x76, 0xf8, 0xac, 0x32, 0x8a, 0x42, 0xac, 0x8b, 0x76, 0xac, 0x30, 0xec, 0xb7, 0xd8, + 0xd9, 0xad, 0x91, 0xbf, 0x46, 0xe7, 0x84, 0xcf, 0x2e, 0x5a, 0xe3, 0x15, 0x25, 0xd4, 0x9c, 0xe0, + 0xb7, 0xab, 0x71, 0x18, 0xba, 0x0b, 0x23, 0x9b, 0xfc, 0xa6, 0x91, 0x7c, 0xaa, 0x67, 0x8a, 0x6b, + 0x4b, 0x58, 0x81, 0x6b, 0x79, 0x87, 0xc9, 0x3d, 0xfd, 0x13, 0x4b, 0x6e, 0xf6, 0xb7, 0x86, 0xe0, + 0x54, 0xe6, 0x2a, 0xae, 0x54, 0x2d, 0xaf, 0xc2, 0xa1, 0xb5, 0xbc, 0x3e, 0x0a, 0x50, 0x23, 0x2d, + 0x3f, 0xdc, 0x63, 0x6a, 0xce, 0xd0, 0x91, 0xd5, 0x1c, 0xa5, 0x19, 0x2f, 0x28, 0x2a, 0xd8, 0xa0, + 0x28, 0xca, 0x68, 0xf0, 0xd2, 0x60, 0x99, 0x32, 0x1a, 0x46, 0x01, 0xdb, 0xe1, 0x07, 0x5b, 0xc0, + 0xd6, 0x83, 0x53, 0xbc, 0x8b, 0x2a, 0x4b, 0xec, 0x18, 0xc9, 0x60, 0x2c, 0xce, 0x76, 0x21, 0x4d, + 0x06, 0x67, 0xe9, 0x3e, 0xcc, 0x9b, 0xf6, 0xd0, 0xbb, 0xa1, 0x22, 0xbf, 0x73, 0x3c, 0x55, 0xd1, + 0x99, 0xb6, 0x72, 0x1a, 0xb0, 0x1b, 0xf0, 0xc4, 0x4f, 0xfb, 0x8b, 0x05, 0xaa, 0x95, 0xf2, 0x7f, + 0xaa, 0x62, 0xc2, 0xb3, 0x30, 0xec, 0xb4, 0x93, 0xad, 0xb0, 0xe3, 0xfa, 0x94, 0x39, 0xd6, 0x8a, + 0x05, 0x14, 0x2d, 0xc3, 0x50, 0x4d, 0x67, 0xc1, 0x1f, 0x65, 0x14, 0xb5, 0x83, 0xcf, 0x49, 0x08, + 0x66, 0x54, 0xd0, 0x93, 0x30, 0x94, 0x38, 0x8d, 0xd4, 0xb5, 0xd6, 0x1b, 0x4e, 0x23, 0xc6, 0xac, + 0xd5, 0xdc, 0x34, 0x87, 0x0e, 0xd9, 0x34, 0x5f, 0x81, 0xf1, 0xd8, 0x6b, 0x04, 0x4e, 0xd2, 0x8e, + 0x88, 0x71, 0x98, 0xa4, 0xe3, 0x03, 0x4c, 0x20, 0x4e, 0xe3, 0xda, 0xbf, 0x37, 0x06, 0x67, 0xd7, + 0xe7, 0x57, 0x64, 0x45, 0xc7, 0x13, 0x8b, 0xa9, 0xef, 0xc6, 0xe3, 0xc1, 0xc5, 0xd4, 0xf7, 0xe0, + 0xee, 0x1b, 0x31, 0xf5, 0xbe, 0x11, 0x53, 0xff, 0x59, 0x0b, 0x2a, 0x2a, 0x94, 0x5c, 0x04, 0xb2, + 0x7e, 0x24, 0xff, 0x1e, 0xa8, 0xb8, 0x62, 0x11, 0x51, 0x2c, 0xff, 0x62, 0xcd, 0xfc, 0xe4, 0x82, + 0xec, 0xef, 0xdb, 0xa1, 0x23, 0x05, 0xd9, 0xab, 0x0c, 0x84, 0x52, 0x1e, 0x19, 0x08, 0x3d, 0x3e, + 0x55, 0xd7, 0x0c, 0x84, 0x2f, 0x59, 0x30, 0xea, 0xbc, 0xd1, 0x8e, 0xc8, 0x02, 0xd9, 0x59, 0x6d, + 0xc5, 0x42, 0xc0, 0xbe, 0x96, 0x7f, 0x07, 0xe6, 0x34, 0x13, 0x51, 0xe7, 0x5d, 0x37, 0x60, 0xb3, + 0x0b, 0xa9, 0x8c, 0x83, 0x91, 0x3c, 0x32, 0x0e, 0xba, 0x75, 0xe7, 0xd0, 0x8c, 0x83, 0x57, 0x60, + 0xdc, 0xf5, 0xc3, 0x80, 0xac, 0x45, 0x61, 0x12, 0xba, 0xa1, 0x2f, 0x94, 0x69, 0x25, 0x12, 0xe6, + 0x4d, 0x20, 0x4e, 0xe3, 0xf6, 0x4a, 0x57, 0xa8, 0x0c, 0x9a, 0xae, 0x00, 0x0f, 0x29, 0xb1, 0xee, + 0x97, 0x74, 0x62, 0xdd, 0x68, 0x1e, 0x57, 0x5f, 0x77, 0xfb, 0x22, 0xfd, 0x64, 0xd7, 0xa1, 0xaf, + 0xf2, 0xfb, 0x4b, 0xa8, 0x3a, 0x3a, 0x1f, 0x36, 0xa9, 0xba, 0x35, 0xc6, 0x86, 0xe4, 0xf5, 0x13, + 0x98, 0xb0, 0xb7, 0xd6, 0x35, 0x1b, 0x75, 0xa7, 0x89, 0x6e, 0xc2, 0xe9, 0x8e, 0x0c, 0x92, 0xf8, + 0xf7, 0xf5, 0x02, 0xfc, 0xc8, 0xa1, 0x5d, 0x40, 0x77, 0x01, 0x12, 0xa7, 0x21, 0x26, 0xaa, 0x70, + 0xff, 0x0f, 0x18, 0xc4, 0xb7, 0x21, 0xe9, 0xf1, 0x8c, 0x75, 0xf5, 0x97, 0x39, 0xd6, 0xe5, 0x6f, + 0x16, 0xbb, 0x17, 0xfa, 0x1d, 0xd5, 0xb9, 0x70, 0xe8, 0x13, 0xcc, 0x20, 0x74, 0xfb, 0x8f, 0x48, + 0x43, 0xdf, 0x6f, 0xa7, 0x3e, 0x1f, 0x66, 0xad, 0x58, 0x40, 0xd1, 0x7b, 0x61, 0xd4, 0xf1, 0x7d, + 0x9e, 0x57, 0x41, 0x62, 0x51, 0x63, 0x5d, 0x57, 0x18, 0xd2, 0x20, 0x6c, 0xe2, 0xd9, 0x7f, 0x56, + 0x80, 0xe9, 0x43, 0x64, 0x0a, 0x7a, 0x19, 0xc6, 0xc2, 0xa8, 0xe1, 0x04, 0xde, 0x1b, 0xbc, 0x48, + 0x43, 0x29, 0x5d, 0x0a, 0x6a, 0xd5, 0x80, 0xe1, 0x14, 0xa6, 0x8c, 0x84, 0x1f, 0xee, 0x11, 0x09, + 0xff, 0x5e, 0x18, 0x4d, 0x88, 0xd3, 0x14, 0x61, 0x3f, 0xc2, 0xfe, 0xd6, 0xe7, 0x99, 0x1a, 0x84, + 0x4d, 0x3c, 0x2a, 0xc5, 0x26, 0x1c, 0xd7, 0x25, 0x71, 0x2c, 0x43, 0xdd, 0x85, 0x6f, 0x30, 0xb7, + 0x38, 0x7a, 0xe6, 0x72, 0x9d, 0x4b, 0xb1, 0xc0, 0x19, 0x96, 0xd9, 0x01, 0xaf, 0xf4, 0x39, 0xe0, + 0xbf, 0x51, 0x80, 0xa7, 0xee, 0xbb, 0xbb, 0xf5, 0x9d, 0x85, 0xd0, 0x8e, 0x49, 0x94, 0x9d, 0x38, + 0x37, 0x62, 0x12, 0x61, 0x06, 0xe1, 0xa3, 0xd4, 0x6a, 0x19, 0xf7, 0x07, 0xe6, 0x9d, 0xf4, 0xc2, + 0x47, 0x29, 0xc5, 0x02, 0x67, 0x58, 0x1e, 0x77, 0x5a, 0xfe, 0xdd, 0x02, 0x3c, 0xd3, 0x87, 0x0e, + 0x90, 0x63, 0x72, 0x50, 0x3a, 0x45, 0xab, 0xf8, 0x70, 0x52, 0xb4, 0x8e, 0x3b, 0x5c, 0x6f, 0x15, + 0xe0, 0x7c, 0xef, 0xad, 0x18, 0xfd, 0x14, 0xb5, 0xe1, 0x65, 0xac, 0x8f, 0x99, 0xdd, 0x75, 0x86, + 0xdb, 0xef, 0x29, 0x10, 0xce, 0xe2, 0xa2, 0x19, 0x80, 0x96, 0x93, 0x6c, 0xc5, 0x97, 0x76, 0xbd, + 0x38, 0x11, 0x35, 0x0a, 0x26, 0xf8, 0x49, 0x8c, 0x6c, 0xc5, 0x06, 0x06, 0x65, 0xc7, 0xfe, 0x2d, + 0x84, 0xd7, 0xc3, 0x84, 0x3f, 0xc4, 0xcd, 0x88, 0x33, 0xb2, 0x8e, 0xb3, 0x01, 0xc2, 0x59, 0x5c, + 0xca, 0x8e, 0x9d, 0xf5, 0xf1, 0x8e, 0x72, 0xfb, 0x82, 0xb1, 0x5b, 0x56, 0xad, 0xd8, 0xc0, 0xc8, + 0xe6, 0xad, 0x95, 0x0e, 0xcf, 0x5b, 0xb3, 0xff, 0x61, 0x01, 0x9e, 0xe8, 0xa9, 0xca, 0xf5, 0xb7, + 0x00, 0x1f, 0xbd, 0x5c, 0xb3, 0xe3, 0xcd, 0x9d, 0x23, 0x66, 0x50, 0xfd, 0x69, 0x8f, 0x99, 0x26, + 0x32, 0xa8, 0xb2, 0x5b, 0x85, 0x75, 0xd4, 0xad, 0xe2, 0x11, 0x1a, 0xcf, 0x8e, 0xa4, 0xa9, 0xa1, + 0x23, 0x24, 0x4d, 0x65, 0x3e, 0x46, 0xa9, 0xcf, 0x85, 0xfc, 0x9d, 0xde, 0xc3, 0x4b, 0x4d, 0xbf, + 0xbe, 0xbc, 0xa3, 0x0b, 0x70, 0xda, 0x0b, 0x58, 0x4d, 0xff, 0xf5, 0xf6, 0xa6, 0x48, 0x5b, 0x2f, + 0xa4, 0xaf, 0xab, 0x5c, 0xca, 0xc0, 0x71, 0xc7, 0x13, 0x8f, 0x60, 0x12, 0xdb, 0x31, 0x87, 0xf4, + 0xa3, 0x50, 0x51, 0xb4, 0x79, 0x60, 0xae, 0xfa, 0xa0, 0x1d, 0x81, 0xb9, 0xea, 0x6b, 0x1a, 0x58, + 0x74, 0x24, 0xa8, 0xba, 0x99, 0x99, 0x99, 0xd7, 0xc8, 0x1e, 0xd3, 0x3d, 0xed, 0xf7, 0xc0, 0x98, + 0xf2, 0x61, 0xf4, 0x5b, 0xb8, 0xdd, 0xfe, 0xf2, 0x30, 0x8c, 0xa7, 0xca, 0x32, 0xa5, 0x5c, 0x86, + 0xd6, 0xa1, 0x2e, 0x43, 0x16, 0x68, 0xdd, 0x0e, 0xe4, 0xad, 0x0e, 0x46, 0xa0, 0x75, 0x3b, 0x20, + 0x98, 0xc3, 0xa8, 0xea, 0x58, 0x8b, 0xf6, 0x70, 0x3b, 0x10, 0x01, 0x91, 0x4a, 0x75, 0x5c, 0x60, + 0xad, 0x58, 0x40, 0xd1, 0xa7, 0x2c, 0x18, 0x8b, 0x99, 0x3f, 0x9a, 0x3b, 0x5c, 0xc5, 0x07, 0xbd, + 0x3a, 0x78, 0xd5, 0x29, 0x55, 0x82, 0x8c, 0xc5, 0x52, 0x98, 0x2d, 0x38, 0xc5, 0x11, 0xfd, 0xa2, + 0x05, 0x15, 0x55, 0x7c, 0x5a, 0x5c, 0xbd, 0xb2, 0x9e, 0x6f, 0xd5, 0x2b, 0xee, 0xa9, 0x53, 0xae, + 0x7d, 0x7d, 0x55, 0xab, 0x66, 0x8c, 0x62, 0xe5, 0x0d, 0x1d, 0x39, 0x19, 0x6f, 0x28, 0x74, 0xf1, + 0x84, 0xbe, 0x1b, 0x2a, 0x4d, 0x27, 0xf0, 0xea, 0x24, 0x4e, 0xb8, 0x83, 0x52, 0x16, 0xe3, 0x93, + 0x8d, 0x58, 0xc3, 0xe9, 0x66, 0x17, 0xb3, 0x17, 0x4b, 0x0c, 0x8f, 0x22, 0xdb, 0xec, 0xd6, 0x75, + 0x33, 0x36, 0x71, 0x4c, 0xf7, 0x27, 0x3c, 0x54, 0xf7, 0xe7, 0xe8, 0x21, 0xee, 0xcf, 0xbf, 0x6f, + 0xc1, 0xb9, 0xae, 0x5f, 0xed, 0xd1, 0x0d, 0x91, 0xb3, 0xbf, 0x52, 0x82, 0x33, 0x5d, 0xea, 0xab, + 0xa1, 0x3d, 0x73, 0x3e, 0x5b, 0x79, 0x9c, 0x8a, 0xa7, 0x0f, 0x79, 0xe5, 0x30, 0x76, 0x99, 0xc4, + 0x47, 0x3b, 0x7c, 0xd0, 0x07, 0x00, 0xc5, 0x07, 0x7b, 0x00, 0x60, 0x4c, 0xcb, 0xa1, 0x87, 0x3a, + 0x2d, 0x4b, 0xf7, 0x9f, 0x96, 0xe8, 0xb7, 0x2d, 0x98, 0x6a, 0xf6, 0x28, 0xea, 0x2b, 0x9c, 0x7a, + 0x37, 0x4f, 0xa6, 0x64, 0x70, 0xf5, 0xc9, 0x83, 0xfd, 0xe9, 0x9e, 0xb5, 0x94, 0x71, 0xcf, 0x5e, + 0xd9, 0xdf, 0x2b, 0x02, 0x2b, 0xee, 0xc7, 0x6a, 0xe8, 0xec, 0xa1, 0x4f, 0x9a, 0x65, 0x1a, 0xad, + 0xbc, 0x4a, 0x0a, 0x72, 0xe2, 0xaa, 0xcc, 0x23, 0x1f, 0xc1, 0x6e, 0x55, 0x1f, 0xb3, 0x42, 0xab, + 0xd0, 0x87, 0xd0, 0xf2, 0x65, 0x3d, 0xcc, 0x62, 0xfe, 0xf5, 0x30, 0x2b, 0xd9, 0x5a, 0x98, 0xf7, + 0xff, 0xc4, 0x43, 0x8f, 0xe4, 0x27, 0xfe, 0x1b, 0x16, 0x17, 0x3c, 0x99, 0xaf, 0xa0, 0x35, 0x03, + 0xeb, 0x3e, 0x9a, 0xc1, 0xf3, 0xec, 0xd2, 0xdd, 0xfa, 0x15, 0xe2, 0xf8, 0x42, 0x83, 0x30, 0xef, + 0xcf, 0x65, 0xed, 0x58, 0x61, 0xb0, 0x6b, 0xb2, 0x7c, 0x3f, 0xbc, 0x7b, 0xa9, 0xd9, 0x4a, 0xf6, + 0x84, 0x2e, 0xa1, 0xaf, 0xc9, 0x52, 0x10, 0x6c, 0x60, 0xd9, 0x7f, 0xb3, 0xc0, 0x67, 0xa0, 0x38, + 0xd6, 0x7f, 0x39, 0x73, 0xb1, 0x49, 0xff, 0x27, 0xe2, 0x1f, 0x07, 0x70, 0xd5, 0x7d, 0x9b, 0xe2, + 0xbc, 0xe5, 0xca, 0xc0, 0xf7, 0x15, 0x0a, 0x7a, 0xfa, 0x35, 0x74, 0x1b, 0x36, 0xf8, 0xa5, 0x64, + 0x69, 0xf1, 0x50, 0x59, 0x9a, 0x12, 0x2b, 0x43, 0x87, 0xec, 0x76, 0x7f, 0x66, 0x41, 0x4a, 0x23, + 0x42, 0x2d, 0x28, 0xd1, 0xee, 0xee, 0xe5, 0x73, 0x95, 0xa8, 0x49, 0x9a, 0x8a, 0x46, 0x31, 0xed, + 0xd9, 0x4f, 0xcc, 0x19, 0x21, 0x5f, 0x9c, 0xfe, 0x17, 0xf2, 0xb8, 0xee, 0xd6, 0x64, 0x78, 0x25, + 0x0c, 0xb7, 0xf9, 0xa1, 0xa1, 0x8e, 0x24, 0xb0, 0x5f, 0x86, 0xc9, 0x8e, 0x4e, 0xb1, 0x3b, 0x0c, + 0x42, 0x79, 0x7f, 0xaa, 0x31, 0x5d, 0x59, 0x0a, 0x1e, 0xe6, 0x30, 0xfb, 0x2d, 0x0b, 0x4e, 0x67, + 0xc9, 0xa3, 0xaf, 0x5a, 0x30, 0x19, 0x67, 0xe9, 0x9d, 0xd4, 0xd8, 0xa9, 0xc8, 0xb8, 0x0e, 0x10, + 0xee, 0xec, 0x84, 0xfd, 0x7f, 0xc4, 0xe4, 0xbf, 0xe5, 0x05, 0xb5, 0xf0, 0xae, 0x52, 0x4c, 0xac, + 0x9e, 0x8a, 0x09, 0x5d, 0x8f, 0xee, 0x16, 0xa9, 0xb5, 0xfd, 0x8e, 0xdc, 0xbf, 0x75, 0xd1, 0x8e, + 0x15, 0x06, 0x4b, 0x75, 0x6a, 0x8b, 0x82, 0xb9, 0x99, 0x49, 0xb9, 0x20, 0xda, 0xb1, 0xc2, 0x40, + 0x2f, 0xc1, 0x98, 0x79, 0x47, 0xb0, 0x98, 0x97, 0x4c, 0x21, 0x37, 0xaf, 0x13, 0xc6, 0x29, 0x2c, + 0x34, 0x03, 0xa0, 0x94, 0x1c, 0xb9, 0x45, 0x32, 0x27, 0x8c, 0x92, 0x44, 0x31, 0x36, 0x30, 0x58, + 0x62, 0x21, 0xbf, 0x88, 0x57, 0xc6, 0x8f, 0xf2, 0xc4, 0x42, 0xd1, 0x86, 0x15, 0x94, 0x4a, 0x93, + 0xa6, 0x13, 0xb4, 0x1d, 0x9f, 0x8e, 0x90, 0xc8, 0x86, 0x56, 0xcb, 0x70, 0x45, 0x41, 0xb0, 0x81, + 0x45, 0xdf, 0x38, 0xf1, 0x9a, 0xe4, 0xc3, 0x61, 0x20, 0x23, 0xaf, 0xf4, 0x91, 0x8a, 0x68, 0xc7, + 0x0a, 0xc3, 0xfe, 0x2f, 0x16, 0x64, 0xaf, 0x6b, 0x4f, 0x79, 0x39, 0xac, 0x43, 0x33, 0xb0, 0xd3, + 0xf9, 0x9b, 0x85, 0xbe, 0xf2, 0x37, 0xcd, 0xd4, 0xca, 0xe2, 0x7d, 0x53, 0x2b, 0x7f, 0x54, 0xdf, + 0x84, 0xc5, 0x73, 0x30, 0x47, 0xbb, 0xdd, 0x82, 0x85, 0x6c, 0x18, 0x76, 0x1d, 0x55, 0xa3, 0x63, + 0x8c, 0xdb, 0x0e, 0xf3, 0x73, 0x0c, 0x49, 0x40, 0xec, 0x55, 0xa8, 0xa8, 0x93, 0x05, 0x69, 0xa8, + 0x5a, 0xdd, 0x0d, 0xd5, 0xbe, 0x52, 0xc9, 0xaa, 0x9b, 0xdf, 0xfa, 0xfe, 0xd3, 0xef, 0xf8, 0xce, + 0xf7, 0x9f, 0x7e, 0xc7, 0x1f, 0x7f, 0xff, 0xe9, 0x77, 0x7c, 0xea, 0xe0, 0x69, 0xeb, 0x5b, 0x07, + 0x4f, 0x5b, 0xdf, 0x39, 0x78, 0xda, 0xfa, 0xe3, 0x83, 0xa7, 0xad, 0xef, 0x1d, 0x3c, 0x6d, 0x7d, + 0xe9, 0x3f, 0x3e, 0xfd, 0x8e, 0x0f, 0x77, 0x0d, 0xbd, 0xa3, 0x3f, 0x5e, 0x70, 0x6b, 0xb3, 0x3b, + 0x17, 0x59, 0xf4, 0x17, 0x5d, 0x5e, 0xb3, 0xc6, 0x9c, 0x9a, 0x95, 0xcb, 0xeb, 0xff, 0x05, 0x00, + 0x00, 0xff, 0xff, 0xbc, 0xbf, 0xe1, 0x6b, 0xbd, 0xd1, 0x00, 0x00, } func (m *AWSAuthConfig) Marshal() (dAtA []byte, err error) { @@ -6703,6 +6706,18 @@ func (m *ApplicationSourceHelm) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.ValuesObject != nil { + { + size, err := m.ValuesObject.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 + } i-- if m.SkipCrds { dAtA[i] = 1 @@ -14173,6 +14188,10 @@ func (m *ApplicationSourceHelm) Size() (n int) { n += 2 n += 2 n += 2 + if m.ValuesObject != nil { + l = m.ValuesObject.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -17201,6 +17220,7 @@ func (this *ApplicationSourceHelm) String() string { `PassCredentials:` + fmt.Sprintf("%v", this.PassCredentials) + `,`, `IgnoreMissingValueFiles:` + fmt.Sprintf("%v", this.IgnoreMissingValueFiles) + `,`, `SkipCrds:` + fmt.Sprintf("%v", this.SkipCrds) + `,`, + `ValuesObject:` + strings.Replace(fmt.Sprintf("%v", this.ValuesObject), "RawExtension", "runtime.RawExtension", 1) + `,`, `}`, }, "") return s @@ -24904,6 +24924,42 @@ func (m *ApplicationSourceHelm) Unmarshal(dAtA []byte) error { } } m.SkipCrds = bool(v != 0) + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValuesObject", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ValuesObject == nil { + m.ValuesObject = &runtime.RawExtension{} + } + if err := m.ValuesObject.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) From 4967e3edcf5655fbb5e0a0185c3a088d96640205 Mon Sep 17 00:00:00 2001 From: Blake Pettersson Date: Sat, 17 Jun 2023 12:49:15 +0200 Subject: [PATCH 20/22] test: add assertion verify that valuesobject overrides values by checking the number of replicas. Signed-off-by: Blake Pettersson --- reposerver/repository/repository_test.go | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/reposerver/repository/repository_test.go b/reposerver/repository/repository_test.go index d879c53a6ccfa..04960e45883a1 100644 --- a/reposerver/repository/repository_test.go +++ b/reposerver/repository/repository_test.go @@ -905,7 +905,7 @@ func TestGenerateHelmWithEnvVars(t *testing.T) { } // The requested value file (`../minio/values.yaml`) is outside the app path (`./util/helm/testdata/redis`), however -// since the requested value is sill under the repo directory (`~/go/src/github.com/argoproj/argo-cd`), it is allowed +// since the requested value is still under the repo directory (`~/go/src/github.com/argoproj/argo-cd`), it is allowed func TestGenerateHelmWithValuesDirectoryTraversal(t *testing.T) { service := newService("../../util/helm/testdata") _, err := service.GenerateManifest(context.Background(), &apiclient.ManifestRequest{ @@ -1161,13 +1161,14 @@ func TestGenerateHelmWithAbsoluteFileParameter(t *testing.T) { } }() - _, err = service.GenerateManifest(context.Background(), &apiclient.ManifestRequest{ + res, err := service.GenerateManifest(context.Background(), &apiclient.ManifestRequest{ Repo: &argoappv1.Repository{}, AppName: "test", ApplicationSource: &argoappv1.ApplicationSource{ Path: "./util/helm/testdata/redis", Helm: &argoappv1.ApplicationSourceHelm{ ValueFiles: []string{"values-production.yaml"}, + Values: `cluster: {slaveCount: 10}`, ValuesObject: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, FileParameters: []argoappv1.HelmFileParameter{{ Name: "passwordContent", @@ -1179,6 +1180,7 @@ func TestGenerateHelmWithAbsoluteFileParameter(t *testing.T) { ProjectSourceRepos: []string{"*"}, }) assert.Error(t, err) + assert.Contains(t, res.Manifests[6], `"replicas":2`, "ValuesObject should override Values") } // The requested file parameter (`../external/external-secret.txt`) is outside the app path @@ -1188,26 +1190,26 @@ func TestGenerateHelmWithAbsoluteFileParameter(t *testing.T) { func TestGenerateHelmWithFileParameter(t *testing.T) { service := newService("../../util/helm/testdata") - _, err := service.GenerateManifest(context.Background(), &apiclient.ManifestRequest{ + res, err := service.GenerateManifest(context.Background(), &apiclient.ManifestRequest{ Repo: &argoappv1.Repository{}, AppName: "test", ApplicationSource: &argoappv1.ApplicationSource{ Path: "./redis", Helm: &argoappv1.ApplicationSourceHelm{ ValueFiles: []string{"values-production.yaml"}, + Values: `cluster: {slaveCount: 10}`, ValuesObject: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, - FileParameters: []argoappv1.HelmFileParameter{ - argoappv1.HelmFileParameter{ - Name: "passwordContent", - Path: "../external/external-secret.txt", - }, - }, + FileParameters: []argoappv1.HelmFileParameter{{ + Name: "passwordContent", + Path: "../external/external-secret.txt", + }}, }, }, ProjectName: "something", ProjectSourceRepos: []string{"*"}, }) assert.NoError(t, err) + assert.Contains(t, res.Manifests[6], `"replicas":2`, "ValuesObject should override Values") } func TestGenerateNullList(t *testing.T) { From 196c806b9059be3486a0ff6209800d43d4f4cbca Mon Sep 17 00:00:00 2001 From: Blake Pettersson Date: Sat, 17 Jun 2023 13:58:23 +0200 Subject: [PATCH 21/22] test: remove assertion This wasn't meant to be in there, was a typo. Signed-off-by: Blake Pettersson --- reposerver/repository/repository_test.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/reposerver/repository/repository_test.go b/reposerver/repository/repository_test.go index 04960e45883a1..2ced656cde734 100644 --- a/reposerver/repository/repository_test.go +++ b/reposerver/repository/repository_test.go @@ -1161,14 +1161,13 @@ func TestGenerateHelmWithAbsoluteFileParameter(t *testing.T) { } }() - res, err := service.GenerateManifest(context.Background(), &apiclient.ManifestRequest{ + _, err = service.GenerateManifest(context.Background(), &apiclient.ManifestRequest{ Repo: &argoappv1.Repository{}, AppName: "test", ApplicationSource: &argoappv1.ApplicationSource{ Path: "./util/helm/testdata/redis", Helm: &argoappv1.ApplicationSourceHelm{ ValueFiles: []string{"values-production.yaml"}, - Values: `cluster: {slaveCount: 10}`, ValuesObject: &runtime.RawExtension{Raw: []byte(`cluster: {slaveCount: 2}`)}, FileParameters: []argoappv1.HelmFileParameter{{ Name: "passwordContent", @@ -1180,7 +1179,6 @@ func TestGenerateHelmWithAbsoluteFileParameter(t *testing.T) { ProjectSourceRepos: []string{"*"}, }) assert.Error(t, err) - assert.Contains(t, res.Manifests[6], `"replicas":2`, "ValuesObject should override Values") } // The requested file parameter (`../external/external-secret.txt`) is outside the app path From 61958a08051aaa5a7a039db03ca46f425fceb83f Mon Sep 17 00:00:00 2001 From: Blake Pettersson Date: Sat, 24 Jun 2023 21:53:18 +0200 Subject: [PATCH 22/22] chore: minor nit fix Signed-off-by: Blake Pettersson --- pkg/apis/application/v1alpha1/types.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/apis/application/v1alpha1/types.go b/pkg/apis/application/v1alpha1/types.go index 0e07a673c1a93..1a43c21f7892d 100644 --- a/pkg/apis/application/v1alpha1/types.go +++ b/pkg/apis/application/v1alpha1/types.go @@ -302,9 +302,6 @@ type ApplicationSourceHelm struct { // Values specifies Helm values to be passed to helm template, typically defined as a block. ValuesObject takes precedence over Values, so use one or the other. // +patchStrategy=replace Values string `json:"values,omitempty" patchStrategy:"replace" protobuf:"bytes,4,opt,name=values"` - // ValuesObject specifies Helm values to be passed to helm template, defined as a map. This takes precedence over Values. - // +kubebuilder:pruning:PreserveUnknownFields - ValuesObject *runtime.RawExtension `json:"valuesObject,omitempty" protobuf:"bytes,10,opt,name=valuesObject"` // FileParameters are file parameters to the helm template FileParameters []HelmFileParameter `json:"fileParameters,omitempty" protobuf:"bytes,5,opt,name=fileParameters"` // Version is the Helm version to use for templating ("3") @@ -315,6 +312,9 @@ type ApplicationSourceHelm struct { IgnoreMissingValueFiles bool `json:"ignoreMissingValueFiles,omitempty" protobuf:"bytes,8,opt,name=ignoreMissingValueFiles"` // SkipCrds skips custom resource definition installation step (Helm's --skip-crds) SkipCrds bool `json:"skipCrds,omitempty" protobuf:"bytes,9,opt,name=skipCrds"` + // ValuesObject specifies Helm values to be passed to helm template, defined as a map. This takes precedence over Values. + // +kubebuilder:pruning:PreserveUnknownFields + ValuesObject *runtime.RawExtension `json:"valuesObject,omitempty" protobuf:"bytes,10,opt,name=valuesObject"` } // HelmParameter is a parameter that's passed to helm template during manifest generation