From 65152fe9dea858b24867807f3919059c4dc08782 Mon Sep 17 00:00:00 2001 From: Roman Galeev Date: Sat, 7 Mar 2020 14:31:47 +0100 Subject: [PATCH 01/18] feat: Retry pending nodes --- pkg/apis/workflow/v1alpha1/workflow_types.go | 7 ++++- workflow/controller/operator.go | 28 ++++++++++++++++++-- workflow/controller/workflowpod.go | 3 +++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/pkg/apis/workflow/v1alpha1/workflow_types.go b/pkg/apis/workflow/v1alpha1/workflow_types.go index 1453fae4fda6..5b0178d8f644 100644 --- a/pkg/apis/workflow/v1alpha1/workflow_types.go +++ b/pkg/apis/workflow/v1alpha1/workflow_types.go @@ -987,11 +987,16 @@ func (in *WorkflowStatus) AnyActiveSuspendNode() bool { return in.Nodes.Any(func(node NodeStatus) bool { return node.IsActiveSuspendNode() }) } -// Remove returns whether or not the node has completed execution +// Completed returns whether or not the node has completed execution func (n NodeStatus) Completed() bool { return isCompletedPhase(n.Phase) || n.IsDaemoned() && n.Phase != NodePending } +// Pending returns whether or not the node has completed execution +func (n NodeStatus) Pending() bool { + return n.Phase == NodePending +} + // IsDaemoned returns whether or not the node is deamoned func (n NodeStatus) IsDaemoned() bool { if n.Daemoned == nil || !*n.Daemoned { diff --git a/workflow/controller/operator.go b/workflow/controller/operator.go index 3646f100ac74..559a395d9bf0 100644 --- a/workflow/controller/operator.go +++ b/workflow/controller/operator.go @@ -748,7 +748,7 @@ func (woc *wfOperationCtx) podReconciliation() error { // It is now impossible to infer pod status. The only thing we can do at this point is to mark // the node with Error. for nodeID, node := range woc.wf.Status.Nodes { - if node.Type != wfv1.NodeTypePod || node.Completed() || node.StartedAt.IsZero() { + if node.Type != wfv1.NodeTypePod || node.Completed() || node.StartedAt.IsZero() || node.Pending() { // node is not a pod, it is already complete, or it can be re-run. continue } @@ -1338,6 +1338,16 @@ func (woc *wfOperationCtx) executeTemplate(nodeName string, orgTmpl wfv1.Templat if err != nil { return woc.markNodeError(retryNodeName, err), err } + if lastChildNode != nil && lastChildNode.Pending() && processedTmpl.GetType() == wfv1.TemplateTypeContainer { + _, err := woc.createWorkflowPod(lastChildNode.Name, *processedTmpl.Container, processedTmpl, false) + if apierr.IsForbidden(err) { + return woc.markNodePending(lastChildNode.Name, err), nil + } + if err != nil { + return woc.markNodeError(lastChildNode.Name, err), err + } + return woc.markNodePhase(lastChildNode.Name, wfv1.NodeRunning), nil + } if lastChildNode != nil && !lastChildNode.Completed() { // Last child node is still running. nodeName = lastChildNode.Name @@ -1360,7 +1370,11 @@ func (woc *wfOperationCtx) executeTemplate(nodeName string, orgTmpl wfv1.Templat switch processedTmpl.GetType() { case wfv1.TemplateTypeContainer: - node, err = woc.executeContainer(nodeName, templateScope, processedTmpl, orgTmpl, boundaryID) + if node != nil && node.Pending() { + _, err = woc.createWorkflowPod(node.Name, *processedTmpl.Container, processedTmpl, false) + } else { + node, err = woc.executeContainer(nodeName, templateScope, processedTmpl, orgTmpl, boundaryID) + } case wfv1.TemplateTypeSteps: node, err = woc.executeSteps(nodeName, newTmplCtx, templateScope, processedTmpl, orgTmpl, boundaryID) case wfv1.TemplateTypeScript: @@ -1375,6 +1389,9 @@ func (woc *wfOperationCtx) executeTemplate(nodeName string, orgTmpl wfv1.Templat err = errors.Errorf(errors.CodeBadRequest, "Template '%s' missing specification", processedTmpl.Name) return woc.initializeNode(nodeName, wfv1.NodeTypeSkipped, templateScope, orgTmpl, boundaryID, wfv1.NodeError, err.Error()), err } + if apierr.IsForbidden(err) { + return woc.markNodePending(node.Name, err), nil + } if err != nil { node = woc.markNodeError(node.Name, err) // If retry policy is not set, or if it is not set to Always or OnError, we won't attempt to retry an errored container @@ -1592,6 +1609,13 @@ func (woc *wfOperationCtx) markNodeError(nodeName string, err error) *wfv1.NodeS return woc.markNodePhase(nodeName, wfv1.NodeError, err.Error()) } +// markNodePending is a convenience method to mark a node and set the message from the error +func (woc *wfOperationCtx) markNodePending(nodeName string, err error) *wfv1.NodeStatus { + woc.log.Infof("Mark node %s as Pending, due to: %+v", nodeName, err) + node := woc.getNodeByName(nodeName) + return woc.markNodePhase(nodeName, wfv1.NodePending, fmt.Sprintf("Pending %s", time.Since(node.StartedAt.Time))) +} + // checkParallelism checks if the given template is able to be executed, considering the current active pods and workflow/template parallelism func (woc *wfOperationCtx) checkParallelism(tmpl *wfv1.Template, node *wfv1.NodeStatus, boundaryID string) error { if woc.wf.Spec.Parallelism != nil && woc.activePods >= *woc.wf.Spec.Parallelism { diff --git a/workflow/controller/workflowpod.go b/workflow/controller/workflowpod.go index 12a4771f5b77..5e79eb7c9f33 100644 --- a/workflow/controller/workflowpod.go +++ b/workflow/controller/workflowpod.go @@ -292,6 +292,9 @@ func (woc *wfOperationCtx) createWorkflowPod(nodeName string, mainCtr apiv1.Cont woc.log.Infof("Skipped pod %s (%s) creation: already exists", nodeName, nodeID) return created, nil } + if apierr.IsForbidden(err) { + return nil, err + } woc.log.Infof("Failed to create pod %s (%s): %v", nodeName, nodeID, err) return nil, errors.InternalWrapError(err) } From 76c881795e8e45d9d3ffbba9f0a0c1acc41c4d49 Mon Sep 17 00:00:00 2001 From: Roman Galeev Date: Sun, 8 Mar 2020 20:52:26 +0100 Subject: [PATCH 02/18] Keep container execution logic together --- workflow/controller/operator.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/workflow/controller/operator.go b/workflow/controller/operator.go index 559a395d9bf0..b561ac345ad5 100644 --- a/workflow/controller/operator.go +++ b/workflow/controller/operator.go @@ -1370,11 +1370,7 @@ func (woc *wfOperationCtx) executeTemplate(nodeName string, orgTmpl wfv1.Templat switch processedTmpl.GetType() { case wfv1.TemplateTypeContainer: - if node != nil && node.Pending() { - _, err = woc.createWorkflowPod(node.Name, *processedTmpl.Container, processedTmpl, false) - } else { - node, err = woc.executeContainer(nodeName, templateScope, processedTmpl, orgTmpl, boundaryID) - } + node, err = woc.executeContainer(nodeName, templateScope, processedTmpl, orgTmpl, boundaryID) case wfv1.TemplateTypeSteps: node, err = woc.executeSteps(nodeName, newTmplCtx, templateScope, processedTmpl, orgTmpl, boundaryID) case wfv1.TemplateTypeScript: @@ -1662,6 +1658,10 @@ func (woc *wfOperationCtx) checkParallelism(tmpl *wfv1.Template, node *wfv1.Node func (woc *wfOperationCtx) executeContainer(nodeName string, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) { node := woc.getNodeByName(nodeName) if node != nil { + if node.Pending() { + _, err := woc.createWorkflowPod(node.Name, *tmpl.Container, tmpl, false) + return node, err + } return node, nil } node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, templateScope, tmpl, orgTmpl, boundaryID, wfv1.NodePending) From f5f4cda6c21fdf32843c5e262c263c48f73e9ceb Mon Sep 17 00:00:00 2001 From: Roman Galeev Date: Sun, 8 Mar 2020 23:30:53 +0100 Subject: [PATCH 03/18] Add e2e tests for Pending nodes --- test/e2e/fixtures/when.go | 21 ++++++++++++ test/e2e/functional_test.go | 56 ++++++++++++++++++++++++++++++++ test/e2e/manifests/mysql.yaml | 9 +++++ test/e2e/manifests/no-db.yaml | 9 +++++ test/e2e/manifests/postgres.yaml | 9 +++++ test/util/resourcequota.go | 23 +++++++++++++ 6 files changed, 127 insertions(+) create mode 100644 test/util/resourcequota.go diff --git a/test/e2e/fixtures/when.go b/test/e2e/fixtures/when.go index 9b4012db9f32..4cc862d51cd1 100644 --- a/test/e2e/fixtures/when.go +++ b/test/e2e/fixtures/when.go @@ -9,12 +9,14 @@ import ( "k8s.io/client-go/kubernetes" log "github.com/sirupsen/logrus" + corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" "github.com/argoproj/argo/persist/sqldb" wfv1 "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1" "github.com/argoproj/argo/pkg/client/clientset/versioned/typed/workflow/v1alpha1" + "github.com/argoproj/argo/test/util" "github.com/argoproj/argo/workflow/packer" ) @@ -32,6 +34,7 @@ type When struct { wfTemplateNames []string cronWorkflowName string kubeClient kubernetes.Interface + resourceQuota *corev1.ResourceQuota } func (w *When) SubmitWorkflow() *When { @@ -173,6 +176,24 @@ func (w *When) RunCli(args []string, block func(t *testing.T, output string, err return w } +func (w *When) MemoryQuota(quota string) *When { + obj, err := util.CreateHardMemoryQuota(w.kubeClient, "argo", "memory-quota", quota) + if err != nil { + w.t.Fatal(err) + } + w.resourceQuota = obj + return w +} + +func (w *When) DeleteQuota() *When { + err := util.DeleteQuota(w.kubeClient, w.resourceQuota) + if err != nil { + w.t.Fatal(err) + } + w.resourceQuota = nil + return w +} + func (w *When) Then() *Then { return &Then{ t: w.t, diff --git a/test/e2e/functional_test.go b/test/e2e/functional_test.go index 6debf4dd9365..bd1de90478ce 100644 --- a/test/e2e/functional_test.go +++ b/test/e2e/functional_test.go @@ -1,6 +1,7 @@ package e2e import ( + "regexp" "strings" "testing" "time" @@ -20,6 +21,11 @@ type FunctionalSuite struct { fixtures.E2ESuite } +func (s *FunctionalSuite) TearDownSuite() { + s.E2ESuite.DeleteResources(fixtures.Label) + s.Persistence.Close() +} + func (s *FunctionalSuite) TestContinueOnFail() { s.Given(). Workflow(` @@ -178,6 +184,56 @@ func (s *FunctionalSuite) TestLoopEmptyParam() { }) } +// 128M is for argo executor +func (s *FunctionalSuite) TestPendingWorkflow() { + s.Given(). + Workflow(` +apiVersion: argoproj.io/v1alpha1 +kind: Workflow +metadata: + name: dag-limited-noretry + labels: + argo-e2e: true +spec: + entrypoint: dag + templates: + - name: cowsay + container: + image: cowsay:v1 + command: [sh, -c] + args: ["cowsay a"] + resources: + limits: + memory: 128M + - name: dag + dag: + tasks: + - name: a + template: cowsay + - name: b + template: cowsay +`). + When(). + MemoryQuota("130M"). + SubmitWorkflow(). + WaitForWorkflowToStart(5*time.Second). + WaitForWorkflowCondition(func(wf *wfv1.Workflow) bool { + a := wf.Status.Nodes.FindByDisplayName("a") + b := wf.Status.Nodes.FindByDisplayName("b") + return wfv1.NodePending == a.Phase && + regexp.MustCompile(`^Pending \d+\.\d+s$`).MatchString(a.Message) && + wfv1.NodePending == b.Phase && + regexp.MustCompile(`^Pending \d+\.\d+s$`).MatchString(b.Message) + }, "pods pending", 10*time.Second). + DeleteQuota(). + WaitForWorkflowCondition(func(wf *wfv1.Workflow) bool { + a := wf.Status.Nodes.FindByDisplayName("a") + b := wf.Status.Nodes.FindByDisplayName("b") + return wfv1.NodeSucceeded == a.Phase && wfv1.NodeSucceeded == b.Phase + }, "pods succeeded", 10*time.Second) + s.TearDownSuite() +} + func (s *FunctionalSuite) TestparameterAggregation() { s.Given(). Workflow("@functional/param-aggregation.yaml"). diff --git a/test/e2e/manifests/mysql.yaml b/test/e2e/manifests/mysql.yaml index 01deef096612..777128c24c27 100644 --- a/test/e2e/manifests/mysql.yaml +++ b/test/e2e/manifests/mysql.yaml @@ -267,6 +267,15 @@ subjects: apiVersion: v1 data: config: | + executor: + imagePullPolicy: IfNotPresent + resources: + requests: + cpu: 0.1 + memory: 64Mi + limits: + cpu: 0.5 + memory: 128Mi artifactRepository: archiveLogs: true s3: diff --git a/test/e2e/manifests/no-db.yaml b/test/e2e/manifests/no-db.yaml index c163a0af4ee7..b4e9fb581337 100644 --- a/test/e2e/manifests/no-db.yaml +++ b/test/e2e/manifests/no-db.yaml @@ -267,6 +267,15 @@ subjects: apiVersion: v1 data: config: | + executor: + imagePullPolicy: IfNotPresent + resources: + requests: + cpu: 0.1 + memory: 64Mi + limits: + cpu: 0.5 + memory: 128Mi artifactRepository: archiveLogs: true s3: diff --git a/test/e2e/manifests/postgres.yaml b/test/e2e/manifests/postgres.yaml index fd7ce5ddff2d..0cd334a43dbf 100644 --- a/test/e2e/manifests/postgres.yaml +++ b/test/e2e/manifests/postgres.yaml @@ -267,6 +267,15 @@ subjects: apiVersion: v1 data: config: | + executor: + imagePullPolicy: IfNotPresent + resources: + requests: + cpu: 0.1 + memory: 64Mi + limits: + cpu: 0.5 + memory: 128Mi artifactRepository: archiveLogs: true s3: diff --git a/test/util/resourcequota.go b/test/util/resourcequota.go new file mode 100644 index 000000000000..a65b26ca2f6a --- /dev/null +++ b/test/util/resourcequota.go @@ -0,0 +1,23 @@ +package util + +import ( + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" +) + +func CreateHardMemoryQuota(clientset kubernetes.Interface, namespace, name, memoryLimit string) (*corev1.ResourceQuota, error) { + return clientset.CoreV1().ResourceQuotas(namespace).Create(&corev1.ResourceQuota{ + ObjectMeta: metav1.ObjectMeta{Name: name}, + Spec: corev1.ResourceQuotaSpec{ + Hard: corev1.ResourceList{ + corev1.ResourceLimitsMemory: resource.MustParse(memoryLimit), + }, + }, + }) +} + +func DeleteQuota(clientset kubernetes.Interface, quota *corev1.ResourceQuota) error { + return clientset.CoreV1().ResourceQuotas(quota.Namespace).Delete(quota.Name, &metav1.DeleteOptions{}) +} From 0ced253492d1c59dab708b6d94819eff69c0fb1d Mon Sep 17 00:00:00 2001 From: Roman Galeev Date: Sun, 8 Mar 2020 23:43:25 +0100 Subject: [PATCH 04/18] Add e2e tests for Pending nodes with retryStrategy --- test/e2e/functional_test.go | 51 +++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/test/e2e/functional_test.go b/test/e2e/functional_test.go index bd1de90478ce..2638dbda64b2 100644 --- a/test/e2e/functional_test.go +++ b/test/e2e/functional_test.go @@ -234,6 +234,57 @@ spec: s.TearDownSuite() } +func (s *FunctionalSuite) TestPendingRetryWorkflow() { + s.Given(). + Workflow(` +apiVersion: argoproj.io/v1alpha1 +kind: Workflow +metadata: + name: dag-limited + labels: + argo-e2e: true +spec: + entrypoint: dag + templates: + - name: cowsay + retryStrategy: + limit: 1 + container: + image: cowsay:v1 + command: [sh, -c] + args: ["cowsay a"] + resources: + limits: + memory: 128M + - name: dag + dag: + tasks: + - name: a + template: cowsay + - name: b + template: cowsay +`). + When(). + MemoryQuota("130M"). + SubmitWorkflow(). + WaitForWorkflowToStart(5*time.Second). + WaitForWorkflowCondition(func(wf *wfv1.Workflow) bool { + a := wf.Status.Nodes.FindByDisplayName("a(0)") + b := wf.Status.Nodes.FindByDisplayName("b(0)") + return wfv1.NodePending == a.Phase && + regexp.MustCompile(`^Pending \d+\.\d+s$`).MatchString(a.Message) && + wfv1.NodePending == b.Phase && + regexp.MustCompile(`^Pending \d+\.\d+s$`).MatchString(b.Message) + }, "pods pending", 10*time.Second). + DeleteQuota(). + WaitForWorkflowCondition(func(wf *wfv1.Workflow) bool { + a := wf.Status.Nodes.FindByDisplayName("a(0)") + b := wf.Status.Nodes.FindByDisplayName("b(0)") + return wfv1.NodeSucceeded == a.Phase && wfv1.NodeSucceeded == b.Phase + }, "pods succeeded", 10*time.Second) + s.TearDownSuite() +} + func (s *FunctionalSuite) TestparameterAggregation() { s.Given(). Workflow("@functional/param-aggregation.yaml"). From dae6e8573f1aace5a7d9207cd44da1d08304df57 Mon Sep 17 00:00:00 2001 From: Roman Galeev Date: Tue, 10 Mar 2020 21:26:36 +0100 Subject: [PATCH 05/18] Change manifest generation --- .../mysql/overlays/workflow-controller-configmap.yaml | 9 +++++++++ .../no-db/overlays/workflow-controller-configmap.yaml | 9 +++++++++ .../postgres/overlays/workflow-controller-configmap.yaml | 9 +++++++++ 3 files changed, 27 insertions(+) diff --git a/manifests/quick-start/mysql/overlays/workflow-controller-configmap.yaml b/manifests/quick-start/mysql/overlays/workflow-controller-configmap.yaml index 18bfaaee52f1..3bc6fbb987a3 100644 --- a/manifests/quick-start/mysql/overlays/workflow-controller-configmap.yaml +++ b/manifests/quick-start/mysql/overlays/workflow-controller-configmap.yaml @@ -1,6 +1,15 @@ apiVersion: v1 data: config: | + executor: + imagePullPolicy: IfNotPresent + resources: + requests: + cpu: 0.1 + memory: 64Mi + limits: + cpu: 0.5 + memory: 128Mi artifactRepository: archiveLogs: true s3: diff --git a/manifests/quick-start/no-db/overlays/workflow-controller-configmap.yaml b/manifests/quick-start/no-db/overlays/workflow-controller-configmap.yaml index e0cb4679606e..1ac55502e03b 100644 --- a/manifests/quick-start/no-db/overlays/workflow-controller-configmap.yaml +++ b/manifests/quick-start/no-db/overlays/workflow-controller-configmap.yaml @@ -1,6 +1,15 @@ apiVersion: v1 data: config: | + executor: + imagePullPolicy: IfNotPresent + resources: + requests: + cpu: 0.1 + memory: 64Mi + limits: + cpu: 0.5 + memory: 128Mi artifactRepository: archiveLogs: true s3: diff --git a/manifests/quick-start/postgres/overlays/workflow-controller-configmap.yaml b/manifests/quick-start/postgres/overlays/workflow-controller-configmap.yaml index 345f33cffd82..1bae8703148d 100644 --- a/manifests/quick-start/postgres/overlays/workflow-controller-configmap.yaml +++ b/manifests/quick-start/postgres/overlays/workflow-controller-configmap.yaml @@ -1,6 +1,15 @@ apiVersion: v1 data: config: | + executor: + imagePullPolicy: IfNotPresent + resources: + requests: + cpu: 0.1 + memory: 64Mi + limits: + cpu: 0.5 + memory: 128Mi artifactRepository: archiveLogs: true s3: From 605d15ba5377c3d6951b948caf03d108627b647a Mon Sep 17 00:00:00 2001 From: Roman Galeev Date: Tue, 10 Mar 2020 21:34:06 +0100 Subject: [PATCH 06/18] Fix function description to reflect action --- pkg/apis/workflow/v1alpha1/workflow_types.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/apis/workflow/v1alpha1/workflow_types.go b/pkg/apis/workflow/v1alpha1/workflow_types.go index 5b0178d8f644..d9d45f2bc1fd 100644 --- a/pkg/apis/workflow/v1alpha1/workflow_types.go +++ b/pkg/apis/workflow/v1alpha1/workflow_types.go @@ -992,7 +992,7 @@ func (n NodeStatus) Completed() bool { return isCompletedPhase(n.Phase) || n.IsDaemoned() && n.Phase != NodePending } -// Pending returns whether or not the node has completed execution +// Pending returns whether or not the node is in pending state func (n NodeStatus) Pending() bool { return n.Phase == NodePending } From b70952cf79bddf36b8b615e833a217d2ebf191bd Mon Sep 17 00:00:00 2001 From: Roman Galeev Date: Tue, 10 Mar 2020 21:35:46 +0100 Subject: [PATCH 07/18] Add safety check --- test/util/resourcequota.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/util/resourcequota.go b/test/util/resourcequota.go index a65b26ca2f6a..2314cff6b86c 100644 --- a/test/util/resourcequota.go +++ b/test/util/resourcequota.go @@ -19,5 +19,8 @@ func CreateHardMemoryQuota(clientset kubernetes.Interface, namespace, name, memo } func DeleteQuota(clientset kubernetes.Interface, quota *corev1.ResourceQuota) error { + if quota == nil { + return nil + } return clientset.CoreV1().ResourceQuotas(quota.Namespace).Delete(quota.Name, &metav1.DeleteOptions{}) } From f300c59a746a9caf48e4a142a4dbd92b3e1a52a8 Mon Sep 17 00:00:00 2001 From: Roman Galeev Date: Wed, 11 Mar 2020 23:29:30 +0100 Subject: [PATCH 08/18] Bug fix: state should be set to retryNode (as per pr notes) --- workflow/controller/operator.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workflow/controller/operator.go b/workflow/controller/operator.go index b561ac345ad5..c2d22bd831e1 100644 --- a/workflow/controller/operator.go +++ b/workflow/controller/operator.go @@ -1341,12 +1341,12 @@ func (woc *wfOperationCtx) executeTemplate(nodeName string, orgTmpl wfv1.Templat if lastChildNode != nil && lastChildNode.Pending() && processedTmpl.GetType() == wfv1.TemplateTypeContainer { _, err := woc.createWorkflowPod(lastChildNode.Name, *processedTmpl.Container, processedTmpl, false) if apierr.IsForbidden(err) { - return woc.markNodePending(lastChildNode.Name, err), nil + return woc.markNodePending(retryParentNode.Name, err), nil } if err != nil { - return woc.markNodeError(lastChildNode.Name, err), err + return woc.markNodeError(retryParentNode.Name, err), err } - return woc.markNodePhase(lastChildNode.Name, wfv1.NodeRunning), nil + return woc.markNodePhase(retryParentNode.Name, wfv1.NodeRunning), nil } if lastChildNode != nil && !lastChildNode.Completed() { // Last child node is still running. From 1d61685a28866778144c27755547233b9d6b600f Mon Sep 17 00:00:00 2001 From: Roman Galeev Date: Thu, 12 Mar 2020 23:38:36 +0100 Subject: [PATCH 09/18] Add Resubmit option and fix retryNode returns (as per pr notes) --- pkg/apis/workflow/v1alpha1/workflow_types.go | 3 ++ workflow/controller/operator.go | 30 ++++++++++++++++---- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/pkg/apis/workflow/v1alpha1/workflow_types.go b/pkg/apis/workflow/v1alpha1/workflow_types.go index d9d45f2bc1fd..3249a971fea6 100644 --- a/pkg/apis/workflow/v1alpha1/workflow_types.go +++ b/pkg/apis/workflow/v1alpha1/workflow_types.go @@ -870,6 +870,9 @@ type RetryStrategy struct { // Limit is the maximum number of attempts when retrying a container Limit *int32 `json:"limit,omitempty" protobuf:"varint,1,opt,name=limit"` + // Resubmit is set to enable Pending pod resubmission + Resubmit *bool `json:"resubmit,omitempty" protobuf:"varint,1,opt,name=resubmit"` + // RetryPolicy is a policy of NodePhase statuses that will be retried RetryPolicy RetryPolicy `json:"retryPolicy,omitempty" protobuf:"bytes,2,opt,name=retryPolicy,casttype=RetryPolicy"` diff --git a/workflow/controller/operator.go b/workflow/controller/operator.go index c2d22bd831e1..0c8f3ede9412 100644 --- a/workflow/controller/operator.go +++ b/workflow/controller/operator.go @@ -1255,6 +1255,19 @@ func (woc *wfOperationCtx) getFirstChildNode(node *wfv1.NodeStatus) (*wfv1.NodeS return &firstChildNode, nil } +func isResubmitAllowed(tmpl *wfv1.Template) bool { + if tmpl == nil { + return false + } + if tmpl.RetryStrategy == nil { + return false + } + if tmpl.RetryStrategy.Resubmit == nil { + return false + } + return *tmpl.RetryStrategy.Resubmit +} + // executeTemplate executes the template with the given arguments and returns the created NodeStatus // for the created node (if created). Nodes may not be created if parallelism or deadline exceeded. // nodeName is the name to be used as the name of the node, and boundaryID indicates which template @@ -1341,12 +1354,15 @@ func (woc *wfOperationCtx) executeTemplate(nodeName string, orgTmpl wfv1.Templat if lastChildNode != nil && lastChildNode.Pending() && processedTmpl.GetType() == wfv1.TemplateTypeContainer { _, err := woc.createWorkflowPod(lastChildNode.Name, *processedTmpl.Container, processedTmpl, false) if apierr.IsForbidden(err) { - return woc.markNodePending(retryParentNode.Name, err), nil + woc.markNodePending(lastChildNode.Name, err) + return retryParentNode, nil } if err != nil { - return woc.markNodeError(retryParentNode.Name, err), err + woc.markNodePending(lastChildNode.Name, err) + return retryParentNode, nil } - return woc.markNodePhase(retryParentNode.Name, wfv1.NodeRunning), nil + woc.markNodePhase(lastChildNode.Name, wfv1.NodeRunning) + return retryParentNode, nil } if lastChildNode != nil && !lastChildNode.Completed() { // Last child node is still running. @@ -1385,8 +1401,12 @@ func (woc *wfOperationCtx) executeTemplate(nodeName string, orgTmpl wfv1.Templat err = errors.Errorf(errors.CodeBadRequest, "Template '%s' missing specification", processedTmpl.Name) return woc.initializeNode(nodeName, wfv1.NodeTypeSkipped, templateScope, orgTmpl, boundaryID, wfv1.NodeError, err.Error()), err } - if apierr.IsForbidden(err) { - return woc.markNodePending(node.Name, err), nil + if isResubmitAllowed(processedTmpl) { + if apierr.IsForbidden(err) { + return woc.markNodePending(node.Name, err), nil + } + } else { + return nil, errors.InternalWrapError(err) } if err != nil { node = woc.markNodeError(node.Name, err) From 3a34919ca10970102e91aaf2bf0c3dd1536d12ef Mon Sep 17 00:00:00 2001 From: Roman Galeev Date: Thu, 12 Mar 2020 23:39:43 +0100 Subject: [PATCH 10/18] Increase test duration (it fails from time to time) --- test/e2e/functional_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/e2e/functional_test.go b/test/e2e/functional_test.go index 2638dbda64b2..f657ebbbae2e 100644 --- a/test/e2e/functional_test.go +++ b/test/e2e/functional_test.go @@ -224,13 +224,13 @@ spec: regexp.MustCompile(`^Pending \d+\.\d+s$`).MatchString(a.Message) && wfv1.NodePending == b.Phase && regexp.MustCompile(`^Pending \d+\.\d+s$`).MatchString(b.Message) - }, "pods pending", 10*time.Second). + }, "pods pending", 20*time.Second). DeleteQuota(). WaitForWorkflowCondition(func(wf *wfv1.Workflow) bool { a := wf.Status.Nodes.FindByDisplayName("a") b := wf.Status.Nodes.FindByDisplayName("b") return wfv1.NodeSucceeded == a.Phase && wfv1.NodeSucceeded == b.Phase - }, "pods succeeded", 10*time.Second) + }, "pods succeeded", 20*time.Second) s.TearDownSuite() } @@ -275,13 +275,13 @@ spec: regexp.MustCompile(`^Pending \d+\.\d+s$`).MatchString(a.Message) && wfv1.NodePending == b.Phase && regexp.MustCompile(`^Pending \d+\.\d+s$`).MatchString(b.Message) - }, "pods pending", 10*time.Second). + }, "pods pending", 20*time.Second). DeleteQuota(). WaitForWorkflowCondition(func(wf *wfv1.Workflow) bool { a := wf.Status.Nodes.FindByDisplayName("a(0)") b := wf.Status.Nodes.FindByDisplayName("b(0)") return wfv1.NodeSucceeded == a.Phase && wfv1.NodeSucceeded == b.Phase - }, "pods succeeded", 10*time.Second) + }, "pods succeeded", 20*time.Second) s.TearDownSuite() } From 56c03fdc034358b5f991e0e6c0d873ecd27d2952 Mon Sep 17 00:00:00 2001 From: Roman Galeev Date: Fri, 13 Mar 2020 00:32:23 +0100 Subject: [PATCH 11/18] Bug fix and make it work --- pkg/apis/workflow/v1alpha1/workflow_types.go | 6 +++--- workflow/controller/operator.go | 10 ++++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/pkg/apis/workflow/v1alpha1/workflow_types.go b/pkg/apis/workflow/v1alpha1/workflow_types.go index 3249a971fea6..a070cb9d8eb9 100644 --- a/pkg/apis/workflow/v1alpha1/workflow_types.go +++ b/pkg/apis/workflow/v1alpha1/workflow_types.go @@ -870,14 +870,14 @@ type RetryStrategy struct { // Limit is the maximum number of attempts when retrying a container Limit *int32 `json:"limit,omitempty" protobuf:"varint,1,opt,name=limit"` - // Resubmit is set to enable Pending pod resubmission - Resubmit *bool `json:"resubmit,omitempty" protobuf:"varint,1,opt,name=resubmit"` - // RetryPolicy is a policy of NodePhase statuses that will be retried RetryPolicy RetryPolicy `json:"retryPolicy,omitempty" protobuf:"bytes,2,opt,name=retryPolicy,casttype=RetryPolicy"` // Backoff is a backoff strategy Backoff *Backoff `json:"backoff,omitempty" protobuf:"bytes,3,opt,name=backoff,casttype=Backoff"` + + // Resubmit is set to enable Pending pod resubmission + Resubmit *bool `json:"resubmit,omitempty" protobuf:"varint,4,opt,name=resubmit"` } // NodeStatus contains status information about an individual node in the workflow diff --git a/workflow/controller/operator.go b/workflow/controller/operator.go index 0c8f3ede9412..44848e6765ae 100644 --- a/workflow/controller/operator.go +++ b/workflow/controller/operator.go @@ -1262,6 +1262,7 @@ func isResubmitAllowed(tmpl *wfv1.Template) bool { if tmpl.RetryStrategy == nil { return false } + fmt.Printf("FLAG: %v", *tmpl.RetryStrategy.Resubmit) if tmpl.RetryStrategy.Resubmit == nil { return false } @@ -1401,13 +1402,14 @@ func (woc *wfOperationCtx) executeTemplate(nodeName string, orgTmpl wfv1.Templat err = errors.Errorf(errors.CodeBadRequest, "Template '%s' missing specification", processedTmpl.Name) return woc.initializeNode(nodeName, wfv1.NodeTypeSkipped, templateScope, orgTmpl, boundaryID, wfv1.NodeError, err.Error()), err } - if isResubmitAllowed(processedTmpl) { - if apierr.IsForbidden(err) { + if apierr.IsForbidden(err) { + if isResubmitAllowed(processedTmpl) { return woc.markNodePending(node.Name, err), nil + } else { + return nil, errors.InternalWrapError(err) } - } else { - return nil, errors.InternalWrapError(err) } + if err != nil { node = woc.markNodeError(node.Name, err) // If retry policy is not set, or if it is not set to Always or OnError, we won't attempt to retry an errored container From 6eea75a76c9e36baa8749991e771b3a7b3eabdfd Mon Sep 17 00:00:00 2001 From: Roman Galeev Date: Fri, 13 Mar 2020 00:32:46 +0100 Subject: [PATCH 12/18] Add label to quota and fix tests --- test/e2e/functional_test.go | 50 +------------------------------------ test/util/resourcequota.go | 5 +++- 2 files changed, 5 insertions(+), 50 deletions(-) diff --git a/test/e2e/functional_test.go b/test/e2e/functional_test.go index f657ebbbae2e..b0b953854956 100644 --- a/test/e2e/functional_test.go +++ b/test/e2e/functional_test.go @@ -185,55 +185,6 @@ func (s *FunctionalSuite) TestLoopEmptyParam() { } // 128M is for argo executor -func (s *FunctionalSuite) TestPendingWorkflow() { - s.Given(). - Workflow(` -apiVersion: argoproj.io/v1alpha1 -kind: Workflow -metadata: - name: dag-limited-noretry - labels: - argo-e2e: true -spec: - entrypoint: dag - templates: - - name: cowsay - container: - image: cowsay:v1 - command: [sh, -c] - args: ["cowsay a"] - resources: - limits: - memory: 128M - - name: dag - dag: - tasks: - - name: a - template: cowsay - - name: b - template: cowsay -`). - When(). - MemoryQuota("130M"). - SubmitWorkflow(). - WaitForWorkflowToStart(5*time.Second). - WaitForWorkflowCondition(func(wf *wfv1.Workflow) bool { - a := wf.Status.Nodes.FindByDisplayName("a") - b := wf.Status.Nodes.FindByDisplayName("b") - return wfv1.NodePending == a.Phase && - regexp.MustCompile(`^Pending \d+\.\d+s$`).MatchString(a.Message) && - wfv1.NodePending == b.Phase && - regexp.MustCompile(`^Pending \d+\.\d+s$`).MatchString(b.Message) - }, "pods pending", 20*time.Second). - DeleteQuota(). - WaitForWorkflowCondition(func(wf *wfv1.Workflow) bool { - a := wf.Status.Nodes.FindByDisplayName("a") - b := wf.Status.Nodes.FindByDisplayName("b") - return wfv1.NodeSucceeded == a.Phase && wfv1.NodeSucceeded == b.Phase - }, "pods succeeded", 20*time.Second) - s.TearDownSuite() -} - func (s *FunctionalSuite) TestPendingRetryWorkflow() { s.Given(). Workflow(` @@ -249,6 +200,7 @@ spec: - name: cowsay retryStrategy: limit: 1 + resubmit: true container: image: cowsay:v1 command: [sh, -c] diff --git a/test/util/resourcequota.go b/test/util/resourcequota.go index 2314cff6b86c..e6343ddf0d46 100644 --- a/test/util/resourcequota.go +++ b/test/util/resourcequota.go @@ -9,7 +9,10 @@ import ( func CreateHardMemoryQuota(clientset kubernetes.Interface, namespace, name, memoryLimit string) (*corev1.ResourceQuota, error) { return clientset.CoreV1().ResourceQuotas(namespace).Create(&corev1.ResourceQuota{ - ObjectMeta: metav1.ObjectMeta{Name: name}, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Labels: map[string]string{"argo-e2e": "true"}, + }, Spec: corev1.ResourceQuotaSpec{ Hard: corev1.ResourceList{ corev1.ResourceLimitsMemory: resource.MustParse(memoryLimit), From 1421796c37eb27deddaf0ca183506902aaa5660c Mon Sep 17 00:00:00 2001 From: Roman Galeev Date: Fri, 13 Mar 2020 00:33:17 +0100 Subject: [PATCH 13/18] Add generated code --- api/openapi-spec/swagger.json | 5 +++++ pkg/apiclient/cronworkflow/cron-workflow.swagger.json | 5 +++++ pkg/apiclient/workflow/workflow.swagger.json | 5 +++++ pkg/apiclient/workflowarchive/workflow-archive.swagger.json | 5 +++++ .../workflowtemplate/workflow-template.swagger.json | 5 +++++ 5 files changed, 25 insertions(+) diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index f71e36531344..67bc62a55dbd 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -2208,6 +2208,11 @@ "format": "int32", "title": "Limit is the maximum number of attempts when retrying a container" }, + "resubmit": { + "type": "boolean", + "format": "boolean", + "title": "Resubmit is set to enable Pending pod resubmission" + }, "retryPolicy": { "type": "string", "title": "RetryPolicy is a policy of NodePhase statuses that will be retried" diff --git a/pkg/apiclient/cronworkflow/cron-workflow.swagger.json b/pkg/apiclient/cronworkflow/cron-workflow.swagger.json index cd8fbbc275ff..ff79afec866e 100644 --- a/pkg/apiclient/cronworkflow/cron-workflow.swagger.json +++ b/pkg/apiclient/cronworkflow/cron-workflow.swagger.json @@ -1095,6 +1095,11 @@ "backoff": { "$ref": "#/definitions/github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.Backoff", "title": "Backoff is a backoff strategy" + }, + "resubmit": { + "type": "boolean", + "format": "boolean", + "title": "Resubmit is set to enable Pending pod resubmission" } }, "title": "RetryStrategy provides controls on how to retry a workflow step" diff --git a/pkg/apiclient/workflow/workflow.swagger.json b/pkg/apiclient/workflow/workflow.swagger.json index a9e06066f418..d8b7ddde7d02 100644 --- a/pkg/apiclient/workflow/workflow.swagger.json +++ b/pkg/apiclient/workflow/workflow.swagger.json @@ -1419,6 +1419,11 @@ "backoff": { "$ref": "#/definitions/github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.Backoff", "title": "Backoff is a backoff strategy" + }, + "resubmit": { + "type": "boolean", + "format": "boolean", + "title": "Resubmit is set to enable Pending pod resubmission" } }, "title": "RetryStrategy provides controls on how to retry a workflow step" diff --git a/pkg/apiclient/workflowarchive/workflow-archive.swagger.json b/pkg/apiclient/workflowarchive/workflow-archive.swagger.json index f88fd8356b37..d8f9d06b8978 100644 --- a/pkg/apiclient/workflowarchive/workflow-archive.swagger.json +++ b/pkg/apiclient/workflowarchive/workflow-archive.swagger.json @@ -888,6 +888,11 @@ "backoff": { "$ref": "#/definitions/github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.Backoff", "title": "Backoff is a backoff strategy" + }, + "resubmit": { + "type": "boolean", + "format": "boolean", + "title": "Resubmit is set to enable Pending pod resubmission" } }, "title": "RetryStrategy provides controls on how to retry a workflow step" diff --git a/pkg/apiclient/workflowtemplate/workflow-template.swagger.json b/pkg/apiclient/workflowtemplate/workflow-template.swagger.json index 6010f4cd6b47..f39ada382510 100644 --- a/pkg/apiclient/workflowtemplate/workflow-template.swagger.json +++ b/pkg/apiclient/workflowtemplate/workflow-template.swagger.json @@ -947,6 +947,11 @@ "backoff": { "$ref": "#/definitions/github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.Backoff", "title": "Backoff is a backoff strategy" + }, + "resubmit": { + "type": "boolean", + "format": "boolean", + "title": "Resubmit is set to enable Pending pod resubmission" } }, "title": "RetryStrategy provides controls on how to retry a workflow step" From e2417d2ee193b80c6fe9a84c82ab2f0c9f504c19 Mon Sep 17 00:00:00 2001 From: Roman Galeev Date: Fri, 13 Mar 2020 00:34:52 +0100 Subject: [PATCH 14/18] Remove debug output --- workflow/controller/operator.go | 1 - 1 file changed, 1 deletion(-) diff --git a/workflow/controller/operator.go b/workflow/controller/operator.go index 44848e6765ae..be4f3371b653 100644 --- a/workflow/controller/operator.go +++ b/workflow/controller/operator.go @@ -1262,7 +1262,6 @@ func isResubmitAllowed(tmpl *wfv1.Template) bool { if tmpl.RetryStrategy == nil { return false } - fmt.Printf("FLAG: %v", *tmpl.RetryStrategy.Resubmit) if tmpl.RetryStrategy.Resubmit == nil { return false } From 08bfbfbd7baae6913ff554e3f9f0d6371456e435 Mon Sep 17 00:00:00 2001 From: Simon Behar Date: Thu, 12 Mar 2020 19:32:40 -0700 Subject: [PATCH 15/18] Refactor logic --- api/openapi-spec/swagger.json | 10 +- .../cronworkflow/cron-workflow.swagger.json | 10 +- pkg/apiclient/workflow/workflow.swagger.json | 10 +- .../workflow-archive.swagger.json | 10 +- .../workflow-template.swagger.json | 10 +- pkg/apis/workflow/v1alpha1/generated.pb.go | 703 +++++++++--------- pkg/apis/workflow/v1alpha1/generated.proto | 3 + pkg/apis/workflow/v1alpha1/workflow_types.go | 6 +- .../v1alpha1/zz_generated.deepcopy.go | 5 + .../workflow/v1alpha1/workflowtemplate.go | 7 +- test/e2e/fixtures/e2e_suite.go | 13 + test/e2e/functional_test.go | 17 +- workflow/controller/operator.go | 48 +- 13 files changed, 439 insertions(+), 413 deletions(-) diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 320accebc658..cb9479ca657f 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -2212,11 +2212,6 @@ "format": "int32", "title": "Limit is the maximum number of attempts when retrying a container" }, - "resubmit": { - "type": "boolean", - "format": "boolean", - "title": "Resubmit is set to enable Pending pod resubmission" - }, "retryPolicy": { "type": "string", "title": "RetryPolicy is a policy of NodePhase statuses that will be retried" @@ -2436,6 +2431,11 @@ "title": "Resource template subtype which can run k8s resources", "$ref": "#/definitions/io.argoproj.workflow.v1alpha1.ResourceTemplate" }, + "resubmitPendingPods": { + "type": "boolean", + "format": "boolean", + "title": "ResubmitPendingPods is a flag to enable resubmitting pods that remain Pending after initial submission" + }, "retryStrategy": { "title": "RetryStrategy describes how to retry a template when it fails", "$ref": "#/definitions/io.argoproj.workflow.v1alpha1.RetryStrategy" diff --git a/pkg/apiclient/cronworkflow/cron-workflow.swagger.json b/pkg/apiclient/cronworkflow/cron-workflow.swagger.json index da378db1393c..38c81b5e07f9 100644 --- a/pkg/apiclient/cronworkflow/cron-workflow.swagger.json +++ b/pkg/apiclient/cronworkflow/cron-workflow.swagger.json @@ -1099,11 +1099,6 @@ "backoff": { "$ref": "#/definitions/github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.Backoff", "title": "Backoff is a backoff strategy" - }, - "resubmit": { - "type": "boolean", - "format": "boolean", - "title": "Resubmit is set to enable Pending pod resubmission" } }, "title": "RetryStrategy provides controls on how to retry a workflow step" @@ -1379,6 +1374,11 @@ "podSpecPatch": { "type": "string", "description": "PodSpecPatch holds strategic merge patch to apply against the pod spec. Allows parameterization of\ncontainer fields which are not strings (e.g. resource limits)." + }, + "resubmitPendingPods": { + "type": "boolean", + "format": "boolean", + "title": "ResubmitPendingPods is a flag to enable resubmitting pods that remain Pending after initial submission" } }, "title": "Template is a reusable and composable unit of execution in a workflow" diff --git a/pkg/apiclient/workflow/workflow.swagger.json b/pkg/apiclient/workflow/workflow.swagger.json index d8b7ddde7d02..68292922a796 100644 --- a/pkg/apiclient/workflow/workflow.swagger.json +++ b/pkg/apiclient/workflow/workflow.swagger.json @@ -1419,11 +1419,6 @@ "backoff": { "$ref": "#/definitions/github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.Backoff", "title": "Backoff is a backoff strategy" - }, - "resubmit": { - "type": "boolean", - "format": "boolean", - "title": "Resubmit is set to enable Pending pod resubmission" } }, "title": "RetryStrategy provides controls on how to retry a workflow step" @@ -1699,6 +1694,11 @@ "podSpecPatch": { "type": "string", "description": "PodSpecPatch holds strategic merge patch to apply against the pod spec. Allows parameterization of\ncontainer fields which are not strings (e.g. resource limits)." + }, + "resubmitPendingPods": { + "type": "boolean", + "format": "boolean", + "title": "ResubmitPendingPods is a flag to enable resubmitting pods that remain Pending after initial submission" } }, "title": "Template is a reusable and composable unit of execution in a workflow" diff --git a/pkg/apiclient/workflowarchive/workflow-archive.swagger.json b/pkg/apiclient/workflowarchive/workflow-archive.swagger.json index d8f9d06b8978..50431f1b9784 100644 --- a/pkg/apiclient/workflowarchive/workflow-archive.swagger.json +++ b/pkg/apiclient/workflowarchive/workflow-archive.swagger.json @@ -888,11 +888,6 @@ "backoff": { "$ref": "#/definitions/github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.Backoff", "title": "Backoff is a backoff strategy" - }, - "resubmit": { - "type": "boolean", - "format": "boolean", - "title": "Resubmit is set to enable Pending pod resubmission" } }, "title": "RetryStrategy provides controls on how to retry a workflow step" @@ -1168,6 +1163,11 @@ "podSpecPatch": { "type": "string", "description": "PodSpecPatch holds strategic merge patch to apply against the pod spec. Allows parameterization of\ncontainer fields which are not strings (e.g. resource limits)." + }, + "resubmitPendingPods": { + "type": "boolean", + "format": "boolean", + "title": "ResubmitPendingPods is a flag to enable resubmitting pods that remain Pending after initial submission" } }, "title": "Template is a reusable and composable unit of execution in a workflow" diff --git a/pkg/apiclient/workflowtemplate/workflow-template.swagger.json b/pkg/apiclient/workflowtemplate/workflow-template.swagger.json index f39ada382510..fb66b25644fc 100644 --- a/pkg/apiclient/workflowtemplate/workflow-template.swagger.json +++ b/pkg/apiclient/workflowtemplate/workflow-template.swagger.json @@ -947,11 +947,6 @@ "backoff": { "$ref": "#/definitions/github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.Backoff", "title": "Backoff is a backoff strategy" - }, - "resubmit": { - "type": "boolean", - "format": "boolean", - "title": "Resubmit is set to enable Pending pod resubmission" } }, "title": "RetryStrategy provides controls on how to retry a workflow step" @@ -1209,6 +1204,11 @@ "podSpecPatch": { "type": "string", "description": "PodSpecPatch holds strategic merge patch to apply against the pod spec. Allows parameterization of\ncontainer fields which are not strings (e.g. resource limits)." + }, + "resubmitPendingPods": { + "type": "boolean", + "format": "boolean", + "title": "ResubmitPendingPods is a flag to enable resubmitting pods that remain Pending after initial submission" } }, "title": "Template is a reusable and composable unit of execution in a workflow" diff --git a/pkg/apis/workflow/v1alpha1/generated.pb.go b/pkg/apis/workflow/v1alpha1/generated.pb.go index c53925464963..203b455044d7 100644 --- a/pkg/apis/workflow/v1alpha1/generated.pb.go +++ b/pkg/apis/workflow/v1alpha1/generated.pb.go @@ -1644,342 +1644,344 @@ func init() { } var fileDescriptor_c23edafa7e7ea072 = []byte{ - // 5354 bytes of a gzipped FileDescriptorProto + // 5383 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5c, 0x5d, 0x6c, 0x1c, 0x59, 0x56, 0x4e, 0xdb, 0xee, 0x76, 0xf7, 0x69, 0x3b, 0x76, 0x6e, 0x9c, 0xa4, 0xc7, 0x9b, 0x71, 0x67, 0x6b, 0x98, 0x21, 0x03, 0x33, 0xed, 0x4d, 0xb2, 0x0b, 0xb3, 0xb3, 0xcc, 0xcc, 0xba, 0xed, 0x38, 0x71, 0x7e, 0x6c, 0x73, 0xda, 0x49, 0x58, 0x66, 0xb4, 0x4b, 0xb9, 0xeb, 0x76, 0x77, 0xc5, 0xdd, - 0x55, 0x35, 0x75, 0xab, 0xe3, 0x31, 0x03, 0x62, 0x16, 0x81, 0x00, 0xa1, 0x95, 0xd8, 0x97, 0xd5, - 0x4a, 0x2b, 0x24, 0xc4, 0x03, 0xbc, 0xf0, 0x82, 0x10, 0x2f, 0x3c, 0x2c, 0xd2, 0x8a, 0x87, 0xd1, - 0xbe, 0x30, 0xe2, 0x85, 0x79, 0x40, 0xd6, 0x8e, 0x91, 0x10, 0x12, 0x48, 0xbc, 0x20, 0xad, 0x88, - 0x78, 0x40, 0xf7, 0xa7, 0x6e, 0xfd, 0x74, 0x39, 0x71, 0xba, 0x1d, 0x2f, 0x68, 0x79, 0xb2, 0xeb, - 0x9c, 0x73, 0xbf, 0x73, 0xeb, 0xde, 0x5b, 0xe7, 0x9e, 0x73, 0xee, 0xb9, 0x0d, 0xcb, 0x6d, 0x3b, - 0xe8, 0xf4, 0xb7, 0x6b, 0x4d, 0xb7, 0xb7, 0x68, 0xfa, 0x6d, 0xd7, 0xf3, 0xdd, 0x87, 0xe2, 0x9f, - 0x45, 0x6f, 0xa7, 0xbd, 0x68, 0x7a, 0x36, 0x5b, 0xdc, 0x75, 0xfd, 0x9d, 0x56, 0xd7, 0xdd, 0x5d, - 0x7c, 0x74, 0xc5, 0xec, 0x7a, 0x1d, 0xf3, 0xca, 0x62, 0x9b, 0x3a, 0xd4, 0x37, 0x03, 0x6a, 0xd5, - 0x3c, 0xdf, 0x0d, 0x5c, 0x72, 0x2d, 0x02, 0xa9, 0x85, 0x20, 0xe2, 0x9f, 0x9a, 0xb7, 0xd3, 0xae, - 0x71, 0x90, 0x5a, 0x08, 0x52, 0x0b, 0x41, 0xe6, 0x5f, 0x8f, 0x69, 0x6e, 0xbb, 0x5c, 0x21, 0xc7, - 0xda, 0xee, 0xb7, 0xc4, 0x93, 0x78, 0x10, 0xff, 0x49, 0x1d, 0xf3, 0xc6, 0xce, 0x1b, 0xac, 0x66, - 0xbb, 0xbc, 0x4b, 0x8b, 0x4d, 0xd7, 0xa7, 0x8b, 0x8f, 0x06, 0xfa, 0x31, 0xff, 0x6a, 0x4c, 0xc6, - 0x73, 0xbb, 0x76, 0x73, 0x6f, 0xf1, 0xd1, 0x95, 0x6d, 0x1a, 0x0c, 0x76, 0x79, 0xfe, 0x8b, 0x91, - 0x68, 0xcf, 0x6c, 0x76, 0x6c, 0x87, 0xfa, 0x7b, 0xd1, 0x2b, 0xf7, 0x68, 0x60, 0x66, 0x29, 0x58, - 0x3c, 0xac, 0x95, 0xdf, 0x77, 0x02, 0xbb, 0x47, 0x07, 0x1a, 0xfc, 0xc2, 0xd3, 0x1a, 0xb0, 0x66, - 0x87, 0xf6, 0xcc, 0x74, 0x3b, 0xe3, 0xef, 0x73, 0x30, 0xb3, 0xe4, 0x37, 0x3b, 0xf6, 0x23, 0xda, - 0x08, 0x38, 0xa3, 0xbd, 0x47, 0xde, 0x85, 0xf1, 0xc0, 0xf4, 0x2b, 0xb9, 0x4b, 0xb9, 0xcb, 0xe5, - 0xab, 0x5f, 0xad, 0x0d, 0x31, 0xe6, 0xb5, 0x2d, 0xd3, 0x0f, 0xe1, 0xea, 0x93, 0x07, 0xfb, 0xd5, - 0xf1, 0x2d, 0xd3, 0x47, 0x8e, 0x4a, 0xbe, 0x01, 0x13, 0x8e, 0xeb, 0xd0, 0xca, 0x98, 0x40, 0x5f, - 0x1a, 0x0a, 0x7d, 0xdd, 0x75, 0x74, 0x6f, 0xeb, 0xc5, 0x83, 0xfd, 0xea, 0x04, 0xa7, 0xa0, 0x00, - 0x36, 0xfe, 0x23, 0x07, 0xa5, 0x25, 0xbf, 0xdd, 0xef, 0x51, 0x27, 0x60, 0xc4, 0x07, 0xf0, 0x4c, - 0xdf, 0xec, 0xd1, 0x80, 0xfa, 0xac, 0x92, 0xbb, 0x34, 0x7e, 0xb9, 0x7c, 0xf5, 0xed, 0xa1, 0x94, - 0x6e, 0x86, 0x30, 0x75, 0xf2, 0xf1, 0x7e, 0xf5, 0xd4, 0xc1, 0x7e, 0x15, 0x34, 0x89, 0x61, 0x4c, - 0x0b, 0x71, 0xa0, 0x64, 0xfa, 0x81, 0xdd, 0x32, 0x9b, 0x01, 0xab, 0x8c, 0x09, 0x95, 0x6f, 0x0d, - 0xa5, 0x72, 0x49, 0xa1, 0xd4, 0xcf, 0x28, 0x8d, 0xa5, 0x90, 0xc2, 0x30, 0x52, 0x61, 0xfc, 0xdb, - 0x38, 0x14, 0x43, 0x06, 0xb9, 0x04, 0x13, 0x8e, 0xd9, 0xa3, 0x62, 0xf6, 0x4a, 0xf5, 0x29, 0xd5, - 0x70, 0x62, 0xdd, 0xec, 0xf1, 0x01, 0x32, 0x7b, 0x94, 0x4b, 0x78, 0x66, 0xd0, 0x11, 0x33, 0x10, - 0x93, 0xd8, 0x34, 0x83, 0x0e, 0x0a, 0x0e, 0xb9, 0x08, 0x13, 0x3d, 0xd7, 0xa2, 0x95, 0xf1, 0x4b, - 0xb9, 0xcb, 0x79, 0x39, 0xc0, 0x77, 0x5d, 0x8b, 0xa2, 0xa0, 0xf2, 0xf6, 0x2d, 0xdf, 0xed, 0x55, - 0x26, 0x92, 0xed, 0x57, 0x7d, 0xb7, 0x87, 0x82, 0x43, 0xfe, 0x30, 0x07, 0xb3, 0x61, 0xf7, 0xee, - 0xb8, 0x4d, 0x33, 0xb0, 0x5d, 0xa7, 0x92, 0x17, 0x13, 0x7e, 0x7d, 0xa4, 0x81, 0x08, 0xc1, 0xea, - 0x15, 0xa5, 0x75, 0x36, 0xcd, 0xc1, 0x01, 0xc5, 0xe4, 0x2a, 0x40, 0xbb, 0xeb, 0x6e, 0x9b, 0x5d, - 0x3e, 0x06, 0x95, 0x82, 0xe8, 0xb5, 0x9e, 0xc2, 0x1b, 0x9a, 0x83, 0x31, 0x29, 0xb2, 0x03, 0x93, - 0xa6, 0xfc, 0x2a, 0x2a, 0x93, 0xa2, 0xdf, 0x2b, 0x43, 0xf6, 0x3b, 0xf1, 0x65, 0xd5, 0xcb, 0x07, - 0xfb, 0xd5, 0x49, 0x45, 0xc4, 0x50, 0x03, 0x79, 0x0d, 0x8a, 0xae, 0xc7, 0xbb, 0x6a, 0x76, 0x2b, - 0xc5, 0x4b, 0xb9, 0xcb, 0xc5, 0xfa, 0xac, 0xea, 0x5e, 0x71, 0x43, 0xd1, 0x51, 0x4b, 0x18, 0xff, - 0x99, 0x87, 0x81, 0xb7, 0x26, 0x57, 0xa0, 0xac, 0xd0, 0xee, 0xb8, 0x6d, 0x26, 0x26, 0xbf, 0x58, - 0x9f, 0x39, 0xd8, 0xaf, 0x96, 0x97, 0x22, 0x32, 0xc6, 0x65, 0xc8, 0x03, 0x18, 0x63, 0xd7, 0xd4, - 0x67, 0xf8, 0xce, 0x50, 0x6f, 0xd7, 0xb8, 0xa6, 0x17, 0x68, 0xe1, 0x60, 0xbf, 0x3a, 0xd6, 0xb8, - 0x86, 0x63, 0xec, 0x1a, 0x37, 0x1f, 0x6d, 0x3b, 0x10, 0x8b, 0x67, 0x58, 0xf3, 0x71, 0xc3, 0x0e, - 0x34, 0xb4, 0x30, 0x1f, 0x37, 0xec, 0x00, 0x39, 0x2a, 0x37, 0x1f, 0x9d, 0x20, 0xf0, 0xc4, 0xe2, - 0x1b, 0xd6, 0x7c, 0xdc, 0xdc, 0xda, 0xda, 0xd4, 0xf0, 0x62, 0x75, 0x73, 0x0a, 0x0a, 0x60, 0xf2, - 0x21, 0x1f, 0x49, 0xc9, 0x73, 0xfd, 0x3d, 0xb5, 0x6a, 0x6f, 0x8e, 0xb4, 0x6a, 0x5d, 0x7f, 0x4f, - 0xab, 0x53, 0x73, 0xa2, 0x19, 0x18, 0xd7, 0x26, 0xde, 0xce, 0x6a, 0x31, 0xb1, 0x48, 0x87, 0x7e, - 0xbb, 0x95, 0xd5, 0x46, 0xea, 0xed, 0x56, 0x56, 0x1b, 0x28, 0x80, 0xf9, 0xdc, 0xf8, 0xe6, 0xae, - 0x5a, 0xd3, 0xc3, 0xcd, 0x0d, 0x9a, 0xbb, 0xc9, 0xb9, 0x41, 0x73, 0x17, 0x39, 0x2a, 0x07, 0x77, - 0x19, 0x13, 0x4b, 0x78, 0x58, 0xf0, 0x8d, 0x46, 0x23, 0x09, 0xbe, 0xd1, 0x68, 0x20, 0x47, 0x35, - 0xda, 0x70, 0x2e, 0xe4, 0x20, 0xf5, 0x5c, 0x66, 0x8b, 0xd1, 0xa3, 0x2d, 0xb2, 0x08, 0xa5, 0xa6, - 0xeb, 0xb4, 0xec, 0xf6, 0x5d, 0xd3, 0x53, 0x56, 0x4f, 0x9b, 0xcb, 0xe5, 0x90, 0x81, 0x91, 0x0c, - 0x79, 0x11, 0xc6, 0x77, 0xe8, 0x9e, 0x32, 0x7f, 0x65, 0x25, 0x3a, 0x7e, 0x9b, 0xee, 0x21, 0xa7, - 0x1b, 0xdf, 0xcf, 0xc1, 0xd9, 0x8c, 0x99, 0xe3, 0xcd, 0xfa, 0x7e, 0x57, 0x69, 0xd0, 0xcd, 0xee, - 0xe1, 0x1d, 0xe4, 0x74, 0xf2, 0x7b, 0x39, 0x98, 0x89, 0x4d, 0xe5, 0x52, 0x5f, 0x59, 0xd8, 0xe1, - 0x4d, 0x47, 0x02, 0xab, 0x7e, 0x41, 0x69, 0x9c, 0x49, 0x31, 0x30, 0xad, 0xd5, 0xf8, 0x47, 0xb1, - 0xa5, 0x27, 0x68, 0xc4, 0x84, 0xd3, 0x7d, 0x46, 0x7d, 0x6e, 0xff, 0x1b, 0xb4, 0xe9, 0xd3, 0x40, - 0xed, 0xee, 0x2f, 0xd7, 0xa4, 0xdf, 0xc0, 0x7b, 0x51, 0xe3, 0xde, 0x4e, 0xed, 0xd1, 0x95, 0x9a, - 0x94, 0xb8, 0x4d, 0xf7, 0x1a, 0xb4, 0x4b, 0x39, 0x46, 0x9d, 0x1c, 0xec, 0x57, 0x4f, 0xdf, 0x4b, - 0x00, 0x60, 0x0a, 0x90, 0xab, 0xf0, 0x4c, 0xc6, 0x76, 0x5d, 0xdf, 0x52, 0x2a, 0xc6, 0x9e, 0x59, - 0xc5, 0x66, 0x02, 0x00, 0x53, 0x80, 0xc6, 0x77, 0x72, 0x30, 0x59, 0x37, 0x9b, 0x3b, 0x6e, 0xab, - 0xc5, 0x8d, 0xa6, 0xd5, 0xf7, 0xe5, 0xd6, 0x22, 0xe7, 0x44, 0x1b, 0xcd, 0x15, 0x45, 0x47, 0x2d, - 0x41, 0x5e, 0x81, 0x82, 0x1c, 0x0e, 0xd1, 0xa9, 0x7c, 0xfd, 0xb4, 0x92, 0x2d, 0xac, 0x0a, 0x2a, - 0x2a, 0x2e, 0xf9, 0x12, 0x94, 0x7b, 0xe6, 0x07, 0x21, 0x80, 0xb0, 0x61, 0xa5, 0xfa, 0x59, 0x25, - 0x5c, 0xbe, 0x1b, 0xb1, 0x30, 0x2e, 0x67, 0x7c, 0x0d, 0x60, 0xd9, 0x75, 0x02, 0xdb, 0xe9, 0xd3, - 0x0d, 0x87, 0xbc, 0x04, 0x79, 0xea, 0xfb, 0xae, 0xaf, 0xcc, 0xf0, 0xb4, 0x6a, 0x9e, 0xbf, 0xce, - 0x89, 0x28, 0x79, 0xb2, 0x47, 0x76, 0x97, 0x5a, 0xa2, 0x47, 0xc5, 0x78, 0x8f, 0x38, 0x15, 0x15, - 0xd7, 0xf8, 0xe1, 0x18, 0x4c, 0x2d, 0xfb, 0xae, 0xf3, 0x40, 0xad, 0x10, 0xf2, 0x6b, 0x50, 0xe4, - 0x5e, 0xa3, 0x65, 0x06, 0xa6, 0x9a, 0xc4, 0x2f, 0xc4, 0x46, 0x58, 0x3b, 0x7f, 0xd1, 0xda, 0xe2, - 0xd2, 0x7c, 0xcc, 0x37, 0xb6, 0x1f, 0xd2, 0x66, 0x70, 0x97, 0x06, 0x66, 0xb4, 0xfd, 0x45, 0x34, - 0xd4, 0xa8, 0xa4, 0x0d, 0x13, 0xcc, 0xa3, 0x4d, 0x35, 0x7f, 0xc3, 0xed, 0xd8, 0xf1, 0x2e, 0x37, - 0x3c, 0xda, 0x8c, 0xfc, 0x04, 0xfe, 0x84, 0x42, 0x01, 0x71, 0xa1, 0xc0, 0x02, 0x33, 0xe8, 0x33, - 0xb5, 0x59, 0xdc, 0x18, 0x5d, 0x95, 0x80, 0x8b, 0x06, 0x53, 0x3e, 0xa3, 0x52, 0x63, 0x7c, 0x9a, - 0x83, 0xd9, 0xb8, 0xf8, 0x1d, 0x9b, 0x05, 0xe4, 0xbd, 0x81, 0x01, 0xad, 0x1d, 0x6d, 0x40, 0x79, - 0x6b, 0x31, 0x9c, 0x7a, 0xe5, 0x85, 0x94, 0xd8, 0x60, 0xb6, 0x20, 0x6f, 0x07, 0xb4, 0x17, 0x3a, - 0x82, 0x4b, 0x23, 0xbf, 0x62, 0xb4, 0x9e, 0xd6, 0x38, 0x2e, 0x4a, 0x78, 0xe3, 0xbf, 0xf3, 0xc9, - 0x57, 0xe3, 0xc3, 0xcc, 0x1d, 0xb1, 0xa9, 0xdd, 0x18, 0x41, 0xbd, 0xdf, 0x70, 0x9d, 0x48, 0x4c, - 0xe7, 0xcf, 0xa8, 0x4e, 0x4c, 0xc5, 0xa9, 0x8f, 0x53, 0xcf, 0x98, 0x50, 0xce, 0x3f, 0x59, 0x1e, - 0x85, 0x58, 0xfd, 0x2e, 0x55, 0xd6, 0x57, 0x0f, 0x5c, 0x43, 0xd1, 0x51, 0x4b, 0x90, 0xf7, 0xe0, - 0x4c, 0xd3, 0x75, 0x9a, 0x7d, 0xdf, 0xa7, 0x4e, 0x73, 0x6f, 0x53, 0x44, 0x59, 0xea, 0x83, 0xac, - 0xa9, 0x66, 0x67, 0x96, 0xd3, 0x02, 0x8f, 0xb3, 0x88, 0x38, 0x08, 0x44, 0x5e, 0x85, 0x49, 0xd6, - 0x67, 0x1e, 0x75, 0x2c, 0xe1, 0x4a, 0x14, 0xeb, 0x33, 0x0a, 0x73, 0xb2, 0x21, 0xc9, 0x18, 0xf2, - 0xc9, 0x3d, 0xb8, 0xc0, 0x02, 0x6e, 0x64, 0x9d, 0xf6, 0x0a, 0x35, 0xad, 0xae, 0xed, 0x70, 0x93, - 0xe7, 0x3a, 0x16, 0x13, 0xde, 0xc1, 0x78, 0xfd, 0x73, 0x07, 0xfb, 0xd5, 0x0b, 0x8d, 0x6c, 0x11, - 0x3c, 0xac, 0x2d, 0xf9, 0x3a, 0xcc, 0xb3, 0x7e, 0xb3, 0x49, 0x19, 0x6b, 0xf5, 0xbb, 0xb7, 0xdc, - 0x6d, 0x76, 0xd3, 0x66, 0xdc, 0x5e, 0xdf, 0xb1, 0x7b, 0x76, 0x20, 0x3c, 0x80, 0x7c, 0x7d, 0xe1, - 0x60, 0xbf, 0x3a, 0xdf, 0x38, 0x54, 0x0a, 0x9f, 0x80, 0x40, 0x10, 0xce, 0x4b, 0x13, 0x32, 0x80, - 0x3d, 0x29, 0xb0, 0xe7, 0x0f, 0xf6, 0xab, 0xe7, 0x57, 0x33, 0x25, 0xf0, 0x90, 0x96, 0x7c, 0x06, - 0x79, 0x30, 0xf9, 0xeb, 0x3c, 0x80, 0x2b, 0x26, 0x67, 0x70, 0x4b, 0xd1, 0x51, 0x4b, 0x90, 0x87, - 0xd1, 0xe2, 0xe3, 0x1f, 0x45, 0xa5, 0x34, 0xa4, 0xb5, 0x9a, 0xe3, 0x8e, 0xfe, 0x83, 0x18, 0x12, - 0xff, 0xb0, 0x30, 0x81, 0x6d, 0xfc, 0x43, 0x0e, 0xc8, 0xa0, 0x21, 0x20, 0xb7, 0xa1, 0x60, 0x36, - 0x03, 0xee, 0xc6, 0xcb, 0xd0, 0xef, 0xa5, 0xac, 0xcd, 0x48, 0xaa, 0x42, 0xda, 0xa2, 0x7c, 0x85, - 0xd0, 0xc8, 0x7a, 0x2c, 0x89, 0xa6, 0xa8, 0x20, 0x88, 0x0b, 0x67, 0xba, 0x26, 0x0b, 0xc2, 0xb5, - 0x6a, 0xf1, 0x57, 0x56, 0x46, 0xf2, 0xe7, 0x8e, 0xf6, 0x52, 0xbc, 0x45, 0xfd, 0x1c, 0x5f, 0xb9, - 0x77, 0xd2, 0x40, 0x38, 0x88, 0x6d, 0xfc, 0xa0, 0x00, 0x93, 0x2b, 0x4b, 0x37, 0xb6, 0x4c, 0xb6, - 0x73, 0x84, 0xb8, 0x8e, 0x4f, 0x0e, 0xed, 0x79, 0x5d, 0x33, 0x18, 0xf8, 0xbc, 0xb6, 0x14, 0x1d, - 0xb5, 0x04, 0x71, 0x79, 0x90, 0xaa, 0xa2, 0x64, 0x65, 0x7e, 0xdf, 0x1e, 0xd2, 0x51, 0x51, 0x28, - 0xf1, 0x28, 0x55, 0x91, 0x30, 0xd2, 0x41, 0x18, 0x94, 0x43, 0xe5, 0x48, 0x5b, 0xca, 0x81, 0x1f, - 0x32, 0xbb, 0x10, 0xe1, 0x48, 0x87, 0x3a, 0x46, 0xc0, 0xb8, 0x16, 0xf2, 0x45, 0x98, 0xb2, 0x28, - 0xff, 0x8a, 0xa9, 0xd3, 0xb4, 0x29, 0xff, 0x60, 0xc7, 0xf9, 0xb8, 0x70, 0xc3, 0xb5, 0x12, 0xa3, - 0x63, 0x42, 0x8a, 0x3c, 0x84, 0xd2, 0xae, 0x1d, 0x74, 0x84, 0x7d, 0xad, 0x14, 0xc4, 0xc2, 0xf9, - 0xf2, 0x50, 0x1d, 0xe5, 0x08, 0xd1, 0xb0, 0x3c, 0x08, 0x31, 0x31, 0x82, 0xe7, 0xee, 0x2b, 0x7f, - 0x10, 0xa9, 0x04, 0xf1, 0x65, 0x96, 0x92, 0x0d, 0x04, 0x03, 0x23, 0x19, 0xc2, 0x60, 0x8a, 0x3f, - 0x34, 0xe8, 0xfb, 0x7d, 0xbe, 0x5a, 0x95, 0xbb, 0x3d, 0x5c, 0x82, 0x21, 0x04, 0x91, 0x23, 0xf2, - 0x20, 0x06, 0x8b, 0x09, 0x25, 0x7c, 0xf5, 0xed, 0x76, 0xa8, 0x23, 0x3e, 0xe1, 0xd8, 0xea, 0x7b, - 0xd0, 0xa1, 0x0e, 0x0a, 0x0e, 0x71, 0x01, 0x9a, 0xda, 0x05, 0xaa, 0xc0, 0x08, 0x61, 0x65, 0xe4, - 0x49, 0xd5, 0x4f, 0x73, 0x1f, 0x25, 0x7a, 0xc6, 0x98, 0x0a, 0xee, 0x40, 0xb9, 0xce, 0xf5, 0x0f, - 0xec, 0xa0, 0x52, 0x16, 0x9d, 0xd2, 0x5f, 0xed, 0x86, 0xa0, 0xa2, 0xe2, 0x1a, 0x3f, 0xc8, 0x41, - 0x99, 0x7f, 0x44, 0xe1, 0xc2, 0x7f, 0x05, 0x0a, 0x81, 0xe9, 0xb7, 0x95, 0x0b, 0x1c, 0x6b, 0xb7, - 0x25, 0xa8, 0xa8, 0xb8, 0xc4, 0x84, 0x7c, 0x60, 0xb2, 0x9d, 0x70, 0xe3, 0xfe, 0xa5, 0xa1, 0xde, - 0x45, 0x7d, 0xbd, 0xd1, 0x9e, 0xcd, 0x9f, 0x18, 0x4a, 0x64, 0x72, 0x19, 0x8a, 0xdc, 0xd0, 0xae, - 0x9a, 0x4c, 0x86, 0xcb, 0xc5, 0xfa, 0x14, 0xff, 0x5a, 0x57, 0x15, 0x0d, 0x35, 0xd7, 0x78, 0x0f, - 0x4e, 0x5f, 0xff, 0x80, 0x36, 0xfb, 0x81, 0xeb, 0xcb, 0x98, 0x86, 0xdc, 0x02, 0xc2, 0xa8, 0xff, - 0xc8, 0x6e, 0xd2, 0xa5, 0x66, 0xd3, 0xed, 0x3b, 0xc1, 0x7a, 0x64, 0x1d, 0xe6, 0x95, 0x36, 0xd2, - 0x18, 0x90, 0xc0, 0x8c, 0x56, 0xc6, 0x5f, 0x4c, 0x40, 0x39, 0x16, 0x72, 0xf3, 0xd9, 0xf6, 0xa9, - 0xe7, 0xa6, 0x6d, 0x0d, 0x8f, 0xbb, 0x50, 0x70, 0xb8, 0xad, 0xf1, 0xe9, 0x23, 0x9b, 0x71, 0x27, - 0x39, 0x65, 0x6b, 0x50, 0xd1, 0x51, 0x4b, 0x90, 0x2a, 0xe4, 0x2d, 0xea, 0x05, 0x1d, 0xf1, 0x92, - 0x13, 0xf5, 0x12, 0x1f, 0x88, 0x15, 0x4e, 0x40, 0x49, 0xe7, 0x02, 0x2d, 0x1a, 0x34, 0x3b, 0x95, - 0x09, 0xf1, 0x7d, 0x0a, 0x81, 0x55, 0x4e, 0x40, 0x49, 0xcf, 0x88, 0x5f, 0xf2, 0xcf, 0x3f, 0x7e, - 0x29, 0x1c, 0x73, 0xfc, 0x42, 0x3c, 0x38, 0xcb, 0x58, 0x67, 0xd3, 0xb7, 0x1f, 0x99, 0x01, 0x15, - 0x8d, 0x85, 0x9e, 0xc9, 0x67, 0xd1, 0x73, 0xe1, 0x60, 0xbf, 0x7a, 0xb6, 0xd1, 0xb8, 0x99, 0x46, - 0xc1, 0x2c, 0x68, 0xd2, 0x80, 0x73, 0xb6, 0xc3, 0x68, 0xb3, 0xef, 0xd3, 0xb5, 0xb6, 0xe3, 0xfa, - 0xf4, 0xa6, 0xcb, 0x38, 0x9c, 0xca, 0x33, 0xbd, 0xa8, 0x26, 0xed, 0xdc, 0x5a, 0x96, 0x10, 0x66, - 0xb7, 0x35, 0x7e, 0x98, 0x83, 0xa9, 0x78, 0x96, 0x81, 0x30, 0x80, 0xce, 0xca, 0x6a, 0x43, 0xae, - 0x4c, 0xe5, 0x63, 0xbe, 0x33, 0x74, 0xf2, 0x42, 0xc2, 0x44, 0x31, 0x4a, 0x44, 0xc3, 0x98, 0x9a, - 0x23, 0xa4, 0x31, 0x5f, 0x82, 0x7c, 0xcb, 0xf5, 0x9b, 0x54, 0x7d, 0x5b, 0xfa, 0x1b, 0x5c, 0xe5, - 0x44, 0x94, 0x3c, 0xe3, 0x5f, 0x73, 0x10, 0xd3, 0x40, 0x7e, 0x0b, 0xa6, 0xb9, 0x8e, 0xdb, 0xfe, - 0x76, 0xe2, 0x6d, 0xea, 0x43, 0xbf, 0x8d, 0x46, 0xaa, 0x9f, 0x53, 0xfa, 0xa7, 0x13, 0x64, 0x4c, - 0xea, 0x23, 0x3f, 0x0f, 0x25, 0xd3, 0xb2, 0x7c, 0xca, 0x18, 0x95, 0xa6, 0xa7, 0x54, 0x9f, 0x16, - 0x7b, 0x6a, 0x48, 0xc4, 0x88, 0xcf, 0x3f, 0xc3, 0x8e, 0xd5, 0x62, 0x7c, 0x65, 0x2b, 0xd7, 0x58, - 0x7f, 0x86, 0x5c, 0x09, 0xa7, 0xa3, 0x96, 0x30, 0xbe, 0x35, 0x01, 0x49, 0xdd, 0xc4, 0x82, 0x99, - 0x1d, 0x7f, 0x7b, 0x79, 0xd9, 0x6c, 0x76, 0x86, 0xca, 0x0b, 0x9c, 0x3d, 0xd8, 0xaf, 0xce, 0xdc, - 0x4e, 0x22, 0x60, 0x1a, 0x52, 0x69, 0xb9, 0x4d, 0xf7, 0x02, 0x73, 0x7b, 0x98, 0xd4, 0x40, 0xa8, - 0x25, 0x8e, 0x80, 0x69, 0x48, 0x1e, 0xba, 0xef, 0xf8, 0xdb, 0xe1, 0x47, 0x9e, 0x0e, 0xdd, 0x6f, - 0x47, 0x2c, 0x8c, 0xcb, 0xf1, 0x21, 0xdc, 0xf1, 0xb7, 0x91, 0x9a, 0xdd, 0x30, 0xa3, 0xad, 0x87, - 0xf0, 0xb6, 0xa2, 0xa3, 0x96, 0x20, 0x1e, 0x90, 0x9d, 0x70, 0xf4, 0x74, 0x72, 0x49, 0xd9, 0xa2, - 0xcb, 0x59, 0x6f, 0xa3, 0x85, 0xe2, 0x2f, 0x74, 0x9e, 0xdb, 0xe6, 0xdb, 0x03, 0x38, 0x98, 0x81, - 0x4d, 0xbe, 0x06, 0x17, 0x76, 0xfc, 0x6d, 0x65, 0xc8, 0x37, 0x7d, 0xdb, 0x69, 0xda, 0x5e, 0x22, - 0x95, 0x5d, 0x55, 0xdd, 0xbd, 0x70, 0x3b, 0x5b, 0x0c, 0x0f, 0x6b, 0x6f, 0xbc, 0x0e, 0x53, 0xf1, - 0x54, 0xe8, 0x53, 0x32, 0x5c, 0xc6, 0xbf, 0xe7, 0xa0, 0xb0, 0xe6, 0x78, 0xfd, 0x9f, 0x92, 0x53, - 0x95, 0x3f, 0x9d, 0x80, 0x09, 0xee, 0xa2, 0x91, 0xcb, 0x30, 0x11, 0xec, 0x79, 0x72, 0x6f, 0x1d, - 0xaf, 0xcf, 0x85, 0x86, 0x66, 0x6b, 0xcf, 0xa3, 0x8f, 0xd5, 0x5f, 0x14, 0x12, 0xe4, 0x6d, 0x28, - 0x38, 0xfd, 0xde, 0x7d, 0xb3, 0xab, 0x8c, 0xd2, 0x2b, 0xa1, 0x6b, 0xb1, 0x2e, 0xa8, 0x8f, 0xf7, - 0xab, 0x73, 0xd4, 0x69, 0xba, 0x96, 0xed, 0xb4, 0x17, 0x1f, 0x32, 0xd7, 0xa9, 0xad, 0xf7, 0x7b, - 0xdb, 0xd4, 0x47, 0xd5, 0x8a, 0x07, 0xa5, 0xdb, 0xae, 0xdb, 0xe5, 0x00, 0xe3, 0xc9, 0xa0, 0xb4, - 0x2e, 0xc9, 0x18, 0xf2, 0xb9, 0x17, 0xc3, 0x02, 0x9f, 0x4b, 0x4e, 0x24, 0xbd, 0x98, 0x86, 0xa0, - 0xa2, 0xe2, 0x92, 0x1e, 0x14, 0x7a, 0xa6, 0xc7, 0xe5, 0xf2, 0x62, 0xc8, 0xae, 0x0f, 0xed, 0xc7, - 0xd6, 0xee, 0x0a, 0x9c, 0xeb, 0x4e, 0xe0, 0xef, 0x45, 0xea, 0x24, 0x11, 0x95, 0x12, 0x62, 0xc3, - 0x64, 0xd7, 0x66, 0x01, 0xd7, 0x57, 0x18, 0x61, 0x55, 0x70, 0x7d, 0xf7, 0xcd, 0x6e, 0x9f, 0x46, - 0x23, 0x70, 0x47, 0xc2, 0x62, 0x88, 0x3f, 0xbf, 0x07, 0xe5, 0x58, 0x8f, 0xc8, 0xac, 0xcc, 0xea, - 0x8a, 0xc5, 0x2b, 0x12, 0xb9, 0x64, 0x0b, 0xf2, 0x8f, 0x38, 0x86, 0x32, 0x36, 0x23, 0xf6, 0x04, - 0x25, 0xd8, 0x9b, 0x63, 0x6f, 0xe4, 0xde, 0x2c, 0x7e, 0xf7, 0x4f, 0xaa, 0xa7, 0x3e, 0xfa, 0xa7, - 0x4b, 0xa7, 0x8c, 0xbf, 0x1b, 0x87, 0x92, 0x16, 0xf9, 0xbf, 0xbd, 0x52, 0xfc, 0xd4, 0x4a, 0xb9, - 0x35, 0xda, 0x78, 0x1d, 0x69, 0xb9, 0x2c, 0x25, 0x97, 0xcb, 0x54, 0xfd, 0x67, 0x63, 0x53, 0xfd, - 0x78, 0xbf, 0x5a, 0x49, 0x0e, 0x02, 0x9a, 0xbb, 0x77, 0x29, 0x63, 0x66, 0x9b, 0x46, 0xcb, 0xe0, - 0xcb, 0x4f, 0x5b, 0x06, 0x73, 0xf1, 0x65, 0x50, 0xca, 0x9e, 0xc6, 0x8f, 0xc6, 0xa1, 0x18, 0x26, - 0x16, 0xc8, 0xef, 0xe6, 0xa0, 0x6c, 0x3a, 0x8e, 0x1b, 0x88, 0xdc, 0x6e, 0x68, 0xde, 0xd6, 0x87, - 0x1a, 0x8e, 0x10, 0xb4, 0xb6, 0x14, 0x01, 0xca, 0x21, 0xd1, 0x3b, 0x53, 0x8c, 0x83, 0x71, 0xbd, - 0xe4, 0x7d, 0x28, 0x74, 0xcd, 0x6d, 0xda, 0x0d, 0xad, 0xdd, 0xda, 0x68, 0x3d, 0xb8, 0x23, 0xb0, - 0x52, 0xf3, 0x21, 0x89, 0xa8, 0x14, 0xcd, 0xbf, 0x0d, 0xb3, 0xe9, 0x8e, 0x3e, 0xcb, 0x88, 0xf2, - 0xc9, 0x88, 0xa9, 0x79, 0x96, 0xa6, 0xc6, 0x7f, 0x95, 0x00, 0xd6, 0x5d, 0x8b, 0xaa, 0xc4, 0xcd, - 0x3c, 0x8c, 0xd9, 0x96, 0xda, 0x8a, 0x40, 0xf5, 0x76, 0x6c, 0x6d, 0x05, 0xc7, 0x6c, 0x4b, 0xa7, - 0x42, 0xc6, 0x0e, 0x4d, 0x85, 0x7c, 0x09, 0xca, 0x96, 0xcd, 0xbc, 0xae, 0xb9, 0xb7, 0x9e, 0xe1, - 0x0b, 0xac, 0x44, 0x2c, 0x8c, 0xcb, 0x91, 0xd7, 0xd4, 0xf7, 0x2b, 0x3f, 0x94, 0x4a, 0xea, 0xfb, - 0x2d, 0xf2, 0xee, 0xc5, 0xbe, 0xe1, 0x37, 0x60, 0x2a, 0x4c, 0x35, 0x08, 0x2d, 0x79, 0xd1, 0x2a, - 0xfc, 0xea, 0xa7, 0xb6, 0x62, 0x3c, 0x4c, 0x48, 0xa6, 0x53, 0x21, 0x85, 0x13, 0x49, 0x85, 0xac, - 0xc0, 0x2c, 0x0b, 0x5c, 0x9f, 0x5a, 0xa1, 0xc4, 0xda, 0x4a, 0x85, 0x24, 0x5e, 0x74, 0xb6, 0x91, - 0xe2, 0xe3, 0x40, 0x0b, 0xb2, 0x09, 0x73, 0x61, 0x27, 0xe2, 0x2f, 0x58, 0x39, 0x2b, 0x90, 0x2e, - 0x2a, 0xa4, 0xb9, 0x07, 0x19, 0x32, 0x98, 0xd9, 0x92, 0x7c, 0x05, 0xa6, 0xc3, 0x6e, 0x36, 0x9a, - 0xae, 0x47, 0x2b, 0x73, 0x02, 0x4a, 0x7b, 0xcb, 0x5b, 0x71, 0x26, 0x26, 0x65, 0xc9, 0x17, 0x20, - 0xef, 0x75, 0x4c, 0x46, 0x55, 0xe6, 0x24, 0x0c, 0x7c, 0xf3, 0x9b, 0x9c, 0xf8, 0x78, 0xbf, 0x5a, - 0xe2, 0x73, 0x26, 0x1e, 0x50, 0x0a, 0x92, 0xab, 0x00, 0xdb, 0x6e, 0xdf, 0xb1, 0x4c, 0x7f, 0x6f, - 0x6d, 0x45, 0x25, 0x31, 0xb5, 0xeb, 0x51, 0xd7, 0x1c, 0x8c, 0x49, 0x71, 0x6b, 0xdb, 0x93, 0x76, - 0x47, 0x25, 0x40, 0xb4, 0xb5, 0xd5, 0xe6, 0x48, 0xf1, 0xc9, 0xbb, 0x50, 0x12, 0x09, 0x5f, 0x6a, - 0x2d, 0x05, 0x2a, 0x0b, 0xf2, 0x2c, 0xb9, 0x41, 0xed, 0x92, 0x34, 0x42, 0x10, 0x8c, 0xf0, 0xc8, - 0xd7, 0x01, 0x5a, 0xb6, 0x63, 0xb3, 0x8e, 0x40, 0x2f, 0x3f, 0x33, 0xba, 0x7e, 0xcf, 0x55, 0x8d, - 0x82, 0x31, 0x44, 0x1e, 0x30, 0x79, 0xae, 0xb5, 0xb6, 0x59, 0x99, 0x12, 0x6f, 0xa9, 0x03, 0xa6, - 0x4d, 0x4e, 0x44, 0xc9, 0x23, 0x97, 0xa1, 0x68, 0x99, 0xb4, 0xe7, 0x3a, 0xd4, 0xaa, 0x4c, 0x47, - 0x49, 0x8b, 0x15, 0x45, 0x43, 0xcd, 0x25, 0xdf, 0x80, 0x82, 0x2d, 0xfc, 0xc5, 0xca, 0x69, 0xd1, - 0xd5, 0xaf, 0x0c, 0xb7, 0xa3, 0x08, 0x88, 0x3a, 0x70, 0x73, 0x25, 0xff, 0x47, 0x05, 0x4b, 0x9a, - 0x30, 0xe9, 0xf6, 0x03, 0xa1, 0x61, 0x46, 0x68, 0x18, 0x2e, 0x49, 0xb3, 0x21, 0x31, 0x64, 0x75, - 0x86, 0x7a, 0xc0, 0x10, 0x99, 0xbf, 0x6f, 0xb3, 0x63, 0x77, 0x2d, 0x9f, 0x3a, 0x95, 0x59, 0x11, - 0x8f, 0x89, 0xf7, 0x5d, 0x56, 0x34, 0xd4, 0x5c, 0xf2, 0x8b, 0x30, 0xed, 0xf6, 0x03, 0xb1, 0x6e, - 0xf8, 0xb2, 0x63, 0x95, 0x33, 0x42, 0xfc, 0x0c, 0x5f, 0xc5, 0x1b, 0x71, 0x06, 0x26, 0xe5, 0x8c, - 0xd3, 0x30, 0x15, 0x2f, 0x69, 0x32, 0xfe, 0x38, 0x07, 0xe5, 0xd8, 0x49, 0x38, 0x71, 0xa1, 0xe4, - 0x36, 0x1a, 0xf5, 0x7e, 0x73, 0x47, 0x07, 0x68, 0x6f, 0x0f, 0x7b, 0xbc, 0x2e, 0x51, 0xa2, 0x85, - 0xa6, 0x49, 0x18, 0xe9, 0x78, 0xda, 0x11, 0xf9, 0x5f, 0x8f, 0x41, 0xd4, 0x8e, 0x47, 0x50, 0xd4, - 0xb1, 0x3c, 0xd7, 0x76, 0x82, 0xf4, 0x49, 0xec, 0x75, 0x45, 0x47, 0x2d, 0xc1, 0xdd, 0x91, 0x6d, - 0xf9, 0x22, 0x63, 0x49, 0x77, 0x44, 0xf5, 0x42, 0x71, 0x49, 0x07, 0x66, 0x4c, 0x71, 0xb6, 0x11, - 0xe5, 0x49, 0xc6, 0x9f, 0x29, 0x4f, 0xa2, 0xcf, 0xcb, 0x93, 0x28, 0x98, 0x86, 0xe5, 0x9a, 0x58, - 0xd4, 0x5c, 0x68, 0x9a, 0x18, 0x4a, 0x53, 0x23, 0x89, 0x82, 0x69, 0x58, 0xe3, 0xdb, 0x63, 0x10, - 0xae, 0xaf, 0x9f, 0x86, 0x10, 0x8a, 0x18, 0x50, 0xf0, 0x29, 0xeb, 0x77, 0x03, 0xb5, 0x03, 0x8b, - 0x6f, 0x18, 0x05, 0x05, 0x15, 0xc7, 0xd8, 0x85, 0x69, 0xde, 0xdb, 0x6e, 0x97, 0x76, 0x1b, 0x01, - 0xf5, 0x18, 0x69, 0x41, 0x9e, 0xf1, 0x7f, 0xd4, 0x98, 0x8c, 0x78, 0x56, 0x19, 0x50, 0x2f, 0xb2, - 0x63, 0x42, 0x01, 0x4a, 0x78, 0xe3, 0x3b, 0x63, 0x50, 0xd2, 0xe3, 0x74, 0x84, 0xe3, 0x95, 0x97, - 0x61, 0xd2, 0xa2, 0x2d, 0x93, 0xbf, 0x8d, 0xfa, 0x2e, 0xb8, 0xb9, 0x58, 0x91, 0x24, 0x0c, 0x79, - 0xa4, 0x1a, 0x7a, 0x38, 0xf2, 0x95, 0x45, 0x2a, 0x33, 0x1e, 0x40, 0x90, 0x1d, 0x28, 0x89, 0x7f, - 0x56, 0xc3, 0x1a, 0xba, 0x61, 0xe7, 0xfd, 0x7e, 0x88, 0x22, 0x13, 0x44, 0xfa, 0x11, 0x23, 0xfc, - 0x54, 0xed, 0x5b, 0xfe, 0x28, 0xb5, 0x6f, 0xc6, 0x2a, 0x70, 0x83, 0x7f, 0x63, 0x99, 0xbc, 0x05, - 0x45, 0xa6, 0x4c, 0x92, 0x1a, 0x97, 0xcf, 0xeb, 0xf3, 0x5a, 0x45, 0x7f, 0xbc, 0x5f, 0x9d, 0x16, - 0xc2, 0x21, 0x01, 0x75, 0x13, 0x63, 0x11, 0xca, 0xb1, 0x5a, 0x21, 0x3e, 0xc2, 0xfa, 0x88, 0x3d, - 0x36, 0xc2, 0x2b, 0x66, 0x60, 0xa2, 0xe0, 0x18, 0x8f, 0xc7, 0x60, 0x16, 0x29, 0x73, 0xfb, 0x7e, - 0x93, 0xc6, 0xd3, 0xf5, 0x66, 0x33, 0x56, 0xe5, 0x91, 0x38, 0x9c, 0x73, 0x1d, 0x54, 0x5c, 0xee, - 0x46, 0xf4, 0xa8, 0xdf, 0xd6, 0x46, 0x54, 0x4d, 0x92, 0x76, 0x23, 0xee, 0xc6, 0x99, 0x98, 0x94, - 0xe5, 0x26, 0xac, 0x67, 0x3a, 0x76, 0x8b, 0xb2, 0x20, 0x9d, 0x47, 0xbb, 0xab, 0xe8, 0xa8, 0x25, - 0xc8, 0x0d, 0x38, 0xc3, 0x68, 0xb0, 0xb1, 0xeb, 0x50, 0x5f, 0x1f, 0x1a, 0xaa, 0x53, 0xe4, 0x17, - 0xc2, 0x93, 0xe9, 0x46, 0x5a, 0x00, 0x07, 0xdb, 0x08, 0x97, 0x4c, 0x1e, 0xe0, 0x2e, 0xbb, 0x8e, - 0x65, 0xeb, 0x32, 0xc9, 0xb8, 0x4b, 0x96, 0xe2, 0xe3, 0x40, 0x0b, 0x8e, 0xd2, 0x32, 0xed, 0x6e, - 0xdf, 0xa7, 0x11, 0x4a, 0x21, 0x89, 0xb2, 0x9a, 0xe2, 0xe3, 0x40, 0x0b, 0xe3, 0x5f, 0x72, 0x30, - 0x8d, 0x34, 0xf0, 0xf7, 0xf4, 0xa0, 0x54, 0x21, 0xdf, 0x15, 0xe7, 0xc5, 0x39, 0x71, 0x5e, 0x2c, - 0x56, 0xb2, 0x3c, 0x1e, 0x96, 0x74, 0xb2, 0x02, 0x65, 0x9f, 0xb7, 0x50, 0x67, 0xf3, 0x72, 0xc0, - 0x8d, 0xd0, 0xcb, 0xc6, 0x88, 0xf5, 0x38, 0xf9, 0x88, 0xf1, 0x66, 0xc4, 0x81, 0xc9, 0x6d, 0x59, - 0xd3, 0xa3, 0x0c, 0xfc, 0x70, 0x9b, 0xb8, 0xaa, 0x0b, 0x12, 0xb9, 0xb5, 0xb0, 0x48, 0xe8, 0x71, - 0xf4, 0x2f, 0x86, 0x4a, 0x8c, 0xef, 0xe6, 0x00, 0xa2, 0xca, 0x45, 0xb2, 0x03, 0x45, 0x76, 0x2d, - 0xb1, 0xb5, 0x0e, 0x79, 0x94, 0xa6, 0x40, 0x62, 0x35, 0x0d, 0x8a, 0x82, 0x5a, 0xc1, 0xd3, 0xf6, - 0xd5, 0xbf, 0x1c, 0x07, 0xdd, 0xea, 0x39, 0x6d, 0xab, 0xaf, 0x70, 0x93, 0xdc, 0x8e, 0x6a, 0x9b, - 0xb4, 0x1c, 0x0a, 0x2a, 0x2a, 0x2e, 0xf7, 0x7a, 0xc2, 0xe4, 0xbf, 0x5a, 0xda, 0xc2, 0xeb, 0x09, - 0xcf, 0x09, 0x50, 0x73, 0xb3, 0x36, 0xea, 0xfc, 0x89, 0x6d, 0xd4, 0x85, 0xe7, 0xb2, 0x51, 0x73, - 0x87, 0xdf, 0x77, 0xbb, 0x74, 0x09, 0xd7, 0x55, 0x60, 0xa1, 0x1d, 0x7e, 0x94, 0x64, 0x0c, 0xf9, - 0xc6, 0xef, 0xe7, 0xe0, 0x74, 0xa3, 0xe9, 0xdb, 0x5e, 0xa0, 0x4d, 0xd6, 0xba, 0xa8, 0x48, 0x0c, - 0x4c, 0xee, 0x8a, 0xab, 0x35, 0xf5, 0xe2, 0x21, 0xb9, 0x61, 0x29, 0x94, 0x28, 0x58, 0x94, 0x24, - 0x8c, 0x20, 0x44, 0x06, 0x47, 0x18, 0xc5, 0xf4, 0xdc, 0x36, 0x04, 0x15, 0x15, 0xd7, 0xf8, 0x5e, - 0x0e, 0x8a, 0xfa, 0xc4, 0xf6, 0x25, 0xc8, 0x8b, 0x03, 0x3e, 0xb5, 0x76, 0xf4, 0x1e, 0xb8, 0xcc, - 0x89, 0x28, 0x79, 0x5c, 0x48, 0x44, 0x17, 0x0a, 0x38, 0xb6, 0x51, 0x9a, 0x7e, 0x80, 0x92, 0xc7, - 0x17, 0x2d, 0x75, 0x2c, 0xb5, 0x5e, 0xf4, 0xa2, 0xbd, 0xee, 0x58, 0xc8, 0xe9, 0xa2, 0x90, 0xcd, - 0xf5, 0x7b, 0x66, 0x90, 0xce, 0x2f, 0xad, 0x0a, 0x2a, 0x2a, 0xae, 0xf1, 0x0e, 0xcc, 0xa8, 0xd2, - 0x1a, 0x3d, 0x50, 0xcf, 0x54, 0xc3, 0x67, 0xfc, 0x38, 0x07, 0xe5, 0xad, 0xad, 0x3b, 0xda, 0x3e, - 0x21, 0x9c, 0x67, 0xb2, 0x96, 0x66, 0xa9, 0x15, 0x50, 0x7f, 0xd9, 0xed, 0x79, 0x5d, 0xaa, 0xb1, - 0x54, 0x81, 0x4b, 0x23, 0x53, 0x02, 0x0f, 0x69, 0x49, 0xd6, 0xe0, 0x6c, 0x9c, 0xa3, 0xac, 0xaf, - 0x2a, 0x1a, 0x94, 0x47, 0x6f, 0x83, 0x6c, 0xcc, 0x6a, 0x93, 0x86, 0x52, 0x26, 0x58, 0xd5, 0xd4, - 0x0f, 0x40, 0x29, 0x36, 0x66, 0xb5, 0x31, 0xa6, 0xa1, 0x1c, 0xbb, 0x50, 0x61, 0x7c, 0xf3, 0x02, - 0xe8, 0x8a, 0x8e, 0x63, 0xaf, 0x0b, 0xf9, 0x89, 0x94, 0x69, 0x34, 0x75, 0xa4, 0x98, 0x1f, 0x3d, - 0x52, 0xd4, 0x0b, 0x30, 0x15, 0x2d, 0xb6, 0xa3, 0x68, 0xb1, 0x70, 0x0c, 0xd1, 0xa2, 0x36, 0x09, - 0x03, 0x11, 0xe3, 0x1f, 0xe4, 0x60, 0xca, 0x71, 0x2d, 0x1a, 0x1a, 0x9e, 0xca, 0xa4, 0xf0, 0x64, - 0x37, 0x46, 0x1a, 0xc4, 0xda, 0x7a, 0x0c, 0x51, 0x66, 0xf1, 0x74, 0xaa, 0x29, 0xce, 0xc2, 0x84, - 0x6a, 0xb2, 0x0a, 0x45, 0xb3, 0xc5, 0x43, 0xfc, 0x60, 0x4f, 0x55, 0x8a, 0x5c, 0xcc, 0x32, 0x45, - 0x4b, 0x4a, 0x46, 0x5a, 0xf9, 0xf0, 0x09, 0x75, 0x5b, 0xbe, 0x4d, 0xea, 0x22, 0xc9, 0xd2, 0x08, - 0xdb, 0x64, 0x98, 0x8e, 0x8c, 0x39, 0x58, 0x61, 0x41, 0x57, 0x54, 0x33, 0x69, 0x40, 0x41, 0x26, - 0x11, 0x44, 0x06, 0xa5, 0x28, 0xe3, 0x06, 0x99, 0x60, 0x40, 0xc5, 0x21, 0xed, 0x30, 0x4c, 0x28, - 0x8b, 0xc1, 0xad, 0x0f, 0x1d, 0x3a, 0xe9, 0xc8, 0x23, 0x3b, 0x4e, 0x20, 0xb7, 0xe2, 0xd6, 0x7c, - 0xea, 0x28, 0xd6, 0x7c, 0xfa, 0x50, 0x4b, 0xde, 0x86, 0x02, 0x13, 0x7b, 0x85, 0xc8, 0x9c, 0x94, - 0xaf, 0x2e, 0x0f, 0xe7, 0x6a, 0x24, 0xb6, 0x1b, 0x39, 0x3a, 0x92, 0x86, 0x0a, 0x9e, 0xb8, 0x50, - 0xf4, 0x95, 0x27, 0xad, 0x92, 0x2f, 0xc3, 0x1d, 0xfc, 0xa4, 0xdd, 0x71, 0xb9, 0x3e, 0x42, 0x2a, - 0x6a, 0x25, 0xe4, 0x5d, 0x18, 0xb7, 0xcc, 0xb6, 0x4a, 0xc3, 0x7c, 0x75, 0xe8, 0x5a, 0x99, 0x50, - 0x8d, 0xa8, 0xfd, 0x5f, 0x59, 0xba, 0x81, 0x1c, 0x95, 0xec, 0x44, 0xc5, 0x9a, 0xb3, 0x23, 0x94, - 0xd4, 0xa7, 0xb6, 0x1f, 0x19, 0xc0, 0x0d, 0x94, 0x7b, 0x5e, 0x87, 0xc9, 0x47, 0x6e, 0xb7, 0xdf, - 0x53, 0xf9, 0x9b, 0xf2, 0xd5, 0xf9, 0xac, 0xd9, 0xbe, 0x2f, 0x44, 0x22, 0x23, 0x20, 0x9f, 0x19, - 0x86, 0x6d, 0xc9, 0x6f, 0xe7, 0xe0, 0x34, 0xff, 0x74, 0xf4, 0x3a, 0x60, 0x15, 0x32, 0xc2, 0x4a, - 0xbd, 0xc7, 0xf8, 0x3e, 0x15, 0xae, 0xb0, 0xf3, 0x4a, 0xed, 0xe9, 0xb5, 0x84, 0x06, 0x4c, 0x69, - 0x24, 0x1e, 0x14, 0x99, 0x6d, 0xd1, 0xa6, 0xe9, 0xb3, 0xca, 0xd9, 0x63, 0xd3, 0x1e, 0x79, 0xb8, - 0x0a, 0x1b, 0xb5, 0x16, 0xf2, 0x3b, 0xe2, 0x1a, 0x84, 0xba, 0x65, 0xa4, 0x6e, 0x7e, 0xcd, 0x1d, - 0xe7, 0xcd, 0xaf, 0xb3, 0xf2, 0x0e, 0x44, 0x42, 0x03, 0xa6, 0x55, 0x92, 0x0d, 0x38, 0x27, 0x8b, - 0x36, 0xd3, 0x15, 0xbb, 0xe7, 0xc4, 0xd1, 0xdc, 0x0b, 0x07, 0xfb, 0xd5, 0x73, 0x4b, 0x59, 0x02, - 0x98, 0xdd, 0x8e, 0x7c, 0x08, 0xd3, 0x7e, 0x3c, 0x3a, 0xaa, 0x9c, 0x1f, 0xa1, 0x2e, 0x24, 0x11, - 0x67, 0xc9, 0xfc, 0x60, 0x82, 0x84, 0x49, 0x5d, 0xe4, 0x0a, 0x94, 0x3d, 0x65, 0xa9, 0x6c, 0xd6, - 0xab, 0x5c, 0x10, 0xef, 0x20, 0x76, 0xd4, 0xcd, 0x88, 0x8c, 0x71, 0x19, 0x72, 0x0f, 0xca, 0x81, - 0xdb, 0xa5, 0xbe, 0x3a, 0xc3, 0xaa, 0x88, 0xc9, 0x5f, 0xc8, 0x5a, 0xc9, 0x5b, 0x5a, 0x2c, 0x3a, - 0x21, 0x89, 0x68, 0x0c, 0xe3, 0x38, 0x3c, 0xca, 0x0e, 0x0b, 0xb4, 0x7d, 0x91, 0x52, 0x78, 0x21, - 0x19, 0x65, 0x37, 0xe2, 0x4c, 0x4c, 0xca, 0xf2, 0xb8, 0xd9, 0xf3, 0x6d, 0xd7, 0xb7, 0x83, 0xbd, - 0xe5, 0xae, 0xc9, 0x98, 0x00, 0x98, 0x17, 0x00, 0x3a, 0x6e, 0xde, 0x4c, 0x0b, 0xe0, 0x60, 0x1b, - 0x1e, 0x9c, 0x84, 0xc4, 0xca, 0xe7, 0x84, 0x3f, 0x25, 0xcc, 0x52, 0xd8, 0x16, 0x35, 0xf7, 0x90, - 0x2a, 0xb9, 0x8b, 0xc3, 0x54, 0xc9, 0x11, 0x0b, 0x2e, 0x9a, 0xfd, 0xc0, 0xed, 0x71, 0x42, 0xb2, - 0xc9, 0x96, 0xbb, 0x43, 0x9d, 0xca, 0x25, 0xb1, 0x57, 0x5d, 0x3a, 0xd8, 0xaf, 0x5e, 0x5c, 0x7a, - 0x82, 0x1c, 0x3e, 0x11, 0x85, 0xf4, 0xa0, 0x48, 0x55, 0xa5, 0x5f, 0xe5, 0xf3, 0x23, 0x6c, 0x12, - 0xc9, 0x72, 0x41, 0x39, 0x40, 0x21, 0x0d, 0xb5, 0x0a, 0xb2, 0x05, 0xe5, 0x8e, 0xcb, 0x82, 0xa5, - 0xae, 0x6d, 0x32, 0xca, 0x2a, 0x2f, 0x8a, 0x75, 0x92, 0xb9, 0xbf, 0xdd, 0x0c, 0xc5, 0xa2, 0x65, - 0x72, 0x33, 0x6a, 0x89, 0x71, 0x18, 0x42, 0x45, 0xa4, 0xd6, 0x17, 0xb3, 0xe6, 0x3a, 0x01, 0xfd, - 0x20, 0xa8, 0x2c, 0x88, 0x77, 0x79, 0x25, 0x0b, 0x79, 0xd3, 0xb5, 0x1a, 0x49, 0x69, 0xf9, 0x95, - 0xa7, 0x88, 0x98, 0xc6, 0x24, 0x6f, 0xc0, 0x94, 0xe7, 0x5a, 0x0d, 0x8f, 0x36, 0x37, 0xcd, 0xa0, - 0xd9, 0xa9, 0x54, 0x93, 0x27, 0x70, 0x9b, 0x31, 0x1e, 0x26, 0x24, 0xe7, 0xdf, 0x81, 0x33, 0x03, - 0xfe, 0xd4, 0x33, 0x1d, 0x57, 0xfe, 0x19, 0x0f, 0x46, 0x62, 0x1e, 0xec, 0x71, 0xbb, 0xe1, 0x37, - 0xe0, 0x8c, 0xba, 0xb9, 0xcd, 0x37, 0xdb, 0x6e, 0x5f, 0x5f, 0x47, 0x8a, 0xe5, 0x98, 0x30, 0x2d, - 0x80, 0x83, 0x6d, 0x8c, 0x3f, 0xcf, 0xc1, 0x74, 0xc2, 0x7c, 0x1f, 0x7b, 0x78, 0xba, 0x0a, 0xa4, - 0x67, 0xfb, 0xbe, 0xeb, 0xcb, 0x3d, 0xf0, 0x2e, 0x5f, 0xcb, 0x4c, 0xdd, 0x6a, 0x12, 0x95, 0x4e, - 0x77, 0x07, 0xb8, 0x98, 0xd1, 0xc2, 0xf8, 0x9b, 0x1c, 0x44, 0x49, 0x4c, 0x5d, 0xde, 0x97, 0x3b, - 0xb4, 0xbc, 0xef, 0x35, 0x28, 0x3e, 0x64, 0xae, 0xb3, 0x19, 0x15, 0x01, 0xea, 0x01, 0xbd, 0xd5, - 0xd8, 0x58, 0x17, 0x92, 0x5a, 0x42, 0x48, 0xbf, 0xbf, 0x6a, 0x77, 0x83, 0xc1, 0x52, 0xb9, 0x5b, - 0xbf, 0x2c, 0xe9, 0xa8, 0x25, 0xc8, 0x22, 0x94, 0x74, 0xde, 0x5c, 0xc5, 0xb5, 0x7a, 0x10, 0x74, - 0xd2, 0x18, 0x23, 0x19, 0xe3, 0xfb, 0x63, 0x50, 0x3c, 0xc1, 0x2b, 0x5a, 0xcd, 0xc4, 0x15, 0xad, - 0x63, 0xb8, 0xcf, 0x93, 0x75, 0x3d, 0x6b, 0x27, 0x75, 0x3d, 0x6b, 0x79, 0xc4, 0x54, 0xfc, 0x13, - 0xaf, 0x66, 0x7d, 0x92, 0x83, 0xa9, 0x13, 0xbc, 0x96, 0xb5, 0x9d, 0xbc, 0x96, 0xf5, 0xd6, 0x48, - 0xaf, 0x76, 0xc8, 0x95, 0xac, 0xbf, 0x3a, 0x07, 0x89, 0xeb, 0x50, 0xc4, 0x81, 0x52, 0xf8, 0x81, - 0x87, 0xc7, 0x1b, 0x6f, 0x8d, 0x14, 0x14, 0x46, 0x8b, 0x32, 0xa4, 0x30, 0x8c, 0x54, 0x90, 0xab, - 0x00, 0x94, 0x5b, 0x36, 0x99, 0x44, 0x1c, 0x4b, 0x66, 0xff, 0xaf, 0x6b, 0x0e, 0xc6, 0xa4, 0x4e, - 0xfe, 0x5e, 0x48, 0xf6, 0x16, 0x3d, 0xf1, 0x5c, 0xb6, 0xe8, 0x8b, 0xc7, 0xbe, 0x45, 0xbf, 0xf8, - 0xfc, 0xb7, 0xe8, 0x58, 0x40, 0x92, 0x1f, 0x21, 0x20, 0xf9, 0x10, 0xe6, 0xe4, 0xbf, 0xcb, 0x5d, - 0xd3, 0xee, 0xe9, 0xf5, 0xa2, 0xea, 0xf4, 0x5e, 0xcd, 0xdc, 0x98, 0xa9, 0xcf, 0x6c, 0x16, 0x50, - 0x27, 0xb8, 0x1f, 0xb5, 0x8c, 0x8a, 0x3c, 0xee, 0x67, 0xc0, 0x61, 0xa6, 0x92, 0xb4, 0x07, 0x3b, - 0x79, 0x04, 0x0f, 0xf6, 0x7b, 0x39, 0x38, 0x67, 0x66, 0xdd, 0xf8, 0x56, 0x79, 0x8c, 0x5b, 0x23, - 0xc5, 0x13, 0x09, 0x44, 0x15, 0x0f, 0x64, 0xb1, 0x30, 0xbb, 0x0f, 0xe4, 0xe5, 0x28, 0x24, 0x2d, - 0x89, 0x45, 0x95, 0x1d, 0x4c, 0x7e, 0x2b, 0x9d, 0x0a, 0x02, 0x31, 0xda, 0x8d, 0x91, 0x0d, 0xf6, - 0x31, 0xa4, 0x83, 0xca, 0x23, 0xa4, 0x83, 0x52, 0xe1, 0xc5, 0xd4, 0x31, 0x85, 0x17, 0x0e, 0xcc, - 0xda, 0x3d, 0xb3, 0x4d, 0x37, 0xfb, 0xdd, 0xae, 0x4c, 0xc5, 0xb3, 0xca, 0xb4, 0xc0, 0xce, 0x2c, - 0xae, 0xe6, 0xe1, 0x5e, 0x37, 0x7d, 0x7b, 0x4f, 0x1f, 0x7a, 0xad, 0xa5, 0x90, 0x70, 0x00, 0x9b, - 0x2f, 0x4b, 0xee, 0xb6, 0xae, 0xd3, 0x80, 0x8f, 0xb6, 0xc8, 0x94, 0xa8, 0x9f, 0xcd, 0xb8, 0x19, - 0x91, 0x31, 0x2e, 0x43, 0x6e, 0x43, 0xc9, 0x72, 0x98, 0x3a, 0xf2, 0x9a, 0x11, 0x56, 0xea, 0x75, - 0x6e, 0xdb, 0x56, 0xd6, 0x1b, 0xfa, 0xb0, 0xeb, 0xe2, 0xe0, 0x4f, 0x08, 0xd5, 0x34, 0x1f, 0xa3, - 0xf6, 0xe4, 0xae, 0x00, 0x53, 0x37, 0x0d, 0x64, 0x6a, 0xe3, 0xd2, 0x21, 0x1e, 0xf2, 0xca, 0x7a, - 0x78, 0x31, 0x62, 0x5a, 0xa9, 0x53, 0xf7, 0x07, 0x22, 0x84, 0xd8, 0x95, 0xa8, 0x33, 0x4f, 0xba, - 0x12, 0x45, 0xee, 0xc1, 0x85, 0x20, 0xe8, 0x26, 0xd2, 0xcf, 0xaa, 0x08, 0x48, 0x54, 0x84, 0xe5, - 0xe5, 0x8d, 0xd6, 0xad, 0xad, 0x3b, 0x59, 0x22, 0x78, 0x58, 0x5b, 0x91, 0x3a, 0x0e, 0xba, 0x3a, - 0x42, 0x5e, 0x18, 0x25, 0x75, 0x1c, 0xe5, 0xf9, 0x55, 0xea, 0x38, 0x22, 0x60, 0x5c, 0xcb, 0xe1, - 0x91, 0xfe, 0xd9, 0x21, 0x23, 0xfd, 0x78, 0x70, 0x39, 0xf7, 0xc4, 0xe0, 0x72, 0x20, 0x18, 0x3e, - 0xf7, 0x0c, 0xc1, 0xf0, 0xbb, 0xa2, 0xd6, 0xea, 0xc6, 0xb2, 0x4a, 0x24, 0xbc, 0x39, 0x5c, 0xfe, - 0x92, 0x23, 0xc8, 0x93, 0x59, 0xf1, 0x2f, 0x4a, 0x4c, 0xb2, 0x09, 0x73, 0x9e, 0x6b, 0x0d, 0xc4, - 0xd2, 0x22, 0x73, 0x10, 0xab, 0xd2, 0xdb, 0xcc, 0x90, 0xc1, 0xcc, 0x96, 0xc2, 0x80, 0x47, 0xf4, - 0x4a, 0x45, 0x0c, 0x8c, 0x34, 0xe0, 0x11, 0x19, 0xe3, 0x32, 0xe9, 0xd0, 0xf2, 0x85, 0xe7, 0x16, - 0x5a, 0xce, 0x9f, 0x40, 0x68, 0xf9, 0xb9, 0xa3, 0x86, 0x96, 0xe4, 0x37, 0xe1, 0xac, 0xe7, 0x5a, - 0x2b, 0x36, 0xf3, 0xfb, 0xe2, 0x27, 0x7b, 0xea, 0x7d, 0xab, 0x4d, 0x03, 0x11, 0x9b, 0x96, 0xaf, - 0x5e, 0x8d, 0x77, 0x52, 0xfe, 0x72, 0x58, 0x4d, 0xfd, 0x72, 0x98, 0xf8, 0xc8, 0x53, 0xad, 0x84, - 0x6b, 0x2e, 0xce, 0x8a, 0x32, 0x98, 0x98, 0xa5, 0x67, 0xf4, 0xc8, 0xf6, 0x6f, 0x4b, 0x70, 0x3a, - 0x75, 0x8b, 0x5a, 0x57, 0x59, 0xe6, 0x8e, 0x5a, 0x65, 0x99, 0x28, 0x83, 0x1c, 0x7b, 0xae, 0x65, - 0x90, 0xe3, 0xc7, 0x5e, 0x06, 0x19, 0x2b, 0xf7, 0x9c, 0x78, 0x4a, 0xb9, 0xe7, 0x12, 0xcc, 0x34, - 0xdd, 0x9e, 0x27, 0xae, 0x63, 0xa9, 0xa2, 0x3f, 0x59, 0xc0, 0xa1, 0xcf, 0x9a, 0x97, 0x93, 0x6c, - 0x4c, 0xcb, 0x93, 0xdf, 0x80, 0xbc, 0x23, 0x1a, 0x16, 0x46, 0xa8, 0x33, 0x4f, 0x4e, 0x98, 0x70, - 0x0e, 0x54, 0xa9, 0x77, 0x98, 0x2a, 0xce, 0x0b, 0xda, 0xe3, 0xf0, 0x1f, 0x94, 0x4a, 0xc9, 0x7b, - 0x50, 0x71, 0x5b, 0xad, 0xae, 0x6b, 0x5a, 0x51, 0xf1, 0xf5, 0x7d, 0xee, 0xf6, 0xa9, 0xc3, 0x97, - 0x52, 0xfd, 0x92, 0x02, 0xa8, 0x6c, 0x1c, 0x22, 0x87, 0x87, 0x22, 0x70, 0x1f, 0x6e, 0x26, 0x59, - 0x42, 0xcc, 0x2a, 0x25, 0xf1, 0x9a, 0xbf, 0x72, 0x1c, 0xaf, 0x99, 0xac, 0x57, 0x56, 0x2f, 0x1c, - 0x9d, 0xf2, 0x27, 0xb9, 0x98, 0xee, 0x09, 0xf1, 0xe1, 0xbc, 0x97, 0xe5, 0xe1, 0x32, 0x75, 0x60, - 0xf7, 0x24, 0x3f, 0x7b, 0x41, 0x69, 0x39, 0x9f, 0xe9, 0x23, 0x33, 0x3c, 0x04, 0x39, 0x5e, 0xb2, - 0x5a, 0x7c, 0x5e, 0x25, 0xab, 0xf3, 0x7b, 0xb2, 0x94, 0xfe, 0xd0, 0x2a, 0xfc, 0x7b, 0xc9, 0x9b, - 0x31, 0xef, 0x0c, 0xf9, 0x23, 0x7c, 0xe1, 0x6c, 0xc7, 0x6f, 0x00, 0x7c, 0x33, 0x07, 0x73, 0x59, - 0xd3, 0x92, 0xd1, 0x8b, 0x46, 0xb2, 0x17, 0xa3, 0x45, 0xc2, 0x71, 0x0b, 0xf6, 0xed, 0x42, 0x2c, - 0xee, 0x0e, 0xa8, 0xf7, 0xff, 0xbf, 0x9d, 0x30, 0xd4, 0xa1, 0x7c, 0xe2, 0x57, 0x10, 0xf2, 0x27, - 0xf8, 0x2b, 0x08, 0x85, 0x21, 0x7e, 0x05, 0x61, 0xf2, 0x24, 0x7f, 0x05, 0xa1, 0x78, 0xc4, 0x5f, - 0x41, 0x28, 0xfd, 0xef, 0xf9, 0x15, 0x84, 0xcf, 0x72, 0x30, 0x9b, 0xbe, 0x94, 0x71, 0x02, 0x79, - 0xca, 0x9d, 0x44, 0x9e, 0x72, 0x6d, 0x24, 0xa3, 0xaf, 0x2f, 0x82, 0x1c, 0x92, 0xaf, 0x34, 0x7e, - 0x94, 0x83, 0x81, 0x8b, 0x27, 0x27, 0x90, 0x4a, 0x7c, 0x98, 0x4c, 0x25, 0x5e, 0x3f, 0x96, 0x97, - 0x3c, 0x24, 0xa5, 0xf8, 0xe3, 0x8c, 0x57, 0xfc, 0x89, 0xa4, 0x16, 0x4f, 0xda, 0x04, 0xd6, 0x6b, - 0x1f, 0x7f, 0xb6, 0x70, 0xea, 0x93, 0xcf, 0x16, 0x4e, 0x7d, 0xfa, 0xd9, 0xc2, 0xa9, 0x8f, 0x0e, - 0x16, 0x72, 0x1f, 0x1f, 0x2c, 0xe4, 0x3e, 0x39, 0x58, 0xc8, 0x7d, 0x7a, 0xb0, 0x90, 0xfb, 0xd1, - 0xc1, 0x42, 0xee, 0x8f, 0xfe, 0x79, 0xe1, 0xd4, 0xaf, 0x16, 0x43, 0xdc, 0xff, 0x09, 0x00, 0x00, - 0xff, 0xff, 0x64, 0xfc, 0x65, 0x9b, 0x70, 0x58, 0x00, 0x00, + 0x55, 0x35, 0x75, 0xab, 0xe3, 0x31, 0x03, 0x62, 0x40, 0x20, 0x40, 0x68, 0x25, 0xf6, 0x65, 0xb5, + 0xd2, 0x0a, 0x09, 0xf1, 0x00, 0x2f, 0xbc, 0x20, 0xc4, 0x0b, 0x0f, 0x8b, 0xb4, 0xe2, 0x61, 0xb4, + 0x42, 0x62, 0xc4, 0x0b, 0xf3, 0x80, 0xac, 0x1d, 0x23, 0x21, 0x24, 0x90, 0x78, 0x41, 0x5a, 0x11, + 0xf1, 0x80, 0xee, 0x4f, 0xdd, 0xfa, 0xe9, 0x72, 0xe2, 0x74, 0x3b, 0x5e, 0xd0, 0xf2, 0x64, 0xd7, + 0x39, 0xe7, 0x7e, 0xe7, 0xd6, 0xbd, 0xb7, 0xce, 0x3d, 0xe7, 0xdc, 0x73, 0x1b, 0x96, 0xdb, 0x76, + 0xd0, 0xe9, 0x6f, 0xd7, 0x9a, 0x6e, 0x6f, 0xd1, 0xf4, 0xdb, 0xae, 0xe7, 0xbb, 0x0f, 0xc5, 0x3f, + 0x8b, 0xde, 0x4e, 0x7b, 0xd1, 0xf4, 0x6c, 0xb6, 0xb8, 0xeb, 0xfa, 0x3b, 0xad, 0xae, 0xbb, 0xbb, + 0xf8, 0xe8, 0x8a, 0xd9, 0xf5, 0x3a, 0xe6, 0x95, 0xc5, 0x36, 0x75, 0xa8, 0x6f, 0x06, 0xd4, 0xaa, + 0x79, 0xbe, 0x1b, 0xb8, 0xe4, 0x5a, 0x04, 0x52, 0x0b, 0x41, 0xc4, 0x3f, 0x35, 0x6f, 0xa7, 0x5d, + 0xe3, 0x20, 0xb5, 0x10, 0xa4, 0x16, 0x82, 0xcc, 0xbf, 0x1e, 0xd3, 0xdc, 0x76, 0xb9, 0x42, 0x8e, + 0xb5, 0xdd, 0x6f, 0x89, 0x27, 0xf1, 0x20, 0xfe, 0x93, 0x3a, 0xe6, 0x8d, 0x9d, 0x37, 0x58, 0xcd, + 0x76, 0x79, 0x97, 0x16, 0x9b, 0xae, 0x4f, 0x17, 0x1f, 0x0d, 0xf4, 0x63, 0xfe, 0xd5, 0x98, 0x8c, + 0xe7, 0x76, 0xed, 0xe6, 0xde, 0xe2, 0xa3, 0x2b, 0xdb, 0x34, 0x18, 0xec, 0xf2, 0xfc, 0x17, 0x23, + 0xd1, 0x9e, 0xd9, 0xec, 0xd8, 0x0e, 0xf5, 0xf7, 0xa2, 0x57, 0xee, 0xd1, 0xc0, 0xcc, 0x52, 0xb0, + 0x78, 0x58, 0x2b, 0xbf, 0xef, 0x04, 0x76, 0x8f, 0x0e, 0x34, 0xf8, 0xb9, 0xa7, 0x35, 0x60, 0xcd, + 0x0e, 0xed, 0x99, 0xe9, 0x76, 0xc6, 0xdf, 0xe7, 0x60, 0x66, 0xc9, 0x6f, 0x76, 0xec, 0x47, 0xb4, + 0x11, 0x70, 0x46, 0x7b, 0x8f, 0xbc, 0x0b, 0xe3, 0x81, 0xe9, 0x57, 0x72, 0x97, 0x72, 0x97, 0xcb, + 0x57, 0xbf, 0x5a, 0x1b, 0x62, 0xcc, 0x6b, 0x5b, 0xa6, 0x1f, 0xc2, 0xd5, 0x27, 0x0f, 0xf6, 0xab, + 0xe3, 0x5b, 0xa6, 0x8f, 0x1c, 0x95, 0x7c, 0x03, 0x26, 0x1c, 0xd7, 0xa1, 0x95, 0x31, 0x81, 0xbe, + 0x34, 0x14, 0xfa, 0xba, 0xeb, 0xe8, 0xde, 0xd6, 0x8b, 0x07, 0xfb, 0xd5, 0x09, 0x4e, 0x41, 0x01, + 0x6c, 0xfc, 0x47, 0x0e, 0x4a, 0x4b, 0x7e, 0xbb, 0xdf, 0xa3, 0x4e, 0xc0, 0x88, 0x0f, 0xe0, 0x99, + 0xbe, 0xd9, 0xa3, 0x01, 0xf5, 0x59, 0x25, 0x77, 0x69, 0xfc, 0x72, 0xf9, 0xea, 0xdb, 0x43, 0x29, + 0xdd, 0x0c, 0x61, 0xea, 0xe4, 0xe3, 0xfd, 0xea, 0xa9, 0x83, 0xfd, 0x2a, 0x68, 0x12, 0xc3, 0x98, + 0x16, 0xe2, 0x40, 0xc9, 0xf4, 0x03, 0xbb, 0x65, 0x36, 0x03, 0x56, 0x19, 0x13, 0x2a, 0xdf, 0x1a, + 0x4a, 0xe5, 0x92, 0x42, 0xa9, 0x9f, 0x51, 0x1a, 0x4b, 0x21, 0x85, 0x61, 0xa4, 0xc2, 0xf8, 0xb7, + 0x71, 0x28, 0x86, 0x0c, 0x72, 0x09, 0x26, 0x1c, 0xb3, 0x47, 0xc5, 0xec, 0x95, 0xea, 0x53, 0xaa, + 0xe1, 0xc4, 0xba, 0xd9, 0xe3, 0x03, 0x64, 0xf6, 0x28, 0x97, 0xf0, 0xcc, 0xa0, 0x23, 0x66, 0x20, + 0x26, 0xb1, 0x69, 0x06, 0x1d, 0x14, 0x1c, 0x72, 0x11, 0x26, 0x7a, 0xae, 0x45, 0x2b, 0xe3, 0x97, + 0x72, 0x97, 0xf3, 0x72, 0x80, 0xef, 0xba, 0x16, 0x45, 0x41, 0xe5, 0xed, 0x5b, 0xbe, 0xdb, 0xab, + 0x4c, 0x24, 0xdb, 0xaf, 0xfa, 0x6e, 0x0f, 0x05, 0x87, 0xfc, 0x41, 0x0e, 0x66, 0xc3, 0xee, 0xdd, + 0x71, 0x9b, 0x66, 0x60, 0xbb, 0x4e, 0x25, 0x2f, 0x26, 0xfc, 0xfa, 0x48, 0x03, 0x11, 0x82, 0xd5, + 0x2b, 0x4a, 0xeb, 0x6c, 0x9a, 0x83, 0x03, 0x8a, 0xc9, 0x55, 0x80, 0x76, 0xd7, 0xdd, 0x36, 0xbb, + 0x7c, 0x0c, 0x2a, 0x05, 0xd1, 0x6b, 0x3d, 0x85, 0x37, 0x34, 0x07, 0x63, 0x52, 0x64, 0x07, 0x26, + 0x4d, 0xf9, 0x55, 0x54, 0x26, 0x45, 0xbf, 0x57, 0x86, 0xec, 0x77, 0xe2, 0xcb, 0xaa, 0x97, 0x0f, + 0xf6, 0xab, 0x93, 0x8a, 0x88, 0xa1, 0x06, 0xf2, 0x1a, 0x14, 0x5d, 0x8f, 0x77, 0xd5, 0xec, 0x56, + 0x8a, 0x97, 0x72, 0x97, 0x8b, 0xf5, 0x59, 0xd5, 0xbd, 0xe2, 0x86, 0xa2, 0xa3, 0x96, 0x30, 0xfe, + 0x33, 0x0f, 0x03, 0x6f, 0x4d, 0xae, 0x40, 0x59, 0xa1, 0xdd, 0x71, 0xdb, 0x4c, 0x4c, 0x7e, 0xb1, + 0x3e, 0x73, 0xb0, 0x5f, 0x2d, 0x2f, 0x45, 0x64, 0x8c, 0xcb, 0x90, 0x07, 0x30, 0xc6, 0xae, 0xa9, + 0xcf, 0xf0, 0x9d, 0xa1, 0xde, 0xae, 0x71, 0x4d, 0x2f, 0xd0, 0xc2, 0xc1, 0x7e, 0x75, 0xac, 0x71, + 0x0d, 0xc7, 0xd8, 0x35, 0x6e, 0x3e, 0xda, 0x76, 0x20, 0x16, 0xcf, 0xb0, 0xe6, 0xe3, 0x86, 0x1d, + 0x68, 0x68, 0x61, 0x3e, 0x6e, 0xd8, 0x01, 0x72, 0x54, 0x6e, 0x3e, 0x3a, 0x41, 0xe0, 0x89, 0xc5, + 0x37, 0xac, 0xf9, 0xb8, 0xb9, 0xb5, 0xb5, 0xa9, 0xe1, 0xc5, 0xea, 0xe6, 0x14, 0x14, 0xc0, 0xe4, + 0x43, 0x3e, 0x92, 0x92, 0xe7, 0xfa, 0x7b, 0x6a, 0xd5, 0xde, 0x1c, 0x69, 0xd5, 0xba, 0xfe, 0x9e, + 0x56, 0xa7, 0xe6, 0x44, 0x33, 0x30, 0xae, 0x4d, 0xbc, 0x9d, 0xd5, 0x62, 0x62, 0x91, 0x0e, 0xfd, + 0x76, 0x2b, 0xab, 0x8d, 0xd4, 0xdb, 0xad, 0xac, 0x36, 0x50, 0x00, 0xf3, 0xb9, 0xf1, 0xcd, 0x5d, + 0xb5, 0xa6, 0x87, 0x9b, 0x1b, 0x34, 0x77, 0x93, 0x73, 0x83, 0xe6, 0x2e, 0x72, 0x54, 0x0e, 0xee, + 0x32, 0x26, 0x96, 0xf0, 0xb0, 0xe0, 0x1b, 0x8d, 0x46, 0x12, 0x7c, 0xa3, 0xd1, 0x40, 0x8e, 0x6a, + 0xb4, 0xe1, 0x5c, 0xc8, 0x41, 0xea, 0xb9, 0xcc, 0x16, 0xa3, 0x47, 0x5b, 0x64, 0x11, 0x4a, 0x4d, + 0xd7, 0x69, 0xd9, 0xed, 0xbb, 0xa6, 0xa7, 0xac, 0x9e, 0x36, 0x97, 0xcb, 0x21, 0x03, 0x23, 0x19, + 0xf2, 0x22, 0x8c, 0xef, 0xd0, 0x3d, 0x65, 0xfe, 0xca, 0x4a, 0x74, 0xfc, 0x36, 0xdd, 0x43, 0x4e, + 0x37, 0xbe, 0x97, 0x83, 0xb3, 0x19, 0x33, 0xc7, 0x9b, 0xf5, 0xfd, 0xae, 0xd2, 0xa0, 0x9b, 0xdd, + 0xc3, 0x3b, 0xc8, 0xe9, 0xe4, 0x77, 0x73, 0x30, 0x13, 0x9b, 0xca, 0xa5, 0xbe, 0xb2, 0xb0, 0xc3, + 0x9b, 0x8e, 0x04, 0x56, 0xfd, 0x82, 0xd2, 0x38, 0x93, 0x62, 0x60, 0x5a, 0xab, 0xf1, 0x8f, 0x62, + 0x4b, 0x4f, 0xd0, 0x88, 0x09, 0xa7, 0xfb, 0x8c, 0xfa, 0xdc, 0xfe, 0x37, 0x68, 0xd3, 0xa7, 0x81, + 0xda, 0xdd, 0x5f, 0xae, 0x49, 0xbf, 0x81, 0xf7, 0xa2, 0xc6, 0xbd, 0x9d, 0xda, 0xa3, 0x2b, 0x35, + 0x29, 0x71, 0x9b, 0xee, 0x35, 0x68, 0x97, 0x72, 0x8c, 0x3a, 0x39, 0xd8, 0xaf, 0x9e, 0xbe, 0x97, + 0x00, 0xc0, 0x14, 0x20, 0x57, 0xe1, 0x99, 0x8c, 0xed, 0xba, 0xbe, 0xa5, 0x54, 0x8c, 0x3d, 0xb3, + 0x8a, 0xcd, 0x04, 0x00, 0xa6, 0x00, 0x8d, 0x6f, 0xe7, 0x60, 0xb2, 0x6e, 0x36, 0x77, 0xdc, 0x56, + 0x8b, 0x1b, 0x4d, 0xab, 0xef, 0xcb, 0xad, 0x45, 0xce, 0x89, 0x36, 0x9a, 0x2b, 0x8a, 0x8e, 0x5a, + 0x82, 0xbc, 0x02, 0x05, 0x39, 0x1c, 0xa2, 0x53, 0xf9, 0xfa, 0x69, 0x25, 0x5b, 0x58, 0x15, 0x54, + 0x54, 0x5c, 0xf2, 0x25, 0x28, 0xf7, 0xcc, 0x0f, 0x42, 0x00, 0x61, 0xc3, 0x4a, 0xf5, 0xb3, 0x4a, + 0xb8, 0x7c, 0x37, 0x62, 0x61, 0x5c, 0xce, 0xf8, 0x1a, 0xc0, 0xb2, 0xeb, 0x04, 0xb6, 0xd3, 0xa7, + 0x1b, 0x0e, 0x79, 0x09, 0xf2, 0xd4, 0xf7, 0x5d, 0x5f, 0x99, 0xe1, 0x69, 0xd5, 0x3c, 0x7f, 0x9d, + 0x13, 0x51, 0xf2, 0x64, 0x8f, 0xec, 0x2e, 0xb5, 0x44, 0x8f, 0x8a, 0xf1, 0x1e, 0x71, 0x2a, 0x2a, + 0xae, 0xf1, 0x83, 0x31, 0x98, 0x5a, 0xf6, 0x5d, 0xe7, 0x81, 0x5a, 0x21, 0xe4, 0x57, 0xa0, 0xc8, + 0xbd, 0x46, 0xcb, 0x0c, 0x4c, 0x35, 0x89, 0x5f, 0x88, 0x8d, 0xb0, 0x76, 0xfe, 0xa2, 0xb5, 0xc5, + 0xa5, 0xf9, 0x98, 0x6f, 0x6c, 0x3f, 0xa4, 0xcd, 0xe0, 0x2e, 0x0d, 0xcc, 0x68, 0xfb, 0x8b, 0x68, + 0xa8, 0x51, 0x49, 0x1b, 0x26, 0x98, 0x47, 0x9b, 0x6a, 0xfe, 0x86, 0xdb, 0xb1, 0xe3, 0x5d, 0x6e, + 0x78, 0xb4, 0x19, 0xf9, 0x09, 0xfc, 0x09, 0x85, 0x02, 0xe2, 0x42, 0x81, 0x05, 0x66, 0xd0, 0x67, + 0x6a, 0xb3, 0xb8, 0x31, 0xba, 0x2a, 0x01, 0x17, 0x0d, 0xa6, 0x7c, 0x46, 0xa5, 0xc6, 0xf8, 0x34, + 0x07, 0xb3, 0x71, 0xf1, 0x3b, 0x36, 0x0b, 0xc8, 0x7b, 0x03, 0x03, 0x5a, 0x3b, 0xda, 0x80, 0xf2, + 0xd6, 0x62, 0x38, 0xf5, 0xca, 0x0b, 0x29, 0xb1, 0xc1, 0x6c, 0x41, 0xde, 0x0e, 0x68, 0x2f, 0x74, + 0x04, 0x97, 0x46, 0x7e, 0xc5, 0x68, 0x3d, 0xad, 0x71, 0x5c, 0x94, 0xf0, 0xc6, 0x7f, 0xe7, 0x93, + 0xaf, 0xc6, 0x87, 0x99, 0x3b, 0x62, 0x53, 0xbb, 0x31, 0x82, 0x7a, 0xbf, 0xe1, 0x3a, 0x91, 0x98, + 0xce, 0x9f, 0x52, 0x9d, 0x98, 0x8a, 0x53, 0x1f, 0xa7, 0x9e, 0x31, 0xa1, 0x9c, 0x7f, 0xb2, 0x3c, + 0x0a, 0xb1, 0xfa, 0x5d, 0xaa, 0xac, 0xaf, 0x1e, 0xb8, 0x86, 0xa2, 0xa3, 0x96, 0x20, 0xef, 0xc1, + 0x99, 0xa6, 0xeb, 0x34, 0xfb, 0xbe, 0x4f, 0x9d, 0xe6, 0xde, 0xa6, 0x88, 0xb2, 0xd4, 0x07, 0x59, + 0x53, 0xcd, 0xce, 0x2c, 0xa7, 0x05, 0x1e, 0x67, 0x11, 0x71, 0x10, 0x88, 0xbc, 0x0a, 0x93, 0xac, + 0xcf, 0x3c, 0xea, 0x58, 0xc2, 0x95, 0x28, 0xd6, 0x67, 0x14, 0xe6, 0x64, 0x43, 0x92, 0x31, 0xe4, + 0x93, 0x7b, 0x70, 0x81, 0x05, 0xdc, 0xc8, 0x3a, 0xed, 0x15, 0x6a, 0x5a, 0x5d, 0xdb, 0xe1, 0x26, + 0xcf, 0x75, 0x2c, 0x26, 0xbc, 0x83, 0xf1, 0xfa, 0xe7, 0x0e, 0xf6, 0xab, 0x17, 0x1a, 0xd9, 0x22, + 0x78, 0x58, 0x5b, 0xf2, 0x75, 0x98, 0x67, 0xfd, 0x66, 0x93, 0x32, 0xd6, 0xea, 0x77, 0x6f, 0xb9, + 0xdb, 0xec, 0xa6, 0xcd, 0xb8, 0xbd, 0xbe, 0x63, 0xf7, 0xec, 0x40, 0x78, 0x00, 0xf9, 0xfa, 0xc2, + 0xc1, 0x7e, 0x75, 0xbe, 0x71, 0xa8, 0x14, 0x3e, 0x01, 0x81, 0x20, 0x9c, 0x97, 0x26, 0x64, 0x00, + 0x7b, 0x52, 0x60, 0xcf, 0x1f, 0xec, 0x57, 0xcf, 0xaf, 0x66, 0x4a, 0xe0, 0x21, 0x2d, 0xf9, 0x0c, + 0xf2, 0x60, 0xf2, 0x57, 0x79, 0x00, 0x57, 0x4c, 0xce, 0xe0, 0x96, 0xa2, 0xa3, 0x96, 0x20, 0x0f, + 0xa3, 0xc5, 0xc7, 0x3f, 0x8a, 0x4a, 0x69, 0x48, 0x6b, 0x35, 0xc7, 0x1d, 0xfd, 0x07, 0x31, 0x24, + 0xfe, 0x61, 0x61, 0x02, 0xdb, 0xf8, 0x87, 0x1c, 0x90, 0x41, 0x43, 0x40, 0x6e, 0x43, 0xc1, 0x6c, + 0x06, 0xdc, 0x8d, 0x97, 0xa1, 0xdf, 0x4b, 0x59, 0x9b, 0x91, 0x54, 0x85, 0xb4, 0x45, 0xf9, 0x0a, + 0xa1, 0x91, 0xf5, 0x58, 0x12, 0x4d, 0x51, 0x41, 0x10, 0x17, 0xce, 0x74, 0x4d, 0x16, 0x84, 0x6b, + 0xd5, 0xe2, 0xaf, 0xac, 0x8c, 0xe4, 0xcf, 0x1c, 0xed, 0xa5, 0x78, 0x8b, 0xfa, 0x39, 0xbe, 0x72, + 0xef, 0xa4, 0x81, 0x70, 0x10, 0xdb, 0xf8, 0x7e, 0x01, 0x26, 0x57, 0x96, 0x6e, 0x6c, 0x99, 0x6c, + 0xe7, 0x08, 0x71, 0x1d, 0x9f, 0x1c, 0xda, 0xf3, 0xba, 0x66, 0x30, 0xf0, 0x79, 0x6d, 0x29, 0x3a, + 0x6a, 0x09, 0xe2, 0xf2, 0x20, 0x55, 0x45, 0xc9, 0xca, 0xfc, 0xbe, 0x3d, 0xa4, 0xa3, 0xa2, 0x50, + 0xe2, 0x51, 0xaa, 0x22, 0x61, 0xa4, 0x83, 0x30, 0x28, 0x87, 0xca, 0x91, 0xb6, 0x94, 0x03, 0x3f, + 0x64, 0x76, 0x21, 0xc2, 0x91, 0x0e, 0x75, 0x8c, 0x80, 0x71, 0x2d, 0xe4, 0x8b, 0x30, 0x65, 0x51, + 0xfe, 0x15, 0x53, 0xa7, 0x69, 0x53, 0xfe, 0xc1, 0x8e, 0xf3, 0x71, 0xe1, 0x86, 0x6b, 0x25, 0x46, + 0xc7, 0x84, 0x14, 0x79, 0x08, 0xa5, 0x5d, 0x3b, 0xe8, 0x08, 0xfb, 0x5a, 0x29, 0x88, 0x85, 0xf3, + 0xe5, 0xa1, 0x3a, 0xca, 0x11, 0xa2, 0x61, 0x79, 0x10, 0x62, 0x62, 0x04, 0xcf, 0xdd, 0x57, 0xfe, + 0x20, 0x52, 0x09, 0xe2, 0xcb, 0x2c, 0x25, 0x1b, 0x08, 0x06, 0x46, 0x32, 0x84, 0xc1, 0x14, 0x7f, + 0x68, 0xd0, 0xf7, 0xfb, 0x7c, 0xb5, 0x2a, 0x77, 0x7b, 0xb8, 0x04, 0x43, 0x08, 0x22, 0x47, 0xe4, + 0x41, 0x0c, 0x16, 0x13, 0x4a, 0xf8, 0xea, 0xdb, 0xed, 0x50, 0x47, 0x7c, 0xc2, 0xb1, 0xd5, 0xf7, + 0xa0, 0x43, 0x1d, 0x14, 0x1c, 0xe2, 0x02, 0x34, 0xb5, 0x0b, 0x54, 0x81, 0x11, 0xc2, 0xca, 0xc8, + 0x93, 0xaa, 0x9f, 0xe6, 0x3e, 0x4a, 0xf4, 0x8c, 0x31, 0x15, 0xdc, 0x81, 0x72, 0x9d, 0xeb, 0x1f, + 0xd8, 0x41, 0xa5, 0x2c, 0x3a, 0xa5, 0xbf, 0xda, 0x0d, 0x41, 0x45, 0xc5, 0x35, 0xbe, 0x9f, 0x83, + 0x32, 0xff, 0x88, 0xc2, 0x85, 0xff, 0x0a, 0x14, 0x02, 0xd3, 0x6f, 0x2b, 0x17, 0x38, 0xd6, 0x6e, + 0x4b, 0x50, 0x51, 0x71, 0x89, 0x09, 0xf9, 0xc0, 0x64, 0x3b, 0xe1, 0xc6, 0xfd, 0x0b, 0x43, 0xbd, + 0x8b, 0xfa, 0x7a, 0xa3, 0x3d, 0x9b, 0x3f, 0x31, 0x94, 0xc8, 0xe4, 0x32, 0x14, 0xb9, 0xa1, 0x5d, + 0x35, 0x99, 0x0c, 0x97, 0x8b, 0xf5, 0x29, 0xfe, 0xb5, 0xae, 0x2a, 0x1a, 0x6a, 0xae, 0xf1, 0x1e, + 0x9c, 0xbe, 0xfe, 0x01, 0x6d, 0xf6, 0x03, 0xd7, 0x97, 0x31, 0x0d, 0xb9, 0x05, 0x84, 0x51, 0xff, + 0x91, 0xdd, 0xa4, 0x4b, 0xcd, 0xa6, 0xdb, 0x77, 0x82, 0xf5, 0xc8, 0x3a, 0xcc, 0x2b, 0x6d, 0xa4, + 0x31, 0x20, 0x81, 0x19, 0xad, 0x8c, 0x3f, 0x9f, 0x80, 0x72, 0x2c, 0xe4, 0xe6, 0xb3, 0xed, 0x53, + 0xcf, 0x4d, 0xdb, 0x1a, 0x1e, 0x77, 0xa1, 0xe0, 0x70, 0x5b, 0xe3, 0xd3, 0x47, 0x36, 0xe3, 0x4e, + 0x72, 0xca, 0xd6, 0xa0, 0xa2, 0xa3, 0x96, 0x20, 0x55, 0xc8, 0x5b, 0xd4, 0x0b, 0x3a, 0xe2, 0x25, + 0x27, 0xea, 0x25, 0x3e, 0x10, 0x2b, 0x9c, 0x80, 0x92, 0xce, 0x05, 0x5a, 0x34, 0x68, 0x76, 0x2a, + 0x13, 0xe2, 0xfb, 0x14, 0x02, 0xab, 0x9c, 0x80, 0x92, 0x9e, 0x11, 0xbf, 0xe4, 0x9f, 0x7f, 0xfc, + 0x52, 0x38, 0xe6, 0xf8, 0x85, 0x78, 0x70, 0x96, 0xb1, 0xce, 0xa6, 0x6f, 0x3f, 0x32, 0x03, 0x2a, + 0x1a, 0x0b, 0x3d, 0x93, 0xcf, 0xa2, 0xe7, 0xc2, 0xc1, 0x7e, 0xf5, 0x6c, 0xa3, 0x71, 0x33, 0x8d, + 0x82, 0x59, 0xd0, 0xa4, 0x01, 0xe7, 0x6c, 0x87, 0xd1, 0x66, 0xdf, 0xa7, 0x6b, 0x6d, 0xc7, 0xf5, + 0xe9, 0x4d, 0x97, 0x71, 0x38, 0x95, 0x67, 0x7a, 0x51, 0x4d, 0xda, 0xb9, 0xb5, 0x2c, 0x21, 0xcc, + 0x6e, 0x6b, 0xfc, 0x20, 0x07, 0x53, 0xf1, 0x2c, 0x03, 0x61, 0x00, 0x9d, 0x95, 0xd5, 0x86, 0x5c, + 0x99, 0xca, 0xc7, 0x7c, 0x67, 0xe8, 0xe4, 0x85, 0x84, 0x89, 0x62, 0x94, 0x88, 0x86, 0x31, 0x35, + 0x47, 0x48, 0x63, 0xbe, 0x04, 0xf9, 0x96, 0xeb, 0x37, 0xa9, 0xfa, 0xb6, 0xf4, 0x37, 0xb8, 0xca, + 0x89, 0x28, 0x79, 0xc6, 0xbf, 0xe6, 0x20, 0xa6, 0x81, 0xfc, 0x06, 0x4c, 0x73, 0x1d, 0xb7, 0xfd, + 0xed, 0xc4, 0xdb, 0xd4, 0x87, 0x7e, 0x1b, 0x8d, 0x54, 0x3f, 0xa7, 0xf4, 0x4f, 0x27, 0xc8, 0x98, + 0xd4, 0x47, 0x7e, 0x16, 0x4a, 0xa6, 0x65, 0xf9, 0x94, 0x31, 0x2a, 0x4d, 0x4f, 0xa9, 0x3e, 0x2d, + 0xf6, 0xd4, 0x90, 0x88, 0x11, 0x9f, 0x7f, 0x86, 0x1d, 0xab, 0xc5, 0xf8, 0xca, 0x56, 0xae, 0xb1, + 0xfe, 0x0c, 0xb9, 0x12, 0x4e, 0x47, 0x2d, 0x61, 0x7c, 0x73, 0x02, 0x92, 0xba, 0x89, 0x05, 0x33, + 0x3b, 0xfe, 0xf6, 0xf2, 0xb2, 0xd9, 0xec, 0x0c, 0x95, 0x17, 0x38, 0x7b, 0xb0, 0x5f, 0x9d, 0xb9, + 0x9d, 0x44, 0xc0, 0x34, 0xa4, 0xd2, 0x72, 0x9b, 0xee, 0x05, 0xe6, 0xf6, 0x30, 0xa9, 0x81, 0x50, + 0x4b, 0x1c, 0x01, 0xd3, 0x90, 0x3c, 0x74, 0xdf, 0xf1, 0xb7, 0xc3, 0x8f, 0x3c, 0x1d, 0xba, 0xdf, + 0x8e, 0x58, 0x18, 0x97, 0xe3, 0x43, 0xb8, 0xe3, 0x6f, 0x23, 0x35, 0xbb, 0x61, 0x46, 0x5b, 0x0f, + 0xe1, 0x6d, 0x45, 0x47, 0x2d, 0x41, 0x3c, 0x20, 0x3b, 0xe1, 0xe8, 0xe9, 0xe4, 0x92, 0xb2, 0x45, + 0x97, 0xb3, 0xde, 0x46, 0x0b, 0xc5, 0x5f, 0xe8, 0x3c, 0xb7, 0xcd, 0xb7, 0x07, 0x70, 0x30, 0x03, + 0x9b, 0x7c, 0x0d, 0x2e, 0xec, 0xf8, 0xdb, 0xca, 0x90, 0x6f, 0xfa, 0xb6, 0xd3, 0xb4, 0xbd, 0x44, + 0x2a, 0xbb, 0xaa, 0xba, 0x7b, 0xe1, 0x76, 0xb6, 0x18, 0x1e, 0xd6, 0xde, 0x78, 0x1d, 0xa6, 0xe2, + 0xa9, 0xd0, 0xa7, 0x64, 0xb8, 0x8c, 0x7f, 0xcf, 0x41, 0x61, 0xcd, 0xf1, 0xfa, 0x3f, 0x21, 0xa7, + 0x2a, 0x7f, 0x32, 0x01, 0x13, 0xdc, 0x45, 0x23, 0x97, 0x61, 0x22, 0xd8, 0xf3, 0xe4, 0xde, 0x3a, + 0x5e, 0x9f, 0x0b, 0x0d, 0xcd, 0xd6, 0x9e, 0x47, 0x1f, 0xab, 0xbf, 0x28, 0x24, 0xc8, 0xdb, 0x50, + 0x70, 0xfa, 0xbd, 0xfb, 0x66, 0x57, 0x19, 0xa5, 0x57, 0x42, 0xd7, 0x62, 0x5d, 0x50, 0x1f, 0xef, + 0x57, 0xe7, 0xa8, 0xd3, 0x74, 0x2d, 0xdb, 0x69, 0x2f, 0x3e, 0x64, 0xae, 0x53, 0x5b, 0xef, 0xf7, + 0xb6, 0xa9, 0x8f, 0xaa, 0x15, 0x0f, 0x4a, 0xb7, 0x5d, 0xb7, 0xcb, 0x01, 0xc6, 0x93, 0x41, 0x69, + 0x5d, 0x92, 0x31, 0xe4, 0x73, 0x2f, 0x86, 0x05, 0x3e, 0x97, 0x9c, 0x48, 0x7a, 0x31, 0x0d, 0x41, + 0x45, 0xc5, 0x25, 0x3d, 0x28, 0xf4, 0x4c, 0x8f, 0xcb, 0xe5, 0xc5, 0x90, 0x5d, 0x1f, 0xda, 0x8f, + 0xad, 0xdd, 0x15, 0x38, 0xd7, 0x9d, 0xc0, 0xdf, 0x8b, 0xd4, 0x49, 0x22, 0x2a, 0x25, 0xc4, 0x86, + 0xc9, 0xae, 0xcd, 0x02, 0xae, 0xaf, 0x30, 0xc2, 0xaa, 0xe0, 0xfa, 0xee, 0x9b, 0xdd, 0x3e, 0x8d, + 0x46, 0xe0, 0x8e, 0x84, 0xc5, 0x10, 0x7f, 0x7e, 0x0f, 0xca, 0xb1, 0x1e, 0x91, 0x59, 0x99, 0xd5, + 0x15, 0x8b, 0x57, 0x24, 0x72, 0xc9, 0x16, 0xe4, 0x1f, 0x71, 0x0c, 0x65, 0x6c, 0x46, 0xec, 0x09, + 0x4a, 0xb0, 0x37, 0xc7, 0xde, 0xc8, 0xbd, 0x59, 0xfc, 0xce, 0x1f, 0x57, 0x4f, 0x7d, 0xf4, 0x4f, + 0x97, 0x4e, 0x19, 0x7f, 0x3b, 0x0e, 0x25, 0x2d, 0xf2, 0x7f, 0x7b, 0xa5, 0xf8, 0xa9, 0x95, 0x72, + 0x6b, 0xb4, 0xf1, 0x3a, 0xd2, 0x72, 0x59, 0x4a, 0x2e, 0x97, 0xa9, 0xfa, 0x4f, 0xc7, 0xa6, 0xfa, + 0xf1, 0x7e, 0xb5, 0x92, 0x1c, 0x04, 0x34, 0x77, 0xef, 0x52, 0xc6, 0xcc, 0x36, 0x8d, 0x96, 0xc1, + 0x97, 0x9f, 0xb6, 0x0c, 0xe6, 0xe2, 0xcb, 0xa0, 0x94, 0x3d, 0x8d, 0x1f, 0x8d, 0x43, 0x31, 0x4c, + 0x2c, 0x90, 0xdf, 0xc9, 0x41, 0xd9, 0x74, 0x1c, 0x37, 0x10, 0xb9, 0xdd, 0xd0, 0xbc, 0xad, 0x0f, + 0x35, 0x1c, 0x21, 0x68, 0x6d, 0x29, 0x02, 0x94, 0x43, 0xa2, 0x77, 0xa6, 0x18, 0x07, 0xe3, 0x7a, + 0xc9, 0xfb, 0x50, 0xe8, 0x9a, 0xdb, 0xb4, 0x1b, 0x5a, 0xbb, 0xb5, 0xd1, 0x7a, 0x70, 0x47, 0x60, + 0xa5, 0xe6, 0x43, 0x12, 0x51, 0x29, 0x9a, 0x7f, 0x1b, 0x66, 0xd3, 0x1d, 0x7d, 0x96, 0x11, 0xe5, + 0x93, 0x11, 0x53, 0xf3, 0x2c, 0x4d, 0x8d, 0xff, 0x2a, 0x01, 0xac, 0xbb, 0x16, 0x55, 0x89, 0x9b, + 0x79, 0x18, 0xb3, 0x2d, 0xb5, 0x15, 0x81, 0xea, 0xed, 0xd8, 0xda, 0x0a, 0x8e, 0xd9, 0x96, 0x4e, + 0x85, 0x8c, 0x1d, 0x9a, 0x0a, 0xf9, 0x12, 0x94, 0x2d, 0x9b, 0x79, 0x5d, 0x73, 0x6f, 0x3d, 0xc3, + 0x17, 0x58, 0x89, 0x58, 0x18, 0x97, 0x23, 0xaf, 0xa9, 0xef, 0x57, 0x7e, 0x28, 0x95, 0xd4, 0xf7, + 0x5b, 0xe4, 0xdd, 0x8b, 0x7d, 0xc3, 0x6f, 0xc0, 0x54, 0x98, 0x6a, 0x10, 0x5a, 0xf2, 0xa2, 0x55, + 0xf8, 0xd5, 0x4f, 0x6d, 0xc5, 0x78, 0x98, 0x90, 0x4c, 0xa7, 0x42, 0x0a, 0x27, 0x92, 0x0a, 0x59, + 0x81, 0x59, 0x16, 0xb8, 0x3e, 0xb5, 0x42, 0x89, 0xb5, 0x95, 0x0a, 0x49, 0xbc, 0xe8, 0x6c, 0x23, + 0xc5, 0xc7, 0x81, 0x16, 0x64, 0x13, 0xe6, 0xc2, 0x4e, 0xc4, 0x5f, 0xb0, 0x72, 0x56, 0x20, 0x5d, + 0x54, 0x48, 0x73, 0x0f, 0x32, 0x64, 0x30, 0xb3, 0x25, 0xf9, 0x0a, 0x4c, 0x87, 0xdd, 0x6c, 0x34, + 0x5d, 0x8f, 0x56, 0xe6, 0x04, 0x94, 0xf6, 0x96, 0xb7, 0xe2, 0x4c, 0x4c, 0xca, 0x92, 0x2f, 0x40, + 0xde, 0xeb, 0x98, 0x8c, 0xaa, 0xcc, 0x49, 0x18, 0xf8, 0xe6, 0x37, 0x39, 0xf1, 0xf1, 0x7e, 0xb5, + 0xc4, 0xe7, 0x4c, 0x3c, 0xa0, 0x14, 0x24, 0x57, 0x01, 0xb6, 0xdd, 0xbe, 0x63, 0x99, 0xfe, 0xde, + 0xda, 0x8a, 0x4a, 0x62, 0x6a, 0xd7, 0xa3, 0xae, 0x39, 0x18, 0x93, 0xe2, 0xd6, 0xb6, 0x27, 0xed, + 0x8e, 0x4a, 0x80, 0x68, 0x6b, 0xab, 0xcd, 0x91, 0xe2, 0x93, 0x77, 0xa1, 0x24, 0x12, 0xbe, 0xd4, + 0x5a, 0x0a, 0x54, 0x16, 0xe4, 0x59, 0x72, 0x83, 0xda, 0x25, 0x69, 0x84, 0x20, 0x18, 0xe1, 0x91, + 0xaf, 0x03, 0xb4, 0x6c, 0xc7, 0x66, 0x1d, 0x81, 0x5e, 0x7e, 0x66, 0x74, 0xfd, 0x9e, 0xab, 0x1a, + 0x05, 0x63, 0x88, 0x3c, 0x60, 0xf2, 0x5c, 0x6b, 0x6d, 0xb3, 0x32, 0x25, 0xde, 0x52, 0x07, 0x4c, + 0x9b, 0x9c, 0x88, 0x92, 0x47, 0x2e, 0x43, 0xd1, 0x32, 0x69, 0xcf, 0x75, 0xa8, 0x55, 0x99, 0x8e, + 0x92, 0x16, 0x2b, 0x8a, 0x86, 0x9a, 0x4b, 0xbe, 0x01, 0x05, 0x5b, 0xf8, 0x8b, 0x95, 0xd3, 0xa2, + 0xab, 0x5f, 0x19, 0x6e, 0x47, 0x11, 0x10, 0x75, 0xe0, 0xe6, 0x4a, 0xfe, 0x8f, 0x0a, 0x96, 0x34, + 0x61, 0xd2, 0xed, 0x07, 0x42, 0xc3, 0x8c, 0xd0, 0x30, 0x5c, 0x92, 0x66, 0x43, 0x62, 0xc8, 0xea, + 0x0c, 0xf5, 0x80, 0x21, 0x32, 0x7f, 0xdf, 0x66, 0xc7, 0xee, 0x5a, 0x3e, 0x75, 0x2a, 0xb3, 0x22, + 0x1e, 0x13, 0xef, 0xbb, 0xac, 0x68, 0xa8, 0xb9, 0xe4, 0xe7, 0x61, 0xda, 0xed, 0x07, 0x62, 0xdd, + 0xf0, 0x65, 0xc7, 0x2a, 0x67, 0x84, 0xf8, 0x19, 0xbe, 0x8a, 0x37, 0xe2, 0x0c, 0x4c, 0xca, 0x19, + 0xa7, 0x61, 0x2a, 0x5e, 0xd2, 0x64, 0xfc, 0x51, 0x0e, 0xca, 0xb1, 0x93, 0x70, 0xe2, 0x42, 0xc9, + 0x6d, 0x34, 0xea, 0xfd, 0xe6, 0x8e, 0x0e, 0xd0, 0xde, 0x1e, 0xf6, 0x78, 0x5d, 0xa2, 0x44, 0x0b, + 0x4d, 0x93, 0x30, 0xd2, 0xf1, 0xb4, 0x23, 0xf2, 0xbf, 0x1a, 0x83, 0xa8, 0x1d, 0x8f, 0xa0, 0xa8, + 0x63, 0x79, 0xae, 0xed, 0x04, 0xe9, 0x93, 0xd8, 0xeb, 0x8a, 0x8e, 0x5a, 0x82, 0xbb, 0x23, 0xdb, + 0xf2, 0x45, 0xc6, 0x92, 0xee, 0x88, 0xea, 0x85, 0xe2, 0x92, 0x0e, 0xcc, 0x98, 0xe2, 0x6c, 0x23, + 0xca, 0x93, 0x8c, 0x3f, 0x53, 0x9e, 0x44, 0x9f, 0x97, 0x27, 0x51, 0x30, 0x0d, 0xcb, 0x35, 0xb1, + 0xa8, 0xb9, 0xd0, 0x34, 0x31, 0x94, 0xa6, 0x46, 0x12, 0x05, 0xd3, 0xb0, 0xc6, 0xb7, 0xc6, 0x20, + 0x5c, 0x5f, 0x3f, 0x09, 0x21, 0x14, 0x31, 0xa0, 0xe0, 0x53, 0xd6, 0xef, 0x06, 0x6a, 0x07, 0x16, + 0xdf, 0x30, 0x0a, 0x0a, 0x2a, 0x8e, 0xb1, 0x0b, 0xd3, 0xbc, 0xb7, 0xdd, 0x2e, 0xed, 0x36, 0x02, + 0xea, 0x31, 0xd2, 0x82, 0x3c, 0xe3, 0xff, 0xa8, 0x31, 0x19, 0xf1, 0xac, 0x32, 0xa0, 0x5e, 0x64, + 0xc7, 0x84, 0x02, 0x94, 0xf0, 0xc6, 0xb7, 0xc7, 0xa0, 0xa4, 0xc7, 0xe9, 0x08, 0xc7, 0x2b, 0x2f, + 0xc3, 0xa4, 0x45, 0x5b, 0x26, 0x7f, 0x1b, 0xf5, 0x5d, 0x70, 0x73, 0xb1, 0x22, 0x49, 0x18, 0xf2, + 0x48, 0x35, 0xf4, 0x70, 0xe4, 0x2b, 0x8b, 0x54, 0x66, 0x3c, 0x80, 0x20, 0x3b, 0x50, 0x12, 0xff, + 0xac, 0x86, 0x35, 0x74, 0xc3, 0xce, 0xfb, 0xfd, 0x10, 0x45, 0x26, 0x88, 0xf4, 0x23, 0x46, 0xf8, + 0xa9, 0xda, 0xb7, 0xfc, 0x51, 0x6a, 0xdf, 0x8c, 0x55, 0xe0, 0x06, 0xff, 0xc6, 0x32, 0x79, 0x0b, + 0x8a, 0x4c, 0x99, 0x24, 0x35, 0x2e, 0x9f, 0xd7, 0xe7, 0xb5, 0x8a, 0xfe, 0x78, 0xbf, 0x3a, 0x2d, + 0x84, 0x43, 0x02, 0xea, 0x26, 0xc6, 0x22, 0x94, 0x63, 0xb5, 0x42, 0x7c, 0x84, 0xf5, 0x11, 0x7b, + 0x6c, 0x84, 0x57, 0xcc, 0xc0, 0x44, 0xc1, 0x31, 0x1e, 0x8f, 0xc1, 0x2c, 0x52, 0xe6, 0xf6, 0xfd, + 0x26, 0x8d, 0xa7, 0xeb, 0xcd, 0x66, 0xac, 0xca, 0x23, 0x71, 0x38, 0xe7, 0x3a, 0xa8, 0xb8, 0xdc, + 0x8d, 0xe8, 0x51, 0xbf, 0xad, 0x8d, 0xa8, 0x9a, 0x24, 0xed, 0x46, 0xdc, 0x8d, 0x33, 0x31, 0x29, + 0xcb, 0x4d, 0x58, 0xcf, 0x74, 0xec, 0x16, 0x65, 0x41, 0x3a, 0x8f, 0x76, 0x57, 0xd1, 0x51, 0x4b, + 0x90, 0x1b, 0x70, 0x86, 0xd1, 0x60, 0x63, 0xd7, 0xa1, 0xbe, 0x3e, 0x34, 0x54, 0xa7, 0xc8, 0x2f, + 0x84, 0x27, 0xd3, 0x8d, 0xb4, 0x00, 0x0e, 0xb6, 0x11, 0x2e, 0x99, 0x3c, 0xc0, 0x5d, 0x76, 0x1d, + 0xcb, 0xd6, 0x65, 0x92, 0x71, 0x97, 0x2c, 0xc5, 0xc7, 0x81, 0x16, 0x1c, 0xa5, 0x65, 0xda, 0xdd, + 0xbe, 0x4f, 0x23, 0x94, 0x42, 0x12, 0x65, 0x35, 0xc5, 0xc7, 0x81, 0x16, 0xc6, 0xbf, 0xe4, 0x60, + 0x1a, 0x69, 0xe0, 0xef, 0xe9, 0x41, 0xa9, 0x42, 0xbe, 0x2b, 0xce, 0x8b, 0x73, 0xe2, 0xbc, 0x58, + 0xac, 0x64, 0x79, 0x3c, 0x2c, 0xe9, 0x64, 0x05, 0xca, 0x3e, 0x6f, 0xa1, 0xce, 0xe6, 0xe5, 0x80, + 0x1b, 0xa1, 0x97, 0x8d, 0x11, 0xeb, 0x71, 0xf2, 0x11, 0xe3, 0xcd, 0x88, 0x03, 0x93, 0xdb, 0xb2, + 0xa6, 0x47, 0x19, 0xf8, 0xe1, 0x36, 0x71, 0x55, 0x17, 0x24, 0x72, 0x6b, 0x61, 0x91, 0xd0, 0xe3, + 0xe8, 0x5f, 0x0c, 0x95, 0x18, 0xdf, 0xc9, 0x01, 0x44, 0x95, 0x8b, 0x64, 0x07, 0x8a, 0xec, 0x5a, + 0x62, 0x6b, 0x1d, 0xf2, 0x28, 0x4d, 0x81, 0xc4, 0x6a, 0x1a, 0x14, 0x05, 0xb5, 0x82, 0xa7, 0xed, + 0xab, 0x7f, 0x31, 0x0e, 0xba, 0xd5, 0x73, 0xda, 0x56, 0x5f, 0xe1, 0x26, 0xb9, 0x1d, 0xd5, 0x36, + 0x69, 0x39, 0x14, 0x54, 0x54, 0x5c, 0xee, 0xf5, 0x84, 0xc9, 0x7f, 0xb5, 0xb4, 0x85, 0xd7, 0x13, + 0x9e, 0x13, 0xa0, 0xe6, 0x66, 0x6d, 0xd4, 0xf9, 0x13, 0xdb, 0xa8, 0x0b, 0xcf, 0x65, 0xa3, 0xe6, + 0x0e, 0xbf, 0xef, 0x76, 0xe9, 0x12, 0xae, 0xab, 0xc0, 0x42, 0x3b, 0xfc, 0x28, 0xc9, 0x18, 0xf2, + 0x8d, 0xdf, 0xcb, 0xc1, 0xe9, 0x46, 0xd3, 0xb7, 0xbd, 0x40, 0x9b, 0xac, 0x75, 0x51, 0x91, 0x18, + 0x98, 0xdc, 0x15, 0x57, 0x6b, 0xea, 0xc5, 0x43, 0x72, 0xc3, 0x52, 0x28, 0x51, 0xb0, 0x28, 0x49, + 0x18, 0x41, 0x88, 0x0c, 0x8e, 0x30, 0x8a, 0xe9, 0xb9, 0x6d, 0x08, 0x2a, 0x2a, 0xae, 0xf1, 0xdd, + 0x1c, 0x14, 0xf5, 0x89, 0xed, 0x4b, 0x90, 0x17, 0x07, 0x7c, 0x6a, 0xed, 0xe8, 0x3d, 0x70, 0x99, + 0x13, 0x51, 0xf2, 0xb8, 0x90, 0x88, 0x2e, 0x14, 0x70, 0x6c, 0xa3, 0x34, 0xfd, 0x00, 0x25, 0x8f, + 0x2f, 0x5a, 0xea, 0x58, 0x6a, 0xbd, 0xe8, 0x45, 0x7b, 0xdd, 0xb1, 0x90, 0xd3, 0x45, 0x21, 0x9b, + 0xeb, 0xf7, 0xcc, 0x20, 0x9d, 0x5f, 0x5a, 0x15, 0x54, 0x54, 0x5c, 0xe3, 0x1d, 0x98, 0x51, 0xa5, + 0x35, 0x7a, 0xa0, 0x9e, 0xa9, 0x86, 0xcf, 0xf8, 0x51, 0x0e, 0xca, 0x5b, 0x5b, 0x77, 0xb4, 0x7d, + 0x42, 0x38, 0xcf, 0x64, 0x2d, 0xcd, 0x52, 0x2b, 0xa0, 0xfe, 0xb2, 0xdb, 0xf3, 0xba, 0x54, 0x63, + 0xa9, 0x02, 0x97, 0x46, 0xa6, 0x04, 0x1e, 0xd2, 0x92, 0xac, 0xc1, 0xd9, 0x38, 0x47, 0x59, 0x5f, + 0x55, 0x34, 0x28, 0x8f, 0xde, 0x06, 0xd9, 0x98, 0xd5, 0x26, 0x0d, 0xa5, 0x4c, 0xb0, 0xaa, 0xa9, + 0x1f, 0x80, 0x52, 0x6c, 0xcc, 0x6a, 0x63, 0x4c, 0x43, 0x39, 0x76, 0xa1, 0xc2, 0xf8, 0xbb, 0x0b, + 0xa0, 0x2b, 0x3a, 0x8e, 0xbd, 0x2e, 0xe4, 0xc7, 0x52, 0xa6, 0xd1, 0xd4, 0x91, 0x62, 0x7e, 0xf4, + 0x48, 0x51, 0x2f, 0xc0, 0x54, 0xb4, 0xd8, 0x8e, 0xa2, 0xc5, 0xc2, 0x31, 0x44, 0x8b, 0xda, 0x24, + 0x0c, 0x44, 0x8c, 0xbf, 0x9f, 0x83, 0x29, 0xc7, 0xb5, 0x68, 0x68, 0x78, 0x2a, 0x93, 0xc2, 0x93, + 0xdd, 0x18, 0x69, 0x10, 0x6b, 0xeb, 0x31, 0x44, 0x99, 0xc5, 0xd3, 0xa9, 0xa6, 0x38, 0x0b, 0x13, + 0xaa, 0xc9, 0x2a, 0x14, 0xcd, 0x16, 0x0f, 0xf1, 0x83, 0x3d, 0x55, 0x29, 0x72, 0x31, 0xcb, 0x14, + 0x2d, 0x29, 0x19, 0x69, 0xe5, 0xc3, 0x27, 0xd4, 0x6d, 0xf9, 0x36, 0xa9, 0x8b, 0x24, 0x4b, 0x23, + 0x6c, 0x93, 0x61, 0x3a, 0x32, 0xe6, 0x60, 0x85, 0x05, 0x5d, 0x51, 0xcd, 0xa4, 0x01, 0x05, 0x99, + 0x44, 0x10, 0x19, 0x94, 0xa2, 0x8c, 0x1b, 0x64, 0x82, 0x01, 0x15, 0x87, 0xb4, 0xc3, 0x30, 0xa1, + 0x2c, 0x06, 0xb7, 0x3e, 0x74, 0xe8, 0xa4, 0x23, 0x8f, 0xec, 0x38, 0x81, 0xdc, 0x8a, 0x5b, 0xf3, + 0xa9, 0xa3, 0x58, 0xf3, 0xe9, 0x43, 0x2d, 0x79, 0x1b, 0x0a, 0x4c, 0xec, 0x15, 0x22, 0x73, 0x52, + 0xbe, 0xba, 0x3c, 0x9c, 0xab, 0x91, 0xd8, 0x6e, 0xe4, 0xe8, 0x48, 0x1a, 0x2a, 0x78, 0xe2, 0x42, + 0xd1, 0x57, 0x9e, 0xb4, 0x4a, 0xbe, 0x0c, 0x77, 0xf0, 0x93, 0x76, 0xc7, 0xe5, 0xfa, 0x08, 0xa9, + 0xa8, 0x95, 0x90, 0x77, 0x61, 0xdc, 0x32, 0xdb, 0x2a, 0x0d, 0xf3, 0xd5, 0xa1, 0x6b, 0x65, 0x42, + 0x35, 0xa2, 0xf6, 0x7f, 0x65, 0xe9, 0x06, 0x72, 0x54, 0xb2, 0x13, 0x15, 0x6b, 0xce, 0x8e, 0x50, + 0x52, 0x9f, 0xda, 0x7e, 0x64, 0x00, 0x37, 0x50, 0xee, 0x79, 0x1d, 0x26, 0x1f, 0xb9, 0xdd, 0x7e, + 0x4f, 0xe5, 0x6f, 0xca, 0x57, 0xe7, 0xb3, 0x66, 0xfb, 0xbe, 0x10, 0x89, 0x8c, 0x80, 0x7c, 0x66, + 0x18, 0xb6, 0x25, 0xbf, 0x95, 0x83, 0xd3, 0xfc, 0xd3, 0xd1, 0xeb, 0x80, 0x55, 0xc8, 0x08, 0x2b, + 0xf5, 0x1e, 0xe3, 0xfb, 0x54, 0xb8, 0xc2, 0xce, 0x2b, 0xb5, 0xa7, 0xd7, 0x12, 0x1a, 0x30, 0xa5, + 0x91, 0x78, 0x50, 0x64, 0xb6, 0x45, 0x9b, 0xa6, 0xcf, 0x2a, 0x67, 0x8f, 0x4d, 0x7b, 0xe4, 0xe1, + 0x2a, 0x6c, 0xd4, 0x5a, 0xc8, 0x6f, 0x8b, 0x6b, 0x10, 0xea, 0x96, 0x91, 0xba, 0xf9, 0x35, 0x77, + 0x9c, 0x37, 0xbf, 0xce, 0xca, 0x3b, 0x10, 0x09, 0x0d, 0x98, 0x56, 0x49, 0x36, 0xe0, 0x9c, 0x2c, + 0xda, 0x4c, 0x57, 0xec, 0x9e, 0x13, 0x47, 0x73, 0x2f, 0x1c, 0xec, 0x57, 0xcf, 0x2d, 0x65, 0x09, + 0x60, 0x76, 0x3b, 0xf2, 0x21, 0x4c, 0xfb, 0xf1, 0xe8, 0xa8, 0x72, 0x7e, 0x84, 0xba, 0x90, 0x44, + 0x9c, 0x25, 0xf3, 0x83, 0x09, 0x12, 0x26, 0x75, 0x91, 0x2b, 0x50, 0xf6, 0x94, 0xa5, 0xb2, 0x59, + 0xaf, 0x72, 0x41, 0xbc, 0x83, 0xd8, 0x51, 0x37, 0x23, 0x32, 0xc6, 0x65, 0xc8, 0x3d, 0x28, 0x07, + 0x6e, 0x97, 0xfa, 0xea, 0x0c, 0xab, 0x22, 0x26, 0x7f, 0x21, 0x6b, 0x25, 0x6f, 0x69, 0xb1, 0xe8, + 0x84, 0x24, 0xa2, 0x31, 0x8c, 0xe3, 0xf0, 0x28, 0x3b, 0x2c, 0xd0, 0xf6, 0x45, 0x4a, 0xe1, 0x85, + 0x64, 0x94, 0xdd, 0x88, 0x33, 0x31, 0x29, 0xcb, 0xe3, 0x66, 0xcf, 0xb7, 0x5d, 0xdf, 0x0e, 0xf6, + 0x96, 0xbb, 0x26, 0x63, 0x02, 0x60, 0x5e, 0x00, 0xe8, 0xb8, 0x79, 0x33, 0x2d, 0x80, 0x83, 0x6d, + 0x78, 0x70, 0x12, 0x12, 0x2b, 0x9f, 0x13, 0xfe, 0x94, 0x30, 0x4b, 0x61, 0x5b, 0xd4, 0xdc, 0x43, + 0xaa, 0xe4, 0x2e, 0x0e, 0x53, 0x25, 0x47, 0x2c, 0xb8, 0x68, 0xf6, 0x03, 0xb7, 0xc7, 0x09, 0xc9, + 0x26, 0x5b, 0xee, 0x0e, 0x75, 0x2a, 0x97, 0xc4, 0x5e, 0x75, 0xe9, 0x60, 0xbf, 0x7a, 0x71, 0xe9, + 0x09, 0x72, 0xf8, 0x44, 0x14, 0xd2, 0x83, 0x22, 0x55, 0x95, 0x7e, 0x95, 0xcf, 0x8f, 0xb0, 0x49, + 0x24, 0xcb, 0x05, 0xe5, 0x00, 0x85, 0x34, 0xd4, 0x2a, 0xc8, 0x16, 0x94, 0x3b, 0x2e, 0x0b, 0x96, + 0xba, 0xb6, 0xc9, 0x28, 0xab, 0xbc, 0x28, 0xd6, 0x49, 0xe6, 0xfe, 0x76, 0x33, 0x14, 0x8b, 0x96, + 0xc9, 0xcd, 0xa8, 0x25, 0xc6, 0x61, 0x08, 0x15, 0x91, 0x5a, 0x5f, 0xcc, 0x9a, 0xeb, 0x04, 0xf4, + 0x83, 0xa0, 0xb2, 0x20, 0xde, 0xe5, 0x95, 0x2c, 0xe4, 0x4d, 0xd7, 0x6a, 0x24, 0xa5, 0xe5, 0x57, + 0x9e, 0x22, 0x62, 0x1a, 0x93, 0xbc, 0x01, 0x53, 0x9e, 0x6b, 0x35, 0x3c, 0xda, 0xdc, 0x34, 0x83, + 0x66, 0xa7, 0x52, 0x4d, 0x9e, 0xc0, 0x6d, 0xc6, 0x78, 0x98, 0x90, 0xe4, 0xce, 0xb9, 0x4f, 0x59, + 0x7f, 0xbb, 0x67, 0x07, 0x9b, 0xd4, 0xb1, 0x6c, 0xa7, 0xbd, 0xe9, 0x5a, 0xac, 0x62, 0x88, 0x29, + 0x14, 0xce, 0x39, 0x0e, 0xb2, 0x31, 0xab, 0xcd, 0xfc, 0x3b, 0x70, 0x66, 0xc0, 0x35, 0x7b, 0xa6, + 0x93, 0xcf, 0x3f, 0xe5, 0x71, 0x4d, 0xcc, 0x19, 0x3e, 0x6e, 0x8f, 0xfe, 0x06, 0x9c, 0x51, 0x97, + 0xc0, 0xf9, 0xbe, 0xdd, 0xed, 0xeb, 0x9b, 0x4d, 0xb1, 0x74, 0x15, 0xa6, 0x05, 0x70, 0xb0, 0x8d, + 0xf1, 0x67, 0x39, 0x98, 0x4e, 0xec, 0x04, 0xc7, 0x1e, 0xe9, 0xae, 0x02, 0xe9, 0xd9, 0xbe, 0xef, + 0xfa, 0x72, 0x3b, 0xbd, 0xcb, 0x3f, 0x0b, 0xa6, 0x2e, 0x48, 0x89, 0xa2, 0xa9, 0xbb, 0x03, 0x5c, + 0xcc, 0x68, 0x61, 0xfc, 0x75, 0x0e, 0xa2, 0x7c, 0xa8, 0xae, 0x14, 0xcc, 0x1d, 0x5a, 0x29, 0xf8, + 0x1a, 0x14, 0x1f, 0x32, 0xd7, 0xd9, 0x8c, 0xea, 0x09, 0xf5, 0x80, 0xde, 0x6a, 0x6c, 0xac, 0x0b, + 0x49, 0x2d, 0x21, 0xa4, 0xdf, 0x5f, 0xb5, 0xbb, 0xc1, 0x60, 0xd5, 0xdd, 0xad, 0x5f, 0x94, 0x74, + 0xd4, 0x12, 0x64, 0x11, 0x4a, 0x3a, 0x05, 0xaf, 0x42, 0x64, 0x3d, 0x08, 0x3a, 0xff, 0x8c, 0x91, + 0x8c, 0xf1, 0xbd, 0x31, 0x28, 0x9e, 0xe0, 0x6d, 0xaf, 0x66, 0xe2, 0xb6, 0xd7, 0x31, 0x5c, 0x0d, + 0xca, 0xba, 0xe9, 0xb5, 0x93, 0xba, 0xe9, 0xb5, 0x3c, 0x62, 0x56, 0xff, 0x89, 0xb7, 0xbc, 0x3e, + 0xc9, 0xc1, 0xd4, 0x09, 0xde, 0xf0, 0xda, 0x4e, 0xde, 0xf0, 0x7a, 0x6b, 0xa4, 0x57, 0x3b, 0xe4, + 0x76, 0xd7, 0x5f, 0x9e, 0x83, 0xc4, 0xcd, 0x2a, 0xe2, 0x40, 0x29, 0xfc, 0xc0, 0xc3, 0x93, 0x92, + 0xb7, 0x46, 0x8a, 0x2f, 0xa3, 0x45, 0x19, 0x52, 0x18, 0x46, 0x2a, 0xc8, 0x55, 0x00, 0xca, 0x2d, + 0x9b, 0xcc, 0x47, 0x8e, 0x25, 0x0f, 0x12, 0xae, 0x6b, 0x0e, 0xc6, 0xa4, 0x4e, 0xfe, 0x8a, 0x49, + 0xf6, 0x6e, 0x3f, 0xf1, 0x5c, 0x76, 0xfb, 0x8b, 0xc7, 0xbe, 0xdb, 0xbf, 0xf8, 0xfc, 0x77, 0xfb, + 0x58, 0x6c, 0x93, 0x1f, 0x21, 0xb6, 0xf9, 0x10, 0xe6, 0xe4, 0xbf, 0xcb, 0x5d, 0xd3, 0xee, 0xe9, + 0xf5, 0xa2, 0x4a, 0xfe, 0x5e, 0xcd, 0xdc, 0xe3, 0xa9, 0xcf, 0x6c, 0x16, 0x50, 0x27, 0xb8, 0x1f, + 0xb5, 0x8c, 0xea, 0x45, 0xee, 0x67, 0xc0, 0x61, 0xa6, 0x92, 0xb4, 0x33, 0x3c, 0x79, 0x04, 0x67, + 0xf8, 0xbb, 0x39, 0x38, 0x67, 0x66, 0x5d, 0x1e, 0x57, 0x29, 0x91, 0x5b, 0x23, 0x85, 0x26, 0x09, + 0x44, 0x15, 0x5a, 0x64, 0xb1, 0x30, 0xbb, 0x0f, 0xe4, 0xe5, 0x28, 0xba, 0x2d, 0x89, 0x45, 0x95, + 0x1d, 0x97, 0x7e, 0x33, 0x9d, 0x55, 0x02, 0x31, 0xda, 0x8d, 0x91, 0x0d, 0xf6, 0x31, 0x64, 0x96, + 0xca, 0x23, 0x64, 0x96, 0x52, 0x91, 0xca, 0xd4, 0x31, 0x45, 0x2a, 0x0e, 0xcc, 0xda, 0x3d, 0xb3, + 0x4d, 0x37, 0xfb, 0xdd, 0xae, 0xcc, 0xea, 0xb3, 0xca, 0xb4, 0xc0, 0xce, 0xac, 0xd3, 0xe6, 0x91, + 0x63, 0x37, 0x7d, 0x11, 0x50, 0x9f, 0x9f, 0xad, 0xa5, 0x90, 0x70, 0x00, 0x9b, 0x2f, 0x4b, 0xee, + 0x01, 0xaf, 0xd3, 0x80, 0x8f, 0xb6, 0x48, 0xba, 0xa8, 0x5f, 0xe0, 0xb8, 0x19, 0x91, 0x31, 0x2e, + 0x43, 0x6e, 0x43, 0xc9, 0x72, 0x98, 0x3a, 0x3d, 0x9b, 0x11, 0x56, 0xea, 0x75, 0x6e, 0xdb, 0x56, + 0xd6, 0x1b, 0xfa, 0xdc, 0xec, 0xe2, 0xe0, 0xaf, 0x11, 0xd5, 0x34, 0x1f, 0xa3, 0xf6, 0xe4, 0xae, + 0x00, 0x53, 0x97, 0x16, 0x64, 0x96, 0xe4, 0xd2, 0x21, 0xce, 0xf6, 0xca, 0x7a, 0x78, 0xc7, 0x62, + 0x5a, 0xa9, 0x53, 0x57, 0x11, 0x22, 0x84, 0xd8, 0xed, 0xaa, 0x33, 0x4f, 0xba, 0x5d, 0x45, 0xee, + 0xc1, 0x85, 0x20, 0xe8, 0x26, 0x32, 0xd9, 0xaa, 0x9e, 0x48, 0x14, 0x97, 0xe5, 0xe5, 0xe5, 0xd8, + 0xad, 0xad, 0x3b, 0x59, 0x22, 0x78, 0x58, 0x5b, 0x91, 0x85, 0x0e, 0xba, 0x3a, 0xd8, 0x5e, 0x18, + 0x25, 0x0b, 0x1d, 0x1d, 0x19, 0xa8, 0x2c, 0x74, 0x44, 0xc0, 0xb8, 0x96, 0xc3, 0x93, 0x06, 0x67, + 0x87, 0x4c, 0x1a, 0xc4, 0xe3, 0xd4, 0xb9, 0x27, 0xc6, 0xa9, 0x03, 0x71, 0xf5, 0xb9, 0x67, 0x88, + 0xab, 0xdf, 0x15, 0x65, 0x5b, 0x37, 0x96, 0x55, 0x4e, 0xe2, 0xcd, 0xe1, 0x52, 0xa1, 0x1c, 0x41, + 0x1e, 0xf2, 0x8a, 0x7f, 0x51, 0x62, 0x92, 0x4d, 0x98, 0xf3, 0x5c, 0x6b, 0x20, 0x2c, 0x17, 0x49, + 0x88, 0x58, 0xc1, 0xdf, 0x66, 0x86, 0x0c, 0x66, 0xb6, 0x14, 0x06, 0x3c, 0xa2, 0x57, 0x2a, 0x62, + 0x60, 0xa4, 0x01, 0x8f, 0xc8, 0x18, 0x97, 0x49, 0x47, 0xa9, 0x2f, 0x3c, 0xb7, 0x28, 0x75, 0xfe, + 0x04, 0xa2, 0xd4, 0xcf, 0x1d, 0x39, 0x4a, 0xfd, 0x75, 0x38, 0xeb, 0xb9, 0xd6, 0x8a, 0xcd, 0xfc, + 0xbe, 0xf8, 0xf5, 0x9f, 0x7a, 0xdf, 0x6a, 0xd3, 0x40, 0x84, 0xb9, 0xe5, 0xab, 0x57, 0xe3, 0x9d, + 0x94, 0x3f, 0x42, 0x56, 0x53, 0x3f, 0x42, 0x26, 0x3e, 0xf2, 0x54, 0x2b, 0xe1, 0x9a, 0x8b, 0xc8, + 0x36, 0x83, 0x89, 0x59, 0x7a, 0x46, 0x8f, 0x6c, 0xff, 0xa6, 0x04, 0xa7, 0x53, 0x17, 0xb2, 0x75, + 0xc1, 0x66, 0xee, 0xa8, 0x05, 0x9b, 0x89, 0x8a, 0xca, 0xb1, 0xe7, 0x5a, 0x51, 0x39, 0x7e, 0xec, + 0x15, 0x95, 0xb1, 0xca, 0xd1, 0x89, 0xa7, 0x54, 0x8e, 0x2e, 0xc1, 0x4c, 0xd3, 0xed, 0x79, 0xe2, + 0x66, 0x97, 0xaa, 0x1f, 0x94, 0xb5, 0x20, 0xfa, 0xd8, 0x7a, 0x39, 0xc9, 0xc6, 0xb4, 0x3c, 0xf9, + 0x35, 0xc8, 0x3b, 0xa2, 0x61, 0x61, 0x84, 0x92, 0xf5, 0xe4, 0x84, 0x09, 0xe7, 0x40, 0x55, 0x8d, + 0x87, 0x59, 0xe7, 0xbc, 0xa0, 0x3d, 0x0e, 0xff, 0x41, 0xa9, 0x94, 0xbc, 0x07, 0x15, 0xb7, 0xd5, + 0xea, 0xba, 0xa6, 0x15, 0xd5, 0x71, 0xdf, 0xe7, 0x6e, 0x9f, 0x3a, 0xc7, 0x29, 0xd5, 0x2f, 0x29, + 0x80, 0xca, 0xc6, 0x21, 0x72, 0x78, 0x28, 0x02, 0xf7, 0xe1, 0x66, 0x92, 0xd5, 0xc8, 0xac, 0x52, + 0x12, 0xaf, 0xf9, 0x4b, 0xc7, 0xf1, 0x9a, 0xc9, 0xd2, 0x67, 0xf5, 0xc2, 0x51, 0xc1, 0x40, 0x92, + 0x8b, 0xe9, 0x9e, 0x10, 0x1f, 0xce, 0x7b, 0x59, 0x1e, 0x2e, 0x53, 0x67, 0x7f, 0x4f, 0xf2, 0xb3, + 0x17, 0x94, 0x96, 0xf3, 0x99, 0x3e, 0x32, 0xc3, 0x43, 0x90, 0xe3, 0xd5, 0xaf, 0xc5, 0xe7, 0x55, + 0xfd, 0x3a, 0xbf, 0x27, 0xab, 0xf2, 0x0f, 0x2d, 0xe8, 0xbf, 0x97, 0xbc, 0x64, 0xf3, 0xce, 0x90, + 0xbf, 0xe7, 0x17, 0xce, 0x76, 0xfc, 0x32, 0xc1, 0x6f, 0xe6, 0x60, 0x2e, 0x6b, 0x5a, 0x32, 0x7a, + 0xd1, 0x48, 0xf6, 0x62, 0xb4, 0x48, 0x38, 0x6e, 0xc1, 0xbe, 0x55, 0x88, 0xc5, 0xdd, 0x01, 0xf5, + 0xfe, 0xff, 0x67, 0x18, 0x86, 0x3a, 0xdf, 0x4f, 0xfc, 0xa0, 0x42, 0xfe, 0x04, 0x7f, 0x50, 0xa1, + 0x30, 0xc4, 0x0f, 0x2a, 0x4c, 0x9e, 0xe4, 0x0f, 0x2a, 0x14, 0x8f, 0xf8, 0x83, 0x0a, 0xa5, 0xff, + 0x3d, 0x3f, 0xa8, 0xf0, 0x59, 0x0e, 0x66, 0xd3, 0xf7, 0x3b, 0x4e, 0x20, 0x4f, 0xb9, 0x93, 0xc8, + 0x53, 0xae, 0x8d, 0x64, 0xf4, 0xf5, 0x9d, 0x92, 0x43, 0xf2, 0x95, 0xc6, 0x0f, 0x73, 0x30, 0x70, + 0x87, 0xe5, 0x04, 0x52, 0x89, 0x0f, 0x93, 0xa9, 0xc4, 0xeb, 0xc7, 0xf2, 0x92, 0x87, 0xa4, 0x14, + 0x7f, 0x94, 0xf1, 0x8a, 0x3f, 0x96, 0xd4, 0xe2, 0x49, 0x9b, 0xc0, 0x7a, 0xed, 0xe3, 0xcf, 0x16, + 0x4e, 0x7d, 0xf2, 0xd9, 0xc2, 0xa9, 0x4f, 0x3f, 0x5b, 0x38, 0xf5, 0xd1, 0xc1, 0x42, 0xee, 0xe3, + 0x83, 0x85, 0xdc, 0x27, 0x07, 0x0b, 0xb9, 0x4f, 0x0f, 0x16, 0x72, 0x3f, 0x3c, 0x58, 0xc8, 0xfd, + 0xe1, 0x3f, 0x2f, 0x9c, 0xfa, 0xe5, 0x62, 0x88, 0xfb, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x3b, + 0xfa, 0x8a, 0xb5, 0xbb, 0x58, 0x00, 0x00, } func (m *ArchiveStrategy) Marshal() (dAtA []byte, err error) { @@ -4372,6 +4374,18 @@ func (m *Template) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.ResubmitPendingPods != nil { + i-- + if *m.ResubmitPendingPods { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x2 + i-- + dAtA[i] = 0x90 + } if m.Executor != nil { { size, err := m.Executor.MarshalToSizedBuffer(dAtA[:i]) @@ -6739,6 +6753,9 @@ func (m *Template) Size() (n int) { l = m.Executor.Size() n += 2 + l + sovGenerated(uint64(l)) } + if m.ResubmitPendingPods != nil { + n += 3 + } return n } @@ -7760,6 +7777,7 @@ func (this *Template) String() string { `PodSpecPatch:` + fmt.Sprintf("%v", this.PodSpecPatch) + `,`, `AutomountServiceAccountToken:` + valueToStringGenerated(this.AutomountServiceAccountToken) + `,`, `Executor:` + strings.Replace(this.Executor.String(), "ExecutorConfig", "ExecutorConfig", 1) + `,`, + `ResubmitPendingPods:` + valueToStringGenerated(this.ResubmitPendingPods) + `,`, `}`, }, "") return s @@ -16944,6 +16962,27 @@ func (m *Template) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 34: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ResubmitPendingPods", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.ResubmitPendingPods = &b default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/pkg/apis/workflow/v1alpha1/generated.proto b/pkg/apis/workflow/v1alpha1/generated.proto index 19e219f0e03f..094c96b7ac23 100644 --- a/pkg/apis/workflow/v1alpha1/generated.proto +++ b/pkg/apis/workflow/v1alpha1/generated.proto @@ -793,6 +793,9 @@ message Template { // PodSpecPatch holds strategic merge patch to apply against the pod spec. Allows parameterization of // container fields which are not strings (e.g. resource limits). optional string podSpecPatch = 31; + + // ResubmitPendingPods is a flag to enable resubmitting pods that remain Pending after initial submission + optional bool resubmitPendingPods = 34; } // TemplateRef is a reference of template resource. diff --git a/pkg/apis/workflow/v1alpha1/workflow_types.go b/pkg/apis/workflow/v1alpha1/workflow_types.go index a070cb9d8eb9..cbd5e886383b 100644 --- a/pkg/apis/workflow/v1alpha1/workflow_types.go +++ b/pkg/apis/workflow/v1alpha1/workflow_types.go @@ -459,6 +459,9 @@ type Template struct { // PodSpecPatch holds strategic merge patch to apply against the pod spec. Allows parameterization of // container fields which are not strings (e.g. resource limits). PodSpecPatch string `json:"podSpecPatch,omitempty" protobuf:"bytes,31,opt,name=podSpecPatch"` + + // ResubmitPendingPods is a flag to enable resubmitting pods that remain Pending after initial submission + ResubmitPendingPods *bool `json:"resubmitPendingPods,omitempty" protobuf:"varint,34,opt,name=resubmitPendingPods"` } var _ TemplateHolder = &Template{} @@ -875,9 +878,6 @@ type RetryStrategy struct { // Backoff is a backoff strategy Backoff *Backoff `json:"backoff,omitempty" protobuf:"bytes,3,opt,name=backoff,casttype=Backoff"` - - // Resubmit is set to enable Pending pod resubmission - Resubmit *bool `json:"resubmit,omitempty" protobuf:"varint,4,opt,name=resubmit"` } // NodeStatus contains status information about an individual node in the workflow diff --git a/pkg/apis/workflow/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/workflow/v1alpha1/zz_generated.deepcopy.go index 74d99b777cb0..439aecf584dd 100644 --- a/pkg/apis/workflow/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/workflow/v1alpha1/zz_generated.deepcopy.go @@ -1262,6 +1262,11 @@ func (in *Template) DeepCopyInto(out *Template) { *out = new(v1.PodSecurityContext) (*in).DeepCopyInto(*out) } + if in.ResubmitPendingPods != nil { + in, out := &in.ResubmitPendingPods, &out.ResubmitPendingPods + *out = new(bool) + **out = **in + } return } diff --git a/pkg/client/listers/workflow/v1alpha1/workflowtemplate.go b/pkg/client/listers/workflow/v1alpha1/workflowtemplate.go index 72680097708d..3eeac3ac2ba8 100644 --- a/pkg/client/listers/workflow/v1alpha1/workflowtemplate.go +++ b/pkg/client/listers/workflow/v1alpha1/workflowtemplate.go @@ -67,12 +67,7 @@ func (s workflowTemplateNamespaceLister) List(selector labels.Selector) (ret []* // Get retrieves the WorkflowTemplate from the indexer for a given namespace and name. func (s workflowTemplateNamespaceLister) Get(name string) (*v1alpha1.WorkflowTemplate, error) { - // Fix to handle the empty namespace. - key := name - if s.namespace != "" { - key = s.namespace + "/" + name - } - obj, exists, err := s.indexer.GetByKey(key) + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) if err != nil { return nil, err } diff --git a/test/e2e/fixtures/e2e_suite.go b/test/e2e/fixtures/e2e_suite.go index 97aaad375019..c4dfd921bdc0 100644 --- a/test/e2e/fixtures/e2e_suite.go +++ b/test/e2e/fixtures/e2e_suite.go @@ -180,6 +180,19 @@ func (s *E2ESuite) DeleteResources(label string) { panic(err) } } + + // Delete all resourcequotas + rqList, err := s.KubeClient.CoreV1().ResourceQuotas(Namespace).List(metav1.ListOptions{LabelSelector: label}) + if err != nil { + panic(err) + } + for _, rq := range rqList.Items { + log.WithField("resourcequota", rq.Name).Info("Deleting resource quota") + err = s.KubeClient.CoreV1().ResourceQuotas(Namespace).Delete(rq.Name, nil) + if err != nil { + panic(err) + } + } } func (s *E2ESuite) GetBasicAuthToken() string { diff --git a/test/e2e/functional_test.go b/test/e2e/functional_test.go index b0b953854956..01c3e7ef871a 100644 --- a/test/e2e/functional_test.go +++ b/test/e2e/functional_test.go @@ -21,11 +21,6 @@ type FunctionalSuite struct { fixtures.E2ESuite } -func (s *FunctionalSuite) TearDownSuite() { - s.E2ESuite.DeleteResources(fixtures.Label) - s.Persistence.Close() -} - func (s *FunctionalSuite) TestContinueOnFail() { s.Given(). Workflow(` @@ -198,9 +193,7 @@ spec: entrypoint: dag templates: - name: cowsay - retryStrategy: - limit: 1 - resubmit: true + resubmitPendingPods: true container: image: cowsay:v1 command: [sh, -c] @@ -221,8 +214,8 @@ spec: SubmitWorkflow(). WaitForWorkflowToStart(5*time.Second). WaitForWorkflowCondition(func(wf *wfv1.Workflow) bool { - a := wf.Status.Nodes.FindByDisplayName("a(0)") - b := wf.Status.Nodes.FindByDisplayName("b(0)") + a := wf.Status.Nodes.FindByDisplayName("a") + b := wf.Status.Nodes.FindByDisplayName("b") return wfv1.NodePending == a.Phase && regexp.MustCompile(`^Pending \d+\.\d+s$`).MatchString(a.Message) && wfv1.NodePending == b.Phase && @@ -230,8 +223,8 @@ spec: }, "pods pending", 20*time.Second). DeleteQuota(). WaitForWorkflowCondition(func(wf *wfv1.Workflow) bool { - a := wf.Status.Nodes.FindByDisplayName("a(0)") - b := wf.Status.Nodes.FindByDisplayName("b(0)") + a := wf.Status.Nodes.FindByDisplayName("a") + b := wf.Status.Nodes.FindByDisplayName("b") return wfv1.NodeSucceeded == a.Phase && wfv1.NodeSucceeded == b.Phase }, "pods succeeded", 20*time.Second) s.TearDownSuite() diff --git a/workflow/controller/operator.go b/workflow/controller/operator.go index f086fe7c50a6..835a49769e4b 100644 --- a/workflow/controller/operator.go +++ b/workflow/controller/operator.go @@ -1262,16 +1262,10 @@ func (woc *wfOperationCtx) getFirstChildNode(node *wfv1.NodeStatus) (*wfv1.NodeS } func isResubmitAllowed(tmpl *wfv1.Template) bool { - if tmpl == nil { + if tmpl.ResubmitPendingPods == nil { return false } - if tmpl.RetryStrategy == nil { - return false - } - if tmpl.RetryStrategy.Resubmit == nil { - return false - } - return *tmpl.RetryStrategy.Resubmit + return *tmpl.ResubmitPendingPods } // executeTemplate executes the template with the given arguments and returns the created NodeStatus @@ -1357,19 +1351,6 @@ func (woc *wfOperationCtx) executeTemplate(nodeName string, orgTmpl wfv1.Templat if err != nil { return woc.markNodeError(retryNodeName, err), err } - if lastChildNode != nil && lastChildNode.Pending() && processedTmpl.GetType() == wfv1.TemplateTypeContainer { - _, err := woc.createWorkflowPod(lastChildNode.Name, *processedTmpl.Container, processedTmpl, false) - if apierr.IsForbidden(err) { - woc.markNodePending(lastChildNode.Name, err) - return retryParentNode, nil - } - if err != nil { - woc.markNodePending(lastChildNode.Name, err) - return retryParentNode, nil - } - woc.markNodePhase(lastChildNode.Name, wfv1.NodeRunning) - return retryParentNode, nil - } if lastChildNode != nil && !lastChildNode.Completed() { // Last child node is still running. nodeName = lastChildNode.Name @@ -1407,14 +1388,6 @@ func (woc *wfOperationCtx) executeTemplate(nodeName string, orgTmpl wfv1.Templat err = errors.Errorf(errors.CodeBadRequest, "Template '%s' missing specification", processedTmpl.Name) return woc.initializeNode(nodeName, wfv1.NodeTypeSkipped, templateScope, orgTmpl, boundaryID, wfv1.NodeError, err.Error()), err } - if apierr.IsForbidden(err) { - if isResubmitAllowed(processedTmpl) { - return woc.markNodePending(node.Name, err), nil - } else { - return nil, errors.InternalWrapError(err) - } - } - if err != nil { node = woc.markNodeError(node.Name, err) // If retry policy is not set, or if it is not set to Always or OnError, we won't attempt to retry an errored container @@ -1687,17 +1660,22 @@ func (woc *wfOperationCtx) checkParallelism(tmpl *wfv1.Template, node *wfv1.Node func (woc *wfOperationCtx) executeContainer(nodeName string, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) { node := woc.getNodeByName(nodeName) - if node != nil { - if node.Pending() { - _, err := woc.createWorkflowPod(node.Name, *tmpl.Container, tmpl, false) - return node, err - } + if node == nil { + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, templateScope, tmpl, orgTmpl, boundaryID, wfv1.NodePending) + } else if !isResubmitAllowed(tmpl) || !node.Pending() { + // This is not our first time executing this node. + // We will retry to resubmit the pod if it is allowed and if the node is pending. If either of these two are + // false, return. return node, nil } - node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, templateScope, tmpl, orgTmpl, boundaryID, wfv1.NodePending) woc.log.Debugf("Executing node %s with container template: %v\n", nodeName, tmpl) _, err := woc.createWorkflowPod(nodeName, *tmpl.Container, tmpl, false) + + if apierr.IsForbidden(err) && isResubmitAllowed(tmpl) { + // Our error was most likely caused by a lack of resources. If pod resubmission is allowed, keep the node pending + return woc.markNodePending(node.Name, err), nil + } return node, err } From 5fb0392c5a87932f6858767d3510cfd0c80b87a4 Mon Sep 17 00:00:00 2001 From: Simon Behar Date: Thu, 12 Mar 2020 19:48:20 -0700 Subject: [PATCH 16/18] Readd code that was incorrectly deleted --- pkg/client/listers/workflow/v1alpha1/workflowtemplate.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pkg/client/listers/workflow/v1alpha1/workflowtemplate.go b/pkg/client/listers/workflow/v1alpha1/workflowtemplate.go index 3eeac3ac2ba8..72680097708d 100644 --- a/pkg/client/listers/workflow/v1alpha1/workflowtemplate.go +++ b/pkg/client/listers/workflow/v1alpha1/workflowtemplate.go @@ -67,7 +67,12 @@ func (s workflowTemplateNamespaceLister) List(selector labels.Selector) (ret []* // Get retrieves the WorkflowTemplate from the indexer for a given namespace and name. func (s workflowTemplateNamespaceLister) Get(name string) (*v1alpha1.WorkflowTemplate, error) { - obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + // Fix to handle the empty namespace. + key := name + if s.namespace != "" { + key = s.namespace + "/" + name + } + obj, exists, err := s.indexer.GetByKey(key) if err != nil { return nil, err } From da3ba82239d51329618a4832b9cfdf4d31e90183 Mon Sep 17 00:00:00 2001 From: Simon Behar Date: Fri, 13 Mar 2020 09:41:37 -0700 Subject: [PATCH 17/18] Possible fix --- test/e2e/functional_test.go | 55 ++++++++++++++++++++++++++++++++- workflow/controller/operator.go | 1 + 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/test/e2e/functional_test.go b/test/e2e/functional_test.go index 01c3e7ef871a..b4fd5ac6d354 100644 --- a/test/e2e/functional_test.go +++ b/test/e2e/functional_test.go @@ -186,7 +186,7 @@ func (s *FunctionalSuite) TestPendingRetryWorkflow() { apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: - name: dag-limited + name: dag-limited-1 labels: argo-e2e: true spec: @@ -230,6 +230,59 @@ spec: s.TearDownSuite() } +// 128M is for argo executor +func (s *FunctionalSuite) TestPendingRetryWorkflowWithRetryStrategy() { + s.Given(). + Workflow(` +apiVersion: argoproj.io/v1alpha1 +kind: Workflow +metadata: + name: dag-limited-2 + labels: + argo-e2e: true +spec: + entrypoint: dag + templates: + - name: cowsay + resubmitPendingPods: true + retryStrategy: + limit: 1 + container: + image: cowsay:v1 + command: [sh, -c] + args: ["cowsay a"] + resources: + limits: + memory: 128M + - name: dag + dag: + tasks: + - name: a + template: cowsay + - name: b + template: cowsay +`). + When(). + MemoryQuota("130M"). + SubmitWorkflow(). + WaitForWorkflowToStart(5*time.Second). + WaitForWorkflowCondition(func(wf *wfv1.Workflow) bool { + a := wf.Status.Nodes.FindByDisplayName("a(0)") + b := wf.Status.Nodes.FindByDisplayName("b(0)") + return wfv1.NodePending == a.Phase && + regexp.MustCompile(`^Pending \d+\.\d+s$`).MatchString(a.Message) && + wfv1.NodePending == b.Phase && + regexp.MustCompile(`^Pending \d+\.\d+s$`).MatchString(b.Message) + }, "pods pending", 20*time.Second). + DeleteQuota(). + WaitForWorkflowCondition(func(wf *wfv1.Workflow) bool { + a := wf.Status.Nodes.FindByDisplayName("a(0)") + b := wf.Status.Nodes.FindByDisplayName("b(0)") + return wfv1.NodeSucceeded == a.Phase && wfv1.NodeSucceeded == b.Phase + }, "pods succeeded", 20*time.Second) + s.TearDownSuite() +} + func (s *FunctionalSuite) TestparameterAggregation() { s.Given(). Workflow("@functional/param-aggregation.yaml"). diff --git a/workflow/controller/operator.go b/workflow/controller/operator.go index 835a49769e4b..f764c7f0277e 100644 --- a/workflow/controller/operator.go +++ b/workflow/controller/operator.go @@ -1674,6 +1674,7 @@ func (woc *wfOperationCtx) executeContainer(nodeName string, templateScope strin if apierr.IsForbidden(err) && isResubmitAllowed(tmpl) { // Our error was most likely caused by a lack of resources. If pod resubmission is allowed, keep the node pending + woc.requeue(0) return woc.markNodePending(node.Name, err), nil } return node, err From 7cc7600655b2643ec34f23f98f21b229781490df Mon Sep 17 00:00:00 2001 From: Simon Behar Date: Fri, 13 Mar 2020 15:02:04 -0700 Subject: [PATCH 18/18] Fix test --- test/e2e/functional/param-aggregation.yaml | 15 +++++++++------ test/e2e/functional_test.go | 8 +++++--- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/test/e2e/functional/param-aggregation.yaml b/test/e2e/functional/param-aggregation.yaml index 89215de4f488..19a43b7e54e7 100644 --- a/test/e2e/functional/param-aggregation.yaml +++ b/test/e2e/functional/param-aggregation.yaml @@ -30,7 +30,7 @@ spec: parameters: - name: message value: "{{item}}" - withParam: "{{steps.divide-by-2.outputs.result}}" + withParam: "{{steps.divide-by-2.outputs.parameters}}" # odd-or-even accepts a number and returns whether or not that number is odd or even - name: odd-or-even @@ -63,12 +63,15 @@ spec: inputs: parameters: - name: num - script: + container: image: alpine:latest - command: [sh, -x] - source: | - #!/bin/sh - echo $(({{inputs.parameters.num}}/2)) + command: [sh, -c] + args: ["echo $(({{inputs.parameters.num}}/2)) > /tmp/res"] + outputs: + parameters: + - name: res + valueFrom: + path: /tmp/res # whalesay prints a number using whalesay - name: whalesay diff --git a/test/e2e/functional_test.go b/test/e2e/functional_test.go index b4fd5ac6d354..8f5776e20338 100644 --- a/test/e2e/functional_test.go +++ b/test/e2e/functional_test.go @@ -283,7 +283,7 @@ spec: s.TearDownSuite() } -func (s *FunctionalSuite) TestparameterAggregation() { +func (s *FunctionalSuite) TestParameterAggregation() { s.Given(). Workflow("@functional/param-aggregation.yaml"). When(). @@ -292,8 +292,10 @@ func (s *FunctionalSuite) TestparameterAggregation() { Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { assert.Equal(t, wfv1.NodeSucceeded, status.Phase) - nodeStatus := status.Nodes.FindByDisplayName("print(0:1)") - assert.Equal(t, wfv1.NodeSucceeded, nodeStatus.Phase) + nodeStatus := status.Nodes.FindByDisplayName("print(0:res:1)") + if assert.NotNil(t, nodeStatus) { + assert.Equal(t, wfv1.NodeSucceeded, nodeStatus.Phase) + } }) }