Repository: argoproj/argo-cd
Pull request #3986 (2020-07-23 07:56:25)

fix: skipped resources should not impact sync status
Signed-off-by: darshanime <deathbullet@gmail.com>
closes https://github.com/argoproj/argo-cd/issues/3223
Checklist: 

* [ ] Either (a) I've created an [enhancement proposal](https://github.com/argoproj/argo-cd/issues/new/choose) and discussed it with the community, (b) this is a bug fix, or (c) this does not need to be in the release notes.
* [ ] The title of the PR states what changed and the related issues number (used for the release note).
* [ ] I've updated both the CLI and UI to expose my feature, or I plan to submit a second PR with them.
* [ ] Optional. My organization is added to USERS.md.
* [ ] I've signed the CLA and my build is green ([troubleshooting builds](https://argoproj.github.io/argo-cd/developer-guide/ci/)). 


codecov-commenter: # [Codecov](https://codecov.io/gh/argoproj/argo-cd/pull/3986?src=pr&el=h1) Report
> Merging [#3986](https://codecov.io/gh/argoproj/argo-cd/pull/3986?src=pr&el=desc) into [master](https://codecov.io/gh/argoproj/argo-cd/commit/1a36fd178abf63b54b33e1ef47a25b8c9381a0e1&el=desc) will **not change** coverage.
> The diff coverage is `100.00%`.

[![Impacted file tree graph](https://codecov.io/gh/argoproj/argo-cd/pull/3986/graphs/tree.svg?width=650&height=150&src=pr&token=kf5kwuegwE)](https://codecov.io/gh/argoproj/argo-cd/pull/3986?src=pr&el=tree)

```diff
@@           Coverage Diff           @@
##           master    #3986   +/-   ##
=======================================
  Coverage   42.12%   42.12%           
=======================================
  Files         123      123           
  Lines       18123    18123           
=======================================
  Hits         7634     7634           
  Misses       9510     9510           
  Partials      979      979           
```


| [Impacted Files](https://codecov.io/gh/argoproj/argo-cd/pull/3986?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [controller/state.go](https://codecov.io/gh/argoproj/argo-cd/pull/3986/diff?src=pr&el=tree#diff-Y29udHJvbGxlci9zdGF0ZS5nbw==) | `75.34% <100.00%> (ø)` | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/argoproj/argo-cd/pull/3986?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/argoproj/argo-cd/pull/3986?src=pr&el=footer). Last update [1a36fd1...4ffa655](https://codecov.io/gh/argoproj/argo-cd/pull/3986?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

darshanime: @jannfis I've added some more commits so that now `Skip`ed resource does not impact overall health, even if it is added after the resource is deployed etc. 

Patch:
diff --git a/USERS.md b/USERS.md
index b837f689f..be9a38a83 100644
--- a/USERS.md
+++ b/USERS.md
@@ -33,6 +33,7 @@ Currently, the following organizations are **officially** using Argo CD:
 1. [Intuit](https://www.intuit.com/)
 1. [KintoHub](https://www.kintohub.com/)
 1. [KompiTech GmbH](https://www.kompitech.com/)
+1. [LINE](https://linecorp.com/en/)
 1. [Lytt](https://www.lytt.co/)
 1. [Major League Baseball](https://mlb.com)
 1. [Mambu](https://www.mambu.com/)
diff --git a/assets/swagger.json b/assets/swagger.json
index dcf5ee4ca..fd53aa4ef 100644
--- a/assets/swagger.json
+++ b/assets/swagger.json
@@ -2428,6 +2428,9 @@
             "$ref": "#/definitions/v1alpha1SyncOperationResource"
           }
         },
+        "retryStrategy": {
+          "$ref": "#/definitions/v1alpha1RetryStrategy"
+        },
         "revision": {
           "type": "string"
         },
@@ -3942,6 +3945,25 @@
         }
       }
     },
+    "v1alpha1Backoff": {
+      "type": "object",
+      "title": "Backoff is a backoff strategy to use within retryStrategy",
+      "properties": {
+        "duration": {
+          "type": "string",
+          "title": "Duration is the amount to back off. Default unit is seconds, but could also be a duration (e.g. \"2m\", \"1h\")"
+        },
+        "factor": {
+          "type": "string",
+          "format": "int64",
+          "title": "Factor is a factor to multiply the base duration after each failed retry"
+        },
+        "maxDuration": {
+          "type": "string",
+          "title": "MaxDuration is the maximum amount of time allowed for the backoff strategy"
+        }
+      }
+    },
     "v1alpha1Cluster": {
       "type": "object",
       "title": "Cluster is the definition of a cluster resource",
@@ -4338,6 +4360,9 @@
         "initiatedBy": {
           "$ref": "#/definitions/v1alpha1OperationInitiator"
         },
+        "retry": {
+          "$ref": "#/definitions/v1alpha1RetryStrategy"
+        },
         "sync": {
           "$ref": "#/definitions/v1alpha1SyncOperation"
         }
@@ -4376,6 +4401,11 @@
           "type": "string",
           "title": "Phase is the current phase of the operation"
         },
+        "retryCount": {
+          "type": "string",
+          "format": "int64",
+          "title": "RetryCount contains time of operation retries"
+        },
         "startedAt": {
           "$ref": "#/definitions/v1Time"
         },
@@ -4923,6 +4953,19 @@
         }
       }
     },
+    "v1alpha1RetryStrategy": {
+      "type": "object",
+      "properties": {
+        "backoff": {
+          "$ref": "#/definitions/v1alpha1Backoff"
+        },
+        "limit": {
+          "type": "string",
+          "format": "int64",
+          "title": "Limit is the maximum number of attempts when retrying a container"
+        }
+      }
+    },
     "v1alpha1RevisionHistory": {
       "type": "object",
       "title": "RevisionHistory contains information relevant to an application deployment",
@@ -5077,6 +5120,9 @@
         "automated": {
           "$ref": "#/definitions/v1alpha1SyncPolicyAutomated"
         },
+        "retry": {
+          "$ref": "#/definitions/v1alpha1RetryStrategy"
+        },
         "syncOptions": {
           "type": "array",
           "title": "Options allow you to specify whole app sync-options",
diff --git a/cmd/argocd/commands/app.go b/cmd/argocd/commands/app.go
index be329c448..c77356588 100644
--- a/cmd/argocd/commands/app.go
+++ b/cmd/argocd/commands/app.go
@@ -31,6 +31,7 @@ import (
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 	"k8s.io/apimachinery/pkg/runtime/schema"
 	"k8s.io/apimachinery/pkg/types"
+	"k8s.io/utils/pointer"
 
 	"github.com/argoproj/argo-cd/common"
 	"github.com/argoproj/argo-cd/controller"
@@ -1420,19 +1421,23 @@ func printAppResources(w io.Writer, app *argoappv1.Application) {
 // NewApplicationSyncCommand returns a new instance of an `argocd app sync` command
 func NewApplicationSyncCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
 	var (
-		revision      string
-		resources     []string
-		labels        []string
-		selector      string
-		prune         bool
-		dryRun        bool
-		timeout       uint
-		strategy      string
-		force         bool
-		async         bool
-		local         string
-		localRepoRoot string
-		infos         []string
+		revision                string
+		resources               []string
+		labels                  []string
+		selector                string
+		prune                   bool
+		dryRun                  bool
+		timeout                 uint
+		strategy                string
+		force                   bool
+		async                   bool
+		retryLimit              int64
+		retryBackoffDuration    string
+		retryBackoffMaxDuration string
+		retryBackoffFactor      int64
+		local                   string
+		localRepoRoot           string
+		infos                   []string
 	)
 	var command = &cobra.Command{
 		Use:   "sync [APPNAME... | -l selector]",
@@ -1552,6 +1557,16 @@ func NewApplicationSyncCommand(clientOpts *argocdclient.ClientOptions) *cobra.Co
 				default:
 					log.Fatalf("Unknown sync strategy: '%s'", strategy)
 				}
+				if retryLimit > 0 {
+					syncReq.RetryStrategy = &argoappv1.RetryStrategy{
+						Limit: retryLimit,
+						Backoff: &argoappv1.Backoff{
+							Duration:    retryBackoffDuration,
+							MaxDuration: retryBackoffMaxDuration,
+							Factor:      pointer.Int64Ptr(retryBackoffFactor),
+						},
+					}
+				}
 				ctx := context.Background()
 				_, err := appIf.Sync(ctx, &syncReq)
 				errors.CheckError(err)
@@ -1582,6 +1597,10 @@ func NewApplicationSyncCommand(clientOpts *argocdclient.ClientOptions) *cobra.Co
 	command.Flags().StringVarP(&selector, "selector", "l", "", "Sync apps that match this label")
 	command.Flags().StringArrayVar(&labels, "label", []string{}, "Sync only specific resources with a label. This option may be specified repeatedly.")
 	command.Flags().UintVar(&timeout, "timeout", defaultCheckTimeoutSeconds, "Time out after this many seconds")
+	command.Flags().Int64Var(&retryLimit, "retry-limit", 0, "Max number of allowed sync retries")
+	command.Flags().StringVar(&retryBackoffDuration, "retry-backoff-duration", fmt.Sprintf("%ds", common.DefaultSyncRetryDuration/time.Second), "Retry backoff base duration. Default unit is seconds, but could also be a duration (e.g. 2m, 1h)")
+	command.Flags().StringVar(&retryBackoffMaxDuration, "retry-backoff-max-duration", fmt.Sprintf("%ds", common.DefaultSyncRetryMaxDuration/time.Second), "Max retry backoff duration. Default unit is seconds, but could also be a duration (e.g. 2m, 1h)")
+	command.Flags().Int64Var(&retryBackoffFactor, "retry-backoff-factor", common.DefaultSyncRetryFactor, "Factor multiplies the base duration after each failed retry")
 	command.Flags().StringVar(&strategy, "strategy", "", "Sync strategy (one of: apply|hook)")
 	command.Flags().BoolVar(&force, "force", false, "Use a force apply")
 	command.Flags().BoolVar(&async, "async", false, "Do not wait for application to sync before continuing")
diff --git a/cmd/argocd/commands/cluster.go b/cmd/argocd/commands/cluster.go
index 594e01480..74b609a59 100644
--- a/cmd/argocd/commands/cluster.go
+++ b/cmd/argocd/commands/cluster.go
@@ -65,6 +65,7 @@ func NewClusterAddCommand(clientOpts *argocdclient.ClientOptions, pathOpts *clie
 		awsClusterName  string
 		systemNamespace string
 		namespaces      []string
+		name            string
 	)
 	var command = &cobra.Command{
 		Use:   "add CONTEXT",
@@ -111,6 +112,9 @@ func NewClusterAddCommand(clientOpts *argocdclient.ClientOptions, pathOpts *clie
 			}
 			conn, clusterIf := argocdclient.NewClientOrDie(clientOpts).NewClusterClientOrDie()
 			defer io.Close(conn)
+			if name != "" {
+				contextName = name
+			}
 			clst := newCluster(contextName, namespaces, conf, managerBearerToken, awsAuthConf)
 			if inCluster {
 				clst.Server = common.KubernetesInternalAPIServerAddr
@@ -132,6 +136,7 @@ func NewClusterAddCommand(clientOpts *argocdclient.ClientOptions, pathOpts *clie
 	command.Flags().StringVar(&awsRoleArn, "aws-role-arn", "", "Optional AWS role arn. If set then AWS IAM Authenticator assume a role to perform cluster operations instead of the default AWS credential provider chain.")
 	command.Flags().StringVar(&systemNamespace, "system-namespace", common.DefaultSystemNamespace, "Use different system namespace")
 	command.Flags().StringArrayVar(&namespaces, "namespace", nil, "List of namespaces which are allowed to manage")
+	command.Flags().StringVar(&name, "name", "", "Overwrite the cluster name")
 	return command
 }
 
diff --git a/common/common.go b/common/common.go
index 73a5a2e4a..85af1e8f2 100644
--- a/common/common.go
+++ b/common/common.go
@@ -55,6 +55,12 @@ const (
 	DefaultGnuPgHomePath = "/app/config/gpg/keys"
 )
 
+const (
+	DefaultSyncRetryDuration    = 5 * time.Second
+	DefaultSyncRetryMaxDuration = 3 * time.Minute
+	DefaultSyncRetryFactor      = int64(2)
+)
+
 // Argo CD application related constants
 const (
 	// KubernetesInternalAPIServerAddr is address of the k8s API server when accessing internal to the cluster
@@ -140,6 +146,8 @@ const (
 	EnvK8sClientQPS = "ARGOCD_K8S_CLIENT_QPS"
 	// EnvK8sClientBurst is the burst value used for the kubernetes client (default: twice the client QPS)
 	EnvK8sClientBurst = "ARGOCD_K8S_CLIENT_BURST"
+	// EnvClusterCacheResyncDuration is the env variable that holds cluster cache re-sync duration
+	EnvClusterCacheResyncDuration = "ARGOCD_CLUSTER_CACHE_RESYNC_DURATION"
 	// EnvK8sClientMaxIdleConnections is the number of max idle connections in K8s REST client HTTP transport (default: 500)
 	EnvK8sClientMaxIdleConnections = "ARGOCD_K8S_CLIENT_MAX_IDLE_CONNECTIONS"
 	// EnvGnuPGHome is the path to ArgoCD's GnuPG keyring for signature verification
@@ -172,6 +180,8 @@ var (
 	K8sClientConfigBurst int = 100
 	// K8sMaxIdleConnections controls the number of max idle connections in K8s REST client HTTP transport
 	K8sMaxIdleConnections = 500
+	// K8sMaxIdleConnections controls the duration of cluster cache refresh
+	K8SClusterResyncDuration = 12 * time.Hour
 )
 
 func init() {
@@ -193,4 +203,9 @@ func init() {
 			K8sMaxIdleConnections = maxConn
 		}
 	}
+	if clusterResyncDurationStr := os.Getenv(EnvClusterCacheResyncDuration); clusterResyncDurationStr != "" {
+		if duration, err := time.ParseDuration(clusterResyncDurationStr); err == nil {
+			K8SClusterResyncDuration = duration
+		}
+	}
 }
diff --git a/controller/appcontroller.go b/controller/appcontroller.go
index 5ba663e7c..d438b1c8f 100644
--- a/controller/appcontroller.go
+++ b/controller/appcontroller.go
@@ -813,7 +813,26 @@ func (ctrl *ApplicationController) processRequestedAppOperation(app *appv1.Appli
 		}
 		app = freshApp
 		state = app.Status.OperationState.DeepCopy()
-		logCtx.Infof("Resuming in-progress operation. phase: %s, message: %s", state.Phase, state.Message)
+		// Failed  operation with retry strategy might have be in-progress and has completion time
+		if state.FinishedAt != nil && state.Phase != synccommon.OperationTerminating {
+			retryAt, err := app.Status.OperationState.Operation.Retry.NextRetryAt(state.FinishedAt.Time, state.RetryCount)
+			if err != nil {
+				state.Phase = synccommon.OperationFailed
+				state.Message = err.Error()
+				ctrl.setOperationState(app, state)
+				return
+			}
+			retryAfter := time.Until(retryAt)
+			if retryAfter > 0 {
+				logCtx.Infof("Skipping retrying in-progress operation. Attempting again at: %s", retryAt.Format(time.RFC3339))
+				ctrl.requestAppRefresh(app.Name, CompareWithLatest.Pointer(), &retryAfter)
+				return
+			} else {
+				state.SyncResult = nil
+			}
+		} else {
+			logCtx.Infof("Resuming in-progress operation. phase: %s, message: %s", state.Phase, state.Message)
+		}
 	} else {
 		state = &appv1.OperationState{Phase: synccommon.OperationRunning, Operation: *app.Operation, StartedAt: metav1.Now()}
 		ctrl.setOperationState(app, state)
@@ -840,6 +859,22 @@ func (ctrl *ApplicationController) processRequestedAppOperation(app *appv1.Appli
 				// cleanup (e.g. delete jobs, workflows, etc...)
 			}
 		}
+	} else if state.Phase == synccommon.OperationFailed || state.Phase == synccommon.OperationError {
+		if state.RetryCount < state.Operation.Retry.Limit || state.Operation.Retry.Limit < 0 {
+			now := metav1.Now()
+			state.FinishedAt = &now
+			if retryAt, err := state.Operation.Retry.NextRetryAt(now.Time, state.RetryCount); err != nil {
+				state.Phase = synccommon.OperationFailed
+				state.Message = fmt.Sprintf("%s (failed to retry: %v)", state.Message, err)
+			} else {
+				state.Phase = synccommon.OperationRunning
+				state.RetryCount++
+				state.Message = fmt.Sprintf("%s. Retrying attempt #%d at %s.", state.Message, state.RetryCount, retryAt.Format(time.Kitchen))
+			}
+		} else if state.RetryCount > 0 {
+			state.Message = fmt.Sprintf("%s (retried %d times).", state.Message, state.RetryCount)
+		}
+
 	}
 
 	ctrl.setOperationState(app, state)
@@ -856,7 +891,7 @@ func (ctrl *ApplicationController) processRequestedAppOperation(app *appv1.Appli
 }
 
 func (ctrl *ApplicationController) setOperationState(app *appv1.Application, state *appv1.OperationState) {
-	kube.RetryUntilSucceed(func() error {
+	kube.RetryUntilSucceed(context.Background(), updateOperationStateTimeout, "Update application operation state", func() error {
 		if state.Phase == "" {
 			// expose any bugs where we neglect to set phase
 			panic("no phase was set")
@@ -915,7 +950,7 @@ func (ctrl *ApplicationController) setOperationState(app *appv1.Application, sta
 			ctrl.metricsServer.IncSync(app, state)
 		}
 		return nil
-	}, "Update application operation state", context.Background(), updateOperationStateTimeout)
+	})
 }
 
 func (ctrl *ApplicationController) processAppRefreshQueueItem() (processNext bool) {
@@ -1252,6 +1287,10 @@ func (ctrl *ApplicationController) autoSync(app *appv1.Application, syncStatus *
 			SyncOptions: app.Spec.SyncPolicy.SyncOptions,
 		},
 		InitiatedBy: appv1.OperationInitiator{Automated: true},
+		Retry:       appv1.RetryStrategy{Limit: 5},
+	}
+	if app.Spec.SyncPolicy.Retry != nil {
+		op.Retry = *app.Spec.SyncPolicy.Retry
 	}
 	// It is possible for manifests to remain OutOfSync even after a sync/kubectl apply (e.g.
 	// auto-sync with pruning disabled). We need to ensure that we do not keep Syncing an
@@ -1284,6 +1323,20 @@ func (ctrl *ApplicationController) autoSync(app *appv1.Application, syncStatus *
 
 	}
 
+	if app.Spec.SyncPolicy.Automated.Prune {
+		bAllNeedPrune := true
+		for _, r := range resources {
+			if !r.RequiresPruning {
+				bAllNeedPrune = false
+			}
+		}
+		if bAllNeedPrune {
+			message := fmt.Sprintf("Skipping sync attempt to %s: auto-sync will wipe out all resourses", desiredCommitSHA)
+			logCtx.Warnf(message)
+			return &appv1.ApplicationCondition{Type: appv1.ApplicationConditionSyncError, Message: message}
+		}
+	}
+
 	appIf := ctrl.applicationClientset.ArgoprojV1alpha1().Applications(app.Namespace)
 	_, err := argo.SetAppOperation(appIf, app.Name, &op)
 	if err != nil {
diff --git a/controller/cache/cache.go b/controller/cache/cache.go
index 23cec8a04..e5fa0ed72 100644
--- a/controller/cache/cache.go
+++ b/controller/cache/cache.go
@@ -16,6 +16,7 @@ import (
 	"k8s.io/apimachinery/pkg/watch"
 	"k8s.io/client-go/tools/cache"
 
+	"github.com/argoproj/argo-cd/common"
 	"github.com/argoproj/argo-cd/controller/metrics"
 	appv1 "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1"
 	"github.com/argoproj/argo-cd/util/argo"
@@ -231,6 +232,7 @@ func (c *liveStateCache) getCluster(server string) (clustercache.ClusterCache, e
 	}
 
 	clusterCache = clustercache.NewClusterCache(cluster.RESTConfig(),
+		clustercache.SetResyncTimeout(common.K8SClusterResyncDuration),
 		clustercache.SetSettings(cacheSettings.clusterSettings),
 		clustercache.SetNamespaces(cluster.Namespaces),
 		clustercache.SetPopulateResourceInfoHandler(func(un *unstructured.Unstructured, isRoot bool) (interface{}, bool) {
@@ -416,9 +418,9 @@ func (c *liveStateCache) Init() error {
 func (c *liveStateCache) Run(ctx context.Context) error {
 	go c.watchSettings(ctx)
 
-	kube.RetryUntilSucceed(func() error {
+	kube.RetryUntilSucceed(ctx, clustercache.ClusterRetryTimeout, "watch clusters", func() error {
 		return c.db.WatchClusters(ctx, c.handleAddEvent, c.handleModEvent, c.handleDeleteEvent)
-	}, "watch clusters", ctx, clustercache.ClusterRetryTimeout)
+	})
 
 	<-ctx.Done()
 	c.invalidate(c.cacheSettings)
diff --git a/controller/state.go b/controller/state.go
index d3cc80327..95d44e26d 100644
--- a/controller/state.go
+++ b/controller/state.go
@@ -55,12 +55,18 @@ type managedResource struct {
 	Hook      bool
 }
 
-func GetLiveObjs(res []managedResource) []*unstructured.Unstructured {
-	objs := make([]*unstructured.Unstructured, len(res))
-	for i := range res {
-		objs[i] = res[i].Live
+func GetLiveObjsForApplicationHealth(resources []managedResource, statuses []appv1.ResourceStatus) ([]*appv1.ResourceStatus, []*unstructured.Unstructured) {
+	liveObjs := make([]*unstructured.Unstructured, 0)
+	resStatuses := make([]*appv1.ResourceStatus, 0)
+	for i, resource := range resources {
+		if resource.Target != nil && hookutil.Skip(resource.Target) {
+			continue
+		}
+
+		liveObjs = append(liveObjs, resource.Live)
+		resStatuses = append(resStatuses, &statuses[i])
 	}
-	return objs
+	return resStatuses, liveObjs
 }
 
 // AppStateManager defines methods which allow to compare application spec and actual application state.
@@ -463,8 +469,8 @@ func (m *appStateManager) CompareAppState(app *v1alpha1.Application, project *ap
 		} else {
 			diffResult = diff.DiffResult{Modified: false, NormalizedLive: []byte("{}"), PredictedLive: []byte("{}")}
 		}
-		if resState.Hook || ignore.Ignore(obj) {
-			// For resource hooks, don't store sync status, and do not affect overall sync status
+		if resState.Hook || ignore.Ignore(obj) || (targetObj != nil && hookutil.Skip(targetObj)) {
+			// For resource hooks or skipped resources, don't store sync status, and do not affect overall sync status
 		} else if diffResult.Modified || targetObj == nil || liveObj == nil {
 			// Set resource state to OutOfSync since one of the following is true:
 			// * target and live resource are different
@@ -522,7 +528,8 @@ func (m *appStateManager) CompareAppState(app *v1alpha1.Application, project *ap
 	}
 	ts.AddCheckpoint("sync_ms")
 
-	healthStatus, err := argohealth.SetApplicationHealth(resourceSummaries, GetLiveObjs(managedResources), resourceOverrides, func(obj *unstructured.Unstructured) bool {
+	resSumForAppHealth, liveObjsForAppHealth := GetLiveObjsForApplicationHealth(managedResources, resourceSummaries)
+	healthStatus, err := argohealth.SetApplicationHealth(resSumForAppHealth, liveObjsForAppHealth, resourceOverrides, func(obj *unstructured.Unstructured) bool {
 		return !isSelfReferencedApp(app, kubeutil.GetObjectRef(obj))
 	})
 
diff --git a/controller/sync.go b/controller/sync.go
index 4dccf24e2..09d031160 100644
--- a/controller/sync.go
+++ b/controller/sync.go
@@ -142,6 +142,7 @@ func (m *appStateManager) SyncAppState(app *v1alpha1.Application, state *v1alpha
 			return len(syncOp.Resources) == 0 || argo.ContainsSyncResource(key.Name, key.Namespace, schema.GroupVersionKind{Kind: key.Kind, Group: key.Group}, syncOp.Resources)
 		}),
 		sync.WithManifestValidation(!syncOp.SyncOptions.HasOption("Validate=false")),
+		sync.WithNamespaceCreation(syncOp.SyncOptions.HasOption("CreateNamespace=true")),
 	)
 
 	if err != nil {
diff --git a/docs/operator-manual/application.yaml b/docs/operator-manual/application.yaml
index ea453aced..640398d85 100644
--- a/docs/operator-manual/application.yaml
+++ b/docs/operator-manual/application.yaml
@@ -91,11 +91,17 @@ spec:
 
   # Sync policy
   syncPolicy:
-    automated:
+    automated: # automated sync by default retries failed attempts 5 times with following delays between attempts ( 5s, 10s, 20s, 40s, 80s ); retry controlled using `retry` field.
       prune: true # Specifies if resources should be pruned during auto-syncing ( false by default ).
       selfHeal: true # Specifies if partial app sync should be executed when resources are changed only in target Kubernetes cluster and no git change detected ( false by default ).
     syncOptions:     # Sync options which modifies sync behavior
     - Validate=false # disables resource validation (equivalent to 'kubectl apply --validate=true')
+    retry:
+      limit: 5 # number of failed sync attempt retries; unlimited number of attempts if less than 0
+      backoff:
+        duration: 5s # the amount to back off. Default unit is seconds, but could also be a duration (e.g. "2m", "1h")
+        factor: 2 # a factor to multiply the base duration after each failed retry
+        maxDuration: 3m # the maximum amount of time allowed for the backoff strategy
 
   # Ignore differences at the specified json pointers
   ignoreDifferences:
diff --git a/docs/operator-manual/user-management/microsoft.md b/docs/operator-manual/user-management/microsoft.md
index e980dadee..60f62ad3f 100644
--- a/docs/operator-manual/user-management/microsoft.md
+++ b/docs/operator-manual/user-management/microsoft.md
@@ -59,7 +59,7 @@
 
     [RBAC Configurations](../rbac.md)
 
-        ConfigMap -> argocd-cm
+        ConfigMap -> argocd-rbac-cm
 
         policy.default: role:readonly
         policy.csv: |
diff --git a/docs/user-guide/jsonnet.md b/docs/user-guide/jsonnet.md
index 0c740707c..973510f61 100644
--- a/docs/user-guide/jsonnet.md
+++ b/docs/user-guide/jsonnet.md
@@ -14,7 +14,7 @@ E.g. via the CLI:
 ```bash
 argocd app create APPNAME \
   --jsonnet-ext-str 'app=${ARGOCD_APP_NAME}' \
-  --jsonnet-tla-str 'ns=${ARGOCD_APP_NAMESPACE}'
+  --jsonnet-tla-str 'ns=${ARGOCD_APP_NAMESPACE}' \
   --jsonnet-libs 'vendor'
 ```
 
diff --git a/go.mod b/go.mod
index 9dbbfaa3d..db70b3df7 100644
--- a/go.mod
+++ b/go.mod
@@ -8,7 +8,7 @@ require (
 	github.com/TomOnTime/utfutil v0.0.0-20180511104225-09c41003ee1d
 	github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6 // indirect
 	github.com/alicebob/miniredis v2.5.0+incompatible
-	github.com/argoproj/gitops-engine v0.1.3-0.20200720164507-3c545080c935
+	github.com/argoproj/gitops-engine v0.1.3-0.20200727214732-11d47a621575
 	github.com/argoproj/pkg v0.0.0-20200624215116-23e74cb168fe
 	github.com/bsm/redislock v0.4.3
 	github.com/casbin/casbin v1.9.1
diff --git a/go.sum b/go.sum
index 229fda740..0e90217b1 100644
--- a/go.sum
+++ b/go.sum
@@ -56,8 +56,8 @@ github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+Dx
 github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
 github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=
 github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
-github.com/argoproj/gitops-engine v0.1.3-0.20200720164507-3c545080c935 h1:Nn1hPY+VUmvturbbpo3JjJCZqGyfFzCcQaBU9t8fS8U=
-github.com/argoproj/gitops-engine v0.1.3-0.20200720164507-3c545080c935/go.mod h1:JkoSXhq63nmmf/3pKe8fFGrZC0/cyEasF7aFXCB8B24=
+github.com/argoproj/gitops-engine v0.1.3-0.20200727214732-11d47a621575 h1:/B/3cWRuv2jfcEbwyNguUM6sfY6kgXzf3ctBBg4zQ1Q=
+github.com/argoproj/gitops-engine v0.1.3-0.20200727214732-11d47a621575/go.mod h1:JkoSXhq63nmmf/3pKe8fFGrZC0/cyEasF7aFXCB8B24=
 github.com/argoproj/pkg v0.0.0-20200102163130-2dd1f3f6b4de/go.mod h1:2EZ44RG/CcgtPTwrRR0apOc7oU6UIw8GjCUJWZ8X3bM=
 github.com/argoproj/pkg v0.0.0-20200624215116-23e74cb168fe h1:HjTM7H8Z+J1xt340LNpH9q4jc8pXeqzkC8QKIjQphp4=
 github.com/argoproj/pkg v0.0.0-20200624215116-23e74cb168fe/go.mod h1:2EZ44RG/CcgtPTwrRR0apOc7oU6UIw8GjCUJWZ8X3bM=
diff --git a/manifests/base/redis/argocd-redis-deployment.yaml b/manifests/base/redis/argocd-redis-deployment.yaml
index b2cefa367..fa5168a2b 100644
--- a/manifests/base/redis/argocd-redis-deployment.yaml
+++ b/manifests/base/redis/argocd-redis-deployment.yaml
@@ -15,6 +15,11 @@ spec:
       labels:
         app.kubernetes.io/name: argocd-redis
     spec:
+      securityContext:
+        runAsUser: 1000
+        runAsGroup: 1000
+        fsGroup: 1000
+        runAsNonRoot: true
       containers:
       - name: redis
         image: redis:5.0.8
diff --git a/manifests/crds/application-crd.yaml b/manifests/crds/application-crd.yaml
index d1667517a..b61ba71fc 100644
--- a/manifests/crds/application-crd.yaml
+++ b/manifests/crds/application-crd.yaml
@@ -53,6 +53,28 @@ spec:
                   description: Name of a user who started operation.
                   type: string
               type: object
+            retry:
+              description: Retry controls failed sync retry behavior
+              properties:
+                backoff:
+                  description: Backoff is a backoff strategy
+                  properties:
+                    duration:
+                      description: Duration is the amount to back off. Default unit is seconds, but could also be a duration (e.g. "2m", "1h")
+                      type: string
+                    factor:
+                      description: Factor is a factor to multiply the base duration after each failed retry
+                      format: int64
+                      type: integer
+                    maxDuration:
+                      description: MaxDuration is the maximum amount of time allowed for the backoff strategy
+                      type: string
+                  type: object
+                limit:
+                  description: Limit is the maximum number of attempts when retrying a container
+                  format: int64
+                  type: integer
+              type: object
             sync:
               description: SyncOperation contains sync operation details.
               properties:
@@ -534,6 +556,28 @@ spec:
                       description: 'SelfHeal enables auto-syncing if  (default: false)'
                       type: boolean
                   type: object
+                retry:
+                  description: Retry controls failed sync retry behavior
+                  properties:
+                    backoff:
+                      description: Backoff is a backoff strategy
+                      properties:
+                        duration:
+                          description: Duration is the amount to back off. Default unit is seconds, but could also be a duration (e.g. "2m", "1h")
+                          type: string
+                        factor:
+                          description: Factor is a factor to multiply the base duration after each failed retry
+                          format: int64
+                          type: integer
+                        maxDuration:
+                          description: MaxDuration is the maximum amount of time allowed for the backoff strategy
+                          type: string
+                      type: object
+                    limit:
+                      description: Limit is the maximum number of attempts when retrying a container
+                      format: int64
+                      type: integer
+                  type: object
                 syncOptions:
                   description: Options allow you to specify whole app sync-options
                   items:
@@ -815,6 +859,28 @@ spec:
                           description: Name of a user who started operation.
                           type: string
                       type: object
+                    retry:
+                      description: Retry controls failed sync retry behavior
+                      properties:
+                        backoff:
+                          description: Backoff is a backoff strategy
+                          properties:
+                            duration:
+                              description: Duration is the amount to back off. Default unit is seconds, but could also be a duration (e.g. "2m", "1h")
+                              type: string
+                            factor:
+                              description: Factor is a factor to multiply the base duration after each failed retry
+                              format: int64
+                              type: integer
+                            maxDuration:
+                              description: MaxDuration is the maximum amount of time allowed for the backoff strategy
+                              type: string
+                          type: object
+                        limit:
+                          description: Limit is the maximum number of attempts when retrying a container
+                          format: int64
+                          type: integer
+                      type: object
                     sync:
                       description: SyncOperation contains sync operation details.
                       properties:
@@ -1053,6 +1119,10 @@ spec:
                 phase:
                   description: Phase is the current phase of the operation
                   type: string
+                retryCount:
+                  description: RetryCount contains time of operation retries
+                  format: int64
+                  type: integer
                 startedAt:
                   description: StartedAt contains time of operation start
                   format: date-time
diff --git a/manifests/ha/install.yaml b/manifests/ha/install.yaml
index 251aa59e6..77db43844 100644
--- a/manifests/ha/install.yaml
+++ b/manifests/ha/install.yaml
@@ -60,6 +60,32 @@ spec:
                   description: Name of a user who started operation.
                   type: string
               type: object
+            retry:
+              description: Retry controls failed sync retry behavior
+              properties:
+                backoff:
+                  description: Backoff is a backoff strategy
+                  properties:
+                    duration:
+                      description: Duration is the amount to back off. Default unit
+                        is seconds, but could also be a duration (e.g. "2m", "1h")
+                      type: string
+                    factor:
+                      description: Factor is a factor to multiply the base duration
+                        after each failed retry
+                      format: int64
+                      type: integer
+                    maxDuration:
+                      description: MaxDuration is the maximum amount of time allowed
+                        for the backoff strategy
+                      type: string
+                  type: object
+                limit:
+                  description: Limit is the maximum number of attempts when retrying
+                    a container
+                  format: int64
+                  type: integer
+              type: object
             sync:
               description: SyncOperation contains sync operation details.
               properties:
@@ -600,6 +626,33 @@ spec:
                       description: 'SelfHeal enables auto-syncing if  (default: false)'
                       type: boolean
                   type: object
+                retry:
+                  description: Retry controls failed sync retry behavior
+                  properties:
+                    backoff:
+                      description: Backoff is a backoff strategy
+                      properties:
+                        duration:
+                          description: Duration is the amount to back off. Default
+                            unit is seconds, but could also be a duration (e.g. "2m",
+                            "1h")
+                          type: string
+                        factor:
+                          description: Factor is a factor to multiply the base duration
+                            after each failed retry
+                          format: int64
+                          type: integer
+                        maxDuration:
+                          description: MaxDuration is the maximum amount of time allowed
+                            for the backoff strategy
+                          type: string
+                      type: object
+                    limit:
+                      description: Limit is the maximum number of attempts when retrying
+                        a container
+                      format: int64
+                      type: integer
+                  type: object
                 syncOptions:
                   description: Options allow you to specify whole app sync-options
                   items:
@@ -912,6 +965,33 @@ spec:
                           description: Name of a user who started operation.
                           type: string
                       type: object
+                    retry:
+                      description: Retry controls failed sync retry behavior
+                      properties:
+                        backoff:
+                          description: Backoff is a backoff strategy
+                          properties:
+                            duration:
+                              description: Duration is the amount to back off. Default
+                                unit is seconds, but could also be a duration (e.g.
+                                "2m", "1h")
+                              type: string
+                            factor:
+                              description: Factor is a factor to multiply the base
+                                duration after each failed retry
+                              format: int64
+                              type: integer
+                            maxDuration:
+                              description: MaxDuration is the maximum amount of time
+                                allowed for the backoff strategy
+                              type: string
+                          type: object
+                        limit:
+                          description: Limit is the maximum number of attempts when
+                            retrying a container
+                          format: int64
+                          type: integer
+                      type: object
                     sync:
                       description: SyncOperation contains sync operation details.
                       properties:
@@ -1198,6 +1278,10 @@ spec:
                 phase:
                   description: Phase is the current phase of the operation
                   type: string
+                retryCount:
+                  description: RetryCount contains time of operation retries
+                  format: int64
+                  type: integer
                 startedAt:
                   description: StartedAt contains time of operation start
                   format: date-time
diff --git a/manifests/ha/namespace-install.yaml b/manifests/ha/namespace-install.yaml
index 89169fc52..56b18beb6 100644
--- a/manifests/ha/namespace-install.yaml
+++ b/manifests/ha/namespace-install.yaml
@@ -60,6 +60,32 @@ spec:
                   description: Name of a user who started operation.
                   type: string
               type: object
+            retry:
+              description: Retry controls failed sync retry behavior
+              properties:
+                backoff:
+                  description: Backoff is a backoff strategy
+                  properties:
+                    duration:
+                      description: Duration is the amount to back off. Default unit
+                        is seconds, but could also be a duration (e.g. "2m", "1h")
+                      type: string
+                    factor:
+                      description: Factor is a factor to multiply the base duration
+                        after each failed retry
+                      format: int64
+                      type: integer
+                    maxDuration:
+                      description: MaxDuration is the maximum amount of time allowed
+                        for the backoff strategy
+                      type: string
+                  type: object
+                limit:
+                  description: Limit is the maximum number of attempts when retrying
+                    a container
+                  format: int64
+                  type: integer
+              type: object
             sync:
               description: SyncOperation contains sync operation details.
               properties:
@@ -600,6 +626,33 @@ spec:
                       description: 'SelfHeal enables auto-syncing if  (default: false)'
                       type: boolean
                   type: object
+                retry:
+                  description: Retry controls failed sync retry behavior
+                  properties:
+                    backoff:
+                      description: Backoff is a backoff strategy
+                      properties:
+                        duration:
+                          description: Duration is the amount to back off. Default
+                            unit is seconds, but could also be a duration (e.g. "2m",
+                            "1h")
+                          type: string
+                        factor:
+                          description: Factor is a factor to multiply the base duration
+                            after each failed retry
+                          format: int64
+                          type: integer
+                        maxDuration:
+                          description: MaxDuration is the maximum amount of time allowed
+                            for the backoff strategy
+                          type: string
+                      type: object
+                    limit:
+                      description: Limit is the maximum number of attempts when retrying
+                        a container
+                      format: int64
+                      type: integer
+                  type: object
                 syncOptions:
                   description: Options allow you to specify whole app sync-options
                   items:
@@ -912,6 +965,33 @@ spec:
                           description: Name of a user who started operation.
                           type: string
                       type: object
+                    retry:
+                      description: Retry controls failed sync retry behavior
+                      properties:
+                        backoff:
+                          description: Backoff is a backoff strategy
+                          properties:
+                            duration:
+                              description: Duration is the amount to back off. Default
+                                unit is seconds, but could also be a duration (e.g.
+                                "2m", "1h")
+                              type: string
+                            factor:
+                              description: Factor is a factor to multiply the base
+                                duration after each failed retry
+                              format: int64
+                              type: integer
+                            maxDuration:
+                              description: MaxDuration is the maximum amount of time
+                                allowed for the backoff strategy
+                              type: string
+                          type: object
+                        limit:
+                          description: Limit is the maximum number of attempts when
+                            retrying a container
+                          format: int64
+                          type: integer
+                      type: object
                     sync:
                       description: SyncOperation contains sync operation details.
                       properties:
@@ -1198,6 +1278,10 @@ spec:
                 phase:
                   description: Phase is the current phase of the operation
                   type: string
+                retryCount:
+                  description: RetryCount contains time of operation retries
+                  format: int64
+                  type: integer
                 startedAt:
                   description: StartedAt contains time of operation start
                   format: date-time
diff --git a/manifests/install.yaml b/manifests/install.yaml
index b10386275..0b21f41a3 100644
--- a/manifests/install.yaml
+++ b/manifests/install.yaml
@@ -60,6 +60,32 @@ spec:
                   description: Name of a user who started operation.
                   type: string
               type: object
+            retry:
+              description: Retry controls failed sync retry behavior
+              properties:
+                backoff:
+                  description: Backoff is a backoff strategy
+                  properties:
+                    duration:
+                      description: Duration is the amount to back off. Default unit
+                        is seconds, but could also be a duration (e.g. "2m", "1h")
+                      type: string
+                    factor:
+                      description: Factor is a factor to multiply the base duration
+                        after each failed retry
+                      format: int64
+                      type: integer
+                    maxDuration:
+                      description: MaxDuration is the maximum amount of time allowed
+                        for the backoff strategy
+                      type: string
+                  type: object
+                limit:
+                  description: Limit is the maximum number of attempts when retrying
+                    a container
+                  format: int64
+                  type: integer
+              type: object
             sync:
               description: SyncOperation contains sync operation details.
               properties:
@@ -600,6 +626,33 @@ spec:
                       description: 'SelfHeal enables auto-syncing if  (default: false)'
                       type: boolean
                   type: object
+                retry:
+                  description: Retry controls failed sync retry behavior
+                  properties:
+                    backoff:
+                      description: Backoff is a backoff strategy
+                      properties:
+                        duration:
+                          description: Duration is the amount to back off. Default
+                            unit is seconds, but could also be a duration (e.g. "2m",
+                            "1h")
+                          type: string
+                        factor:
+                          description: Factor is a factor to multiply the base duration
+                            after each failed retry
+                          format: int64
+                          type: integer
+                        maxDuration:
+                          description: MaxDuration is the maximum amount of time allowed
+                            for the backoff strategy
+                          type: string
+                      type: object
+                    limit:
+                      description: Limit is the maximum number of attempts when retrying
+                        a container
+                      format: int64
+                      type: integer
+                  type: object
                 syncOptions:
                   description: Options allow you to specify whole app sync-options
                   items:
@@ -912,6 +965,33 @@ spec:
                           description: Name of a user who started operation.
                           type: string
                       type: object
+                    retry:
+                      description: Retry controls failed sync retry behavior
+                      properties:
+                        backoff:
+                          description: Backoff is a backoff strategy
+                          properties:
+                            duration:
+                              description: Duration is the amount to back off. Default
+                                unit is seconds, but could also be a duration (e.g.
+                                "2m", "1h")
+                              type: string
+                            factor:
+                              description: Factor is a factor to multiply the base
+                                duration after each failed retry
+                              format: int64
+                              type: integer
+                            maxDuration:
+                              description: MaxDuration is the maximum amount of time
+                                allowed for the backoff strategy
+                              type: string
+                          type: object
+                        limit:
+                          description: Limit is the maximum number of attempts when
+                            retrying a container
+                          format: int64
+                          type: integer
+                      type: object
                     sync:
                       description: SyncOperation contains sync operation details.
                       properties:
@@ -1198,6 +1278,10 @@ spec:
                 phase:
                   description: Phase is the current phase of the operation
                   type: string
+                retryCount:
+                  description: RetryCount contains time of operation retries
+                  format: int64
+                  type: integer
                 startedAt:
                   description: StartedAt contains time of operation start
                   format: date-time
@@ -2602,6 +2686,11 @@ spec:
         name: redis
         ports:
         - containerPort: 6379
+      securityContext:
+        fsGroup: 1000
+        runAsGroup: 1000
+        runAsNonRoot: true
+        runAsUser: 1000
 ---
 apiVersion: apps/v1
 kind: Deployment
diff --git a/manifests/namespace-install.yaml b/manifests/namespace-install.yaml
index 2705f26ca..15c54145c 100644
--- a/manifests/namespace-install.yaml
+++ b/manifests/namespace-install.yaml
@@ -60,6 +60,32 @@ spec:
                   description: Name of a user who started operation.
                   type: string
               type: object
+            retry:
+              description: Retry controls failed sync retry behavior
+              properties:
+                backoff:
+                  description: Backoff is a backoff strategy
+                  properties:
+                    duration:
+                      description: Duration is the amount to back off. Default unit
+                        is seconds, but could also be a duration (e.g. "2m", "1h")
+                      type: string
+                    factor:
+                      description: Factor is a factor to multiply the base duration
+                        after each failed retry
+                      format: int64
+                      type: integer
+                    maxDuration:
+                      description: MaxDuration is the maximum amount of time allowed
+                        for the backoff strategy
+                      type: string
+                  type: object
+                limit:
+                  description: Limit is the maximum number of attempts when retrying
+                    a container
+                  format: int64
+                  type: integer
+              type: object
             sync:
               description: SyncOperation contains sync operation details.
               properties:
@@ -600,6 +626,33 @@ spec:
                       description: 'SelfHeal enables auto-syncing if  (default: false)'
                       type: boolean
                   type: object
+                retry:
+                  description: Retry controls failed sync retry behavior
+                  properties:
+                    backoff:
+                      description: Backoff is a backoff strategy
+                      properties:
+                        duration:
+                          description: Duration is the amount to back off. Default
+                            unit is seconds, but could also be a duration (e.g. "2m",
+                            "1h")
+                          type: string
+                        factor:
+                          description: Factor is a factor to multiply the base duration
+                            after each failed retry
+                          format: int64
+                          type: integer
+                        maxDuration:
+                          description: MaxDuration is the maximum amount of time allowed
+                            for the backoff strategy
+                          type: string
+                      type: object
+                    limit:
+                      description: Limit is the maximum number of attempts when retrying
+                        a container
+                      format: int64
+                      type: integer
+                  type: object
                 syncOptions:
                   description: Options allow you to specify whole app sync-options
                   items:
@@ -912,6 +965,33 @@ spec:
                           description: Name of a user who started operation.
                           type: string
                       type: object
+                    retry:
+                      description: Retry controls failed sync retry behavior
+                      properties:
+                        backoff:
+                          description: Backoff is a backoff strategy
+                          properties:
+                            duration:
+                              description: Duration is the amount to back off. Default
+                                unit is seconds, but could also be a duration (e.g.
+                                "2m", "1h")
+                              type: string
+                            factor:
+                              description: Factor is a factor to multiply the base
+                                duration after each failed retry
+                              format: int64
+                              type: integer
+                            maxDuration:
+                              description: MaxDuration is the maximum amount of time
+                                allowed for the backoff strategy
+                              type: string
+                          type: object
+                        limit:
+                          description: Limit is the maximum number of attempts when
+                            retrying a container
+                          format: int64
+                          type: integer
+                      type: object
                     sync:
                       description: SyncOperation contains sync operation details.
                       properties:
@@ -1198,6 +1278,10 @@ spec:
                 phase:
                   description: Phase is the current phase of the operation
                   type: string
+                retryCount:
+                  description: RetryCount contains time of operation retries
+                  format: int64
+                  type: integer
                 startedAt:
                   description: StartedAt contains time of operation start
                   format: date-time
@@ -2517,6 +2601,11 @@ spec:
         name: redis
         ports:
         - containerPort: 6379
+      securityContext:
+        fsGroup: 1000
+        runAsGroup: 1000
+        runAsNonRoot: true
+        runAsUser: 1000
 ---
 apiVersion: apps/v1
 kind: Deployment
diff --git a/pkg/apiclient/application/application.pb.go b/pkg/apiclient/application/application.pb.go
index 40784ded6..f622cad16 100644
--- a/pkg/apiclient/application/application.pb.go
+++ b/pkg/apiclient/application/application.pb.go
@@ -513,6 +513,7 @@ type ApplicationSyncRequest struct {
 	Resources            []v1alpha1.SyncOperationResource `protobuf:"bytes,7,rep,name=resources" json:"resources"`
 	Manifests            []string                         `protobuf:"bytes,8,rep,name=manifests" json:"manifests,omitempty"`
 	Infos                []*v1alpha1.Info                 `protobuf:"bytes,9,rep,name=infos" json:"infos,omitempty"`
+	RetryStrategy        *v1alpha1.RetryStrategy          `protobuf:"bytes,10,opt,name=retryStrategy" json:"retryStrategy,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
 	XXX_unrecognized     []byte                           `json:"-"`
 	XXX_sizecache        int32                            `json:"-"`
@@ -607,6 +608,13 @@ func (m *ApplicationSyncRequest) GetInfos() []*v1alpha1.Info {
 	return nil
 }
 
+func (m *ApplicationSyncRequest) GetRetryStrategy() *v1alpha1.RetryStrategy {
+	if m != nil {
+		return m.RetryStrategy
+	}
+	return nil
+}
+
 // ApplicationUpdateSpecRequest is a request to update application spec
 type ApplicationUpdateSpecRequest struct {
 	Name                 *string                  `protobuf:"bytes,1,req,name=name" json:"name,omitempty"`
@@ -1866,138 +1874,139 @@ func init() {
 }
 
 var fileDescriptor_df6e82b174b5eaec = []byte{
-	// 2082 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x59, 0xcd, 0x6f, 0x1c, 0x49,
-	0x15, 0xa7, 0x66, 0x6c, 0xcf, 0xf8, 0x39, 0xbb, 0xc9, 0xd6, 0x6e, 0x42, 0x6f, 0x67, 0xe2, 0x8c,
+	// 2103 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5a, 0xcd, 0x6f, 0x1c, 0x49,
+	0x15, 0xa7, 0xc6, 0x63, 0xcf, 0xf8, 0x39, 0xbb, 0xc9, 0xd6, 0x6e, 0x42, 0x6f, 0x67, 0xe2, 0x8c,
 	0x2a, 0x89, 0xe3, 0x38, 0x71, 0x4f, 0x6c, 0x02, 0x2c, 0x06, 0x29, 0xc4, 0x9b, 0xe0, 0x18, 0x9c,
-	0x60, 0xc6, 0x09, 0x2b, 0x21, 0x21, 0xd4, 0xdb, 0x5d, 0x1e, 0x37, 0x9e, 0xe9, 0x6e, 0xba, 0x7b,
+	0x60, 0xda, 0x09, 0x2b, 0x21, 0x21, 0xd4, 0xdb, 0x5d, 0x1e, 0x37, 0x9e, 0xe9, 0x6e, 0xba, 0x7b,
 	0x26, 0x1a, 0xa2, 0x1c, 0x58, 0x10, 0xe2, 0x80, 0x40, 0x08, 0x0e, 0x0b, 0xe2, 0x4b, 0xcb, 0x95,
-	0x1b, 0xe2, 0xc2, 0x81, 0x1b, 0x68, 0x8f, 0x88, 0xdd, 0x03, 0xa7, 0x08, 0x59, 0xfc, 0x01, 0x9c,
-	0x38, 0xa3, 0xaa, 0xae, 0xea, 0xae, 0x9a, 0xcc, 0xf4, 0x4c, 0xd6, 0xb3, 0x87, 0xdc, 0xa6, 0x5e,
-	0x55, 0xbf, 0xf7, 0x7b, 0x1f, 0xf5, 0xab, 0xaa, 0x37, 0x70, 0x31, 0xa6, 0x51, 0x8f, 0x46, 0x0d,
-	0x3b, 0x0c, 0xdb, 0x9e, 0x63, 0x27, 0x5e, 0xe0, 0xab, 0xbf, 0xad, 0x30, 0x0a, 0x92, 0x00, 0x2f,
-	0x28, 0x22, 0xf3, 0xb5, 0x56, 0xd0, 0x0a, 0xb8, 0xbc, 0xc1, 0x7e, 0xa5, 0x4b, 0xcc, 0x5a, 0x2b,
-	0x08, 0x5a, 0x6d, 0xda, 0xb0, 0x43, 0xaf, 0x61, 0xfb, 0x7e, 0x90, 0xf0, 0xc5, 0xb1, 0x98, 0x25,
-	0x87, 0x6f, 0xc4, 0x96, 0x17, 0xf0, 0x59, 0x27, 0x88, 0x68, 0xa3, 0xb7, 0xd6, 0x68, 0x51, 0x9f,
-	0x46, 0x76, 0x42, 0x5d, 0xb1, 0xe6, 0x46, 0xbe, 0xa6, 0x63, 0x3b, 0x07, 0x9e, 0x4f, 0xa3, 0x7e,
-	0x23, 0x3c, 0x6c, 0x31, 0x41, 0xdc, 0xe8, 0xd0, 0xc4, 0x1e, 0xf6, 0xd5, 0x76, 0xcb, 0x4b, 0x0e,
-	0xba, 0x6f, 0x5b, 0x4e, 0xd0, 0x69, 0xd8, 0x11, 0x07, 0xf6, 0x6d, 0xfe, 0x63, 0xd5, 0x71, 0xf3,
-	0xaf, 0x55, 0xf7, 0x7a, 0x6b, 0x76, 0x3b, 0x3c, 0xb0, 0x9f, 0x55, 0xb5, 0x59, 0xa4, 0x2a, 0xa2,
-	0x61, 0x20, 0x62, 0xc5, 0x7f, 0x7a, 0x49, 0x10, 0xf5, 0x95, 0x9f, 0xa9, 0x0e, 0xf2, 0x17, 0x04,
-	0xa7, 0x6e, 0xe5, 0xc6, 0xbe, 0xd6, 0xa5, 0x51, 0x1f, 0x63, 0x98, 0xf1, 0xed, 0x0e, 0x35, 0x50,
-	0x1d, 0x2d, 0xcf, 0x37, 0xf9, 0x6f, 0x6c, 0x40, 0x25, 0xa2, 0xfb, 0x11, 0x8d, 0x0f, 0x8c, 0x12,
-	0x17, 0xcb, 0x21, 0x5e, 0x82, 0x0a, 0xb3, 0x4c, 0x9d, 0xc4, 0x28, 0xd7, 0xcb, 0xcb, 0xf3, 0x9b,
-	0x27, 0x8e, 0x9e, 0x9e, 0xaf, 0xee, 0xa6, 0xa2, 0xb8, 0x29, 0x27, 0xb1, 0x05, 0x27, 0x23, 0x1a,
-	0x07, 0xdd, 0xc8, 0xa1, 0x5f, 0xa7, 0x51, 0xec, 0x05, 0xbe, 0x31, 0xc3, 0x34, 0x6d, 0xce, 0xbc,
-	0xff, 0xf4, 0xfc, 0x27, 0x9a, 0x83, 0x93, 0xb8, 0x0e, 0xd5, 0x98, 0xb6, 0xa9, 0x93, 0x04, 0x91,
-	0x31, 0xab, 0x2c, 0xcc, 0xa4, 0x64, 0x0b, 0x4e, 0x37, 0x69, 0xcf, 0x63, 0xab, 0xef, 0xd1, 0xc4,
-	0x76, 0xed, 0xc4, 0x1e, 0x74, 0xa0, 0x94, 0x39, 0x60, 0x42, 0x35, 0x12, 0x8b, 0x8d, 0x12, 0x97,
-	0x67, 0x63, 0x16, 0x85, 0x45, 0x25, 0x0a, 0x4d, 0x81, 0xe4, 0x4e, 0x8f, 0xfa, 0x49, 0x3c, 0x5a,
-	0xe5, 0x3a, 0xbc, 0x22, 0x41, 0xdf, 0xb7, 0x3b, 0x34, 0x0e, 0x6d, 0x87, 0xa6, 0xba, 0x05, 0xd4,
-	0x67, 0xa7, 0xf1, 0x32, 0x9c, 0x50, 0x85, 0x46, 0x59, 0x59, 0xae, 0xcd, 0xe0, 0x25, 0x58, 0x90,
-	0xe3, 0x87, 0xdb, 0xb7, 0x8d, 0x19, 0x65, 0xa1, 0x3a, 0x41, 0x76, 0xc1, 0x50, 0xb0, 0xdf, 0xb3,
-	0x7d, 0x6f, 0x9f, 0xc6, 0xc9, 0x68, 0xd4, 0x75, 0x2d, 0x10, 0x4a, 0x5c, 0xb3, 0x70, 0x9c, 0x86,
-	0x57, 0xf5, 0x68, 0x84, 0x81, 0x1f, 0x53, 0xf2, 0x1e, 0xd2, 0x2c, 0xbd, 0x19, 0x51, 0x3b, 0xa1,
-	0x4d, 0xfa, 0x9d, 0x2e, 0x8d, 0x13, 0xec, 0x83, 0xba, 0xe9, 0xb8, 0xc1, 0x85, 0xf5, 0x2f, 0x59,
-	0x79, 0x89, 0x5a, 0xb2, 0x44, 0xf9, 0x8f, 0x6f, 0x39, 0xae, 0x15, 0x1e, 0xb6, 0x2c, 0x56, 0xed,
-	0x96, 0xba, 0x81, 0x65, 0xb5, 0x5b, 0x8a, 0x25, 0xe9, 0xb5, 0xb2, 0x0e, 0x9f, 0x81, 0xb9, 0x6e,
-	0x18, 0xd3, 0x28, 0xe1, 0x3e, 0x54, 0x9b, 0x62, 0x44, 0x7e, 0xa0, 0x83, 0x7c, 0x18, 0xba, 0x0a,
-	0xc8, 0x83, 0x8f, 0x11, 0xa4, 0x06, 0x8f, 0xdc, 0xd5, 0x50, 0xdc, 0xa6, 0x6d, 0x9a, 0xa3, 0x18,
-	0x96, 0x14, 0x03, 0x2a, 0x8e, 0x1d, 0x3b, 0xb6, 0x4b, 0x85, 0x3f, 0x72, 0x48, 0xfe, 0x55, 0x86,
-	0x33, 0x8a, 0xaa, 0xbd, 0xbe, 0xef, 0x14, 0x29, 0x1a, 0x9b, 0x5d, 0x5c, 0x83, 0x39, 0x37, 0xea,
-	0x37, 0xbb, 0xbe, 0x51, 0x66, 0x96, 0xc4, 0xbc, 0x90, 0x61, 0x13, 0x66, 0xc3, 0xa8, 0xeb, 0x53,
-	0xbe, 0x37, 0xe5, 0x64, 0x2a, 0xc2, 0x0e, 0x54, 0xe3, 0x84, 0x31, 0x50, 0xab, 0xcf, 0x77, 0xe4,
-	0xc2, 0xfa, 0xd6, 0x31, 0x62, 0xc7, 0x3c, 0xd9, 0x13, 0xea, 0x9a, 0x99, 0x62, 0x9c, 0xc0, 0xbc,
-	0xac, 0xee, 0xd8, 0xa8, 0xd4, 0xcb, 0xcb, 0x0b, 0xeb, 0xbb, 0xc7, 0xb4, 0xf2, 0xd5, 0x90, 0xf1,
-	0xa6, 0xb2, 0xb1, 0x85, 0x5b, 0xb9, 0x21, 0x5c, 0x83, 0xf9, 0x8e, 0xd8, 0x39, 0xb1, 0x51, 0x65,
-	0x34, 0xd6, 0xcc, 0x05, 0xf8, 0x21, 0xcc, 0x7a, 0xfe, 0x7e, 0x10, 0x1b, 0xf3, 0x1c, 0xcf, 0xcd,
-	0x63, 0xe0, 0xd9, 0xf6, 0xf7, 0x83, 0x66, 0xaa, 0x8d, 0xbc, 0x8b, 0xa0, 0xf6, 0x4c, 0xad, 0xee,
-	0x85, 0xb4, 0x30, 0xc1, 0x2e, 0xcc, 0xc4, 0x21, 0x75, 0x38, 0xcf, 0x2c, 0xac, 0x7f, 0x79, 0x3a,
-	0xc5, 0xcb, 0x8c, 0x8a, 0xa0, 0x70, 0xed, 0xa4, 0x03, 0x9f, 0x54, 0xa6, 0x77, 0xed, 0xc4, 0x39,
-	0x28, 0x02, 0xc5, 0xaa, 0x86, 0xad, 0xd1, 0xd8, 0x2f, 0x15, 0x61, 0x02, 0xf3, 0xfc, 0xc7, 0x83,
-	0x7e, 0xa8, 0xd3, 0x5d, 0x2e, 0x26, 0x3f, 0x44, 0x60, 0xaa, 0x7b, 0x29, 0x68, 0xb7, 0xdf, 0xb6,
-	0x9d, 0xc3, 0x62, 0x93, 0x25, 0xcf, 0xe5, 0xf6, 0xca, 0x9b, 0xc0, 0xf4, 0x1d, 0x3d, 0x3d, 0x5f,
-	0xda, 0xbe, 0xdd, 0x2c, 0x79, 0xee, 0x47, 0x2f, 0x71, 0xf2, 0xe1, 0x00, 0x10, 0x51, 0x20, 0x45,
-	0x40, 0x08, 0xcc, 0xfb, 0x43, 0xd9, 0x3f, 0x17, 0x3f, 0x07, 0xeb, 0x2f, 0x42, 0xa5, 0x97, 0x9d,
-	0x8e, 0xf9, 0x22, 0x29, 0x64, 0xe0, 0x5b, 0x51, 0xd0, 0x0d, 0x8d, 0x59, 0x35, 0xd2, 0x5c, 0x84,
-	0x0d, 0x98, 0x39, 0xf4, 0x7c, 0xd7, 0x98, 0x53, 0xa6, 0xb8, 0x84, 0xfc, 0xb2, 0x04, 0xe7, 0x87,
-	0xb8, 0x35, 0x36, 0xaf, 0x2f, 0x80, 0x6f, 0x79, 0xed, 0x55, 0xc6, 0xd4, 0x5e, 0x75, 0x78, 0xed,
-	0xfd, 0x0f, 0x41, 0x7d, 0x48, 0x6c, 0xc6, 0x73, 0xf6, 0x0b, 0x12, 0x9c, 0xfd, 0x20, 0x72, 0xa8,
-	0x51, 0xc9, 0x6a, 0x1d, 0x35, 0x53, 0x11, 0xf9, 0x2f, 0x02, 0x43, 0x7a, 0x7b, 0xcb, 0xe1, 0xbe,
-	0x77, 0xfd, 0x17, 0xdd, 0xe1, 0x1a, 0xcc, 0xd9, 0xdc, 0x17, 0xad, 0x1c, 0x84, 0x8c, 0xfc, 0x08,
-	0xc1, 0x59, 0xdd, 0xe5, 0x78, 0xc7, 0x8b, 0x13, 0x79, 0xc5, 0xc1, 0x1e, 0x54, 0xd2, 0x95, 0xb1,
-	0x81, 0x38, 0xd5, 0x6f, 0x1f, 0x83, 0x5f, 0x75, 0x43, 0xd2, 0x3d, 0xa1, 0x9f, 0xdc, 0x84, 0xb3,
-	0x43, 0x89, 0x46, 0x20, 0xa9, 0x43, 0x55, 0x9e, 0x3f, 0x69, 0x0e, 0xe4, 0x39, 0x2e, 0xa5, 0xe4,
-	0x6f, 0x25, 0x9d, 0xa3, 0x03, 0x77, 0x27, 0x68, 0x15, 0xdc, 0x56, 0x27, 0xc9, 0x9e, 0x01, 0x95,
-	0x30, 0x70, 0xf3, 0xc4, 0x35, 0xe5, 0x90, 0x7d, 0xed, 0x04, 0x7e, 0x62, 0xb3, 0x67, 0x8e, 0x96,
-	0xaf, 0x5c, 0xcc, 0x72, 0x1f, 0x7b, 0xbe, 0x43, 0xf7, 0xa8, 0x13, 0xf8, 0x6e, 0xcc, 0x13, 0x57,
-	0x96, 0xb9, 0x57, 0x67, 0xf0, 0x5d, 0x98, 0xe7, 0xe3, 0x07, 0x5e, 0x87, 0x1a, 0x73, 0xfc, 0x2a,
-	0xb1, 0x62, 0xa5, 0xef, 0x29, 0x4b, 0x7d, 0x4f, 0xe5, 0x11, 0x66, 0xef, 0x29, 0xab, 0xb7, 0x66,
-	0xb1, 0x2f, 0x9a, 0xf9, 0xc7, 0x0c, 0x57, 0x62, 0x7b, 0xed, 0x1d, 0xcf, 0xe7, 0xd7, 0x85, 0xdc,
-	0x60, 0x2e, 0x66, 0x35, 0xb1, 0x1f, 0xb4, 0xdb, 0xc1, 0x23, 0x4e, 0x01, 0xd9, 0x71, 0x90, 0xca,
-	0xc8, 0x77, 0xa1, 0xba, 0x13, 0xb4, 0xee, 0xf8, 0x49, 0xd4, 0x67, 0x35, 0xc9, 0xdc, 0xa1, 0xbe,
-	0x1e, 0x74, 0x29, 0xc4, 0xf7, 0x61, 0x3e, 0xf1, 0x3a, 0x74, 0x2f, 0xb1, 0x3b, 0xa1, 0x38, 0x81,
-	0x9f, 0x03, 0x77, 0x86, 0x4c, 0xaa, 0x20, 0x0d, 0x78, 0x3d, 0xbb, 0x9c, 0x3c, 0xa0, 0x51, 0xc7,
-	0xf3, 0xed, 0x42, 0xce, 0x21, 0x6b, 0x5a, 0xd5, 0xb0, 0xcb, 0xcd, 0x5b, 0x9e, 0xef, 0x06, 0x8f,
-	0x46, 0xe7, 0x9d, 0xfc, 0x53, 0x7f, 0xdc, 0x28, 0xdf, 0x64, 0xc5, 0x76, 0x17, 0x5e, 0x62, 0x65,
-	0xd9, 0xa3, 0x62, 0x42, 0x14, 0x3f, 0xd1, 0xea, 0x7a, 0xa8, 0x8e, 0xa6, 0xfe, 0x21, 0xde, 0x81,
-	0x93, 0x76, 0x1c, 0x7b, 0x2d, 0x9f, 0xba, 0x52, 0x57, 0x69, 0x62, 0x5d, 0x83, 0x9f, 0xa6, 0xb7,
-	0x62, 0xbe, 0x82, 0x97, 0x23, 0xbf, 0x15, 0xf3, 0x21, 0xf9, 0x3e, 0x82, 0xd3, 0x43, 0x95, 0xb0,
-	0x10, 0x70, 0x6a, 0x10, 0x21, 0x10, 0x2c, 0x58, 0x8d, 0x9d, 0x03, 0xea, 0x76, 0xdb, 0x54, 0xbe,
-	0xfd, 0xe4, 0x98, 0xcd, 0xb9, 0xdd, 0x34, 0x03, 0xa2, 0xe6, 0xb3, 0x31, 0x5e, 0x04, 0xe8, 0xd8,
-	0x7e, 0xd7, 0x6e, 0x73, 0x08, 0x33, 0x1c, 0x82, 0x22, 0x21, 0x35, 0x30, 0x87, 0xa5, 0x4f, 0xbc,
-	0x97, 0x3e, 0x44, 0xf0, 0xb2, 0xdc, 0xd7, 0x22, 0x3f, 0x16, 0x9c, 0x54, 0xc2, 0x70, 0x3f, 0x4b,
-	0x95, 0x20, 0xe6, 0xc1, 0xc9, 0xc1, 0x3d, 0x8b, 0x86, 0xef, 0xd9, 0x34, 0xe7, 0x65, 0x65, 0x3a,
-	0xdd, 0xf1, 0x1a, 0xc3, 0xa2, 0x42, 0x86, 0x45, 0xa3, 0x19, 0x16, 0x0d, 0xdc, 0x25, 0xfa, 0x60,
-	0xdc, 0xb3, 0x7d, 0xbb, 0x45, 0xdd, 0xcc, 0xb9, 0xac, 0x90, 0xbe, 0x09, 0xb3, 0x5e, 0x42, 0x3b,
-	0xb2, 0x80, 0xb6, 0xa6, 0xc0, 0x9e, 0xb7, 0xbd, 0xfd, 0xfd, 0x66, 0xaa, 0x75, 0xfd, 0x83, 0x1a,
-	0x60, 0x35, 0xeb, 0x34, 0xea, 0x79, 0x0e, 0xc5, 0x3f, 0x45, 0x30, 0xc3, 0x68, 0x1c, 0x9f, 0x1b,
-	0x55, 0x64, 0x3c, 0xfa, 0xe6, 0x94, 0x2e, 0xcb, 0xcc, 0x14, 0xa9, 0xbd, 0xf3, 0xc1, 0x7f, 0x7e,
-	0x5e, 0x3a, 0x83, 0x5f, 0xe3, 0x3d, 0xa2, 0xde, 0x9a, 0xda, 0xb2, 0x89, 0xf1, 0x8f, 0x11, 0x60,
-	0x71, 0xb0, 0x28, 0x9d, 0x04, 0x7c, 0x75, 0x14, 0xbe, 0x21, 0x1d, 0x07, 0xf3, 0x9c, 0x42, 0x2c,
-	0x96, 0x13, 0x44, 0x94, 0xd1, 0x08, 0x5f, 0xc0, 0x01, 0xac, 0x70, 0x00, 0x17, 0x31, 0x19, 0x06,
-	0xa0, 0xf1, 0x98, 0x15, 0xc0, 0x93, 0x06, 0x4d, 0xed, 0xfe, 0x0e, 0xc1, 0xec, 0x5b, 0xfc, 0x42,
-	0x34, 0x26, 0x42, 0xbb, 0xd3, 0x89, 0x10, 0xb7, 0xc5, 0xa1, 0x92, 0x0b, 0x1c, 0xe6, 0x39, 0x7c,
-	0x56, 0xc2, 0x8c, 0x93, 0x88, 0xda, 0x1d, 0x0d, 0xed, 0x75, 0x84, 0xdf, 0x43, 0x30, 0x97, 0x36,
-	0x14, 0xf0, 0xa5, 0x51, 0x10, 0xb5, 0x86, 0x83, 0x39, 0xa5, 0x67, 0x3b, 0xb9, 0xc2, 0x01, 0x5e,
-	0x20, 0x43, 0x13, 0xb9, 0xa1, 0xf5, 0x1c, 0x7e, 0x86, 0xa0, 0xbc, 0x45, 0xc7, 0x96, 0xd9, 0xb4,
-	0x90, 0x3d, 0x13, 0xba, 0x21, 0x19, 0xc6, 0x7f, 0x40, 0xf0, 0xfa, 0x16, 0x4d, 0x86, 0x13, 0x3c,
-	0x5e, 0x1e, 0xcf, 0xba, 0xa2, 0xda, 0xae, 0x4e, 0xb0, 0x32, 0x63, 0xb6, 0x06, 0x47, 0x76, 0x05,
-	0x5f, 0x2e, 0xaa, 0xbd, 0xb8, 0xef, 0x3b, 0x8f, 0x04, 0x8e, 0xbf, 0x23, 0x38, 0x35, 0xd8, 0xaa,
-	0xc3, 0xfa, 0x91, 0x30, 0xb4, 0x93, 0x67, 0x7e, 0xe5, 0x58, 0x0c, 0xa2, 0x6b, 0x24, 0xb7, 0x38,
-	0xec, 0xcf, 0xe3, 0xcf, 0x15, 0xc1, 0x96, 0x7d, 0x92, 0xb8, 0xf1, 0x58, 0xfe, 0x7c, 0xc2, 0xbb,
-	0xb9, 0x1c, 0xf3, 0x3b, 0x08, 0x4e, 0x6c, 0xd1, 0xe4, 0x5e, 0xd6, 0x1a, 0x18, 0x59, 0xad, 0x5a,
-	0x23, 0xce, 0xac, 0x59, 0x4a, 0xeb, 0x55, 0x4e, 0x65, 0xf1, 0x5c, 0xe5, 0xc0, 0x2e, 0xe3, 0x4b,
-	0x45, 0xc0, 0xf2, 0x76, 0xc4, 0x5f, 0x11, 0xcc, 0xa5, 0xcd, 0x82, 0xd1, 0xe6, 0xb5, 0xc6, 0xd7,
-	0xd4, 0x4a, 0xf2, 0x0e, 0x07, 0x7a, 0xd3, 0xbc, 0x3e, 0x1c, 0xa8, 0xfa, 0xbd, 0x0c, 0x99, 0xc5,
-	0xd1, 0xeb, 0x1b, 0xe9, 0x4f, 0x08, 0x20, 0xef, 0x76, 0xe0, 0x2b, 0xc5, 0x4e, 0x28, 0x1d, 0x11,
-	0x73, 0x8a, 0xfd, 0x0e, 0x62, 0x71, 0x67, 0x96, 0xcd, 0x7a, 0x61, 0x15, 0x87, 0xd4, 0xd9, 0xe0,
-	0x3d, 0x11, 0xfc, 0x1b, 0x04, 0xb3, 0xfc, 0xc5, 0x8c, 0x2f, 0x8e, 0x02, 0xac, 0x3e, 0xa8, 0xa7,
-	0x16, 0xf4, 0x25, 0x8e, 0xb3, 0xbe, 0x5e, 0xc4, 0x03, 0x1b, 0x68, 0x05, 0xf7, 0x60, 0x2e, 0x7d,
-	0xb4, 0x8e, 0xae, 0x0a, 0xed, 0x51, 0x6b, 0xd6, 0x0b, 0x8e, 0xa3, 0xb4, 0x30, 0x05, 0x05, 0xad,
-	0x14, 0x52, 0xd0, 0xef, 0x11, 0xcc, 0x30, 0x96, 0xc0, 0x17, 0x8a, 0x38, 0x64, 0xda, 0x51, 0xb9,
-	0xca, 0xa1, 0x5d, 0x22, 0xf5, 0x71, 0x1c, 0xc4, 0x42, 0xf3, 0x2e, 0x82, 0x53, 0x83, 0x97, 0x16,
-	0x7c, 0x76, 0x80, 0x7f, 0xd4, 0x9b, 0x9a, 0xa9, 0x87, 0x70, 0xd4, 0x85, 0x87, 0x7c, 0x91, 0xa3,
-	0xd8, 0xc0, 0x6f, 0x8c, 0xdd, 0x10, 0xf7, 0xe5, 0x26, 0x66, 0x8a, 0x56, 0xf3, 0xce, 0xe3, 0x9f,
-	0x11, 0x9c, 0x90, 0x7a, 0x1f, 0x44, 0x94, 0x16, 0xc3, 0x9a, 0x52, 0xfd, 0x33, 0x43, 0xe4, 0x0b,
-	0x1c, 0xfb, 0x67, 0xf0, 0x8d, 0x09, 0xb1, 0x4b, 0xcc, 0xab, 0x09, 0x83, 0xf9, 0x47, 0x04, 0x55,
-	0xd9, 0xa7, 0xc3, 0x97, 0x47, 0x56, 0x92, 0xde, 0xc9, 0x9b, 0x5a, 0xf6, 0xc5, 0x09, 0x44, 0x2e,
-	0x16, 0x52, 0xb9, 0x30, 0xce, 0x2a, 0xe0, 0x17, 0x08, 0x70, 0x76, 0x45, 0xcf, 0x2e, 0xed, 0x78,
-	0x49, 0x33, 0x35, 0xf2, 0x2d, 0x66, 0x5e, 0x1e, 0xbb, 0x4e, 0xa7, 0xf2, 0x95, 0x42, 0x2a, 0x0f,
-	0x32, 0xfb, 0x3f, 0x41, 0xb0, 0xb0, 0x45, 0xb3, 0x7b, 0x62, 0x41, 0x20, 0xf5, 0x4e, 0xa4, 0xb9,
-	0x3c, 0x7e, 0xa1, 0x40, 0x74, 0x8d, 0x23, 0x5a, 0xc2, 0xc5, 0xa1, 0x92, 0x00, 0x7e, 0x8d, 0xe0,
-	0x25, 0xc1, 0x62, 0x42, 0x72, 0x6d, 0x9c, 0x25, 0x8d, 0xf4, 0x26, 0xc7, 0xf5, 0x29, 0x8e, 0x6b,
-	0x95, 0x4c, 0x84, 0x6b, 0x43, 0x34, 0xf4, 0x7e, 0x8b, 0xe0, 0x55, 0xf5, 0x62, 0x2d, 0x9a, 0x38,
-	0x1f, 0x35, 0x6e, 0x05, 0xbd, 0x20, 0x72, 0x83, 0xe3, 0xb3, 0xf0, 0xb5, 0x49, 0xf0, 0x35, 0x44,
-	0x5b, 0x07, 0xff, 0x0a, 0xc1, 0x2b, 0xbc, 0x8d, 0xa6, 0x2a, 0x1e, 0x20, 0xe4, 0x51, 0x4d, 0xb7,
-	0x09, 0x08, 0x59, 0xec, 0x59, 0xf2, 0x5c, 0xa0, 0x36, 0x44, 0xfb, 0x8b, 0x3d, 0x94, 0x5e, 0x96,
-	0x47, 0x80, 0xc8, 0xee, 0xea, 0xb8, 0xc0, 0x3d, 0xef, 0x91, 0x21, 0xca, 0x6d, 0x65, 0xb2, 0x72,
-	0xfb, 0x1e, 0x82, 0x8a, 0xe8, 0x5c, 0x15, 0x9c, 0xaa, 0x4a, 0x6b, 0xcb, 0x3c, 0xad, 0xad, 0x92,
-	0x9d, 0x1b, 0xf2, 0x59, 0x6e, 0x76, 0x0d, 0x37, 0x8a, 0xcc, 0x86, 0x81, 0x1b, 0x37, 0x1e, 0x8b,
-	0x96, 0xd6, 0x93, 0x46, 0x3b, 0x68, 0xc5, 0xd7, 0xd1, 0xe6, 0x9b, 0xef, 0x1f, 0x2d, 0xa2, 0x7f,
-	0x1c, 0x2d, 0xa2, 0x7f, 0x1f, 0x2d, 0xa2, 0x6f, 0x7c, 0x7a, 0x82, 0x3f, 0xe8, 0x9d, 0xb6, 0x47,
-	0xfd, 0x44, 0x35, 0xf1, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xde, 0x6c, 0xbb, 0xb2, 0x99, 0x20,
-	0x00, 0x00,
+	0x1b, 0xe2, 0xc2, 0x81, 0x1b, 0x28, 0x47, 0xc4, 0xee, 0x39, 0x42, 0x16, 0x7f, 0x00, 0x27, 0xce,
+	0xa8, 0xaa, 0xab, 0xba, 0xab, 0x27, 0x3d, 0x3d, 0x93, 0xf5, 0x70, 0xc8, 0x6d, 0xea, 0x55, 0xf5,
+	0x7b, 0xbf, 0xf7, 0x51, 0xbf, 0xaa, 0x7a, 0x1a, 0xb8, 0x18, 0xd1, 0xb0, 0x4f, 0xc3, 0x96, 0x15,
+	0x04, 0x1d, 0xd7, 0xb6, 0x62, 0xd7, 0xf7, 0xd4, 0xdf, 0x46, 0x10, 0xfa, 0xb1, 0x8f, 0x17, 0x14,
+	0x91, 0xfe, 0x46, 0xdb, 0x6f, 0xfb, 0x5c, 0xde, 0x62, 0xbf, 0x92, 0x25, 0x7a, 0xa3, 0xed, 0xfb,
+	0xed, 0x0e, 0x6d, 0x59, 0x81, 0xdb, 0xb2, 0x3c, 0xcf, 0x8f, 0xf9, 0xe2, 0x48, 0xcc, 0x92, 0xc3,
+	0xb7, 0x22, 0xc3, 0xf5, 0xf9, 0xac, 0xed, 0x87, 0xb4, 0xd5, 0x5f, 0x6b, 0xb5, 0xa9, 0x47, 0x43,
+	0x2b, 0xa6, 0x8e, 0x58, 0x73, 0x23, 0x5b, 0xd3, 0xb5, 0xec, 0x03, 0xd7, 0xa3, 0xe1, 0xa0, 0x15,
+	0x1c, 0xb6, 0x99, 0x20, 0x6a, 0x75, 0x69, 0x6c, 0x15, 0x7d, 0xb5, 0xdd, 0x76, 0xe3, 0x83, 0xde,
+	0xbb, 0x86, 0xed, 0x77, 0x5b, 0x56, 0xc8, 0x81, 0x7d, 0x9b, 0xff, 0x58, 0xb5, 0x9d, 0xec, 0x6b,
+	0xd5, 0xbd, 0xfe, 0x9a, 0xd5, 0x09, 0x0e, 0xac, 0xe7, 0x55, 0x6d, 0x96, 0xa9, 0x0a, 0x69, 0xe0,
+	0x8b, 0x58, 0xf1, 0x9f, 0x6e, 0xec, 0x87, 0x03, 0xe5, 0x67, 0xa2, 0x83, 0xfc, 0x05, 0xc1, 0xa9,
+	0x5b, 0x99, 0xb1, 0xaf, 0xf5, 0x68, 0x38, 0xc0, 0x18, 0xaa, 0x9e, 0xd5, 0xa5, 0x1a, 0x6a, 0xa2,
+	0xe5, 0x79, 0x93, 0xff, 0xc6, 0x1a, 0xd4, 0x42, 0xba, 0x1f, 0xd2, 0xe8, 0x40, 0xab, 0x70, 0xb1,
+	0x1c, 0xe2, 0x25, 0xa8, 0x31, 0xcb, 0xd4, 0x8e, 0xb5, 0x99, 0xe6, 0xcc, 0xf2, 0xfc, 0xe6, 0x89,
+	0xa3, 0x67, 0xe7, 0xeb, 0xbb, 0x89, 0x28, 0x32, 0xe5, 0x24, 0x36, 0xe0, 0x64, 0x48, 0x23, 0xbf,
+	0x17, 0xda, 0xf4, 0xeb, 0x34, 0x8c, 0x5c, 0xdf, 0xd3, 0xaa, 0x4c, 0xd3, 0x66, 0xf5, 0xe9, 0xb3,
+	0xf3, 0x9f, 0x30, 0x87, 0x27, 0x71, 0x13, 0xea, 0x11, 0xed, 0x50, 0x3b, 0xf6, 0x43, 0x6d, 0x56,
+	0x59, 0x98, 0x4a, 0xc9, 0x16, 0x9c, 0x36, 0x69, 0xdf, 0x65, 0xab, 0xef, 0xd1, 0xd8, 0x72, 0xac,
+	0xd8, 0x1a, 0x76, 0xa0, 0x92, 0x3a, 0xa0, 0x43, 0x3d, 0x14, 0x8b, 0xb5, 0x0a, 0x97, 0xa7, 0x63,
+	0x16, 0x85, 0x45, 0x25, 0x0a, 0xa6, 0x40, 0x72, 0xa7, 0x4f, 0xbd, 0x38, 0x1a, 0xad, 0x72, 0x1d,
+	0x5e, 0x93, 0xa0, 0xef, 0x5b, 0x5d, 0x1a, 0x05, 0x96, 0x4d, 0x13, 0xdd, 0x02, 0xea, 0xf3, 0xd3,
+	0x78, 0x19, 0x4e, 0xa8, 0x42, 0x6d, 0x46, 0x59, 0x9e, 0x9b, 0xc1, 0x4b, 0xb0, 0x20, 0xc7, 0x0f,
+	0xb7, 0x6f, 0x6b, 0x55, 0x65, 0xa1, 0x3a, 0x41, 0x76, 0x41, 0x53, 0xb0, 0xdf, 0xb3, 0x3c, 0x77,
+	0x9f, 0x46, 0xf1, 0x68, 0xd4, 0xcd, 0x5c, 0x20, 0x94, 0xb8, 0xa6, 0xe1, 0x38, 0x0d, 0xaf, 0xe7,
+	0xa3, 0x11, 0xf8, 0x5e, 0x44, 0xc9, 0x07, 0x28, 0x67, 0xe9, 0xed, 0x90, 0x5a, 0x31, 0x35, 0xe9,
+	0x77, 0x7a, 0x34, 0x8a, 0xb1, 0x07, 0xea, 0xa6, 0xe3, 0x06, 0x17, 0xd6, 0xbf, 0x64, 0x64, 0x25,
+	0x6a, 0xc8, 0x12, 0xe5, 0x3f, 0xbe, 0x65, 0x3b, 0x46, 0x70, 0xd8, 0x36, 0x58, 0xb5, 0x1b, 0xea,
+	0x06, 0x96, 0xd5, 0x6e, 0x28, 0x96, 0xa4, 0xd7, 0xca, 0x3a, 0x7c, 0x06, 0xe6, 0x7a, 0x41, 0x44,
+	0xc3, 0x98, 0xfb, 0x50, 0x37, 0xc5, 0x88, 0xfc, 0x20, 0x0f, 0xf2, 0x61, 0xe0, 0x28, 0x20, 0x0f,
+	0xfe, 0x8f, 0x20, 0x73, 0xf0, 0xc8, 0xdd, 0x1c, 0x8a, 0xdb, 0xb4, 0x43, 0x33, 0x14, 0x45, 0x49,
+	0xd1, 0xa0, 0x66, 0x5b, 0x91, 0x6d, 0x39, 0x54, 0xf8, 0x23, 0x87, 0xe4, 0x69, 0x15, 0xce, 0x28,
+	0xaa, 0xf6, 0x06, 0x9e, 0x5d, 0xa6, 0x68, 0x6c, 0x76, 0x71, 0x03, 0xe6, 0x9c, 0x70, 0x60, 0xf6,
+	0x3c, 0x6d, 0x86, 0x59, 0x12, 0xf3, 0x42, 0x86, 0x75, 0x98, 0x0d, 0xc2, 0x9e, 0x47, 0xf9, 0xde,
+	0x94, 0x93, 0x89, 0x08, 0xdb, 0x50, 0x8f, 0x62, 0xc6, 0x40, 0xed, 0x01, 0xdf, 0x91, 0x0b, 0xeb,
+	0x5b, 0xc7, 0x88, 0x1d, 0xf3, 0x64, 0x4f, 0xa8, 0x33, 0x53, 0xc5, 0x38, 0x86, 0x79, 0x59, 0xdd,
+	0x91, 0x56, 0x6b, 0xce, 0x2c, 0x2f, 0xac, 0xef, 0x1e, 0xd3, 0xca, 0x57, 0x03, 0xc6, 0x9b, 0xca,
+	0xc6, 0x16, 0x6e, 0x65, 0x86, 0x70, 0x03, 0xe6, 0xbb, 0x62, 0xe7, 0x44, 0x5a, 0x9d, 0xd1, 0x98,
+	0x99, 0x09, 0xf0, 0x43, 0x98, 0x75, 0xbd, 0x7d, 0x3f, 0xd2, 0xe6, 0x39, 0x9e, 0x9b, 0xc7, 0xc0,
+	0xb3, 0xed, 0xed, 0xfb, 0x66, 0xa2, 0x0d, 0x7b, 0xf0, 0x4a, 0x48, 0xe3, 0x70, 0x20, 0xa3, 0xa0,
+	0x01, 0x0f, 0xea, 0xdd, 0x63, 0xa8, 0x37, 0x55, 0x7d, 0x66, 0x5e, 0x3d, 0x79, 0x1f, 0x41, 0xe3,
+	0xb9, 0xbd, 0xb1, 0x17, 0xd0, 0xd2, 0x82, 0x72, 0xa0, 0x1a, 0x05, 0xd4, 0xe6, 0xbc, 0xb6, 0xb0,
+	0xfe, 0xe5, 0xe9, 0x6c, 0x16, 0x66, 0x54, 0x24, 0x81, 0x6b, 0x27, 0x5d, 0xf8, 0xa4, 0x32, 0xbd,
+	0x6b, 0xc5, 0xf6, 0x41, 0x19, 0x28, 0x56, 0xa5, 0x6c, 0x4d, 0x8e, 0x6d, 0x13, 0x11, 0x26, 0x30,
+	0xcf, 0x7f, 0x3c, 0x18, 0x04, 0x79, 0x7a, 0xcd, 0xc4, 0xe4, 0x87, 0x08, 0x74, 0x75, 0xef, 0xfa,
+	0x9d, 0xce, 0xbb, 0x96, 0x7d, 0x58, 0x6e, 0xb2, 0xe2, 0x3a, 0xdc, 0xde, 0xcc, 0x26, 0x30, 0x7d,
+	0x47, 0xcf, 0xce, 0x57, 0xb6, 0x6f, 0x9b, 0x15, 0xd7, 0xf9, 0xf8, 0x5b, 0x8a, 0x7c, 0x34, 0x04,
+	0x44, 0x14, 0x64, 0x19, 0x10, 0x02, 0xf3, 0x5e, 0xe1, 0x69, 0x93, 0x89, 0x5f, 0xe0, 0x94, 0x59,
+	0x84, 0x5a, 0x3f, 0x3d, 0x8d, 0xb3, 0x45, 0x52, 0xc8, 0xc0, 0xb7, 0x43, 0xbf, 0x17, 0x68, 0xb3,
+	0x6a, 0xa4, 0xb9, 0x08, 0x6b, 0x50, 0x3d, 0x74, 0x3d, 0x47, 0x9b, 0x53, 0xa6, 0xb8, 0x84, 0xfc,
+	0xb2, 0x02, 0xe7, 0x0b, 0xdc, 0x1a, 0x9b, 0xd7, 0x97, 0xc0, 0xb7, 0xac, 0xf6, 0x6a, 0x63, 0x6a,
+	0xaf, 0x5e, 0x5c, 0x7b, 0xff, 0x45, 0xd0, 0x2c, 0x88, 0xcd, 0xf8, 0x33, 0xe2, 0x25, 0x09, 0xce,
+	0xbe, 0x1f, 0xda, 0x54, 0xab, 0xa5, 0xb5, 0x8e, 0xcc, 0x44, 0x44, 0xfe, 0x83, 0x40, 0x93, 0xde,
+	0xde, 0xb2, 0xb9, 0xef, 0x3d, 0xef, 0x65, 0x77, 0xb8, 0x01, 0x73, 0x16, 0xf7, 0x25, 0x57, 0x0e,
+	0x42, 0x46, 0x7e, 0x84, 0xe0, 0x6c, 0xde, 0xe5, 0x68, 0xc7, 0x8d, 0x62, 0x79, 0xa5, 0xc2, 0x2e,
+	0xd4, 0x92, 0x95, 0x91, 0x86, 0xf8, 0xd1, 0xb2, 0x7d, 0x2c, 0xee, 0x57, 0x0d, 0x49, 0xf7, 0x84,
+	0x7e, 0x72, 0x13, 0xce, 0x16, 0x12, 0x8d, 0x40, 0xd2, 0x84, 0xba, 0x3c, 0xef, 0x92, 0x1c, 0xc8,
+	0x7b, 0x83, 0x94, 0x92, 0xbf, 0x55, 0xf2, 0x1c, 0xed, 0x3b, 0x3b, 0x7e, 0xbb, 0xe4, 0x76, 0x3c,
+	0x49, 0xf6, 0x34, 0xa8, 0x05, 0xbe, 0x93, 0x25, 0xce, 0x94, 0x43, 0xf6, 0xb5, 0xed, 0x7b, 0xb1,
+	0xc5, 0x9e, 0x55, 0xb9, 0x7c, 0x65, 0x62, 0x96, 0xfb, 0xc8, 0xf5, 0x6c, 0xba, 0x47, 0x6d, 0xdf,
+	0x73, 0x22, 0x9e, 0xb8, 0x19, 0x99, 0x7b, 0x75, 0x06, 0xdf, 0x85, 0x79, 0x3e, 0x7e, 0xe0, 0x76,
+	0xa9, 0x36, 0xc7, 0x4f, 0xd9, 0x15, 0x23, 0x79, 0xbf, 0x19, 0xea, 0xfb, 0x2d, 0x8b, 0x30, 0x7b,
+	0xbf, 0x19, 0xfd, 0x35, 0x83, 0x7d, 0x61, 0x66, 0x1f, 0x33, 0x5c, 0xb1, 0xe5, 0x76, 0x76, 0x5c,
+	0x8f, 0x5f, 0x4f, 0x32, 0x83, 0x99, 0x98, 0xd5, 0xc4, 0xbe, 0xdf, 0xe9, 0xf8, 0x8f, 0x38, 0x05,
+	0xa4, 0xc7, 0x41, 0x22, 0x23, 0xdf, 0x85, 0xfa, 0x8e, 0xdf, 0xbe, 0xe3, 0xc5, 0xe1, 0x80, 0xd5,
+	0x24, 0x73, 0x87, 0x7a, 0xf9, 0xa0, 0x4b, 0x21, 0xbe, 0x0f, 0xf3, 0xb1, 0xdb, 0xa5, 0x7b, 0xb1,
+	0xd5, 0x0d, 0xc4, 0x09, 0xfc, 0x02, 0xb8, 0x53, 0x64, 0x52, 0x05, 0x69, 0xc1, 0x9b, 0xe9, 0x65,
+	0xe8, 0x01, 0x0d, 0xbb, 0xae, 0x67, 0x95, 0x72, 0x0e, 0x59, 0xcb, 0x55, 0x0d, 0xbb, 0x4c, 0xbd,
+	0xe3, 0x7a, 0x8e, 0xff, 0x68, 0x74, 0xde, 0xc9, 0x3f, 0xf3, 0x8f, 0x29, 0xe5, 0x9b, 0xb4, 0xd8,
+	0xee, 0xc2, 0x2b, 0xac, 0x2c, 0xfb, 0x54, 0x4c, 0x88, 0xe2, 0x27, 0xb9, 0xba, 0x2e, 0xd4, 0x61,
+	0xe6, 0x3f, 0xc4, 0x3b, 0x70, 0xd2, 0x8a, 0x22, 0xb7, 0xed, 0x51, 0x47, 0xea, 0xaa, 0x4c, 0xac,
+	0x6b, 0xf8, 0xd3, 0xe4, 0x16, 0xce, 0x57, 0xf0, 0x72, 0xe4, 0xb7, 0x70, 0x3e, 0x24, 0xdf, 0x47,
+	0x70, 0xba, 0x50, 0x09, 0x0b, 0x01, 0xa7, 0x06, 0x11, 0x02, 0xc1, 0x82, 0xf5, 0xc8, 0x3e, 0xa0,
+	0x4e, 0xaf, 0x43, 0xe5, 0x5b, 0x53, 0x8e, 0xd9, 0x9c, 0xd3, 0x4b, 0x32, 0x20, 0x6a, 0x3e, 0x1d,
+	0xe3, 0x45, 0x80, 0xae, 0xe5, 0xf5, 0xac, 0x0e, 0x87, 0x50, 0xe5, 0x10, 0x14, 0x09, 0x69, 0x80,
+	0x5e, 0x94, 0x3e, 0xf1, 0x3e, 0xfb, 0x08, 0xc1, 0xab, 0x72, 0x5f, 0x8b, 0xfc, 0x18, 0x70, 0x52,
+	0x09, 0xc3, 0xfd, 0x34, 0x55, 0x82, 0x98, 0x87, 0x27, 0x87, 0xf7, 0x2c, 0x2a, 0xde, 0xb3, 0x49,
+	0xce, 0x67, 0x94, 0xe9, 0x64, 0xc7, 0xe7, 0x18, 0x16, 0x95, 0x32, 0x2c, 0x1a, 0xcd, 0xb0, 0x68,
+	0xe8, 0x2e, 0x31, 0x00, 0xed, 0x9e, 0xe5, 0x59, 0x6d, 0xea, 0xa4, 0xce, 0xa5, 0x85, 0xf4, 0x4d,
+	0x98, 0x75, 0x63, 0xda, 0x95, 0x05, 0xb4, 0x35, 0x05, 0xf6, 0xbc, 0xed, 0xee, 0xef, 0x9b, 0x89,
+	0xd6, 0xf5, 0x0f, 0x1b, 0x80, 0xd5, 0xac, 0xd3, 0xb0, 0xef, 0xda, 0x14, 0xff, 0x14, 0x41, 0x95,
+	0xd1, 0x38, 0x3e, 0x37, 0xaa, 0xc8, 0x78, 0xf4, 0xf5, 0x29, 0x5d, 0x96, 0x99, 0x29, 0xd2, 0x78,
+	0xef, 0xc3, 0x7f, 0xff, 0xbc, 0x72, 0x06, 0xbf, 0xc1, 0x7b, 0x52, 0xfd, 0x35, 0xb5, 0x45, 0x14,
+	0xe1, 0x1f, 0x23, 0xc0, 0xe2, 0x60, 0x51, 0x3a, 0x17, 0xf8, 0xea, 0x28, 0x7c, 0x05, 0x1d, 0x0e,
+	0xfd, 0x9c, 0x42, 0x2c, 0x86, 0xed, 0x87, 0x94, 0xd1, 0x08, 0x5f, 0xc0, 0x01, 0xac, 0x70, 0x00,
+	0x17, 0x31, 0x29, 0x02, 0xd0, 0x7a, 0xcc, 0x0a, 0xe0, 0x49, 0x8b, 0x26, 0x76, 0x7f, 0x87, 0x60,
+	0xf6, 0x1d, 0x7e, 0x21, 0x1a, 0x13, 0xa1, 0xdd, 0xe9, 0x44, 0x88, 0xdb, 0xe2, 0x50, 0xc9, 0x05,
+	0x0e, 0xf3, 0x1c, 0x3e, 0x2b, 0x61, 0x46, 0x71, 0x48, 0xad, 0x6e, 0x0e, 0xed, 0x75, 0x84, 0x3f,
+	0x40, 0x30, 0x97, 0x34, 0x30, 0xf0, 0xa5, 0x51, 0x10, 0x73, 0x0d, 0x0e, 0x7d, 0x4a, 0x6d, 0x02,
+	0x72, 0x85, 0x03, 0xbc, 0x40, 0x0a, 0x13, 0xb9, 0x91, 0xeb, 0x71, 0xfc, 0x0c, 0xc1, 0xcc, 0x16,
+	0x1d, 0x5b, 0x66, 0xd3, 0x42, 0xf6, 0x5c, 0xe8, 0x0a, 0x32, 0x8c, 0xff, 0x80, 0xe0, 0xcd, 0x2d,
+	0x1a, 0x17, 0x13, 0x3c, 0x5e, 0x1e, 0xcf, 0xba, 0xa2, 0xda, 0xae, 0x4e, 0xb0, 0x32, 0x65, 0xb6,
+	0x16, 0x47, 0x76, 0x05, 0x5f, 0x2e, 0xab, 0xbd, 0x68, 0xe0, 0xd9, 0x8f, 0x04, 0x8e, 0xbf, 0x23,
+	0x38, 0x35, 0xdc, 0x1a, 0xc4, 0xf9, 0x23, 0xa1, 0xb0, 0x73, 0xa8, 0x7f, 0xe5, 0x58, 0x0c, 0x92,
+	0xd7, 0x48, 0x6e, 0x71, 0xd8, 0x9f, 0xc7, 0x9f, 0x2b, 0x83, 0x2d, 0xfb, 0x32, 0x51, 0xeb, 0xb1,
+	0xfc, 0xf9, 0x84, 0x77, 0x8f, 0x39, 0xe6, 0xf7, 0x10, 0x9c, 0xd8, 0xa2, 0xf1, 0xbd, 0xb4, 0x15,
+	0x31, 0xb2, 0x5a, 0x73, 0x8d, 0x3f, 0xbd, 0x61, 0x28, 0xad, 0x5e, 0x39, 0x95, 0xc6, 0x73, 0x95,
+	0x03, 0xbb, 0x8c, 0x2f, 0x95, 0x01, 0xcb, 0xda, 0x1f, 0x7f, 0x45, 0x30, 0x97, 0x34, 0x0b, 0x46,
+	0x9b, 0xcf, 0x35, 0xda, 0xa6, 0x56, 0x92, 0x77, 0x38, 0xd0, 0x9b, 0xfa, 0xf5, 0x62, 0xa0, 0xea,
+	0xf7, 0x32, 0x64, 0x06, 0x47, 0x9f, 0xdf, 0x48, 0x7f, 0x42, 0x00, 0x59, 0xb7, 0x03, 0x5f, 0x29,
+	0x77, 0x42, 0xe9, 0x88, 0xe8, 0x53, 0xec, 0x77, 0x10, 0x83, 0x3b, 0xb3, 0xac, 0x37, 0x4b, 0xab,
+	0x38, 0xa0, 0xf6, 0x06, 0xef, 0x89, 0xe0, 0xdf, 0x20, 0x98, 0xe5, 0x2f, 0x66, 0x7c, 0x71, 0x14,
+	0x60, 0xf5, 0x41, 0x3d, 0xb5, 0xa0, 0x2f, 0x71, 0x9c, 0xcd, 0xf5, 0x32, 0x1e, 0xd8, 0x40, 0x2b,
+	0xb8, 0x0f, 0x73, 0xc9, 0xa3, 0x75, 0x74, 0x55, 0xe4, 0x1e, 0xb5, 0x7a, 0xb3, 0xe4, 0x38, 0x4a,
+	0x0a, 0x53, 0x50, 0xd0, 0x4a, 0x29, 0x05, 0xfd, 0x1e, 0x41, 0x95, 0xb1, 0x04, 0xbe, 0x50, 0xc6,
+	0x21, 0xd3, 0x8e, 0xca, 0x55, 0x0e, 0xed, 0x12, 0x69, 0x8e, 0xe3, 0x20, 0x16, 0x9a, 0xf7, 0x11,
+	0x9c, 0x1a, 0xbe, 0xb4, 0xe0, 0xb3, 0x43, 0xfc, 0xa3, 0xde, 0xd4, 0xf4, 0x7c, 0x08, 0x47, 0x5d,
+	0x78, 0xc8, 0x17, 0x39, 0x8a, 0x0d, 0xfc, 0xd6, 0xd8, 0x0d, 0x71, 0x5f, 0x6e, 0x62, 0xa6, 0x68,
+	0x35, 0xeb, 0x74, 0xfe, 0x19, 0xc1, 0x09, 0xa9, 0xf7, 0x41, 0x48, 0x69, 0x39, 0xac, 0x29, 0xd5,
+	0x3f, 0x33, 0x44, 0xbe, 0xc0, 0xb1, 0x7f, 0x06, 0xdf, 0x98, 0x10, 0xbb, 0xc4, 0xbc, 0x1a, 0x33,
+	0x98, 0x7f, 0x44, 0x50, 0x97, 0x7d, 0x3a, 0x7c, 0x79, 0x64, 0x25, 0xe5, 0x3b, 0x79, 0x53, 0xcb,
+	0xbe, 0x38, 0x81, 0xc8, 0xc5, 0x52, 0x2a, 0x17, 0xc6, 0x59, 0x05, 0xfc, 0x02, 0x01, 0x4e, 0xaf,
+	0xe8, 0xe9, 0xa5, 0x1d, 0x2f, 0xe5, 0x4c, 0x8d, 0x7c, 0x8b, 0xe9, 0x97, 0xc7, 0xae, 0xcb, 0x53,
+	0xf9, 0x4a, 0x29, 0x95, 0xfb, 0xa9, 0xfd, 0x9f, 0x20, 0x58, 0xd8, 0xa2, 0xe9, 0x3d, 0xb1, 0x24,
+	0x90, 0xf9, 0x4e, 0xa4, 0xbe, 0x3c, 0x7e, 0xa1, 0x40, 0x74, 0x8d, 0x23, 0x5a, 0xc2, 0xe5, 0xa1,
+	0x92, 0x00, 0x7e, 0x8d, 0xe0, 0x15, 0xc1, 0x62, 0x42, 0x72, 0x6d, 0x9c, 0xa5, 0x1c, 0xe9, 0x4d,
+	0x8e, 0xeb, 0x53, 0x1c, 0xd7, 0x2a, 0x99, 0x08, 0xd7, 0x86, 0x68, 0xe8, 0xfd, 0x16, 0xc1, 0xeb,
+	0xea, 0xc5, 0x5a, 0x34, 0x71, 0x3e, 0x6e, 0xdc, 0x4a, 0x7a, 0x41, 0xe4, 0x06, 0xc7, 0x67, 0xe0,
+	0x6b, 0x93, 0xe0, 0x6b, 0x89, 0xb6, 0x0e, 0xfe, 0x15, 0x82, 0xd7, 0x78, 0x1b, 0x4d, 0x55, 0x3c,
+	0x44, 0xc8, 0xa3, 0x9a, 0x6e, 0x13, 0x10, 0xb2, 0xd8, 0xb3, 0xe4, 0x85, 0x40, 0x6d, 0x88, 0xf6,
+	0x17, 0x7b, 0x28, 0xbd, 0x2a, 0x8f, 0x00, 0x91, 0xdd, 0xd5, 0x71, 0x81, 0x7b, 0xd1, 0x23, 0x43,
+	0x94, 0xdb, 0xca, 0x64, 0xe5, 0xf6, 0x3d, 0x04, 0x35, 0xd1, 0xb9, 0x2a, 0x39, 0x55, 0x95, 0xd6,
+	0x96, 0x7e, 0x3a, 0xb7, 0x4a, 0x76, 0x6e, 0xc8, 0x67, 0xb9, 0xd9, 0x35, 0xdc, 0x2a, 0x33, 0x1b,
+	0xf8, 0x4e, 0xd4, 0x7a, 0x2c, 0x5a, 0x5a, 0x4f, 0x5a, 0x1d, 0xbf, 0x1d, 0x5d, 0x47, 0x9b, 0x6f,
+	0x3f, 0x3d, 0x5a, 0x44, 0xff, 0x38, 0x5a, 0x44, 0xff, 0x3a, 0x5a, 0x44, 0xdf, 0xf8, 0xf4, 0x04,
+	0x7f, 0x08, 0xb0, 0x3b, 0x2e, 0xf5, 0x62, 0xd5, 0xc4, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0xb8,
+	0x89, 0xd6, 0x53, 0x09, 0x21, 0x00, 0x00,
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -3347,6 +3356,18 @@ func (m *ApplicationSyncRequest) MarshalToSizedBuffer(dAtA []byte) (int, error)
 		i -= len(m.XXX_unrecognized)
 		copy(dAtA[i:], m.XXX_unrecognized)
 	}
+	if m.RetryStrategy != nil {
+		{
+			size, err := m.RetryStrategy.MarshalToSizedBuffer(dAtA[:i])
+			if err != nil {
+				return 0, err
+			}
+			i -= size
+			i = encodeVarintApplication(dAtA, i, uint64(size))
+		}
+		i--
+		dAtA[i] = 0x52
+	}
 	if len(m.Infos) > 0 {
 		for iNdEx := len(m.Infos) - 1; iNdEx >= 0; iNdEx-- {
 			{
@@ -4576,6 +4597,10 @@ func (m *ApplicationSyncRequest) Size() (n int) {
 			n += 1 + l + sovApplication(uint64(l))
 		}
 	}
+	if m.RetryStrategy != nil {
+		l = m.RetryStrategy.Size()
+		n += 1 + l + sovApplication(uint64(l))
+	}
 	if m.XXX_unrecognized != nil {
 		n += len(m.XXX_unrecognized)
 	}
@@ -6295,6 +6320,42 @@ func (m *ApplicationSyncRequest) Unmarshal(dAtA []byte) error {
 				return err
 			}
 			iNdEx = postIndex
+		case 10:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field RetryStrategy", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowApplication
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthApplication
+			}
+			postIndex := iNdEx + msglen
+			if postIndex < 0 {
+				return ErrInvalidLengthApplication
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.RetryStrategy == nil {
+				m.RetryStrategy = &v1alpha1.RetryStrategy{}
+			}
+			if err := m.RetryStrategy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
 		default:
 			iNdEx = preIndex
 			skippy, err := skipApplication(dAtA[iNdEx:])
diff --git a/pkg/apis/application/v1alpha1/generated.pb.go b/pkg/apis/application/v1alpha1/generated.pb.go
index 9db93f9c1..116fa1742 100644
--- a/pkg/apis/application/v1alpha1/generated.pb.go
+++ b/pkg/apis/application/v1alpha1/generated.pb.go
@@ -623,10 +623,38 @@ func (m *ApplicationWatchEvent) XXX_DiscardUnknown() {
 
 var xxx_messageInfo_ApplicationWatchEvent proto.InternalMessageInfo
 
+func (m *Backoff) Reset()      { *m = Backoff{} }
+func (*Backoff) ProtoMessage() {}
+func (*Backoff) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e7dc23c2911a1a00, []int{21}
+}
+func (m *Backoff) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *Backoff) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	b = b[:cap(b)]
+	n, err := m.MarshalToSizedBuffer(b)
+	if err != nil {
+		return nil, err
+	}
+	return b[:n], nil
+}
+func (m *Backoff) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Backoff.Merge(m, src)
+}
+func (m *Backoff) XXX_Size() int {
+	return m.Size()
+}
+func (m *Backoff) XXX_DiscardUnknown() {
+	xxx_messageInfo_Backoff.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Backoff proto.InternalMessageInfo
+
 func (m *Cluster) Reset()      { *m = Cluster{} }
 func (*Cluster) ProtoMessage() {}
 func (*Cluster) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{21}
+	return fileDescriptor_e7dc23c2911a1a00, []int{22}
 }
 func (m *Cluster) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -654,7 +682,7 @@ var xxx_messageInfo_Cluster proto.InternalMessageInfo
 func (m *ClusterCacheInfo) Reset()      { *m = ClusterCacheInfo{} }
 func (*ClusterCacheInfo) ProtoMessage() {}
 func (*ClusterCacheInfo) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{22}
+	return fileDescriptor_e7dc23c2911a1a00, []int{23}
 }
 func (m *ClusterCacheInfo) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -682,7 +710,7 @@ var xxx_messageInfo_ClusterCacheInfo proto.InternalMessageInfo
 func (m *ClusterConfig) Reset()      { *m = ClusterConfig{} }
 func (*ClusterConfig) ProtoMessage() {}
 func (*ClusterConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{23}
+	return fileDescriptor_e7dc23c2911a1a00, []int{24}
 }
 func (m *ClusterConfig) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -710,7 +738,7 @@ var xxx_messageInfo_ClusterConfig proto.InternalMessageInfo
 func (m *ClusterInfo) Reset()      { *m = ClusterInfo{} }
 func (*ClusterInfo) ProtoMessage() {}
 func (*ClusterInfo) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{24}
+	return fileDescriptor_e7dc23c2911a1a00, []int{25}
 }
 func (m *ClusterInfo) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -738,7 +766,7 @@ var xxx_messageInfo_ClusterInfo proto.InternalMessageInfo
 func (m *ClusterList) Reset()      { *m = ClusterList{} }
 func (*ClusterList) ProtoMessage() {}
 func (*ClusterList) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{25}
+	return fileDescriptor_e7dc23c2911a1a00, []int{26}
 }
 func (m *ClusterList) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -766,7 +794,7 @@ var xxx_messageInfo_ClusterList proto.InternalMessageInfo
 func (m *Command) Reset()      { *m = Command{} }
 func (*Command) ProtoMessage() {}
 func (*Command) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{26}
+	return fileDescriptor_e7dc23c2911a1a00, []int{27}
 }
 func (m *Command) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -794,7 +822,7 @@ var xxx_messageInfo_Command proto.InternalMessageInfo
 func (m *ComparedTo) Reset()      { *m = ComparedTo{} }
 func (*ComparedTo) ProtoMessage() {}
 func (*ComparedTo) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{27}
+	return fileDescriptor_e7dc23c2911a1a00, []int{28}
 }
 func (m *ComparedTo) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -822,7 +850,7 @@ var xxx_messageInfo_ComparedTo proto.InternalMessageInfo
 func (m *ComponentParameter) Reset()      { *m = ComponentParameter{} }
 func (*ComponentParameter) ProtoMessage() {}
 func (*ComponentParameter) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{28}
+	return fileDescriptor_e7dc23c2911a1a00, []int{29}
 }
 func (m *ComponentParameter) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -850,7 +878,7 @@ var xxx_messageInfo_ComponentParameter proto.InternalMessageInfo
 func (m *ConfigManagementPlugin) Reset()      { *m = ConfigManagementPlugin{} }
 func (*ConfigManagementPlugin) ProtoMessage() {}
 func (*ConfigManagementPlugin) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{29}
+	return fileDescriptor_e7dc23c2911a1a00, []int{30}
 }
 func (m *ConfigManagementPlugin) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -878,7 +906,7 @@ var xxx_messageInfo_ConfigManagementPlugin proto.InternalMessageInfo
 func (m *ConnectionState) Reset()      { *m = ConnectionState{} }
 func (*ConnectionState) ProtoMessage() {}
 func (*ConnectionState) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{30}
+	return fileDescriptor_e7dc23c2911a1a00, []int{31}
 }
 func (m *ConnectionState) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -906,7 +934,7 @@ var xxx_messageInfo_ConnectionState proto.InternalMessageInfo
 func (m *EnvEntry) Reset()      { *m = EnvEntry{} }
 func (*EnvEntry) ProtoMessage() {}
 func (*EnvEntry) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{31}
+	return fileDescriptor_e7dc23c2911a1a00, []int{32}
 }
 func (m *EnvEntry) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -934,7 +962,7 @@ var xxx_messageInfo_EnvEntry proto.InternalMessageInfo
 func (m *GnuPGPublicKey) Reset()      { *m = GnuPGPublicKey{} }
 func (*GnuPGPublicKey) ProtoMessage() {}
 func (*GnuPGPublicKey) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{32}
+	return fileDescriptor_e7dc23c2911a1a00, []int{33}
 }
 func (m *GnuPGPublicKey) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -962,7 +990,7 @@ var xxx_messageInfo_GnuPGPublicKey proto.InternalMessageInfo
 func (m *GnuPGPublicKeyList) Reset()      { *m = GnuPGPublicKeyList{} }
 func (*GnuPGPublicKeyList) ProtoMessage() {}
 func (*GnuPGPublicKeyList) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{33}
+	return fileDescriptor_e7dc23c2911a1a00, []int{34}
 }
 func (m *GnuPGPublicKeyList) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -990,7 +1018,7 @@ var xxx_messageInfo_GnuPGPublicKeyList proto.InternalMessageInfo
 func (m *HealthStatus) Reset()      { *m = HealthStatus{} }
 func (*HealthStatus) ProtoMessage() {}
 func (*HealthStatus) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{34}
+	return fileDescriptor_e7dc23c2911a1a00, []int{35}
 }
 func (m *HealthStatus) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1018,7 +1046,7 @@ var xxx_messageInfo_HealthStatus proto.InternalMessageInfo
 func (m *HelmFileParameter) Reset()      { *m = HelmFileParameter{} }
 func (*HelmFileParameter) ProtoMessage() {}
 func (*HelmFileParameter) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{35}
+	return fileDescriptor_e7dc23c2911a1a00, []int{36}
 }
 func (m *HelmFileParameter) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1046,7 +1074,7 @@ var xxx_messageInfo_HelmFileParameter proto.InternalMessageInfo
 func (m *HelmParameter) Reset()      { *m = HelmParameter{} }
 func (*HelmParameter) ProtoMessage() {}
 func (*HelmParameter) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{36}
+	return fileDescriptor_e7dc23c2911a1a00, []int{37}
 }
 func (m *HelmParameter) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1074,7 +1102,7 @@ var xxx_messageInfo_HelmParameter proto.InternalMessageInfo
 func (m *Info) Reset()      { *m = Info{} }
 func (*Info) ProtoMessage() {}
 func (*Info) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{37}
+	return fileDescriptor_e7dc23c2911a1a00, []int{38}
 }
 func (m *Info) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1102,7 +1130,7 @@ var xxx_messageInfo_Info proto.InternalMessageInfo
 func (m *InfoItem) Reset()      { *m = InfoItem{} }
 func (*InfoItem) ProtoMessage() {}
 func (*InfoItem) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{38}
+	return fileDescriptor_e7dc23c2911a1a00, []int{39}
 }
 func (m *InfoItem) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1130,7 +1158,7 @@ var xxx_messageInfo_InfoItem proto.InternalMessageInfo
 func (m *JWTToken) Reset()      { *m = JWTToken{} }
 func (*JWTToken) ProtoMessage() {}
 func (*JWTToken) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{39}
+	return fileDescriptor_e7dc23c2911a1a00, []int{40}
 }
 func (m *JWTToken) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1158,7 +1186,7 @@ var xxx_messageInfo_JWTToken proto.InternalMessageInfo
 func (m *JWTTokens) Reset()      { *m = JWTTokens{} }
 func (*JWTTokens) ProtoMessage() {}
 func (*JWTTokens) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{40}
+	return fileDescriptor_e7dc23c2911a1a00, []int{41}
 }
 func (m *JWTTokens) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1186,7 +1214,7 @@ var xxx_messageInfo_JWTTokens proto.InternalMessageInfo
 func (m *JsonnetVar) Reset()      { *m = JsonnetVar{} }
 func (*JsonnetVar) ProtoMessage() {}
 func (*JsonnetVar) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{41}
+	return fileDescriptor_e7dc23c2911a1a00, []int{42}
 }
 func (m *JsonnetVar) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1214,7 +1242,7 @@ var xxx_messageInfo_JsonnetVar proto.InternalMessageInfo
 func (m *KnownTypeField) Reset()      { *m = KnownTypeField{} }
 func (*KnownTypeField) ProtoMessage() {}
 func (*KnownTypeField) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{42}
+	return fileDescriptor_e7dc23c2911a1a00, []int{43}
 }
 func (m *KnownTypeField) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1242,7 +1270,7 @@ var xxx_messageInfo_KnownTypeField proto.InternalMessageInfo
 func (m *KsonnetParameter) Reset()      { *m = KsonnetParameter{} }
 func (*KsonnetParameter) ProtoMessage() {}
 func (*KsonnetParameter) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{43}
+	return fileDescriptor_e7dc23c2911a1a00, []int{44}
 }
 func (m *KsonnetParameter) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1270,7 +1298,7 @@ var xxx_messageInfo_KsonnetParameter proto.InternalMessageInfo
 func (m *KustomizeOptions) Reset()      { *m = KustomizeOptions{} }
 func (*KustomizeOptions) ProtoMessage() {}
 func (*KustomizeOptions) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{44}
+	return fileDescriptor_e7dc23c2911a1a00, []int{45}
 }
 func (m *KustomizeOptions) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1298,7 +1326,7 @@ var xxx_messageInfo_KustomizeOptions proto.InternalMessageInfo
 func (m *Operation) Reset()      { *m = Operation{} }
 func (*Operation) ProtoMessage() {}
 func (*Operation) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{45}
+	return fileDescriptor_e7dc23c2911a1a00, []int{46}
 }
 func (m *Operation) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1326,7 +1354,7 @@ var xxx_messageInfo_Operation proto.InternalMessageInfo
 func (m *OperationInitiator) Reset()      { *m = OperationInitiator{} }
 func (*OperationInitiator) ProtoMessage() {}
 func (*OperationInitiator) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{46}
+	return fileDescriptor_e7dc23c2911a1a00, []int{47}
 }
 func (m *OperationInitiator) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1354,7 +1382,7 @@ var xxx_messageInfo_OperationInitiator proto.InternalMessageInfo
 func (m *OperationState) Reset()      { *m = OperationState{} }
 func (*OperationState) ProtoMessage() {}
 func (*OperationState) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{47}
+	return fileDescriptor_e7dc23c2911a1a00, []int{48}
 }
 func (m *OperationState) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1382,7 +1410,7 @@ var xxx_messageInfo_OperationState proto.InternalMessageInfo
 func (m *OrphanedResourceKey) Reset()      { *m = OrphanedResourceKey{} }
 func (*OrphanedResourceKey) ProtoMessage() {}
 func (*OrphanedResourceKey) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{48}
+	return fileDescriptor_e7dc23c2911a1a00, []int{49}
 }
 func (m *OrphanedResourceKey) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1410,7 +1438,7 @@ var xxx_messageInfo_OrphanedResourceKey proto.InternalMessageInfo
 func (m *OrphanedResourcesMonitorSettings) Reset()      { *m = OrphanedResourcesMonitorSettings{} }
 func (*OrphanedResourcesMonitorSettings) ProtoMessage() {}
 func (*OrphanedResourcesMonitorSettings) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{49}
+	return fileDescriptor_e7dc23c2911a1a00, []int{50}
 }
 func (m *OrphanedResourcesMonitorSettings) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1438,7 +1466,7 @@ var xxx_messageInfo_OrphanedResourcesMonitorSettings proto.InternalMessageInfo
 func (m *OverrideIgnoreDiff) Reset()      { *m = OverrideIgnoreDiff{} }
 func (*OverrideIgnoreDiff) ProtoMessage() {}
 func (*OverrideIgnoreDiff) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{50}
+	return fileDescriptor_e7dc23c2911a1a00, []int{51}
 }
 func (m *OverrideIgnoreDiff) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1466,7 +1494,7 @@ var xxx_messageInfo_OverrideIgnoreDiff proto.InternalMessageInfo
 func (m *ProjectRole) Reset()      { *m = ProjectRole{} }
 func (*ProjectRole) ProtoMessage() {}
 func (*ProjectRole) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{51}
+	return fileDescriptor_e7dc23c2911a1a00, []int{52}
 }
 func (m *ProjectRole) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1494,7 +1522,7 @@ var xxx_messageInfo_ProjectRole proto.InternalMessageInfo
 func (m *RepoCreds) Reset()      { *m = RepoCreds{} }
 func (*RepoCreds) ProtoMessage() {}
 func (*RepoCreds) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{52}
+	return fileDescriptor_e7dc23c2911a1a00, []int{53}
 }
 func (m *RepoCreds) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1522,7 +1550,7 @@ var xxx_messageInfo_RepoCreds proto.InternalMessageInfo
 func (m *RepoCredsList) Reset()      { *m = RepoCredsList{} }
 func (*RepoCredsList) ProtoMessage() {}
 func (*RepoCredsList) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{53}
+	return fileDescriptor_e7dc23c2911a1a00, []int{54}
 }
 func (m *RepoCredsList) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1550,7 +1578,7 @@ var xxx_messageInfo_RepoCredsList proto.InternalMessageInfo
 func (m *Repository) Reset()      { *m = Repository{} }
 func (*Repository) ProtoMessage() {}
 func (*Repository) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{54}
+	return fileDescriptor_e7dc23c2911a1a00, []int{55}
 }
 func (m *Repository) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1578,7 +1606,7 @@ var xxx_messageInfo_Repository proto.InternalMessageInfo
 func (m *RepositoryCertificate) Reset()      { *m = RepositoryCertificate{} }
 func (*RepositoryCertificate) ProtoMessage() {}
 func (*RepositoryCertificate) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{55}
+	return fileDescriptor_e7dc23c2911a1a00, []int{56}
 }
 func (m *RepositoryCertificate) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1606,7 +1634,7 @@ var xxx_messageInfo_RepositoryCertificate proto.InternalMessageInfo
 func (m *RepositoryCertificateList) Reset()      { *m = RepositoryCertificateList{} }
 func (*RepositoryCertificateList) ProtoMessage() {}
 func (*RepositoryCertificateList) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{56}
+	return fileDescriptor_e7dc23c2911a1a00, []int{57}
 }
 func (m *RepositoryCertificateList) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1634,7 +1662,7 @@ var xxx_messageInfo_RepositoryCertificateList proto.InternalMessageInfo
 func (m *RepositoryList) Reset()      { *m = RepositoryList{} }
 func (*RepositoryList) ProtoMessage() {}
 func (*RepositoryList) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{57}
+	return fileDescriptor_e7dc23c2911a1a00, []int{58}
 }
 func (m *RepositoryList) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1662,7 +1690,7 @@ var xxx_messageInfo_RepositoryList proto.InternalMessageInfo
 func (m *ResourceAction) Reset()      { *m = ResourceAction{} }
 func (*ResourceAction) ProtoMessage() {}
 func (*ResourceAction) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{58}
+	return fileDescriptor_e7dc23c2911a1a00, []int{59}
 }
 func (m *ResourceAction) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1690,7 +1718,7 @@ var xxx_messageInfo_ResourceAction proto.InternalMessageInfo
 func (m *ResourceActionDefinition) Reset()      { *m = ResourceActionDefinition{} }
 func (*ResourceActionDefinition) ProtoMessage() {}
 func (*ResourceActionDefinition) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{59}
+	return fileDescriptor_e7dc23c2911a1a00, []int{60}
 }
 func (m *ResourceActionDefinition) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1718,7 +1746,7 @@ var xxx_messageInfo_ResourceActionDefinition proto.InternalMessageInfo
 func (m *ResourceActionParam) Reset()      { *m = ResourceActionParam{} }
 func (*ResourceActionParam) ProtoMessage() {}
 func (*ResourceActionParam) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{60}
+	return fileDescriptor_e7dc23c2911a1a00, []int{61}
 }
 func (m *ResourceActionParam) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1746,7 +1774,7 @@ var xxx_messageInfo_ResourceActionParam proto.InternalMessageInfo
 func (m *ResourceActions) Reset()      { *m = ResourceActions{} }
 func (*ResourceActions) ProtoMessage() {}
 func (*ResourceActions) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{61}
+	return fileDescriptor_e7dc23c2911a1a00, []int{62}
 }
 func (m *ResourceActions) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1774,7 +1802,7 @@ var xxx_messageInfo_ResourceActions proto.InternalMessageInfo
 func (m *ResourceDiff) Reset()      { *m = ResourceDiff{} }
 func (*ResourceDiff) ProtoMessage() {}
 func (*ResourceDiff) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{62}
+	return fileDescriptor_e7dc23c2911a1a00, []int{63}
 }
 func (m *ResourceDiff) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1802,7 +1830,7 @@ var xxx_messageInfo_ResourceDiff proto.InternalMessageInfo
 func (m *ResourceIgnoreDifferences) Reset()      { *m = ResourceIgnoreDifferences{} }
 func (*ResourceIgnoreDifferences) ProtoMessage() {}
 func (*ResourceIgnoreDifferences) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{63}
+	return fileDescriptor_e7dc23c2911a1a00, []int{64}
 }
 func (m *ResourceIgnoreDifferences) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1830,7 +1858,7 @@ var xxx_messageInfo_ResourceIgnoreDifferences proto.InternalMessageInfo
 func (m *ResourceNetworkingInfo) Reset()      { *m = ResourceNetworkingInfo{} }
 func (*ResourceNetworkingInfo) ProtoMessage() {}
 func (*ResourceNetworkingInfo) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{64}
+	return fileDescriptor_e7dc23c2911a1a00, []int{65}
 }
 func (m *ResourceNetworkingInfo) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1858,7 +1886,7 @@ var xxx_messageInfo_ResourceNetworkingInfo proto.InternalMessageInfo
 func (m *ResourceNode) Reset()      { *m = ResourceNode{} }
 func (*ResourceNode) ProtoMessage() {}
 func (*ResourceNode) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{65}
+	return fileDescriptor_e7dc23c2911a1a00, []int{66}
 }
 func (m *ResourceNode) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1886,7 +1914,7 @@ var xxx_messageInfo_ResourceNode proto.InternalMessageInfo
 func (m *ResourceOverride) Reset()      { *m = ResourceOverride{} }
 func (*ResourceOverride) ProtoMessage() {}
 func (*ResourceOverride) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{66}
+	return fileDescriptor_e7dc23c2911a1a00, []int{67}
 }
 func (m *ResourceOverride) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1914,7 +1942,7 @@ var xxx_messageInfo_ResourceOverride proto.InternalMessageInfo
 func (m *ResourceRef) Reset()      { *m = ResourceRef{} }
 func (*ResourceRef) ProtoMessage() {}
 func (*ResourceRef) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{67}
+	return fileDescriptor_e7dc23c2911a1a00, []int{68}
 }
 func (m *ResourceRef) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1942,7 +1970,7 @@ var xxx_messageInfo_ResourceRef proto.InternalMessageInfo
 func (m *ResourceResult) Reset()      { *m = ResourceResult{} }
 func (*ResourceResult) ProtoMessage() {}
 func (*ResourceResult) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{68}
+	return fileDescriptor_e7dc23c2911a1a00, []int{69}
 }
 func (m *ResourceResult) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1970,7 +1998,7 @@ var xxx_messageInfo_ResourceResult proto.InternalMessageInfo
 func (m *ResourceStatus) Reset()      { *m = ResourceStatus{} }
 func (*ResourceStatus) ProtoMessage() {}
 func (*ResourceStatus) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{69}
+	return fileDescriptor_e7dc23c2911a1a00, []int{70}
 }
 func (m *ResourceStatus) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1995,10 +2023,38 @@ func (m *ResourceStatus) XXX_DiscardUnknown() {
 
 var xxx_messageInfo_ResourceStatus proto.InternalMessageInfo
 
+func (m *RetryStrategy) Reset()      { *m = RetryStrategy{} }
+func (*RetryStrategy) ProtoMessage() {}
+func (*RetryStrategy) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e7dc23c2911a1a00, []int{71}
+}
+func (m *RetryStrategy) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *RetryStrategy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	b = b[:cap(b)]
+	n, err := m.MarshalToSizedBuffer(b)
+	if err != nil {
+		return nil, err
+	}
+	return b[:n], nil
+}
+func (m *RetryStrategy) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_RetryStrategy.Merge(m, src)
+}
+func (m *RetryStrategy) XXX_Size() int {
+	return m.Size()
+}
+func (m *RetryStrategy) XXX_DiscardUnknown() {
+	xxx_messageInfo_RetryStrategy.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_RetryStrategy proto.InternalMessageInfo
+
 func (m *RevisionHistory) Reset()      { *m = RevisionHistory{} }
 func (*RevisionHistory) ProtoMessage() {}
 func (*RevisionHistory) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{70}
+	return fileDescriptor_e7dc23c2911a1a00, []int{72}
 }
 func (m *RevisionHistory) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -2026,7 +2082,7 @@ var xxx_messageInfo_RevisionHistory proto.InternalMessageInfo
 func (m *RevisionMetadata) Reset()      { *m = RevisionMetadata{} }
 func (*RevisionMetadata) ProtoMessage() {}
 func (*RevisionMetadata) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{71}
+	return fileDescriptor_e7dc23c2911a1a00, []int{73}
 }
 func (m *RevisionMetadata) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -2054,7 +2110,7 @@ var xxx_messageInfo_RevisionMetadata proto.InternalMessageInfo
 func (m *SignatureKey) Reset()      { *m = SignatureKey{} }
 func (*SignatureKey) ProtoMessage() {}
 func (*SignatureKey) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{72}
+	return fileDescriptor_e7dc23c2911a1a00, []int{74}
 }
 func (m *SignatureKey) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -2082,7 +2138,7 @@ var xxx_messageInfo_SignatureKey proto.InternalMessageInfo
 func (m *SyncOperation) Reset()      { *m = SyncOperation{} }
 func (*SyncOperation) ProtoMessage() {}
 func (*SyncOperation) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{73}
+	return fileDescriptor_e7dc23c2911a1a00, []int{75}
 }
 func (m *SyncOperation) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -2110,7 +2166,7 @@ var xxx_messageInfo_SyncOperation proto.InternalMessageInfo
 func (m *SyncOperationResource) Reset()      { *m = SyncOperationResource{} }
 func (*SyncOperationResource) ProtoMessage() {}
 func (*SyncOperationResource) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{74}
+	return fileDescriptor_e7dc23c2911a1a00, []int{76}
 }
 func (m *SyncOperationResource) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -2138,7 +2194,7 @@ var xxx_messageInfo_SyncOperationResource proto.InternalMessageInfo
 func (m *SyncOperationResult) Reset()      { *m = SyncOperationResult{} }
 func (*SyncOperationResult) ProtoMessage() {}
 func (*SyncOperationResult) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{75}
+	return fileDescriptor_e7dc23c2911a1a00, []int{77}
 }
 func (m *SyncOperationResult) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -2166,7 +2222,7 @@ var xxx_messageInfo_SyncOperationResult proto.InternalMessageInfo
 func (m *SyncPolicy) Reset()      { *m = SyncPolicy{} }
 func (*SyncPolicy) ProtoMessage() {}
 func (*SyncPolicy) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{76}
+	return fileDescriptor_e7dc23c2911a1a00, []int{78}
 }
 func (m *SyncPolicy) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -2194,7 +2250,7 @@ var xxx_messageInfo_SyncPolicy proto.InternalMessageInfo
 func (m *SyncPolicyAutomated) Reset()      { *m = SyncPolicyAutomated{} }
 func (*SyncPolicyAutomated) ProtoMessage() {}
 func (*SyncPolicyAutomated) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{77}
+	return fileDescriptor_e7dc23c2911a1a00, []int{79}
 }
 func (m *SyncPolicyAutomated) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -2222,7 +2278,7 @@ var xxx_messageInfo_SyncPolicyAutomated proto.InternalMessageInfo
 func (m *SyncStatus) Reset()      { *m = SyncStatus{} }
 func (*SyncStatus) ProtoMessage() {}
 func (*SyncStatus) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{78}
+	return fileDescriptor_e7dc23c2911a1a00, []int{80}
 }
 func (m *SyncStatus) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -2250,7 +2306,7 @@ var xxx_messageInfo_SyncStatus proto.InternalMessageInfo
 func (m *SyncStrategy) Reset()      { *m = SyncStrategy{} }
 func (*SyncStrategy) ProtoMessage() {}
 func (*SyncStrategy) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{79}
+	return fileDescriptor_e7dc23c2911a1a00, []int{81}
 }
 func (m *SyncStrategy) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -2278,7 +2334,7 @@ var xxx_messageInfo_SyncStrategy proto.InternalMessageInfo
 func (m *SyncStrategyApply) Reset()      { *m = SyncStrategyApply{} }
 func (*SyncStrategyApply) ProtoMessage() {}
 func (*SyncStrategyApply) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{80}
+	return fileDescriptor_e7dc23c2911a1a00, []int{82}
 }
 func (m *SyncStrategyApply) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -2306,7 +2362,7 @@ var xxx_messageInfo_SyncStrategyApply proto.InternalMessageInfo
 func (m *SyncStrategyHook) Reset()      { *m = SyncStrategyHook{} }
 func (*SyncStrategyHook) ProtoMessage() {}
 func (*SyncStrategyHook) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{81}
+	return fileDescriptor_e7dc23c2911a1a00, []int{83}
 }
 func (m *SyncStrategyHook) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -2334,7 +2390,7 @@ var xxx_messageInfo_SyncStrategyHook proto.InternalMessageInfo
 func (m *SyncWindow) Reset()      { *m = SyncWindow{} }
 func (*SyncWindow) ProtoMessage() {}
 func (*SyncWindow) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{82}
+	return fileDescriptor_e7dc23c2911a1a00, []int{84}
 }
 func (m *SyncWindow) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -2362,7 +2418,7 @@ var xxx_messageInfo_SyncWindow proto.InternalMessageInfo
 func (m *TLSClientConfig) Reset()      { *m = TLSClientConfig{} }
 func (*TLSClientConfig) ProtoMessage() {}
 func (*TLSClientConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e7dc23c2911a1a00, []int{83}
+	return fileDescriptor_e7dc23c2911a1a00, []int{85}
 }
 func (m *TLSClientConfig) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -2411,6 +2467,7 @@ func init() {
 	proto.RegisterType((*ApplicationSummary)(nil), "github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.ApplicationSummary")
 	proto.RegisterType((*ApplicationTree)(nil), "github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.ApplicationTree")
 	proto.RegisterType((*ApplicationWatchEvent)(nil), "github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.ApplicationWatchEvent")
+	proto.RegisterType((*Backoff)(nil), "github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.Backoff")
 	proto.RegisterType((*Cluster)(nil), "github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.Cluster")
 	proto.RegisterType((*ClusterCacheInfo)(nil), "github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.ClusterCacheInfo")
 	proto.RegisterType((*ClusterConfig)(nil), "github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.ClusterConfig")
@@ -2462,6 +2519,7 @@ func init() {
 	proto.RegisterType((*ResourceRef)(nil), "github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.ResourceRef")
 	proto.RegisterType((*ResourceResult)(nil), "github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.ResourceResult")
 	proto.RegisterType((*ResourceStatus)(nil), "github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.ResourceStatus")
+	proto.RegisterType((*RetryStrategy)(nil), "github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.RetryStrategy")
 	proto.RegisterType((*RevisionHistory)(nil), "github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.RevisionHistory")
 	proto.RegisterType((*RevisionMetadata)(nil), "github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.RevisionMetadata")
 	proto.RegisterType((*SignatureKey)(nil), "github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.SignatureKey")
@@ -2483,365 +2541,375 @@ func init() {
 }
 
 var fileDescriptor_e7dc23c2911a1a00 = []byte{
-	// 5727 bytes of a gzipped FileDescriptorProto
+	// 5877 bytes of a gzipped FileDescriptorProto
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x3c, 0x5b, 0x6c, 0x24, 0xd9,
-	0x55, 0x5b, 0xdd, 0x76, 0xbb, 0xfb, 0xf8, 0x31, 0xe3, 0x3b, 0x3b, 0x1b, 0xc7, 0x6c, 0xc6, 0xa3,
-	0x5a, 0x25, 0x59, 0x48, 0x62, 0xb3, 0xc3, 0x06, 0x36, 0x59, 0x48, 0x70, 0xdb, 0xf3, 0xf0, 0x8c,
-	0xed, 0xf1, 0x5e, 0x7b, 0x76, 0xa4, 0xcd, 0x83, 0x2d, 0x57, 0xdf, 0xee, 0xae, 0x71, 0x77, 0x55,
-	0x6d, 0xdd, 0x6a, 0xcf, 0x78, 0x49, 0x42, 0x02, 0x09, 0x8a, 0xc2, 0x6e, 0x84, 0x14, 0x91, 0x1f,
-	0x08, 0x4a, 0xe0, 0x8b, 0x48, 0x7c, 0x44, 0x91, 0x10, 0x48, 0x7c, 0x05, 0x09, 0x22, 0x3e, 0x50,
-	0x14, 0x05, 0x58, 0x10, 0x32, 0xac, 0xf3, 0x83, 0xe0, 0x23, 0x20, 0xf8, 0x9a, 0x2f, 0x74, 0xdf,
-	0xb7, 0xaa, 0xbb, 0xc7, 0xf6, 0x74, 0xcd, 0x24, 0x0a, 0x7f, 0xdd, 0xe7, 0x9c, 0x3a, 0xe7, 0xd4,
-	0xbd, 0xe7, 0xdc, 0x7b, 0xce, 0xb9, 0xe7, 0x16, 0xac, 0xb5, 0x82, 0xb4, 0xdd, 0xdb, 0x5d, 0xf4,
-	0xa3, 0xee, 0x92, 0x97, 0xb4, 0xa2, 0x38, 0x89, 0xee, 0xf0, 0x1f, 0x1f, 0xf0, 0x1b, 0x4b, 0xf1,
-	0x5e, 0x6b, 0xc9, 0x8b, 0x03, 0xba, 0xe4, 0xc5, 0x71, 0x27, 0xf0, 0xbd, 0x34, 0x88, 0xc2, 0xa5,
-	0xfd, 0xe7, 0xbc, 0x4e, 0xdc, 0xf6, 0x9e, 0x5b, 0x6a, 0x91, 0x90, 0x24, 0x5e, 0x4a, 0x1a, 0x8b,
-	0x71, 0x12, 0xa5, 0x11, 0xfa, 0x90, 0x61, 0xb5, 0xa8, 0x58, 0xf1, 0x1f, 0xbf, 0xe6, 0x37, 0x16,
-	0xe3, 0xbd, 0xd6, 0x22, 0x63, 0xb5, 0x68, 0xb1, 0x5a, 0x54, 0xac, 0xe6, 0x3f, 0x60, 0x69, 0xd1,
-	0x8a, 0x5a, 0xd1, 0x12, 0xe7, 0xb8, 0xdb, 0x6b, 0xf2, 0x7f, 0xfc, 0x0f, 0xff, 0x25, 0x24, 0xcd,
-	0xbb, 0x7b, 0x2f, 0xd0, 0xc5, 0x20, 0x62, 0xba, 0x2d, 0xf9, 0x51, 0x42, 0x96, 0xf6, 0xfb, 0xb4,
-	0x99, 0x7f, 0xde, 0xd0, 0x74, 0x3d, 0xbf, 0x1d, 0x84, 0x24, 0x39, 0x30, 0x2f, 0xd4, 0x25, 0xa9,
-	0x37, 0xe8, 0xa9, 0xa5, 0x61, 0x4f, 0x25, 0xbd, 0x30, 0x0d, 0xba, 0xa4, 0xef, 0x81, 0x5f, 0x3c,
-	0xee, 0x01, 0xea, 0xb7, 0x49, 0xd7, 0xcb, 0x3f, 0xe7, 0xbe, 0x06, 0xd3, 0xcb, 0xb7, 0xb7, 0x97,
-	0x7b, 0x69, 0x7b, 0x25, 0x0a, 0x9b, 0x41, 0x0b, 0x7d, 0x10, 0x26, 0xfd, 0x4e, 0x8f, 0xa6, 0x24,
-	0xd9, 0xf4, 0xba, 0x64, 0xce, 0xb9, 0xe8, 0x3c, 0x5b, 0xab, 0x9f, 0xfb, 0xee, 0xe1, 0xc2, 0x13,
-	0x47, 0x87, 0x0b, 0x93, 0x2b, 0x06, 0x85, 0x6d, 0x3a, 0xf4, 0xb3, 0x30, 0x91, 0x44, 0x1d, 0xb2,
-	0x8c, 0x37, 0xe7, 0x4a, 0xfc, 0x91, 0x33, 0xf2, 0x91, 0x09, 0x2c, 0xc0, 0x58, 0xe1, 0xdd, 0xef,
-	0x95, 0x00, 0x96, 0xe3, 0x78, 0x2b, 0x89, 0xee, 0x10, 0x3f, 0x45, 0xaf, 0x42, 0x95, 0x8d, 0x42,
-	0xc3, 0x4b, 0x3d, 0x2e, 0x6d, 0xf2, 0xd2, 0xcf, 0x2f, 0x8a, 0x97, 0x59, 0xb4, 0x5f, 0xc6, 0xcc,
-	0x1c, 0xa3, 0x5e, 0xdc, 0x7f, 0x6e, 0xf1, 0xe6, 0x2e, 0x7b, 0x7e, 0x83, 0xa4, 0x5e, 0x1d, 0x49,
-	0x61, 0x60, 0x60, 0x58, 0x73, 0x45, 0x7b, 0x30, 0x46, 0x63, 0xe2, 0x73, 0xc5, 0x26, 0x2f, 0xad,
-	0x2d, 0x3e, 0xb4, 0x7d, 0x2c, 0x1a, 0xb5, 0xb7, 0x63, 0xe2, 0xd7, 0xa7, 0xa4, 0xd8, 0x31, 0xf6,
-	0x0f, 0x73, 0x21, 0x88, 0x42, 0x85, 0xa6, 0x5e, 0xda, 0xa3, 0x73, 0x65, 0x2e, 0xee, 0x46, 0x31,
-	0xe2, 0x38, 0xcb, 0xfa, 0x8c, 0x14, 0x58, 0x11, 0xff, 0xb1, 0x14, 0xe5, 0xfe, 0xb3, 0x03, 0x33,
-	0x86, 0x78, 0x3d, 0xa0, 0x29, 0xfa, 0x78, 0xdf, 0xb0, 0x2e, 0x9e, 0x6c, 0x58, 0xd9, 0xd3, 0x7c,
-	0x50, 0xcf, 0x4a, 0x61, 0x55, 0x05, 0xb1, 0x86, 0xf4, 0x0e, 0x8c, 0x07, 0x29, 0xe9, 0xd2, 0xb9,
-	0xd2, 0xc5, 0xf2, 0xb3, 0x93, 0x97, 0x2e, 0x17, 0xf2, 0x92, 0xf5, 0x69, 0x29, 0x71, 0x7c, 0x8d,
-	0xf1, 0xc6, 0x42, 0x84, 0xfb, 0xf7, 0x35, 0xfb, 0xe5, 0xd8, 0x50, 0xa3, 0xe7, 0x60, 0x92, 0x46,
-	0xbd, 0xc4, 0x27, 0x98, 0xc4, 0x11, 0x9d, 0x73, 0x2e, 0x96, 0x99, 0xc5, 0x31, 0x03, 0xdd, 0x36,
-	0x60, 0x6c, 0xd3, 0xa0, 0xdf, 0x71, 0x60, 0xaa, 0x41, 0x68, 0x1a, 0x84, 0x5c, 0xbe, 0xd2, 0xfc,
-	0xa5, 0xd1, 0x34, 0x57, 0xc0, 0x55, 0xc3, 0xb9, 0xfe, 0xa4, 0x7c, 0x8b, 0x29, 0x0b, 0x48, 0x71,
-	0x46, 0x38, 0xf3, 0xb2, 0x06, 0xa1, 0x7e, 0x12, 0xc4, 0xec, 0x3f, 0x37, 0x15, 0xcb, 0xcb, 0x56,
-	0x0d, 0x0a, 0xdb, 0x74, 0x68, 0x0f, 0xc6, 0x99, 0x17, 0xd1, 0xb9, 0x31, 0xae, 0xfc, 0x95, 0x11,
-	0x94, 0x97, 0xc3, 0xc9, 0xbc, 0xd3, 0x8c, 0x3b, 0xfb, 0x47, 0xb1, 0x90, 0x81, 0xde, 0x74, 0x60,
-	0x4e, 0xba, 0x38, 0x26, 0x62, 0x28, 0x6f, 0xb7, 0x83, 0x94, 0x74, 0x02, 0x9a, 0xce, 0x8d, 0x73,
-	0x05, 0x96, 0x4e, 0x66, 0x52, 0x57, 0x93, 0xa8, 0x17, 0xdf, 0x08, 0xc2, 0x46, 0xfd, 0xa2, 0x94,
-	0x34, 0xb7, 0x32, 0x84, 0x31, 0x1e, 0x2a, 0x12, 0x7d, 0xc5, 0x81, 0xf9, 0xd0, 0xeb, 0x12, 0x1a,
-	0x7b, 0x6c, 0x52, 0x05, 0xba, 0xde, 0xf1, 0xfc, 0x3d, 0xae, 0x51, 0xe5, 0xe1, 0x34, 0x72, 0xa5,
-	0x46, 0xf3, 0x9b, 0x43, 0x59, 0xe3, 0x07, 0x88, 0x45, 0x5f, 0x77, 0x60, 0x36, 0x4a, 0xe2, 0xb6,
-	0x17, 0x92, 0x86, 0xc2, 0xd2, 0xb9, 0x09, 0xee, 0x71, 0x1f, 0x1b, 0x61, 0x7e, 0x6e, 0xe6, 0x79,
-	0x6e, 0x44, 0x61, 0x90, 0x46, 0xc9, 0x36, 0x49, 0xd3, 0x20, 0x6c, 0xd1, 0xfa, 0xf9, 0xa3, 0xc3,
-	0x85, 0xd9, 0x3e, 0x2a, 0xdc, 0xaf, 0x0c, 0xba, 0x07, 0x93, 0xf4, 0x20, 0xf4, 0x6f, 0x07, 0x61,
-	0x23, 0xba, 0x4b, 0xe7, 0xaa, 0x23, 0xbb, 0xec, 0xb6, 0xe6, 0x26, 0x9d, 0xce, 0x70, 0xc7, 0xb6,
-	0xa8, 0xc1, 0x53, 0x66, 0x8c, 0xa8, 0x56, 0xf4, 0x94, 0x19, 0x33, 0x7a, 0x80, 0x58, 0xf4, 0x79,
-	0x07, 0xa6, 0x69, 0xd0, 0x0a, 0xbd, 0xb4, 0x97, 0x90, 0x1b, 0xe4, 0x80, 0xce, 0x01, 0x57, 0xe4,
-	0xea, 0x28, 0x43, 0x62, 0xf1, 0xab, 0x9f, 0x97, 0x0a, 0x4e, 0xdb, 0x50, 0x8a, 0xb3, 0x42, 0xdd,
-	0xbf, 0x2a, 0xc1, 0xd9, 0xfc, 0x0a, 0x8f, 0xfe, 0xd8, 0x81, 0x33, 0x77, 0xee, 0xa6, 0x3b, 0xd1,
-	0x1e, 0x09, 0x69, 0xfd, 0x80, 0x39, 0x24, 0x5f, 0xde, 0x26, 0x2f, 0xbd, 0x5a, 0xe0, 0x46, 0xb2,
-	0x78, 0x3d, 0x2b, 0xe2, 0x72, 0x98, 0x26, 0x07, 0xf5, 0x77, 0x48, 0xb5, 0xcf, 0x5c, 0xbf, 0xbd,
-	0x63, 0x63, 0x71, 0x5e, 0xa3, 0xf9, 0x2f, 0x3a, 0xf0, 0xe4, 0x20, 0x16, 0xe8, 0x2c, 0x94, 0xf7,
-	0xc8, 0x81, 0x88, 0x1a, 0x30, 0xfb, 0x89, 0x5e, 0x81, 0xf1, 0x7d, 0xaf, 0xd3, 0x23, 0x72, 0xf7,
-	0x5d, 0x1d, 0xe1, 0x2d, 0xb4, 0x5a, 0x58, 0xb0, 0xfc, 0x70, 0xe9, 0x05, 0xc7, 0xfd, 0xeb, 0x32,
-	0x4c, 0x5a, 0x0b, 0xf1, 0x63, 0x08, 0x27, 0x3a, 0x99, 0x70, 0xe2, 0x7a, 0x31, 0x1b, 0xc8, 0xd0,
-	0x78, 0x22, 0xcd, 0xc5, 0x13, 0xeb, 0x05, 0xc9, 0x7b, 0x60, 0x40, 0x81, 0x5e, 0x83, 0x5a, 0x14,
-	0xb3, 0x40, 0x91, 0xed, 0x4e, 0x63, 0x23, 0xcf, 0xdc, 0x4d, 0xc5, 0xab, 0x3e, 0x7d, 0x74, 0xb8,
-	0x50, 0xd3, 0x7f, 0xb1, 0x91, 0xe2, 0xfe, 0xa3, 0x03, 0x4f, 0x5a, 0x0a, 0xae, 0x44, 0x61, 0x23,
-	0xe0, 0x33, 0x7a, 0x11, 0xc6, 0xd2, 0x83, 0x58, 0x85, 0xa2, 0x7a, 0x8c, 0x76, 0x0e, 0x62, 0x82,
-	0x39, 0x86, 0x05, 0x9f, 0x5d, 0x42, 0xa9, 0xd7, 0x22, 0xf9, 0xe0, 0x73, 0x43, 0x80, 0xb1, 0xc2,
-	0xa3, 0x04, 0x50, 0xc7, 0xa3, 0xe9, 0x4e, 0xe2, 0x85, 0x94, 0xb3, 0xdf, 0x09, 0xba, 0x44, 0x0e,
-	0xed, 0xcf, 0x9d, 0xcc, 0x50, 0xd8, 0x13, 0xf5, 0xa7, 0x8e, 0x0e, 0x17, 0xd0, 0x7a, 0x1f, 0x27,
-	0x3c, 0x80, 0xbb, 0xfb, 0x15, 0x07, 0x9e, 0x1a, 0x1c, 0x2b, 0xa0, 0xf7, 0x40, 0x85, 0x92, 0x64,
-	0x9f, 0x24, 0xf2, 0xed, 0xcc, 0x7c, 0x70, 0x28, 0x96, 0x58, 0xb4, 0x04, 0x35, 0xbd, 0xa0, 0xc9,
-	0x77, 0x9c, 0x95, 0xa4, 0x35, 0xb3, 0x0a, 0x1a, 0x1a, 0x36, 0x68, 0xec, 0x8f, 0x8c, 0x2c, 0xf4,
-	0xa0, 0xf1, 0xc0, 0x9d, 0x63, 0xdc, 0x7f, 0x71, 0xe0, 0x8c, 0xa5, 0xd5, 0x63, 0x08, 0x1a, 0xf7,
-	0xb2, 0x41, 0xe3, 0x95, 0x62, 0x2c, 0x79, 0x48, 0xd4, 0xf8, 0xed, 0x0a, 0xcc, 0xda, 0xf6, 0xce,
-	0xf7, 0x00, 0x9e, 0xa6, 0x90, 0x38, 0xba, 0x85, 0xd7, 0xe5, 0x80, 0x9b, 0x34, 0x45, 0x80, 0xb1,
-	0xc2, 0xb3, 0x11, 0x8c, 0xbd, 0xb4, 0x2d, 0x47, 0x5b, 0x8f, 0xe0, 0x96, 0x97, 0xb6, 0x31, 0xc7,
-	0xa0, 0x8f, 0xc0, 0x4c, 0xea, 0x25, 0x2d, 0x92, 0x62, 0xb2, 0x1f, 0x50, 0xe5, 0x29, 0xb5, 0xfa,
-	0x53, 0x92, 0x76, 0x66, 0x27, 0x83, 0xc5, 0x39, 0x6a, 0x14, 0xc2, 0x58, 0x9b, 0x74, 0xba, 0x32,
-	0x58, 0xd8, 0x2a, 0xc8, 0xb1, 0xf9, 0x8b, 0x5e, 0x23, 0x9d, 0x6e, 0xbd, 0xca, 0xf4, 0x65, 0xbf,
-	0x30, 0x97, 0x83, 0x7e, 0xd3, 0x81, 0xda, 0x5e, 0x8f, 0xa6, 0x51, 0x37, 0x78, 0x9d, 0xcc, 0x55,
-	0xb9, 0xd4, 0x5b, 0x45, 0x4a, 0xbd, 0xa1, 0x98, 0x0b, 0x37, 0xd7, 0x7f, 0xb1, 0x11, 0x8b, 0x5e,
-	0x87, 0x89, 0x3d, 0x1a, 0x85, 0x21, 0x61, 0xdb, 0x3f, 0xd3, 0x60, 0xbb, 0x50, 0x0d, 0x04, 0xeb,
-	0xfa, 0x24, 0x9b, 0x52, 0xf9, 0x07, 0x2b, 0x81, 0x7c, 0x00, 0x1a, 0x41, 0x42, 0xfc, 0x34, 0x4a,
-	0x0e, 0xe6, 0xa0, 0xf8, 0x01, 0x58, 0x55, 0xcc, 0xc5, 0x00, 0xe8, 0xbf, 0xd8, 0x88, 0x45, 0xfb,
-	0x50, 0x89, 0x3b, 0xbd, 0x56, 0x10, 0xce, 0x4d, 0x72, 0x05, 0x70, 0x91, 0x0a, 0x6c, 0x71, 0xce,
-	0x75, 0x60, 0x4b, 0x88, 0xf8, 0x8d, 0xa5, 0x34, 0xf4, 0x0c, 0x8c, 0xfb, 0x6d, 0x2f, 0x49, 0xe7,
-	0xa6, 0xb8, 0x91, 0x6a, 0xaf, 0x59, 0x61, 0x40, 0x2c, 0x70, 0xee, 0xdf, 0x38, 0x30, 0x3f, 0xfc,
-	0xad, 0x84, 0xfb, 0xf8, 0xbd, 0x84, 0x8a, 0xd5, 0xb8, 0x6a, 0xbb, 0x0f, 0x07, 0x63, 0x85, 0x47,
-	0x9f, 0x81, 0x89, 0x3b, 0x72, 0x9e, 0x4b, 0xc5, 0xcf, 0xf3, 0x75, 0x39, 0xcf, 0x5a, 0xfe, 0x75,
-	0x35, 0xd7, 0x52, 0xa8, 0xfb, 0xed, 0x32, 0x9c, 0x1f, 0xe8, 0x16, 0x68, 0x11, 0x80, 0x87, 0x0f,
-	0x57, 0x02, 0x96, 0x49, 0x89, 0xdc, 0x71, 0x86, 0xed, 0xf6, 0x2f, 0x6b, 0x28, 0xb6, 0x28, 0xd0,
-	0xa7, 0x00, 0x62, 0x2f, 0xf1, 0xba, 0x24, 0x25, 0x89, 0x5a, 0xbb, 0xae, 0x8d, 0xf0, 0x32, 0x4c,
-	0x89, 0x2d, 0xc5, 0xd0, 0xc4, 0x1a, 0x1a, 0x44, 0xb1, 0x25, 0x8f, 0x65, 0x8a, 0x09, 0xe9, 0x10,
-	0x8f, 0x92, 0x4d, 0xb3, 0x9e, 0xeb, 0x4c, 0x11, 0x1b, 0x14, 0xb6, 0xe9, 0xd8, 0xc6, 0xc2, 0x5f,
-	0x81, 0xca, 0x35, 0x49, 0x6f, 0x2c, 0xfc, 0x25, 0x29, 0x96, 0x58, 0xf4, 0x86, 0x03, 0x33, 0xcd,
-	0xa0, 0x43, 0x8c, 0x74, 0x99, 0xda, 0xad, 0x8f, 0xf8, 0x86, 0x57, 0x6c, 0xa6, 0x66, 0x49, 0xcc,
-	0x80, 0x29, 0xce, 0xc9, 0x76, 0xbf, 0x52, 0x82, 0xb9, 0x61, 0x93, 0x8d, 0x62, 0x98, 0x20, 0xf7,
-	0xd2, 0x97, 0xbd, 0x84, 0xca, 0x90, 0x78, 0x94, 0x1c, 0x46, 0x32, 0x7d, 0xd9, 0x4b, 0x8c, 0x11,
-	0x5d, 0x16, 0xdc, 0xb1, 0x12, 0x83, 0x5a, 0x30, 0x96, 0x76, 0xbc, 0x22, 0xaa, 0x1c, 0x96, 0x38,
-	0x13, 0xc1, 0xac, 0x2f, 0x53, 0xcc, 0x05, 0xa0, 0xa7, 0x61, 0xac, 0x13, 0xec, 0xb2, 0x18, 0x8f,
-	0x59, 0x23, 0x5f, 0xb8, 0xd7, 0x83, 0x5d, 0x8a, 0x39, 0xd4, 0xfd, 0xbe, 0x33, 0x60, 0x54, 0xe4,
-	0xea, 0xc6, 0x0c, 0x84, 0x84, 0xfb, 0x41, 0x12, 0x85, 0x5d, 0x12, 0xa6, 0xf9, 0x82, 0xdd, 0x65,
-	0x83, 0xc2, 0x36, 0x1d, 0xfa, 0x8d, 0x01, 0x56, 0x3d, 0x4a, 0xad, 0x4a, 0xaa, 0x73, 0x62, 0xc3,
-	0x76, 0xff, 0xb6, 0x3c, 0x60, 0xa9, 0xd1, 0x5b, 0x06, 0xba, 0x04, 0xc0, 0xc2, 0x94, 0xad, 0x84,
-	0x34, 0x83, 0x7b, 0xf2, 0xad, 0x34, 0xcb, 0x4d, 0x8d, 0xc1, 0x16, 0x95, 0x7a, 0x66, 0xbb, 0xd7,
-	0x64, 0xcf, 0x94, 0xfa, 0x9f, 0x11, 0x18, 0x6c, 0x51, 0xa1, 0xe7, 0xa1, 0x12, 0x74, 0xbd, 0x16,
-	0x51, 0x63, 0xff, 0x34, 0x73, 0x92, 0x35, 0x0e, 0xb9, 0x7f, 0xb8, 0x30, 0xa3, 0x15, 0xe2, 0x20,
-	0x2c, 0x69, 0xd1, 0x37, 0x1c, 0x98, 0xf2, 0xa3, 0x6e, 0x37, 0x0a, 0xd7, 0xbd, 0x5d, 0xd2, 0x51,
-	0x05, 0x99, 0xd6, 0x23, 0xd9, 0x4d, 0x17, 0x57, 0x2c, 0x49, 0x22, 0x55, 0xd3, 0x35, 0x26, 0x1b,
-	0x85, 0x33, 0x2a, 0xb1, 0xc5, 0x7a, 0x9f, 0x24, 0x3c, 0x2e, 0x19, 0xcf, 0xc6, 0x3a, 0x2f, 0x0b,
-	0x30, 0x56, 0xf8, 0xf9, 0x8f, 0xc2, 0x6c, 0x9f, 0x8c, 0x01, 0xb9, 0xdc, 0x93, 0x76, 0x2e, 0x57,
-	0xb3, 0xb3, 0xb0, 0xdf, 0x77, 0xe0, 0x1d, 0x43, 0x36, 0x23, 0x1d, 0x8a, 0x3a, 0xc3, 0x42, 0x51,
-	0xf4, 0x49, 0x28, 0x93, 0x70, 0x5f, 0x1a, 0xe1, 0xca, 0x08, 0x63, 0x78, 0x39, 0xdc, 0x17, 0xe3,
-	0x33, 0x71, 0x74, 0xb8, 0x50, 0xbe, 0x1c, 0xee, 0x63, 0xc6, 0xd8, 0xfd, 0x42, 0x25, 0x13, 0xea,
-	0x6e, 0xab, 0xbc, 0x8a, 0x6b, 0x29, 0x03, 0xdd, 0xf5, 0x22, 0xa7, 0xce, 0x8a, 0xe3, 0x45, 0x09,
-	0x52, 0xca, 0x42, 0x5f, 0x74, 0x78, 0xe1, 0x4f, 0xc5, 0xff, 0x72, 0x6b, 0x7c, 0x04, 0x45, 0x48,
-	0xbb, 0x96, 0xa8, 0x80, 0xd8, 0x16, 0xcd, 0xcc, 0x23, 0x16, 0x35, 0x01, 0xb9, 0xa9, 0x68, 0xf3,
-	0x50, 0xa5, 0x41, 0x85, 0x47, 0x3d, 0x00, 0x7a, 0x10, 0xfa, 0x5b, 0x51, 0x27, 0xf0, 0x0f, 0x64,
-	0x3a, 0x38, 0x6a, 0xfd, 0x48, 0x30, 0x13, 0x1b, 0xaf, 0xf9, 0x8f, 0x2d, 0x41, 0xe8, 0x6b, 0x0e,
-	0xcc, 0x06, 0xad, 0x30, 0x4a, 0xc8, 0x6a, 0xd0, 0x6c, 0x92, 0x84, 0x84, 0x3e, 0x51, 0xdb, 0xd3,
-	0xce, 0x08, 0xe2, 0x55, 0x45, 0x68, 0x2d, 0xcf, 0xbb, 0xfe, 0x4e, 0x39, 0x04, 0xb3, 0x7d, 0x28,
-	0xdc, 0xaf, 0x09, 0xf2, 0x60, 0x2c, 0x08, 0x9b, 0x91, 0xac, 0x3c, 0x7e, 0x74, 0x04, 0x8d, 0xd6,
-	0xc2, 0x66, 0x64, 0x3c, 0x83, 0xfd, 0xc3, 0x9c, 0x35, 0x5a, 0x87, 0x27, 0x13, 0x99, 0x2e, 0x5c,
-	0x0b, 0x28, 0x8b, 0xc1, 0xd6, 0x83, 0x6e, 0x90, 0xf2, 0x94, 0xa1, 0x5c, 0x9f, 0x3b, 0x3a, 0x5c,
-	0x78, 0x12, 0x0f, 0xc0, 0xe3, 0x81, 0x4f, 0xb9, 0xff, 0x53, 0xcd, 0xe6, 0x44, 0x22, 0xd7, 0x7f,
-	0x1d, 0x6a, 0x89, 0x2e, 0x5c, 0x8a, 0x8d, 0x75, 0xad, 0x80, 0xd1, 0x95, 0x15, 0x06, 0x9d, 0xa6,
-	0x9a, 0x12, 0xa5, 0x11, 0xc7, 0x36, 0x58, 0x36, 0xe1, 0xd2, 0x0f, 0x46, 0xb5, 0x29, 0x29, 0xd2,
-	0x94, 0x51, 0x0e, 0x42, 0x1f, 0x73, 0x01, 0x28, 0x82, 0x4a, 0x9b, 0x78, 0x9d, 0xb4, 0x2d, 0x73,
-	0xfd, 0xab, 0x23, 0x85, 0x37, 0x8c, 0x51, 0xbe, 0x82, 0x22, 0xa0, 0x58, 0x8a, 0x41, 0x3d, 0x98,
-	0x68, 0x8b, 0xb1, 0x97, 0x7b, 0xc3, 0xf5, 0x91, 0xc6, 0x34, 0x33, 0x9b, 0xc6, 0x55, 0x25, 0x00,
-	0x2b, 0x59, 0xe8, 0xb7, 0x1c, 0x00, 0x5f, 0x95, 0x4e, 0x94, 0xb3, 0xdc, 0x2c, 0x66, 0x7d, 0xd1,
-	0x25, 0x19, 0xb3, 0xa9, 0x6a, 0x10, 0xc5, 0x96, 0x58, 0xf4, 0x2a, 0x4c, 0x25, 0xc4, 0x8f, 0x42,
-	0x3f, 0xe8, 0x90, 0xc6, 0x72, 0x3a, 0x57, 0x39, 0x75, 0x7d, 0xe5, 0x2c, 0xdb, 0xdc, 0xb0, 0xc5,
-	0x03, 0x67, 0x38, 0xa2, 0x2f, 0x38, 0x30, 0xa3, 0x6b, 0x47, 0x6c, 0x2a, 0x88, 0x4c, 0xa3, 0xd7,
-	0x8a, 0x28, 0x53, 0x71, 0x86, 0x75, 0xc4, 0x02, 0xd6, 0x2c, 0x0c, 0xe7, 0x84, 0xa2, 0x57, 0x00,
-	0xa2, 0x5d, 0x5e, 0xa4, 0x61, 0xef, 0x59, 0x3d, 0xf5, 0x7b, 0xce, 0x88, 0x32, 0xa3, 0xe2, 0x80,
-	0x2d, 0x6e, 0xe8, 0x06, 0x80, 0xf0, 0x93, 0x9d, 0x83, 0x98, 0xf0, 0x6c, 0xb9, 0x56, 0x7f, 0x9f,
-	0x1a, 0xf9, 0x6d, 0x8d, 0xb9, 0x7f, 0xb8, 0xd0, 0x9f, 0xe9, 0xf0, 0xea, 0x98, 0xf5, 0x38, 0xba,
-	0x07, 0x13, 0xb4, 0xd7, 0xed, 0x7a, 0x3a, 0xf1, 0xdd, 0x28, 0x68, 0xc3, 0x13, 0x4c, 0x8d, 0x49,
-	0x4a, 0x00, 0x56, 0xe2, 0xdc, 0x10, 0x50, 0x3f, 0x3d, 0x7a, 0x1e, 0xa6, 0xc8, 0xbd, 0x94, 0x24,
-	0xa1, 0xd7, 0xb9, 0x85, 0xd7, 0x55, 0x1e, 0xc6, 0xa7, 0xfd, 0xb2, 0x05, 0xc7, 0x19, 0x2a, 0xe4,
-	0xea, 0x68, 0xad, 0xc4, 0xe9, 0xc1, 0x44, 0x6b, 0x2a, 0x36, 0x73, 0x7f, 0xbb, 0x94, 0xd9, 0xed,
-	0x77, 0x12, 0x42, 0x50, 0x07, 0xc6, 0xc3, 0xa8, 0xa1, 0xd7, 0xb7, 0xab, 0x05, 0xac, 0x6f, 0x9b,
-	0x51, 0xc3, 0x3a, 0x39, 0x63, 0xff, 0x28, 0x16, 0x42, 0xf8, 0x01, 0x83, 0x3a, 0x86, 0xe1, 0x08,
-	0x19, 0xda, 0x14, 0x26, 0x56, 0x1f, 0x30, 0xdc, 0xb4, 0xa5, 0xe0, 0xac, 0x50, 0xf7, 0x87, 0x4e,
-	0x26, 0x05, 0xbe, 0xed, 0xa5, 0x7e, 0xfb, 0xf2, 0x3e, 0x0b, 0xfe, 0x6f, 0x64, 0x4a, 0xaa, 0xbf,
-	0x64, 0x97, 0x54, 0xef, 0x1f, 0x2e, 0xbc, 0x77, 0x58, 0x2f, 0xc1, 0x5d, 0xc6, 0x61, 0x91, 0xb3,
-	0xb0, 0xaa, 0xaf, 0x9f, 0x86, 0x49, 0x4b, 0x63, 0xb9, 0x94, 0x17, 0x55, 0xdc, 0xd3, 0x71, 0x8c,
-	0x05, 0xc4, 0xb6, 0x3c, 0xf7, 0xeb, 0xe3, 0x30, 0x21, 0x4f, 0x13, 0x4f, 0x5c, 0x4e, 0x55, 0x21,
-	0x69, 0x69, 0x68, 0x48, 0x1a, 0x43, 0xc5, 0xe7, 0x0d, 0x11, 0x72, 0xbf, 0x18, 0x25, 0xe1, 0x97,
-	0xda, 0x89, 0x06, 0x0b, 0xa3, 0x93, 0xf8, 0x8f, 0xa5, 0x1c, 0xf4, 0xa6, 0x03, 0x67, 0x7c, 0x96,
-	0x43, 0xf9, 0x66, 0x49, 0x1b, 0x1b, 0xf9, 0x88, 0x61, 0x25, 0xcb, 0xd1, 0x9c, 0xf1, 0xe4, 0x10,
-	0x38, 0x2f, 0x1b, 0xbd, 0x08, 0xd3, 0x62, 0xb4, 0x5e, 0xce, 0x24, 0x11, 0xe6, 0x6c, 0xcb, 0x46,
-	0xe2, 0x2c, 0x2d, 0x5a, 0x14, 0x99, 0x18, 0xaf, 0x45, 0x53, 0x1e, 0x20, 0xc9, 0x1a, 0x8b, 0x2e,
-	0x56, 0x53, 0x6c, 0x51, 0xa0, 0x04, 0x50, 0x42, 0x9a, 0x09, 0xa1, 0x6d, 0x4c, 0x5e, 0xeb, 0x11,
-	0x9a, 0xf2, 0xe5, 0x74, 0xe2, 0xe1, 0xca, 0xf2, 0xb8, 0x8f, 0x13, 0x1e, 0xc0, 0x1d, 0xb5, 0x65,
-	0xf8, 0x56, 0x1d, 0xd9, 0x60, 0xe5, 0x04, 0x0f, 0x8b, 0xe2, 0xdc, 0xff, 0x75, 0xe0, 0xac, 0x32,
-	0x02, 0xcf, 0x6f, 0x13, 0x86, 0x42, 0x1f, 0x81, 0x19, 0x1d, 0x07, 0xad, 0x44, 0x3d, 0x99, 0xba,
-	0x97, 0x4d, 0xa9, 0x04, 0x67, 0xb0, 0x38, 0x47, 0x8d, 0x96, 0xa0, 0xc6, 0x34, 0x12, 0x8f, 0x96,
-	0xf8, 0xa3, 0x3a, 0xd6, 0x5a, 0xde, 0x5a, 0x93, 0x4f, 0x19, 0x1a, 0x14, 0xc1, 0x6c, 0xc7, 0xa3,
-	0x29, 0xd7, 0x80, 0x45, 0x46, 0x0f, 0x79, 0xf2, 0xc1, 0xcf, 0x9d, 0xd7, 0xf3, 0x8c, 0x70, 0x3f,
-	0x6f, 0xf7, 0xcf, 0xca, 0x30, 0x9d, 0xb1, 0x7d, 0xf4, 0x7e, 0xa8, 0xf6, 0x28, 0x5b, 0xcd, 0x75,
-	0x3a, 0xa8, 0xcf, 0x0b, 0x6e, 0x49, 0x38, 0xd6, 0x14, 0x8c, 0x3a, 0xf6, 0x28, 0xbd, 0x1b, 0x25,
-	0x0d, 0xe9, 0xa9, 0x9a, 0x7a, 0x4b, 0xc2, 0xb1, 0xa6, 0x40, 0x1f, 0x84, 0xc9, 0x5d, 0xe2, 0x25,
-	0x24, 0xe1, 0x67, 0x84, 0xf9, 0x42, 0x59, 0xdd, 0xa0, 0xb0, 0x4d, 0xc7, 0xdd, 0x2e, 0xed, 0xd0,
-	0x95, 0x4e, 0x40, 0xc2, 0x54, 0xa8, 0x59, 0x80, 0xdb, 0xed, 0xac, 0x6f, 0xdb, 0x1c, 0x8d, 0xdb,
-	0xe5, 0x10, 0x38, 0x2f, 0x1b, 0x7d, 0xce, 0x81, 0x69, 0xef, 0x2e, 0x35, 0x1d, 0x59, 0xdc, 0xef,
-	0x46, 0x5b, 0x80, 0x32, 0x1d, 0x5e, 0xf5, 0x59, 0xe6, 0xbd, 0x19, 0x10, 0xce, 0x4a, 0x74, 0xbf,
-	0x51, 0x86, 0x49, 0xcb, 0xa6, 0x07, 0x2e, 0x4d, 0xce, 0x4f, 0xd2, 0xd2, 0x54, 0x3a, 0xc5, 0xd2,
-	0xf4, 0x29, 0xa8, 0xf9, 0xca, 0x09, 0x0b, 0xe8, 0xd1, 0xca, 0xfb, 0xb5, 0x71, 0x42, 0x0d, 0xc2,
-	0x46, 0x20, 0xba, 0x0a, 0xb3, 0x16, 0x1b, 0xe9, 0xbd, 0x63, 0xdc, 0x7b, 0x75, 0xf2, 0xb9, 0x9c,
-	0x27, 0xc0, 0xfd, 0xcf, 0xb8, 0x3f, 0x70, 0xf4, 0x1c, 0x3d, 0x86, 0xa3, 0xbb, 0x56, 0xf6, 0xe8,
-	0xae, 0x3e, 0xfa, 0x80, 0x0d, 0x39, 0xb6, 0xdb, 0x84, 0x89, 0x95, 0xa8, 0xdb, 0xf5, 0xc2, 0x06,
-	0x7a, 0x37, 0x4c, 0xf8, 0xe2, 0xa7, 0x0c, 0x0e, 0xf9, 0xa1, 0x8e, 0xc4, 0x62, 0x85, 0x43, 0x4f,
-	0xc3, 0x98, 0x97, 0xb4, 0x54, 0x40, 0xc8, 0x4b, 0xa7, 0xcb, 0x49, 0x8b, 0x62, 0x0e, 0x75, 0xdf,
-	0x2c, 0x01, 0xac, 0x44, 0xdd, 0xd8, 0x4b, 0x48, 0x63, 0x27, 0xfa, 0x7f, 0x5f, 0xf5, 0x71, 0xdf,
-	0x70, 0x00, 0xb1, 0xf1, 0x88, 0x42, 0x12, 0x9a, 0x62, 0x2d, 0xdb, 0x4c, 0x7c, 0x05, 0x95, 0x2b,
-	0xb3, 0xb1, 0x63, 0x85, 0xc0, 0x86, 0xe6, 0x04, 0x11, 0xd4, 0x33, 0xaa, 0x58, 0x58, 0xce, 0x9e,
-	0x37, 0xf1, 0x03, 0x08, 0x59, 0x3b, 0x74, 0xbf, 0x5c, 0x82, 0xa7, 0xc4, 0xa2, 0xb3, 0xe1, 0x85,
-	0x5e, 0x8b, 0x74, 0x99, 0x56, 0x27, 0x2d, 0x1b, 0xbe, 0xca, 0x36, 0xf0, 0x40, 0x9d, 0x2f, 0x8d,
-	0x64, 0x93, 0xc2, 0x96, 0x84, 0xf5, 0xac, 0x85, 0x41, 0x8a, 0x39, 0x67, 0x14, 0x43, 0x55, 0x35,
-	0xcc, 0xca, 0xa5, 0xa2, 0x08, 0x29, 0xda, 0xd1, 0xae, 0x4a, 0xde, 0x58, 0x4b, 0x71, 0xbf, 0xe3,
-	0x40, 0x7e, 0xfd, 0xe3, 0x51, 0xad, 0x68, 0x01, 0xc9, 0x47, 0xb5, 0xd9, 0xa6, 0x8d, 0x53, 0xb4,
-	0x41, 0x7c, 0x1c, 0x26, 0xbd, 0x34, 0x25, 0xdd, 0x58, 0x04, 0x5a, 0xe5, 0x87, 0xcb, 0x5b, 0x37,
-	0xa2, 0x46, 0xd0, 0x0c, 0x78, 0x80, 0x65, 0xb3, 0x73, 0x5f, 0x82, 0xaa, 0xaa, 0xc4, 0x9e, 0x60,
-	0x1a, 0x9f, 0xc9, 0x54, 0x95, 0x87, 0x18, 0xca, 0x1b, 0x25, 0x98, 0xb9, 0x1a, 0xf6, 0xb6, 0xae,
-	0x6e, 0xf5, 0x76, 0x3b, 0x81, 0x7f, 0x83, 0x1c, 0xb0, 0xe7, 0xf6, 0xc8, 0xc1, 0xda, 0xaa, 0x64,
-	0xad, 0x9f, 0xbb, 0xc1, 0x80, 0x58, 0xe0, 0x58, 0x54, 0xd0, 0x0c, 0xc2, 0x16, 0x49, 0xe2, 0x24,
-	0x90, 0x71, 0x92, 0x15, 0x15, 0x5c, 0x31, 0x28, 0x6c, 0xd3, 0x31, 0xde, 0xd1, 0xdd, 0x90, 0x24,
-	0x79, 0xe3, 0xbd, 0xc9, 0x80, 0x58, 0xe0, 0x18, 0x51, 0x9a, 0xf4, 0x68, 0x2a, 0x8f, 0xd8, 0x34,
-	0xd1, 0x0e, 0x03, 0x62, 0x81, 0x63, 0x93, 0x42, 0x7b, 0xbb, 0x3c, 0x83, 0xcf, 0x55, 0xe1, 0xb7,
-	0x05, 0x18, 0x2b, 0x3c, 0x23, 0xdd, 0x23, 0x07, 0xab, 0x6c, 0x05, 0xaf, 0x64, 0x49, 0x6f, 0x08,
-	0x30, 0x56, 0x78, 0xf7, 0xc8, 0x01, 0x94, 0x1d, 0x8e, 0xc7, 0xb0, 0x09, 0x84, 0xd9, 0x4d, 0x60,
-	0x94, 0x4a, 0x4b, 0x56, 0xf7, 0x21, 0x7b, 0xc1, 0x1f, 0x39, 0x30, 0x65, 0xd7, 0xda, 0x50, 0x2b,
-	0xe7, 0x08, 0x37, 0xb3, 0x8e, 0x70, 0xff, 0x70, 0xe1, 0x57, 0x06, 0x5d, 0x23, 0x68, 0x05, 0x69,
-	0x14, 0xd3, 0x0f, 0x90, 0xb0, 0x15, 0x84, 0x84, 0x27, 0xb2, 0xa2, 0x46, 0x97, 0x29, 0xe4, 0xad,
-	0x44, 0x0d, 0xf2, 0x10, 0x9e, 0xe4, 0xde, 0x86, 0xd9, 0xbe, 0xe3, 0xce, 0x13, 0x18, 0xfd, 0xb1,
-	0xdd, 0x25, 0xee, 0x9b, 0x0e, 0x4c, 0x67, 0x8e, 0x8a, 0x0b, 0x72, 0x25, 0xee, 0x12, 0x11, 0x2f,
-	0xd0, 0x26, 0x41, 0x28, 0xf2, 0xdb, 0xaa, 0xe5, 0x12, 0x06, 0x85, 0x6d, 0x3a, 0x77, 0x03, 0x78,
-	0x4a, 0x53, 0x94, 0x43, 0xbf, 0x04, 0x55, 0xc6, 0x8e, 0x4d, 0x78, 0x51, 0x2c, 0x23, 0xa8, 0xaa,
-	0x16, 0x41, 0xe4, 0x42, 0x39, 0xf0, 0x54, 0x4a, 0xa5, 0x8d, 0x7a, 0x8d, 0xd2, 0x1e, 0x5f, 0xae,
-	0x18, 0x12, 0x3d, 0x03, 0x65, 0x72, 0x2f, 0xce, 0xe7, 0x4e, 0x97, 0xef, 0xc5, 0x41, 0x42, 0x28,
-	0x23, 0x22, 0xf7, 0x62, 0x34, 0x0f, 0xa5, 0xa0, 0x21, 0x97, 0x01, 0x90, 0x34, 0xa5, 0xb5, 0x55,
-	0x5c, 0x0a, 0x1a, 0x6e, 0x0f, 0x6a, 0xba, 0x27, 0x11, 0xb5, 0x95, 0x77, 0x38, 0x23, 0x1f, 0x63,
-	0x29, 0xa6, 0x43, 0xfc, 0xa2, 0x07, 0x60, 0x8e, 0x93, 0x8b, 0xb2, 0x8a, 0x8b, 0x30, 0xe6, 0x47,
-	0x0d, 0x22, 0xcd, 0x41, 0xb3, 0xe1, 0x6e, 0xc1, 0x31, 0xee, 0x6d, 0x98, 0xb9, 0x11, 0x46, 0x77,
-	0x43, 0xb6, 0x56, 0x5d, 0x09, 0x48, 0xa7, 0xc1, 0x18, 0x37, 0xd9, 0x8f, 0xfc, 0x0a, 0xcc, 0xb1,
-	0x58, 0xe0, 0x74, 0xfb, 0x5e, 0x69, 0x58, 0xfb, 0x9e, 0xfb, 0x25, 0x07, 0xce, 0xe6, 0x8f, 0x8f,
-	0x7f, 0x6c, 0x11, 0xc9, 0x67, 0x99, 0x32, 0xea, 0xe4, 0xf5, 0x66, 0x2c, 0xea, 0xd9, 0x2f, 0xc0,
-	0xd4, 0x6e, 0x2f, 0xe8, 0x34, 0xe4, 0x7f, 0xa9, 0x8f, 0x3e, 0x84, 0xad, 0x5b, 0x38, 0x9c, 0xa1,
-	0x44, 0x97, 0x00, 0x76, 0x83, 0xd0, 0x4b, 0x0e, 0xb6, 0x8c, 0xb7, 0xeb, 0xea, 0x79, 0x5d, 0x63,
-	0xb0, 0x45, 0xe5, 0xfe, 0x53, 0x09, 0x4c, 0x8b, 0x24, 0x6a, 0xca, 0x23, 0x12, 0x67, 0xe4, 0x34,
-	0x90, 0x25, 0xe6, 0xa6, 0x13, 0xb3, 0x9a, 0x3b, 0x21, 0xf9, 0xbc, 0x03, 0x93, 0x2c, 0xe8, 0x09,
-	0xbc, 0x94, 0x34, 0xea, 0x07, 0x32, 0xaa, 0xda, 0x28, 0xa2, 0x9c, 0xbe, 0x26, 0xd8, 0x46, 0x89,
-	0x59, 0x66, 0xd6, 0x8c, 0x24, 0x6c, 0x8b, 0x45, 0x9f, 0x90, 0x55, 0x99, 0x72, 0x31, 0x87, 0x6a,
-	0xd5, 0x5c, 0x29, 0x86, 0x02, 0xea, 0x57, 0xeb, 0x94, 0x75, 0x89, 0x25, 0xa8, 0x79, 0xbd, 0x34,
-	0xea, 0x32, 0x8d, 0xf9, 0x30, 0x55, 0xad, 0xca, 0x8b, 0x42, 0x60, 0x43, 0xe3, 0xfe, 0x60, 0x0c,
-	0x72, 0xe7, 0x08, 0xa8, 0x67, 0x37, 0xd8, 0x3a, 0x05, 0x36, 0xd8, 0x6a, 0x4d, 0x06, 0x35, 0xd9,
-	0xb2, 0x3c, 0x2e, 0x6e, 0x7b, 0x54, 0x79, 0xc9, 0x4b, 0xca, 0x05, 0xb6, 0x18, 0xf0, 0xfe, 0xe1,
-	0xc2, 0xaf, 0x9e, 0x6c, 0xff, 0x64, 0x06, 0xb3, 0x24, 0x9a, 0x0d, 0x8c, 0x68, 0xce, 0x03, 0x0b,
-	0xfe, 0xf6, 0x0e, 0x5a, 0x3e, 0x26, 0x16, 0xfd, 0x8c, 0x38, 0x5d, 0xc6, 0x84, 0xf6, 0x3a, 0xa9,
-	0xac, 0xbd, 0x6c, 0x16, 0x65, 0xe6, 0x82, 0xab, 0x39, 0x66, 0x16, 0xff, 0xb1, 0x25, 0x11, 0x7d,
-	0x0c, 0x6a, 0x34, 0xf5, 0x92, 0xf4, 0x21, 0x4f, 0xaa, 0xf4, 0x80, 0x6f, 0x2b, 0x26, 0xd8, 0xf0,
-	0x43, 0xaf, 0x00, 0x34, 0x83, 0x30, 0xa0, 0xed, 0x87, 0x2c, 0x68, 0x72, 0xc5, 0xaf, 0x68, 0x0e,
-	0xd8, 0xe2, 0xe6, 0x7e, 0x06, 0xce, 0xe5, 0xef, 0x7f, 0xc8, 0xb8, 0xb8, 0x95, 0x44, 0xbd, 0x38,
-	0xbf, 0x2a, 0xf3, 0x0b, 0x14, 0x58, 0xe0, 0xd8, 0x6a, 0xb9, 0x17, 0x84, 0x8d, 0xfc, 0x6a, 0x79,
-	0x23, 0x08, 0x1b, 0x98, 0x63, 0x4e, 0xd0, 0x41, 0xfc, 0xe7, 0x0e, 0x5c, 0x3c, 0xee, 0x9a, 0x0a,
-	0x4b, 0xcf, 0xef, 0x7a, 0x49, 0x28, 0xfb, 0x05, 0xb9, 0x3b, 0xde, 0xf6, 0x92, 0x10, 0x73, 0x28,
-	0xda, 0x87, 0x8a, 0x38, 0x57, 0x97, 0x31, 0xe5, 0x66, 0x81, 0x37, 0x66, 0x58, 0x60, 0xa9, 0x53,
-	0x25, 0x71, 0xa0, 0x8f, 0xa5, 0x34, 0xf7, 0x3a, 0xa0, 0x9b, 0xfb, 0x24, 0x49, 0x82, 0x86, 0xd5,
-	0x05, 0x80, 0x9e, 0x87, 0xa9, 0x3b, 0xdb, 0x37, 0x37, 0xb7, 0xa2, 0x20, 0xe4, 0x5d, 0x51, 0xd6,
-	0x99, 0xd4, 0x75, 0x0b, 0x8e, 0x33, 0x54, 0xee, 0x37, 0x4b, 0x30, 0x69, 0xdd, 0xa6, 0x3a, 0xc1,
-	0x86, 0x9c, 0xbb, 0xfd, 0x55, 0x3a, 0xe1, 0xed, 0xaf, 0x67, 0xa1, 0x1a, 0x47, 0x9d, 0xc0, 0x0f,
-	0x74, 0xb3, 0xd2, 0x14, 0xaf, 0x85, 0x4a, 0x18, 0xd6, 0x58, 0x94, 0x42, 0x4d, 0x5f, 0xd9, 0x90,
-	0xc7, 0xcf, 0x85, 0xc4, 0x23, 0xda, 0xd6, 0xcd, 0x55, 0x0c, 0x23, 0x08, 0xb9, 0x50, 0xe1, 0xc6,
-	0x25, 0x8e, 0x9d, 0xe5, 0xe1, 0x1c, 0xb7, 0x3a, 0x8a, 0x25, 0xc6, 0xfd, 0x7e, 0x09, 0x6a, 0x98,
-	0xc4, 0xd1, 0x4a, 0x42, 0x1a, 0x14, 0xbd, 0x0b, 0xca, 0xbd, 0xa4, 0x23, 0x47, 0x6a, 0x52, 0x32,
-	0x2f, 0xdf, 0xc2, 0xeb, 0x98, 0xc1, 0x33, 0xcb, 0x72, 0xe9, 0x54, 0xe5, 0xe2, 0xf2, 0xb1, 0xe5,
-	0xe2, 0x17, 0x61, 0x9a, 0xd2, 0xf6, 0x56, 0x12, 0xec, 0x7b, 0x29, 0x33, 0x15, 0x99, 0xc4, 0x99,
-	0x1a, 0xe2, 0xf6, 0x35, 0x83, 0xc4, 0x59, 0x5a, 0x74, 0x15, 0x66, 0x4d, 0xdd, 0x96, 0x24, 0x29,
-	0xcf, 0xd9, 0x44, 0x7a, 0xa7, 0xab, 0x78, 0xa6, 0xd2, 0x2b, 0x09, 0x70, 0xff, 0x33, 0x68, 0x15,
-	0xce, 0x66, 0x80, 0x4c, 0x11, 0x91, 0xfb, 0xcd, 0x49, 0x3e, 0x67, 0x33, 0x7c, 0x98, 0x2e, 0x7d,
-	0x4f, 0xb8, 0x6f, 0x39, 0x30, 0xad, 0x07, 0xf5, 0x31, 0x24, 0x82, 0x41, 0x36, 0x11, 0x5c, 0x1d,
-	0xe9, 0x58, 0x53, 0xaa, 0x3d, 0x24, 0xd6, 0xfd, 0xc3, 0x0a, 0x00, 0xbf, 0xc0, 0x19, 0xf0, 0xf6,
-	0x86, 0x8b, 0x30, 0x96, 0x90, 0x38, 0xca, 0xfb, 0x16, 0xa3, 0xc0, 0x1c, 0xf3, 0x93, 0x6b, 0x33,
-	0x83, 0x8a, 0xe8, 0xe3, 0x3f, 0xc6, 0x22, 0xfa, 0x36, 0x9c, 0x0f, 0x42, 0x4a, 0xfc, 0x5e, 0x22,
-	0x97, 0xc0, 0x6b, 0x11, 0xd5, 0xf6, 0x57, 0xad, 0xbf, 0x4b, 0x32, 0x3a, 0xbf, 0x36, 0x88, 0x08,
-	0x0f, 0x7e, 0x96, 0x8d, 0xa7, 0x42, 0xf0, 0xcd, 0xae, 0x6a, 0xe5, 0x5e, 0x12, 0x8e, 0x35, 0x05,
-	0x0b, 0xa4, 0x48, 0xe8, 0xed, 0x76, 0xc8, 0x7a, 0x93, 0xf2, 0x63, 0x38, 0x2b, 0x90, 0xba, 0x2c,
-	0x10, 0x57, 0xb6, 0xb1, 0xa1, 0x19, 0xec, 0x77, 0xb5, 0x82, 0xfc, 0x0e, 0x4e, 0xeb, 0x77, 0x3a,
-	0xb5, 0x99, 0x1c, 0x7a, 0x33, 0x49, 0xed, 0x05, 0x53, 0x43, 0xf7, 0x82, 0x8f, 0xc0, 0x4c, 0x10,
-	0xb6, 0x49, 0x12, 0xa4, 0xa4, 0xc1, 0x1d, 0x61, 0x6e, 0x9a, 0x0f, 0x84, 0x3e, 0x06, 0x5c, 0xcb,
-	0x60, 0x71, 0x8e, 0xda, 0xfd, 0x62, 0x09, 0xce, 0x1b, 0x07, 0x61, 0x9a, 0x05, 0x4d, 0x66, 0x25,
-	0xbc, 0x83, 0x56, 0x9c, 0x7c, 0x58, 0x17, 0xf9, 0x75, 0xea, 0xb1, 0xad, 0x31, 0xd8, 0xa2, 0x62,
-	0xf3, 0xe7, 0x93, 0x84, 0x9f, 0xee, 0xe7, 0xbd, 0x67, 0x45, 0xc2, 0xb1, 0xa6, 0xe0, 0xdf, 0x0a,
-	0x20, 0x49, 0x2a, 0x0b, 0x59, 0xf9, 0x23, 0xb7, 0x15, 0x83, 0xc2, 0x36, 0x1d, 0xdb, 0xc7, 0x7c,
-	0x35, 0x79, 0xcc, 0x83, 0xa6, 0xc4, 0x3e, 0xa6, 0xe7, 0x4b, 0x63, 0x95, 0x3a, 0xfc, 0xa8, 0x66,
-	0xbc, 0x5f, 0x1d, 0x1e, 0xd7, 0x6b, 0x0a, 0xf7, 0xbf, 0x1c, 0x78, 0xe7, 0xc0, 0xa1, 0x78, 0x0c,
-	0x4b, 0x62, 0x2f, 0xbb, 0x24, 0x6e, 0x8d, 0xb8, 0x24, 0xf6, 0xbd, 0xc2, 0x90, 0xe5, 0xf1, 0x1f,
-	0x1c, 0x98, 0x31, 0xf4, 0x8f, 0xe1, 0x3d, 0x9b, 0xc5, 0x5d, 0xfc, 0x37, 0x7a, 0xd7, 0x6b, 0x7d,
-	0x2f, 0xf6, 0x16, 0x7f, 0x31, 0x11, 0xc8, 0x2d, 0xfb, 0xea, 0x1e, 0xe0, 0x31, 0x71, 0xd5, 0x3e,
-	0x54, 0x78, 0x83, 0x39, 0x2d, 0x20, 0x9a, 0xcc, 0x0a, 0xe7, 0x75, 0x09, 0x13, 0x4d, 0xf2, 0xbf,
-	0x14, 0x4b, 0x69, 0xcc, 0x4c, 0x1b, 0x01, 0x65, 0x8b, 0x54, 0x43, 0xd6, 0x4f, 0xf4, 0x10, 0xae,
-	0x4a, 0x38, 0xd6, 0x14, 0x6e, 0x17, 0xe6, 0xb2, 0xcc, 0x57, 0x49, 0x93, 0x67, 0xc0, 0x27, 0x7a,
-	0x47, 0x96, 0x7c, 0xf2, 0xa7, 0xd6, 0x7b, 0x5e, 0xfe, 0x26, 0xe0, 0xb2, 0x42, 0x60, 0x43, 0xe3,
-	0xfe, 0x89, 0x03, 0xe7, 0x06, 0xbc, 0x4c, 0x81, 0x75, 0xa3, 0xd4, 0x38, 0xff, 0x90, 0xdb, 0x99,
-	0x0d, 0xd2, 0xf4, 0x54, 0x72, 0x67, 0xa5, 0x82, 0xab, 0x02, 0x8c, 0x15, 0xde, 0xfd, 0x0f, 0x07,
-	0xce, 0x64, 0x75, 0xa5, 0xe8, 0x3a, 0x20, 0xf1, 0x32, 0xab, 0x01, 0xf5, 0xa3, 0x7d, 0x92, 0x1c,
-	0xb0, 0x37, 0x17, 0x5a, 0xcf, 0x4b, 0x4e, 0x68, 0xb9, 0x8f, 0x02, 0x0f, 0x78, 0x0a, 0x7d, 0x89,
-	0x1f, 0xc4, 0xa9, 0xd1, 0x56, 0x66, 0xb2, 0x5d, 0x98, 0x99, 0x98, 0x99, 0xb4, 0xc3, 0x79, 0x2d,
-	0x0f, 0xdb, 0xc2, 0xdd, 0x1f, 0x95, 0x61, 0x4a, 0x3d, 0xce, 0xd3, 0x8f, 0x82, 0x12, 0xb7, 0xcc,
-	0x5d, 0xd1, 0xf2, 0x29, 0xee, 0x8a, 0x8e, 0x3d, 0x28, 0x61, 0x11, 0x77, 0x17, 0x4d, 0xd8, 0x62,
-	0x2d, 0xf4, 0x3b, 0x06, 0x85, 0x6d, 0x3a, 0xa6, 0x49, 0x27, 0xd8, 0x27, 0xe2, 0xa1, 0x4a, 0x56,
-	0x93, 0x75, 0x85, 0xc0, 0x86, 0x86, 0x69, 0xd2, 0x08, 0x9a, 0x4d, 0x1e, 0x3a, 0x58, 0x9a, 0xb0,
-	0xd1, 0xc1, 0x1c, 0xc3, 0x28, 0xda, 0x51, 0xb4, 0x27, 0xa3, 0x05, 0x4d, 0x71, 0x2d, 0x8a, 0xf6,
-	0x30, 0xc7, 0xa0, 0x0d, 0x38, 0x17, 0x46, 0x49, 0xd7, 0xeb, 0x04, 0xaf, 0x93, 0x86, 0x96, 0x22,
-	0xa3, 0x84, 0x9f, 0x91, 0x0f, 0x9c, 0xdb, 0xec, 0x27, 0xc1, 0x83, 0x9e, 0x63, 0xe6, 0x17, 0x27,
-	0xa4, 0x11, 0xf8, 0xa9, 0xcd, 0x0d, 0xb2, 0xe6, 0xb7, 0xd5, 0x47, 0x81, 0x07, 0x3c, 0xe5, 0xfe,
-	0x27, 0xdf, 0xa0, 0x86, 0x34, 0x9f, 0x3f, 0xb6, 0xbc, 0x3d, 0x6b, 0x20, 0x63, 0x27, 0x30, 0x10,
-	0x96, 0x17, 0xd3, 0x28, 0xd4, 0x79, 0xf1, 0xf8, 0xd0, 0xbc, 0xd8, 0xa2, 0x72, 0xbf, 0x33, 0x0e,
-	0x4f, 0xe9, 0xae, 0x45, 0x92, 0xde, 0x8d, 0x92, 0xbd, 0x20, 0x6c, 0xf1, 0x33, 0x84, 0xaf, 0x39,
-	0x30, 0x25, 0x0c, 0x45, 0x5e, 0x9f, 0x11, 0x35, 0x73, 0xbf, 0x88, 0xfe, 0xc8, 0x8c, 0xa4, 0xc5,
-	0x1d, 0x4b, 0x4a, 0xee, 0xea, 0x8c, 0x8d, 0xc2, 0x19, 0x75, 0xd0, 0xeb, 0x00, 0xea, 0xae, 0x6e,
-	0xb3, 0x88, 0xeb, 0xca, 0x4a, 0x39, 0x4c, 0x9a, 0x26, 0x04, 0xdb, 0xd1, 0x12, 0xb0, 0x25, 0x0d,
-	0x7d, 0xc1, 0x81, 0x4a, 0x47, 0x8c, 0x8a, 0xa8, 0x81, 0x7e, 0xa2, 0xf8, 0x51, 0xb1, 0xc7, 0x43,
-	0x6f, 0x6a, 0x72, 0x24, 0xa4, 0x70, 0x84, 0x61, 0x22, 0x08, 0x5b, 0x09, 0xa1, 0xaa, 0x82, 0xf0,
-	0x5e, 0x2b, 0x8c, 0x58, 0xf4, 0xa3, 0x84, 0xf0, 0xa0, 0x21, 0xf2, 0x1a, 0x75, 0xaf, 0xe3, 0x85,
-	0x3e, 0x49, 0xd6, 0x04, 0xb9, 0x59, 0xdf, 0x25, 0x00, 0x2b, 0x46, 0x7d, 0x4d, 0xbf, 0xe3, 0x27,
-	0x69, 0xfa, 0x9d, 0xff, 0x28, 0xcc, 0xf6, 0x4d, 0xe3, 0x69, 0x6e, 0x27, 0xcd, 0x7f, 0x08, 0x26,
-	0x1f, 0xf6, 0x62, 0xd3, 0x9f, 0x56, 0xcc, 0x22, 0xbd, 0x19, 0x35, 0x78, 0xb7, 0x6b, 0x62, 0x66,
-	0x53, 0x46, 0x58, 0x45, 0xd9, 0x86, 0x75, 0xaf, 0x53, 0x03, 0xb1, 0x2d, 0x8f, 0x59, 0x66, 0xec,
-	0x25, 0x24, 0x7c, 0xa4, 0x96, 0xb9, 0xa5, 0x25, 0x60, 0x4b, 0x1a, 0x22, 0x99, 0xd2, 0xfc, 0xca,
-	0x88, 0xa5, 0x79, 0x16, 0xee, 0x0d, 0xbc, 0xf3, 0xf2, 0xa6, 0x03, 0x33, 0x61, 0xc6, 0x5e, 0x65,
-	0x51, 0xf8, 0xa5, 0xc2, 0x1d, 0x41, 0xb4, 0xf8, 0x67, 0x61, 0x38, 0x27, 0x1c, 0x2d, 0xc3, 0x19,
-	0x35, 0x03, 0xd9, 0x56, 0x58, 0x9d, 0x6b, 0xe3, 0x2c, 0x1a, 0xe7, 0xe9, 0xad, 0xb6, 0xf5, 0xca,
-	0xb0, 0xb6, 0x75, 0xb4, 0xa7, 0x6f, 0xa8, 0x4c, 0x14, 0x7b, 0x43, 0x05, 0x06, 0xdc, 0x4e, 0xb9,
-	0x0d, 0x35, 0x3f, 0x21, 0x5e, 0xfa, 0x90, 0xb7, 0x16, 0xf8, 0xed, 0xf6, 0x15, 0xc5, 0x00, 0x1b,
-	0x5e, 0xee, 0x57, 0xcb, 0x70, 0x56, 0x0d, 0x87, 0xaa, 0xb0, 0xb2, 0x0d, 0x47, 0xc8, 0x35, 0x91,
-	0x9b, 0xde, 0x70, 0xae, 0x29, 0x04, 0x36, 0x34, 0x2c, 0x64, 0x14, 0xd1, 0x1b, 0xcd, 0x9f, 0x1e,
-	0xc8, 0xa8, 0x10, 0x2b, 0x3c, 0xfa, 0xea, 0xc0, 0x4b, 0x62, 0x05, 0x1c, 0x5e, 0xf5, 0x95, 0x87,
-	0x4f, 0x79, 0x3b, 0xec, 0x0d, 0x07, 0xce, 0xec, 0x65, 0xce, 0x4b, 0xd5, 0x42, 0x3a, 0x4a, 0xe3,
-	0x44, 0xf6, 0x04, 0xd6, 0x98, 0x60, 0x16, 0x4e, 0x71, 0x5e, 0xb4, 0xfb, 0xdf, 0x0e, 0xd8, 0xab,
-	0xca, 0xc9, 0xa2, 0x0d, 0xeb, 0x0a, 0x69, 0xe9, 0xc1, 0x57, 0x48, 0x75, 0x60, 0x52, 0x3e, 0x59,
-	0x5c, 0x3a, 0x76, 0x8a, 0xb8, 0x74, 0x7c, 0x68, 0x24, 0xf3, 0x2e, 0x28, 0xf7, 0x82, 0x86, 0x0c,
-	0x2d, 0x4d, 0xfd, 0x78, 0x6d, 0x15, 0x33, 0xb8, 0xfb, 0x17, 0xe3, 0x26, 0x89, 0x94, 0x87, 0x3d,
-	0x3f, 0x15, 0xaf, 0xdd, 0xd4, 0x7d, 0x30, 0xe2, 0xcd, 0x37, 0xfb, 0xfa, 0x60, 0x7e, 0xf9, 0xf4,
-	0xe7, 0x78, 0x62, 0x80, 0x86, 0xb5, 0xc1, 0x4c, 0x1c, 0x73, 0x88, 0x77, 0x07, 0xaa, 0x2c, 0xfa,
-	0xe6, 0x75, 0xa0, 0x6a, 0x46, 0xa9, 0xea, 0x35, 0x09, 0xbf, 0x7f, 0xb8, 0xf0, 0xe1, 0xd3, 0xab,
-	0xa5, 0x9e, 0xc6, 0x9a, 0x3f, 0xa2, 0x50, 0x63, 0xbf, 0xf9, 0x79, 0xa3, 0x8c, 0xeb, 0x6f, 0xe9,
-	0xe5, 0x44, 0x21, 0x0a, 0x39, 0xcc, 0x34, 0x72, 0x50, 0x08, 0x35, 0x7e, 0x35, 0x95, 0x0b, 0x15,
-	0xe1, 0xff, 0x96, 0x3e, 0xf9, 0x53, 0x88, 0xfb, 0x87, 0x0b, 0x2f, 0x9e, 0x5e, 0xa8, 0x7e, 0x1c,
-	0x1b, 0x11, 0xee, 0xdb, 0x65, 0x63, 0xbb, 0xb2, 0xfd, 0xe9, 0xa7, 0xc2, 0x76, 0x5f, 0xc8, 0xd9,
-	0xee, 0xc5, 0x3e, 0xdb, 0x9d, 0x31, 0x57, 0x39, 0x33, 0xd6, 0xf8, 0x58, 0x37, 0xc8, 0xe3, 0xf3,
-	0x4c, 0x1e, 0x16, 0xbc, 0xd6, 0x0b, 0x12, 0x42, 0xb7, 0x92, 0x5e, 0x18, 0x84, 0x2d, 0x6e, 0x8b,
-	0x55, 0x3b, 0x2c, 0xc8, 0xa0, 0x71, 0x9e, 0xde, 0xfd, 0x83, 0x32, 0x9c, 0xc9, 0x5d, 0xed, 0x44,
-	0xef, 0x87, 0xaa, 0xba, 0xbb, 0x9b, 0xaf, 0xc0, 0xea, 0x0f, 0x09, 0x69, 0x0a, 0xf4, 0x49, 0x80,
-	0x06, 0x89, 0x3b, 0xd1, 0x01, 0xdf, 0xc8, 0xc7, 0x4e, 0xbd, 0x91, 0xeb, 0x90, 0x6f, 0x55, 0x73,
-	0xc1, 0x16, 0x47, 0xd9, 0xfd, 0x34, 0xce, 0x3b, 0xa4, 0x72, 0xdd, 0x4f, 0x56, 0x2f, 0x75, 0xe5,
-	0x31, 0xf6, 0x52, 0x07, 0x70, 0x46, 0xe8, 0xa7, 0x8f, 0xdb, 0x1f, 0xe2, 0x54, 0xfd, 0x1c, 0x9b,
-	0x9e, 0xd5, 0x2c, 0x1b, 0x9c, 0xe7, 0xeb, 0x7e, 0xb9, 0xc4, 0x62, 0x19, 0x31, 0xd2, 0x1b, 0xaa,
-	0x00, 0xfa, 0x1e, 0xa8, 0x78, 0xbd, 0xb4, 0x1d, 0xf5, 0x5d, 0x31, 0x5b, 0xe6, 0x50, 0x2c, 0xb1,
-	0x68, 0x1d, 0xc6, 0x1a, 0x5e, 0xaa, 0x3e, 0x7b, 0x77, 0x1a, 0xe5, 0x4c, 0xd9, 0xc3, 0x4b, 0x09,
-	0xe6, 0x5c, 0xd0, 0xd3, 0x30, 0x96, 0x7a, 0xad, 0xcc, 0xf7, 0x41, 0x76, 0xbc, 0x16, 0xc5, 0x1c,
-	0x6a, 0xaf, 0xd3, 0x63, 0xc7, 0xac, 0xd3, 0x2f, 0x5a, 0x9f, 0x3e, 0xb4, 0xca, 0xea, 0xfd, 0x5f,
-	0x2c, 0xe4, 0xa1, 0x70, 0x96, 0xd6, 0xfd, 0x05, 0x98, 0xb2, 0xbf, 0x68, 0x78, 0xa2, 0x0e, 0x5c,
-	0xf7, 0x5f, 0xc7, 0x60, 0x3a, 0xd3, 0x92, 0x91, 0x31, 0x71, 0xe7, 0x58, 0x13, 0x7f, 0x06, 0xc6,
-	0xe3, 0xa4, 0x17, 0x12, 0xd9, 0x69, 0xa3, 0x85, 0x30, 0x27, 0x22, 0x58, 0xe0, 0xd8, 0xac, 0x34,
-	0x92, 0x03, 0xdc, 0x0b, 0x65, 0xfd, 0x55, 0xcf, 0xca, 0x2a, 0x87, 0x62, 0x89, 0x45, 0x9f, 0x86,
-	0x29, 0xca, 0x57, 0x97, 0xc4, 0x4b, 0x49, 0x4b, 0x7d, 0xcb, 0xe0, 0xea, 0xc8, 0xf7, 0xce, 0x05,
-	0x3b, 0x91, 0xc9, 0xda, 0x10, 0x9c, 0x11, 0x87, 0x3e, 0xe7, 0xd8, 0x77, 0xed, 0x2b, 0x23, 0x1f,
-	0x15, 0xe4, 0x5b, 0x5d, 0x84, 0xeb, 0x3c, 0xf8, 0xca, 0x7d, 0xac, 0xdd, 0x76, 0xe2, 0x11, 0xb8,
-	0x2d, 0x0c, 0x70, 0xd9, 0xf7, 0x41, 0xad, 0xeb, 0x85, 0x41, 0x93, 0xd0, 0x54, 0x7c, 0x7d, 0xb4,
-	0x26, 0x12, 0x88, 0x0d, 0x05, 0xc4, 0x06, 0xcf, 0x3f, 0xed, 0xcb, 0xdf, 0x4a, 0x84, 0xff, 0x35,
-	0xeb, 0xd3, 0xbe, 0x06, 0x8c, 0x6d, 0x1a, 0xf7, 0x5b, 0x0e, 0x9c, 0x1f, 0x38, 0x12, 0x3f, 0xb9,
-	0x25, 0x35, 0xf7, 0x5b, 0x25, 0x38, 0x37, 0xa0, 0x51, 0x09, 0xed, 0x3f, 0x9a, 0x8f, 0x31, 0xc8,
-	0x36, 0xa8, 0xe9, 0xa1, 0x56, 0x71, 0xba, 0x6d, 0xc7, 0x2c, 0xfd, 0xe5, 0xc7, 0xb7, 0xf4, 0xbb,
-	0x7f, 0xe9, 0x80, 0xf5, 0xa9, 0x10, 0xf4, 0xeb, 0x76, 0x1b, 0x9e, 0x53, 0x48, 0xdb, 0x98, 0xe0,
-	0xac, 0x7b, 0xf8, 0xc4, 0x78, 0x0d, 0x6a, 0xe9, 0xcb, 0x9b, 0x69, 0xe9, 0x04, 0x66, 0xda, 0x16,
-	0x33, 0x9e, 0x93, 0x61, 0xd6, 0x37, 0xe7, 0x01, 0xeb, 0xdb, 0xfb, 0xa1, 0x4a, 0x49, 0xa7, 0xc9,
-	0x82, 0x14, 0xb9, 0x0e, 0xea, 0xe9, 0xd9, 0x96, 0x70, 0xac, 0x29, 0xdc, 0x1f, 0xc9, 0x81, 0x92,
-	0x71, 0xe3, 0x0b, 0xb9, 0xb6, 0xf9, 0x93, 0x87, 0x5c, 0x07, 0x00, 0xbe, 0xbe, 0x3c, 0x55, 0xc0,
-	0x47, 0x3a, 0xcc, 0x4d, 0x2c, 0xfb, 0x13, 0x12, 0x0a, 0x86, 0x2d, 0x61, 0x19, 0x83, 0x2c, 0x1f,
-	0x67, 0x90, 0xee, 0xbf, 0x3b, 0x90, 0x59, 0x77, 0x51, 0x17, 0xc6, 0x99, 0x06, 0x07, 0x05, 0xdc,
-	0xf3, 0xb2, 0xf9, 0x32, 0x63, 0x95, 0xc7, 0x95, 0xfc, 0x27, 0x16, 0x52, 0x50, 0x20, 0xc3, 0xc5,
-	0xd2, 0xc8, 0xf7, 0x09, 0x6d, 0x69, 0x2c, 0xda, 0x94, 0x5f, 0x71, 0xd4, 0x71, 0xa7, 0xfb, 0x02,
-	0xcc, 0xf6, 0x69, 0xc4, 0x3b, 0xb1, 0x23, 0x75, 0xad, 0xcd, 0x32, 0x22, 0xde, 0xcd, 0x8f, 0x05,
-	0xce, 0xfd, 0xa6, 0x03, 0x67, 0xf3, 0xec, 0xd1, 0xef, 0x39, 0x30, 0x4b, 0xf3, 0xfc, 0x1e, 0xc9,
-	0xa8, 0xe9, 0xf2, 0x49, 0x1f, 0x0a, 0xf7, 0x6b, 0xe0, 0xfe, 0x5d, 0x49, 0xd8, 0xb0, 0xf8, 0x94,
-	0xb4, 0x5e, 0xa4, 0x9d, 0xa1, 0x8b, 0x34, 0x73, 0x11, 0xbf, 0x4d, 0x1a, 0xbd, 0x4e, 0x5f, 0xeb,
-	0xc2, 0xb6, 0x84, 0x63, 0x4d, 0xc1, 0x8f, 0x6c, 0x7b, 0xb2, 0xfd, 0x36, 0x67, 0x5e, 0xab, 0x12,
-	0x8e, 0x35, 0x05, 0x7a, 0x1e, 0xa6, 0xec, 0x1b, 0x98, 0xbc, 0x8e, 0x23, 0xeb, 0xd6, 0xf6, 0x65,
-	0x4d, 0x9c, 0xa1, 0xca, 0x5d, 0x82, 0x1f, 0x3f, 0xf6, 0x12, 0xfc, 0xb3, 0x50, 0x95, 0x1f, 0x3f,
-	0x57, 0x75, 0x42, 0xd1, 0x17, 0x21, 0x61, 0x58, 0x63, 0xd1, 0x25, 0x80, 0xae, 0x17, 0xf6, 0xbc,
-	0x0e, 0x1b, 0x21, 0xd9, 0x68, 0xa3, 0x1d, 0x6a, 0x43, 0x63, 0xb0, 0x45, 0xc5, 0x5c, 0x24, 0x7f,
-	0xfb, 0x38, 0xd3, 0xae, 0xe3, 0x1c, 0xdb, 0xae, 0x93, 0x6d, 0x28, 0x29, 0x9d, 0xa8, 0xa1, 0xc4,
-	0xee, 0xf5, 0x28, 0x3f, 0xb0, 0xd7, 0xe3, 0xdd, 0xe6, 0xf6, 0x93, 0x68, 0x0a, 0x99, 0x1c, 0x74,
-	0xf3, 0x09, 0xb9, 0x50, 0xf1, 0x3d, 0xdd, 0x6f, 0x37, 0x25, 0x02, 0x8e, 0x95, 0x65, 0x4e, 0x24,
-	0x31, 0xf5, 0xc5, 0xef, 0xbe, 0x7d, 0xe1, 0x89, 0xef, 0xbd, 0x7d, 0xe1, 0x89, 0xb7, 0xde, 0xbe,
-	0xf0, 0xc4, 0x67, 0x8f, 0x2e, 0x38, 0xdf, 0x3d, 0xba, 0xe0, 0x7c, 0xef, 0xe8, 0x82, 0xf3, 0xd6,
-	0xd1, 0x05, 0xe7, 0xdf, 0x8e, 0x2e, 0x38, 0xbf, 0xfb, 0xc3, 0x0b, 0x4f, 0xbc, 0x52, 0x55, 0xb6,
-	0xfa, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x06, 0x67, 0xef, 0x97, 0x7d, 0x64, 0x00, 0x00,
+	0x55, 0x5b, 0xdd, 0x7e, 0x74, 0x1f, 0x3f, 0x66, 0x7c, 0x67, 0x67, 0xe3, 0x0c, 0x9b, 0xf1, 0xa8,
+	0x56, 0x49, 0x16, 0x92, 0xd8, 0xec, 0xb0, 0xc0, 0x26, 0x0b, 0x09, 0x6e, 0x7b, 0x1e, 0x9e, 0xb1,
+	0x3d, 0xde, 0x63, 0xef, 0x8e, 0xb4, 0x79, 0xb0, 0xe5, 0xea, 0xdb, 0xdd, 0x35, 0xee, 0xae, 0xea,
+	0xad, 0xaa, 0xf6, 0x8c, 0x97, 0x24, 0x24, 0x90, 0xa0, 0x55, 0xd8, 0x8d, 0x10, 0x11, 0xf9, 0x81,
+	0xa0, 0x04, 0x3e, 0x10, 0x91, 0xf8, 0x88, 0x22, 0x21, 0xf8, 0x0d, 0x12, 0xac, 0xf8, 0x40, 0x51,
+	0xc4, 0x63, 0x85, 0x90, 0x61, 0x27, 0x3f, 0x08, 0x3e, 0x02, 0x82, 0xaf, 0xf9, 0x42, 0xf7, 0x7d,
+	0xab, 0xba, 0x7b, 0x6c, 0x4f, 0xd7, 0x4c, 0x56, 0xe1, 0xaf, 0xfb, 0x9c, 0x53, 0xe7, 0x9c, 0xba,
+	0xf7, 0x9c, 0x7b, 0xcf, 0x39, 0xf7, 0xdc, 0x82, 0xb5, 0x66, 0x90, 0xb6, 0x7a, 0xbb, 0x8b, 0x7e,
+	0xd4, 0x59, 0xf2, 0xe2, 0x66, 0xd4, 0x8d, 0xa3, 0x5b, 0xfc, 0xc7, 0x47, 0xfc, 0xfa, 0x52, 0x77,
+	0xaf, 0xb9, 0xe4, 0x75, 0x83, 0x64, 0xc9, 0xeb, 0x76, 0xdb, 0x81, 0xef, 0xa5, 0x41, 0x14, 0x2e,
+	0xed, 0x3f, 0xe3, 0xb5, 0xbb, 0x2d, 0xef, 0x99, 0xa5, 0x26, 0x0d, 0x69, 0xec, 0xa5, 0xb4, 0xbe,
+	0xd8, 0x8d, 0xa3, 0x34, 0x22, 0x1f, 0x35, 0xac, 0x16, 0x15, 0x2b, 0xfe, 0xe3, 0x57, 0xfd, 0xfa,
+	0x62, 0x77, 0xaf, 0xb9, 0xc8, 0x58, 0x2d, 0x5a, 0xac, 0x16, 0x15, 0xab, 0x73, 0x1f, 0xb1, 0xb4,
+	0x68, 0x46, 0xcd, 0x68, 0x89, 0x73, 0xdc, 0xed, 0x35, 0xf8, 0x3f, 0xfe, 0x87, 0xff, 0x12, 0x92,
+	0xce, 0xb9, 0x7b, 0xcf, 0x25, 0x8b, 0x41, 0xc4, 0x74, 0x5b, 0xf2, 0xa3, 0x98, 0x2e, 0xed, 0xf7,
+	0x69, 0x73, 0xee, 0x59, 0x43, 0xd3, 0xf1, 0xfc, 0x56, 0x10, 0xd2, 0xf8, 0xc0, 0xbc, 0x50, 0x87,
+	0xa6, 0xde, 0xa0, 0xa7, 0x96, 0x86, 0x3d, 0x15, 0xf7, 0xc2, 0x34, 0xe8, 0xd0, 0xbe, 0x07, 0x7e,
+	0xe1, 0xa8, 0x07, 0x12, 0xbf, 0x45, 0x3b, 0x5e, 0xfe, 0x39, 0xf7, 0x55, 0x98, 0x59, 0xbe, 0xb9,
+	0xbd, 0xdc, 0x4b, 0x5b, 0x2b, 0x51, 0xd8, 0x08, 0x9a, 0xe4, 0xe7, 0x61, 0xca, 0x6f, 0xf7, 0x92,
+	0x94, 0xc6, 0x9b, 0x5e, 0x87, 0xce, 0x3b, 0x17, 0x9c, 0xa7, 0xab, 0xb5, 0x33, 0x6f, 0x1d, 0x2e,
+	0x3c, 0x76, 0xf7, 0x70, 0x61, 0x6a, 0xc5, 0xa0, 0xd0, 0xa6, 0x23, 0x3f, 0x0d, 0x93, 0x71, 0xd4,
+	0xa6, 0xcb, 0xb8, 0x39, 0x5f, 0xe2, 0x8f, 0x9c, 0x92, 0x8f, 0x4c, 0xa2, 0x00, 0xa3, 0xc2, 0xbb,
+	0xdf, 0x2f, 0x01, 0x2c, 0x77, 0xbb, 0x5b, 0x71, 0x74, 0x8b, 0xfa, 0x29, 0x79, 0x05, 0x2a, 0x6c,
+	0x14, 0xea, 0x5e, 0xea, 0x71, 0x69, 0x53, 0x17, 0x7f, 0x76, 0x51, 0xbc, 0xcc, 0xa2, 0xfd, 0x32,
+	0x66, 0xe6, 0x18, 0xf5, 0xe2, 0xfe, 0x33, 0x8b, 0x37, 0x76, 0xd9, 0xf3, 0x1b, 0x34, 0xf5, 0x6a,
+	0x44, 0x0a, 0x03, 0x03, 0x43, 0xcd, 0x95, 0xec, 0xc1, 0x58, 0xd2, 0xa5, 0x3e, 0x57, 0x6c, 0xea,
+	0xe2, 0xda, 0xe2, 0x03, 0xdb, 0xc7, 0xa2, 0x51, 0x7b, 0xbb, 0x4b, 0xfd, 0xda, 0xb4, 0x14, 0x3b,
+	0xc6, 0xfe, 0x21, 0x17, 0x42, 0x12, 0x98, 0x48, 0x52, 0x2f, 0xed, 0x25, 0xf3, 0x65, 0x2e, 0xee,
+	0x7a, 0x31, 0xe2, 0x38, 0xcb, 0xda, 0xac, 0x14, 0x38, 0x21, 0xfe, 0xa3, 0x14, 0xe5, 0xfe, 0xb3,
+	0x03, 0xb3, 0x86, 0x78, 0x3d, 0x48, 0x52, 0xf2, 0xa9, 0xbe, 0x61, 0x5d, 0x3c, 0xde, 0xb0, 0xb2,
+	0xa7, 0xf9, 0xa0, 0x9e, 0x96, 0xc2, 0x2a, 0x0a, 0x62, 0x0d, 0xe9, 0x2d, 0x18, 0x0f, 0x52, 0xda,
+	0x49, 0xe6, 0x4b, 0x17, 0xca, 0x4f, 0x4f, 0x5d, 0xbc, 0x54, 0xc8, 0x4b, 0xd6, 0x66, 0xa4, 0xc4,
+	0xf1, 0x35, 0xc6, 0x1b, 0x85, 0x08, 0xf7, 0x1f, 0xaa, 0xf6, 0xcb, 0xb1, 0xa1, 0x26, 0xcf, 0xc0,
+	0x54, 0x12, 0xf5, 0x62, 0x9f, 0x22, 0xed, 0x46, 0xc9, 0xbc, 0x73, 0xa1, 0xcc, 0x2c, 0x8e, 0x19,
+	0xe8, 0xb6, 0x01, 0xa3, 0x4d, 0x43, 0x7e, 0xdb, 0x81, 0xe9, 0x3a, 0x4d, 0xd2, 0x20, 0xe4, 0xf2,
+	0x95, 0xe6, 0x2f, 0x8c, 0xa6, 0xb9, 0x02, 0xae, 0x1a, 0xce, 0xb5, 0xc7, 0xe5, 0x5b, 0x4c, 0x5b,
+	0xc0, 0x04, 0x33, 0xc2, 0x99, 0x97, 0xd5, 0x69, 0xe2, 0xc7, 0x41, 0x97, 0xfd, 0xe7, 0xa6, 0x62,
+	0x79, 0xd9, 0xaa, 0x41, 0xa1, 0x4d, 0x47, 0xf6, 0x60, 0x9c, 0x79, 0x51, 0x32, 0x3f, 0xc6, 0x95,
+	0xbf, 0x3c, 0x82, 0xf2, 0x72, 0x38, 0x99, 0x77, 0x9a, 0x71, 0x67, 0xff, 0x12, 0x14, 0x32, 0xc8,
+	0x9b, 0x0e, 0xcc, 0x4b, 0x17, 0x47, 0x2a, 0x86, 0xf2, 0x66, 0x2b, 0x48, 0x69, 0x3b, 0x48, 0xd2,
+	0xf9, 0x71, 0xae, 0xc0, 0xd2, 0xf1, 0x4c, 0xea, 0x4a, 0x1c, 0xf5, 0xba, 0xd7, 0x83, 0xb0, 0x5e,
+	0xbb, 0x20, 0x25, 0xcd, 0xaf, 0x0c, 0x61, 0x8c, 0x43, 0x45, 0x92, 0xaf, 0x39, 0x70, 0x2e, 0xf4,
+	0x3a, 0x34, 0xe9, 0x7a, 0x6c, 0x52, 0x05, 0xba, 0xd6, 0xf6, 0xfc, 0x3d, 0xae, 0xd1, 0xc4, 0x83,
+	0x69, 0xe4, 0x4a, 0x8d, 0xce, 0x6d, 0x0e, 0x65, 0x8d, 0xf7, 0x11, 0x4b, 0xbe, 0xe9, 0xc0, 0x5c,
+	0x14, 0x77, 0x5b, 0x5e, 0x48, 0xeb, 0x0a, 0x9b, 0xcc, 0x4f, 0x72, 0x8f, 0xfb, 0xe4, 0x08, 0xf3,
+	0x73, 0x23, 0xcf, 0x73, 0x23, 0x0a, 0x83, 0x34, 0x8a, 0xb7, 0x69, 0x9a, 0x06, 0x61, 0x33, 0xa9,
+	0x9d, 0xbd, 0x7b, 0xb8, 0x30, 0xd7, 0x47, 0x85, 0xfd, 0xca, 0x90, 0x3b, 0x30, 0x95, 0x1c, 0x84,
+	0xfe, 0xcd, 0x20, 0xac, 0x47, 0xb7, 0x93, 0xf9, 0xca, 0xc8, 0x2e, 0xbb, 0xad, 0xb9, 0x49, 0xa7,
+	0x33, 0xdc, 0xd1, 0x16, 0x35, 0x78, 0xca, 0x8c, 0x11, 0x55, 0x8b, 0x9e, 0x32, 0x63, 0x46, 0xf7,
+	0x11, 0x4b, 0xbe, 0xe4, 0xc0, 0x4c, 0x12, 0x34, 0x43, 0x2f, 0xed, 0xc5, 0xf4, 0x3a, 0x3d, 0x48,
+	0xe6, 0x81, 0x2b, 0x72, 0x65, 0x94, 0x21, 0xb1, 0xf8, 0xd5, 0xce, 0x4a, 0x05, 0x67, 0x6c, 0x68,
+	0x82, 0x59, 0xa1, 0xee, 0x5f, 0x95, 0xe0, 0x74, 0x7e, 0x85, 0x27, 0x7f, 0xec, 0xc0, 0xa9, 0x5b,
+	0xb7, 0xd3, 0x9d, 0x68, 0x8f, 0x86, 0x49, 0xed, 0x80, 0x39, 0x24, 0x5f, 0xde, 0xa6, 0x2e, 0xbe,
+	0x52, 0xe0, 0x46, 0xb2, 0x78, 0x2d, 0x2b, 0xe2, 0x52, 0x98, 0xc6, 0x07, 0xb5, 0xf7, 0x48, 0xb5,
+	0x4f, 0x5d, 0xbb, 0xb9, 0x63, 0x63, 0x31, 0xaf, 0xd1, 0xb9, 0xd7, 0x1d, 0x78, 0x7c, 0x10, 0x0b,
+	0x72, 0x1a, 0xca, 0x7b, 0xf4, 0x40, 0x44, 0x0d, 0xc8, 0x7e, 0x92, 0x97, 0x61, 0x7c, 0xdf, 0x6b,
+	0xf7, 0xa8, 0xdc, 0x7d, 0x57, 0x47, 0x78, 0x0b, 0xad, 0x16, 0x0a, 0x96, 0x1f, 0x2b, 0x3d, 0xe7,
+	0xb8, 0x7f, 0x5d, 0x86, 0x29, 0x6b, 0x21, 0x7e, 0x04, 0xe1, 0x44, 0x3b, 0x13, 0x4e, 0x5c, 0x2b,
+	0x66, 0x03, 0x19, 0x1a, 0x4f, 0xa4, 0xb9, 0x78, 0x62, 0xbd, 0x20, 0x79, 0xf7, 0x0d, 0x28, 0xc8,
+	0xab, 0x50, 0x8d, 0xba, 0x2c, 0x50, 0x64, 0xbb, 0xd3, 0xd8, 0xc8, 0x33, 0x77, 0x43, 0xf1, 0xaa,
+	0xcd, 0xdc, 0x3d, 0x5c, 0xa8, 0xea, 0xbf, 0x68, 0xa4, 0xb8, 0xff, 0xe4, 0xc0, 0xe3, 0x96, 0x82,
+	0x2b, 0x51, 0x58, 0x0f, 0xf8, 0x8c, 0x5e, 0x80, 0xb1, 0xf4, 0xa0, 0xab, 0x42, 0x51, 0x3d, 0x46,
+	0x3b, 0x07, 0x5d, 0x8a, 0x1c, 0xc3, 0x82, 0xcf, 0x0e, 0x4d, 0x12, 0xaf, 0x49, 0xf3, 0xc1, 0xe7,
+	0x86, 0x00, 0xa3, 0xc2, 0x93, 0x18, 0x48, 0xdb, 0x4b, 0xd2, 0x9d, 0xd8, 0x0b, 0x13, 0xce, 0x7e,
+	0x27, 0xe8, 0x50, 0x39, 0xb4, 0x3f, 0x73, 0x3c, 0x43, 0x61, 0x4f, 0xd4, 0x9e, 0xb8, 0x7b, 0xb8,
+	0x40, 0xd6, 0xfb, 0x38, 0xe1, 0x00, 0xee, 0xee, 0xd7, 0x1c, 0x78, 0x62, 0x70, 0xac, 0x40, 0x3e,
+	0x00, 0x13, 0x09, 0x8d, 0xf7, 0x69, 0x2c, 0xdf, 0xce, 0xcc, 0x07, 0x87, 0xa2, 0xc4, 0x92, 0x25,
+	0xa8, 0xea, 0x05, 0x4d, 0xbe, 0xe3, 0x9c, 0x24, 0xad, 0x9a, 0x55, 0xd0, 0xd0, 0xb0, 0x41, 0x63,
+	0x7f, 0x64, 0x64, 0xa1, 0x07, 0x8d, 0x07, 0xee, 0x1c, 0xe3, 0xfe, 0x8b, 0x03, 0xa7, 0x2c, 0xad,
+	0x1e, 0x41, 0xd0, 0xb8, 0x97, 0x0d, 0x1a, 0x2f, 0x17, 0x63, 0xc9, 0x43, 0xa2, 0xc6, 0xef, 0x4e,
+	0xc0, 0x9c, 0x6d, 0xef, 0x7c, 0x0f, 0xe0, 0x69, 0x0a, 0xed, 0x46, 0x2f, 0xe2, 0xba, 0x1c, 0x70,
+	0x93, 0xa6, 0x08, 0x30, 0x2a, 0x3c, 0x1b, 0xc1, 0xae, 0x97, 0xb6, 0xe4, 0x68, 0xeb, 0x11, 0xdc,
+	0xf2, 0xd2, 0x16, 0x72, 0x0c, 0xf9, 0x38, 0xcc, 0xa6, 0x5e, 0xdc, 0xa4, 0x29, 0xd2, 0xfd, 0x20,
+	0x51, 0x9e, 0x52, 0xad, 0x3d, 0x21, 0x69, 0x67, 0x77, 0x32, 0x58, 0xcc, 0x51, 0x93, 0x10, 0xc6,
+	0x5a, 0xb4, 0xdd, 0x91, 0xc1, 0xc2, 0x56, 0x41, 0x8e, 0xcd, 0x5f, 0xf4, 0x2a, 0x6d, 0x77, 0x6a,
+	0x15, 0xa6, 0x2f, 0xfb, 0x85, 0x5c, 0x0e, 0xf9, 0x0d, 0x07, 0xaa, 0x7b, 0xbd, 0x24, 0x8d, 0x3a,
+	0xc1, 0x6b, 0x74, 0xbe, 0xc2, 0xa5, 0xbe, 0x58, 0xa4, 0xd4, 0xeb, 0x8a, 0xb9, 0x70, 0x73, 0xfd,
+	0x17, 0x8d, 0x58, 0xf2, 0x1a, 0x4c, 0xee, 0x25, 0x51, 0x18, 0x52, 0xb6, 0xfd, 0x33, 0x0d, 0xb6,
+	0x0b, 0xd5, 0x40, 0xb0, 0xae, 0x4d, 0xb1, 0x29, 0x95, 0x7f, 0x50, 0x09, 0xe4, 0x03, 0x50, 0x0f,
+	0x62, 0xea, 0xa7, 0x51, 0x7c, 0x30, 0x0f, 0xc5, 0x0f, 0xc0, 0xaa, 0x62, 0x2e, 0x06, 0x40, 0xff,
+	0x45, 0x23, 0x96, 0xec, 0xc3, 0x44, 0xb7, 0xdd, 0x6b, 0x06, 0xe1, 0xfc, 0x14, 0x57, 0x00, 0x8b,
+	0x54, 0x60, 0x8b, 0x73, 0xae, 0x01, 0x5b, 0x42, 0xc4, 0x6f, 0x94, 0xd2, 0xc8, 0x53, 0x30, 0xee,
+	0xb7, 0xbc, 0x38, 0x9d, 0x9f, 0xe6, 0x46, 0xaa, 0xbd, 0x66, 0x85, 0x01, 0x51, 0xe0, 0xdc, 0xbf,
+	0x71, 0xe0, 0xdc, 0xf0, 0xb7, 0x12, 0xee, 0xe3, 0xf7, 0xe2, 0x44, 0xac, 0xc6, 0x15, 0xdb, 0x7d,
+	0x38, 0x18, 0x15, 0x9e, 0x7c, 0x1e, 0x26, 0x6f, 0xc9, 0x79, 0x2e, 0x15, 0x3f, 0xcf, 0xd7, 0xe4,
+	0x3c, 0x6b, 0xf9, 0xd7, 0xd4, 0x5c, 0x4b, 0xa1, 0xee, 0x77, 0xcb, 0x70, 0x76, 0xa0, 0x5b, 0x90,
+	0x45, 0x00, 0x1e, 0x3e, 0x5c, 0x0e, 0x58, 0x26, 0x25, 0x72, 0xc7, 0x59, 0xb6, 0xdb, 0xbf, 0xa4,
+	0xa1, 0x68, 0x51, 0x90, 0xcf, 0x02, 0x74, 0xbd, 0xd8, 0xeb, 0xd0, 0x94, 0xc6, 0x6a, 0xed, 0xba,
+	0x3a, 0xc2, 0xcb, 0x30, 0x25, 0xb6, 0x14, 0x43, 0x13, 0x6b, 0x68, 0x50, 0x82, 0x96, 0x3c, 0x96,
+	0x29, 0xc6, 0xb4, 0x4d, 0xbd, 0x84, 0x6e, 0x9a, 0xf5, 0x5c, 0x67, 0x8a, 0x68, 0x50, 0x68, 0xd3,
+	0xb1, 0x8d, 0x85, 0xbf, 0x42, 0x22, 0xd7, 0x24, 0xbd, 0xb1, 0xf0, 0x97, 0x4c, 0x50, 0x62, 0xc9,
+	0x1b, 0x0e, 0xcc, 0x36, 0x82, 0x36, 0x35, 0xd2, 0x65, 0x6a, 0xb7, 0x3e, 0xe2, 0x1b, 0x5e, 0xb6,
+	0x99, 0x9a, 0x25, 0x31, 0x03, 0x4e, 0x30, 0x27, 0xdb, 0xfd, 0x5a, 0x09, 0xe6, 0x87, 0x4d, 0x36,
+	0xe9, 0xc2, 0x24, 0xbd, 0x93, 0xbe, 0xe4, 0xc5, 0x89, 0x0c, 0x89, 0x47, 0xc9, 0x61, 0x24, 0xd3,
+	0x97, 0xbc, 0xd8, 0x18, 0xd1, 0x25, 0xc1, 0x1d, 0x95, 0x18, 0xd2, 0x84, 0xb1, 0xb4, 0xed, 0x15,
+	0x51, 0xe5, 0xb0, 0xc4, 0x99, 0x08, 0x66, 0x7d, 0x39, 0x41, 0x2e, 0x80, 0x3c, 0x09, 0x63, 0xed,
+	0x60, 0x97, 0xc5, 0x78, 0xcc, 0x1a, 0xf9, 0xc2, 0xbd, 0x1e, 0xec, 0x26, 0xc8, 0xa1, 0xee, 0x0f,
+	0x9c, 0x01, 0xa3, 0x22, 0x57, 0x37, 0x66, 0x20, 0x34, 0xdc, 0x0f, 0xe2, 0x28, 0xec, 0xd0, 0x30,
+	0xcd, 0x17, 0xec, 0x2e, 0x19, 0x14, 0xda, 0x74, 0xe4, 0xd7, 0x07, 0x58, 0xf5, 0x28, 0xb5, 0x2a,
+	0xa9, 0xce, 0xb1, 0x0d, 0xdb, 0xfd, 0xdb, 0xf2, 0x80, 0xa5, 0x46, 0x6f, 0x19, 0xe4, 0x22, 0x00,
+	0x0b, 0x53, 0xb6, 0x62, 0xda, 0x08, 0xee, 0xc8, 0xb7, 0xd2, 0x2c, 0x37, 0x35, 0x06, 0x2d, 0x2a,
+	0xf5, 0xcc, 0x76, 0xaf, 0xc1, 0x9e, 0x29, 0xf5, 0x3f, 0x23, 0x30, 0x68, 0x51, 0x91, 0x67, 0x61,
+	0x22, 0xe8, 0x78, 0x4d, 0xaa, 0xc6, 0xfe, 0x49, 0xe6, 0x24, 0x6b, 0x1c, 0x72, 0xef, 0x70, 0x61,
+	0x56, 0x2b, 0xc4, 0x41, 0x28, 0x69, 0xc9, 0xb7, 0x1c, 0x98, 0xf6, 0xa3, 0x4e, 0x27, 0x0a, 0xd7,
+	0xbd, 0x5d, 0xda, 0x56, 0x05, 0x99, 0xe6, 0x43, 0xd9, 0x4d, 0x17, 0x57, 0x2c, 0x49, 0x22, 0x55,
+	0xd3, 0x35, 0x26, 0x1b, 0x85, 0x19, 0x95, 0xd8, 0x62, 0xbd, 0x4f, 0x63, 0x1e, 0x97, 0x8c, 0x67,
+	0x63, 0x9d, 0x97, 0x04, 0x18, 0x15, 0xfe, 0xdc, 0x27, 0x60, 0xae, 0x4f, 0xc6, 0x80, 0x5c, 0xee,
+	0x71, 0x3b, 0x97, 0xab, 0xda, 0x59, 0xd8, 0xef, 0x3b, 0xf0, 0x9e, 0x21, 0x9b, 0x91, 0x0e, 0x45,
+	0x9d, 0x61, 0xa1, 0x28, 0xf9, 0x0c, 0x94, 0x69, 0xb8, 0x2f, 0x8d, 0x70, 0x65, 0x84, 0x31, 0xbc,
+	0x14, 0xee, 0x8b, 0xf1, 0x99, 0xbc, 0x7b, 0xb8, 0x50, 0xbe, 0x14, 0xee, 0x23, 0x63, 0xec, 0x7e,
+	0x79, 0x22, 0x13, 0xea, 0x6e, 0xab, 0xbc, 0x8a, 0x6b, 0x29, 0x03, 0xdd, 0xf5, 0x22, 0xa7, 0xce,
+	0x8a, 0xe3, 0x45, 0x09, 0x52, 0xca, 0x22, 0xaf, 0x3b, 0xbc, 0xf0, 0xa7, 0xe2, 0x7f, 0xb9, 0x35,
+	0x3e, 0x84, 0x22, 0xa4, 0x5d, 0x4b, 0x54, 0x40, 0xb4, 0x45, 0x33, 0xf3, 0xe8, 0x8a, 0x9a, 0x80,
+	0xdc, 0x54, 0xb4, 0x79, 0xa8, 0xd2, 0xa0, 0xc2, 0x93, 0x1e, 0x40, 0x72, 0x10, 0xfa, 0x5b, 0x51,
+	0x3b, 0xf0, 0x0f, 0x64, 0x3a, 0x38, 0x6a, 0xfd, 0x48, 0x30, 0x13, 0x1b, 0xaf, 0xf9, 0x8f, 0x96,
+	0x20, 0xf2, 0x0d, 0x07, 0xe6, 0x82, 0x66, 0x18, 0xc5, 0x74, 0x35, 0x68, 0x34, 0x68, 0x4c, 0x43,
+	0x9f, 0xaa, 0xed, 0x69, 0x67, 0x04, 0xf1, 0xaa, 0x22, 0xb4, 0x96, 0xe7, 0x5d, 0x7b, 0xaf, 0x1c,
+	0x82, 0xb9, 0x3e, 0x14, 0xf6, 0x6b, 0x42, 0x3c, 0x18, 0x0b, 0xc2, 0x46, 0x24, 0x2b, 0x8f, 0x9f,
+	0x18, 0x41, 0xa3, 0xb5, 0xb0, 0x11, 0x19, 0xcf, 0x60, 0xff, 0x90, 0xb3, 0x26, 0xeb, 0xf0, 0x78,
+	0x2c, 0xd3, 0x85, 0xab, 0x41, 0xc2, 0x62, 0xb0, 0xf5, 0xa0, 0x13, 0xa4, 0x3c, 0x65, 0x28, 0xd7,
+	0xe6, 0xef, 0x1e, 0x2e, 0x3c, 0x8e, 0x03, 0xf0, 0x38, 0xf0, 0x29, 0xf7, 0x7f, 0x2a, 0xd9, 0x9c,
+	0x48, 0xe4, 0xfa, 0xaf, 0x41, 0x35, 0xd6, 0x85, 0x4b, 0xb1, 0xb1, 0xae, 0x15, 0x30, 0xba, 0xb2,
+	0xc2, 0xa0, 0xd3, 0x54, 0x53, 0xa2, 0x34, 0xe2, 0xd8, 0x06, 0xcb, 0x26, 0x5c, 0xfa, 0xc1, 0xa8,
+	0x36, 0x25, 0x45, 0x9a, 0x32, 0xca, 0x41, 0xe8, 0x23, 0x17, 0x40, 0x22, 0x98, 0x68, 0x51, 0xaf,
+	0x9d, 0xb6, 0x64, 0xae, 0x7f, 0x65, 0xa4, 0xf0, 0x86, 0x31, 0xca, 0x57, 0x50, 0x04, 0x14, 0xa5,
+	0x18, 0xd2, 0x83, 0xc9, 0x96, 0x18, 0x7b, 0xb9, 0x37, 0x5c, 0x1b, 0x69, 0x4c, 0x33, 0xb3, 0x69,
+	0x5c, 0x55, 0x02, 0x50, 0xc9, 0x22, 0xbf, 0xe9, 0x00, 0xf8, 0xaa, 0x74, 0xa2, 0x9c, 0xe5, 0x46,
+	0x31, 0xeb, 0x8b, 0x2e, 0xc9, 0x98, 0x4d, 0x55, 0x83, 0x12, 0xb4, 0xc4, 0x92, 0x57, 0x60, 0x3a,
+	0xa6, 0x7e, 0x14, 0xfa, 0x41, 0x9b, 0xd6, 0x97, 0xd3, 0xf9, 0x89, 0x13, 0xd7, 0x57, 0x4e, 0xb3,
+	0xcd, 0x0d, 0x2d, 0x1e, 0x98, 0xe1, 0x48, 0xbe, 0xec, 0xc0, 0xac, 0xae, 0x1d, 0xb1, 0xa9, 0xa0,
+	0x32, 0x8d, 0x5e, 0x2b, 0xa2, 0x4c, 0xc5, 0x19, 0xd6, 0x08, 0x0b, 0x58, 0xb3, 0x30, 0xcc, 0x09,
+	0x25, 0x2f, 0x03, 0x44, 0xbb, 0xbc, 0x48, 0xc3, 0xde, 0xb3, 0x72, 0xe2, 0xf7, 0x9c, 0x15, 0x65,
+	0x46, 0xc5, 0x01, 0x2d, 0x6e, 0xe4, 0x3a, 0x80, 0xf0, 0x93, 0x9d, 0x83, 0x2e, 0xe5, 0xd9, 0x72,
+	0xb5, 0xf6, 0x21, 0x35, 0xf2, 0xdb, 0x1a, 0x73, 0xef, 0x70, 0xa1, 0x3f, 0xd3, 0xe1, 0xd5, 0x31,
+	0xeb, 0x71, 0x72, 0x07, 0x26, 0x93, 0x5e, 0xa7, 0xe3, 0xe9, 0xc4, 0x77, 0xa3, 0xa0, 0x0d, 0x4f,
+	0x30, 0x35, 0x26, 0x29, 0x01, 0xa8, 0xc4, 0xb9, 0x21, 0x90, 0x7e, 0x7a, 0xf2, 0x2c, 0x4c, 0xd3,
+	0x3b, 0x29, 0x8d, 0x43, 0xaf, 0xfd, 0x22, 0xae, 0xab, 0x3c, 0x8c, 0x4f, 0xfb, 0x25, 0x0b, 0x8e,
+	0x19, 0x2a, 0xe2, 0xea, 0x68, 0xad, 0xc4, 0xe9, 0xc1, 0x44, 0x6b, 0x2a, 0x36, 0x73, 0x7f, 0xab,
+	0x94, 0xd9, 0xed, 0x77, 0x62, 0x4a, 0x49, 0x1b, 0xc6, 0xc3, 0xa8, 0xae, 0xd7, 0xb7, 0x2b, 0x05,
+	0xac, 0x6f, 0x9b, 0x51, 0xdd, 0x3a, 0x39, 0x63, 0xff, 0x12, 0x14, 0x42, 0xf8, 0x01, 0x83, 0x3a,
+	0x86, 0xe1, 0x08, 0x19, 0xda, 0x14, 0x26, 0x56, 0x1f, 0x30, 0xdc, 0xb0, 0xa5, 0x60, 0x56, 0xa8,
+	0xfb, 0x43, 0x27, 0x93, 0x02, 0xdf, 0xf4, 0x52, 0xbf, 0x75, 0x69, 0x9f, 0x05, 0xff, 0xd7, 0x33,
+	0x25, 0xd5, 0x5f, 0xb4, 0x4b, 0xaa, 0xf7, 0x0e, 0x17, 0x3e, 0x38, 0xac, 0x97, 0xe0, 0x36, 0xe3,
+	0xb0, 0xc8, 0x59, 0x58, 0xd5, 0xd7, 0xcf, 0xc1, 0x94, 0xa5, 0xb1, 0x5c, 0xca, 0x8b, 0x2a, 0xee,
+	0xe9, 0x38, 0xc6, 0x02, 0xa2, 0x2d, 0xcf, 0xfd, 0x5d, 0x07, 0x26, 0x6b, 0x9e, 0xbf, 0x17, 0x35,
+	0x1a, 0xe4, 0xc3, 0x50, 0xa9, 0xf7, 0x64, 0xd5, 0x5a, 0xbc, 0x9b, 0xae, 0x47, 0xae, 0x4a, 0x38,
+	0x6a, 0x0a, 0x66, 0x4c, 0x0d, 0xcf, 0x4f, 0xa3, 0x98, 0xeb, 0x5c, 0x16, 0xc6, 0x74, 0x99, 0x43,
+	0x50, 0x62, 0x58, 0x76, 0xd5, 0xf1, 0xee, 0xa8, 0x87, 0xf3, 0xe9, 0xf7, 0x86, 0x41, 0xa1, 0x4d,
+	0xe7, 0x7e, 0x73, 0x1c, 0x26, 0xe5, 0x11, 0xe7, 0xb1, 0x6b, 0xbc, 0x2a, 0x4e, 0x2e, 0x0d, 0x8d,
+	0x93, 0xbb, 0x30, 0xe1, 0xf3, 0x2e, 0x0d, 0xb9, 0x89, 0x8d, 0x52, 0x85, 0x90, 0xda, 0x89, 0xae,
+	0x0f, 0xa3, 0x93, 0xf8, 0x8f, 0x52, 0x0e, 0x79, 0xd3, 0x81, 0x53, 0x3e, 0x4b, 0xec, 0x7c, 0xb3,
+	0xce, 0x8e, 0x8d, 0x7c, 0xee, 0xb1, 0x92, 0xe5, 0x68, 0x0e, 0x9e, 0x72, 0x08, 0xcc, 0xcb, 0x26,
+	0xcf, 0xc3, 0x8c, 0x18, 0xad, 0x97, 0x32, 0x99, 0x8d, 0x39, 0x70, 0xb3, 0x91, 0x98, 0xa5, 0x25,
+	0x8b, 0x22, 0x3d, 0xe4, 0x05, 0xf2, 0x84, 0x47, 0x6d, 0xb2, 0xf0, 0xa3, 0x2b, 0xe8, 0x09, 0x5a,
+	0x14, 0x24, 0x06, 0x12, 0xd3, 0x46, 0x4c, 0x93, 0x16, 0xd2, 0x57, 0x7b, 0x34, 0x49, 0xf9, 0x1a,
+	0x3f, 0xf9, 0x60, 0x67, 0x05, 0xd8, 0xc7, 0x09, 0x07, 0x70, 0x27, 0x2d, 0x19, 0x53, 0x56, 0x46,
+	0xf6, 0x22, 0x39, 0xc1, 0xc3, 0x42, 0x4b, 0xf7, 0x7f, 0x1d, 0x38, 0xad, 0x8c, 0xc0, 0xf3, 0x5b,
+	0x94, 0xa1, 0xc8, 0xc7, 0x61, 0x56, 0x07, 0x67, 0x2b, 0x51, 0x4f, 0xd6, 0x13, 0xca, 0xa6, 0x7e,
+	0x83, 0x19, 0x2c, 0xe6, 0xa8, 0xc9, 0x12, 0x54, 0x99, 0x46, 0xe2, 0x51, 0xe1, 0x55, 0x3a, 0x00,
+	0x5c, 0xde, 0x5a, 0x93, 0x4f, 0x19, 0x1a, 0x12, 0xc1, 0x5c, 0xdb, 0x4b, 0x52, 0xae, 0x01, 0x0b,
+	0xd7, 0x1e, 0xf0, 0x38, 0x86, 0x1f, 0x86, 0xaf, 0xe7, 0x19, 0x61, 0x3f, 0x6f, 0xf7, 0xcf, 0xcb,
+	0x30, 0x93, 0xb1, 0x7d, 0xb6, 0x68, 0xf4, 0x12, 0xb6, 0xc5, 0xe8, 0x1c, 0x55, 0x2f, 0x1a, 0x2f,
+	0x4a, 0x38, 0x6a, 0x0a, 0x46, 0xdd, 0xf5, 0x92, 0xe4, 0x76, 0x14, 0xd7, 0xa5, 0xa7, 0x6a, 0xea,
+	0x2d, 0x09, 0x47, 0x4d, 0xc1, 0x96, 0x8f, 0x5d, 0xea, 0xc5, 0x34, 0xe6, 0x07, 0x97, 0xf9, 0xe5,
+	0xa3, 0x66, 0x50, 0x68, 0xd3, 0x71, 0xb7, 0x4b, 0xdb, 0xc9, 0x4a, 0x3b, 0xa0, 0x61, 0x2a, 0xd4,
+	0x2c, 0xc0, 0xed, 0x76, 0xd6, 0xb7, 0x6d, 0x8e, 0xc6, 0xed, 0x72, 0x08, 0xcc, 0xcb, 0x26, 0x5f,
+	0x74, 0x60, 0xc6, 0xbb, 0x9d, 0x98, 0x36, 0x31, 0xee, 0x77, 0xa3, 0x2d, 0x40, 0x99, 0xb6, 0xb3,
+	0xda, 0x1c, 0xf3, 0xde, 0x0c, 0x08, 0xb3, 0x12, 0xdd, 0x6f, 0x95, 0x61, 0xca, 0xb2, 0xe9, 0x81,
+	0x4b, 0x93, 0xf3, 0x6e, 0x5a, 0x9a, 0x4a, 0x27, 0x58, 0x9a, 0x3e, 0x0b, 0x55, 0x5f, 0x39, 0x61,
+	0x01, 0x8d, 0x63, 0x79, 0xbf, 0x36, 0x4e, 0xa8, 0x41, 0x68, 0x04, 0x92, 0x2b, 0x30, 0x67, 0xb1,
+	0x91, 0xde, 0x3b, 0xc6, 0xbd, 0x57, 0x67, 0xc4, 0xcb, 0x79, 0x02, 0xec, 0x7f, 0xc6, 0xfd, 0x7b,
+	0x47, 0xcf, 0xd1, 0x23, 0x38, 0x4f, 0x6c, 0x66, 0xcf, 0x13, 0x6b, 0xa3, 0x0f, 0xd8, 0x90, 0xb3,
+	0xc4, 0x4d, 0x98, 0x5c, 0x89, 0x3a, 0x1d, 0x2f, 0xac, 0x93, 0xf7, 0xc3, 0xa4, 0x2f, 0x7e, 0xca,
+	0x88, 0x95, 0x9f, 0x34, 0x49, 0x2c, 0x2a, 0x1c, 0x79, 0x12, 0xc6, 0xbc, 0xb8, 0xa9, 0xa2, 0x54,
+	0x5e, 0xcf, 0x5d, 0x8e, 0x9b, 0x09, 0x72, 0xa8, 0xfb, 0x66, 0x09, 0x60, 0x25, 0xea, 0x74, 0xbd,
+	0x98, 0xd6, 0x77, 0xa2, 0xff, 0xf7, 0xa5, 0x28, 0xf7, 0x0d, 0x07, 0x08, 0x1b, 0x8f, 0x28, 0xa4,
+	0xa1, 0xa9, 0x20, 0xb3, 0xcd, 0xc4, 0x57, 0x50, 0xb9, 0x32, 0x1b, 0x3b, 0x56, 0x08, 0x34, 0x34,
+	0xc7, 0x88, 0xa0, 0x9e, 0x52, 0x15, 0xcc, 0x72, 0xf6, 0x10, 0x8c, 0x9f, 0x8a, 0xc8, 0x82, 0xa6,
+	0xfb, 0xd5, 0x12, 0x3c, 0x21, 0x16, 0x9d, 0x0d, 0x2f, 0xf4, 0x9a, 0xb4, 0xc3, 0xb4, 0x3a, 0x6e,
+	0x2d, 0xf3, 0x15, 0xb6, 0x81, 0x07, 0xea, 0xd0, 0x6b, 0x24, 0x9b, 0x14, 0xb6, 0x24, 0xac, 0x67,
+	0x2d, 0x0c, 0x52, 0xe4, 0x9c, 0x49, 0x17, 0x2a, 0xaa, 0x8b, 0x57, 0x2e, 0x15, 0x45, 0x48, 0xd1,
+	0x8e, 0x76, 0x45, 0xf2, 0x46, 0x2d, 0xc5, 0xfd, 0x9e, 0x03, 0xf9, 0xf5, 0x8f, 0x47, 0xb5, 0xa2,
+	0x2f, 0x25, 0x1f, 0xd5, 0x66, 0x3b, 0x49, 0x4e, 0xd0, 0x9b, 0xf1, 0x29, 0x98, 0xf2, 0xd2, 0x94,
+	0x76, 0xba, 0x22, 0xd0, 0x2a, 0x3f, 0x58, 0x32, 0xbd, 0x11, 0xd5, 0x83, 0x46, 0xc0, 0x03, 0x2c,
+	0x9b, 0x9d, 0xfb, 0x02, 0x54, 0x54, 0x79, 0xf8, 0x18, 0xd3, 0xf8, 0x54, 0xa6, 0xd4, 0x3d, 0xc4,
+	0x50, 0xde, 0x28, 0xc1, 0xec, 0x95, 0xb0, 0xb7, 0x75, 0x65, 0xab, 0xb7, 0xdb, 0x0e, 0xfc, 0xeb,
+	0xf4, 0x80, 0x3d, 0xb7, 0x47, 0x0f, 0xd6, 0x56, 0x25, 0x6b, 0xfd, 0xdc, 0x75, 0x06, 0x44, 0x81,
+	0x63, 0x51, 0x41, 0x23, 0x08, 0x9b, 0x34, 0xee, 0xc6, 0x81, 0x8c, 0x93, 0xac, 0xa8, 0xe0, 0xb2,
+	0x41, 0xa1, 0x4d, 0xc7, 0x78, 0x47, 0xb7, 0x43, 0x1a, 0xe7, 0x8d, 0xf7, 0x06, 0x03, 0xa2, 0xc0,
+	0x31, 0xa2, 0x34, 0xee, 0x25, 0xa9, 0x3c, 0xf7, 0xd3, 0x44, 0x3b, 0x0c, 0x88, 0x02, 0xc7, 0x26,
+	0x25, 0xe9, 0xed, 0xf2, 0xb2, 0x42, 0xee, 0x68, 0x60, 0x5b, 0x80, 0x51, 0xe1, 0x19, 0xe9, 0x1e,
+	0x3d, 0x58, 0x65, 0x2b, 0xf8, 0x44, 0x96, 0xf4, 0xba, 0x00, 0xa3, 0xc2, 0xbb, 0x77, 0x1d, 0x20,
+	0xd9, 0xe1, 0x78, 0x04, 0x9b, 0x40, 0x98, 0xdd, 0x04, 0x46, 0x29, 0xff, 0x64, 0x75, 0x1f, 0xb2,
+	0x17, 0xfc, 0x91, 0x03, 0xd3, 0x76, 0x01, 0x90, 0x34, 0x73, 0x8e, 0x70, 0x23, 0xeb, 0x08, 0xf7,
+	0x0e, 0x17, 0x7e, 0x79, 0xd0, 0xdd, 0x86, 0x66, 0x90, 0x46, 0xdd, 0xe4, 0x23, 0x34, 0x6c, 0x06,
+	0x21, 0xe5, 0xd9, 0xb5, 0x28, 0x1c, 0x66, 0xaa, 0x8b, 0x2b, 0x51, 0x9d, 0x3e, 0x80, 0x27, 0xb9,
+	0x37, 0x61, 0xae, 0xef, 0x0c, 0xf6, 0x18, 0x46, 0x7f, 0x64, 0xcb, 0x8b, 0xfb, 0xa6, 0x03, 0x33,
+	0x99, 0xf3, 0xeb, 0x82, 0x5c, 0x89, 0xbb, 0x44, 0xc4, 0xab, 0xc6, 0x71, 0x10, 0x8a, 0xfc, 0xb6,
+	0x62, 0xb9, 0x84, 0x41, 0xa1, 0x4d, 0xe7, 0x6e, 0x00, 0x4f, 0x69, 0x8a, 0x72, 0xe8, 0x17, 0xa0,
+	0xc2, 0xd8, 0xb1, 0x09, 0x2f, 0x8a, 0x65, 0x04, 0x15, 0xd5, 0xb7, 0x48, 0x5c, 0x28, 0x07, 0x9e,
+	0x4a, 0xa9, 0xb4, 0x51, 0xaf, 0x25, 0x49, 0x8f, 0x2f, 0x57, 0x0c, 0x49, 0x9e, 0x82, 0x32, 0xbd,
+	0xd3, 0xcd, 0xe7, 0x4e, 0x97, 0xee, 0x74, 0x83, 0x98, 0x26, 0x8c, 0x88, 0xde, 0xe9, 0x92, 0x73,
+	0x50, 0x0a, 0xea, 0x72, 0x19, 0x00, 0x49, 0x53, 0x5a, 0x5b, 0xc5, 0x52, 0x50, 0x77, 0x7b, 0x50,
+	0xd5, 0x8d, 0x92, 0xa4, 0xa5, 0xbc, 0xc3, 0x19, 0xf9, 0x6c, 0x4d, 0x31, 0x1d, 0xe2, 0x17, 0x3d,
+	0x00, 0x73, 0xc6, 0x5d, 0x94, 0x55, 0x5c, 0x80, 0x31, 0x3f, 0xaa, 0x53, 0x69, 0x0e, 0x9a, 0x0d,
+	0x77, 0x0b, 0x8e, 0x71, 0x6f, 0xc2, 0xec, 0xf5, 0x30, 0xba, 0x1d, 0xb2, 0xb5, 0xea, 0x72, 0x40,
+	0xdb, 0x75, 0xc6, 0xb8, 0xc1, 0x7e, 0xe4, 0x57, 0x60, 0x8e, 0x45, 0x81, 0xd3, 0x3d, 0x85, 0xa5,
+	0x61, 0x3d, 0x85, 0xee, 0x57, 0x1c, 0x38, 0x9d, 0x3f, 0xd3, 0xfe, 0xb1, 0x45, 0x24, 0x5f, 0x60,
+	0xca, 0xa8, 0xe3, 0xe0, 0x1b, 0x5d, 0x51, 0x64, 0x7f, 0x0e, 0xa6, 0x77, 0x7b, 0x41, 0xbb, 0x2e,
+	0xff, 0x4b, 0x7d, 0xf4, 0xc9, 0x70, 0xcd, 0xc2, 0x61, 0x86, 0x92, 0x5c, 0x04, 0xd8, 0x0d, 0x42,
+	0x2f, 0x3e, 0xd8, 0x32, 0xde, 0xae, 0x4b, 0xfa, 0x35, 0x8d, 0x41, 0x8b, 0xca, 0x7d, 0xab, 0x0c,
+	0xa6, 0x6f, 0x93, 0x34, 0xe4, 0xb9, 0x8d, 0x33, 0x72, 0x1a, 0xc8, 0x12, 0x73, 0xd3, 0x1e, 0x5a,
+	0xc9, 0x1d, 0xdb, 0x7c, 0xc9, 0x81, 0x29, 0x16, 0xf4, 0x04, 0x5e, 0x4a, 0xeb, 0xb5, 0x03, 0x19,
+	0x55, 0x6d, 0x14, 0x51, 0xe3, 0x5f, 0x13, 0x6c, 0xa3, 0xd8, 0x2c, 0x33, 0x6b, 0x46, 0x12, 0xda,
+	0x62, 0xc9, 0xa7, 0x65, 0x55, 0xa6, 0x5c, 0xcc, 0x49, 0x5f, 0x25, 0x77, 0xca, 0xd7, 0x81, 0xf1,
+	0x98, 0xa6, 0xb1, 0x3a, 0x5a, 0xbd, 0x3a, 0x52, 0x99, 0x38, 0x8d, 0x0f, 0xb6, 0x53, 0x16, 0xb6,
+	0x35, 0xad, 0x2d, 0x8c, 0x83, 0x51, 0x48, 0x71, 0x13, 0x20, 0xfd, 0xa3, 0x70, 0xc2, 0x32, 0xc8,
+	0x12, 0x54, 0xbd, 0x5e, 0x1a, 0x75, 0xd8, 0x00, 0xf1, 0x59, 0xa9, 0x58, 0x85, 0x1e, 0x85, 0x40,
+	0x43, 0xe3, 0xbe, 0x3e, 0x0e, 0xb9, 0xb3, 0x14, 0xd2, 0xb3, 0x9b, 0x8c, 0x9d, 0x02, 0x9b, 0x8c,
+	0xb5, 0x26, 0x83, 0x1a, 0x8d, 0x59, 0xda, 0xd8, 0x6d, 0x79, 0x89, 0x72, 0xca, 0x17, 0xd4, 0x18,
+	0x6d, 0x31, 0xe0, 0xbd, 0xc3, 0x85, 0x5f, 0x39, 0xde, 0x76, 0xcd, 0xec, 0x73, 0x49, 0x34, 0x5c,
+	0x18, 0xd1, 0x9c, 0x07, 0x0a, 0xfe, 0xf6, 0x86, 0x5d, 0x3e, 0x22, 0xf4, 0xfd, 0xbc, 0x38, 0x61,
+	0x47, 0x9a, 0xf4, 0xda, 0xa9, 0x34, 0x83, 0xcd, 0xa2, 0xbc, 0x4a, 0x70, 0x35, 0x47, 0xed, 0xe2,
+	0x3f, 0x5a, 0x12, 0xc9, 0x27, 0xa1, 0x9a, 0xa4, 0x5e, 0x9c, 0x3e, 0xe0, 0x69, 0x9d, 0x1e, 0xf0,
+	0x6d, 0xc5, 0x04, 0x0d, 0x3f, 0xf2, 0x32, 0x40, 0x23, 0x08, 0x83, 0xa4, 0xf5, 0x80, 0xf5, 0x53,
+	0xae, 0xf8, 0x65, 0xcd, 0x01, 0x2d, 0x6e, 0x6c, 0x29, 0xe3, 0x46, 0x2d, 0x6a, 0x16, 0x15, 0xbe,
+	0x6b, 0xea, 0xa5, 0x0c, 0x35, 0x06, 0x2d, 0x2a, 0xf7, 0xf3, 0x70, 0x26, 0x7f, 0x6f, 0x46, 0x86,
+	0xee, 0xcd, 0x38, 0xea, 0x75, 0xf3, 0x1b, 0x07, 0xbf, 0x78, 0x82, 0x02, 0xc7, 0x16, 0xf4, 0xbd,
+	0x20, 0xac, 0xe7, 0x17, 0xf4, 0xeb, 0x41, 0x58, 0x47, 0x8e, 0x39, 0x46, 0xe7, 0xf5, 0x5f, 0x38,
+	0x70, 0xe1, 0xa8, 0xeb, 0x3d, 0xe4, 0x49, 0x18, 0xbb, 0xed, 0xc5, 0xa1, 0xec, 0xb3, 0xe4, 0x2b,
+	0xc6, 0x4d, 0x2f, 0x0e, 0x91, 0x43, 0xc9, 0x3e, 0x4c, 0x88, 0x7e, 0x04, 0x19, 0xf6, 0x6e, 0x16,
+	0x78, 0xd3, 0x88, 0xc5, 0xbe, 0x3a, 0x9b, 0x13, 0x8d, 0x10, 0x28, 0xa5, 0xb9, 0xd7, 0x80, 0xdc,
+	0xd8, 0xa7, 0x71, 0x1c, 0xd4, 0xad, 0xee, 0x09, 0xf2, 0x2c, 0x4c, 0xdf, 0xda, 0xbe, 0xb1, 0xb9,
+	0x15, 0x05, 0x21, 0xef, 0x26, 0xb3, 0xce, 0xf2, 0xae, 0x59, 0x70, 0xcc, 0x50, 0xb9, 0xdf, 0x2e,
+	0xc1, 0x94, 0x75, 0x0b, 0xed, 0x18, 0x31, 0x43, 0xee, 0xd6, 0x5c, 0xe9, 0x98, 0xb7, 0xe6, 0x9e,
+	0x86, 0x4a, 0x37, 0x6a, 0x07, 0x7e, 0xa0, 0x9b, 0xbc, 0xa6, 0x79, 0xb9, 0x56, 0xc2, 0x50, 0x63,
+	0x49, 0x0a, 0x55, 0x7d, 0xd5, 0x45, 0x1e, 0xdb, 0x17, 0x12, 0x32, 0x69, 0xff, 0x30, 0x57, 0x58,
+	0x8c, 0x20, 0xe2, 0xc2, 0x04, 0x37, 0x2e, 0x71, 0x5c, 0x2f, 0x0f, 0x35, 0xb9, 0xd5, 0x25, 0x28,
+	0x31, 0xee, 0x0f, 0x4a, 0x50, 0x45, 0xda, 0x8d, 0x56, 0x62, 0x5a, 0x4f, 0xc8, 0xfb, 0xa0, 0xdc,
+	0x8b, 0xdb, 0x72, 0xa4, 0xa6, 0x24, 0xf3, 0xf2, 0x8b, 0xb8, 0x8e, 0x0c, 0x9e, 0x59, 0xca, 0x4b,
+	0x27, 0xaa, 0x68, 0x97, 0x8f, 0xac, 0x68, 0x3f, 0x0f, 0x33, 0x49, 0xd2, 0xda, 0x8a, 0x83, 0x7d,
+	0x2f, 0x65, 0xa6, 0x22, 0xf3, 0x4c, 0x53, 0xe6, 0xdc, 0xbe, 0x6a, 0x90, 0x98, 0xa5, 0x25, 0x57,
+	0x60, 0xce, 0x94, 0x96, 0x69, 0x9c, 0xf2, 0xb4, 0x52, 0x64, 0xa0, 0xba, 0xd0, 0x68, 0x8a, 0xd1,
+	0x92, 0x00, 0xfb, 0x9f, 0x21, 0xab, 0x70, 0x3a, 0x03, 0x64, 0x8a, 0x88, 0xf4, 0x74, 0x5e, 0xf2,
+	0x39, 0x9d, 0xe1, 0xc3, 0x74, 0xe9, 0x7b, 0xc2, 0x7d, 0xdb, 0x81, 0x19, 0x3d, 0xa8, 0x8f, 0x20,
+	0x57, 0x0d, 0xb2, 0xb9, 0xea, 0xea, 0x48, 0xfb, 0xbc, 0x54, 0x7b, 0x48, 0x38, 0xfe, 0x87, 0x13,
+	0x00, 0xfc, 0xe2, 0x6b, 0xc0, 0xdb, 0x42, 0x2e, 0xc0, 0x58, 0x4c, 0xbb, 0x51, 0xde, 0xb7, 0x18,
+	0x05, 0x72, 0xcc, 0xbb, 0xd7, 0x66, 0x06, 0xd5, 0xf9, 0xc7, 0x7f, 0x8c, 0x75, 0xfe, 0x6d, 0x38,
+	0x1b, 0x84, 0x09, 0xf5, 0x7b, 0xb1, 0x5c, 0x02, 0xaf, 0x46, 0x89, 0xb6, 0xbf, 0x4a, 0xed, 0x7d,
+	0x92, 0xd1, 0xd9, 0xb5, 0x41, 0x44, 0x38, 0xf8, 0x59, 0x36, 0x9e, 0x0a, 0xc1, 0x37, 0xc8, 0x8a,
+	0x95, 0x1e, 0x4a, 0x38, 0x6a, 0x0a, 0x16, 0x7c, 0xd1, 0xd0, 0xdb, 0x6d, 0xd3, 0xf5, 0x46, 0xc2,
+	0xf7, 0x3c, 0x2b, 0xf8, 0xba, 0x24, 0x10, 0x97, 0xb7, 0xd1, 0xd0, 0x0c, 0xf6, 0xbb, 0x6a, 0x41,
+	0x7e, 0x07, 0x27, 0xf5, 0x3b, 0x9d, 0x7d, 0x4d, 0x0d, 0xbd, 0xd1, 0xa5, 0xf6, 0x82, 0xe9, 0xa1,
+	0x7b, 0xc1, 0xc7, 0x61, 0x36, 0x08, 0x5b, 0x34, 0x0e, 0x52, 0x5a, 0xe7, 0x8e, 0x30, 0x3f, 0xc3,
+	0x07, 0x42, 0x9f, 0x54, 0xae, 0x65, 0xb0, 0x98, 0xa3, 0x76, 0x5f, 0x2f, 0xc1, 0x59, 0xe3, 0x20,
+	0x4c, 0xb3, 0xa0, 0xc1, 0xac, 0x84, 0x77, 0x1e, 0x8b, 0xc3, 0x19, 0xeb, 0x03, 0x08, 0x3a, 0xa4,
+	0xd8, 0xd6, 0x18, 0xb4, 0xa8, 0xd8, 0xfc, 0xf9, 0x34, 0xe6, 0x5d, 0x11, 0x79, 0xef, 0x59, 0x91,
+	0x70, 0xd4, 0x14, 0xfc, 0x1b, 0x0b, 0x34, 0x4e, 0x65, 0xad, 0x2d, 0x7f, 0x2a, 0xb8, 0x62, 0x50,
+	0x68, 0xd3, 0xb1, 0x7d, 0xcc, 0x57, 0x93, 0xc7, 0x3c, 0x68, 0x5a, 0xec, 0x63, 0x7a, 0xbe, 0x34,
+	0x56, 0xa9, 0xc3, 0x4f, 0x93, 0xc6, 0xfb, 0xd5, 0xe1, 0xa9, 0x87, 0xa6, 0x70, 0xff, 0xcb, 0x81,
+	0xf7, 0x0e, 0x1c, 0x8a, 0x47, 0xb0, 0x24, 0xf6, 0xb2, 0x4b, 0xe2, 0xd6, 0x88, 0x4b, 0x62, 0xdf,
+	0x2b, 0x0c, 0x59, 0x1e, 0xff, 0xd1, 0x81, 0x59, 0x43, 0xff, 0x08, 0xde, 0xb3, 0x51, 0xdc, 0x07,
+	0x13, 0x8c, 0xde, 0xb5, 0x6a, 0xdf, 0x8b, 0xbd, 0xcd, 0x5f, 0x4c, 0x04, 0x72, 0xcb, 0xbe, 0xba,
+	0x3f, 0x79, 0x44, 0x5c, 0xb5, 0x0f, 0x13, 0xbc, 0x31, 0x3f, 0x29, 0x20, 0x9a, 0xcc, 0x0a, 0xe7,
+	0xa5, 0x13, 0x13, 0x4d, 0xf2, 0xbf, 0x09, 0x4a, 0x69, 0xbc, 0x5d, 0x27, 0x48, 0xd8, 0x22, 0x55,
+	0x97, 0x25, 0x1e, 0xd3, 0xae, 0x23, 0xe1, 0xa8, 0x29, 0xdc, 0x0e, 0xcc, 0x67, 0x99, 0xaf, 0xd2,
+	0x06, 0x4f, 0xd2, 0x8f, 0xf5, 0x8e, 0x2c, 0x61, 0xe5, 0x4f, 0xad, 0xf7, 0xbc, 0xfc, 0x0d, 0xca,
+	0x65, 0x85, 0x40, 0x43, 0xe3, 0xfe, 0xa9, 0x03, 0x67, 0x06, 0xbc, 0x4c, 0x81, 0xa5, 0xad, 0xd4,
+	0x38, 0xff, 0x90, 0x5b, 0xad, 0x75, 0xda, 0xf0, 0x54, 0x42, 0x68, 0xa5, 0x8f, 0xab, 0x02, 0x8c,
+	0x0a, 0xef, 0xfe, 0x87, 0x03, 0xa7, 0xb2, 0xba, 0x26, 0xe4, 0x1a, 0x10, 0xf1, 0x32, 0xab, 0x41,
+	0xe2, 0x47, 0xfb, 0x34, 0x3e, 0x60, 0x6f, 0x2e, 0xb4, 0x3e, 0x27, 0x39, 0x91, 0xe5, 0x3e, 0x0a,
+	0x1c, 0xf0, 0x14, 0xf9, 0x0a, 0x3f, 0x2b, 0x54, 0xa3, 0xad, 0xcc, 0x64, 0xbb, 0x30, 0x33, 0x31,
+	0x33, 0x69, 0x87, 0xf3, 0x5a, 0x1e, 0xda, 0xc2, 0xdd, 0x1f, 0x95, 0x61, 0x5a, 0x3d, 0xce, 0xd3,
+	0x8f, 0x82, 0x12, 0xb7, 0xcc, 0x1d, 0xdb, 0xf2, 0x09, 0xee, 0xd8, 0x8e, 0xdd, 0x2f, 0x61, 0x11,
+	0x77, 0x3e, 0x4d, 0xd8, 0x62, 0x2d, 0xf4, 0x3b, 0x06, 0x85, 0x36, 0x1d, 0xd3, 0xa4, 0x1d, 0xec,
+	0x53, 0xf1, 0xd0, 0x44, 0x56, 0x93, 0x75, 0x85, 0x40, 0x43, 0xc3, 0x34, 0xa9, 0x07, 0x8d, 0x06,
+	0x0f, 0x1d, 0x2c, 0x4d, 0xd8, 0xe8, 0x20, 0xc7, 0x30, 0x8a, 0x56, 0x14, 0xed, 0xc9, 0x68, 0x41,
+	0x53, 0x5c, 0x8d, 0xa2, 0x3d, 0xe4, 0x18, 0xb2, 0x01, 0x67, 0xc2, 0x28, 0xee, 0x78, 0xed, 0xe0,
+	0x35, 0x5a, 0xd7, 0x52, 0x64, 0x94, 0xf0, 0x53, 0xf2, 0x81, 0x33, 0x9b, 0xfd, 0x24, 0x38, 0xe8,
+	0x39, 0x66, 0x7e, 0xdd, 0x98, 0xd6, 0x03, 0x3f, 0xb5, 0xb9, 0x41, 0xd6, 0xfc, 0xb6, 0xfa, 0x28,
+	0x70, 0xc0, 0x53, 0xee, 0x7f, 0xf2, 0x0d, 0x6a, 0x48, 0xd3, 0xfe, 0x23, 0xcb, 0xdb, 0xb3, 0x06,
+	0x32, 0x76, 0x0c, 0x03, 0x61, 0x79, 0x71, 0x12, 0x85, 0x3a, 0x2f, 0x1e, 0x1f, 0x9a, 0x17, 0x5b,
+	0x54, 0xee, 0xf7, 0xc6, 0xe1, 0x09, 0xdd, 0xed, 0x49, 0xd3, 0xdb, 0x51, 0xbc, 0x17, 0x84, 0x4d,
+	0x7e, 0xcc, 0xf1, 0x0d, 0x07, 0xa6, 0x85, 0xa1, 0xc8, 0x6b, 0x47, 0xa2, 0xac, 0xef, 0x17, 0xd1,
+	0x57, 0x9a, 0x91, 0xb4, 0xb8, 0x63, 0x49, 0xc9, 0x5d, 0x39, 0xb2, 0x51, 0x98, 0x51, 0x87, 0xbc,
+	0x06, 0xa0, 0xee, 0x38, 0x37, 0x8a, 0xb8, 0xe6, 0xad, 0x94, 0x43, 0xda, 0x30, 0x21, 0xd8, 0x8e,
+	0x96, 0x80, 0x96, 0x34, 0xf2, 0x65, 0x07, 0x26, 0xda, 0x62, 0x54, 0x44, 0x99, 0xf6, 0xd3, 0xc5,
+	0x8f, 0x8a, 0x3d, 0x1e, 0x7a, 0x53, 0x93, 0x23, 0x21, 0x85, 0x13, 0x84, 0xc9, 0x20, 0x6c, 0xc6,
+	0x34, 0x51, 0x15, 0x84, 0x0f, 0x5a, 0x61, 0xc4, 0xa2, 0x1f, 0xc5, 0x94, 0x07, 0x0d, 0x91, 0x57,
+	0xaf, 0x79, 0x6d, 0x2f, 0xf4, 0x69, 0xbc, 0x26, 0xc8, 0xcd, 0xfa, 0x2e, 0x01, 0xa8, 0x18, 0xf5,
+	0x35, 0x4b, 0x8f, 0x1f, 0xa7, 0x59, 0xfa, 0xdc, 0x27, 0x60, 0xae, 0x6f, 0x1a, 0x4f, 0x72, 0xab,
+	0xeb, 0xdc, 0x47, 0x61, 0xea, 0x41, 0x2f, 0x84, 0xfd, 0xd9, 0x84, 0x59, 0xa4, 0x37, 0xa3, 0x3a,
+	0xef, 0x12, 0x8e, 0xcd, 0x6c, 0xca, 0x08, 0xab, 0x28, 0xdb, 0xb0, 0xee, 0xc3, 0x6a, 0x20, 0xda,
+	0xf2, 0x98, 0x65, 0x76, 0xbd, 0x98, 0x86, 0x0f, 0xd5, 0x32, 0xb7, 0xb4, 0x04, 0xb4, 0xa4, 0x11,
+	0x9a, 0x39, 0x3d, 0x58, 0x19, 0xf1, 0xf4, 0x80, 0x85, 0x7b, 0x03, 0xef, 0x0a, 0xbd, 0xe9, 0xc0,
+	0x6c, 0x98, 0xb1, 0x57, 0x59, 0x48, 0x7e, 0xa1, 0x70, 0x47, 0x10, 0x57, 0x23, 0xb2, 0x30, 0xcc,
+	0x09, 0x27, 0xcb, 0x70, 0x4a, 0xcd, 0x40, 0xb6, 0x5b, 0x57, 0xe7, 0xda, 0x98, 0x45, 0x63, 0x9e,
+	0xde, 0x6a, 0xf7, 0x9f, 0x18, 0xd6, 0xee, 0x4f, 0xf6, 0xf4, 0xcd, 0x9e, 0xc9, 0x62, 0x6f, 0xf6,
+	0xc0, 0x80, 0x5b, 0x3d, 0x37, 0xa1, 0xea, 0xc7, 0xd4, 0x4b, 0x1f, 0xf0, 0xb6, 0x07, 0xff, 0x2a,
+	0xc0, 0x8a, 0x62, 0x80, 0x86, 0x97, 0xfb, 0xf5, 0x32, 0x9c, 0x56, 0xc3, 0xa1, 0x2a, 0xac, 0x6c,
+	0xc3, 0x11, 0x72, 0x4d, 0xe4, 0xa6, 0x37, 0x9c, 0xab, 0x0a, 0x81, 0x86, 0x86, 0x85, 0x8c, 0x22,
+	0x7a, 0x4b, 0xf2, 0x27, 0x0e, 0x32, 0x2a, 0x44, 0x85, 0x27, 0x5f, 0x1f, 0x78, 0xb9, 0xae, 0x80,
+	0xf3, 0xb5, 0xbe, 0xf2, 0xf0, 0x09, 0x6f, 0xd5, 0xbd, 0xe1, 0xc0, 0xa9, 0xbd, 0xcc, 0x91, 0xae,
+	0x5a, 0x48, 0x47, 0xe9, 0xed, 0xc8, 0x1e, 0x12, 0x1b, 0x13, 0xcc, 0xc2, 0x13, 0xcc, 0x8b, 0x76,
+	0xff, 0xdb, 0x01, 0x7b, 0x55, 0x39, 0x5e, 0xb4, 0x61, 0x5d, 0xbd, 0x2d, 0xdd, 0xff, 0xea, 0xad,
+	0x0e, 0x4c, 0xca, 0xc7, 0x8b, 0x4b, 0xc7, 0x4e, 0x10, 0x97, 0x8e, 0x0f, 0x8d, 0x64, 0xde, 0x07,
+	0xe5, 0x5e, 0x50, 0x97, 0xa1, 0xa5, 0xa9, 0x1f, 0xaf, 0xad, 0x22, 0x83, 0xbb, 0x7f, 0x39, 0x6e,
+	0x92, 0x48, 0x79, 0x40, 0xf4, 0x13, 0xf1, 0xda, 0x0d, 0xdd, 0xaa, 0x23, 0xde, 0x7c, 0xb3, 0xaf,
+	0x55, 0xe7, 0x97, 0x4e, 0x7e, 0xf6, 0x27, 0x06, 0x68, 0x58, 0xa7, 0xce, 0xe4, 0x11, 0x07, 0x7f,
+	0xb7, 0xa0, 0xc2, 0xa2, 0x6f, 0x5e, 0x07, 0xaa, 0x64, 0x94, 0xaa, 0x5c, 0x95, 0xf0, 0x7b, 0x87,
+	0x0b, 0x1f, 0x3b, 0xb9, 0x5a, 0xea, 0x69, 0xd4, 0xfc, 0x49, 0x02, 0x55, 0xf6, 0x9b, 0x9f, 0x51,
+	0xca, 0xb8, 0xfe, 0x45, 0xbd, 0x9c, 0x28, 0x44, 0x21, 0x07, 0xa0, 0x46, 0x0e, 0x09, 0xa1, 0xca,
+	0xaf, 0xf4, 0x72, 0xa1, 0x22, 0xfc, 0xdf, 0xd2, 0xa7, 0x85, 0x0a, 0x71, 0xef, 0x70, 0xe1, 0xf9,
+	0x93, 0x0b, 0xd5, 0x8f, 0xa3, 0x11, 0xe1, 0xbe, 0x53, 0x36, 0xb6, 0x2b, 0x3b, 0xb4, 0x7e, 0x22,
+	0x6c, 0xf7, 0xb9, 0x9c, 0xed, 0x5e, 0xe8, 0xb3, 0xdd, 0x59, 0x73, 0x05, 0x36, 0x63, 0x8d, 0x8f,
+	0x74, 0x83, 0x3c, 0x3a, 0xcf, 0xe4, 0x61, 0xc1, 0xab, 0xbd, 0x20, 0xa6, 0xc9, 0x56, 0xdc, 0x0b,
+	0x83, 0xb0, 0xc9, 0x6d, 0xb1, 0x62, 0x87, 0x05, 0x19, 0x34, 0xe6, 0xe9, 0xdd, 0x6f, 0xf3, 0x73,
+	0x1b, 0xab, 0xd1, 0x81, 0x4d, 0x71, 0x9b, 0x5f, 0x8c, 0x16, 0xbd, 0x55, 0x7a, 0x8a, 0xc5, 0x6d,
+	0x68, 0x81, 0x23, 0x29, 0x4c, 0xee, 0x8a, 0x8b, 0x62, 0x05, 0x74, 0xe7, 0xca, 0x2b, 0x67, 0xfc,
+	0x72, 0x8f, 0xba, 0x7f, 0x76, 0xcf, 0xfc, 0x44, 0x25, 0xca, 0xfd, 0x83, 0x32, 0x9c, 0xca, 0xdd,
+	0xdf, 0x25, 0x1f, 0x86, 0x8a, 0xba, 0xa0, 0x9d, 0x2f, 0x17, 0xeb, 0xaf, 0x45, 0x69, 0x0a, 0xf2,
+	0x19, 0x80, 0x3a, 0xed, 0xb6, 0xa3, 0x03, 0x1e, 0x75, 0x8c, 0x9d, 0x38, 0xea, 0xd0, 0xf1, 0xe9,
+	0xaa, 0xe6, 0x82, 0x16, 0x47, 0xd9, 0x4d, 0x36, 0x2e, 0xee, 0xc0, 0x65, 0xbb, 0xc9, 0xac, 0xde,
+	0xf4, 0x89, 0x47, 0xd8, 0x9b, 0x1e, 0xc0, 0x29, 0xa1, 0x9f, 0xee, 0x27, 0x78, 0x80, 0xb6, 0x81,
+	0x33, 0xcc, 0x96, 0x56, 0xb3, 0x6c, 0x30, 0xcf, 0xd7, 0xfd, 0x6a, 0x89, 0x05, 0x5e, 0x62, 0xa4,
+	0x37, 0x54, 0xb5, 0xf6, 0x03, 0x30, 0xe1, 0xf5, 0xd2, 0x56, 0xd4, 0x77, 0x65, 0x6f, 0x99, 0x43,
+	0x51, 0x62, 0xc9, 0x3a, 0x8c, 0xd5, 0xbd, 0x54, 0x7d, 0xdb, 0xf0, 0x24, 0xca, 0x99, 0x1a, 0x8d,
+	0x97, 0x52, 0xe4, 0x5c, 0xc8, 0x93, 0x30, 0x96, 0x7a, 0xcd, 0xcc, 0x47, 0x60, 0x76, 0xbc, 0x66,
+	0x82, 0x1c, 0x6a, 0x6f, 0x2a, 0x63, 0x47, 0x6c, 0x2a, 0xcf, 0x5b, 0xdf, 0xb7, 0xb4, 0xce, 0x00,
+	0xfa, 0x3f, 0x4b, 0xc9, 0xe3, 0xf6, 0x2c, 0xad, 0xfb, 0x73, 0x30, 0x6d, 0x7f, 0xb6, 0xf2, 0x58,
+	0x1d, 0xcd, 0xee, 0xbf, 0x8e, 0xc1, 0x4c, 0xa6, 0xe7, 0x24, 0x63, 0xe2, 0xce, 0x91, 0x26, 0xfe,
+	0x14, 0x8c, 0x77, 0xe3, 0x5e, 0x48, 0x65, 0x2b, 0x91, 0x16, 0xc2, 0x3c, 0x9e, 0xa2, 0xc0, 0xb1,
+	0x59, 0xa9, 0xc7, 0x07, 0xd8, 0x0b, 0x65, 0xb1, 0x58, 0xcf, 0xca, 0x2a, 0x87, 0xa2, 0xc4, 0x92,
+	0xcf, 0xc1, 0x74, 0xc2, 0x97, 0x42, 0xb1, 0x38, 0x48, 0x8f, 0xb9, 0x32, 0xf2, 0xc7, 0x05, 0x64,
+	0x53, 0x15, 0x4f, 0xbb, 0x6d, 0x08, 0x66, 0xc4, 0x91, 0x2f, 0x3a, 0xf6, 0x07, 0x15, 0x26, 0x46,
+	0x3e, 0xd7, 0xc8, 0xf7, 0xf2, 0x08, 0xd7, 0xb9, 0xff, 0x77, 0x15, 0xba, 0xda, 0x6d, 0x27, 0x1f,
+	0x82, 0xdb, 0xc2, 0x00, 0x97, 0xfd, 0x10, 0x54, 0x3b, 0x5e, 0x18, 0x34, 0x68, 0x92, 0x8a, 0x4f,
+	0xcc, 0x56, 0x45, 0xb6, 0xb3, 0xa1, 0x80, 0x68, 0xf0, 0xfc, 0xfb, 0xcd, 0xfc, 0xad, 0x44, 0xae,
+	0x52, 0xb5, 0xbe, 0xdf, 0x6c, 0xc0, 0x68, 0xd3, 0xb8, 0xdf, 0x71, 0xe0, 0xec, 0xc0, 0x91, 0x78,
+	0xf7, 0xd6, 0xff, 0xdc, 0xef, 0x94, 0xe0, 0xcc, 0x80, 0x4e, 0x2c, 0xb2, 0xff, 0x70, 0xbe, 0xb8,
+	0x21, 0xfb, 0xbc, 0x66, 0x86, 0x5a, 0xc5, 0xc9, 0xb6, 0x1d, 0xb3, 0xf4, 0x97, 0x1f, 0xdd, 0xd2,
+	0xef, 0xfe, 0x49, 0x09, 0xac, 0xef, 0xc1, 0x90, 0x5f, 0xb3, 0xfb, 0x0c, 0x9d, 0x42, 0xfa, 0xe2,
+	0x04, 0x67, 0xdd, 0xa4, 0x28, 0xc6, 0x6b, 0x50, 0xcf, 0x62, 0xde, 0x4c, 0x4b, 0x47, 0x9b, 0x29,
+	0x09, 0x54, 0x2b, 0x67, 0xb9, 0xe0, 0x56, 0xce, 0x6a, 0x5f, 0x1b, 0x67, 0x4b, 0x18, 0x57, 0xee,
+	0x75, 0xcc, 0x52, 0xea, 0xdc, 0x67, 0x29, 0xfd, 0x30, 0x54, 0x12, 0xda, 0x6e, 0xb0, 0xe0, 0x4d,
+	0x2e, 0xb9, 0xda, 0x12, 0xb6, 0x25, 0x1c, 0x35, 0x85, 0xfb, 0x23, 0x47, 0xcc, 0x89, 0x8c, 0xa7,
+	0x9f, 0xcb, 0xdd, 0x78, 0x38, 0x7e, 0x28, 0x7a, 0x00, 0xe0, 0xeb, 0x7b, 0x6f, 0x05, 0x7c, 0xf4,
+	0xc5, 0x5c, 0xa2, 0xb3, 0x3f, 0x49, 0xa2, 0x60, 0x68, 0x09, 0xcb, 0xd8, 0x7e, 0xf9, 0x28, 0xdb,
+	0x77, 0xff, 0xdd, 0x81, 0xcc, 0x12, 0x4f, 0x3a, 0x30, 0xce, 0x34, 0x38, 0x28, 0xe0, 0x8a, 0x9e,
+	0xcd, 0x97, 0xf9, 0x85, 0x9c, 0x5b, 0xfe, 0x13, 0x85, 0x14, 0x12, 0xc8, 0x30, 0xba, 0x34, 0xf2,
+	0x55, 0x50, 0x5b, 0x1a, 0x8b, 0xc2, 0xe5, 0x57, 0x41, 0x75, 0x3c, 0xee, 0x3e, 0x07, 0x73, 0x7d,
+	0x1a, 0xf1, 0x26, 0xfa, 0x48, 0xdd, 0x48, 0xb4, 0x8c, 0x88, 0x5f, 0xc4, 0x40, 0x81, 0x63, 0x61,
+	0xf8, 0xe9, 0x3c, 0x7b, 0xf2, 0x7b, 0x0e, 0xcc, 0x25, 0x79, 0x7e, 0x0f, 0x65, 0xd4, 0x74, 0x59,
+	0xa9, 0x0f, 0x85, 0xfd, 0x1a, 0xb8, 0x7f, 0x27, 0xd7, 0x15, 0xf1, 0x69, 0x72, 0xbd, 0x1f, 0x38,
+	0x43, 0xf7, 0x03, 0xe6, 0x22, 0x7e, 0x8b, 0xd6, 0x7b, 0xed, 0xbe, 0x96, 0x8e, 0x6d, 0x09, 0x47,
+	0x4d, 0x91, 0xf9, 0xf2, 0x44, 0xf9, 0xc8, 0x2f, 0x4f, 0x3c, 0x0b, 0xd3, 0xf6, 0xe5, 0x59, 0x5e,
+	0xdf, 0x92, 0xf5, 0x7c, 0xfb, 0x9e, 0x2d, 0x66, 0xa8, 0x72, 0xdf, 0x2f, 0x18, 0x3f, 0xf2, 0xfb,
+	0x05, 0x4f, 0x43, 0x45, 0x7e, 0x4c, 0x5f, 0xd5, 0x4f, 0x45, 0xbf, 0x88, 0x84, 0xa1, 0xc6, 0x92,
+	0x8b, 0x00, 0x1d, 0x2f, 0xec, 0x79, 0x6d, 0x36, 0x42, 0xb2, 0x01, 0x49, 0x3b, 0xd4, 0x86, 0xc6,
+	0xa0, 0x45, 0xc5, 0x5c, 0x24, 0x7f, 0x71, 0x3c, 0xd3, 0xc6, 0xe4, 0x1c, 0xd9, 0xc6, 0x94, 0x6d,
+	0xb4, 0x29, 0x1d, 0xab, 0xd1, 0xc6, 0xee, 0x81, 0x29, 0xdf, 0xb7, 0x07, 0xe6, 0xfd, 0xe6, 0xe2,
+	0x9a, 0x68, 0x96, 0x99, 0x1a, 0x74, 0x69, 0x8d, 0xb8, 0x30, 0xe1, 0x7b, 0xba, 0x0f, 0x71, 0x5a,
+	0xc4, 0x36, 0x2b, 0xcb, 0x9c, 0x48, 0x62, 0x6a, 0x8b, 0x6f, 0xbd, 0x73, 0xfe, 0xb1, 0xef, 0xbf,
+	0x73, 0xfe, 0xb1, 0xb7, 0xdf, 0x39, 0xff, 0xd8, 0x17, 0xee, 0x9e, 0x77, 0xde, 0xba, 0x7b, 0xde,
+	0xf9, 0xfe, 0xdd, 0xf3, 0xce, 0xdb, 0x77, 0xcf, 0x3b, 0xff, 0x76, 0xf7, 0xbc, 0xf3, 0x3b, 0x3f,
+	0x3c, 0xff, 0xd8, 0xcb, 0x15, 0x65, 0xab, 0xff, 0x17, 0x00, 0x00, 0xff, 0xff, 0x8a, 0x2d, 0xec,
+	0x8d, 0xcd, 0x66, 0x00, 0x00,
 }
 
 func (m *AWSAuthConfig) Marshal() (dAtA []byte, err error) {
@@ -4159,6 +4227,44 @@ func (m *ApplicationWatchEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	return len(dAtA) - i, nil
 }
 
+func (m *Backoff) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalToSizedBuffer(dAtA[:size])
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *Backoff) MarshalTo(dAtA []byte) (int, error) {
+	size := m.Size()
+	return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *Backoff) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+	i := len(dAtA)
+	_ = i
+	var l int
+	_ = l
+	i -= len(m.MaxDuration)
+	copy(dAtA[i:], m.MaxDuration)
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.MaxDuration)))
+	i--
+	dAtA[i] = 0x1a
+	if m.Factor != nil {
+		i = encodeVarintGenerated(dAtA, i, uint64(*m.Factor))
+		i--
+		dAtA[i] = 0x10
+	}
+	i -= len(m.Duration)
+	copy(dAtA[i:], m.Duration)
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Duration)))
+	i--
+	dAtA[i] = 0xa
+	return len(dAtA) - i, nil
+}
+
 func (m *Cluster) Marshal() (dAtA []byte, err error) {
 	size := m.Size()
 	dAtA = make([]byte, size)
@@ -5206,6 +5312,16 @@ func (m *Operation) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	_ = i
 	var l int
 	_ = l
+	{
+		size, err := m.Retry.MarshalToSizedBuffer(dAtA[:i])
+		if err != nil {
+			return 0, err
+		}
+		i -= size
+		i = encodeVarintGenerated(dAtA, i, uint64(size))
+	}
+	i--
+	dAtA[i] = 0x22
 	if len(m.Info) > 0 {
 		for iNdEx := len(m.Info) - 1; iNdEx >= 0; iNdEx-- {
 			{
@@ -5301,6 +5417,9 @@ func (m *OperationState) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	_ = i
 	var l int
 	_ = l
+	i = encodeVarintGenerated(dAtA, i, uint64(m.RetryCount))
+	i--
+	dAtA[i] = 0x40
 	if m.FinishedAt != nil {
 		{
 			size, err := m.FinishedAt.MarshalToSizedBuffer(dAtA[:i])
@@ -6668,6 +6787,44 @@ func (m *ResourceStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	return len(dAtA) - i, nil
 }
 
+func (m *RetryStrategy) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalToSizedBuffer(dAtA[:size])
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *RetryStrategy) MarshalTo(dAtA []byte) (int, error) {
+	size := m.Size()
+	return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *RetryStrategy) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+	i := len(dAtA)
+	_ = i
+	var l int
+	_ = l
+	if m.Backoff != nil {
+		{
+			size, err := m.Backoff.MarshalToSizedBuffer(dAtA[:i])
+			if err != nil {
+				return 0, err
+			}
+			i -= size
+			i = encodeVarintGenerated(dAtA, i, uint64(size))
+		}
+		i--
+		dAtA[i] = 0x12
+	}
+	i = encodeVarintGenerated(dAtA, i, uint64(m.Limit))
+	i--
+	dAtA[i] = 0x8
+	return len(dAtA) - i, nil
+}
+
 func (m *RevisionHistory) Marshal() (dAtA []byte, err error) {
 	size := m.Size()
 	dAtA = make([]byte, size)
@@ -7031,6 +7188,18 @@ func (m *SyncPolicy) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	_ = i
 	var l int
 	_ = l
+	if m.Retry != nil {
+		{
+			size, err := m.Retry.MarshalToSizedBuffer(dAtA[:i])
+			if err != nil {
+				return 0, err
+			}
+			i -= size
+			i = encodeVarintGenerated(dAtA, i, uint64(size))
+		}
+		i--
+		dAtA[i] = 0x1a
+	}
 	if len(m.SyncOptions) > 0 {
 		for iNdEx := len(m.SyncOptions) - 1; iNdEx >= 0; iNdEx-- {
 			i -= len(m.SyncOptions[iNdEx])
@@ -7889,6 +8058,22 @@ func (m *ApplicationWatchEvent) Size() (n int) {
 	return n
 }
 
+func (m *Backoff) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	l = len(m.Duration)
+	n += 1 + l + sovGenerated(uint64(l))
+	if m.Factor != nil {
+		n += 1 + sovGenerated(uint64(*m.Factor))
+	}
+	l = len(m.MaxDuration)
+	n += 1 + l + sovGenerated(uint64(l))
+	return n
+}
+
 func (m *Cluster) Size() (n int) {
 	if m == nil {
 		return 0
@@ -8290,6 +8475,8 @@ func (m *Operation) Size() (n int) {
 			n += 1 + l + sovGenerated(uint64(l))
 		}
 	}
+	l = m.Retry.Size()
+	n += 1 + l + sovGenerated(uint64(l))
 	return n
 }
 
@@ -8327,6 +8514,7 @@ func (m *OperationState) Size() (n int) {
 		l = m.FinishedAt.Size()
 		n += 1 + l + sovGenerated(uint64(l))
 	}
+	n += 1 + sovGenerated(uint64(m.RetryCount))
 	return n
 }
 
@@ -8833,6 +9021,20 @@ func (m *ResourceStatus) Size() (n int) {
 	return n
 }
 
+func (m *RetryStrategy) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	n += 1 + sovGenerated(uint64(m.Limit))
+	if m.Backoff != nil {
+		l = m.Backoff.Size()
+		n += 1 + l + sovGenerated(uint64(l))
+	}
+	return n
+}
+
 func (m *RevisionHistory) Size() (n int) {
 	if m == nil {
 		return 0
@@ -8978,6 +9180,10 @@ func (m *SyncPolicy) Size() (n int) {
 			n += 1 + l + sovGenerated(uint64(l))
 		}
 	}
+	if m.Retry != nil {
+		l = m.Retry.Size()
+		n += 1 + l + sovGenerated(uint64(l))
+	}
 	return n
 }
 
@@ -9509,6 +9715,18 @@ func (this *ApplicationWatchEvent) String() string {
 	}, "")
 	return s
 }
+func (this *Backoff) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&Backoff{`,
+		`Duration:` + fmt.Sprintf("%v", this.Duration) + `,`,
+		`Factor:` + valueToStringGenerated(this.Factor) + `,`,
+		`MaxDuration:` + fmt.Sprintf("%v", this.MaxDuration) + `,`,
+		`}`,
+	}, "")
+	return s
+}
 func (this *Cluster) String() string {
 	if this == nil {
 		return "nil"
@@ -9823,6 +10041,7 @@ func (this *Operation) String() string {
 		`Sync:` + strings.Replace(this.Sync.String(), "SyncOperation", "SyncOperation", 1) + `,`,
 		`InitiatedBy:` + strings.Replace(strings.Replace(this.InitiatedBy.String(), "OperationInitiator", "OperationInitiator", 1), `&`, ``, 1) + `,`,
 		`Info:` + repeatedStringForInfo + `,`,
+		`Retry:` + strings.Replace(strings.Replace(this.Retry.String(), "RetryStrategy", "RetryStrategy", 1), `&`, ``, 1) + `,`,
 		`}`,
 	}, "")
 	return s
@@ -9849,6 +10068,7 @@ func (this *OperationState) String() string {
 		`SyncResult:` + strings.Replace(this.SyncResult.String(), "SyncOperationResult", "SyncOperationResult", 1) + `,`,
 		`StartedAt:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.StartedAt), "Time", "v1.Time", 1), `&`, ``, 1) + `,`,
 		`FinishedAt:` + strings.Replace(fmt.Sprintf("%v", this.FinishedAt), "Time", "v1.Time", 1) + `,`,
+		`RetryCount:` + fmt.Sprintf("%v", this.RetryCount) + `,`,
 		`}`,
 	}, "")
 	return s
@@ -10240,6 +10460,17 @@ func (this *ResourceStatus) String() string {
 	}, "")
 	return s
 }
+func (this *RetryStrategy) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&RetryStrategy{`,
+		`Limit:` + fmt.Sprintf("%v", this.Limit) + `,`,
+		`Backoff:` + strings.Replace(this.Backoff.String(), "Backoff", "Backoff", 1) + `,`,
+		`}`,
+	}, "")
+	return s
+}
 func (this *RevisionHistory) String() string {
 	if this == nil {
 		return "nil"
@@ -10337,6 +10568,7 @@ func (this *SyncPolicy) String() string {
 	s := strings.Join([]string{`&SyncPolicy{`,
 		`Automated:` + strings.Replace(this.Automated.String(), "SyncPolicyAutomated", "SyncPolicyAutomated", 1) + `,`,
 		`SyncOptions:` + fmt.Sprintf("%v", this.SyncOptions) + `,`,
+		`Retry:` + strings.Replace(this.Retry.String(), "RetryStrategy", "RetryStrategy", 1) + `,`,
 		`}`,
 	}, "")
 	return s
@@ -14122,7 +14354,126 @@ func (m *ApplicationSummary) Unmarshal(dAtA []byte) error {
 			if wireType != 2 {
 				return fmt.Errorf("proto: wrong wireType = %d for field Images", wireType)
 			}
-			var stringLen uint64
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Images = append(m.Images, string(dAtA[iNdEx:postIndex]))
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipGenerated(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *ApplicationTree) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowGenerated
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: ApplicationTree: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: ApplicationTree: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Nodes", 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
+			}
+			m.Nodes = append(m.Nodes, ResourceNode{})
+			if err := m.Nodes[len(m.Nodes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field OrphanedNodes", wireType)
+			}
+			var msglen int
 			for shift := uint(0); ; shift += 7 {
 				if shift >= 64 {
 					return ErrIntOverflowGenerated
@@ -14132,23 +14483,25 @@ func (m *ApplicationSummary) Unmarshal(dAtA []byte) error {
 				}
 				b := dAtA[iNdEx]
 				iNdEx++
-				stringLen |= uint64(b&0x7F) << shift
+				msglen |= int(b&0x7F) << shift
 				if b < 0x80 {
 					break
 				}
 			}
-			intStringLen := int(stringLen)
-			if intStringLen < 0 {
+			if msglen < 0 {
 				return ErrInvalidLengthGenerated
 			}
-			postIndex := iNdEx + intStringLen
+			postIndex := iNdEx + msglen
 			if postIndex < 0 {
 				return ErrInvalidLengthGenerated
 			}
 			if postIndex > l {
 				return io.ErrUnexpectedEOF
 			}
-			m.Images = append(m.Images, string(dAtA[iNdEx:postIndex]))
+			m.OrphanedNodes = append(m.OrphanedNodes, ResourceNode{})
+			if err := m.OrphanedNodes[len(m.OrphanedNodes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
 			iNdEx = postIndex
 		default:
 			iNdEx = preIndex
@@ -14174,7 +14527,7 @@ func (m *ApplicationSummary) Unmarshal(dAtA []byte) error {
 	}
 	return nil
 }
-func (m *ApplicationTree) Unmarshal(dAtA []byte) error {
+func (m *ApplicationWatchEvent) Unmarshal(dAtA []byte) error {
 	l := len(dAtA)
 	iNdEx := 0
 	for iNdEx < l {
@@ -14197,17 +14550,17 @@ func (m *ApplicationTree) Unmarshal(dAtA []byte) error {
 		fieldNum := int32(wire >> 3)
 		wireType := int(wire & 0x7)
 		if wireType == 4 {
-			return fmt.Errorf("proto: ApplicationTree: wiretype end group for non-group")
+			return fmt.Errorf("proto: ApplicationWatchEvent: wiretype end group for non-group")
 		}
 		if fieldNum <= 0 {
-			return fmt.Errorf("proto: ApplicationTree: illegal tag %d (wire type %d)", fieldNum, wire)
+			return fmt.Errorf("proto: ApplicationWatchEvent: illegal tag %d (wire type %d)", fieldNum, wire)
 		}
 		switch fieldNum {
 		case 1:
 			if wireType != 2 {
-				return fmt.Errorf("proto: wrong wireType = %d for field Nodes", wireType)
+				return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType)
 			}
-			var msglen int
+			var stringLen uint64
 			for shift := uint(0); ; shift += 7 {
 				if shift >= 64 {
 					return ErrIntOverflowGenerated
@@ -14217,29 +14570,27 @@ func (m *ApplicationTree) Unmarshal(dAtA []byte) error {
 				}
 				b := dAtA[iNdEx]
 				iNdEx++
-				msglen |= int(b&0x7F) << shift
+				stringLen |= uint64(b&0x7F) << shift
 				if b < 0x80 {
 					break
 				}
 			}
-			if msglen < 0 {
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
 				return ErrInvalidLengthGenerated
 			}
-			postIndex := iNdEx + msglen
+			postIndex := iNdEx + intStringLen
 			if postIndex < 0 {
 				return ErrInvalidLengthGenerated
 			}
 			if postIndex > l {
 				return io.ErrUnexpectedEOF
 			}
-			m.Nodes = append(m.Nodes, ResourceNode{})
-			if err := m.Nodes[len(m.Nodes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
-				return err
-			}
+			m.Type = k8s_io_apimachinery_pkg_watch.EventType(dAtA[iNdEx:postIndex])
 			iNdEx = postIndex
 		case 2:
 			if wireType != 2 {
-				return fmt.Errorf("proto: wrong wireType = %d for field OrphanedNodes", wireType)
+				return fmt.Errorf("proto: wrong wireType = %d for field Application", wireType)
 			}
 			var msglen int
 			for shift := uint(0); ; shift += 7 {
@@ -14266,8 +14617,7 @@ func (m *ApplicationTree) Unmarshal(dAtA []byte) error {
 			if postIndex > l {
 				return io.ErrUnexpectedEOF
 			}
-			m.OrphanedNodes = append(m.OrphanedNodes, ResourceNode{})
-			if err := m.OrphanedNodes[len(m.OrphanedNodes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+			if err := m.Application.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
 				return err
 			}
 			iNdEx = postIndex
@@ -14295,7 +14645,7 @@ func (m *ApplicationTree) Unmarshal(dAtA []byte) error {
 	}
 	return nil
 }
-func (m *ApplicationWatchEvent) Unmarshal(dAtA []byte) error {
+func (m *Backoff) Unmarshal(dAtA []byte) error {
 	l := len(dAtA)
 	iNdEx := 0
 	for iNdEx < l {
@@ -14318,15 +14668,15 @@ func (m *ApplicationWatchEvent) Unmarshal(dAtA []byte) error {
 		fieldNum := int32(wire >> 3)
 		wireType := int(wire & 0x7)
 		if wireType == 4 {
-			return fmt.Errorf("proto: ApplicationWatchEvent: wiretype end group for non-group")
+			return fmt.Errorf("proto: Backoff: wiretype end group for non-group")
 		}
 		if fieldNum <= 0 {
-			return fmt.Errorf("proto: ApplicationWatchEvent: illegal tag %d (wire type %d)", fieldNum, wire)
+			return fmt.Errorf("proto: Backoff: illegal tag %d (wire type %d)", fieldNum, wire)
 		}
 		switch fieldNum {
 		case 1:
 			if wireType != 2 {
-				return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType)
+				return fmt.Errorf("proto: wrong wireType = %d for field Duration", wireType)
 			}
 			var stringLen uint64
 			for shift := uint(0); ; shift += 7 {
@@ -14354,13 +14704,33 @@ func (m *ApplicationWatchEvent) Unmarshal(dAtA []byte) error {
 			if postIndex > l {
 				return io.ErrUnexpectedEOF
 			}
-			m.Type = k8s_io_apimachinery_pkg_watch.EventType(dAtA[iNdEx:postIndex])
+			m.Duration = string(dAtA[iNdEx:postIndex])
 			iNdEx = postIndex
 		case 2:
+			if wireType != 0 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Factor", wireType)
+			}
+			var v int64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				v |= int64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			m.Factor = &v
+		case 3:
 			if wireType != 2 {
-				return fmt.Errorf("proto: wrong wireType = %d for field Application", wireType)
+				return fmt.Errorf("proto: wrong wireType = %d for field MaxDuration", wireType)
 			}
-			var msglen int
+			var stringLen uint64
 			for shift := uint(0); ; shift += 7 {
 				if shift >= 64 {
 					return ErrIntOverflowGenerated
@@ -14370,24 +14740,23 @@ func (m *ApplicationWatchEvent) Unmarshal(dAtA []byte) error {
 				}
 				b := dAtA[iNdEx]
 				iNdEx++
-				msglen |= int(b&0x7F) << shift
+				stringLen |= uint64(b&0x7F) << shift
 				if b < 0x80 {
 					break
 				}
 			}
-			if msglen < 0 {
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
 				return ErrInvalidLengthGenerated
 			}
-			postIndex := iNdEx + msglen
+			postIndex := iNdEx + intStringLen
 			if postIndex < 0 {
 				return ErrInvalidLengthGenerated
 			}
 			if postIndex > l {
 				return io.ErrUnexpectedEOF
 			}
-			if err := m.Application.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
-				return err
-			}
+			m.MaxDuration = string(dAtA[iNdEx:postIndex])
 			iNdEx = postIndex
 		default:
 			iNdEx = preIndex
@@ -18005,6 +18374,39 @@ func (m *Operation) Unmarshal(dAtA []byte) error {
 				return err
 			}
 			iNdEx = postIndex
+		case 4:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Retry", 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 err := m.Retry.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
 		default:
 			iNdEx = preIndex
 			skippy, err := skipGenerated(dAtA[iNdEx:])
@@ -18365,6 +18767,25 @@ func (m *OperationState) Unmarshal(dAtA []byte) error {
 				return err
 			}
 			iNdEx = postIndex
+		case 8:
+			if wireType != 0 {
+				return fmt.Errorf("proto: wrong wireType = %d for field RetryCount", wireType)
+			}
+			m.RetryCount = 0
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				m.RetryCount |= int64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
 		default:
 			iNdEx = preIndex
 			skippy, err := skipGenerated(dAtA[iNdEx:])
@@ -23174,6 +23595,114 @@ func (m *ResourceStatus) Unmarshal(dAtA []byte) error {
 	}
 	return nil
 }
+func (m *RetryStrategy) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowGenerated
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: RetryStrategy: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: RetryStrategy: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 0 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType)
+			}
+			m.Limit = 0
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				m.Limit |= int64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Backoff", 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.Backoff == nil {
+				m.Backoff = &Backoff{}
+			}
+			if err := m.Backoff.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipGenerated(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
 func (m *RevisionHistory) Unmarshal(dAtA []byte) error {
 	l := len(dAtA)
 	iNdEx := 0
@@ -24404,6 +24933,42 @@ func (m *SyncPolicy) Unmarshal(dAtA []byte) error {
 			}
 			m.SyncOptions = append(m.SyncOptions, string(dAtA[iNdEx:postIndex]))
 			iNdEx = postIndex
+		case 3:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Retry", 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.Retry == nil {
+				m.Retry = &RetryStrategy{}
+			}
+			if err := m.Retry.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
 		default:
 			iNdEx = preIndex
 			skippy, err := skipGenerated(dAtA[iNdEx:])
diff --git a/pkg/apis/application/v1alpha1/generated.proto b/pkg/apis/application/v1alpha1/generated.proto
index 7647c30e1..f5c28a87d 100644
--- a/pkg/apis/application/v1alpha1/generated.proto
+++ b/pkg/apis/application/v1alpha1/generated.proto
@@ -316,6 +316,18 @@ message ApplicationWatchEvent {
   optional Application application = 2;
 }
 
+// Backoff is a backoff strategy to use within retryStrategy
+message Backoff {
+  // Duration is the amount to back off. Default unit is seconds, but could also be a duration (e.g. "2m", "1h")
+  optional string duration = 1;
+
+  // Factor is a factor to multiply the base duration after each failed retry
+  optional int64 factor = 2;
+
+  // MaxDuration is the maximum amount of time allowed for the backoff strategy
+  optional string maxDuration = 3;
+}
+
 // Cluster is the definition of a cluster resource
 message Cluster {
   // Server is the API server URL of the Kubernetes cluster
@@ -566,6 +578,9 @@ message Operation {
   optional OperationInitiator initiatedBy = 2;
 
   repeated Info info = 3;
+
+  // Retry controls failed sync retry behavior
+  optional RetryStrategy retry = 4;
 }
 
 // OperationInitiator holds information about the operation initiator
@@ -596,6 +611,9 @@ message OperationState {
 
   // FinishedAt contains time of operation completion
   optional k8s.io.apimachinery.pkg.apis.meta.v1.Time finishedAt = 7;
+
+  // RetryCount contains time of operation retries
+  optional int64 retryCount = 8;
 }
 
 message OrphanedResourceKey {
@@ -922,6 +940,14 @@ message ResourceStatus {
   optional bool requiresPruning = 9;
 }
 
+message RetryStrategy {
+  // Limit is the maximum number of attempts when retrying a container
+  optional int64 limit = 1;
+
+  // Backoff is a backoff strategy
+  optional Backoff backoff = 2;
+}
+
 // RevisionHistory contains information relevant to an application deployment
 message RevisionHistory {
   // Revision holds the revision of the sync
@@ -1028,6 +1054,9 @@ message SyncPolicy {
 
   // Options allow you to specify whole app sync-options
   repeated string syncOptions = 2;
+
+  // Retry controls failed sync retry behavior
+  optional RetryStrategy retry = 3;
 }
 
 // SyncPolicyAutomated controls the behavior of an automated sync
diff --git a/pkg/apis/application/v1alpha1/openapi_generated.go b/pkg/apis/application/v1alpha1/openapi_generated.go
index e41a94bdb..ad993c84e 100644
--- a/pkg/apis/application/v1alpha1/openapi_generated.go
+++ b/pkg/apis/application/v1alpha1/openapi_generated.go
@@ -34,6 +34,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
 		"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.ApplicationSummary":               schema_pkg_apis_application_v1alpha1_ApplicationSummary(ref),
 		"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.ApplicationTree":                  schema_pkg_apis_application_v1alpha1_ApplicationTree(ref),
 		"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.ApplicationWatchEvent":            schema_pkg_apis_application_v1alpha1_ApplicationWatchEvent(ref),
+		"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.Backoff":                          schema_pkg_apis_application_v1alpha1_Backoff(ref),
 		"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.Cluster":                          schema_pkg_apis_application_v1alpha1_Cluster(ref),
 		"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.ClusterCacheInfo":                 schema_pkg_apis_application_v1alpha1_ClusterCacheInfo(ref),
 		"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.ClusterConfig":                    schema_pkg_apis_application_v1alpha1_ClusterConfig(ref),
@@ -83,6 +84,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
 		"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.ResourceRef":                      schema_pkg_apis_application_v1alpha1_ResourceRef(ref),
 		"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.ResourceResult":                   schema_pkg_apis_application_v1alpha1_ResourceResult(ref),
 		"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.ResourceStatus":                   schema_pkg_apis_application_v1alpha1_ResourceStatus(ref),
+		"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.RetryStrategy":                    schema_pkg_apis_application_v1alpha1_RetryStrategy(ref),
 		"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.RevisionHistory":                  schema_pkg_apis_application_v1alpha1_RevisionHistory(ref),
 		"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.RevisionMetadata":                 schema_pkg_apis_application_v1alpha1_RevisionMetadata(ref),
 		"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.SignatureKey":                     schema_pkg_apis_application_v1alpha1_SignatureKey(ref),
@@ -1175,6 +1177,40 @@ func schema_pkg_apis_application_v1alpha1_ApplicationWatchEvent(ref common.Refer
 	}
 }
 
+func schema_pkg_apis_application_v1alpha1_Backoff(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "Backoff is a backoff strategy to use within retryStrategy",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"duration": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Duration is the amount to back off. Default unit is seconds, but could also be a duration (e.g. \"2m\", \"1h\")",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"factor": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Factor is a factor to multiply the base duration after each failed retry",
+							Type:        []string{"integer"},
+							Format:      "int64",
+						},
+					},
+					"maxDuration": {
+						SchemaProps: spec.SchemaProps{
+							Description: "MaxDuration is the maximum amount of time allowed for the backoff strategy",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+				},
+			},
+		},
+	}
+}
+
 func schema_pkg_apis_application_v1alpha1_Cluster(ref common.ReferenceCallback) common.OpenAPIDefinition {
 	return common.OpenAPIDefinition{
 		Schema: spec.Schema{
@@ -2021,11 +2057,17 @@ func schema_pkg_apis_application_v1alpha1_Operation(ref common.ReferenceCallback
 							},
 						},
 					},
+					"retry": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Retry controls failed sync retry behavior",
+							Ref:         ref("github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.RetryStrategy"),
+						},
+					},
 				},
 			},
 		},
 		Dependencies: []string{
-			"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.Info", "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.OperationInitiator", "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.SyncOperation"},
+			"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.Info", "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.OperationInitiator", "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.RetryStrategy", "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.SyncOperation"},
 	}
 }
 
@@ -2101,6 +2143,13 @@ func schema_pkg_apis_application_v1alpha1_OperationState(ref common.ReferenceCal
 							Ref:         ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"),
 						},
 					},
+					"retryCount": {
+						SchemaProps: spec.SchemaProps{
+							Description: "RetryCount contains time of operation retries",
+							Type:        []string{"integer"},
+							Format:      "int64",
+						},
+					},
 				},
 				Required: []string{"operation", "phase", "startedAt"},
 			},
@@ -3273,6 +3322,33 @@ func schema_pkg_apis_application_v1alpha1_ResourceStatus(ref common.ReferenceCal
 	}
 }
 
+func schema_pkg_apis_application_v1alpha1_RetryStrategy(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Type: []string{"object"},
+				Properties: map[string]spec.Schema{
+					"limit": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Limit is the maximum number of attempts when retrying a container",
+							Type:        []string{"integer"},
+							Format:      "int64",
+						},
+					},
+					"backoff": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Backoff is a backoff strategy",
+							Ref:         ref("github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.Backoff"),
+						},
+					},
+				},
+			},
+		},
+		Dependencies: []string{
+			"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.Backoff"},
+	}
+}
+
 func schema_pkg_apis_application_v1alpha1_RevisionHistory(ref common.ReferenceCallback) common.OpenAPIDefinition {
 	return common.OpenAPIDefinition{
 		Schema: spec.Schema{
@@ -3594,11 +3670,17 @@ func schema_pkg_apis_application_v1alpha1_SyncPolicy(ref common.ReferenceCallbac
 							},
 						},
 					},
+					"retry": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Retry controls failed sync retry behavior",
+							Ref:         ref("github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.RetryStrategy"),
+						},
+					},
 				},
 			},
 		},
 		Dependencies: []string{
-			"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.SyncPolicyAutomated"},
+			"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.RetryStrategy", "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.SyncPolicyAutomated"},
 	}
 }
 
diff --git a/pkg/apis/application/v1alpha1/types.go b/pkg/apis/application/v1alpha1/types.go
index 900ebe1a0..671c2e254 100644
--- a/pkg/apis/application/v1alpha1/types.go
+++ b/pkg/apis/application/v1alpha1/types.go
@@ -3,6 +3,7 @@ package v1alpha1
 import (
 	"encoding/json"
 	"fmt"
+	math "math"
 	"net"
 	"net/http"
 	"net/url"
@@ -358,7 +359,7 @@ type ApplicationSourceJsonnet struct {
 }
 
 func (j *ApplicationSourceJsonnet) IsZero() bool {
-	return j == nil || len(j.ExtVars) == 0 && len(j.TLAs) == 0
+	return j == nil || len(j.ExtVars) == 0 && len(j.TLAs) == 0 && len(j.Libs) == 0
 }
 
 // ApplicationSourceKsonnet holds ksonnet specific options
@@ -450,6 +451,8 @@ type Operation struct {
 	Sync        *SyncOperation     `json:"sync,omitempty" protobuf:"bytes,1,opt,name=sync"`
 	InitiatedBy OperationInitiator `json:"initiatedBy,omitempty" protobuf:"bytes,2,opt,name=initiatedBy"`
 	Info        []*Info            `json:"info,omitempty" protobuf:"bytes,3,name=info"`
+	// Retry controls failed sync retry behavior
+	Retry RetryStrategy `json:"retry,omitempty" protobuf:"bytes,4,opt,name=retry"`
 }
 
 // SyncOperationResource contains resources to sync.
@@ -523,6 +526,8 @@ type OperationState struct {
 	StartedAt metav1.Time `json:"startedAt" protobuf:"bytes,6,opt,name=startedAt"`
 	// FinishedAt contains time of operation completion
 	FinishedAt *metav1.Time `json:"finishedAt,omitempty" protobuf:"bytes,7,opt,name=finishedAt"`
+	// RetryCount contains time of operation retries
+	RetryCount int64 `json:"retryCount,omitempty" protobuf:"bytes,8,opt,name=retryCount"`
 }
 
 type Info struct {
@@ -565,12 +570,75 @@ type SyncPolicy struct {
 	Automated *SyncPolicyAutomated `json:"automated,omitempty" protobuf:"bytes,1,opt,name=automated"`
 	// Options allow you to specify whole app sync-options
 	SyncOptions SyncOptions `json:"syncOptions,omitempty" protobuf:"bytes,2,opt,name=syncOptions"`
+	// Retry controls failed sync retry behavior
+	Retry *RetryStrategy `json:"retry,omitempty" protobuf:"bytes,3,opt,name=retry"`
 }
 
 func (p *SyncPolicy) IsZero() bool {
 	return p == nil || (p.Automated == nil && len(p.SyncOptions) == 0)
 }
 
+type RetryStrategy struct {
+	// Limit is the maximum number of attempts when retrying a container
+	Limit int64 `json:"limit,omitempty" protobuf:"bytes,1,opt,name=limit"`
+
+	// Backoff is a backoff strategy
+	Backoff *Backoff `json:"backoff,omitempty" protobuf:"bytes,2,opt,name=backoff,casttype=Backoff"`
+}
+
+func parseStringToDuration(durationString string) (time.Duration, error) {
+	var suspendDuration time.Duration
+	// If no units are attached, treat as seconds
+	if val, err := strconv.Atoi(durationString); err == nil {
+		suspendDuration = time.Duration(val) * time.Second
+	} else if duration, err := time.ParseDuration(durationString); err == nil {
+		suspendDuration = duration
+	} else {
+		return 0, fmt.Errorf("unable to parse %s as a duration", durationString)
+	}
+	return suspendDuration, nil
+}
+
+func (r *RetryStrategy) NextRetryAt(lastAttempt time.Time, retryCounts int64) (time.Time, error) {
+	maxDuration := common.DefaultSyncRetryMaxDuration
+	duration := common.DefaultSyncRetryDuration
+	factor := common.DefaultSyncRetryFactor
+	var err error
+	if r.Backoff != nil {
+		if r.Backoff.Duration != "" {
+			if duration, err = parseStringToDuration(r.Backoff.Duration); err != nil {
+				return time.Time{}, err
+			}
+		}
+		if r.Backoff.MaxDuration != "" {
+			if maxDuration, err = parseStringToDuration(r.Backoff.MaxDuration); err != nil {
+				return time.Time{}, err
+			}
+		}
+		if r.Backoff.Factor != nil {
+			factor = *r.Backoff.Factor
+		}
+
+	}
+	// Formula: timeToWait = duration * factor^retry_number
+	// Note that timeToWait should equal to duration for the first retry attempt.
+	timeToWait := duration * time.Duration(math.Pow(float64(factor), float64(retryCounts)))
+	if maxDuration > 0 {
+		timeToWait = time.Duration(math.Min(float64(maxDuration), float64(timeToWait)))
+	}
+	return lastAttempt.Add(timeToWait), nil
+}
+
+// Backoff is a backoff strategy to use within retryStrategy
+type Backoff struct {
+	// Duration is the amount to back off. Default unit is seconds, but could also be a duration (e.g. "2m", "1h")
+	Duration string `json:"duration,omitempty" protobuf:"bytes,1,opt,name=duration"`
+	// Factor is a factor to multiply the base duration after each failed retry
+	Factor *int64 `json:"factor,omitempty" protobuf:"bytes,2,name=factor"`
+	// MaxDuration is the maximum amount of time allowed for the backoff strategy
+	MaxDuration string `json:"maxDuration,omitempty" protobuf:"bytes,3,opt,name=maxDuration"`
+}
+
 // SyncPolicyAutomated controls the behavior of an automated sync
 type SyncPolicyAutomated struct {
 	// Prune will prune resources automatically as part of automated sync (default: false)
diff --git a/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go
index 378d166c8..ef80f407c 100644
--- a/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go
+++ b/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go
@@ -643,6 +643,27 @@ func (in *ApplicationWatchEvent) DeepCopy() *ApplicationWatchEvent {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Backoff) DeepCopyInto(out *Backoff) {
+	*out = *in
+	if in.Factor != nil {
+		in, out := &in.Factor, &out.Factor
+		*out = new(int64)
+		**out = **in
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Backoff.
+func (in *Backoff) DeepCopy() *Backoff {
+	if in == nil {
+		return nil
+	}
+	out := new(Backoff)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *Cluster) DeepCopyInto(out *Cluster) {
 	*out = *in
@@ -1158,6 +1179,7 @@ func (in *Operation) DeepCopyInto(out *Operation) {
 			}
 		}
 	}
+	in.Retry.DeepCopyInto(&out.Retry)
 	return
 }
 
@@ -1765,6 +1787,27 @@ func (in *ResourceStatus) DeepCopy() *ResourceStatus {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *RetryStrategy) DeepCopyInto(out *RetryStrategy) {
+	*out = *in
+	if in.Backoff != nil {
+		in, out := &in.Backoff, &out.Backoff
+		*out = new(Backoff)
+		(*in).DeepCopyInto(*out)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RetryStrategy.
+func (in *RetryStrategy) DeepCopy() *RetryStrategy {
+	if in == nil {
+		return nil
+	}
+	out := new(RetryStrategy)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in RevisionHistories) DeepCopyInto(out *RevisionHistories) {
 	{
@@ -1965,6 +2008,11 @@ func (in *SyncPolicy) DeepCopyInto(out *SyncPolicy) {
 		*out = make(SyncOptions, len(*in))
 		copy(*out, *in)
 	}
+	if in.Retry != nil {
+		in, out := &in.Retry, &out.Retry
+		*out = new(RetryStrategy)
+		(*in).DeepCopyInto(*out)
+	}
 	return
 }
 
diff --git a/server/application/application.go b/server/application/application.go
index 5a592a9ff..6be98ff93 100644
--- a/server/application/application.go
+++ b/server/application/application.go
@@ -1063,9 +1063,15 @@ func (s *Server) Sync(ctx context.Context, syncReq *application.ApplicationSyncR
 	if err != nil {
 		return nil, status.Errorf(codes.FailedPrecondition, err.Error())
 	}
+
+	var retry *appv1.RetryStrategy
 	var syncOptions appv1.SyncOptions
 	if a.Spec.SyncPolicy != nil {
 		syncOptions = a.Spec.SyncPolicy.SyncOptions
+		retry = a.Spec.SyncPolicy.Retry
+	}
+	if syncReq.RetryStrategy != nil {
+		retry = syncReq.RetryStrategy
 	}
 
 	// We cannot use local manifests if we're only allowed to sync to signed commits
@@ -1086,6 +1092,10 @@ func (s *Server) Sync(ctx context.Context, syncReq *application.ApplicationSyncR
 		InitiatedBy: appv1.OperationInitiator{Username: session.Username(ctx)},
 		Info:        syncReq.Infos,
 	}
+	if retry != nil {
+		op.Retry = *retry
+	}
+
 	a, err = argo.SetAppOperation(appIf, *syncReq.Name, &op)
 	if err == nil {
 		partial := ""
diff --git a/server/application/application.proto b/server/application/application.proto
index ba7745ac3..0a4979ad3 100644
--- a/server/application/application.proto
+++ b/server/application/application.proto
@@ -75,6 +75,7 @@ message ApplicationSyncRequest {
 	repeated github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.SyncOperationResource resources = 7 [(gogoproto.nullable) = false];
 	repeated string manifests = 8;
 	repeated github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.Info infos = 9;
+	optional github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.RetryStrategy retryStrategy = 10;
 }
 
 // ApplicationUpdateSpecRequest is a request to update application spec
diff --git a/server/server.go b/server/server.go
index 5d81a95fb..204015fde 100644
--- a/server/server.go
+++ b/server/server.go
@@ -910,6 +910,7 @@ var pathPatters = []*regexp.Regexp{
 	regexp.MustCompile(`/api/v1/repocreds/[^/]+`),
 	regexp.MustCompile(`/api/v1/repositories/[^/]+/apps`),
 	regexp.MustCompile(`/api/v1/repositories/[^/]+/apps/[^/]+`),
+	regexp.MustCompile(`/settings/clusters/[^/]+`),
 }
 
 func (bf *bug21955Workaround) ServeHTTP(w http.ResponseWriter, r *http.Request) {
diff --git a/ui/src/app/applications/components/application-create-panel/application-create-panel.tsx b/ui/src/app/applications/components/application-create-panel/application-create-panel.tsx
index 04c16db50..9602a17fe 100644
--- a/ui/src/app/applications/components/application-create-panel/application-create-panel.tsx
+++ b/ui/src/app/applications/components/application-create-panel/application-create-panel.tsx
@@ -28,6 +28,7 @@ const DEFAULT_APP: Partial<models.Application> = {
     },
     spec: {
         destination: {
+            name: '',
             namespace: '',
             server: ''
         },
@@ -61,13 +62,13 @@ const AutoSyncFormField = ReactFormField((props: {fieldApi: FieldApi; className:
             {automated && (
                 <div className='application-create-panel__sync-params'>
                     <div className='checkbox-container'>
-                        <Checkbox onChange={val => setValue({...automated, prune: val})} checked={automated.prune} id='policyPrune' />
+                        <Checkbox onChange={val => setValue({...automated, prune: val})} checked={!!automated.prune} id='policyPrune' />
                         <label htmlFor='policyPrune'>Prune Resources</label>
                         <HelpIcon title='If checked, Argo will delete resources if they are no longer defined in Git' />
                     </div>
                     <div className='checkbox-container'>
-                        <Checkbox onChange={val => setValue({...automated, selfHeal: val})} checked={automated.selfHeal} id='policySelfHeal' />
-                        <label htmlFor='selfHeal'>Self Heal</label>
+                        <Checkbox onChange={val => setValue({...automated, selfHeal: val})} checked={!!automated.selfHeal} id='policySelfHeal' />
+                        <label htmlFor='policySelfHeal'>Self Heal</label>
                         <HelpIcon title='If checked, Argo will force the state defined in Git into the cluster when a deviation in the cluster is detected' />
                     </div>
                 </div>
diff --git a/ui/src/app/applications/components/application-operation-state/application-operation-state.tsx b/ui/src/app/applications/components/application-operation-state/application-operation-state.tsx
index 73415f14f..f934b628b 100644
--- a/ui/src/app/applications/components/application-operation-state/application-operation-state.tsx
+++ b/ui/src/app/applications/components/application-operation-state/application-operation-state.tsx
@@ -32,7 +32,7 @@ export const ApplicationOperationState: React.StatelessComponent<Props> = ({appl
         }
     ];
 
-    if (operationState.finishedAt) {
+    if (operationState.finishedAt && operationState.phase !== 'Running') {
         operationAttributes.push({title: 'FINISHED AT', value: <Timestamp date={operationState.finishedAt} />});
     } else if (operationState.phase !== 'Terminating') {
         operationAttributes.push({
diff --git a/ui/src/app/applications/components/application-summary/application-summary.tsx b/ui/src/app/applications/components/application-summary/application-summary.tsx
index 3df82b04b..5b7f4d83b 100644
--- a/ui/src/app/applications/components/application-summary/application-summary.tsx
+++ b/ui/src/app/applications/components/application-summary/application-summary.tsx
@@ -28,6 +28,8 @@ function swap(array: any[], a: number, b: number) {
 export const ApplicationSummary = (props: {app: models.Application; updateApp: (app: models.Application) => Promise<any>}) => {
     const app = JSON.parse(JSON.stringify(props.app)) as models.Application;
     const isHelm = app.spec.source.hasOwnProperty('chart');
+    const isDestName = app.spec.destination.server === undefined;
+    const fieldDest = isDestName ? 'spec.destination.name' : 'spec.destination.server';
 
     const attributes = [
         {
@@ -59,18 +61,18 @@ export const ApplicationSummary = (props: {app: models.Application; updateApp: (
         },
         {
             title: 'CLUSTER',
-            view: <Cluster server={app.spec.destination.server} showUrl={true} />,
+            view: <Cluster server={app.spec.destination.server} name={app.spec.destination.name} showUrl={true} />,
             edit: (formApi: FormApi) => (
                 <DataLoader
                     load={() =>
                         services.clusters.list().then(clusters =>
                             clusters.map(cluster => ({
                                 title: clusterTitle(cluster),
-                                value: cluster.server
+                                value: isDestName ? cluster.name : cluster.server
                             }))
                         )
                     }>
-                    {clusters => <FormField formApi={formApi} field='spec.destination.server' componentProps={{options: clusters}} component={FormSelect} />}
+                    {clusters => <FormField formApi={formApi} field={fieldDest} componentProps={{options: clusters}} component={FormSelect} />}
                 </DataLoader>
             )
         },
@@ -126,7 +128,7 @@ export const ApplicationSummary = (props: {app: models.Application; updateApp: (
                                                           items: versions
                                                       }}
                                                   />
-                                                  <RevisionHelpIcon type='helm' />
+                                                  <RevisionHelpIcon type='helm' top='0' />
                                               </div>
                                           )}
                                       </DataLoader>
@@ -143,7 +145,7 @@ export const ApplicationSummary = (props: {app: models.Application; updateApp: (
                       edit: (formApi: FormApi) => (
                           <React.Fragment>
                               <FormField formApi={formApi} field='spec.source.targetRevision' component={Text} componentProps={{placeholder: 'HEAD'}} />
-                              <RevisionHelpIcon type='git' />{' '}
+                              <RevisionHelpIcon type='git' top='0' />{' '}
                           </React.Fragment>
                       )
                   },
@@ -158,23 +160,28 @@ export const ApplicationSummary = (props: {app: models.Application; updateApp: (
             title: 'REVISION HISTORY LIMIT',
             view: app.spec.revisionHistoryLimit,
             edit: (formApi: FormApi) => (
-                <React.Fragment>
+                <div style={{position: 'relative'}}>
                     <FormField formApi={formApi} field='spec.revisionHistoryLimit' component={Text} />
-                    <HelpIcon
-                        title='This limits this number of items kept in the apps revision history.
-This should only be changed in exceptional circumstances.
-Setting to zero will store no history. This will reduce storage used.
-Increasing will increase the space used to store the history, so we do not recommend increasing it.
-Default is 10.
-'
-                    />
-                </React.Fragment>
+                    <div style={{position: 'absolute', right: '0', top: '0'}}>
+                        <HelpIcon
+                            title='This limits this number of items kept in the apps revision history.
+    This should only be changed in exceptional circumstances.
+    Setting to zero will store no history. This will reduce storage used.
+    Increasing will increase the space used to store the history, so we do not recommend increasing it.
+    Default is 10.'
+                        />
+                    </div>
+                </div>
             )
         },
         {
             title: 'SYNC OPTIONS',
             view: ((app.spec.syncPolicy || {}).syncOptions || []).join(', '),
-            edit: (formApi: FormApi) => <FormField formApi={formApi} field='spec.syncPolicy.syncOptions' component={ApplicationSyncOptionsField} />
+            edit: (formApi: FormApi) => (
+                <div>
+                    <FormField formApi={formApi} field='spec.syncPolicy.syncOptions' component={ApplicationSyncOptionsField} />
+                </div>
+            )
         },
         {
             title: 'STATUS',
@@ -326,10 +333,17 @@ Default is 10.
         <div className='application-summary'>
             <EditablePanel
                 save={props.updateApp}
-                validate={input => ({
-                    'spec.project': !input.spec.project && 'Project name is required',
-                    'spec.destination.server': !input.spec.destination.server && 'Cluster is required'
-                })}
+                validate={input =>
+                    isDestName
+                        ? {
+                              'spec.project': !input.spec.project && 'Project name is required',
+                              'spec.destination.name': !input.spec.destination.name && 'Cluster is required'
+                          }
+                        : {
+                              'spec.project': !input.spec.project && 'Project name is required',
+                              'spec.destination.server': !input.spec.destination.server && 'Cluster is required'
+                          }
+                }
                 values={app}
                 title={app.metadata.name.toLocaleUpperCase()}
                 items={attributes}
diff --git a/ui/src/app/applications/components/application-sync-options.tsx b/ui/src/app/applications/components/application-sync-options.tsx
index a3ef5bffc..bb2f405ac 100644
--- a/ui/src/app/applications/components/application-sync-options.tsx
+++ b/ui/src/app/applications/components/application-sync-options.tsx
@@ -31,7 +31,14 @@ function booleanOption(name: string, label: string, defaultVal: boolean, props:
     );
 }
 
-export const ApplicationSyncOptions = (props: ApplicationSyncOptionProps) => <div>{booleanOption('Validate', 'Use a schema to validate resource manifests', true, props)}</div>;
+const optionStyle: React.CSSProperties = {marginTop: '0.5em'};
+
+export const ApplicationSyncOptions = (props: ApplicationSyncOptionProps) => (
+    <React.Fragment>
+        <div style={optionStyle}>{booleanOption('Validate', 'Use a schema to validate resource manifests', true, props)}</div>
+        <div style={optionStyle}>{booleanOption('CreateNamespace', 'Auto-create namespace', false, props)}</div>
+    </React.Fragment>
+);
 
 export const ApplicationSyncOptionsField = ReactForm.FormField((props: {fieldApi: ReactForm.FieldApi}) => {
     const {
diff --git a/ui/src/app/applications/components/applications-list/applications-tiles.tsx b/ui/src/app/applications/components/applications-list/applications-tiles.tsx
index e1a874f8d..cf9f36eff 100644
--- a/ui/src/app/applications/components/applications-list/applications-tiles.tsx
+++ b/ui/src/app/applications/components/applications-list/applications-tiles.tsx
@@ -18,6 +18,13 @@ export interface ApplicationTilesProps {
     deleteApplication: (appName: string) => any;
 }
 
+function getDestination(dest: models.ApplicationDestination) {
+    if (dest.server === undefined) {
+        return dest.name;
+    }
+    return dest.server;
+}
+
 export const ApplicationTiles = ({applications, syncApplication, refreshApplication, deleteApplication}: ApplicationTilesProps) => (
     <Consumer>
         {ctx => (
@@ -102,7 +109,7 @@ export const ApplicationTiles = ({applications, syncApplication, refreshApplicat
                                     )}
                                     <div className='row'>
                                         <div className='columns small-3'>Destination:</div>
-                                        <div className='columns small-9'>{app.spec.destination.server}</div>
+                                        <div className='columns small-9'>{getDestination(app.spec.destination)}</div>
                                     </div>
                                     <div className='row'>
                                         <div className='columns small-3'>Namespace:</div>
diff --git a/ui/src/app/settings/components/cluster-details/cluster-details.tsx b/ui/src/app/settings/components/cluster-details/cluster-details.tsx
index b5c779aa9..ba4da37fc 100644
--- a/ui/src/app/settings/components/cluster-details/cluster-details.tsx
+++ b/ui/src/app/settings/components/cluster-details/cluster-details.tsx
@@ -24,7 +24,7 @@ export const ClusterDetails = (props: RouteComponentProps<{server: string}>) =>
     const loaderRef = React.useRef<DataLoader>();
     const [updating, setUpdating] = React.useState(false);
     return (
-        <DataLoader ref={loaderRef} input={server} load={(url: string) => Observable.interval(1000).flatMap(() => Observable.fromPromise(services.clusters.get(url)))}>
+        <DataLoader ref={loaderRef} input={server} load={(url: string) => Observable.interval(1000).flatMap(() => Observable.fromPromise(services.clusters.get(url, '')))}>
             {(cluster: Cluster) => (
                 <Page
                     title={server}
@@ -55,7 +55,7 @@ export const ClusterDetails = (props: RouteComponentProps<{server: string}>) =>
                         <EditablePanel
                             values={cluster}
                             save={async updated => {
-                                const item = await services.clusters.get(updated.server);
+                                const item = await services.clusters.get(updated.server, '');
                                 item.name = updated.name;
                                 item.namespaces = updated.namespaces;
                                 loaderRef.current.setData(await services.clusters.update(item));
diff --git a/ui/src/app/shared/components/cluster.tsx b/ui/src/app/shared/components/cluster.tsx
index 70a0e977e..c79bfa3da 100644
--- a/ui/src/app/shared/components/cluster.tsx
+++ b/ui/src/app/shared/components/cluster.tsx
@@ -21,13 +21,13 @@ const clusterHTML = (cluster: models.Cluster, showUrl: boolean) => {
     );
 };
 
-async function getCluster(clusters: Promise<models.Cluster[]>, server: string): Promise<models.Cluster> {
+async function getCluster(clusters: Promise<models.Cluster[]>, server: string, name: string): Promise<models.Cluster> {
     let cluster: models.Cluster;
     if (clusters) {
-        cluster = await clusters.then(items => items.find(item => item.server === server));
+        cluster = await clusters.then(items => items.find(item => item.server === server || item.name === name));
     } else {
         try {
-            cluster = await services.clusters.get(server);
+            cluster = await services.clusters.get(server, name);
         } catch {
             cluster = null;
         }
@@ -43,10 +43,10 @@ async function getCluster(clusters: Promise<models.Cluster[]>, server: string):
 
 export const ClusterCtx = React.createContext<Promise<Array<models.Cluster>>>(null);
 
-export const Cluster = (props: {server: string; showUrl?: boolean}) => (
+export const Cluster = (props: {server: string; name?: string; showUrl?: boolean}) => (
     <ClusterCtx.Consumer>
         {clusters => (
-            <DataLoader input={props.server} loadingRenderer={() => <span>{props.server}</span>} load={server => getCluster(clusters, server)}>
+            <DataLoader input={props} loadingRenderer={() => <span>{props.server}</span>} load={input => getCluster(clusters, input.server, input.name)}>
                 {(cluster: models.Cluster) => clusterHTML(cluster, props.showUrl)}
             </DataLoader>
         )}
diff --git a/ui/src/app/shared/components/revision-help-icon.tsx b/ui/src/app/shared/components/revision-help-icon.tsx
index e292766b6..6f7d557d8 100644
--- a/ui/src/app/shared/components/revision-help-icon.tsx
+++ b/ui/src/app/shared/components/revision-help-icon.tsx
@@ -1,5 +1,8 @@
 import {HelpIcon} from 'argo-ui';
 import * as React from 'react';
 
-export const RevisionHelpIcon = ({type}: {type: string}) =>
-    type === 'helm' ? <HelpIcon title='E.g. 1.2.0, 1.2.*, 1.*, or *' /> : <HelpIcon title='E.g. v1.2.0, v1.2, v1, dev, e2e, master, or HEAD' />;
+export const RevisionHelpIcon = ({type, top}: {type: string; top?: string}) => (
+    <div style={{position: 'absolute', top: top === undefined ? '1em' : top, right: '0.5em'}}>
+        {type === 'helm' ? <HelpIcon title='E.g. 1.2.0, 1.2.*, 1.*, or *' /> : <HelpIcon title='E.g. v1.2.0, v1.2, v1, dev, e2e, master, or HEAD' />}
+    </div>
+);
diff --git a/ui/src/app/shared/models.ts b/ui/src/app/shared/models.ts
index 5e5ceda18..2a39459ec 100644
--- a/ui/src/app/shared/models.ts
+++ b/ui/src/app/shared/models.ts
@@ -142,6 +142,10 @@ export interface ApplicationDestination {
      * Namespace overrides the environment namespace value in the ksonnet app.yaml
      */
     namespace: string;
+    /**
+     * Name of the destination cluster which can be used instead of server (url) field
+     */
+    name: string;
 }
 
 export interface OrphanedResource {
diff --git a/ui/src/app/shared/services/clusters-service.ts b/ui/src/app/shared/services/clusters-service.ts
index 7778cf83b..31ab94ccb 100644
--- a/ui/src/app/shared/services/clusters-service.ts
+++ b/ui/src/app/shared/services/clusters-service.ts
@@ -9,8 +9,14 @@ export class ClustersService {
             .then(list => list.items || []);
     }
 
-    public get(url: string): Promise<models.Cluster> {
-        return requests.get(`/clusters/${encodeURIComponent(url)}`).then(res => res.body as models.Cluster);
+    public get(url: string, name: string): Promise<models.Cluster> {
+        let queryName = '';
+        if (url === undefined) {
+            url = '';
+            queryName = `?name=${name}`;
+        }
+        const requestUrl = `/clusters/${encodeURIComponent(url)}` + queryName;
+        return requests.get(requestUrl).then(res => res.body as models.Cluster);
     }
 
     public update(cluster: models.Cluster): Promise<models.Cluster> {
diff --git a/util/db/cluster.go b/util/db/cluster.go
index 2c7a6dea5..200673e10 100644
--- a/util/db/cluster.go
+++ b/util/db/cluster.go
@@ -29,6 +29,7 @@ import (
 
 var (
 	localCluster = appv1.Cluster{
+		Name:            "in-cluster",
 		Server:          common.KubernetesInternalAPIServerAddr,
 		ConnectionState: appv1.ConnectionState{Status: appv1.ConnectionStatusSuccessful},
 	}
diff --git a/util/health/health.go b/util/health/health.go
index 396a10632..c69a5fee4 100644
--- a/util/health/health.go
+++ b/util/health/health.go
@@ -11,7 +11,7 @@ import (
 )
 
 // SetApplicationHealth updates the health statuses of all resources performed in the comparison
-func SetApplicationHealth(resStatuses []appv1.ResourceStatus, liveObjs []*unstructured.Unstructured, resourceOverrides map[string]appv1.ResourceOverride, filter func(obj *unstructured.Unstructured) bool) (*appv1.HealthStatus, error) {
+func SetApplicationHealth(resStatuses []*appv1.ResourceStatus, liveObjs []*unstructured.Unstructured, resourceOverrides map[string]appv1.ResourceOverride, filter func(obj *unstructured.Unstructured) bool) (*appv1.HealthStatus, error) {
 	var savedErr error
 	appHealth := appv1.HealthStatus{Status: health.HealthStatusHealthy}
 	for i, liveObj := range liveObjs {
@@ -43,11 +43,8 @@ func SetApplicationHealth(resStatuses []appv1.ResourceStatus, liveObjs []*unstru
 // health of the application (e.g. hooks, missing child applications)
 func ignoreLiveObjectHealth(liveObj *unstructured.Unstructured, resHealth appv1.HealthStatus) bool {
 	if liveObj != nil {
-		if hookutil.IsHook(liveObj) {
-			// Don't allow resource hooks to affect health status
-			return true
-		}
-		if ignore.Ignore(liveObj) {
+		// Don't allow resource hooks to affect health status
+		if hookutil.IsHook(liveObj) || ignore.Ignore(liveObj) {
 			return true
 		}
 		gvk := liveObj.GroupVersionKind()
diff --git a/util/helm/client.go b/util/helm/client.go
index 8f39bd160..ad8e0ca18 100644
--- a/util/helm/client.go
+++ b/util/helm/client.go
@@ -153,7 +153,7 @@ func (c *nativeHelmChart) ExtractChart(chart string, version *semver.Version) (s
 		_ = os.RemoveAll(tempDir)
 		return "", nil, err
 	}
-	return path.Join(tempDir, chart), io.NewCloser(func() error {
+	return path.Join(tempDir, normalizeChartName(chart)), io.NewCloser(func() error {
 		return os.RemoveAll(tempDir)
 	}), nil
 }
@@ -241,6 +241,17 @@ func newTLSConfig(creds Creds) (*tls.Config, error) {
 	return tlsConfig, nil
 }
 
+// Normalize a chart name for file system use, that is, if chart name is foo/bar/baz, returns the last component as chart name.
+func normalizeChartName(chart string) string {
+	_, nc := path.Split(chart)
+	// We do not want to return the empty string or something else related to filesystem access
+	// Instead, return original string
+	if nc == "" || nc == "." || nc == ".." {
+		return chart
+	}
+	return nc
+}
+
 func (c *nativeHelmChart) getChartPath(chart string, version *semver.Version) string {
-	return path.Join(c.repoPath, fmt.Sprintf("%s-%v.tgz", chart, version))
+	return path.Join(c.repoPath, fmt.Sprintf("%s-%v.tgz", normalizeChartName(chart), version))
 }


Test patch:
diff --git a/controller/appcontroller_test.go b/controller/appcontroller_test.go
index e4e4431ec..68cdae591 100644
--- a/controller/appcontroller_test.go
+++ b/controller/appcontroller_test.go
@@ -1009,3 +1009,91 @@ func TestFinalizeProjectDeletion_DoesNotHaveApplications(t *testing.T) {
 		},
 	}, receivedPatch)
 }
+
+func TestProcessRequestedAppOperation_FailedNoRetries(t *testing.T) {
+	app := newFakeApp()
+	app.Spec.Project = "invalid-project"
+	app.Operation = &argoappv1.Operation{
+		Sync: &argoappv1.SyncOperation{},
+	}
+	ctrl := newFakeController(&fakeData{apps: []runtime.Object{app}})
+	fakeAppCs := ctrl.applicationClientset.(*appclientset.Clientset)
+	receivedPatch := map[string]interface{}{}
+	fakeAppCs.PrependReactor("patch", "*", func(action kubetesting.Action) (handled bool, ret runtime.Object, err error) {
+		if patchAction, ok := action.(kubetesting.PatchAction); ok {
+			assert.NoError(t, json.Unmarshal(patchAction.GetPatch(), &receivedPatch))
+		}
+		return true, nil, nil
+	})
+
+	ctrl.processRequestedAppOperation(app)
+
+	phase, _, _ := unstructured.NestedString(receivedPatch, "status", "operationState", "phase")
+	assert.Equal(t, string(synccommon.OperationError), phase)
+}
+
+func TestProcessRequestedAppOperation_FailedHasRetries(t *testing.T) {
+	app := newFakeApp()
+	app.Spec.Project = "invalid-project"
+	app.Operation = &argoappv1.Operation{
+		Sync:  &argoappv1.SyncOperation{},
+		Retry: argoappv1.RetryStrategy{Limit: 1},
+	}
+	ctrl := newFakeController(&fakeData{apps: []runtime.Object{app}})
+	fakeAppCs := ctrl.applicationClientset.(*appclientset.Clientset)
+	receivedPatch := map[string]interface{}{}
+	fakeAppCs.PrependReactor("patch", "*", func(action kubetesting.Action) (handled bool, ret runtime.Object, err error) {
+		if patchAction, ok := action.(kubetesting.PatchAction); ok {
+			assert.NoError(t, json.Unmarshal(patchAction.GetPatch(), &receivedPatch))
+		}
+		return true, nil, nil
+	})
+
+	ctrl.processRequestedAppOperation(app)
+
+	phase, _, _ := unstructured.NestedString(receivedPatch, "status", "operationState", "phase")
+	assert.Equal(t, string(synccommon.OperationRunning), phase)
+	message, _, _ := unstructured.NestedString(receivedPatch, "status", "operationState", "message")
+	assert.Contains(t, message, "Retrying attempt #1")
+	retryCount, _, _ := unstructured.NestedFloat64(receivedPatch, "status", "operationState", "retryCount")
+	assert.Equal(t, float64(1), retryCount)
+}
+
+func TestProcessRequestedAppOperation_RunningPreviouslyFailed(t *testing.T) {
+	app := newFakeApp()
+	app.Operation = &argoappv1.Operation{
+		Sync:  &argoappv1.SyncOperation{},
+		Retry: argoappv1.RetryStrategy{Limit: 1},
+	}
+	app.Status.OperationState.Phase = synccommon.OperationRunning
+	app.Status.OperationState.SyncResult.Resources = []*argoappv1.ResourceResult{{
+		Name:   "guestbook",
+		Kind:   "Deployment",
+		Group:  "apps",
+		Status: synccommon.ResultCodeSyncFailed,
+	}}
+
+	data := &fakeData{
+		apps: []runtime.Object{app, &defaultProj},
+		manifestResponse: &apiclient.ManifestResponse{
+			Manifests: []string{},
+			Namespace: test.FakeDestNamespace,
+			Server:    test.FakeClusterURL,
+			Revision:  "abc123",
+		},
+	}
+	ctrl := newFakeController(data)
+	fakeAppCs := ctrl.applicationClientset.(*appclientset.Clientset)
+	receivedPatch := map[string]interface{}{}
+	fakeAppCs.PrependReactor("patch", "*", func(action kubetesting.Action) (handled bool, ret runtime.Object, err error) {
+		if patchAction, ok := action.(kubetesting.PatchAction); ok {
+			assert.NoError(t, json.Unmarshal(patchAction.GetPatch(), &receivedPatch))
+		}
+		return true, nil, nil
+	})
+
+	ctrl.processRequestedAppOperation(app)
+
+	phase, _, _ := unstructured.NestedString(receivedPatch, "status", "operationState", "phase")
+	assert.Equal(t, string(synccommon.OperationSucceeded), phase)
+}
diff --git a/controller/state_test.go b/controller/state_test.go
index dd90afb35..5288973b5 100644
--- a/controller/state_test.go
+++ b/controller/state_test.go
@@ -121,6 +121,33 @@ func TestCompareAppStateHook(t *testing.T) {
 	assert.Equal(t, 0, len(app.Status.Conditions))
 }
 
+// TestCompareAppStateSkipHook checks that skipped resources are detected during manifest generation, and not
+// considered as part of resources when assessing Synced status
+func TestCompareAppStateSkipHook(t *testing.T) {
+	pod := NewPod()
+	pod.SetAnnotations(map[string]string{synccommon.AnnotationKeyHook: "Skip"})
+	podBytes, _ := json.Marshal(pod)
+	app := newFakeApp()
+	data := fakeData{
+		apps: []runtime.Object{app},
+		manifestResponse: &apiclient.ManifestResponse{
+			Manifests: []string{string(podBytes)},
+			Namespace: test.FakeDestNamespace,
+			Server:    test.FakeClusterURL,
+			Revision:  "abc123",
+		},
+		managedLiveObjs: make(map[kube.ResourceKey]*unstructured.Unstructured),
+	}
+	ctrl := newFakeController(&data)
+	compRes := ctrl.appStateManager.CompareAppState(app, &defaultProj, "", app.Spec.Source, false, nil)
+	assert.NotNil(t, compRes)
+	assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status)
+	assert.Equal(t, 1, len(compRes.resources))
+	assert.Equal(t, 1, len(compRes.managedResources))
+	assert.Equal(t, 0, len(compRes.reconciliationResult.Hooks))
+	assert.Equal(t, 0, len(app.Status.Conditions))
+}
+
 // checks that ignore resources are detected, but excluded from status
 func TestCompareAppStateCompareOptionIgnoreExtraneous(t *testing.T) {
 	pod := NewPod()
diff --git a/pkg/apis/application/v1alpha1/types_test.go b/pkg/apis/application/v1alpha1/types_test.go
index da3ad2e50..1ab0b6f52 100644
--- a/pkg/apis/application/v1alpha1/types_test.go
+++ b/pkg/apis/application/v1alpha1/types_test.go
@@ -5,6 +5,8 @@ import (
 	"testing"
 	"time"
 
+	"k8s.io/utils/pointer"
+
 	"github.com/argoproj/gitops-engine/pkg/sync/common"
 	"github.com/stretchr/testify/assert"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -1710,3 +1712,45 @@ func TestProjectNormalize(t *testing.T) {
 		assert.ElementsMatch(t, p.Spec.Roles[2].JWTTokens, p.Status.JWTTokensByRole["test-role2"].Items)
 	})
 }
+
+func TestRetryStrategy_NextRetryAtDefaultBackoff(t *testing.T) {
+	retry := RetryStrategy{}
+	now := time.Now()
+	expectedTimes := []time.Time{
+		now.Add(5 * time.Second),
+		now.Add(10 * time.Second),
+		now.Add(20 * time.Second),
+		now.Add(40 * time.Second),
+		now.Add(80 * time.Second),
+	}
+
+	for i, expected := range expectedTimes {
+		retryAt, err := retry.NextRetryAt(now, int64(i))
+		assert.NoError(t, err)
+		assert.Equal(t, expected.Format(time.RFC850), retryAt.Format(time.RFC850))
+	}
+}
+
+func TestRetryStrategy_NextRetryAtCustomBackoff(t *testing.T) {
+	retry := RetryStrategy{
+		Backoff: &Backoff{
+			Duration:    "2s",
+			Factor:      pointer.Int64Ptr(3),
+			MaxDuration: "1m",
+		},
+	}
+	now := time.Now()
+	expectedTimes := []time.Time{
+		now.Add(2 * time.Second),
+		now.Add(6 * time.Second),
+		now.Add(18 * time.Second),
+		now.Add(54 * time.Second),
+		now.Add(60 * time.Second),
+	}
+
+	for i, expected := range expectedTimes {
+		retryAt, err := retry.NextRetryAt(now, int64(i))
+		assert.NoError(t, err)
+		assert.Equal(t, expected.Format(time.RFC850), retryAt.Format(time.RFC850))
+	}
+}
diff --git a/test/e2e/app_autosync_test.go b/test/e2e/app_autosync_test.go
index f8c3ddcbd..fa3c5b556 100644
--- a/test/e2e/app_autosync_test.go
+++ b/test/e2e/app_autosync_test.go
@@ -45,7 +45,10 @@ func TestAutoSyncSelfHealEnabled(t *testing.T) {
 		When().
 		// app should be auto-synced once created
 		CreateFromFile(func(app *Application) {
-			app.Spec.SyncPolicy = &SyncPolicy{Automated: &SyncPolicyAutomated{SelfHeal: true}}
+			app.Spec.SyncPolicy = &SyncPolicy{
+				Automated: &SyncPolicyAutomated{SelfHeal: true},
+				Retry:     &RetryStrategy{Limit: 0},
+			}
 		}).
 		Then().
 		Expect(OperationPhaseIs(OperationSucceeded)).
diff --git a/test/e2e/app_management_test.go b/test/e2e/app_management_test.go
index c88474453..99fd3b5a7 100644
--- a/test/e2e/app_management_test.go
+++ b/test/e2e/app_management_test.go
@@ -1309,3 +1309,61 @@ func TestListResource(t *testing.T) {
 		Expect(SyncStatusIs(SyncStatusCodeSynced)).
 		Expect(NoConditions())
 }
+
+// Given application is set with --sync-option CreateNamespace=true
+//       application --dest-namespace does not exist
+// Verity application --dest-namespace is created
+//        application sync successful
+//        when application is deleted, --dest-namespace is not deleted
+func TestNamespaceAutoCreation(t *testing.T) {
+	updatedNamespace := getNewNamespace(t)
+	defer func() {
+		_, err := Run("", "kubectl", "delete", "namespace", updatedNamespace)
+		assert.NoError(t, err)
+	}()
+	Given(t).
+		Timeout(30).
+		Path("guestbook").
+		When().
+		Create("--sync-option", "CreateNamespace=true").
+		Then().
+		And(func(app *Application) {
+			//Make sure the namespace we are about to update to does not exist
+			_, err := Run("", "kubectl", "get", "namespace", updatedNamespace)
+			assert.Error(t, err)
+			assert.Contains(t, err.Error(), "not found")
+		}).
+		When().
+		AppSet("--dest-namespace", updatedNamespace).
+		Sync().
+		Then().
+		Expect(Success("")).
+		Expect(OperationPhaseIs(OperationSucceeded)).Expect(ResourceHealthWithNamespaceIs("Deployment", "guestbook-ui", updatedNamespace, health.HealthStatusHealthy)).
+		Expect(ResourceHealthWithNamespaceIs("Deployment", "guestbook-ui", updatedNamespace, health.HealthStatusHealthy)).
+		Expect(ResourceSyncStatusWithNamespaceIs("Deployment", "guestbook-ui", updatedNamespace, SyncStatusCodeSynced)).
+		Expect(ResourceSyncStatusWithNamespaceIs("Deployment", "guestbook-ui", updatedNamespace, SyncStatusCodeSynced)).
+		When().
+		Delete(true).
+		Then().
+		Expect(Success("")).
+		And(func(app *Application) {
+			//Verify delete app does not delete the namespace auto created
+			output, err := Run("", "kubectl", "get", "namespace", updatedNamespace)
+			assert.NoError(t, err)
+			assert.Contains(t, output, updatedNamespace)
+		})
+}
+
+func TestFailedSyncWithRetry(t *testing.T) {
+	Given(t).
+		Path(guestbookPath).
+		When().
+		// app should be attempted to auto-synced once and marked with error after failed attempt detected
+		PatchFile("guestbook-ui-deployment.yaml", `[{"op": "replace", "path": "/spec/revisionHistoryLimit", "value": "badValue"}]`).
+		Create().
+		IgnoreErrors().
+		Sync("--retry-limit=1", "--retry-backoff-duration=1s").
+		Then().
+		Expect(OperationPhaseIs(OperationFailed)).
+		Expect(OperationMessageContains("retried 1 times"))
+}
diff --git a/test/e2e/cluster_test.go b/test/e2e/cluster_test.go
index b9a404596..a3475d56a 100644
--- a/test/e2e/cluster_test.go
+++ b/test/e2e/cluster_test.go
@@ -13,14 +13,15 @@ import (
 
 func TestClusterList(t *testing.T) {
 	output := FailOnErr(RunCli("cluster", "list")).(string)
-	assert.Equal(t, fmt.Sprintf(`SERVER                          NAME  VERSION  STATUS      MESSAGE
-https://kubernetes.default.svc        %v     Successful  `, GetVersions().ServerVersion), output)
+	assert.Equal(t, fmt.Sprintf(`SERVER                          NAME        VERSION  STATUS      MESSAGE
+https://kubernetes.default.svc  in-cluster  %v     Successful  `, GetVersions().ServerVersion), output)
 }
 
 func TestClusterGet(t *testing.T) {
 	output := FailOnErr(RunCli("cluster", "get", "https://kubernetes.default.svc")).(string)
 
 	assert.Contains(t, output, fmt.Sprintf(`
+name: in-cluster
 server: https://kubernetes.default.svc
 serverVersion: "%v"`, GetVersions().ServerVersion))
 
diff --git a/test/e2e/fixture/app/expectation.go b/test/e2e/fixture/app/expectation.go
index e04c73416..c5f35495d 100644
--- a/test/e2e/fixture/app/expectation.go
+++ b/test/e2e/fixture/app/expectation.go
@@ -36,6 +36,17 @@ func OperationPhaseIs(expected OperationPhase) Expectation {
 	}
 }
 
+func OperationMessageContains(text string) Expectation {
+	return func(c *Consequences) (state, string) {
+		operationState := c.app().Status.OperationState
+		actual := ""
+		if operationState != nil {
+			actual = operationState.Message
+		}
+		return simple(strings.Contains(actual, text), fmt.Sprintf("operation message should contains '%s', got: '%s'", text, actual))
+	}
+}
+
 func simple(success bool, message string) (state, string) {
 	if success {
 		return succeeded, message
diff --git a/test/e2e/sync_options_test.go b/test/e2e/sync_options_test.go
index 68fcf2819..98350b878 100644
--- a/test/e2e/sync_options_test.go
+++ b/test/e2e/sync_options_test.go
@@ -77,3 +77,27 @@ func TestSyncWithStatusIgnored(t *testing.T) {
 		Then().
 		Expect(SyncStatusIs(SyncStatusCodeSynced))
 }
+
+func TestSyncWithSkipHook(t *testing.T) {
+	Given(t).
+		Path(guestbookPath).
+		When().
+		CreateFromFile(func(app *Application) {
+			app.Spec.SyncPolicy = &SyncPolicy{Automated: &SyncPolicyAutomated{SelfHeal: true}}
+		}).
+		Then().
+		Expect(SyncStatusIs(SyncStatusCodeSynced)).
+		// app should remain synced when app has skipped annotation even if git change detected
+		When().
+		PatchFile("guestbook-ui-deployment.yaml", `[{ "op": "add", "path": "/metadata/annotations", "value": { "argocd.argoproj.io/hook": "Skip" }}]`).
+		PatchFile("guestbook-ui-deployment.yaml", `[{ "op": "replace", "path": "/spec/replicas", "value": 1 }]`).
+		Refresh(RefreshTypeNormal).
+		Then().
+		Expect(SyncStatusIs(SyncStatusCodeSynced)).
+		// app should not remain synced if skipped annotation removed
+		When().
+		PatchFile("guestbook-ui-deployment.yaml", `[{ "op": "remove", "path": "/metadata/annotations" }]`).
+		Refresh(RefreshTypeNormal).
+		Then().
+		Expect(SyncStatusIs(SyncStatusCodeOutOfSync))
+}
diff --git a/util/db/cluster_test.go b/util/db/cluster_test.go
index ff28da2c8..bafb43ca9 100644
--- a/util/db/cluster_test.go
+++ b/util/db/cluster_test.go
@@ -112,7 +112,7 @@ func TestWatchClusters_LocalClusterModifications(t *testing.T) {
 		},
 		func(old *v1alpha1.Cluster, new *v1alpha1.Cluster) {
 			assert.Equal(t, new.Server, common.KubernetesInternalAPIServerAddr)
-			assert.Equal(t, new.Name, "")
+			assert.Equal(t, new.Name, "in-cluster")
 		},
 	})
 }
diff --git a/util/health/health_test.go b/util/health/health_test.go
index 3580c8a83..221793ac3 100644
--- a/util/health/health_test.go
+++ b/util/health/health_test.go
@@ -28,14 +28,14 @@ func TestSetApplicationHealth(t *testing.T) {
 	err = yaml.Unmarshal(yamlBytes, &runningPod)
 	assert.Nil(t, err)
 
-	resources := []appv1.ResourceStatus{
-		{
+	resources := []*appv1.ResourceStatus{
+		&appv1.ResourceStatus{
 			Group:   "",
 			Version: "v1",
 			Kind:    "Pod",
 			Name:    runningPod.GetName(),
 		},
-		{
+		&appv1.ResourceStatus{
 			Group:   "batch",
 			Version: "v1",
 			Kind:    "Job",
@@ -58,7 +58,7 @@ func TestSetApplicationHealth(t *testing.T) {
 }
 
 func TestAppOfAppsHealth(t *testing.T) {
-	newAppLiveObj := func(name string, status health.HealthStatusCode) (*unstructured.Unstructured, appv1.ResourceStatus) {
+	newAppLiveObj := func(name string, status health.HealthStatusCode) (*unstructured.Unstructured, *appv1.ResourceStatus) {
 		app := appv1.Application{
 			ObjectMeta: metav1.ObjectMeta{
 				Name: "foo",
@@ -73,7 +73,7 @@ func TestAppOfAppsHealth(t *testing.T) {
 				},
 			},
 		}
-		resStatus := appv1.ResourceStatus{
+		resStatus := &appv1.ResourceStatus{
 			Group:   "argoproj.io",
 			Version: "v1alpha1",
 			Kind:    "Application",
@@ -89,7 +89,7 @@ func TestAppOfAppsHealth(t *testing.T) {
 
 	// verify missing child app does not affect app health
 	{
-		missingAndHealthyStatuses := []appv1.ResourceStatus{missingStatus, healthyStatus}
+		missingAndHealthyStatuses := []*appv1.ResourceStatus{missingStatus, healthyStatus}
 		missingAndHealthyLiveObjects := []*unstructured.Unstructured{missingApp, healthyApp}
 		healthStatus, err := SetApplicationHealth(missingAndHealthyStatuses, missingAndHealthyLiveObjects, nil, noFilter)
 		assert.NoError(t, err)
@@ -98,7 +98,7 @@ func TestAppOfAppsHealth(t *testing.T) {
 
 	// verify unknown child app does not affect app health
 	{
-		unknownAndHealthyStatuses := []appv1.ResourceStatus{unknownStatus, healthyStatus}
+		unknownAndHealthyStatuses := []*appv1.ResourceStatus{unknownStatus, healthyStatus}
 		unknownAndHealthyLiveObjects := []*unstructured.Unstructured{unknownApp, healthyApp}
 		healthStatus, err := SetApplicationHealth(unknownAndHealthyStatuses, unknownAndHealthyLiveObjects, nil, noFilter)
 		assert.NoError(t, err)
@@ -107,7 +107,7 @@ func TestAppOfAppsHealth(t *testing.T) {
 
 	// verify degraded does affect
 	{
-		degradedAndHealthyStatuses := []appv1.ResourceStatus{degradedStatus, healthyStatus}
+		degradedAndHealthyStatuses := []*appv1.ResourceStatus{degradedStatus, healthyStatus}
 		degradedAndHealthyLiveObjects := []*unstructured.Unstructured{degradedApp, healthyApp}
 		healthStatus, err := SetApplicationHealth(degradedAndHealthyStatuses, degradedAndHealthyLiveObjects, nil, noFilter)
 		assert.NoError(t, err)
diff --git a/util/helm/client_test.go b/util/helm/client_test.go
index 32cb1622e..aacb3f1aa 100644
--- a/util/helm/client_test.go
+++ b/util/helm/client_test.go
@@ -41,3 +41,34 @@ func Test_nativeHelmChart_ExtractChart(t *testing.T) {
 	assert.NoError(t, err)
 	assert.True(t, info.IsDir())
 }
+
+func Test_normalizeChartName(t *testing.T) {
+	t.Run("Test non-slashed name", func(t *testing.T) {
+		n := normalizeChartName("mychart")
+		assert.Equal(t, n, "mychart")
+	})
+	t.Run("Test single-slashed name", func(t *testing.T) {
+		n := normalizeChartName("myorg/mychart")
+		assert.Equal(t, n, "mychart")
+	})
+	t.Run("Test chart name with suborg", func(t *testing.T) {
+		n := normalizeChartName("myorg/mysuborg/mychart")
+		assert.Equal(t, n, "mychart")
+	})
+	t.Run("Test double-slashed name", func(t *testing.T) {
+		n := normalizeChartName("myorg//mychart")
+		assert.Equal(t, n, "mychart")
+	})
+	t.Run("Test invalid chart name - ends with slash", func(t *testing.T) {
+		n := normalizeChartName("myorg/")
+		assert.Equal(t, n, "myorg/")
+	})
+	t.Run("Test invalid chart name - is dot", func(t *testing.T) {
+		n := normalizeChartName("myorg/.")
+		assert.Equal(t, n, "myorg/.")
+	})
+	t.Run("Test invalid chart name - is two dots", func(t *testing.T) {
+		n := normalizeChartName("myorg/..")
+		assert.Equal(t, n, "myorg/..")
+	})
+}