diff --git a/api/json-schema/schema.json b/api/json-schema/schema.json index fefd397d8c..24ca429580 100644 --- a/api/json-schema/schema.json +++ b/api/json-schema/schema.json @@ -17939,6 +17939,12 @@ "imagePullPolicy": { "type": "string" }, + "livenessProbe": { + "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.Probe" + }, + "readinessProbe": { + "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.Probe" + }, "resources": { "$ref": "#/definitions/io.k8s.api.core.v1.ResourceRequirements" }, @@ -17972,6 +17978,12 @@ "imagePullPolicy": { "type": "string" }, + "livenessProbe": { + "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.Probe" + }, + "readinessProbe": { + "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.Probe" + }, "resources": { "$ref": "#/definitions/io.k8s.api.core.v1.ResourceRequirements" }, @@ -19739,6 +19751,37 @@ }, "type": "object" }, + "io.numaproj.numaflow.v1alpha1.Probe": { + "description": "Probe is used to customize the configuration for Readiness and Liveness probes.", + "properties": { + "failureThreshold": { + "description": "Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1.", + "format": "int32", + "type": "integer" + }, + "initialDelaySeconds": { + "description": "Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + "format": "int32", + "type": "integer" + }, + "periodSeconds": { + "description": "How often (in seconds) to perform the probe.", + "format": "int32", + "type": "integer" + }, + "successThreshold": { + "description": "Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.", + "format": "int32", + "type": "integer" + }, + "timeoutSeconds": { + "description": "Number of seconds after which the probe times out. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, "io.numaproj.numaflow.v1alpha1.RedisBufferService": { "properties": { "external": { diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index f688e51c8d..e2e29fbabf 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -17944,6 +17944,12 @@ "imagePullPolicy": { "type": "string" }, + "livenessProbe": { + "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.Probe" + }, + "readinessProbe": { + "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.Probe" + }, "resources": { "$ref": "#/definitions/io.k8s.api.core.v1.ResourceRequirements" }, @@ -17977,6 +17983,12 @@ "imagePullPolicy": { "type": "string" }, + "livenessProbe": { + "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.Probe" + }, + "readinessProbe": { + "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.Probe" + }, "resources": { "$ref": "#/definitions/io.k8s.api.core.v1.ResourceRequirements" }, @@ -19725,6 +19737,37 @@ } } }, + "io.numaproj.numaflow.v1alpha1.Probe": { + "description": "Probe is used to customize the configuration for Readiness and Liveness probes.", + "type": "object", + "properties": { + "failureThreshold": { + "description": "Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1.", + "type": "integer", + "format": "int32" + }, + "initialDelaySeconds": { + "description": "Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + "type": "integer", + "format": "int32" + }, + "periodSeconds": { + "description": "How often (in seconds) to perform the probe.", + "type": "integer", + "format": "int32" + }, + "successThreshold": { + "description": "Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.", + "type": "integer", + "format": "int32" + }, + "timeoutSeconds": { + "description": "Number of seconds after which the probe times out. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + "type": "integer", + "format": "int32" + } + } + }, "io.numaproj.numaflow.v1alpha1.RedisBufferService": { "type": "object", "properties": { diff --git a/config/base/crds/full/numaflow.numaproj.io_interstepbufferservices.yaml b/config/base/crds/full/numaflow.numaproj.io_interstepbufferservices.yaml index acc540cd10..0fb6ff2583 100644 --- a/config/base/crds/full/numaflow.numaproj.io_interstepbufferservices.yaml +++ b/config/base/crds/full/numaflow.numaproj.io_interstepbufferservices.yaml @@ -527,6 +527,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -747,6 +783,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -947,6 +1019,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -1702,6 +1810,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -1891,6 +2035,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -2091,6 +2271,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -2355,6 +2571,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: diff --git a/config/base/crds/full/numaflow.numaproj.io_monovertices.yaml b/config/base/crds/full/numaflow.numaproj.io_monovertices.yaml index 02ae281ebd..4d8a23ba14 100644 --- a/config/base/crds/full/numaflow.numaproj.io_monovertices.yaml +++ b/config/base/crds/full/numaflow.numaproj.io_monovertices.yaml @@ -532,6 +532,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -1108,6 +1144,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -1315,6 +1387,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -3290,6 +3398,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -3727,6 +3871,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -4446,6 +4626,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -4657,6 +4873,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: diff --git a/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml b/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml index 40db1f403e..d262a8664b 100644 --- a/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml +++ b/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml @@ -246,6 +246,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -1581,6 +1617,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -1788,6 +1860,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -2491,6 +2599,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -3220,6 +3364,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -3427,6 +3607,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -4124,6 +4340,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -4331,6 +4583,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -5030,6 +5318,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -5237,6 +5561,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -6210,6 +6570,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -7246,6 +7642,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -7683,6 +8115,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -8402,6 +8870,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -8613,6 +9117,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -8861,6 +9401,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: diff --git a/config/base/crds/full/numaflow.numaproj.io_vertices.yaml b/config/base/crds/full/numaflow.numaproj.io_vertices.yaml index 1f02fd2b35..a1756ec313 100644 --- a/config/base/crds/full/numaflow.numaproj.io_vertices.yaml +++ b/config/base/crds/full/numaflow.numaproj.io_vertices.yaml @@ -532,6 +532,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -816,6 +852,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -1797,6 +1869,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -2833,6 +2941,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -3270,6 +3414,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -3989,6 +4169,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -4200,6 +4416,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -4525,6 +4777,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: diff --git a/config/install.yaml b/config/install.yaml index c3db75767a..c6551b513a 100644 --- a/config/install.yaml +++ b/config/install.yaml @@ -526,6 +526,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -746,6 +782,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -946,6 +1018,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -1701,6 +1809,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -1890,6 +2034,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -2090,6 +2270,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -2354,6 +2570,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -3176,6 +3428,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -3752,6 +4040,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -3959,6 +4283,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -5934,6 +6294,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -6371,6 +6767,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -7090,6 +7522,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -7301,6 +7769,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -8519,6 +9023,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -9854,6 +10394,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -10061,6 +10637,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -10764,6 +11376,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -11493,6 +12141,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -11700,6 +12384,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -12397,6 +13117,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -12604,6 +13360,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -13303,6 +14095,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -13510,6 +14338,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -14483,6 +15347,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -15519,6 +16419,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -15956,6 +16892,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -16675,6 +17647,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -16886,6 +17894,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -17134,6 +18178,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -18696,6 +19776,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -18980,6 +20096,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -19961,6 +21113,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -20997,6 +22185,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -21434,6 +22658,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -22153,6 +23413,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -22364,6 +23660,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -22689,6 +24021,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: diff --git a/config/namespace-install.yaml b/config/namespace-install.yaml index 5162dc6ad7..07fc13628d 100644 --- a/config/namespace-install.yaml +++ b/config/namespace-install.yaml @@ -526,6 +526,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -746,6 +782,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -946,6 +1018,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -1701,6 +1809,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -1890,6 +2034,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -2090,6 +2270,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -2354,6 +2570,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -3176,6 +3428,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -3752,6 +4040,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -3959,6 +4283,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -5934,6 +6294,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -6371,6 +6767,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -7090,6 +7522,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -7301,6 +7769,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -8519,6 +9023,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -9854,6 +10394,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -10061,6 +10637,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -10764,6 +11376,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -11493,6 +12141,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -11700,6 +12384,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -12397,6 +13117,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -12604,6 +13360,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -13303,6 +14095,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -13510,6 +14338,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -14483,6 +15347,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -15519,6 +16419,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -15956,6 +16892,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -16675,6 +17647,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -16886,6 +17894,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -17134,6 +18178,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -18696,6 +19776,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -18980,6 +20096,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -19961,6 +21113,42 @@ spec: type: array imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -20997,6 +22185,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -21434,6 +22658,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -22153,6 +23413,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -22364,6 +23660,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: @@ -22689,6 +24021,42 @@ spec: type: string imagePullPolicy: type: string + livenessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + readinessProbe: + properties: + failureThreshold: + format: int32 + type: integer + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object resources: properties: claims: diff --git a/docs/APIs.md b/docs/APIs.md index d5deaa76b2..7b698883e7 100644 --- a/docs/APIs.md +++ b/docs/APIs.md @@ -1597,6 +1597,36 @@ Kubernetes core/v1.PullPolicy + + + + +readinessProbe
+ Probe + + + + +(Optional) + + + + + + + + +livenessProbe
+ Probe + + + + +(Optional) + + + + @@ -1730,6 +1760,36 @@ Kubernetes core/v1.SecurityContext + + + + +readinessProbe
+ Probe + + + + +(Optional) + + + + + + + + +livenessProbe
+ Probe + + + + +(Optional) + + + + @@ -8048,6 +8108,155 @@ successfully drained. +

+ +Probe +

+ +

+ +(Appears on: +Container, +ContainerTemplate) +

+ +

+ +

+ +Probe is used to customize the configuration for Readiness and Liveness +probes. +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +Field + + +Description +
+ +initialDelaySeconds
int32 +
+ +(Optional) +

+ +Number of seconds after the container has started before liveness probes +are initiated. More info: +https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes +

+ +
+ +timeoutSeconds
int32 +
+ +(Optional) +

+ +Number of seconds after which the probe times out. More info: +https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes +

+ +
+ +periodSeconds
int32 +
+ +(Optional) +

+ +How often (in seconds) to perform the probe. +

+ +
+ +successThreshold
int32 +
+ +(Optional) +

+ +Minimum consecutive successes for the probe to be considered successful +after having failed. Defaults to 1. Must be 1 for liveness and startup. +Minimum value is 1. +

+ +
+ +failureThreshold
int32 +
+ +(Optional) +

+ +Minimum consecutive failures for the probe to be considered failed after +having succeeded. Defaults to 3. Minimum value is 1. +

+ +
+

RedisBufferService diff --git a/docs/user-guide/reference/configuration/liveness-and-readiness.md b/docs/user-guide/reference/configuration/liveness-and-readiness.md new file mode 100644 index 0000000000..f4a3dd5d0f --- /dev/null +++ b/docs/user-guide/reference/configuration/liveness-and-readiness.md @@ -0,0 +1,117 @@ +# Liveness and Readiness + +`Liveness` and `Readiness` probes have been pre-configured in the pods orchestrated in Numaflow, including the containers of `Vertex` and `MonoVertex` pods. For these probes, the probe handlers are not allowed to be customized, but the other configurations are. + +- `initialDelaySeconds` +- `timeoutSeconds` +- `periodSeconds` +- `successThreshold` +- `failureThreshold` + +Here is an example for `Pipeline` customization, similar configuration can be applied to containers including `udf`, `udsource`, `transformer`, `udsink` and `fb-udsink`. + +```yaml +apiVersion: numaflow.numaproj.io/v1alpha1 +kind: Pipeline +metadata: + name: my-pipeline +spec: + vertices: + - name: my-source + containerTemplate: # For "numa" container + readinessProbe: + initialDelaySeconds: 30 + periodSeconds: 60 + livenessProbe: + initialDelaySeconds: 60 + periodSeconds: 120 + volumes: + - name: my-udsource-config + configMap: + name: udsource-config + source: + udsource: + container: + image: my-source:latest + volumeMounts: + - mountPath: /path/to/my-source-config + name: my-udsource-config + # For User-Defined source + livenessProbe: + initialDelaySeconds: 40 + failureThreshold: 5 + - name: my-udf + containerTemplate: # For "numa" container + readinessProbe: + initialDelaySeconds: 20 + periodSeconds: 60 + livenessProbe: + initialDelaySeconds: 180 + periodSeconds: 60 + timeoutSeconds: 50 + volumes: + - name: my-udf-config + configMap: + name: udf-config + udf: + container: + image: my-function:latest + volumeMounts: + - mountPath: /path/to/my-function-config + name: my-udf-config + # For "udf" + livenessProbe: + initialDelaySeconds: 40 + failureThreshold: 5 +``` + +The customization for `numa` container is also available with a [Vertex Template](./pipeline-customization.md#vertices) defined in `spec.templates.vertex`, which is going to be applied to all the vertices of a pipeline. + +A `MonoVertex` example is as below. + +```yaml +apiVersion: numaflow.numaproj.io/v1alpha1 +kind: MonoVertex +metadata: + name: simple-mono-vertex +spec: + containerTemplate: # For "numa" container + readinessProbe: + initialDelaySeconds: 20 + periodSeconds: 60 + livenessProbe: + initialDelaySeconds: 180 + periodSeconds: 60 + source: + udsource: + container: + image: quay.io/numaio/numaflow-java/source-simple-source:stable + # For User-Defined source + livenessProbe: + initialDelaySeconds: 40 + failureThreshold: 5 + timeoutSeconds: 40 + transformer: + container: + image: quay.io/numaio/numaflow-rs/source-transformer-now:stable + # For transformer + livenessProbe: + initialDelaySeconds: 40 + failureThreshold: 5 + sink: + udsink: + container: + image: quay.io/numaio/numaflow-java/simple-sink:stable + # For User-Defined Sink + livenessProbe: + initialDelaySeconds: 40 + failureThreshold: 5 + fallback: + udsink: + container: + image: my-sink:latest + # # For Fallback Sink + livenessProbe: + initialDelaySeconds: 40 + failureThreshold: 5 +``` diff --git a/go.mod b/go.mod index f0dd236bd7..9f54c88017 100644 --- a/go.mod +++ b/go.mod @@ -30,8 +30,8 @@ require ( github.com/hashicorp/golang-lru/v2 v2.0.7 github.com/imdario/mergo v0.3.16 github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe - github.com/nats-io/nats-server/v2 v2.10.17 - github.com/nats-io/nats.go v1.36.0 + github.com/nats-io/nats-server/v2 v2.10.20 + github.com/nats-io/nats.go v1.37.0 github.com/numaproj/numaflow-go v0.8.0 github.com/prometheus/client_golang v1.18.0 github.com/prometheus/client_model v0.5.0 @@ -48,10 +48,10 @@ require ( go.uber.org/goleak v1.3.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.26.0 - golang.org/x/crypto v0.24.0 + golang.org/x/crypto v0.26.0 golang.org/x/net v0.25.0 golang.org/x/oauth2 v0.20.0 - golang.org/x/sync v0.7.0 + golang.org/x/sync v0.8.0 golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 google.golang.org/grpc v1.59.0 @@ -148,7 +148,7 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect - github.com/minio/highwayhash v1.0.2 // indirect + github.com/minio/highwayhash v1.0.3 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -158,7 +158,7 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect - github.com/nats-io/jwt/v2 v2.5.7 // indirect + github.com/nats-io/jwt/v2 v2.5.8 // indirect github.com/nats-io/nkeys v0.4.7 // indirect github.com/nats-io/nuid v1.0.1 // indirect github.com/oklog/ulid v1.3.1 // indirect @@ -201,10 +201,10 @@ require ( golang.org/x/arch v0.7.0 // indirect golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc // indirect golang.org/x/mod v0.17.0 // indirect - golang.org/x/sys v0.21.0 // indirect - golang.org/x/term v0.21.0 // indirect - golang.org/x/text v0.16.0 // indirect - golang.org/x/time v0.5.0 // indirect + golang.org/x/sys v0.24.0 // indirect + golang.org/x/term v0.23.0 // indirect + golang.org/x/text v0.17.0 // indirect + golang.org/x/time v0.6.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 // indirect diff --git a/go.sum b/go.sum index 1e46c54600..77784a6a8d 100644 --- a/go.sum +++ b/go.sum @@ -446,8 +446,8 @@ github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= -github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= -github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q= +github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= @@ -474,12 +474,12 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nats-io/jwt/v2 v2.5.7 h1:j5lH1fUXCnJnY8SsQeB/a/z9Azgu2bYIDvtPVNdxe2c= -github.com/nats-io/jwt/v2 v2.5.7/go.mod h1:ZdWS1nZa6WMZfFwwgpEaqBV8EPGVgOTDHN/wTbz0Y5A= -github.com/nats-io/nats-server/v2 v2.10.17 h1:PTVObNBD3TZSNUDgzFb1qQsQX4mOgFmOuG9vhT+KBUY= -github.com/nats-io/nats-server/v2 v2.10.17/go.mod h1:5OUyc4zg42s/p2i92zbbqXvUNsbF0ivdTLKshVMn2YQ= -github.com/nats-io/nats.go v1.36.0 h1:suEUPuWzTSse/XhESwqLxXGuj8vGRuPRoG7MoRN/qyU= -github.com/nats-io/nats.go v1.36.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= +github.com/nats-io/jwt/v2 v2.5.8 h1:uvdSzwWiEGWGXf+0Q+70qv6AQdvcvxrv9hPM0RiPamE= +github.com/nats-io/jwt/v2 v2.5.8/go.mod h1:ZdWS1nZa6WMZfFwwgpEaqBV8EPGVgOTDHN/wTbz0Y5A= +github.com/nats-io/nats-server/v2 v2.10.20 h1:CXDTYNHeBiAKBTAIP2gjpgbWap2GhATnTLgP8etyvEI= +github.com/nats-io/nats-server/v2 v2.10.20/go.mod h1:hgcPnoUtMfxz1qVOvLZGurVypQ+Cg6GXVXjG53iHk+M= +github.com/nats-io/nats.go v1.37.0 h1:07rauXbVnnJvv1gfIyghFEo6lUcYRY0WXc3x7x0vUxE= +github.com/nats-io/nats.go v1.37.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI= github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= @@ -687,8 +687,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= -golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= +golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -802,11 +802,10 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -863,15 +862,16 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= +golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= -golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= +golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU= +golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -884,14 +884,14 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= +golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= diff --git a/mkdocs.yml b/mkdocs.yml index 55dac8b1c1..1118c1ff43 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -101,6 +101,7 @@ nav: - user-guide/reference/configuration/labels-and-annotations.md - user-guide/reference/configuration/init-containers.md - user-guide/reference/configuration/sidecar-containers.md + - user-guide/reference/configuration/liveness-and-readiness.md - user-guide/reference/configuration/pipeline-customization.md - user-guide/reference/configuration/istio.md - user-guide/reference/configuration/max-message-size.md diff --git a/pkg/apis/numaflow/v1alpha1/const.go b/pkg/apis/numaflow/v1alpha1/const.go index e36ec9bd34..f65e2a5bd7 100644 --- a/pkg/apis/numaflow/v1alpha1/const.go +++ b/pkg/apis/numaflow/v1alpha1/const.go @@ -265,6 +265,20 @@ const ( // This strategy argues for robustness in operations, aiming // to minimize the chances of data loss or failed deliveries in transient failure scenarios. DefaultOnFailureRetryStrategy = OnFailureRetry + + // Defeault values for readiness and liveness probes + NumaContainerReadyzInitialDelaySeconds = 5 + NumaContainerReadyzPeriodSeconds = 10 + NumaContainerReadyzTimeoutSeconds = 30 + NumaContainerReadyzFailureThreshold = 6 + NumaContainerLivezInitialDelaySeconds = 20 + NumaContainerLivezPeriodSeconds = 60 + NumaContainerLivezTimeoutSeconds = 30 + NumaContainerLivezFailureThreshold = 5 + UDContainerLivezInitialDelaySeconds = 30 + UDContainerLivezPeriodSeconds = 60 + UDContainerLivezTimeoutSeconds = 30 + UDContainerLivezFailureThreshold = 5 ) var ( diff --git a/pkg/apis/numaflow/v1alpha1/container_template.go b/pkg/apis/numaflow/v1alpha1/container_template.go index 071229114c..5b3ad3270c 100644 --- a/pkg/apis/numaflow/v1alpha1/container_template.go +++ b/pkg/apis/numaflow/v1alpha1/container_template.go @@ -33,6 +33,10 @@ type ContainerTemplate struct { Env []corev1.EnvVar `json:"env,omitempty" protobuf:"bytes,4,rep,name=env"` // +optional EnvFrom []corev1.EnvFromSource `json:"envFrom,omitempty" protobuf:"bytes,5,rep,name=envFrom"` + // +optional + ReadinessProbe *Probe `json:"readinessProbe,omitempty" protobuf:"bytes,6,opt,name=readinessProbe"` + // +optional + LivenessProbe *Probe `json:"livenessProbe,omitempty" protobuf:"bytes,7,opt,name=livenessProbe"` } // ApplyToContainer updates the Container with the values from the ContainerTemplate @@ -48,6 +52,40 @@ func (ct *ContainerTemplate) ApplyToContainer(c *corev1.Container) { if len(ct.EnvFrom) > 0 { c.EnvFrom = append(c.EnvFrom, ct.EnvFrom...) } + if rp := ct.ReadinessProbe; rp != nil && c.ReadinessProbe != nil { + if rp.InitialDelaySeconds != nil { + c.ReadinessProbe.InitialDelaySeconds = *rp.InitialDelaySeconds + } + if rp.TimeoutSeconds != nil { + c.ReadinessProbe.TimeoutSeconds = *rp.TimeoutSeconds + } + if rp.PeriodSeconds != nil { + c.ReadinessProbe.PeriodSeconds = *rp.PeriodSeconds + } + if rp.FailureThreshold != nil { + c.ReadinessProbe.FailureThreshold = *rp.FailureThreshold + } + if rp.SuccessThreshold != nil { + c.ReadinessProbe.SuccessThreshold = *rp.SuccessThreshold + } + } + if lp := ct.LivenessProbe; lp != nil && c.LivenessProbe != nil { + if lp.InitialDelaySeconds != nil { + c.LivenessProbe.InitialDelaySeconds = *lp.InitialDelaySeconds + } + if lp.TimeoutSeconds != nil { + c.LivenessProbe.TimeoutSeconds = *lp.TimeoutSeconds + } + if lp.PeriodSeconds != nil { + c.LivenessProbe.PeriodSeconds = *lp.PeriodSeconds + } + if lp.FailureThreshold != nil { + c.LivenessProbe.FailureThreshold = *lp.FailureThreshold + } + if lp.SuccessThreshold != nil { + c.LivenessProbe.SuccessThreshold = *lp.SuccessThreshold + } + } } // ApplyToNumaflowContainers updates any numa or init containers with the values from the ContainerTemplate diff --git a/pkg/apis/numaflow/v1alpha1/container_template_test.go b/pkg/apis/numaflow/v1alpha1/container_template_test.go index a1e8b8f479..5b835cda72 100644 --- a/pkg/apis/numaflow/v1alpha1/container_template_test.go +++ b/pkg/apis/numaflow/v1alpha1/container_template_test.go @@ -22,6 +22,7 @@ import ( "github.com/stretchr/testify/assert" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" + "k8s.io/utils/ptr" ) var ( @@ -81,3 +82,148 @@ func Test_ApplyToNumaflowContainers(t *testing.T) { assert.Equal(t, testContainerTemplate.Resources, cs[0].Resources) assert.NotEqual(t, testContainerTemplate.Resources, cs[1].Resources) } + +func TestApplyProbes(t *testing.T) { + tests := []struct { + name string + template *ContainerTemplate + input *corev1.Container + expected *corev1.Container + }{ + { + name: "Apply ReadinessProbe", + template: &ContainerTemplate{ + ReadinessProbe: &Probe{ + InitialDelaySeconds: ptr.To[int32](5), + TimeoutSeconds: ptr.To[int32](10), + PeriodSeconds: ptr.To[int32](15), + FailureThreshold: ptr.To[int32](3), + SuccessThreshold: ptr.To[int32](1), + }, + }, + input: &corev1.Container{ + ReadinessProbe: &corev1.Probe{}, + }, + expected: &corev1.Container{ + ReadinessProbe: &corev1.Probe{ + InitialDelaySeconds: 5, + TimeoutSeconds: 10, + PeriodSeconds: 15, + FailureThreshold: 3, + SuccessThreshold: 1, + }, + }, + }, + { + name: "Apply LivenessProbe", + template: &ContainerTemplate{ + LivenessProbe: &Probe{ + InitialDelaySeconds: ptr.To[int32](10), + TimeoutSeconds: ptr.To[int32](5), + PeriodSeconds: ptr.To[int32](20), + FailureThreshold: ptr.To[int32](5), + SuccessThreshold: ptr.To[int32](1), + }, + }, + input: &corev1.Container{ + LivenessProbe: &corev1.Probe{}, + }, + expected: &corev1.Container{ + LivenessProbe: &corev1.Probe{ + InitialDelaySeconds: 10, + TimeoutSeconds: 5, + PeriodSeconds: 20, + FailureThreshold: 5, + SuccessThreshold: 1, + }, + }, + }, + { + name: "Apply Both Probes", + template: &ContainerTemplate{ + ReadinessProbe: &Probe{ + InitialDelaySeconds: ptr.To[int32](5), + TimeoutSeconds: ptr.To[int32](10), + }, + LivenessProbe: &Probe{ + PeriodSeconds: ptr.To[int32](20), + FailureThreshold: ptr.To[int32](5), + }, + }, + input: &corev1.Container{ + ReadinessProbe: &corev1.Probe{}, + LivenessProbe: &corev1.Probe{}, + }, + expected: &corev1.Container{ + ReadinessProbe: &corev1.Probe{ + InitialDelaySeconds: 5, + TimeoutSeconds: 10, + }, + LivenessProbe: &corev1.Probe{ + PeriodSeconds: 20, + FailureThreshold: 5, + }, + }, + }, + { + name: "No Probes in Template", + template: &ContainerTemplate{}, + input: &corev1.Container{ + ReadinessProbe: &corev1.Probe{InitialDelaySeconds: 30}, + LivenessProbe: &corev1.Probe{TimeoutSeconds: 15}, + }, + expected: &corev1.Container{ + ReadinessProbe: &corev1.Probe{InitialDelaySeconds: 30}, + LivenessProbe: &corev1.Probe{TimeoutSeconds: 15}, + }, + }, + { + name: "No Probes in Container", + template: &ContainerTemplate{ + ReadinessProbe: &Probe{ + InitialDelaySeconds: ptr.To[int32](5), + TimeoutSeconds: ptr.To[int32](10), + }, + LivenessProbe: &Probe{ + PeriodSeconds: ptr.To[int32](20), + FailureThreshold: ptr.To[int32](5), + }, + }, + input: &corev1.Container{}, + expected: &corev1.Container{}, + }, + { + name: "Partial Probe Updates", + template: &ContainerTemplate{ + ReadinessProbe: &Probe{ + InitialDelaySeconds: ptr.To[int32](25), + }, + LivenessProbe: &Probe{ + FailureThreshold: ptr.To[int32](4), + }, + }, + input: &corev1.Container{ + ReadinessProbe: &corev1.Probe{TimeoutSeconds: 5}, + LivenessProbe: &corev1.Probe{PeriodSeconds: 10}, + }, + expected: &corev1.Container{ + ReadinessProbe: &corev1.Probe{ + InitialDelaySeconds: 25, + TimeoutSeconds: 5, + }, + LivenessProbe: &corev1.Probe{ + PeriodSeconds: 10, + FailureThreshold: 4, + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.template.ApplyToContainer(tt.input) + assert.Equal(t, tt.expected.ReadinessProbe, tt.input.ReadinessProbe) + assert.Equal(t, tt.expected.LivenessProbe, tt.input.LivenessProbe) + }) + } +} diff --git a/pkg/apis/numaflow/v1alpha1/generated.pb.go b/pkg/apis/numaflow/v1alpha1/generated.pb.go index 65ac7601e5..138962c4c2 100644 --- a/pkg/apis/numaflow/v1alpha1/generated.pb.go +++ b/pkg/apis/numaflow/v1alpha1/generated.pb.go @@ -1702,10 +1702,38 @@ func (m *PipelineStatus) XXX_DiscardUnknown() { var xxx_messageInfo_PipelineStatus proto.InternalMessageInfo +func (m *Probe) Reset() { *m = Probe{} } +func (*Probe) ProtoMessage() {} +func (*Probe) Descriptor() ([]byte, []int) { + return fileDescriptor_9d0d1b17d3865563, []int{59} +} +func (m *Probe) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Probe) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *Probe) XXX_Merge(src proto.Message) { + xxx_messageInfo_Probe.Merge(m, src) +} +func (m *Probe) XXX_Size() int { + return m.Size() +} +func (m *Probe) XXX_DiscardUnknown() { + xxx_messageInfo_Probe.DiscardUnknown(m) +} + +var xxx_messageInfo_Probe proto.InternalMessageInfo + func (m *RedisBufferService) Reset() { *m = RedisBufferService{} } func (*RedisBufferService) ProtoMessage() {} func (*RedisBufferService) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{59} + return fileDescriptor_9d0d1b17d3865563, []int{60} } func (m *RedisBufferService) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1733,7 +1761,7 @@ var xxx_messageInfo_RedisBufferService proto.InternalMessageInfo func (m *RedisConfig) Reset() { *m = RedisConfig{} } func (*RedisConfig) ProtoMessage() {} func (*RedisConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{60} + return fileDescriptor_9d0d1b17d3865563, []int{61} } func (m *RedisConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1761,7 +1789,7 @@ var xxx_messageInfo_RedisConfig proto.InternalMessageInfo func (m *RedisSettings) Reset() { *m = RedisSettings{} } func (*RedisSettings) ProtoMessage() {} func (*RedisSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{61} + return fileDescriptor_9d0d1b17d3865563, []int{62} } func (m *RedisSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1789,7 +1817,7 @@ var xxx_messageInfo_RedisSettings proto.InternalMessageInfo func (m *RetryStrategy) Reset() { *m = RetryStrategy{} } func (*RetryStrategy) ProtoMessage() {} func (*RetryStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{62} + return fileDescriptor_9d0d1b17d3865563, []int{63} } func (m *RetryStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1817,7 +1845,7 @@ var xxx_messageInfo_RetryStrategy proto.InternalMessageInfo func (m *RollingUpdateStrategy) Reset() { *m = RollingUpdateStrategy{} } func (*RollingUpdateStrategy) ProtoMessage() {} func (*RollingUpdateStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{63} + return fileDescriptor_9d0d1b17d3865563, []int{64} } func (m *RollingUpdateStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1845,7 +1873,7 @@ var xxx_messageInfo_RollingUpdateStrategy proto.InternalMessageInfo func (m *SASL) Reset() { *m = SASL{} } func (*SASL) ProtoMessage() {} func (*SASL) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{64} + return fileDescriptor_9d0d1b17d3865563, []int{65} } func (m *SASL) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1873,7 +1901,7 @@ var xxx_messageInfo_SASL proto.InternalMessageInfo func (m *SASLPlain) Reset() { *m = SASLPlain{} } func (*SASLPlain) ProtoMessage() {} func (*SASLPlain) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{65} + return fileDescriptor_9d0d1b17d3865563, []int{66} } func (m *SASLPlain) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1901,7 +1929,7 @@ var xxx_messageInfo_SASLPlain proto.InternalMessageInfo func (m *Scale) Reset() { *m = Scale{} } func (*Scale) ProtoMessage() {} func (*Scale) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{66} + return fileDescriptor_9d0d1b17d3865563, []int{67} } func (m *Scale) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1929,7 +1957,7 @@ var xxx_messageInfo_Scale proto.InternalMessageInfo func (m *ServingSource) Reset() { *m = ServingSource{} } func (*ServingSource) ProtoMessage() {} func (*ServingSource) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{67} + return fileDescriptor_9d0d1b17d3865563, []int{68} } func (m *ServingSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1957,7 +1985,7 @@ var xxx_messageInfo_ServingSource proto.InternalMessageInfo func (m *ServingStore) Reset() { *m = ServingStore{} } func (*ServingStore) ProtoMessage() {} func (*ServingStore) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{68} + return fileDescriptor_9d0d1b17d3865563, []int{69} } func (m *ServingStore) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1985,7 +2013,7 @@ var xxx_messageInfo_ServingStore proto.InternalMessageInfo func (m *SessionWindow) Reset() { *m = SessionWindow{} } func (*SessionWindow) ProtoMessage() {} func (*SessionWindow) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{69} + return fileDescriptor_9d0d1b17d3865563, []int{70} } func (m *SessionWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2013,7 +2041,7 @@ var xxx_messageInfo_SessionWindow proto.InternalMessageInfo func (m *SideInput) Reset() { *m = SideInput{} } func (*SideInput) ProtoMessage() {} func (*SideInput) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{70} + return fileDescriptor_9d0d1b17d3865563, []int{71} } func (m *SideInput) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2041,7 +2069,7 @@ var xxx_messageInfo_SideInput proto.InternalMessageInfo func (m *SideInputTrigger) Reset() { *m = SideInputTrigger{} } func (*SideInputTrigger) ProtoMessage() {} func (*SideInputTrigger) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{71} + return fileDescriptor_9d0d1b17d3865563, []int{72} } func (m *SideInputTrigger) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2069,7 +2097,7 @@ var xxx_messageInfo_SideInputTrigger proto.InternalMessageInfo func (m *SideInputsManagerTemplate) Reset() { *m = SideInputsManagerTemplate{} } func (*SideInputsManagerTemplate) ProtoMessage() {} func (*SideInputsManagerTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{72} + return fileDescriptor_9d0d1b17d3865563, []int{73} } func (m *SideInputsManagerTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2097,7 +2125,7 @@ var xxx_messageInfo_SideInputsManagerTemplate proto.InternalMessageInfo func (m *Sink) Reset() { *m = Sink{} } func (*Sink) ProtoMessage() {} func (*Sink) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{73} + return fileDescriptor_9d0d1b17d3865563, []int{74} } func (m *Sink) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2125,7 +2153,7 @@ var xxx_messageInfo_Sink proto.InternalMessageInfo func (m *SlidingWindow) Reset() { *m = SlidingWindow{} } func (*SlidingWindow) ProtoMessage() {} func (*SlidingWindow) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{74} + return fileDescriptor_9d0d1b17d3865563, []int{75} } func (m *SlidingWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2153,7 +2181,7 @@ var xxx_messageInfo_SlidingWindow proto.InternalMessageInfo func (m *Source) Reset() { *m = Source{} } func (*Source) ProtoMessage() {} func (*Source) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{75} + return fileDescriptor_9d0d1b17d3865563, []int{76} } func (m *Source) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2181,7 +2209,7 @@ var xxx_messageInfo_Source proto.InternalMessageInfo func (m *Status) Reset() { *m = Status{} } func (*Status) ProtoMessage() {} func (*Status) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{76} + return fileDescriptor_9d0d1b17d3865563, []int{77} } func (m *Status) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2209,7 +2237,7 @@ var xxx_messageInfo_Status proto.InternalMessageInfo func (m *TLS) Reset() { *m = TLS{} } func (*TLS) ProtoMessage() {} func (*TLS) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{77} + return fileDescriptor_9d0d1b17d3865563, []int{78} } func (m *TLS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2237,7 +2265,7 @@ var xxx_messageInfo_TLS proto.InternalMessageInfo func (m *TagConditions) Reset() { *m = TagConditions{} } func (*TagConditions) ProtoMessage() {} func (*TagConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{78} + return fileDescriptor_9d0d1b17d3865563, []int{79} } func (m *TagConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2265,7 +2293,7 @@ var xxx_messageInfo_TagConditions proto.InternalMessageInfo func (m *Templates) Reset() { *m = Templates{} } func (*Templates) ProtoMessage() {} func (*Templates) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{79} + return fileDescriptor_9d0d1b17d3865563, []int{80} } func (m *Templates) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2293,7 +2321,7 @@ var xxx_messageInfo_Templates proto.InternalMessageInfo func (m *Transformer) Reset() { *m = Transformer{} } func (*Transformer) ProtoMessage() {} func (*Transformer) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{80} + return fileDescriptor_9d0d1b17d3865563, []int{81} } func (m *Transformer) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2321,7 +2349,7 @@ var xxx_messageInfo_Transformer proto.InternalMessageInfo func (m *UDF) Reset() { *m = UDF{} } func (*UDF) ProtoMessage() {} func (*UDF) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{81} + return fileDescriptor_9d0d1b17d3865563, []int{82} } func (m *UDF) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2349,7 +2377,7 @@ var xxx_messageInfo_UDF proto.InternalMessageInfo func (m *UDSink) Reset() { *m = UDSink{} } func (*UDSink) ProtoMessage() {} func (*UDSink) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{82} + return fileDescriptor_9d0d1b17d3865563, []int{83} } func (m *UDSink) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2377,7 +2405,7 @@ var xxx_messageInfo_UDSink proto.InternalMessageInfo func (m *UDSource) Reset() { *m = UDSource{} } func (*UDSource) ProtoMessage() {} func (*UDSource) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{83} + return fileDescriptor_9d0d1b17d3865563, []int{84} } func (m *UDSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2405,7 +2433,7 @@ var xxx_messageInfo_UDSource proto.InternalMessageInfo func (m *UDTransformer) Reset() { *m = UDTransformer{} } func (*UDTransformer) ProtoMessage() {} func (*UDTransformer) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{84} + return fileDescriptor_9d0d1b17d3865563, []int{85} } func (m *UDTransformer) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2433,7 +2461,7 @@ var xxx_messageInfo_UDTransformer proto.InternalMessageInfo func (m *UpdateStrategy) Reset() { *m = UpdateStrategy{} } func (*UpdateStrategy) ProtoMessage() {} func (*UpdateStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{85} + return fileDescriptor_9d0d1b17d3865563, []int{86} } func (m *UpdateStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2461,7 +2489,7 @@ var xxx_messageInfo_UpdateStrategy proto.InternalMessageInfo func (m *Vertex) Reset() { *m = Vertex{} } func (*Vertex) ProtoMessage() {} func (*Vertex) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{86} + return fileDescriptor_9d0d1b17d3865563, []int{87} } func (m *Vertex) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2489,7 +2517,7 @@ var xxx_messageInfo_Vertex proto.InternalMessageInfo func (m *VertexInstance) Reset() { *m = VertexInstance{} } func (*VertexInstance) ProtoMessage() {} func (*VertexInstance) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{87} + return fileDescriptor_9d0d1b17d3865563, []int{88} } func (m *VertexInstance) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2517,7 +2545,7 @@ var xxx_messageInfo_VertexInstance proto.InternalMessageInfo func (m *VertexLimits) Reset() { *m = VertexLimits{} } func (*VertexLimits) ProtoMessage() {} func (*VertexLimits) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{88} + return fileDescriptor_9d0d1b17d3865563, []int{89} } func (m *VertexLimits) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2545,7 +2573,7 @@ var xxx_messageInfo_VertexLimits proto.InternalMessageInfo func (m *VertexList) Reset() { *m = VertexList{} } func (*VertexList) ProtoMessage() {} func (*VertexList) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{89} + return fileDescriptor_9d0d1b17d3865563, []int{90} } func (m *VertexList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2573,7 +2601,7 @@ var xxx_messageInfo_VertexList proto.InternalMessageInfo func (m *VertexSpec) Reset() { *m = VertexSpec{} } func (*VertexSpec) ProtoMessage() {} func (*VertexSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{90} + return fileDescriptor_9d0d1b17d3865563, []int{91} } func (m *VertexSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2601,7 +2629,7 @@ var xxx_messageInfo_VertexSpec proto.InternalMessageInfo func (m *VertexStatus) Reset() { *m = VertexStatus{} } func (*VertexStatus) ProtoMessage() {} func (*VertexStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{91} + return fileDescriptor_9d0d1b17d3865563, []int{92} } func (m *VertexStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2629,7 +2657,7 @@ var xxx_messageInfo_VertexStatus proto.InternalMessageInfo func (m *VertexTemplate) Reset() { *m = VertexTemplate{} } func (*VertexTemplate) ProtoMessage() {} func (*VertexTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{92} + return fileDescriptor_9d0d1b17d3865563, []int{93} } func (m *VertexTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2657,7 +2685,7 @@ var xxx_messageInfo_VertexTemplate proto.InternalMessageInfo func (m *Watermark) Reset() { *m = Watermark{} } func (*Watermark) ProtoMessage() {} func (*Watermark) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{93} + return fileDescriptor_9d0d1b17d3865563, []int{94} } func (m *Watermark) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2685,7 +2713,7 @@ var xxx_messageInfo_Watermark proto.InternalMessageInfo func (m *Window) Reset() { *m = Window{} } func (*Window) ProtoMessage() {} func (*Window) Descriptor() ([]byte, []int) { - return fileDescriptor_9d0d1b17d3865563, []int{94} + return fileDescriptor_9d0d1b17d3865563, []int{95} } func (m *Window) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2778,6 +2806,7 @@ func init() { proto.RegisterType((*PipelineList)(nil), "github.com.numaproj.numaflow.pkg.apis.numaflow.v1alpha1.PipelineList") proto.RegisterType((*PipelineSpec)(nil), "github.com.numaproj.numaflow.pkg.apis.numaflow.v1alpha1.PipelineSpec") proto.RegisterType((*PipelineStatus)(nil), "github.com.numaproj.numaflow.pkg.apis.numaflow.v1alpha1.PipelineStatus") + proto.RegisterType((*Probe)(nil), "github.com.numaproj.numaflow.pkg.apis.numaflow.v1alpha1.Probe") proto.RegisterType((*RedisBufferService)(nil), "github.com.numaproj.numaflow.pkg.apis.numaflow.v1alpha1.RedisBufferService") proto.RegisterType((*RedisConfig)(nil), "github.com.numaproj.numaflow.pkg.apis.numaflow.v1alpha1.RedisConfig") proto.RegisterType((*RedisSettings)(nil), "github.com.numaproj.numaflow.pkg.apis.numaflow.v1alpha1.RedisSettings") @@ -2822,501 +2851,510 @@ func init() { } var fileDescriptor_9d0d1b17d3865563 = []byte{ - // 7889 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6b, 0x6c, 0x25, 0xd9, - 0xb5, 0xd6, 0x9c, 0x97, 0xcf, 0x39, 0xeb, 0xf8, 0xd5, 0xbb, 0x1f, 0xe3, 0xee, 0xe9, 0x69, 0xf7, - 0xad, 0xb9, 0x33, 0xb7, 0x2f, 0xf7, 0x5e, 0x9b, 0xf1, 0x9d, 0x57, 0xee, 0xbd, 0xc9, 0x8c, 0x8f, - 0xdd, 0x76, 0xbb, 0xdb, 0xee, 0x76, 0xd6, 0xb1, 0x7b, 0x26, 0x77, 0x48, 0x86, 0x72, 0xd5, 0xf6, - 0x71, 0x8d, 0xeb, 0x54, 0x9d, 0xa9, 0xaa, 0xe3, 0x6e, 0x4f, 0x40, 0x79, 0x0c, 0x68, 0x06, 0x01, - 0x02, 0xe5, 0x57, 0x24, 0x14, 0x10, 0x08, 0x29, 0x3f, 0xa2, 0xf0, 0x03, 0x29, 0xfc, 0x40, 0x82, - 0x10, 0x84, 0x20, 0x20, 0x1e, 0x11, 0x42, 0x62, 0xf8, 0x63, 0x11, 0x23, 0x7e, 0x80, 0x04, 0x8a, - 0x88, 0x20, 0xa1, 0x15, 0x11, 0xb4, 0x5f, 0xf5, 0x3a, 0x75, 0xba, 0xed, 0x53, 0x76, 0x4f, 0x0f, - 0xcc, 0xbf, 0xaa, 0xbd, 0xd6, 0xfe, 0xd6, 0xae, 0x5d, 0xbb, 0xf6, 0x5e, 0x7b, 0xad, 0xb5, 0x57, - 0xc1, 0x72, 0xdb, 0x0a, 0x76, 0x7a, 0x5b, 0x33, 0x86, 0xdb, 0x99, 0x75, 0x7a, 0x1d, 0xbd, 0xeb, - 0xb9, 0xef, 0xf2, 0x8b, 0x6d, 0xdb, 0xbd, 0x37, 0xdb, 0xdd, 0x6d, 0xcf, 0xea, 0x5d, 0xcb, 0x8f, - 0x4a, 0xf6, 0x5e, 0xd4, 0xed, 0xee, 0x8e, 0xfe, 0xe2, 0x6c, 0x9b, 0x3a, 0xd4, 0xd3, 0x03, 0x6a, - 0xce, 0x74, 0x3d, 0x37, 0x70, 0xc9, 0xab, 0x11, 0xd0, 0x8c, 0x02, 0x9a, 0x51, 0xd5, 0x66, 0xba, - 0xbb, 0xed, 0x19, 0x06, 0x14, 0x95, 0x28, 0xa0, 0x4b, 0xbf, 0x17, 0x6b, 0x41, 0xdb, 0x6d, 0xbb, - 0xb3, 0x1c, 0x6f, 0xab, 0xb7, 0xcd, 0xef, 0xf8, 0x0d, 0xbf, 0x12, 0x72, 0x2e, 0x69, 0xbb, 0xaf, - 0xf9, 0x33, 0x96, 0xcb, 0x9a, 0x35, 0x6b, 0xb8, 0x1e, 0x9d, 0xdd, 0xeb, 0x6b, 0xcb, 0xa5, 0x97, - 0x22, 0x9e, 0x8e, 0x6e, 0xec, 0x58, 0x0e, 0xf5, 0xf6, 0xd5, 0xb3, 0xcc, 0x7a, 0xd4, 0x77, 0x7b, - 0x9e, 0x41, 0x8f, 0x55, 0xcb, 0x9f, 0xed, 0xd0, 0x40, 0xcf, 0x92, 0x35, 0x3b, 0xa8, 0x96, 0xd7, - 0x73, 0x02, 0xab, 0xd3, 0x2f, 0xe6, 0x95, 0x47, 0x55, 0xf0, 0x8d, 0x1d, 0xda, 0xd1, 0xfb, 0xea, - 0xfd, 0xfe, 0xa0, 0x7a, 0xbd, 0xc0, 0xb2, 0x67, 0x2d, 0x27, 0xf0, 0x03, 0x2f, 0x5d, 0x49, 0xfb, - 0x11, 0xc0, 0xd9, 0xf9, 0x2d, 0x3f, 0xf0, 0x74, 0x23, 0x58, 0x77, 0xcd, 0x0d, 0xda, 0xe9, 0xda, - 0x7a, 0x40, 0xc9, 0x2e, 0xd4, 0xd8, 0x03, 0x99, 0x7a, 0xa0, 0x4f, 0x15, 0xae, 0x16, 0xae, 0x35, - 0xe6, 0xe6, 0x67, 0x86, 0x7c, 0x81, 0x33, 0x6b, 0x12, 0xa8, 0x39, 0x7a, 0x78, 0x30, 0x5d, 0x53, - 0x77, 0x18, 0x0a, 0x20, 0xdf, 0x2e, 0xc0, 0xa8, 0xe3, 0x9a, 0xb4, 0x45, 0x6d, 0x6a, 0x04, 0xae, - 0x37, 0x55, 0xbc, 0x5a, 0xba, 0xd6, 0x98, 0xfb, 0xca, 0xd0, 0x12, 0x33, 0x9e, 0x68, 0xe6, 0x76, - 0x4c, 0xc0, 0x75, 0x27, 0xf0, 0xf6, 0x9b, 0xe7, 0x7e, 0x7c, 0x30, 0xfd, 0xd4, 0xe1, 0xc1, 0xf4, - 0x68, 0x9c, 0x84, 0x89, 0x96, 0x90, 0x4d, 0x68, 0x04, 0xae, 0xcd, 0xba, 0xcc, 0x72, 0x1d, 0x7f, - 0xaa, 0xc4, 0x1b, 0x76, 0x65, 0x46, 0x74, 0x35, 0x13, 0x3f, 0xc3, 0xc6, 0xd8, 0xcc, 0xde, 0x8b, - 0x33, 0x1b, 0x21, 0x5b, 0xf3, 0xac, 0x04, 0x6e, 0x44, 0x65, 0x3e, 0xc6, 0x71, 0x08, 0x85, 0x09, - 0x9f, 0x1a, 0x3d, 0xcf, 0x0a, 0xf6, 0x17, 0x5c, 0x27, 0xa0, 0xf7, 0x83, 0xa9, 0x32, 0xef, 0xe5, - 0x17, 0xb2, 0xa0, 0xd7, 0x5d, 0xb3, 0x95, 0xe4, 0x6e, 0x9e, 0x3d, 0x3c, 0x98, 0x9e, 0x48, 0x15, - 0x62, 0x1a, 0x93, 0x38, 0x30, 0x69, 0x75, 0xf4, 0x36, 0x5d, 0xef, 0xd9, 0x76, 0x8b, 0x1a, 0x1e, - 0x0d, 0xfc, 0xa9, 0x0a, 0x7f, 0x84, 0x6b, 0x59, 0x72, 0x56, 0x5d, 0x43, 0xb7, 0xef, 0x6c, 0xbd, - 0x4b, 0x8d, 0x00, 0xe9, 0x36, 0xf5, 0xa8, 0x63, 0xd0, 0xe6, 0x94, 0x7c, 0x98, 0xc9, 0x95, 0x14, - 0x12, 0xf6, 0x61, 0x93, 0x65, 0x38, 0xd3, 0xf5, 0x2c, 0x97, 0x37, 0xc1, 0xd6, 0x7d, 0xff, 0xb6, - 0xde, 0xa1, 0x53, 0x23, 0x57, 0x0b, 0xd7, 0xea, 0xcd, 0x8b, 0x12, 0xe6, 0xcc, 0x7a, 0x9a, 0x01, - 0xfb, 0xeb, 0x90, 0x6b, 0x50, 0x53, 0x85, 0x53, 0xd5, 0xab, 0x85, 0x6b, 0x15, 0x31, 0x76, 0x54, - 0x5d, 0x0c, 0xa9, 0x64, 0x09, 0x6a, 0xfa, 0xf6, 0xb6, 0xe5, 0x30, 0xce, 0x1a, 0xef, 0xc2, 0xcb, - 0x59, 0x8f, 0x36, 0x2f, 0x79, 0x04, 0x8e, 0xba, 0xc3, 0xb0, 0x2e, 0xb9, 0x09, 0xc4, 0xa7, 0xde, - 0x9e, 0x65, 0xd0, 0x79, 0xc3, 0x70, 0x7b, 0x4e, 0xc0, 0xdb, 0x5e, 0xe7, 0x6d, 0xbf, 0x24, 0xdb, - 0x4e, 0x5a, 0x7d, 0x1c, 0x98, 0x51, 0x8b, 0xbc, 0x01, 0x93, 0xf2, 0x5b, 0x8d, 0x7a, 0x01, 0x38, - 0xd2, 0x39, 0xd6, 0x91, 0x98, 0xa2, 0x61, 0x1f, 0x37, 0x31, 0xe1, 0xb2, 0xde, 0x0b, 0xdc, 0x0e, - 0x83, 0x4c, 0x0a, 0xdd, 0x70, 0x77, 0xa9, 0x33, 0xd5, 0xb8, 0x5a, 0xb8, 0x56, 0x6b, 0x5e, 0x3d, - 0x3c, 0x98, 0xbe, 0x3c, 0xff, 0x10, 0x3e, 0x7c, 0x28, 0x0a, 0xb9, 0x03, 0x75, 0xd3, 0xf1, 0xd7, - 0x5d, 0xdb, 0x32, 0xf6, 0xa7, 0x46, 0x79, 0x03, 0x5f, 0x94, 0x8f, 0x5a, 0x5f, 0xbc, 0xdd, 0x12, - 0x84, 0x07, 0x07, 0xd3, 0x97, 0xfb, 0xa7, 0xd4, 0x99, 0x90, 0x8e, 0x11, 0x06, 0x59, 0xe3, 0x80, - 0x0b, 0xae, 0xb3, 0x6d, 0xb5, 0xa7, 0xc6, 0xf8, 0xdb, 0xb8, 0x3a, 0x60, 0x40, 0x2f, 0xde, 0x6e, - 0x09, 0xbe, 0xe6, 0x98, 0x14, 0x27, 0x6e, 0x31, 0x42, 0x20, 0x26, 0x8c, 0xab, 0xc9, 0x78, 0xc1, - 0xd6, 0xad, 0x8e, 0x3f, 0x35, 0xce, 0x07, 0xef, 0x6f, 0x0e, 0xc0, 0xc4, 0x38, 0x73, 0xf3, 0x82, - 0x7c, 0x94, 0xf1, 0x44, 0xb1, 0x8f, 0x29, 0xcc, 0x4b, 0xaf, 0xc3, 0x99, 0xbe, 0xb9, 0x81, 0x4c, - 0x42, 0x69, 0x97, 0xee, 0xf3, 0xa9, 0xaf, 0x8e, 0xec, 0x92, 0x9c, 0x83, 0xca, 0x9e, 0x6e, 0xf7, - 0xe8, 0x54, 0x91, 0x97, 0x89, 0x9b, 0x3f, 0x28, 0xbe, 0x56, 0xd0, 0xfe, 0x56, 0x09, 0x46, 0xd5, - 0x8c, 0xd3, 0xb2, 0x9c, 0x5d, 0xf2, 0x26, 0x94, 0x6c, 0xb7, 0x2d, 0xe7, 0xcd, 0x3f, 0x1a, 0x7a, - 0x16, 0x5b, 0x75, 0xdb, 0xcd, 0xea, 0xe1, 0xc1, 0x74, 0x69, 0xd5, 0x6d, 0x23, 0x43, 0x24, 0x06, - 0x54, 0x76, 0xf5, 0xed, 0x5d, 0x9d, 0xb7, 0xa1, 0x31, 0xd7, 0x1c, 0x1a, 0xfa, 0x16, 0x43, 0x61, - 0x6d, 0x6d, 0xd6, 0x0f, 0x0f, 0xa6, 0x2b, 0xfc, 0x16, 0x05, 0x36, 0x71, 0xa1, 0xbe, 0x65, 0xeb, - 0xc6, 0xee, 0x8e, 0x6b, 0xd3, 0xa9, 0x52, 0x4e, 0x41, 0x4d, 0x85, 0x24, 0x5e, 0x73, 0x78, 0x8b, - 0x91, 0x0c, 0x62, 0xc0, 0x48, 0xcf, 0xf4, 0x2d, 0x67, 0x57, 0xce, 0x81, 0xaf, 0x0f, 0x2d, 0x6d, - 0x73, 0x91, 0x3f, 0x13, 0x1c, 0x1e, 0x4c, 0x8f, 0x88, 0x6b, 0x94, 0xd0, 0xda, 0x2f, 0x47, 0x61, - 0x5c, 0xbd, 0xa4, 0xbb, 0xd4, 0x0b, 0xe8, 0x7d, 0x72, 0x15, 0xca, 0x0e, 0xfb, 0x34, 0xf9, 0x4b, - 0x6e, 0x8e, 0xca, 0xe1, 0x52, 0xe6, 0x9f, 0x24, 0xa7, 0xb0, 0x96, 0x89, 0xa1, 0x22, 0x3b, 0x7c, - 0xf8, 0x96, 0xb5, 0x38, 0x8c, 0x68, 0x99, 0xb8, 0x46, 0x09, 0x4d, 0xde, 0x86, 0x32, 0x7f, 0x78, - 0xd1, 0xd5, 0x9f, 0x1f, 0x5e, 0x04, 0x7b, 0xf4, 0x1a, 0x7b, 0x02, 0xfe, 0xe0, 0x1c, 0x94, 0x0d, - 0xc5, 0x9e, 0xb9, 0x2d, 0x3b, 0xf6, 0x8f, 0x72, 0x74, 0xec, 0x92, 0x18, 0x8a, 0x9b, 0x8b, 0x4b, - 0xc8, 0x10, 0xc9, 0x5f, 0x29, 0xc0, 0x19, 0xc3, 0x75, 0x02, 0x9d, 0xe9, 0x19, 0x6a, 0x91, 0x9d, - 0xaa, 0x70, 0x39, 0x37, 0x87, 0x96, 0xb3, 0x90, 0x46, 0x6c, 0x9e, 0x67, 0x6b, 0x46, 0x5f, 0x31, - 0xf6, 0xcb, 0x26, 0x7f, 0xad, 0x00, 0xe7, 0xd9, 0x5c, 0xde, 0xc7, 0xcc, 0x57, 0xa0, 0x93, 0x6d, - 0xd5, 0xc5, 0xc3, 0x83, 0xe9, 0xf3, 0x2b, 0x59, 0xc2, 0x30, 0xbb, 0x0d, 0xac, 0x75, 0x67, 0xf5, - 0x7e, 0xb5, 0x84, 0xaf, 0x6e, 0x8d, 0xb9, 0xd5, 0x93, 0x54, 0x75, 0x9a, 0xcf, 0xc8, 0xa1, 0x9c, - 0xa5, 0xd9, 0x61, 0x56, 0x2b, 0xc8, 0x75, 0xa8, 0xee, 0xb9, 0x76, 0xaf, 0x43, 0xfd, 0xa9, 0x1a, - 0x9f, 0x62, 0x2f, 0x65, 0x4d, 0xb1, 0x77, 0x39, 0x4b, 0x73, 0x42, 0xc2, 0x57, 0xc5, 0xbd, 0x8f, - 0xaa, 0x2e, 0xb1, 0x60, 0xc4, 0xb6, 0x3a, 0x56, 0xe0, 0xf3, 0x85, 0xb3, 0x31, 0x77, 0x7d, 0xe8, - 0xc7, 0x12, 0x9f, 0xe8, 0x2a, 0x07, 0x13, 0x5f, 0x8d, 0xb8, 0x46, 0x29, 0x80, 0x4d, 0x85, 0xbe, - 0xa1, 0xdb, 0x62, 0x61, 0x6d, 0xcc, 0x7d, 0x61, 0xf8, 0xcf, 0x86, 0xa1, 0x34, 0xc7, 0xe4, 0x33, - 0x55, 0xf8, 0x2d, 0x0a, 0x6c, 0xf2, 0x65, 0x18, 0x4f, 0xbc, 0x4d, 0x7f, 0xaa, 0xc1, 0x7b, 0xe7, - 0xd9, 0xac, 0xde, 0x09, 0xb9, 0xa2, 0x95, 0x27, 0x31, 0x42, 0x7c, 0x4c, 0x81, 0x91, 0x5b, 0x50, - 0xf3, 0x2d, 0x93, 0x1a, 0xba, 0xe7, 0x4f, 0x8d, 0x1e, 0x05, 0x78, 0x52, 0x02, 0xd7, 0x5a, 0xb2, - 0x1a, 0x86, 0x00, 0x64, 0x06, 0xa0, 0xab, 0x7b, 0x81, 0x25, 0x14, 0xd5, 0x31, 0xae, 0x34, 0x8d, - 0x1f, 0x1e, 0x4c, 0xc3, 0x7a, 0x58, 0x8a, 0x31, 0x0e, 0xc6, 0xcf, 0xea, 0xae, 0x38, 0xdd, 0x5e, - 0x20, 0x16, 0xd6, 0xba, 0xe0, 0x6f, 0x85, 0xa5, 0x18, 0xe3, 0x20, 0xdf, 0x2f, 0xc0, 0x33, 0xd1, - 0x6d, 0xff, 0x47, 0x36, 0x71, 0xe2, 0x1f, 0xd9, 0xf4, 0xe1, 0xc1, 0xf4, 0x33, 0xad, 0xc1, 0x22, - 0xf1, 0x61, 0xed, 0x21, 0x1f, 0x16, 0x60, 0xbc, 0xd7, 0x35, 0xf5, 0x80, 0xb6, 0x02, 0xb6, 0xe3, - 0x69, 0xef, 0x4f, 0x4d, 0xf2, 0x26, 0x2e, 0x0f, 0x3f, 0x0b, 0x26, 0xe0, 0xa2, 0xd7, 0x9c, 0x2c, - 0xc7, 0x94, 0x58, 0xed, 0x4d, 0x18, 0x9b, 0xef, 0x05, 0x3b, 0xae, 0x67, 0xbd, 0xcf, 0xd5, 0x7f, - 0xb2, 0x04, 0x95, 0x80, 0xab, 0x71, 0x42, 0x43, 0x78, 0x3e, 0xeb, 0xa5, 0x0b, 0x95, 0xfa, 0x16, - 0xdd, 0x57, 0x7a, 0x89, 0x58, 0xa9, 0x85, 0x5a, 0x27, 0xaa, 0x6b, 0x7f, 0xae, 0x00, 0xd5, 0xa6, - 0x6e, 0xec, 0xba, 0xdb, 0xdb, 0xe4, 0x2d, 0xa8, 0x59, 0x4e, 0x40, 0xbd, 0x3d, 0xdd, 0x96, 0xb0, - 0x33, 0x31, 0xd8, 0x70, 0x43, 0x18, 0x3d, 0x1e, 0xdb, 0x7d, 0x31, 0x41, 0x8b, 0x3d, 0xb9, 0x6b, - 0xe1, 0x9a, 0xf1, 0x8a, 0xc4, 0xc0, 0x10, 0x8d, 0x4c, 0x43, 0xc5, 0x0f, 0x68, 0xd7, 0xe7, 0x6b, - 0xe0, 0x98, 0x68, 0x46, 0x8b, 0x15, 0xa0, 0x28, 0xd7, 0xfe, 0x66, 0x01, 0xea, 0x4d, 0xdd, 0xb7, - 0x0c, 0xf6, 0x94, 0x64, 0x01, 0xca, 0x3d, 0x9f, 0x7a, 0xc7, 0x7b, 0x36, 0xbe, 0x6c, 0x6d, 0xfa, - 0xd4, 0x43, 0x5e, 0x99, 0xdc, 0x81, 0x5a, 0x57, 0xf7, 0xfd, 0x7b, 0xae, 0x67, 0xca, 0xa5, 0xf7, - 0x88, 0x40, 0x62, 0x9b, 0x20, 0xab, 0x62, 0x08, 0xa2, 0x35, 0x20, 0xd2, 0x3d, 0xb4, 0x9f, 0x17, - 0xe0, 0x6c, 0xb3, 0xb7, 0xbd, 0x4d, 0x3d, 0xa9, 0x15, 0x4b, 0x7d, 0x93, 0x42, 0xc5, 0xa3, 0xa6, - 0xe5, 0xcb, 0xb6, 0x2f, 0x0e, 0x3d, 0x50, 0x90, 0xa1, 0x48, 0xf5, 0x96, 0xf7, 0x17, 0x2f, 0x40, - 0x81, 0x4e, 0x7a, 0x50, 0x7f, 0x97, 0xb2, 0xdd, 0x38, 0xd5, 0x3b, 0xf2, 0xe9, 0x6e, 0x0c, 0x2d, - 0xea, 0x26, 0x0d, 0x5a, 0x1c, 0x29, 0xae, 0x4d, 0x87, 0x85, 0x18, 0x49, 0xd2, 0x7e, 0x54, 0x81, - 0xd1, 0x05, 0xb7, 0xb3, 0x65, 0x39, 0xd4, 0xbc, 0x6e, 0xb6, 0x29, 0x79, 0x07, 0xca, 0xd4, 0x6c, - 0x53, 0xf9, 0xb4, 0xc3, 0x2b, 0x1e, 0x0c, 0x2c, 0x52, 0x9f, 0xd8, 0x1d, 0x72, 0x60, 0xb2, 0x0a, - 0xe3, 0xdb, 0x9e, 0xdb, 0x11, 0x73, 0xf9, 0xc6, 0x7e, 0x57, 0xea, 0xce, 0xcd, 0xdf, 0x54, 0x1f, - 0xce, 0x52, 0x82, 0xfa, 0xe0, 0x60, 0x1a, 0xa2, 0x3b, 0x4c, 0xd5, 0x25, 0x6f, 0xc1, 0x54, 0x54, - 0x12, 0x4e, 0x6a, 0x0b, 0x6c, 0x3b, 0xc3, 0x75, 0xa7, 0x4a, 0xf3, 0xf2, 0xe1, 0xc1, 0xf4, 0xd4, - 0xd2, 0x00, 0x1e, 0x1c, 0x58, 0x9b, 0x4d, 0x15, 0x93, 0x11, 0x51, 0x2c, 0x34, 0x52, 0x65, 0x3a, - 0xa1, 0x15, 0x8c, 0xef, 0xfb, 0x96, 0x52, 0x22, 0xb0, 0x4f, 0x28, 0x59, 0x82, 0xd1, 0xc0, 0x8d, - 0xf5, 0x57, 0x85, 0xf7, 0x97, 0xa6, 0x0c, 0x15, 0x1b, 0xee, 0xc0, 0xde, 0x4a, 0xd4, 0x23, 0x08, - 0x17, 0xd4, 0x7d, 0xaa, 0xa7, 0x46, 0x78, 0x4f, 0x5d, 0x3a, 0x3c, 0x98, 0xbe, 0xb0, 0x91, 0xc9, - 0x81, 0x03, 0x6a, 0x92, 0x6f, 0x14, 0x60, 0x5c, 0x91, 0x64, 0x1f, 0x55, 0x4f, 0xb2, 0x8f, 0x08, - 0x1b, 0x11, 0x1b, 0x09, 0x01, 0x98, 0x12, 0xa8, 0xfd, 0xb2, 0x0c, 0xf5, 0x70, 0xaa, 0x27, 0xcf, - 0x41, 0x85, 0x9b, 0x20, 0xa4, 0x06, 0x1f, 0xae, 0xe1, 0xdc, 0x52, 0x81, 0x82, 0x46, 0x9e, 0x87, - 0xaa, 0xe1, 0x76, 0x3a, 0xba, 0x63, 0x72, 0xb3, 0x52, 0xbd, 0xd9, 0x60, 0xaa, 0xcb, 0x82, 0x28, - 0x42, 0x45, 0x23, 0x97, 0xa1, 0xac, 0x7b, 0x6d, 0x61, 0xe1, 0xa9, 0x8b, 0xf9, 0x68, 0xde, 0x6b, - 0xfb, 0xc8, 0x4b, 0xc9, 0xe7, 0xa0, 0x44, 0x9d, 0xbd, 0xa9, 0xf2, 0x60, 0xdd, 0xe8, 0xba, 0xb3, - 0x77, 0x57, 0xf7, 0x9a, 0x0d, 0xd9, 0x86, 0xd2, 0x75, 0x67, 0x0f, 0x59, 0x1d, 0xb2, 0x0a, 0x55, - 0xea, 0xec, 0xb1, 0x77, 0x2f, 0x4d, 0x2f, 0xbf, 0x31, 0xa0, 0x3a, 0x63, 0x91, 0xdb, 0x84, 0x50, - 0xc3, 0x92, 0xc5, 0xa8, 0x20, 0xc8, 0x97, 0x60, 0x54, 0x28, 0x5b, 0x6b, 0xec, 0x9d, 0xf8, 0x53, - 0x23, 0x1c, 0x72, 0x7a, 0xb0, 0xb6, 0xc6, 0xf9, 0x22, 0x53, 0x57, 0xac, 0xd0, 0xc7, 0x04, 0x14, - 0xf9, 0x12, 0xd4, 0xd5, 0xce, 0x58, 0xbd, 0xd9, 0x4c, 0x2b, 0x91, 0xda, 0x4e, 0x23, 0x7d, 0xaf, - 0x67, 0x79, 0xb4, 0x43, 0x9d, 0xc0, 0x6f, 0x9e, 0x51, 0x76, 0x03, 0x45, 0xf5, 0x31, 0x42, 0x23, - 0x5b, 0xfd, 0xe6, 0x2e, 0x61, 0xab, 0x79, 0x6e, 0xc0, 0xac, 0x3e, 0x84, 0xad, 0xeb, 0x2b, 0x30, - 0x11, 0xda, 0xa3, 0xa4, 0x49, 0x43, 0x58, 0x6f, 0x5e, 0x62, 0xd5, 0x57, 0x92, 0xa4, 0x07, 0x07, - 0xd3, 0xcf, 0x66, 0x18, 0x35, 0x22, 0x06, 0x4c, 0x83, 0x69, 0x3f, 0x2c, 0x41, 0xff, 0x3e, 0x24, - 0xd9, 0x69, 0x85, 0x93, 0xee, 0xb4, 0xf4, 0x03, 0x89, 0xe9, 0xf3, 0x35, 0x59, 0x2d, 0xff, 0x43, - 0x65, 0xbd, 0x98, 0xd2, 0x49, 0xbf, 0x98, 0x27, 0xe5, 0xdb, 0xd1, 0x3e, 0x2a, 0xc3, 0xf8, 0xa2, - 0x4e, 0x3b, 0xae, 0xf3, 0xc8, 0x5d, 0x59, 0xe1, 0x89, 0xd8, 0x95, 0x5d, 0x83, 0x9a, 0x47, 0xbb, - 0xb6, 0x65, 0xe8, 0x42, 0xf9, 0x92, 0x56, 0x50, 0x94, 0x65, 0x18, 0x52, 0x07, 0xec, 0xc6, 0x4b, - 0x4f, 0xe4, 0x6e, 0xbc, 0xfc, 0xc9, 0xef, 0xc6, 0xb5, 0x6f, 0x14, 0x81, 0x2b, 0x2a, 0xe4, 0x2a, - 0x94, 0xd9, 0x22, 0x9c, 0xb6, 0x01, 0xf1, 0x81, 0xc3, 0x29, 0xe4, 0x12, 0x14, 0x03, 0x57, 0x7e, - 0x79, 0x20, 0xe9, 0xc5, 0x0d, 0x17, 0x8b, 0x81, 0x4b, 0xde, 0x07, 0x30, 0x5c, 0xc7, 0xb4, 0x94, - 0x73, 0x20, 0xdf, 0x83, 0x2d, 0xb9, 0xde, 0x3d, 0xdd, 0x33, 0x17, 0x42, 0x44, 0xb1, 0x1f, 0x8b, - 0xee, 0x31, 0x26, 0x8d, 0xbc, 0x0e, 0x23, 0xae, 0xb3, 0xd4, 0xb3, 0x6d, 0xde, 0xa1, 0xf5, 0xe6, - 0x6f, 0xb1, 0x4d, 0xf2, 0x1d, 0x5e, 0xf2, 0xe0, 0x60, 0xfa, 0xa2, 0xd0, 0x6f, 0xd9, 0xdd, 0x9b, - 0x9e, 0x15, 0x58, 0x4e, 0x3b, 0xdc, 0x9e, 0xc8, 0x6a, 0xda, 0xb7, 0x0a, 0xd0, 0x58, 0xb2, 0xee, - 0x53, 0xf3, 0x4d, 0xcb, 0x31, 0xdd, 0x7b, 0x04, 0x61, 0xc4, 0xa6, 0x4e, 0x3b, 0xd8, 0x19, 0x72, - 0xff, 0x20, 0x76, 0xe9, 0x1c, 0x01, 0x25, 0x12, 0x99, 0x85, 0xba, 0xd0, 0x3e, 0x2d, 0xa7, 0xcd, - 0xfb, 0xb0, 0x16, 0x4d, 0x7a, 0x2d, 0x45, 0xc0, 0x88, 0x47, 0xdb, 0x87, 0x33, 0x7d, 0xdd, 0x40, - 0x4c, 0x28, 0x07, 0x7a, 0x5b, 0xcd, 0xaf, 0x4b, 0x43, 0x77, 0xf0, 0x86, 0xde, 0x8e, 0x75, 0x2e, - 0x5f, 0xe3, 0x37, 0x74, 0xb6, 0xc6, 0x33, 0x74, 0xed, 0x57, 0x05, 0xa8, 0x2d, 0xf5, 0x1c, 0x83, - 0x6f, 0xd1, 0x1e, 0x6d, 0x1b, 0x54, 0x0a, 0x43, 0x31, 0x53, 0x61, 0xe8, 0xc1, 0xc8, 0xee, 0xbd, - 0x50, 0xa1, 0x68, 0xcc, 0xad, 0x0d, 0x3f, 0x2a, 0x64, 0x93, 0x66, 0x6e, 0x71, 0x3c, 0xe1, 0xba, - 0x1a, 0x97, 0x0d, 0x1a, 0xb9, 0xf5, 0x26, 0x17, 0x2a, 0x85, 0x5d, 0xfa, 0x1c, 0x34, 0x62, 0x6c, - 0xc7, 0xb2, 0x62, 0xff, 0xbd, 0x32, 0x8c, 0x2c, 0xb7, 0x5a, 0xf3, 0xeb, 0x2b, 0xe4, 0x65, 0x68, - 0x48, 0xaf, 0xc6, 0xed, 0xa8, 0x0f, 0x42, 0xa7, 0x56, 0x2b, 0x22, 0x61, 0x9c, 0x8f, 0xa9, 0x63, - 0x1e, 0xd5, 0xed, 0x8e, 0xfc, 0x58, 0x42, 0x75, 0x0c, 0x59, 0x21, 0x0a, 0x1a, 0xd1, 0x61, 0x9c, - 0xed, 0xf0, 0x58, 0x17, 0x8a, 0xdd, 0x9b, 0xfc, 0x6c, 0x8e, 0xb8, 0xbf, 0xe3, 0x4a, 0xe2, 0x66, - 0x02, 0x00, 0x53, 0x80, 0xe4, 0x35, 0xa8, 0xe9, 0xbd, 0x60, 0x87, 0x2b, 0xd0, 0xe2, 0xdb, 0xb8, - 0xcc, 0x9d, 0x3e, 0xb2, 0xec, 0xc1, 0xc1, 0xf4, 0xe8, 0x2d, 0x6c, 0xbe, 0xac, 0xee, 0x31, 0xe4, - 0x66, 0x8d, 0x53, 0x3b, 0x46, 0xd9, 0xb8, 0xca, 0xb1, 0x1b, 0xb7, 0x9e, 0x00, 0xc0, 0x14, 0x20, - 0x79, 0x1b, 0x46, 0x77, 0xe9, 0x7e, 0xa0, 0x6f, 0x49, 0x01, 0x23, 0xc7, 0x11, 0x30, 0xc9, 0x54, - 0xb8, 0x5b, 0xb1, 0xea, 0x98, 0x00, 0x23, 0x3e, 0x9c, 0xdb, 0xa5, 0xde, 0x16, 0xf5, 0x5c, 0xb9, - 0xfb, 0x94, 0x42, 0xaa, 0xc7, 0x11, 0x32, 0x75, 0x78, 0x30, 0x7d, 0xee, 0x56, 0x06, 0x0c, 0x66, - 0x82, 0x6b, 0xff, 0xbb, 0x08, 0x13, 0xcb, 0xc2, 0xad, 0xec, 0x7a, 0x62, 0x11, 0x26, 0x17, 0xa1, - 0xe4, 0x75, 0x7b, 0x7c, 0xe4, 0x94, 0x84, 0xe1, 0x18, 0xd7, 0x37, 0x91, 0x95, 0x91, 0xb7, 0xa0, - 0x66, 0xca, 0x29, 0x43, 0x6e, 0x7e, 0x87, 0x32, 0x54, 0xa8, 0x3b, 0x0c, 0xd1, 0x98, 0xa6, 0xdf, - 0xf1, 0xdb, 0x2d, 0xeb, 0x7d, 0x2a, 0xf7, 0x83, 0x5c, 0xd3, 0x5f, 0x13, 0x45, 0xa8, 0x68, 0x6c, - 0x55, 0xdd, 0xa5, 0xfb, 0x62, 0x37, 0x54, 0x8e, 0x56, 0xd5, 0x5b, 0xb2, 0x0c, 0x43, 0x2a, 0x99, - 0x56, 0x1f, 0x0b, 0x1b, 0x05, 0x65, 0xb1, 0x93, 0xbf, 0xcb, 0x0a, 0xe4, 0x77, 0xc3, 0xa6, 0xcc, - 0x77, 0xad, 0x20, 0xa0, 0x9e, 0x7c, 0x8d, 0x43, 0x4d, 0x99, 0x37, 0x39, 0x02, 0x4a, 0x24, 0xf2, - 0x3b, 0x50, 0xe7, 0xe0, 0x4d, 0xdb, 0xdd, 0xe2, 0x2f, 0xae, 0x2e, 0xf6, 0xf4, 0x77, 0x55, 0x21, - 0x46, 0x74, 0xed, 0xd7, 0x45, 0xb8, 0xb0, 0x4c, 0x03, 0xa1, 0xd5, 0x2c, 0xd2, 0xae, 0xed, 0xee, - 0x33, 0xd5, 0x12, 0xe9, 0x7b, 0xe4, 0x0d, 0x00, 0xcb, 0xdf, 0x6a, 0xed, 0x19, 0xfc, 0x3b, 0x10, - 0xdf, 0xf0, 0x55, 0xf9, 0x49, 0xc2, 0x4a, 0xab, 0x29, 0x29, 0x0f, 0x12, 0x77, 0x18, 0xab, 0x13, - 0x6d, 0xaf, 0x8a, 0x0f, 0xd9, 0x5e, 0xb5, 0x00, 0xba, 0x91, 0x82, 0x5a, 0xe2, 0x9c, 0xbf, 0xaf, - 0xc4, 0x1c, 0x47, 0x37, 0x8d, 0xc1, 0xe4, 0x51, 0x19, 0x1d, 0x98, 0x34, 0xe9, 0xb6, 0xde, 0xb3, - 0x83, 0x50, 0xa9, 0x96, 0x1f, 0xf1, 0xd1, 0xf5, 0xf2, 0xd0, 0xe5, 0xbd, 0x98, 0x42, 0xc2, 0x3e, - 0x6c, 0xed, 0xef, 0x97, 0xe0, 0xd2, 0x32, 0x0d, 0x42, 0x8b, 0x8b, 0x9c, 0x1d, 0x5b, 0x5d, 0x6a, - 0xb0, 0xb7, 0xf0, 0x61, 0x01, 0x46, 0x6c, 0x7d, 0x8b, 0xda, 0x6c, 0xf5, 0x62, 0x4f, 0xf3, 0xce, - 0xd0, 0x0b, 0xc1, 0x60, 0x29, 0x33, 0xab, 0x5c, 0x42, 0x6a, 0x69, 0x10, 0x85, 0x28, 0xc5, 0xb3, - 0x49, 0xdd, 0xb0, 0x7b, 0x7e, 0x40, 0xbd, 0x75, 0xd7, 0x0b, 0xa4, 0x3e, 0x19, 0x4e, 0xea, 0x0b, - 0x11, 0x09, 0xe3, 0x7c, 0x64, 0x0e, 0xc0, 0xb0, 0x2d, 0xea, 0x04, 0xbc, 0x96, 0xf8, 0xae, 0x88, - 0x7a, 0xbf, 0x0b, 0x21, 0x05, 0x63, 0x5c, 0x4c, 0x54, 0xc7, 0x75, 0xac, 0xc0, 0x15, 0xa2, 0xca, - 0x49, 0x51, 0x6b, 0x11, 0x09, 0xe3, 0x7c, 0xbc, 0x1a, 0x0d, 0x3c, 0xcb, 0xf0, 0x79, 0xb5, 0x4a, - 0xaa, 0x5a, 0x44, 0xc2, 0x38, 0x1f, 0x5b, 0xf3, 0x62, 0xcf, 0x7f, 0xac, 0x35, 0xef, 0x7b, 0x75, - 0xb8, 0x92, 0xe8, 0xd6, 0x40, 0x0f, 0xe8, 0x76, 0xcf, 0x6e, 0xd1, 0x40, 0xbd, 0xc0, 0x21, 0xd7, - 0xc2, 0xbf, 0x18, 0xbd, 0x77, 0x11, 0xcc, 0x62, 0x9c, 0xcc, 0x7b, 0xef, 0x6b, 0xe0, 0x91, 0xde, - 0xfd, 0x2c, 0xd4, 0x1d, 0x3d, 0xf0, 0xf9, 0x87, 0x2b, 0xbf, 0xd1, 0x50, 0x0d, 0xbb, 0xad, 0x08, - 0x18, 0xf1, 0x90, 0x75, 0x38, 0x27, 0xbb, 0xf8, 0xfa, 0xfd, 0xae, 0xeb, 0x05, 0xd4, 0x13, 0x75, - 0xe5, 0x72, 0x2a, 0xeb, 0x9e, 0x5b, 0xcb, 0xe0, 0xc1, 0xcc, 0x9a, 0x64, 0x0d, 0xce, 0x1a, 0xc2, - 0xc1, 0x4f, 0x6d, 0x57, 0x37, 0x15, 0xa0, 0x30, 0x70, 0x85, 0x5b, 0xa3, 0x85, 0x7e, 0x16, 0xcc, - 0xaa, 0x97, 0x1e, 0xcd, 0x23, 0x43, 0x8d, 0xe6, 0xea, 0x30, 0xa3, 0xb9, 0x36, 0xdc, 0x68, 0xae, - 0x1f, 0x6d, 0x34, 0xb3, 0x9e, 0x67, 0xe3, 0x88, 0x7a, 0x4c, 0x3d, 0x11, 0x2b, 0x6c, 0x2c, 0x7e, - 0x24, 0xec, 0xf9, 0x56, 0x06, 0x0f, 0x66, 0xd6, 0x24, 0x5b, 0x70, 0x49, 0x94, 0x5f, 0x77, 0x0c, - 0x6f, 0xbf, 0xcb, 0x16, 0x9e, 0x18, 0x6e, 0x23, 0x61, 0x61, 0xbc, 0xd4, 0x1a, 0xc8, 0x89, 0x0f, - 0x41, 0x21, 0x7f, 0x08, 0x63, 0xe2, 0x2d, 0xad, 0xe9, 0x5d, 0x0e, 0x2b, 0xa2, 0x49, 0xce, 0x4b, - 0xd8, 0xb1, 0x85, 0x38, 0x11, 0x93, 0xbc, 0x64, 0x1e, 0x26, 0xba, 0x7b, 0x06, 0xbb, 0x5c, 0xd9, - 0xbe, 0x4d, 0xa9, 0x49, 0x4d, 0xee, 0xbe, 0xaa, 0x37, 0x9f, 0x56, 0x86, 0x8e, 0xf5, 0x24, 0x19, - 0xd3, 0xfc, 0xe4, 0x35, 0x18, 0xf5, 0x03, 0xdd, 0x0b, 0xa4, 0x59, 0x6f, 0x6a, 0x5c, 0x44, 0xdb, - 0x28, 0xab, 0x57, 0x2b, 0x46, 0xc3, 0x04, 0x67, 0xe6, 0x7a, 0x31, 0x71, 0x7a, 0xeb, 0x45, 0x9e, - 0xd9, 0xea, 0x9f, 0x15, 0xe1, 0xea, 0x32, 0x0d, 0xd6, 0x5c, 0x47, 0x1a, 0x45, 0xb3, 0x96, 0xfd, - 0x23, 0xd9, 0x44, 0x93, 0x8b, 0x76, 0xf1, 0x44, 0x17, 0xed, 0xd2, 0x09, 0x2d, 0xda, 0xe5, 0x53, - 0x5c, 0xb4, 0xff, 0x61, 0x11, 0x9e, 0x4e, 0xf4, 0xe4, 0xba, 0x6b, 0xaa, 0x09, 0xff, 0xb3, 0x0e, - 0x3c, 0x42, 0x07, 0x3e, 0x10, 0x7a, 0x27, 0x77, 0x6b, 0xa5, 0x34, 0x9e, 0x0f, 0xd2, 0x1a, 0xcf, - 0xdb, 0x79, 0x56, 0xbe, 0x0c, 0x09, 0x47, 0x5a, 0xf1, 0x6e, 0x02, 0xf1, 0xa4, 0x13, 0x4e, 0x98, - 0x7e, 0x62, 0x4a, 0x4f, 0x18, 0xce, 0x87, 0x7d, 0x1c, 0x98, 0x51, 0x8b, 0xb4, 0xe0, 0xbc, 0x4f, - 0x9d, 0xc0, 0x72, 0xa8, 0x9d, 0x84, 0x13, 0xda, 0xd0, 0xb3, 0x12, 0xee, 0x7c, 0x2b, 0x8b, 0x09, - 0xb3, 0xeb, 0xe6, 0x99, 0x07, 0xfe, 0x25, 0x70, 0x95, 0x53, 0x74, 0xcd, 0x89, 0x69, 0x2c, 0x1f, - 0xa6, 0x35, 0x96, 0x77, 0xf2, 0xbf, 0xb7, 0xe1, 0xb4, 0x95, 0x39, 0x00, 0xfe, 0x16, 0xe2, 0xea, - 0x4a, 0xb8, 0x48, 0x63, 0x48, 0xc1, 0x18, 0x17, 0x5b, 0x80, 0x54, 0x3f, 0xc7, 0x35, 0x95, 0x70, - 0x01, 0x6a, 0xc5, 0x89, 0x98, 0xe4, 0x1d, 0xa8, 0xed, 0x54, 0x86, 0xd6, 0x76, 0x6e, 0x02, 0x49, - 0x18, 0x1e, 0x05, 0xde, 0x48, 0x32, 0x9a, 0x74, 0xa5, 0x8f, 0x03, 0x33, 0x6a, 0x0d, 0x18, 0xca, - 0xd5, 0x93, 0x1d, 0xca, 0xb5, 0xe1, 0x87, 0x32, 0x79, 0x07, 0x2e, 0x72, 0x51, 0xb2, 0x7f, 0x92, - 0xc0, 0x42, 0xef, 0xf9, 0x0d, 0x09, 0x7c, 0x11, 0x07, 0x31, 0xe2, 0x60, 0x0c, 0xf6, 0x7e, 0x0c, - 0x8f, 0x9a, 0x4c, 0xb8, 0x6e, 0x0f, 0xd6, 0x89, 0x16, 0x32, 0x78, 0x30, 0xb3, 0x26, 0x1b, 0x62, - 0x01, 0x1b, 0x86, 0xfa, 0x96, 0x4d, 0x4d, 0x19, 0x4d, 0x1b, 0x0e, 0xb1, 0x8d, 0xd5, 0x96, 0xa4, - 0x60, 0x8c, 0x2b, 0x4b, 0x4d, 0x19, 0x3d, 0xa6, 0x9a, 0xb2, 0xcc, 0xad, 0xf4, 0xdb, 0x09, 0x6d, - 0x48, 0xea, 0x3a, 0x61, 0x7c, 0xf4, 0x42, 0x9a, 0x01, 0xfb, 0xeb, 0x70, 0x2d, 0xd1, 0xf0, 0xac, - 0x6e, 0xe0, 0x27, 0xb1, 0xc6, 0x53, 0x5a, 0x62, 0x06, 0x0f, 0x66, 0xd6, 0x64, 0xfa, 0xf9, 0x0e, - 0xd5, 0xed, 0x60, 0x27, 0x09, 0x38, 0x91, 0xd4, 0xcf, 0x6f, 0xf4, 0xb3, 0x60, 0x56, 0xbd, 0xcc, - 0x05, 0x69, 0xf2, 0xc9, 0x54, 0xab, 0xbe, 0x59, 0x82, 0x8b, 0xcb, 0x34, 0x08, 0x03, 0x8d, 0x3e, - 0x33, 0xa3, 0x7c, 0x02, 0x66, 0x94, 0xef, 0x56, 0xe0, 0xec, 0x32, 0x0d, 0xfa, 0xb4, 0xb1, 0xff, - 0x4f, 0xbb, 0x7f, 0x0d, 0xce, 0x46, 0xb1, 0x6d, 0xad, 0xc0, 0xf5, 0xc4, 0x5a, 0x9e, 0xda, 0x2d, - 0xb7, 0xfa, 0x59, 0x30, 0xab, 0x1e, 0xf9, 0x12, 0x3c, 0xcd, 0x97, 0x7a, 0xa7, 0x2d, 0xec, 0xb3, - 0xc2, 0x98, 0x10, 0x3b, 0x9d, 0x31, 0x2d, 0x21, 0x9f, 0x6e, 0x65, 0xb3, 0xe1, 0xa0, 0xfa, 0xe4, - 0x6b, 0x30, 0xda, 0xb5, 0xba, 0xd4, 0xb6, 0x1c, 0xae, 0x9f, 0xe5, 0x0e, 0x09, 0x59, 0x8f, 0x81, - 0x45, 0x1b, 0xb8, 0x78, 0x29, 0x26, 0x04, 0x66, 0x8e, 0xd4, 0xda, 0x29, 0x8e, 0xd4, 0xff, 0x51, - 0x84, 0xea, 0xb2, 0xe7, 0xf6, 0xba, 0xcd, 0x7d, 0xd2, 0x86, 0x91, 0x7b, 0xdc, 0x79, 0x26, 0x5d, - 0x53, 0xc3, 0xc7, 0x87, 0x0b, 0x1f, 0x5c, 0xa4, 0x12, 0x89, 0x7b, 0x94, 0xf0, 0x6c, 0x10, 0xef, - 0xd2, 0x7d, 0x6a, 0x4a, 0x1f, 0x5a, 0x38, 0x88, 0x6f, 0xb1, 0x42, 0x14, 0x34, 0xd2, 0x81, 0x09, - 0xdd, 0xb6, 0xdd, 0x7b, 0xd4, 0x5c, 0xd5, 0x03, 0xea, 0x50, 0x5f, 0xb9, 0x24, 0x8f, 0x6b, 0x96, - 0xe6, 0x7e, 0xfd, 0xf9, 0x24, 0x14, 0xa6, 0xb1, 0xc9, 0xbb, 0x50, 0xf5, 0x03, 0xd7, 0x53, 0xca, - 0x56, 0x63, 0x6e, 0x61, 0xf8, 0x97, 0xde, 0xfc, 0x62, 0x4b, 0x40, 0x09, 0x9b, 0xbd, 0xbc, 0x41, - 0x25, 0x40, 0xfb, 0x4e, 0x01, 0xe0, 0xc6, 0xc6, 0xc6, 0xba, 0x74, 0x2f, 0x98, 0x50, 0xd6, 0x7b, - 0xa1, 0xa3, 0x72, 0x78, 0x87, 0x60, 0x22, 0x2c, 0x53, 0xfa, 0xf0, 0x7a, 0xc1, 0x0e, 0x72, 0x74, - 0xf2, 0xdb, 0x50, 0x95, 0x0a, 0xb2, 0xec, 0xf6, 0x30, 0xb4, 0x40, 0x2a, 0xd1, 0xa8, 0xe8, 0xda, - 0xdf, 0x2d, 0x02, 0xac, 0x98, 0x36, 0x6d, 0xa9, 0x90, 0xfe, 0x7a, 0xb0, 0xe3, 0x51, 0x7f, 0xc7, - 0xb5, 0xcd, 0x21, 0xbd, 0xa9, 0xdc, 0xe6, 0xbf, 0xa1, 0x40, 0x30, 0xc2, 0x23, 0x26, 0x8c, 0xfa, - 0x01, 0xed, 0xaa, 0x48, 0xcd, 0x21, 0x9d, 0x28, 0x93, 0xc2, 0x2e, 0x12, 0xe1, 0x60, 0x02, 0x95, - 0xe8, 0xd0, 0xb0, 0x1c, 0x43, 0x7c, 0x20, 0xcd, 0xfd, 0x21, 0x07, 0xd2, 0x04, 0xdb, 0x71, 0xac, - 0x44, 0x30, 0x18, 0xc7, 0xd4, 0x7e, 0x56, 0x84, 0x0b, 0x5c, 0x1e, 0x6b, 0x46, 0x22, 0x1e, 0x93, - 0xfc, 0xe9, 0xbe, 0xe3, 0x87, 0x7f, 0xf2, 0x68, 0xa2, 0xc5, 0xe9, 0xb5, 0x35, 0x1a, 0xe8, 0x91, - 0x3e, 0x17, 0x95, 0xc5, 0xce, 0x1c, 0xf6, 0xa0, 0xec, 0xb3, 0xf9, 0x4a, 0xf4, 0x5e, 0x6b, 0xe8, - 0x21, 0x94, 0xfd, 0x00, 0x7c, 0xf6, 0x0a, 0xbd, 0xc6, 0x7c, 0xd6, 0xe2, 0xe2, 0xc8, 0x9f, 0x85, - 0x11, 0x3f, 0xd0, 0x83, 0x9e, 0xfa, 0x34, 0x37, 0x4f, 0x5a, 0x30, 0x07, 0x8f, 0xe6, 0x11, 0x71, - 0x8f, 0x52, 0xa8, 0xf6, 0xb3, 0x02, 0x5c, 0xca, 0xae, 0xb8, 0x6a, 0xf9, 0x01, 0xf9, 0x53, 0x7d, - 0xdd, 0x7e, 0xc4, 0x37, 0xce, 0x6a, 0xf3, 0x4e, 0x0f, 0x23, 0xd4, 0x55, 0x49, 0xac, 0xcb, 0x03, - 0xa8, 0x58, 0x01, 0xed, 0xa8, 0xfd, 0xe5, 0x9d, 0x13, 0x7e, 0xf4, 0xd8, 0xd2, 0xce, 0xa4, 0xa0, - 0x10, 0xa6, 0x7d, 0x54, 0x1c, 0xf4, 0xc8, 0x7c, 0xf9, 0xb0, 0x93, 0x31, 0xbf, 0xb7, 0xf2, 0xc5, - 0xfc, 0x26, 0x1b, 0xd4, 0x1f, 0xfa, 0xfb, 0x67, 0xfa, 0x43, 0x7f, 0xef, 0xe4, 0x0f, 0xfd, 0x4d, - 0x75, 0xc3, 0xc0, 0x08, 0xe0, 0x8f, 0x4b, 0x70, 0xf9, 0x61, 0xc3, 0x86, 0xad, 0x67, 0x72, 0x74, - 0xe6, 0x5d, 0xcf, 0x1e, 0x3e, 0x0e, 0xc9, 0x1c, 0x54, 0xba, 0x3b, 0xba, 0xaf, 0x94, 0x32, 0xb5, - 0x61, 0xa9, 0xac, 0xb3, 0xc2, 0x07, 0x6c, 0xd2, 0xe0, 0xca, 0x1c, 0xbf, 0x45, 0xc1, 0xca, 0xa6, - 0xe3, 0x0e, 0xf5, 0xfd, 0xc8, 0x26, 0x10, 0x4e, 0xc7, 0x6b, 0xa2, 0x18, 0x15, 0x9d, 0x04, 0x30, - 0x22, 0x4c, 0xcc, 0x72, 0x65, 0x1a, 0x3e, 0x90, 0x2b, 0x23, 0x4c, 0x3c, 0x7a, 0x28, 0xe9, 0xad, - 0x90, 0xb2, 0xc8, 0x0c, 0x94, 0x83, 0x28, 0x68, 0x57, 0x6d, 0xcd, 0xcb, 0x19, 0xfa, 0x29, 0xe7, - 0x63, 0x1b, 0x7b, 0x77, 0x8b, 0x1b, 0xd5, 0x4d, 0xe9, 0x3f, 0xb7, 0x5c, 0x87, 0x2b, 0x64, 0xa5, - 0x68, 0x63, 0x7f, 0xa7, 0x8f, 0x03, 0x33, 0x6a, 0x69, 0xff, 0xa6, 0x06, 0x17, 0xb2, 0xc7, 0x03, - 0xeb, 0xb7, 0x3d, 0xea, 0xf9, 0x0c, 0xbb, 0x90, 0xec, 0xb7, 0xbb, 0xa2, 0x18, 0x15, 0xfd, 0x53, - 0x1d, 0x70, 0xf6, 0xdd, 0x02, 0x5c, 0xf4, 0xa4, 0x8f, 0xe8, 0x71, 0x04, 0x9d, 0x3d, 0x2b, 0xcc, - 0x19, 0x03, 0x04, 0xe2, 0xe0, 0xb6, 0x90, 0xbf, 0x5d, 0x80, 0xa9, 0x4e, 0xca, 0xce, 0x71, 0x8a, - 0x27, 0xe8, 0x78, 0x54, 0xfc, 0xda, 0x00, 0x79, 0x38, 0xb0, 0x25, 0xe4, 0x6b, 0xd0, 0xe8, 0xb2, - 0x71, 0xe1, 0x07, 0xd4, 0x31, 0xd4, 0x21, 0xba, 0xe1, 0xbf, 0xa4, 0xf5, 0x08, 0x2b, 0x3c, 0x41, - 0xc3, 0xf5, 0x83, 0x18, 0x01, 0xe3, 0x12, 0x9f, 0xf0, 0x23, 0x73, 0xd7, 0xa0, 0xe6, 0xd3, 0x20, - 0xb0, 0x9c, 0xb6, 0xd8, 0x6f, 0xd4, 0xc5, 0xb7, 0xd2, 0x92, 0x65, 0x18, 0x52, 0xc9, 0xef, 0x40, - 0x9d, 0xbb, 0x9c, 0xe6, 0xbd, 0xb6, 0x3f, 0x55, 0xe7, 0xe1, 0x62, 0x63, 0x22, 0x00, 0x4e, 0x16, - 0x62, 0x44, 0x27, 0x2f, 0xc1, 0xe8, 0x16, 0xff, 0x7c, 0xe5, 0x29, 0x6a, 0x61, 0xe3, 0xe2, 0xda, - 0x5a, 0x33, 0x56, 0x8e, 0x09, 0x2e, 0x32, 0x07, 0x40, 0x43, 0xbf, 0x5c, 0xda, 0x9e, 0x15, 0x79, - 0xec, 0x30, 0xc6, 0x45, 0x9e, 0x85, 0x52, 0x60, 0xfb, 0xdc, 0x86, 0x55, 0x8b, 0xb6, 0xa0, 0x1b, - 0xab, 0x2d, 0x64, 0xe5, 0xda, 0xaf, 0x0b, 0x30, 0x91, 0x3a, 0x5c, 0xc2, 0xaa, 0xf4, 0x3c, 0x5b, - 0x4e, 0x23, 0x61, 0x95, 0x4d, 0x5c, 0x45, 0x56, 0x4e, 0xde, 0x91, 0x6a, 0x79, 0x31, 0x67, 0xc2, - 0x88, 0xdb, 0x7a, 0xe0, 0x33, 0x3d, 0xbc, 0x4f, 0x23, 0xe7, 0x6e, 0xbe, 0xa8, 0x3d, 0x72, 0x1d, - 0x88, 0xb9, 0xf9, 0x22, 0x1a, 0x26, 0x38, 0x53, 0x06, 0xbf, 0xf2, 0x51, 0x0c, 0x7e, 0xda, 0xb7, - 0x8a, 0xb1, 0x1e, 0x90, 0x9a, 0xfd, 0x23, 0x7a, 0xe0, 0x05, 0xb6, 0x80, 0x86, 0x8b, 0x7b, 0x3d, - 0xbe, 0xfe, 0xf1, 0xc5, 0x58, 0x52, 0xc9, 0x9b, 0xa2, 0xef, 0x4b, 0x39, 0x8f, 0xe5, 0x6e, 0xac, - 0xb6, 0x44, 0x74, 0x95, 0x7a, 0x6b, 0xe1, 0x2b, 0x28, 0x9f, 0xd2, 0x2b, 0xd0, 0xfe, 0x45, 0x09, - 0x1a, 0x37, 0xdd, 0xad, 0x4f, 0x49, 0x04, 0x75, 0xf6, 0x32, 0x55, 0xfc, 0x04, 0x97, 0xa9, 0x4d, - 0x78, 0x3a, 0x08, 0xec, 0x16, 0x35, 0x5c, 0xc7, 0xf4, 0xe7, 0xb7, 0x03, 0xea, 0x2d, 0x59, 0x8e, - 0xe5, 0xef, 0x50, 0x53, 0xba, 0x93, 0x9e, 0x39, 0x3c, 0x98, 0x7e, 0x7a, 0x63, 0x63, 0x35, 0x8b, - 0x05, 0x07, 0xd5, 0xe5, 0xd3, 0x86, 0x38, 0x09, 0xc8, 0x4f, 0xca, 0xc8, 0x98, 0x1b, 0x31, 0x6d, - 0xc4, 0xca, 0x31, 0xc1, 0xa5, 0xfd, 0xa0, 0x08, 0xf5, 0x30, 0x15, 0x00, 0x79, 0x1e, 0xaa, 0x5b, - 0x9e, 0xbb, 0x4b, 0x3d, 0xe1, 0xb9, 0x93, 0x27, 0x65, 0x9a, 0xa2, 0x08, 0x15, 0x8d, 0x3c, 0x07, - 0x95, 0xc0, 0xed, 0x5a, 0x46, 0xda, 0xa0, 0xb6, 0xc1, 0x0a, 0x51, 0xd0, 0x4e, 0x6f, 0x80, 0xbf, - 0x90, 0x50, 0xed, 0xea, 0x03, 0x95, 0xb1, 0xb7, 0xa1, 0xec, 0xeb, 0xbe, 0x2d, 0xd7, 0xd3, 0x1c, - 0xa7, 0xea, 0xe7, 0x5b, 0xab, 0xf2, 0x54, 0xfd, 0x7c, 0x6b, 0x15, 0x39, 0xa8, 0xf6, 0xcb, 0x22, - 0x34, 0x44, 0xbf, 0x89, 0x59, 0xe1, 0x24, 0x7b, 0xee, 0x75, 0x1e, 0x4a, 0xe1, 0xf7, 0x3a, 0xd4, - 0xe3, 0x66, 0x26, 0x39, 0xc9, 0xc5, 0xfd, 0x03, 0x11, 0x31, 0x0c, 0xa7, 0x88, 0x8a, 0x54, 0xd7, - 0x97, 0x4f, 0xb1, 0xeb, 0x2b, 0x47, 0xea, 0xfa, 0x91, 0xd3, 0xe8, 0xfa, 0x0f, 0x8b, 0x50, 0x5f, - 0xb5, 0xb6, 0xa9, 0xb1, 0x6f, 0xd8, 0xfc, 0x4c, 0xa0, 0x49, 0x6d, 0x1a, 0xd0, 0x65, 0x4f, 0x37, - 0xe8, 0x3a, 0xf5, 0x2c, 0x9e, 0x2a, 0x87, 0x7d, 0x1f, 0x7c, 0x06, 0x92, 0x67, 0x02, 0x17, 0x07, - 0xf0, 0xe0, 0xc0, 0xda, 0x64, 0x05, 0x46, 0x4d, 0xea, 0x5b, 0x1e, 0x35, 0xd7, 0x63, 0x1b, 0x95, - 0xe7, 0xd5, 0x52, 0xb3, 0x18, 0xa3, 0x3d, 0x38, 0x98, 0x1e, 0x53, 0x06, 0x4a, 0xb1, 0x63, 0x49, - 0x54, 0x65, 0x9f, 0x7c, 0x57, 0xef, 0xf9, 0x59, 0x6d, 0x8c, 0x7d, 0xf2, 0xeb, 0xd9, 0x2c, 0x38, - 0xa8, 0xae, 0x56, 0x81, 0xd2, 0xaa, 0xdb, 0xd6, 0x3e, 0x2a, 0x41, 0x98, 0x53, 0x89, 0xfc, 0x85, - 0x02, 0x34, 0x74, 0xc7, 0x71, 0x03, 0x99, 0xaf, 0x48, 0x78, 0xe0, 0x31, 0x77, 0xea, 0xa6, 0x99, - 0xf9, 0x08, 0x54, 0x38, 0x6f, 0x43, 0x87, 0x72, 0x8c, 0x82, 0x71, 0xd9, 0xa4, 0x97, 0xf2, 0x27, - 0xaf, 0xe5, 0x6f, 0xc5, 0x11, 0xbc, 0xc7, 0x97, 0xbe, 0x00, 0x93, 0xe9, 0xc6, 0x1e, 0xc7, 0x1d, - 0x94, 0xcb, 0x31, 0x5f, 0x04, 0x88, 0x62, 0x4a, 0x1e, 0x83, 0x11, 0xcb, 0x4a, 0x18, 0xb1, 0x86, - 0x3f, 0xd8, 0x1e, 0x35, 0x7a, 0xa0, 0xe1, 0xea, 0xbd, 0x94, 0xe1, 0x6a, 0xe5, 0x24, 0x84, 0x3d, - 0xdc, 0x58, 0xf5, 0x77, 0x0a, 0x30, 0x19, 0x31, 0xcb, 0x13, 0xb2, 0xaf, 0xc2, 0x98, 0x47, 0x75, - 0xb3, 0xa9, 0x07, 0xc6, 0x0e, 0x0f, 0xf5, 0x2e, 0xf0, 0xd8, 0xec, 0x33, 0x87, 0x07, 0xd3, 0x63, - 0x18, 0x27, 0x60, 0x92, 0x8f, 0xe8, 0xd0, 0x60, 0x05, 0x1b, 0x56, 0x87, 0xba, 0xbd, 0x60, 0x48, - 0xab, 0x29, 0xdf, 0xb0, 0x60, 0x04, 0x83, 0x71, 0x4c, 0xed, 0xe3, 0x02, 0x8c, 0xc7, 0x1b, 0x7c, - 0xea, 0x16, 0xb5, 0x9d, 0xa4, 0x45, 0x6d, 0xe1, 0x04, 0xde, 0xc9, 0x00, 0x2b, 0xda, 0x07, 0x10, - 0x7f, 0x34, 0x6e, 0x39, 0x8b, 0x1b, 0x0b, 0x0a, 0x0f, 0x35, 0x16, 0x7c, 0xfa, 0xd3, 0xe8, 0x0c, - 0xd2, 0x72, 0xcb, 0x4f, 0xb0, 0x96, 0xfb, 0x49, 0xe6, 0xe2, 0x89, 0xe5, 0x93, 0x19, 0xc9, 0x91, - 0x4f, 0xa6, 0x13, 0xe6, 0x93, 0xa9, 0x9e, 0xd8, 0xa4, 0x73, 0x94, 0x9c, 0x32, 0xb5, 0xc7, 0x9a, - 0x53, 0xa6, 0x7e, 0x5a, 0x39, 0x65, 0x20, 0x6f, 0x4e, 0x99, 0x0f, 0x0a, 0x30, 0x6e, 0x26, 0x4e, - 0xcc, 0x72, 0xdb, 0x42, 0x9e, 0xa5, 0x26, 0x79, 0x00, 0x57, 0x1c, 0x99, 0x4a, 0x96, 0x61, 0x4a, - 0x64, 0x56, 0x26, 0x97, 0xd1, 0x4f, 0x26, 0x93, 0xcb, 0x2f, 0xaa, 0xf1, 0x15, 0xe9, 0x71, 0x1b, - 0xcd, 0x5f, 0x49, 0x1a, 0xcd, 0xaf, 0xa6, 0x8d, 0xe6, 0x13, 0xb1, 0x78, 0xd6, 0xb8, 0xe1, 0xfc, - 0x77, 0x63, 0x13, 0x75, 0x89, 0xe7, 0x70, 0x09, 0xdf, 0x79, 0xc6, 0x64, 0x3d, 0x0f, 0x13, 0x52, - 0x7b, 0x55, 0x44, 0x3e, 0xcb, 0x8d, 0x45, 0x61, 0x4e, 0x8b, 0x49, 0x32, 0xa6, 0xf9, 0x99, 0x40, - 0x5f, 0xa5, 0xf2, 0x14, 0x5b, 0x85, 0x68, 0x90, 0xa9, 0x34, 0x9b, 0x21, 0x07, 0xdb, 0x56, 0x78, - 0x54, 0xf7, 0xa5, 0xe9, 0x3b, 0xb6, 0xad, 0x40, 0x5e, 0x8a, 0x92, 0x1a, 0xb7, 0xff, 0x57, 0x1f, - 0x61, 0xff, 0xd7, 0xa1, 0x61, 0xeb, 0x7e, 0x20, 0xde, 0xa6, 0x29, 0x3f, 0xe7, 0x3f, 0x71, 0xb4, - 0x85, 0x97, 0x2d, 0xe6, 0x91, 0x76, 0xbb, 0x1a, 0xc1, 0x60, 0x1c, 0x93, 0x98, 0x30, 0xca, 0x6e, - 0xf9, 0xa7, 0x6d, 0xce, 0x07, 0x32, 0xe1, 0xd5, 0x71, 0x64, 0x84, 0x66, 0xab, 0xd5, 0x18, 0x0e, - 0x26, 0x50, 0x07, 0xb8, 0x08, 0x60, 0x18, 0x17, 0x01, 0xf9, 0x43, 0xa1, 0x39, 0xed, 0x87, 0xaf, - 0xb5, 0xc1, 0x5f, 0x6b, 0x18, 0x22, 0x89, 0x71, 0x22, 0x26, 0x79, 0xd9, 0xa8, 0xe8, 0xc9, 0x6e, - 0x50, 0xd5, 0x47, 0x93, 0xa3, 0x62, 0x33, 0x49, 0xc6, 0x34, 0x3f, 0x59, 0x87, 0x73, 0x61, 0x51, - 0xbc, 0x19, 0x63, 0x1c, 0x27, 0x8c, 0x59, 0xdb, 0xcc, 0xe0, 0xc1, 0xcc, 0x9a, 0xfc, 0x10, 0x48, - 0xcf, 0xf3, 0xa8, 0x13, 0xdc, 0xd0, 0xfd, 0x1d, 0x19, 0xfc, 0x16, 0x1d, 0x02, 0x89, 0x48, 0x18, - 0xe7, 0x23, 0x73, 0x00, 0x02, 0x8e, 0xd7, 0x9a, 0x48, 0xc6, 0x97, 0x6e, 0x86, 0x14, 0x8c, 0x71, - 0x69, 0x1f, 0xd4, 0xa1, 0x71, 0x5b, 0x0f, 0xac, 0x3d, 0xca, 0xfd, 0x79, 0xa7, 0xe3, 0x54, 0xf9, - 0xeb, 0x05, 0xb8, 0x90, 0x0c, 0xda, 0x3c, 0x45, 0xcf, 0x0a, 0x4f, 0x01, 0x83, 0x99, 0xd2, 0x70, - 0x40, 0x2b, 0xb8, 0x8f, 0xa5, 0x2f, 0x06, 0xf4, 0xb4, 0x7d, 0x2c, 0xad, 0x41, 0x02, 0x71, 0x70, - 0x5b, 0x3e, 0x2d, 0x3e, 0x96, 0x27, 0x3b, 0x67, 0x61, 0xca, 0x03, 0x54, 0x7d, 0x62, 0x3c, 0x40, - 0xb5, 0x27, 0x42, 0xed, 0xee, 0xc6, 0x3c, 0x40, 0xf5, 0x9c, 0x91, 0x48, 0xf2, 0x9c, 0x83, 0x40, - 0x1b, 0xe4, 0x49, 0xe2, 0x29, 0x0a, 0x94, 0x65, 0x9e, 0x69, 0xab, 0x5b, 0xba, 0x6f, 0x19, 0x52, - 0xed, 0xc8, 0x91, 0xa3, 0x55, 0xe5, 0x6e, 0x13, 0x01, 0x0b, 0xfc, 0x16, 0x05, 0x76, 0x94, 0xaa, - 0xae, 0x98, 0x2b, 0x55, 0x1d, 0x59, 0x80, 0xb2, 0xb3, 0x4b, 0xf7, 0x8f, 0x77, 0xd8, 0x9f, 0xef, - 0xc2, 0x6e, 0xdf, 0xa2, 0xfb, 0xc8, 0x2b, 0x6b, 0x3f, 0x28, 0x02, 0xb0, 0xc7, 0x3f, 0x9a, 0x2f, - 0xe6, 0xb7, 0xa1, 0xea, 0xf7, 0xb8, 0xd5, 0x44, 0x2a, 0x4c, 0x51, 0xf8, 0x96, 0x28, 0x46, 0x45, - 0x27, 0xcf, 0x41, 0xe5, 0xbd, 0x1e, 0xed, 0xa9, 0xc0, 0x82, 0x50, 0x71, 0xff, 0x22, 0x2b, 0x44, - 0x41, 0x3b, 0x3d, 0xbb, 0xaa, 0xf2, 0xd9, 0x54, 0x4e, 0xcb, 0x67, 0x53, 0x87, 0xea, 0x6d, 0x97, - 0x47, 0x83, 0x6a, 0xff, 0xb5, 0x08, 0x10, 0x45, 0xdb, 0x91, 0xef, 0x14, 0xe0, 0x7c, 0xf8, 0xc1, - 0x05, 0x62, 0xff, 0xc5, 0xd3, 0x22, 0xe7, 0xf6, 0xdf, 0x64, 0x7d, 0xec, 0x7c, 0x06, 0x5a, 0xcf, - 0x12, 0x87, 0xd9, 0xad, 0x20, 0x08, 0x35, 0xda, 0xe9, 0x06, 0xfb, 0x8b, 0x96, 0x27, 0x47, 0x60, - 0x66, 0x50, 0xe7, 0x75, 0xc9, 0x23, 0xaa, 0x4a, 0x23, 0x01, 0xff, 0x88, 0x14, 0x05, 0x43, 0x1c, - 0xb2, 0x03, 0x35, 0xc7, 0x7d, 0xc7, 0x67, 0xdd, 0x21, 0x87, 0xe3, 0x1b, 0xc3, 0x77, 0xb9, 0xe8, - 0x56, 0x61, 0xef, 0x97, 0x37, 0x58, 0x75, 0x64, 0x67, 0x7f, 0xbb, 0x08, 0x67, 0x33, 0xfa, 0x81, - 0xbc, 0x01, 0x93, 0x32, 0xb0, 0x31, 0xca, 0x0f, 0x5e, 0x88, 0xf2, 0x83, 0xb7, 0x52, 0x34, 0xec, - 0xe3, 0x26, 0xef, 0x00, 0xe8, 0x86, 0x41, 0x7d, 0x7f, 0xcd, 0x35, 0xd5, 0x7e, 0xe0, 0x75, 0xa6, - 0xbe, 0xcc, 0x87, 0xa5, 0x0f, 0x0e, 0xa6, 0x7f, 0x2f, 0x2b, 0x56, 0x39, 0xd5, 0xcf, 0x51, 0x05, - 0x8c, 0x41, 0x92, 0xaf, 0x00, 0x88, 0x4d, 0x78, 0x98, 0x4e, 0xe1, 0x11, 0x96, 0xab, 0x19, 0x95, - 0xb8, 0x6a, 0xe6, 0x8b, 0x3d, 0xdd, 0x09, 0xac, 0x60, 0x5f, 0x64, 0xaf, 0xb9, 0x1b, 0xa2, 0x60, - 0x0c, 0x51, 0xfb, 0xa7, 0x45, 0xa8, 0x29, 0x9b, 0xf9, 0x63, 0x30, 0x94, 0xb6, 0x13, 0x86, 0xd2, - 0x13, 0x8a, 0x4e, 0xce, 0x32, 0x93, 0xba, 0x29, 0x33, 0xe9, 0x72, 0x7e, 0x51, 0x0f, 0x37, 0x92, - 0x7e, 0xbf, 0x08, 0xe3, 0x8a, 0x35, 0xaf, 0x89, 0xf4, 0xf3, 0x30, 0x21, 0xa2, 0x0a, 0xd6, 0xf4, - 0xfb, 0x22, 0x91, 0x0f, 0xef, 0xb0, 0xb2, 0x08, 0x08, 0x6e, 0x26, 0x49, 0x98, 0xe6, 0x65, 0xc3, - 0x5a, 0x14, 0x6d, 0xb2, 0x4d, 0x98, 0xf0, 0x43, 0x8a, 0xfd, 0x26, 0x1f, 0xd6, 0xcd, 0x14, 0x0d, - 0xfb, 0xb8, 0xd3, 0x36, 0xda, 0xf2, 0x29, 0xd8, 0x68, 0xff, 0x5d, 0x01, 0x46, 0xa3, 0xfe, 0x3a, - 0x75, 0x0b, 0xed, 0x76, 0xd2, 0x42, 0x3b, 0x9f, 0x7b, 0x38, 0x0c, 0xb0, 0xcf, 0xfe, 0xe5, 0x2a, - 0x24, 0x82, 0xe4, 0xc9, 0x16, 0x5c, 0xb2, 0x32, 0x43, 0xfd, 0x62, 0xb3, 0x4d, 0x78, 0xea, 0x7b, - 0x65, 0x20, 0x27, 0x3e, 0x04, 0x85, 0xf4, 0xa0, 0xb6, 0x47, 0xbd, 0xc0, 0x32, 0xa8, 0x7a, 0xbe, - 0xe5, 0xdc, 0x2a, 0x99, 0xb4, 0x42, 0x87, 0x7d, 0x7a, 0x57, 0x0a, 0xc0, 0x50, 0x14, 0xd9, 0x82, - 0x0a, 0x35, 0xdb, 0x54, 0xa5, 0x56, 0xca, 0x99, 0xb8, 0x34, 0xec, 0x4f, 0x76, 0xe7, 0xa3, 0x80, - 0x26, 0x3e, 0xd4, 0x6d, 0xe5, 0x65, 0x94, 0xe3, 0x70, 0x78, 0x05, 0x2b, 0xf4, 0x57, 0x46, 0x59, - 0x17, 0xc2, 0x22, 0x8c, 0xe4, 0x90, 0xdd, 0xd0, 0xdc, 0x59, 0x39, 0xa1, 0xc9, 0xe3, 0x21, 0xc6, - 0x4e, 0x1f, 0xea, 0xf7, 0xf4, 0x80, 0x7a, 0x1d, 0xdd, 0xdb, 0x95, 0xbb, 0x8d, 0xe1, 0x9f, 0xf0, - 0x4d, 0x85, 0x14, 0x3d, 0x61, 0x58, 0x84, 0x91, 0x1c, 0xe2, 0x42, 0x3d, 0x90, 0xea, 0xb3, 0xb2, - 0xe9, 0x0e, 0x2f, 0x54, 0x29, 0xe2, 0xbe, 0x0c, 0x96, 0x57, 0xb7, 0x18, 0xc9, 0x20, 0x7b, 0x89, - 0x2c, 0xd7, 0x22, 0xb7, 0x79, 0x33, 0x87, 0x6f, 0x40, 0x42, 0x45, 0xcb, 0x4d, 0x76, 0xb6, 0x6c, - 0xed, 0x7f, 0x56, 0xa2, 0x69, 0xf9, 0x71, 0xdb, 0x09, 0x5f, 0x4a, 0xda, 0x09, 0xaf, 0xa4, 0xed, - 0x84, 0x29, 0x67, 0xf5, 0xf1, 0xc3, 0x6b, 0x53, 0xe6, 0xb5, 0xf2, 0x29, 0x98, 0xd7, 0x5e, 0x84, - 0xc6, 0x1e, 0x9f, 0x09, 0x44, 0x9e, 0xa6, 0x0a, 0x5f, 0x46, 0xf8, 0xcc, 0x7e, 0x37, 0x2a, 0xc6, - 0x38, 0x0f, 0xab, 0x22, 0xff, 0xeb, 0x11, 0x26, 0xba, 0x95, 0x55, 0x5a, 0x51, 0x31, 0xc6, 0x79, - 0x78, 0x64, 0x9e, 0xe5, 0xec, 0x8a, 0x0a, 0x55, 0x5e, 0x41, 0x44, 0xe6, 0xa9, 0x42, 0x8c, 0xe8, - 0xe4, 0x1a, 0xd4, 0x7a, 0xe6, 0xb6, 0xe0, 0xad, 0x71, 0x5e, 0xae, 0x61, 0x6e, 0x2e, 0x2e, 0xc9, - 0xbc, 0x51, 0x8a, 0xca, 0x5a, 0xd2, 0xd1, 0xbb, 0x8a, 0xc0, 0xf7, 0x86, 0xb2, 0x25, 0x6b, 0x51, - 0x31, 0xc6, 0x79, 0xc8, 0x1f, 0xc0, 0xb8, 0x47, 0xcd, 0x9e, 0x41, 0xc3, 0x5a, 0xc0, 0x6b, 0x11, - 0xf1, 0x03, 0x93, 0x38, 0x05, 0x53, 0x9c, 0x03, 0x8c, 0x84, 0x8d, 0xa1, 0x8c, 0x84, 0x5f, 0x80, - 0x71, 0xd3, 0xd3, 0x2d, 0x87, 0x9a, 0x77, 0x1c, 0x1e, 0x91, 0x20, 0xe3, 0x03, 0x43, 0x0b, 0xf9, - 0x62, 0x82, 0x8a, 0x29, 0x6e, 0xed, 0xbf, 0x17, 0x80, 0xf4, 0x47, 0xc2, 0x93, 0x1d, 0x18, 0x71, - 0xb8, 0xf5, 0x2c, 0x77, 0x6a, 0xed, 0x98, 0x11, 0x4e, 0x4c, 0x6b, 0xb2, 0x40, 0xe2, 0x13, 0x07, - 0x6a, 0xf4, 0x7e, 0x40, 0x3d, 0x27, 0x3c, 0x19, 0x73, 0x32, 0x69, 0xbc, 0xc5, 0x6e, 0x42, 0x22, - 0x63, 0x28, 0x43, 0xfb, 0x79, 0x11, 0x1a, 0x31, 0xbe, 0x47, 0x6d, 0x4a, 0xf9, 0xe1, 0x7c, 0x61, - 0xb4, 0xda, 0xf4, 0x6c, 0xf9, 0x85, 0xc6, 0x0e, 0xe7, 0x4b, 0x12, 0xae, 0x62, 0x9c, 0x8f, 0xcc, - 0x01, 0x74, 0x74, 0x3f, 0xa0, 0x1e, 0x5f, 0xbd, 0x53, 0x47, 0xe2, 0xd7, 0x42, 0x0a, 0xc6, 0xb8, - 0xc8, 0x55, 0x99, 0x88, 0xbd, 0x9c, 0x4c, 0x61, 0x38, 0x20, 0xcb, 0x7a, 0xe5, 0x04, 0xb2, 0xac, - 0x93, 0x36, 0x4c, 0xaa, 0x56, 0x2b, 0xea, 0xf1, 0x12, 0xdc, 0x89, 0xfd, 0x4f, 0x0a, 0x02, 0xfb, - 0x40, 0xb5, 0x1f, 0x14, 0x60, 0x2c, 0x61, 0x32, 0x11, 0xc9, 0x07, 0xd5, 0x39, 0x8e, 0x44, 0xf2, - 0xc1, 0xd8, 0xf1, 0x8b, 0x17, 0x60, 0x44, 0x74, 0x50, 0x3a, 0x3c, 0x53, 0x74, 0x21, 0x4a, 0x2a, - 0x9b, 0x0b, 0xa5, 0x51, 0x36, 0x3d, 0x17, 0x4a, 0xab, 0x2d, 0x2a, 0xba, 0xf0, 0x75, 0x88, 0xd6, - 0xc9, 0x9e, 0x8e, 0xf9, 0x3a, 0x44, 0x39, 0x86, 0x1c, 0xda, 0x0f, 0x79, 0xbb, 0x03, 0x6f, 0x3f, - 0xdc, 0x0b, 0xb6, 0xa1, 0x2a, 0x43, 0xf2, 0xe4, 0xa7, 0xf1, 0x46, 0x0e, 0x3b, 0x0e, 0xc7, 0x91, - 0xc1, 0x67, 0xba, 0xb1, 0x7b, 0x67, 0x7b, 0x1b, 0x15, 0x3a, 0xb9, 0x0e, 0x75, 0xd7, 0x59, 0xd2, - 0x2d, 0xbb, 0xe7, 0xa9, 0x95, 0xe1, 0xb7, 0xd8, 0x5c, 0x77, 0x47, 0x15, 0x3e, 0x38, 0x98, 0xbe, - 0x10, 0xde, 0x24, 0x1a, 0x89, 0x51, 0x4d, 0xed, 0xcf, 0x17, 0xe0, 0x3c, 0xba, 0xb6, 0x6d, 0x39, - 0xed, 0xa4, 0xb3, 0x8c, 0xd8, 0x30, 0xde, 0xd1, 0xef, 0x6f, 0x3a, 0xfa, 0x9e, 0x6e, 0xd9, 0xfa, - 0x96, 0x4d, 0x1f, 0xb9, 0x97, 0xeb, 0x05, 0x96, 0x3d, 0x23, 0x7e, 0x4c, 0x37, 0xb3, 0xe2, 0x04, - 0x77, 0xbc, 0x56, 0xe0, 0x59, 0x4e, 0x5b, 0x4c, 0x7a, 0x6b, 0x09, 0x2c, 0x4c, 0x61, 0x6b, 0xbf, - 0x28, 0x01, 0x0f, 0x0b, 0x23, 0xaf, 0x42, 0xbd, 0x43, 0x8d, 0x1d, 0xdd, 0xb1, 0x7c, 0x95, 0xc6, - 0xf5, 0x22, 0x7b, 0xae, 0x35, 0x55, 0xf8, 0x80, 0xbd, 0x8a, 0xf9, 0xd6, 0x2a, 0x3f, 0x79, 0x11, - 0xf1, 0x12, 0x03, 0x46, 0xda, 0xbe, 0xaf, 0x77, 0xad, 0xdc, 0x51, 0x09, 0x22, 0x6d, 0xa6, 0x98, - 0x8e, 0xc4, 0x35, 0x4a, 0x68, 0x62, 0x40, 0xa5, 0x6b, 0xeb, 0x96, 0x93, 0xfb, 0x47, 0x4a, 0xec, - 0x09, 0xd6, 0x19, 0x92, 0x30, 0xae, 0xf1, 0x4b, 0x14, 0xd8, 0xa4, 0x07, 0x0d, 0xdf, 0xf0, 0xf4, - 0x8e, 0xbf, 0xa3, 0xcf, 0xbd, 0xfc, 0x4a, 0x6e, 0x75, 0x35, 0x12, 0x25, 0x56, 0xcf, 0x05, 0x9c, - 0x5f, 0x6b, 0xdd, 0x98, 0x9f, 0x7b, 0xf9, 0x15, 0x8c, 0xcb, 0x89, 0x8b, 0x7d, 0xf9, 0xc5, 0x39, - 0x39, 0x83, 0x9c, 0xb8, 0xd8, 0x97, 0x5f, 0x9c, 0xc3, 0xb8, 0x1c, 0xed, 0x7f, 0x15, 0xa0, 0x1e, - 0xf2, 0x92, 0x4d, 0x00, 0x36, 0x97, 0xc9, 0x44, 0x97, 0xc7, 0xfa, 0xe9, 0x04, 0xb7, 0x4f, 0x6c, - 0x86, 0x95, 0x31, 0x06, 0x94, 0x91, 0x09, 0xb4, 0x78, 0xd2, 0x99, 0x40, 0x67, 0xa1, 0xbe, 0xa3, - 0x3b, 0xa6, 0xbf, 0xa3, 0xef, 0x8a, 0x29, 0x3d, 0x96, 0x1b, 0xf7, 0x86, 0x22, 0x60, 0xc4, 0xa3, - 0xfd, 0xe3, 0x11, 0x10, 0xa1, 0x04, 0x6c, 0xd2, 0x31, 0x2d, 0x5f, 0xc4, 0xb2, 0x17, 0x78, 0xcd, - 0x70, 0xd2, 0x59, 0x94, 0xe5, 0x18, 0x72, 0x90, 0x8b, 0x50, 0xea, 0x58, 0x8e, 0xf4, 0x3d, 0x71, - 0xd3, 0xe3, 0x9a, 0xe5, 0x20, 0x2b, 0xe3, 0x24, 0xfd, 0xbe, 0x0c, 0x43, 0x14, 0x24, 0xfd, 0x3e, - 0xb2, 0x32, 0xf2, 0x79, 0x98, 0xb0, 0x5d, 0x77, 0x97, 0x4d, 0x1f, 0x2a, 0x5a, 0x51, 0xf8, 0x81, - 0xb9, 0x31, 0x60, 0x35, 0x49, 0xc2, 0x34, 0x2f, 0xd9, 0x84, 0xa7, 0xdf, 0xa7, 0x9e, 0x2b, 0xe7, - 0xcb, 0x96, 0x4d, 0x69, 0x57, 0xc1, 0x08, 0x65, 0x8e, 0x07, 0x3d, 0xfe, 0x71, 0x36, 0x0b, 0x0e, - 0xaa, 0xcb, 0xc3, 0xa7, 0x75, 0xaf, 0x4d, 0x83, 0x75, 0xcf, 0x35, 0xa8, 0xef, 0x5b, 0x4e, 0x5b, - 0xc1, 0x8e, 0x44, 0xb0, 0x1b, 0xd9, 0x2c, 0x38, 0xa8, 0x2e, 0x79, 0x0b, 0xa6, 0x04, 0x49, 0xa8, - 0x2d, 0xf3, 0x62, 0x9a, 0xb1, 0x6c, 0xf5, 0xff, 0xc1, 0x31, 0xe1, 0xe1, 0xd9, 0x18, 0xc0, 0x83, - 0x03, 0x6b, 0x93, 0x9b, 0x30, 0xa9, 0xfc, 0x7b, 0xeb, 0xd4, 0x6b, 0x85, 0xe1, 0x25, 0x63, 0xcd, - 0x2b, 0x6c, 0xe7, 0xbd, 0x48, 0xbb, 0x1e, 0x35, 0xe2, 0x7e, 0x52, 0xc5, 0x85, 0x7d, 0xf5, 0x08, - 0xc2, 0x05, 0x1e, 0x43, 0xb2, 0xd9, 0x5d, 0x70, 0x5d, 0xdb, 0x74, 0xef, 0x39, 0xea, 0xd9, 0x85, - 0x8a, 0xc9, 0x5d, 0x7a, 0xad, 0x4c, 0x0e, 0x1c, 0x50, 0x93, 0x3d, 0x39, 0xa7, 0x2c, 0xba, 0xf7, - 0x9c, 0x34, 0x2a, 0x44, 0x4f, 0xde, 0x1a, 0xc0, 0x83, 0x03, 0x6b, 0x93, 0x25, 0x20, 0xe9, 0x27, - 0xd8, 0xec, 0x4a, 0xa7, 0xf3, 0x05, 0x91, 0xb3, 0x26, 0x4d, 0xc5, 0x8c, 0x1a, 0x64, 0x15, 0xce, - 0xa5, 0x4b, 0x99, 0x38, 0xe9, 0x7f, 0xe6, 0xd9, 0x6a, 0x31, 0x83, 0x8e, 0x99, 0xb5, 0xb4, 0x7f, - 0x52, 0x84, 0xb1, 0x44, 0x92, 0x83, 0x27, 0xee, 0x30, 0x39, 0xdb, 0x0b, 0x74, 0xfc, 0xf6, 0xca, - 0xe2, 0x0d, 0xaa, 0x9b, 0xd4, 0xbb, 0x45, 0x55, 0x42, 0x0a, 0xb1, 0x2c, 0x26, 0x28, 0x98, 0xe2, - 0x24, 0xdb, 0x50, 0x11, 0x96, 0xed, 0xbc, 0xbf, 0x2f, 0x51, 0x7d, 0xc4, 0xcd, 0xdb, 0xf2, 0x9f, - 0x3f, 0xae, 0x47, 0x51, 0xc0, 0x6b, 0x01, 0x8c, 0xc6, 0x39, 0xd8, 0x44, 0x12, 0xa9, 0xbd, 0xd5, - 0x84, 0xca, 0xbb, 0x02, 0xa5, 0x20, 0x18, 0xf6, 0x98, 0xba, 0xf0, 0x94, 0x6c, 0xac, 0x22, 0xc3, - 0xd0, 0xb6, 0xd9, 0xbb, 0xf3, 0x7d, 0xcb, 0x75, 0x64, 0xce, 0xf2, 0x4d, 0xa8, 0x06, 0xd2, 0x58, - 0x38, 0xdc, 0x31, 0x7b, 0xae, 0x2b, 0x29, 0x43, 0xa1, 0xc2, 0xd2, 0xfe, 0x7d, 0x11, 0xea, 0xe1, - 0xc6, 0xfe, 0x08, 0xb9, 0xc0, 0x5d, 0xa8, 0x87, 0x31, 0x70, 0xb9, 0xff, 0xcd, 0x18, 0x85, 0x66, - 0xf1, 0xbd, 0x68, 0x78, 0x8b, 0x91, 0x8c, 0x78, 0x7c, 0x5d, 0x29, 0x47, 0x7c, 0x5d, 0x17, 0xaa, - 0x81, 0x67, 0xb5, 0xdb, 0x72, 0x97, 0x90, 0x27, 0xc0, 0x2e, 0xec, 0xae, 0x0d, 0x01, 0x28, 0x7b, - 0x56, 0xdc, 0xa0, 0x12, 0xa3, 0xbd, 0x0b, 0x93, 0x69, 0x4e, 0xae, 0x42, 0x1b, 0x3b, 0xd4, 0xec, - 0xd9, 0xaa, 0x8f, 0x23, 0x15, 0x5a, 0x96, 0x63, 0xc8, 0xc1, 0xb6, 0xe1, 0xec, 0x35, 0xbd, 0xef, - 0x3a, 0x4a, 0x8d, 0xe5, 0xbb, 0x91, 0x0d, 0x59, 0x86, 0x21, 0x55, 0xfb, 0x2f, 0x25, 0xb8, 0x18, - 0x99, 0x67, 0xd6, 0x74, 0x47, 0x6f, 0x1f, 0xe1, 0x87, 0x7c, 0x9f, 0x1d, 0x5c, 0x3a, 0xee, 0x0f, - 0x1d, 0x4a, 0x4f, 0xc0, 0x0f, 0x1d, 0xfe, 0x4f, 0x11, 0x78, 0xbc, 0x2e, 0xf9, 0x1a, 0x8c, 0xea, - 0xb1, 0x7f, 0xb1, 0xca, 0xd7, 0x79, 0x3d, 0xf7, 0xeb, 0xe4, 0x61, 0xc1, 0x61, 0xc8, 0x56, 0xbc, - 0x14, 0x13, 0x02, 0x89, 0x0b, 0xb5, 0x6d, 0xdd, 0xb6, 0x99, 0x2e, 0x94, 0xdb, 0xdd, 0x94, 0x10, - 0xce, 0x87, 0xf9, 0x92, 0x84, 0xc6, 0x50, 0x08, 0xf9, 0xa0, 0x00, 0x63, 0x5e, 0x7c, 0xbb, 0x26, - 0x5f, 0x48, 0x9e, 0x60, 0x84, 0x18, 0x5a, 0x3c, 0x40, 0x2c, 0xbe, 0x27, 0x4c, 0xca, 0xd4, 0xfe, - 0x73, 0x01, 0xc6, 0x5a, 0xb6, 0x65, 0x5a, 0x4e, 0xfb, 0x14, 0xff, 0x27, 0x71, 0x07, 0x2a, 0xbe, - 0x6d, 0x99, 0x74, 0xc8, 0xd5, 0x44, 0xac, 0x63, 0x0c, 0x00, 0x05, 0x4e, 0xf2, 0x07, 0x15, 0xa5, - 0x23, 0xfc, 0xa0, 0xe2, 0x57, 0x23, 0x20, 0x23, 0xcf, 0x49, 0x0f, 0xea, 0x6d, 0x95, 0xf7, 0x5e, - 0x3e, 0xe3, 0x8d, 0x1c, 0x39, 0x13, 0x13, 0x19, 0xf4, 0xc5, 0xdc, 0x1f, 0x16, 0x62, 0x24, 0x89, - 0xd0, 0xe4, 0x4f, 0x80, 0x17, 0x73, 0xfe, 0x04, 0x58, 0x88, 0xeb, 0xff, 0x0d, 0xb0, 0x0e, 0xe5, - 0x9d, 0x20, 0xe8, 0xca, 0xc1, 0x34, 0xfc, 0xd1, 0x82, 0x28, 0x6d, 0x8f, 0xd0, 0x89, 0xd8, 0x3d, - 0x72, 0x68, 0x26, 0xc2, 0xd1, 0xc3, 0x5f, 0xad, 0x2d, 0xe4, 0x0a, 0x7c, 0x88, 0x8b, 0x60, 0xf7, - 0xc8, 0xa1, 0xc9, 0x57, 0xa1, 0x11, 0x78, 0xba, 0xe3, 0x6f, 0xbb, 0x5e, 0x87, 0x7a, 0x72, 0x8f, - 0xba, 0x94, 0xe3, 0x3f, 0xb8, 0x1b, 0x11, 0x9a, 0xf0, 0xa8, 0x26, 0x8a, 0x30, 0x2e, 0x8d, 0xec, - 0x42, 0xad, 0x67, 0x8a, 0x86, 0x49, 0x33, 0xd8, 0x7c, 0x9e, 0x5f, 0x1b, 0xc7, 0xc2, 0x1a, 0xd4, - 0x1d, 0x86, 0x02, 0x92, 0x7f, 0x15, 0xac, 0x9e, 0xd4, 0x5f, 0x05, 0xe3, 0xa3, 0x31, 0x2b, 0xa7, - 0x08, 0xe9, 0x48, 0xbd, 0xd6, 0x69, 0xcb, 0xa8, 0xac, 0xa5, 0xdc, 0x2a, 0xa7, 0x10, 0xd9, 0x08, - 0x75, 0x63, 0xa7, 0x8d, 0x4a, 0x86, 0xd6, 0x01, 0xe9, 0xed, 0x20, 0x46, 0xe2, 0xdf, 0x3b, 0xe2, - 0xa0, 0xdb, 0xec, 0xd1, 0xe6, 0x83, 0xf0, 0x27, 0x30, 0xb1, 0xdc, 0xdf, 0x99, 0x3f, 0xd9, 0xd1, - 0xfe, 0x43, 0x11, 0x4a, 0x1b, 0xab, 0x2d, 0x91, 0xcf, 0x93, 0xff, 0xd8, 0x8a, 0xb6, 0x76, 0xad, - 0xee, 0x5d, 0xea, 0x59, 0xdb, 0xfb, 0x72, 0xeb, 0x1d, 0xcb, 0xe7, 0x99, 0xe6, 0xc0, 0x8c, 0x5a, - 0xe4, 0x6d, 0x18, 0x35, 0xf4, 0x05, 0xea, 0x05, 0xc3, 0x18, 0x16, 0xf8, 0x89, 0xde, 0x85, 0xf9, - 0xa8, 0x3a, 0x26, 0xc0, 0xc8, 0x26, 0x80, 0x11, 0x41, 0x97, 0x8e, 0x6d, 0x0e, 0x89, 0x01, 0xc7, - 0x80, 0x08, 0x42, 0x7d, 0x97, 0xb1, 0x72, 0xd4, 0xf2, 0x71, 0x50, 0xf9, 0xc8, 0xb9, 0xa5, 0xea, - 0x62, 0x04, 0xa3, 0x39, 0x30, 0x96, 0xf8, 0x21, 0x0f, 0xf9, 0x1c, 0xd4, 0xdc, 0x6e, 0x6c, 0x3a, - 0xad, 0xf3, 0xf8, 0xcf, 0xda, 0x1d, 0x59, 0xf6, 0xe0, 0x60, 0x7a, 0x6c, 0xd5, 0x6d, 0x5b, 0x86, - 0x2a, 0xc0, 0x90, 0x9d, 0x68, 0x30, 0xc2, 0x8f, 0xe1, 0xa9, 0xdf, 0xf1, 0xf0, 0xb5, 0x83, 0xff, - 0x31, 0xc3, 0x47, 0x49, 0xd1, 0xbe, 0x5e, 0x86, 0xc8, 0x47, 0x48, 0x7c, 0x18, 0x11, 0xc7, 0x0c, - 0xe4, 0xcc, 0x7d, 0xaa, 0x27, 0x1a, 0xa4, 0x28, 0xd2, 0x86, 0xd2, 0xbb, 0xee, 0x56, 0xee, 0x89, - 0x3b, 0x76, 0xfe, 0x5e, 0xd8, 0xca, 0x62, 0x05, 0xc8, 0x24, 0x90, 0xbf, 0x51, 0x80, 0x33, 0x7e, - 0x5a, 0xf5, 0x95, 0xc3, 0x01, 0xf3, 0xeb, 0xf8, 0x69, 0x65, 0x5a, 0x06, 0xea, 0x0e, 0x22, 0x63, - 0x7f, 0x5b, 0x58, 0xff, 0x0b, 0xe7, 0x9d, 0x1c, 0x4e, 0xcb, 0x39, 0x7f, 0x22, 0x99, 0xec, 0xff, - 0x64, 0x19, 0x4a, 0x51, 0xda, 0x37, 0x8b, 0xd0, 0x88, 0xcd, 0xd6, 0xb9, 0xff, 0xf2, 0x74, 0x3f, - 0xf5, 0x97, 0xa7, 0xf5, 0xe1, 0x7d, 0xd9, 0x51, 0xab, 0x4e, 0xfb, 0x47, 0x4f, 0xff, 0xbc, 0x08, - 0xa5, 0xcd, 0xc5, 0xa5, 0xe4, 0xa6, 0xb5, 0xf0, 0x18, 0x36, 0xad, 0x3b, 0x50, 0xdd, 0xea, 0x59, - 0x76, 0x60, 0x39, 0xb9, 0x33, 0x84, 0xa8, 0x9f, 0x62, 0x49, 0x5f, 0x87, 0x40, 0x45, 0x05, 0x4f, - 0xda, 0x50, 0x6d, 0x8b, 0x14, 0x8d, 0xb9, 0x23, 0xfc, 0x64, 0xaa, 0x47, 0x21, 0x48, 0xde, 0xa0, - 0x42, 0xd7, 0xf6, 0x61, 0x64, 0x73, 0x51, 0xaa, 0xfd, 0x8f, 0xb7, 0x37, 0xb5, 0xaf, 0x42, 0xa8, - 0x05, 0x3c, 0x7e, 0xe1, 0xff, 0xad, 0x00, 0x49, 0xc5, 0xe7, 0xf1, 0x8f, 0xa6, 0xdd, 0xf4, 0x68, - 0x5a, 0x3c, 0x89, 0x8f, 0x2f, 0x7b, 0x40, 0x69, 0xff, 0xb6, 0x00, 0xa9, 0xb3, 0x61, 0xe4, 0x15, - 0x99, 0xed, 0x2b, 0x19, 0x4a, 0xa5, 0xb2, 0x7d, 0x91, 0x24, 0x77, 0x2c, 0xeb, 0xd7, 0x87, 0x6c, - 0xbb, 0x16, 0x77, 0xa0, 0xc9, 0xe6, 0xdf, 0x1e, 0x7e, 0xbb, 0x96, 0xe5, 0x8e, 0x93, 0xe1, 0x7e, - 0x71, 0x12, 0x26, 0xe5, 0x6a, 0xff, 0xa8, 0x08, 0x23, 0x8f, 0xed, 0xa8, 0x3a, 0x4d, 0x44, 0x60, - 0x2e, 0xe4, 0x9c, 0xed, 0x07, 0xc6, 0x5f, 0x76, 0x52, 0xf1, 0x97, 0x79, 0xff, 0x4d, 0xfc, 0x88, - 0xe8, 0xcb, 0x7f, 0x5d, 0x00, 0xb9, 0xd6, 0xac, 0x38, 0x7e, 0xa0, 0x3b, 0x06, 0x25, 0x46, 0xb8, - 0xb0, 0xe5, 0x0d, 0xf3, 0x91, 0xa1, 0x70, 0x42, 0x97, 0xe1, 0xd7, 0x6a, 0x21, 0x23, 0xbf, 0x0b, - 0xb5, 0x1d, 0xd7, 0x0f, 0xf8, 0xe2, 0x55, 0x4c, 0x9a, 0xcc, 0x6e, 0xc8, 0x72, 0x0c, 0x39, 0xd2, - 0xee, 0xec, 0xca, 0x60, 0x77, 0xb6, 0xf6, 0xbd, 0x22, 0x8c, 0x7e, 0x5a, 0xce, 0xdb, 0x67, 0xc5, - 0xab, 0x96, 0x72, 0xc6, 0xab, 0x96, 0x8f, 0x13, 0xaf, 0xaa, 0xfd, 0xa4, 0x00, 0xf0, 0xd8, 0x0e, - 0xfb, 0x9b, 0xc9, 0x50, 0xd2, 0xdc, 0xe3, 0x2a, 0x3b, 0x90, 0xf4, 0x1f, 0x54, 0xd4, 0x23, 0xf1, - 0x30, 0xd2, 0x0f, 0x0b, 0x30, 0xae, 0x27, 0x42, 0x33, 0x73, 0xeb, 0xcb, 0xa9, 0x48, 0xcf, 0x30, - 0xb2, 0x28, 0x59, 0x8e, 0x29, 0xb1, 0xe4, 0xb5, 0x28, 0xd1, 0xf4, 0xed, 0x68, 0xd8, 0xf7, 0x65, - 0x88, 0xe6, 0xba, 0x5b, 0x82, 0xf3, 0x11, 0xa1, 0xb0, 0xa5, 0x13, 0x09, 0x85, 0x8d, 0x1f, 0xf2, - 0x2b, 0x3f, 0xf4, 0x90, 0xdf, 0x1e, 0xd4, 0xb7, 0x3d, 0xb7, 0xc3, 0xa3, 0x4d, 0xe5, 0x5f, 0x8d, - 0xaf, 0xe7, 0x58, 0x28, 0xa3, 0xff, 0xf9, 0x47, 0x86, 0xab, 0x25, 0x85, 0x8f, 0x91, 0x28, 0x6e, - 0xeb, 0x77, 0x85, 0xd4, 0x91, 0x93, 0x94, 0x1a, 0xce, 0x25, 0x1b, 0x02, 0x1d, 0x95, 0x98, 0x64, - 0x84, 0x69, 0xf5, 0xf1, 0x44, 0x98, 0x6a, 0x7f, 0xa9, 0xaa, 0x26, 0xb0, 0x27, 0x2e, 0xa7, 0xe9, - 0x67, 0x47, 0xb3, 0xdb, 0xb4, 0xef, 0xdc, 0x74, 0xed, 0x31, 0x9e, 0x9b, 0xae, 0x9f, 0xcc, 0xb9, - 0x69, 0xc8, 0x77, 0x6e, 0xba, 0x71, 0x42, 0xe7, 0xa6, 0x47, 0x4f, 0xea, 0xdc, 0xf4, 0xd8, 0x50, - 0xe7, 0xa6, 0xc7, 0x8f, 0x74, 0x6e, 0xfa, 0xa0, 0x04, 0xa9, 0xcd, 0xf8, 0x67, 0x8e, 0xb7, 0xff, - 0xa7, 0x1c, 0x6f, 0x1f, 0x15, 0x21, 0x9a, 0x88, 0x8f, 0x19, 0x98, 0xf4, 0x16, 0xd4, 0x3a, 0xfa, - 0xfd, 0x45, 0x6a, 0xeb, 0xfb, 0x79, 0x7e, 0x05, 0xbc, 0x26, 0x31, 0x30, 0x44, 0x23, 0x3e, 0x80, - 0x15, 0xa6, 0xe3, 0xcf, 0xed, 0xc2, 0x88, 0x32, 0xfb, 0x0b, 0x23, 0x69, 0x74, 0x8f, 0x31, 0x31, - 0xda, 0xbf, 0x2a, 0x82, 0xfc, 0x6f, 0x03, 0xa1, 0x50, 0xd9, 0xb6, 0xee, 0x53, 0x33, 0x77, 0xb8, - 0x73, 0xec, 0x07, 0xed, 0xc2, 0x47, 0xc3, 0x0b, 0x50, 0xa0, 0x73, 0xe3, 0xbb, 0xf0, 0xb9, 0xc9, - 0xfe, 0xcb, 0x61, 0x7c, 0x8f, 0xfb, 0xee, 0xa4, 0xf1, 0x5d, 0x14, 0xa1, 0x92, 0x21, 0x6c, 0xfd, - 0x3c, 0xfc, 0x22, 0xb7, 0x8b, 0x31, 0x11, 0xc6, 0xa1, 0x6c, 0xfd, 0xbe, 0x48, 0x9c, 0x20, 0x65, - 0x34, 0xbf, 0xfc, 0xe3, 0x9f, 0x5e, 0x79, 0xea, 0x27, 0x3f, 0xbd, 0xf2, 0xd4, 0xc7, 0x3f, 0xbd, - 0xf2, 0xd4, 0xd7, 0x0f, 0xaf, 0x14, 0x7e, 0x7c, 0x78, 0xa5, 0xf0, 0x93, 0xc3, 0x2b, 0x85, 0x8f, - 0x0f, 0xaf, 0x14, 0xfe, 0xe3, 0xe1, 0x95, 0xc2, 0x5f, 0xfd, 0x4f, 0x57, 0x9e, 0xfa, 0xe3, 0x57, - 0xa3, 0x26, 0xcc, 0xaa, 0x26, 0xcc, 0x2a, 0x81, 0xb3, 0xdd, 0xdd, 0xf6, 0x2c, 0x6b, 0x42, 0x54, - 0xa2, 0x9a, 0xf0, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xc4, 0xe2, 0xd0, 0x0e, 0xda, 0x9a, 0x00, - 0x00, + // 8046 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x5d, 0x6c, 0x24, 0x57, + 0x76, 0x9e, 0xfa, 0xbf, 0xfb, 0x34, 0xff, 0x74, 0x67, 0x34, 0xe2, 0xcc, 0x4a, 0xd3, 0xe3, 0x5a, + 0xef, 0x7a, 0x1c, 0xdb, 0x64, 0x44, 0xaf, 0xb4, 0x5a, 0xdb, 0xbb, 0x12, 0x9b, 0x1c, 0x72, 0x38, + 0x43, 0xce, 0x70, 0x4f, 0x93, 0x23, 0xad, 0x15, 0xaf, 0x52, 0xac, 0xba, 0x6c, 0x96, 0x58, 0x5d, + 0xd5, 0x5b, 0x55, 0xcd, 0x19, 0xca, 0x09, 0xd6, 0xb6, 0x12, 0x68, 0x83, 0x24, 0x48, 0xe0, 0x27, + 0x03, 0x81, 0x13, 0x24, 0x08, 0xe0, 0x07, 0xc3, 0x79, 0x08, 0xb2, 0x79, 0x08, 0x90, 0x1f, 0x07, + 0x41, 0xb2, 0xf9, 0x5f, 0x04, 0x01, 0xb2, 0x79, 0x21, 0xb2, 0x0c, 0xf2, 0x90, 0x00, 0x0e, 0x8c, + 0x18, 0x89, 0x9d, 0x81, 0x11, 0x07, 0xf7, 0xaf, 0xfe, 0xba, 0x7a, 0x86, 0xec, 0x6a, 0x8e, 0x46, + 0x89, 0xde, 0xba, 0xef, 0x39, 0xf7, 0x3b, 0xb7, 0x6e, 0xdd, 0xba, 0xf7, 0xdc, 0x73, 0xce, 0x3d, + 0x17, 0xd6, 0xbb, 0x56, 0x70, 0x30, 0xd8, 0x5b, 0x30, 0xdc, 0xde, 0xa2, 0x33, 0xe8, 0xe9, 0x7d, + 0xcf, 0xfd, 0x80, 0xff, 0xd8, 0xb7, 0xdd, 0x87, 0x8b, 0xfd, 0xc3, 0xee, 0xa2, 0xde, 0xb7, 0xfc, + 0xa8, 0xe4, 0xe8, 0x35, 0xdd, 0xee, 0x1f, 0xe8, 0xaf, 0x2d, 0x76, 0xa9, 0x43, 0x3d, 0x3d, 0xa0, + 0xe6, 0x42, 0xdf, 0x73, 0x03, 0x97, 0x7c, 0x39, 0x02, 0x5a, 0x50, 0x40, 0x0b, 0xaa, 0xda, 0x42, + 0xff, 0xb0, 0xbb, 0xc0, 0x80, 0xa2, 0x12, 0x05, 0x74, 0xed, 0xa7, 0x62, 0x2d, 0xe8, 0xba, 0x5d, + 0x77, 0x91, 0xe3, 0xed, 0x0d, 0xf6, 0xf9, 0x3f, 0xfe, 0x87, 0xff, 0x12, 0x72, 0xae, 0x69, 0x87, + 0x6f, 0xfa, 0x0b, 0x96, 0xcb, 0x9a, 0xb5, 0x68, 0xb8, 0x1e, 0x5d, 0x3c, 0x1a, 0x6a, 0xcb, 0xb5, + 0x2f, 0x45, 0x3c, 0x3d, 0xdd, 0x38, 0xb0, 0x1c, 0xea, 0x1d, 0xab, 0x67, 0x59, 0xf4, 0xa8, 0xef, + 0x0e, 0x3c, 0x83, 0x9e, 0xab, 0x96, 0xbf, 0xd8, 0xa3, 0x81, 0x9e, 0x25, 0x6b, 0x71, 0x54, 0x2d, + 0x6f, 0xe0, 0x04, 0x56, 0x6f, 0x58, 0xcc, 0x1b, 0x4f, 0xab, 0xe0, 0x1b, 0x07, 0xb4, 0xa7, 0x0f, + 0xd5, 0xfb, 0xe9, 0x51, 0xf5, 0x06, 0x81, 0x65, 0x2f, 0x5a, 0x4e, 0xe0, 0x07, 0x5e, 0xba, 0x92, + 0xf6, 0xdb, 0x00, 0x97, 0x96, 0xf7, 0xfc, 0xc0, 0xd3, 0x8d, 0x60, 0xdb, 0x35, 0x77, 0x68, 0xaf, + 0x6f, 0xeb, 0x01, 0x25, 0x87, 0x50, 0x67, 0x0f, 0x64, 0xea, 0x81, 0x3e, 0x5f, 0xb8, 0x51, 0xb8, + 0xd9, 0x5c, 0x5a, 0x5e, 0x18, 0xf3, 0x05, 0x2e, 0x6c, 0x49, 0xa0, 0xf6, 0xd4, 0xe9, 0x49, 0xab, + 0xae, 0xfe, 0x61, 0x28, 0x80, 0xfc, 0x5a, 0x01, 0xa6, 0x1c, 0xd7, 0xa4, 0x1d, 0x6a, 0x53, 0x23, + 0x70, 0xbd, 0xf9, 0xe2, 0x8d, 0xd2, 0xcd, 0xe6, 0xd2, 0x37, 0xc7, 0x96, 0x98, 0xf1, 0x44, 0x0b, + 0xf7, 0x62, 0x02, 0x6e, 0x39, 0x81, 0x77, 0xdc, 0xbe, 0xfc, 0xbd, 0x93, 0xd6, 0x0b, 0xa7, 0x27, + 0xad, 0xa9, 0x38, 0x09, 0x13, 0x2d, 0x21, 0xbb, 0xd0, 0x0c, 0x5c, 0x9b, 0x75, 0x99, 0xe5, 0x3a, + 0xfe, 0x7c, 0x89, 0x37, 0xec, 0xfa, 0x82, 0xe8, 0x6a, 0x26, 0x7e, 0x81, 0x8d, 0xb1, 0x85, 0xa3, + 0xd7, 0x16, 0x76, 0x42, 0xb6, 0xf6, 0x25, 0x09, 0xdc, 0x8c, 0xca, 0x7c, 0x8c, 0xe3, 0x10, 0x0a, + 0xb3, 0x3e, 0x35, 0x06, 0x9e, 0x15, 0x1c, 0xaf, 0xb8, 0x4e, 0x40, 0x1f, 0x05, 0xf3, 0x65, 0xde, + 0xcb, 0x5f, 0xcc, 0x82, 0xde, 0x76, 0xcd, 0x4e, 0x92, 0xbb, 0x7d, 0xe9, 0xf4, 0xa4, 0x35, 0x9b, + 0x2a, 0xc4, 0x34, 0x26, 0x71, 0x60, 0xce, 0xea, 0xe9, 0x5d, 0xba, 0x3d, 0xb0, 0xed, 0x0e, 0x35, + 0x3c, 0x1a, 0xf8, 0xf3, 0x15, 0xfe, 0x08, 0x37, 0xb3, 0xe4, 0x6c, 0xba, 0x86, 0x6e, 0xdf, 0xdf, + 0xfb, 0x80, 0x1a, 0x01, 0xd2, 0x7d, 0xea, 0x51, 0xc7, 0xa0, 0xed, 0x79, 0xf9, 0x30, 0x73, 0x1b, + 0x29, 0x24, 0x1c, 0xc2, 0x26, 0xeb, 0xf0, 0x62, 0xdf, 0xb3, 0x5c, 0xde, 0x04, 0x5b, 0xf7, 0xfd, + 0x7b, 0x7a, 0x8f, 0xce, 0x57, 0x6f, 0x14, 0x6e, 0x36, 0xda, 0x57, 0x25, 0xcc, 0x8b, 0xdb, 0x69, + 0x06, 0x1c, 0xae, 0x43, 0x6e, 0x42, 0x5d, 0x15, 0xce, 0xd7, 0x6e, 0x14, 0x6e, 0x56, 0xc4, 0xd8, + 0x51, 0x75, 0x31, 0xa4, 0x92, 0x35, 0xa8, 0xeb, 0xfb, 0xfb, 0x96, 0xc3, 0x38, 0xeb, 0xbc, 0x0b, + 0x5f, 0xc9, 0x7a, 0xb4, 0x65, 0xc9, 0x23, 0x70, 0xd4, 0x3f, 0x0c, 0xeb, 0x92, 0x3b, 0x40, 0x7c, + 0xea, 0x1d, 0x59, 0x06, 0x5d, 0x36, 0x0c, 0x77, 0xe0, 0x04, 0xbc, 0xed, 0x0d, 0xde, 0xf6, 0x6b, + 0xb2, 0xed, 0xa4, 0x33, 0xc4, 0x81, 0x19, 0xb5, 0xc8, 0xdb, 0x30, 0x27, 0xbf, 0xd5, 0xa8, 0x17, + 0x80, 0x23, 0x5d, 0x66, 0x1d, 0x89, 0x29, 0x1a, 0x0e, 0x71, 0x13, 0x13, 0x5e, 0xd1, 0x07, 0x81, + 0xdb, 0x63, 0x90, 0x49, 0xa1, 0x3b, 0xee, 0x21, 0x75, 0xe6, 0x9b, 0x37, 0x0a, 0x37, 0xeb, 0xed, + 0x1b, 0xa7, 0x27, 0xad, 0x57, 0x96, 0x9f, 0xc0, 0x87, 0x4f, 0x44, 0x21, 0xf7, 0xa1, 0x61, 0x3a, + 0xfe, 0xb6, 0x6b, 0x5b, 0xc6, 0xf1, 0xfc, 0x14, 0x6f, 0xe0, 0x6b, 0xf2, 0x51, 0x1b, 0xab, 0xf7, + 0x3a, 0x82, 0xf0, 0xf8, 0xa4, 0xf5, 0xca, 0xf0, 0x94, 0xba, 0x10, 0xd2, 0x31, 0xc2, 0x20, 0x5b, + 0x1c, 0x70, 0xc5, 0x75, 0xf6, 0xad, 0xee, 0xfc, 0x34, 0x7f, 0x1b, 0x37, 0x46, 0x0c, 0xe8, 0xd5, + 0x7b, 0x1d, 0xc1, 0xd7, 0x9e, 0x96, 0xe2, 0xc4, 0x5f, 0x8c, 0x10, 0x88, 0x09, 0x33, 0x6a, 0x32, + 0x5e, 0xb1, 0x75, 0xab, 0xe7, 0xcf, 0xcf, 0xf0, 0xc1, 0xfb, 0xa3, 0x23, 0x30, 0x31, 0xce, 0xdc, + 0xbe, 0x22, 0x1f, 0x65, 0x26, 0x51, 0xec, 0x63, 0x0a, 0xf3, 0xda, 0x5b, 0xf0, 0xe2, 0xd0, 0xdc, + 0x40, 0xe6, 0xa0, 0x74, 0x48, 0x8f, 0xf9, 0xd4, 0xd7, 0x40, 0xf6, 0x93, 0x5c, 0x86, 0xca, 0x91, + 0x6e, 0x0f, 0xe8, 0x7c, 0x91, 0x97, 0x89, 0x3f, 0x3f, 0x53, 0x7c, 0xb3, 0xa0, 0xfd, 0x8d, 0x12, + 0x4c, 0xa9, 0x19, 0xa7, 0x63, 0x39, 0x87, 0xe4, 0x1d, 0x28, 0xd9, 0x6e, 0x57, 0xce, 0x9b, 0x3f, + 0x37, 0xf6, 0x2c, 0xb6, 0xe9, 0x76, 0xdb, 0xb5, 0xd3, 0x93, 0x56, 0x69, 0xd3, 0xed, 0x22, 0x43, + 0x24, 0x06, 0x54, 0x0e, 0xf5, 0xfd, 0x43, 0x9d, 0xb7, 0xa1, 0xb9, 0xd4, 0x1e, 0x1b, 0xfa, 0x2e, + 0x43, 0x61, 0x6d, 0x6d, 0x37, 0x4e, 0x4f, 0x5a, 0x15, 0xfe, 0x17, 0x05, 0x36, 0x71, 0xa1, 0xb1, + 0x67, 0xeb, 0xc6, 0xe1, 0x81, 0x6b, 0xd3, 0xf9, 0x52, 0x4e, 0x41, 0x6d, 0x85, 0x24, 0x5e, 0x73, + 0xf8, 0x17, 0x23, 0x19, 0xc4, 0x80, 0xea, 0xc0, 0xf4, 0x2d, 0xe7, 0x50, 0xce, 0x81, 0x6f, 0x8d, + 0x2d, 0x6d, 0x77, 0x95, 0x3f, 0x13, 0x9c, 0x9e, 0xb4, 0xaa, 0xe2, 0x37, 0x4a, 0x68, 0xed, 0x0f, + 0xa6, 0x60, 0x46, 0xbd, 0xa4, 0x07, 0xd4, 0x0b, 0xe8, 0x23, 0x72, 0x03, 0xca, 0x0e, 0xfb, 0x34, + 0xf9, 0x4b, 0x6e, 0x4f, 0xc9, 0xe1, 0x52, 0xe6, 0x9f, 0x24, 0xa7, 0xb0, 0x96, 0x89, 0xa1, 0x22, + 0x3b, 0x7c, 0xfc, 0x96, 0x75, 0x38, 0x8c, 0x68, 0x99, 0xf8, 0x8d, 0x12, 0x9a, 0xbc, 0x07, 0x65, + 0xfe, 0xf0, 0xa2, 0xab, 0xbf, 0x3a, 0xbe, 0x08, 0xf6, 0xe8, 0x75, 0xf6, 0x04, 0xfc, 0xc1, 0x39, + 0x28, 0x1b, 0x8a, 0x03, 0x73, 0x5f, 0x76, 0xec, 0xcf, 0xe5, 0xe8, 0xd8, 0x35, 0x31, 0x14, 0x77, + 0x57, 0xd7, 0x90, 0x21, 0x92, 0xbf, 0x54, 0x80, 0x17, 0x0d, 0xd7, 0x09, 0x74, 0xa6, 0x67, 0xa8, + 0x45, 0x76, 0xbe, 0xc2, 0xe5, 0xdc, 0x19, 0x5b, 0xce, 0x4a, 0x1a, 0xb1, 0xfd, 0x12, 0x5b, 0x33, + 0x86, 0x8a, 0x71, 0x58, 0x36, 0xf9, 0x2b, 0x05, 0x78, 0x89, 0xcd, 0xe5, 0x43, 0xcc, 0x7c, 0x05, + 0x9a, 0x6c, 0xab, 0xae, 0x9e, 0x9e, 0xb4, 0x5e, 0xda, 0xc8, 0x12, 0x86, 0xd9, 0x6d, 0x60, 0xad, + 0xbb, 0xa4, 0x0f, 0xab, 0x25, 0x7c, 0x75, 0x6b, 0x2e, 0x6d, 0x4e, 0x52, 0xd5, 0x69, 0x7f, 0x4e, + 0x0e, 0xe5, 0x2c, 0xcd, 0x0e, 0xb3, 0x5a, 0x41, 0x6e, 0x41, 0xed, 0xc8, 0xb5, 0x07, 0x3d, 0xea, + 0xcf, 0xd7, 0xf9, 0x14, 0x7b, 0x2d, 0x6b, 0x8a, 0x7d, 0xc0, 0x59, 0xda, 0xb3, 0x12, 0xbe, 0x26, + 0xfe, 0xfb, 0xa8, 0xea, 0x12, 0x0b, 0xaa, 0xb6, 0xd5, 0xb3, 0x02, 0x9f, 0x2f, 0x9c, 0xcd, 0xa5, + 0x5b, 0x63, 0x3f, 0x96, 0xf8, 0x44, 0x37, 0x39, 0x98, 0xf8, 0x6a, 0xc4, 0x6f, 0x94, 0x02, 0xd8, + 0x54, 0xe8, 0x1b, 0xba, 0x2d, 0x16, 0xd6, 0xe6, 0xd2, 0xd7, 0xc6, 0xff, 0x6c, 0x18, 0x4a, 0x7b, + 0x5a, 0x3e, 0x53, 0x85, 0xff, 0x45, 0x81, 0x4d, 0x7e, 0x01, 0x66, 0x12, 0x6f, 0xd3, 0x9f, 0x6f, + 0xf2, 0xde, 0x79, 0x35, 0xab, 0x77, 0x42, 0xae, 0x68, 0xe5, 0x49, 0x8c, 0x10, 0x1f, 0x53, 0x60, + 0xe4, 0x2e, 0xd4, 0x7d, 0xcb, 0xa4, 0x86, 0xee, 0xf9, 0xf3, 0x53, 0x67, 0x01, 0x9e, 0x93, 0xc0, + 0xf5, 0x8e, 0xac, 0x86, 0x21, 0x00, 0x59, 0x00, 0xe8, 0xeb, 0x5e, 0x60, 0x09, 0x45, 0x75, 0x9a, + 0x2b, 0x4d, 0x33, 0xa7, 0x27, 0x2d, 0xd8, 0x0e, 0x4b, 0x31, 0xc6, 0xc1, 0xf8, 0x59, 0xdd, 0x0d, + 0xa7, 0x3f, 0x08, 0xc4, 0xc2, 0xda, 0x10, 0xfc, 0x9d, 0xb0, 0x14, 0x63, 0x1c, 0xe4, 0xb7, 0x0a, + 0xf0, 0xb9, 0xe8, 0xef, 0xf0, 0x47, 0x36, 0x3b, 0xf1, 0x8f, 0xac, 0x75, 0x7a, 0xd2, 0xfa, 0x5c, + 0x67, 0xb4, 0x48, 0x7c, 0x52, 0x7b, 0xc8, 0xc7, 0x05, 0x98, 0x19, 0xf4, 0x4d, 0x3d, 0xa0, 0x9d, + 0x80, 0xed, 0x78, 0xba, 0xc7, 0xf3, 0x73, 0xbc, 0x89, 0xeb, 0xe3, 0xcf, 0x82, 0x09, 0xb8, 0xe8, + 0x35, 0x27, 0xcb, 0x31, 0x25, 0x56, 0x7b, 0x07, 0xa6, 0x97, 0x07, 0xc1, 0x81, 0xeb, 0x59, 0x1f, + 0x72, 0xf5, 0x9f, 0xac, 0x41, 0x25, 0xe0, 0x6a, 0x9c, 0xd0, 0x10, 0xbe, 0x90, 0xf5, 0xd2, 0x85, + 0x4a, 0x7d, 0x97, 0x1e, 0x2b, 0xbd, 0x44, 0xac, 0xd4, 0x42, 0xad, 0x13, 0xd5, 0xb5, 0x3f, 0x53, + 0x80, 0x5a, 0x5b, 0x37, 0x0e, 0xdd, 0xfd, 0x7d, 0xf2, 0x2e, 0xd4, 0x2d, 0x27, 0xa0, 0xde, 0x91, + 0x6e, 0x4b, 0xd8, 0x85, 0x18, 0x6c, 0xb8, 0x21, 0x8c, 0x1e, 0x8f, 0xed, 0xbe, 0x98, 0xa0, 0xd5, + 0x81, 0xdc, 0xb5, 0x70, 0xcd, 0x78, 0x43, 0x62, 0x60, 0x88, 0x46, 0x5a, 0x50, 0xf1, 0x03, 0xda, + 0xf7, 0xf9, 0x1a, 0x38, 0x2d, 0x9a, 0xd1, 0x61, 0x05, 0x28, 0xca, 0xb5, 0xbf, 0x5e, 0x80, 0x46, + 0x5b, 0xf7, 0x2d, 0x83, 0x3d, 0x25, 0x59, 0x81, 0xf2, 0xc0, 0xa7, 0xde, 0xf9, 0x9e, 0x8d, 0x2f, + 0x5b, 0xbb, 0x3e, 0xf5, 0x90, 0x57, 0x26, 0xf7, 0xa1, 0xde, 0xd7, 0x7d, 0xff, 0xa1, 0xeb, 0x99, + 0x72, 0xe9, 0x3d, 0x23, 0x90, 0xd8, 0x26, 0xc8, 0xaa, 0x18, 0x82, 0x68, 0x4d, 0x88, 0x74, 0x0f, + 0xed, 0xf7, 0x0a, 0x70, 0xa9, 0x3d, 0xd8, 0xdf, 0xa7, 0x9e, 0xd4, 0x8a, 0xa5, 0xbe, 0x49, 0xa1, + 0xe2, 0x51, 0xd3, 0xf2, 0x65, 0xdb, 0x57, 0xc7, 0x1e, 0x28, 0xc8, 0x50, 0xa4, 0x7a, 0xcb, 0xfb, + 0x8b, 0x17, 0xa0, 0x40, 0x27, 0x03, 0x68, 0x7c, 0x40, 0xd9, 0x6e, 0x9c, 0xea, 0x3d, 0xf9, 0x74, + 0xb7, 0xc7, 0x16, 0x75, 0x87, 0x06, 0x1d, 0x8e, 0x14, 0xd7, 0xa6, 0xc3, 0x42, 0x8c, 0x24, 0x69, + 0xbf, 0x5d, 0x81, 0xa9, 0x15, 0xb7, 0xb7, 0x67, 0x39, 0xd4, 0xbc, 0x65, 0x76, 0x29, 0x79, 0x1f, + 0xca, 0xd4, 0xec, 0x52, 0xf9, 0xb4, 0xe3, 0x2b, 0x1e, 0x0c, 0x2c, 0x52, 0x9f, 0xd8, 0x3f, 0xe4, + 0xc0, 0x64, 0x13, 0x66, 0xf6, 0x3d, 0xb7, 0x27, 0xe6, 0xf2, 0x9d, 0xe3, 0xbe, 0xd4, 0x9d, 0xdb, + 0x3f, 0xaa, 0x3e, 0x9c, 0xb5, 0x04, 0xf5, 0xf1, 0x49, 0x0b, 0xa2, 0x7f, 0x98, 0xaa, 0x4b, 0xde, + 0x85, 0xf9, 0xa8, 0x24, 0x9c, 0xd4, 0x56, 0xd8, 0x76, 0x86, 0xeb, 0x4e, 0x95, 0xf6, 0x2b, 0xa7, + 0x27, 0xad, 0xf9, 0xb5, 0x11, 0x3c, 0x38, 0xb2, 0x36, 0x9b, 0x2a, 0xe6, 0x22, 0xa2, 0x58, 0x68, + 0xa4, 0xca, 0x34, 0xa1, 0x15, 0x8c, 0xef, 0xfb, 0xd6, 0x52, 0x22, 0x70, 0x48, 0x28, 0x59, 0x83, + 0xa9, 0xc0, 0x8d, 0xf5, 0x57, 0x85, 0xf7, 0x97, 0xa6, 0x0c, 0x15, 0x3b, 0xee, 0xc8, 0xde, 0x4a, + 0xd4, 0x23, 0x08, 0x57, 0xd4, 0xff, 0x54, 0x4f, 0x55, 0x79, 0x4f, 0x5d, 0x3b, 0x3d, 0x69, 0x5d, + 0xd9, 0xc9, 0xe4, 0xc0, 0x11, 0x35, 0xc9, 0x2f, 0x17, 0x60, 0x46, 0x91, 0x64, 0x1f, 0xd5, 0x26, + 0xd9, 0x47, 0x84, 0x8d, 0x88, 0x9d, 0x84, 0x00, 0x4c, 0x09, 0xd4, 0x7e, 0xa7, 0x0a, 0x8d, 0x70, + 0xaa, 0x27, 0x9f, 0x87, 0x0a, 0x37, 0x41, 0x48, 0x0d, 0x3e, 0x5c, 0xc3, 0xb9, 0xa5, 0x02, 0x05, + 0x8d, 0x7c, 0x01, 0x6a, 0x86, 0xdb, 0xeb, 0xe9, 0x8e, 0xc9, 0xcd, 0x4a, 0x8d, 0x76, 0x93, 0xa9, + 0x2e, 0x2b, 0xa2, 0x08, 0x15, 0x8d, 0xbc, 0x02, 0x65, 0xdd, 0xeb, 0x0a, 0x0b, 0x4f, 0x43, 0xcc, + 0x47, 0xcb, 0x5e, 0xd7, 0x47, 0x5e, 0x4a, 0xbe, 0x02, 0x25, 0xea, 0x1c, 0xcd, 0x97, 0x47, 0xeb, + 0x46, 0xb7, 0x9c, 0xa3, 0x07, 0xba, 0xd7, 0x6e, 0xca, 0x36, 0x94, 0x6e, 0x39, 0x47, 0xc8, 0xea, + 0x90, 0x4d, 0xa8, 0x51, 0xe7, 0x88, 0xbd, 0x7b, 0x69, 0x7a, 0xf9, 0x91, 0x11, 0xd5, 0x19, 0x8b, + 0xdc, 0x26, 0x84, 0x1a, 0x96, 0x2c, 0x46, 0x05, 0x41, 0xbe, 0x01, 0x53, 0x42, 0xd9, 0xda, 0x62, + 0xef, 0xc4, 0x9f, 0xaf, 0x72, 0xc8, 0xd6, 0x68, 0x6d, 0x8d, 0xf3, 0x45, 0xa6, 0xae, 0x58, 0xa1, + 0x8f, 0x09, 0x28, 0xf2, 0x0d, 0x68, 0xa8, 0x9d, 0xb1, 0x7a, 0xb3, 0x99, 0x56, 0x22, 0xb5, 0x9d, + 0x46, 0xfa, 0xad, 0x81, 0xe5, 0xd1, 0x1e, 0x75, 0x02, 0xbf, 0xfd, 0xa2, 0xb2, 0x1b, 0x28, 0xaa, + 0x8f, 0x11, 0x1a, 0xd9, 0x1b, 0x36, 0x77, 0x09, 0x5b, 0xcd, 0xe7, 0x47, 0xcc, 0xea, 0x63, 0xd8, + 0xba, 0xbe, 0x09, 0xb3, 0xa1, 0x3d, 0x4a, 0x9a, 0x34, 0x84, 0xf5, 0xe6, 0x4b, 0xac, 0xfa, 0x46, + 0x92, 0xf4, 0xf8, 0xa4, 0xf5, 0x6a, 0x86, 0x51, 0x23, 0x62, 0xc0, 0x34, 0x18, 0xf9, 0x10, 0x66, + 0x3c, 0xaa, 0x9b, 0x96, 0x43, 0x7d, 0x7f, 0xdb, 0x73, 0xf7, 0xf2, 0x6b, 0x9e, 0x1c, 0x45, 0x0c, + 0x7b, 0x4c, 0x20, 0x63, 0x4a, 0x12, 0x79, 0x08, 0xd3, 0xb6, 0x75, 0x44, 0x23, 0xd1, 0xcd, 0x89, + 0x88, 0x7e, 0xf1, 0xf4, 0xa4, 0x35, 0xbd, 0x19, 0x07, 0xc6, 0xa4, 0x1c, 0xed, 0xef, 0x54, 0x60, + 0x78, 0xf3, 0x95, 0x1c, 0x29, 0x85, 0x49, 0x8f, 0x94, 0xf4, 0x5b, 0x14, 0x6b, 0xc6, 0x9b, 0xb2, + 0xda, 0x04, 0xde, 0x64, 0xc6, 0x68, 0x2c, 0x4d, 0x7a, 0x34, 0x3e, 0x37, 0x13, 0xc6, 0xf0, 0xb0, + 0xad, 0x7e, 0x72, 0xc3, 0xb6, 0xf6, 0x8c, 0x86, 0xed, 0x77, 0xca, 0x30, 0xb3, 0xaa, 0xd3, 0x9e, + 0xeb, 0x3c, 0x75, 0xff, 0x5d, 0x78, 0x2e, 0xf6, 0xdf, 0x37, 0xa1, 0xee, 0xd1, 0xbe, 0x6d, 0x19, + 0xba, 0x50, 0xb3, 0xa5, 0xbd, 0x1b, 0x65, 0x19, 0x86, 0xd4, 0x11, 0x76, 0x97, 0xd2, 0x73, 0x69, + 0x77, 0x29, 0x7f, 0xf2, 0x76, 0x17, 0xed, 0x97, 0x8b, 0xc0, 0x55, 0x52, 0x72, 0x03, 0xca, 0x4c, + 0xdd, 0x4a, 0x5b, 0xfb, 0xf8, 0xd7, 0xc2, 0x29, 0xe4, 0x1a, 0x14, 0x03, 0x57, 0x4e, 0x37, 0x20, + 0xe9, 0xc5, 0x1d, 0x17, 0x8b, 0x81, 0x4b, 0x3e, 0x04, 0x30, 0x5c, 0xc7, 0xb4, 0x94, 0x1b, 0x28, + 0xdf, 0x83, 0xad, 0xb9, 0xde, 0x43, 0xdd, 0x33, 0x57, 0x42, 0x44, 0xb1, 0xf3, 0x8e, 0xfe, 0x63, + 0x4c, 0x1a, 0x79, 0x0b, 0xaa, 0xae, 0xb3, 0x36, 0xb0, 0x6d, 0xde, 0xa1, 0x8d, 0xf6, 0x8f, 0x9d, + 0x9e, 0xb4, 0xaa, 0xf7, 0x79, 0xc9, 0xe3, 0x93, 0xd6, 0x55, 0xb1, 0x93, 0x61, 0xff, 0xde, 0xf1, + 0xac, 0xc0, 0x72, 0xba, 0xe1, 0x46, 0x54, 0x56, 0xd3, 0x7e, 0xb5, 0x00, 0xcd, 0x35, 0xeb, 0x11, + 0x35, 0xdf, 0xb1, 0x1c, 0xd3, 0x7d, 0x48, 0x10, 0xaa, 0x36, 0x75, 0xba, 0xc1, 0xc1, 0x98, 0x3b, + 0x45, 0x61, 0x8f, 0xe1, 0x08, 0x28, 0x91, 0xc8, 0x22, 0x34, 0xc4, 0x3e, 0xc3, 0x72, 0xba, 0xbc, + 0x0f, 0xeb, 0xd1, 0x4c, 0xdf, 0x51, 0x04, 0x8c, 0x78, 0xb4, 0x63, 0x78, 0x71, 0xa8, 0x1b, 0x88, + 0x09, 0xe5, 0x40, 0xef, 0xaa, 0x45, 0x65, 0x6d, 0xec, 0x0e, 0xde, 0xd1, 0xbb, 0xb1, 0xce, 0xe5, + 0xda, 0xdc, 0x8e, 0xce, 0xb4, 0x39, 0x86, 0xae, 0xfd, 0x61, 0x01, 0xea, 0x6b, 0x03, 0xc7, 0xe0, + 0x9b, 0xf1, 0xa7, 0x5b, 0x81, 0x95, 0x6a, 0x58, 0xcc, 0x54, 0x0d, 0x07, 0x50, 0x3d, 0x7c, 0x18, + 0xaa, 0x8e, 0xcd, 0xa5, 0xad, 0xf1, 0x47, 0x85, 0x6c, 0xd2, 0xc2, 0x5d, 0x8e, 0x27, 0x9c, 0x94, + 0x33, 0xb2, 0x41, 0xd5, 0xbb, 0xef, 0x70, 0xa1, 0x52, 0xd8, 0xb5, 0xaf, 0x40, 0x33, 0xc6, 0x76, + 0x2e, 0x7f, 0xc5, 0xdf, 0x2d, 0x43, 0x75, 0xbd, 0xd3, 0x59, 0xde, 0xde, 0x20, 0xaf, 0x43, 0x53, + 0xfa, 0xaf, 0xee, 0x45, 0x7d, 0x10, 0xba, 0x2f, 0x3b, 0x11, 0x09, 0xe3, 0x7c, 0x4c, 0xf1, 0xf6, + 0xa8, 0x6e, 0xf7, 0xe4, 0xc7, 0x12, 0x2a, 0xde, 0xc8, 0x0a, 0x51, 0xd0, 0x88, 0x0e, 0x33, 0x6c, + 0x2f, 0xcf, 0xba, 0x50, 0xec, 0xd3, 0xe5, 0x67, 0x73, 0xc6, 0x9d, 0x3c, 0x5f, 0x60, 0x76, 0x13, + 0x00, 0x98, 0x02, 0x24, 0x6f, 0x42, 0x5d, 0x1f, 0x04, 0x07, 0x7c, 0xab, 0x24, 0xbe, 0x8d, 0x57, + 0xb8, 0x7b, 0x4f, 0x96, 0x3d, 0x3e, 0x69, 0x4d, 0xdd, 0xc5, 0xf6, 0xeb, 0xea, 0x3f, 0x86, 0xdc, + 0xac, 0x71, 0xca, 0x36, 0x20, 0x1b, 0x57, 0x39, 0x77, 0xe3, 0xb6, 0x13, 0x00, 0x98, 0x02, 0x24, + 0xef, 0xc1, 0xd4, 0x21, 0x3d, 0x0e, 0xf4, 0x3d, 0x29, 0xa0, 0x7a, 0x1e, 0x01, 0x73, 0x4c, 0x59, + 0xbf, 0x1b, 0xab, 0x8e, 0x09, 0x30, 0xe2, 0xc3, 0xe5, 0x43, 0xea, 0xed, 0x51, 0xcf, 0x95, 0x76, + 0x06, 0x29, 0xa4, 0x76, 0x1e, 0x21, 0xf3, 0xa7, 0x27, 0xad, 0xcb, 0x77, 0x33, 0x60, 0x30, 0x13, + 0x5c, 0xfb, 0xdf, 0x45, 0x98, 0x5d, 0x17, 0x01, 0x04, 0xae, 0x27, 0x34, 0x0f, 0x72, 0x15, 0x4a, + 0x5e, 0x7f, 0xc0, 0x47, 0x4e, 0x49, 0xb8, 0x08, 0x70, 0x7b, 0x17, 0x59, 0x19, 0x79, 0x17, 0xea, + 0xa6, 0x9c, 0x32, 0xa4, 0x99, 0x63, 0x2c, 0x93, 0x94, 0xfa, 0x87, 0x21, 0x1a, 0xdb, 0xd3, 0xf5, + 0xfc, 0x6e, 0xc7, 0xfa, 0x90, 0xca, 0x9d, 0x3f, 0xdf, 0xd3, 0x6d, 0x89, 0x22, 0x54, 0x34, 0xb6, + 0xaa, 0x1e, 0xd2, 0x63, 0xb1, 0xef, 0x2d, 0x47, 0xab, 0xea, 0x5d, 0x59, 0x86, 0x21, 0x95, 0xb4, + 0xd4, 0xc7, 0xc2, 0x46, 0x41, 0x59, 0xd8, 0x6c, 0x1e, 0xb0, 0x02, 0xf9, 0xdd, 0xb0, 0x29, 0xf3, + 0x03, 0x2b, 0x08, 0xa8, 0x27, 0x5f, 0xe3, 0x58, 0x53, 0xe6, 0x1d, 0x8e, 0x80, 0x12, 0x89, 0xfc, + 0x04, 0x34, 0x38, 0x78, 0xdb, 0x76, 0xf7, 0xf8, 0x8b, 0x6b, 0x08, 0xeb, 0xcd, 0x03, 0x55, 0x88, + 0x11, 0x5d, 0xfb, 0xa3, 0x22, 0x5c, 0x59, 0xa7, 0x81, 0xd0, 0x6a, 0x56, 0x69, 0xdf, 0x76, 0x8f, + 0x99, 0x3e, 0x8d, 0xf4, 0x5b, 0xe4, 0x6d, 0x00, 0xcb, 0xdf, 0xeb, 0x1c, 0x19, 0xfc, 0x3b, 0x10, + 0xdf, 0xf0, 0x0d, 0xf9, 0x49, 0xc2, 0x46, 0xa7, 0x2d, 0x29, 0x8f, 0x13, 0xff, 0x30, 0x56, 0x27, + 0xda, 0x48, 0x17, 0x9f, 0xb0, 0x91, 0xee, 0x00, 0xf4, 0x23, 0xad, 0xbc, 0xc4, 0x39, 0x7f, 0x5a, + 0x89, 0x39, 0x8f, 0x42, 0x1e, 0x83, 0xc9, 0xa3, 0x27, 0x3b, 0x30, 0x67, 0xd2, 0x7d, 0x7d, 0x60, + 0x07, 0xe1, 0x4e, 0x42, 0x7e, 0xc4, 0x67, 0xdf, 0x8c, 0x84, 0xc1, 0x0d, 0xab, 0x29, 0x24, 0x1c, + 0xc2, 0xd6, 0xfe, 0x5e, 0x09, 0xae, 0xad, 0xd3, 0x20, 0xb4, 0xad, 0xc9, 0xd9, 0xb1, 0xd3, 0xa7, + 0x06, 0x7b, 0x0b, 0x1f, 0x17, 0xa0, 0x6a, 0xeb, 0x7b, 0xd4, 0x66, 0xab, 0x17, 0x7b, 0x9a, 0xf7, + 0xc7, 0x5e, 0x08, 0x46, 0x4b, 0x59, 0xd8, 0xe4, 0x12, 0x52, 0x4b, 0x83, 0x28, 0x44, 0x29, 0x9e, + 0x4d, 0xea, 0x86, 0x3d, 0xf0, 0x03, 0xea, 0x6d, 0xbb, 0x5e, 0x20, 0xf5, 0xc9, 0x70, 0x52, 0x5f, + 0x89, 0x48, 0x18, 0xe7, 0x23, 0x4b, 0x00, 0x86, 0x6d, 0x51, 0x27, 0xe0, 0xb5, 0xc4, 0x77, 0x45, + 0xd4, 0xfb, 0x5d, 0x09, 0x29, 0x18, 0xe3, 0x62, 0xa2, 0x7a, 0xae, 0x63, 0x05, 0xae, 0x10, 0x55, + 0x4e, 0x8a, 0xda, 0x8a, 0x48, 0x18, 0xe7, 0xe3, 0xd5, 0x68, 0xe0, 0x59, 0x86, 0xcf, 0xab, 0x55, + 0x52, 0xd5, 0x22, 0x12, 0xc6, 0xf9, 0xd8, 0x9a, 0x17, 0x7b, 0xfe, 0x73, 0xad, 0x79, 0xbf, 0xd9, + 0x80, 0xeb, 0x89, 0x6e, 0x0d, 0xf4, 0x80, 0xee, 0x0f, 0xec, 0x0e, 0x0d, 0xd4, 0x0b, 0x1c, 0x73, + 0x2d, 0xfc, 0xf3, 0xd1, 0x7b, 0x17, 0x61, 0x4b, 0xc6, 0x64, 0xde, 0xfb, 0x50, 0x03, 0xcf, 0xf4, + 0xee, 0x17, 0xa1, 0xe1, 0xe8, 0x81, 0xcf, 0x3f, 0x5c, 0xf9, 0x8d, 0x86, 0x6a, 0xd8, 0x3d, 0x45, + 0xc0, 0x88, 0x87, 0x6c, 0xc3, 0x65, 0xd9, 0xc5, 0xb7, 0x1e, 0xf5, 0x5d, 0x2f, 0xa0, 0x9e, 0xa8, + 0x2b, 0x97, 0x53, 0x59, 0xf7, 0xf2, 0x56, 0x06, 0x0f, 0x66, 0xd6, 0x24, 0x5b, 0x70, 0xc9, 0x10, + 0xa1, 0x1c, 0xd4, 0x76, 0x75, 0x53, 0x01, 0x0a, 0x53, 0x66, 0xb8, 0x35, 0x5a, 0x19, 0x66, 0xc1, + 0xac, 0x7a, 0xe9, 0xd1, 0x5c, 0x1d, 0x6b, 0x34, 0xd7, 0xc6, 0x19, 0xcd, 0xf5, 0xf1, 0x46, 0x73, + 0xe3, 0x6c, 0xa3, 0x99, 0xf5, 0x3c, 0x1b, 0x47, 0xd4, 0x63, 0xea, 0x89, 0x58, 0x61, 0x63, 0x91, + 0x42, 0x61, 0xcf, 0x77, 0x32, 0x78, 0x30, 0xb3, 0x26, 0xd9, 0x83, 0x6b, 0xa2, 0xfc, 0x96, 0x63, + 0x78, 0xc7, 0x7d, 0xb6, 0xf0, 0xc4, 0x70, 0x9b, 0x09, 0x5b, 0xf2, 0xb5, 0xce, 0x48, 0x4e, 0x7c, + 0x02, 0x0a, 0xf9, 0x59, 0x98, 0x16, 0x6f, 0x69, 0x4b, 0xef, 0x73, 0x58, 0x11, 0x37, 0xf4, 0x92, + 0x84, 0x9d, 0x5e, 0x89, 0x13, 0x31, 0xc9, 0x4b, 0x96, 0x61, 0xb6, 0x7f, 0x64, 0xb0, 0x9f, 0x1b, + 0xfb, 0xf7, 0x28, 0x35, 0xa9, 0xc9, 0x1d, 0x95, 0x8d, 0xf6, 0xcb, 0xca, 0xba, 0xb3, 0x9d, 0x24, + 0x63, 0x9a, 0x9f, 0xbc, 0x09, 0x53, 0x7e, 0xa0, 0x7b, 0x81, 0x34, 0xe0, 0xce, 0xcf, 0x88, 0xb8, + 0x2a, 0x65, 0xdf, 0xec, 0xc4, 0x68, 0x98, 0xe0, 0xcc, 0x5c, 0x2f, 0x66, 0x2f, 0x6e, 0xbd, 0xc8, + 0x33, 0x5b, 0xfd, 0xb3, 0x22, 0xdc, 0x58, 0xa7, 0xc1, 0x96, 0xeb, 0x48, 0xf3, 0x77, 0xd6, 0xb2, + 0x7f, 0x26, 0xeb, 0x77, 0x72, 0xd1, 0x2e, 0x4e, 0x74, 0xd1, 0x2e, 0x4d, 0x68, 0xd1, 0x2e, 0x5f, + 0xe0, 0xa2, 0xfd, 0x0f, 0x8a, 0xf0, 0x72, 0xa2, 0x27, 0xb7, 0x5d, 0x53, 0x4d, 0xf8, 0x9f, 0x75, + 0xe0, 0x19, 0x3a, 0xf0, 0xb1, 0xd0, 0x3b, 0xb9, 0x03, 0x33, 0xa5, 0xf1, 0x7c, 0x94, 0xd6, 0x78, + 0xde, 0xcb, 0xb3, 0xf2, 0x65, 0x48, 0x38, 0xd3, 0x8a, 0x77, 0x07, 0x88, 0x27, 0xdd, 0xad, 0xc2, + 0xf4, 0x13, 0x53, 0x7a, 0xc2, 0xc0, 0x4d, 0x1c, 0xe2, 0xc0, 0x8c, 0x5a, 0xa4, 0x03, 0x2f, 0xf9, + 0xd4, 0x09, 0x2c, 0x87, 0xda, 0x49, 0x38, 0xa1, 0x0d, 0xbd, 0x2a, 0xe1, 0x5e, 0xea, 0x64, 0x31, + 0x61, 0x76, 0xdd, 0x3c, 0xf3, 0xc0, 0xbf, 0x02, 0xae, 0x72, 0x8a, 0xae, 0x99, 0x98, 0xc6, 0xf2, + 0x71, 0x5a, 0x63, 0x79, 0x3f, 0xff, 0x7b, 0x1b, 0x4f, 0x5b, 0x59, 0x02, 0xe0, 0x6f, 0x21, 0xae, + 0xae, 0x84, 0x8b, 0x34, 0x86, 0x14, 0x8c, 0x71, 0xb1, 0x05, 0x48, 0xf5, 0x73, 0x5c, 0x53, 0x09, + 0x17, 0xa0, 0x4e, 0x9c, 0x88, 0x49, 0xde, 0x91, 0xda, 0x4e, 0x65, 0x6c, 0x6d, 0xe7, 0x0e, 0x90, + 0x84, 0xe1, 0x51, 0xe0, 0x55, 0x93, 0x71, 0xc3, 0x1b, 0x43, 0x1c, 0x98, 0x51, 0x6b, 0xc4, 0x50, + 0xae, 0x4d, 0x76, 0x28, 0xd7, 0xc7, 0x1f, 0xca, 0xe4, 0x7d, 0xb8, 0xca, 0x45, 0xc9, 0xfe, 0x49, + 0x02, 0x0b, 0xbd, 0xe7, 0x47, 0x24, 0xf0, 0x55, 0x1c, 0xc5, 0x88, 0xa3, 0x31, 0xd8, 0xfb, 0x31, + 0x3c, 0x6a, 0x32, 0xe1, 0xba, 0x3d, 0x5a, 0x27, 0x5a, 0xc9, 0xe0, 0xc1, 0xcc, 0x9a, 0x6c, 0x88, + 0x05, 0x6c, 0x18, 0xea, 0x7b, 0x36, 0x35, 0x65, 0xdc, 0x74, 0x38, 0xc4, 0x76, 0x36, 0x3b, 0x92, + 0x82, 0x31, 0xae, 0x2c, 0x35, 0x65, 0xea, 0x9c, 0x6a, 0xca, 0x3a, 0xb7, 0xd2, 0xef, 0x27, 0xb4, + 0x21, 0xa9, 0xeb, 0x84, 0x91, 0xf0, 0x2b, 0x69, 0x06, 0x1c, 0xae, 0xc3, 0xb5, 0x44, 0xc3, 0xb3, + 0xfa, 0x81, 0x9f, 0xc4, 0x9a, 0x49, 0x69, 0x89, 0x19, 0x3c, 0x98, 0x59, 0x93, 0xe9, 0xe7, 0x07, + 0x54, 0xb7, 0x83, 0x83, 0x24, 0xe0, 0x6c, 0x52, 0x3f, 0xbf, 0x3d, 0xcc, 0x82, 0x59, 0xf5, 0x32, + 0x17, 0xa4, 0xb9, 0xe7, 0x53, 0xad, 0xfa, 0x95, 0x12, 0x5c, 0x5d, 0xa7, 0x41, 0x18, 0x52, 0xf6, + 0x99, 0x19, 0xe5, 0x13, 0x30, 0xa3, 0xfc, 0x46, 0x05, 0x2e, 0xad, 0xd3, 0x60, 0x48, 0x1b, 0xfb, + 0xff, 0xb4, 0xfb, 0xb7, 0xe0, 0x52, 0x14, 0xc5, 0xd8, 0x09, 0x5c, 0x4f, 0xac, 0xe5, 0xa9, 0xdd, + 0x72, 0x67, 0x98, 0x05, 0xb3, 0xea, 0x91, 0x6f, 0xc0, 0xcb, 0x7c, 0xa9, 0x77, 0xba, 0xc2, 0x3e, + 0x2b, 0x8c, 0x09, 0xb1, 0x73, 0x38, 0x2d, 0x09, 0xf9, 0x72, 0x27, 0x9b, 0x0d, 0x47, 0xd5, 0x27, + 0xdf, 0x86, 0xa9, 0xbe, 0xd5, 0xa7, 0xb6, 0xe5, 0x70, 0xfd, 0x2c, 0x77, 0xf0, 0xcf, 0x76, 0x0c, + 0x2c, 0xda, 0xc0, 0xc5, 0x4b, 0x31, 0x21, 0x30, 0x73, 0xa4, 0xd6, 0x2f, 0x70, 0xa4, 0xfe, 0x8f, + 0x22, 0xd4, 0xd6, 0x3d, 0x77, 0xd0, 0x6f, 0x1f, 0x93, 0x2e, 0x54, 0x1f, 0x72, 0xe7, 0x99, 0x74, + 0x4d, 0x8d, 0x7f, 0x12, 0x40, 0xf8, 0xe0, 0x22, 0x95, 0x48, 0xfc, 0x47, 0x09, 0xcf, 0x06, 0xf1, + 0x21, 0x3d, 0xa6, 0xa6, 0xf4, 0xa1, 0x85, 0x83, 0xf8, 0x2e, 0x2b, 0x44, 0x41, 0x23, 0x3d, 0x98, + 0xd5, 0x6d, 0xdb, 0x7d, 0x48, 0xcd, 0x4d, 0x3d, 0xe0, 0x7e, 0x6f, 0xe9, 0x5b, 0x39, 0xaf, 0x59, + 0x9a, 0x07, 0x33, 0x2c, 0x27, 0xa1, 0x30, 0x8d, 0x4d, 0x3e, 0x80, 0x9a, 0x1f, 0xb8, 0x9e, 0x52, + 0xb6, 0x9a, 0x4b, 0x2b, 0xe3, 0xbf, 0xf4, 0xf6, 0xd7, 0x3b, 0x02, 0x4a, 0xd8, 0xec, 0xe5, 0x1f, + 0x54, 0x02, 0xb4, 0x5f, 0x2f, 0x00, 0xdc, 0xde, 0xd9, 0xd9, 0x96, 0xee, 0x05, 0x13, 0xca, 0xfa, + 0x20, 0x74, 0x54, 0x8e, 0xef, 0x10, 0x4c, 0x04, 0xe0, 0x4a, 0x1f, 0xde, 0x20, 0x38, 0x40, 0x8e, + 0x4e, 0x7e, 0x1c, 0x6a, 0x52, 0x41, 0x96, 0xdd, 0x1e, 0xc6, 0x53, 0x48, 0x25, 0x1a, 0x15, 0x5d, + 0xfb, 0xdb, 0x45, 0x80, 0x0d, 0xd3, 0xa6, 0x1d, 0x75, 0x78, 0xa3, 0x11, 0x1c, 0x78, 0xd4, 0x3f, + 0x70, 0x6d, 0x73, 0x4c, 0x6f, 0x2a, 0xb7, 0xf9, 0xef, 0x28, 0x10, 0x8c, 0xf0, 0x88, 0x09, 0x53, + 0x7e, 0x40, 0xfb, 0x2a, 0x26, 0x77, 0x4c, 0x27, 0xca, 0x9c, 0xb0, 0x8b, 0x44, 0x38, 0x98, 0x40, + 0x25, 0x3a, 0x34, 0x2d, 0xc7, 0x10, 0x1f, 0x48, 0xfb, 0x78, 0xcc, 0x81, 0x34, 0xcb, 0x76, 0x1c, + 0x1b, 0x11, 0x0c, 0xc6, 0x31, 0xb5, 0xdf, 0x2d, 0xc2, 0x15, 0x2e, 0x8f, 0x35, 0x23, 0x11, 0x79, + 0x4b, 0xfe, 0xe4, 0xd0, 0x41, 0xd3, 0x3f, 0x7e, 0x36, 0xd1, 0xe2, 0x9c, 0xe2, 0x16, 0x0d, 0xf4, + 0x48, 0x9f, 0x8b, 0xca, 0x62, 0xa7, 0x4b, 0x07, 0x50, 0xf6, 0xd9, 0x7c, 0x25, 0x7a, 0xaf, 0x33, + 0xf6, 0x10, 0xca, 0x7e, 0x00, 0x3e, 0x7b, 0x85, 0x5e, 0x63, 0x3e, 0x6b, 0x71, 0x71, 0xe4, 0x4f, + 0x43, 0xd5, 0x0f, 0xf4, 0x60, 0xa0, 0x3e, 0xcd, 0xdd, 0x49, 0x0b, 0xe6, 0xe0, 0xd1, 0x3c, 0x22, + 0xfe, 0xa3, 0x14, 0xaa, 0xfd, 0x6e, 0x01, 0xae, 0x65, 0x57, 0xdc, 0xb4, 0xfc, 0x80, 0xfc, 0x89, + 0xa1, 0x6e, 0x3f, 0xe3, 0x1b, 0x67, 0xb5, 0x79, 0xa7, 0x87, 0x67, 0x11, 0x54, 0x49, 0xac, 0xcb, + 0x03, 0xa8, 0x58, 0x01, 0xed, 0xa9, 0xfd, 0xe5, 0xfd, 0x09, 0x3f, 0x7a, 0x6c, 0x69, 0x67, 0x52, + 0x50, 0x08, 0xd3, 0xbe, 0x53, 0x1c, 0xf5, 0xc8, 0x7c, 0xf9, 0xb0, 0x93, 0xd1, 0xdd, 0x77, 0xf3, + 0x45, 0x77, 0x27, 0x1b, 0x34, 0x1c, 0xe4, 0xfd, 0xa7, 0x86, 0x83, 0xbc, 0xef, 0xe7, 0x0f, 0xf2, + 0x4e, 0x75, 0xc3, 0xc8, 0x58, 0xef, 0x1f, 0x94, 0xe0, 0x95, 0x27, 0x0d, 0x1b, 0xb6, 0x9e, 0xc9, + 0xd1, 0x99, 0x77, 0x3d, 0x7b, 0xf2, 0x38, 0x24, 0x4b, 0x50, 0xe9, 0x1f, 0xe8, 0xbe, 0x52, 0xca, + 0xd4, 0x86, 0xa5, 0xb2, 0xcd, 0x0a, 0x1f, 0xb3, 0x49, 0x83, 0x2b, 0x73, 0xfc, 0x2f, 0x0a, 0x56, + 0x36, 0x1d, 0xf7, 0xa8, 0xef, 0x47, 0x36, 0x81, 0x70, 0x3a, 0xde, 0x12, 0xc5, 0xa8, 0xe8, 0x24, + 0x80, 0xaa, 0x30, 0x31, 0xcb, 0x95, 0x69, 0xfc, 0x40, 0xae, 0x8c, 0x03, 0x01, 0xd1, 0x43, 0x49, + 0x6f, 0x85, 0x94, 0x45, 0x16, 0xa0, 0x1c, 0x44, 0xe1, 0xd9, 0x6a, 0x6b, 0x5e, 0xce, 0xd0, 0x4f, + 0x39, 0x1f, 0xdb, 0xd8, 0xbb, 0x7b, 0xdc, 0xa8, 0x6e, 0x4a, 0xff, 0xb9, 0xe5, 0x3a, 0x5c, 0x21, + 0x2b, 0x45, 0x1b, 0xfb, 0xfb, 0x43, 0x1c, 0x98, 0x51, 0x4b, 0xfb, 0xb7, 0x75, 0xb8, 0x92, 0x3d, + 0x1e, 0x58, 0xbf, 0x1d, 0x51, 0xcf, 0x67, 0xd8, 0x85, 0x64, 0xbf, 0x3d, 0x10, 0xc5, 0xa8, 0xe8, + 0x9f, 0xea, 0x80, 0xb3, 0xdf, 0x28, 0xc0, 0x55, 0x4f, 0xfa, 0x88, 0x9e, 0x45, 0xd0, 0xd9, 0xab, + 0xc2, 0x9c, 0x31, 0x42, 0x20, 0x8e, 0x6e, 0x0b, 0xf9, 0x9b, 0x05, 0x98, 0xef, 0xa5, 0xec, 0x1c, + 0x17, 0x78, 0x56, 0x92, 0x9f, 0x7f, 0xd8, 0x1a, 0x21, 0x0f, 0x47, 0xb6, 0x84, 0x7c, 0x1b, 0x9a, + 0x7d, 0x36, 0x2e, 0xfc, 0x80, 0x3a, 0x86, 0x0a, 0x10, 0x1d, 0xff, 0x4b, 0xda, 0x8e, 0xb0, 0xc2, + 0xb3, 0x52, 0x5c, 0x3f, 0x88, 0x11, 0x30, 0x2e, 0xf1, 0x39, 0x3f, 0x1c, 0x79, 0x13, 0xea, 0x3e, + 0x0d, 0x02, 0xcb, 0xe9, 0x8a, 0xfd, 0x46, 0x43, 0x7c, 0x2b, 0x1d, 0x59, 0x86, 0x21, 0x95, 0xfc, + 0x04, 0x34, 0xb8, 0xcb, 0x69, 0xd9, 0xeb, 0xfa, 0xf3, 0x0d, 0x1e, 0x2e, 0x36, 0x2d, 0x02, 0xe0, + 0x64, 0x21, 0x46, 0x74, 0xf2, 0x25, 0x98, 0xda, 0xe3, 0x9f, 0xaf, 0x3c, 0x2f, 0x2f, 0x6c, 0x5c, + 0x5c, 0x5b, 0x6b, 0xc7, 0xca, 0x31, 0xc1, 0x45, 0x96, 0x00, 0x68, 0xe8, 0x97, 0x4b, 0xdb, 0xb3, + 0x22, 0x8f, 0x1d, 0xc6, 0xb8, 0xc8, 0xab, 0x50, 0x0a, 0x6c, 0x9f, 0xdb, 0xb0, 0xea, 0xd1, 0x16, + 0x74, 0x67, 0xb3, 0x83, 0xac, 0x5c, 0xfb, 0xa3, 0x02, 0xcc, 0xa6, 0x8e, 0x11, 0xb1, 0x2a, 0x03, + 0xcf, 0x96, 0xd3, 0x48, 0x58, 0x65, 0x17, 0x37, 0x91, 0x95, 0x93, 0xf7, 0xa5, 0x5a, 0x5e, 0xcc, + 0x99, 0x1a, 0xe4, 0x9e, 0x1e, 0xf8, 0x4c, 0x0f, 0x1f, 0xd2, 0xc8, 0xb9, 0x9b, 0x2f, 0x6a, 0x8f, + 0x5c, 0x07, 0x62, 0x6e, 0xbe, 0x88, 0x86, 0x09, 0xce, 0x94, 0xc1, 0xaf, 0x7c, 0x16, 0x83, 0x9f, + 0xf6, 0xab, 0xc5, 0x58, 0x0f, 0x48, 0xcd, 0xfe, 0x29, 0x3d, 0xf0, 0x45, 0xb6, 0x80, 0x86, 0x8b, + 0x7b, 0x23, 0xbe, 0xfe, 0xf1, 0xc5, 0x58, 0x52, 0xc9, 0x3b, 0xa2, 0xef, 0x4b, 0x39, 0x0f, 0x60, + 0xef, 0x6c, 0x76, 0x44, 0x74, 0x95, 0x7a, 0x6b, 0xe1, 0x2b, 0x28, 0x5f, 0xd0, 0x2b, 0xd0, 0xfe, + 0x45, 0x09, 0x9a, 0x77, 0xdc, 0xbd, 0x4f, 0x49, 0x04, 0x75, 0xf6, 0x32, 0x55, 0xfc, 0x04, 0x97, + 0xa9, 0x5d, 0x78, 0x39, 0x08, 0xec, 0x0e, 0x35, 0x5c, 0xc7, 0xf4, 0x97, 0xf7, 0x03, 0xea, 0xad, + 0x59, 0x8e, 0xe5, 0x1f, 0x50, 0x53, 0xba, 0x93, 0x3e, 0x77, 0x7a, 0xd2, 0x7a, 0x79, 0x67, 0x67, + 0x33, 0x8b, 0x05, 0x47, 0xd5, 0xe5, 0xd3, 0x86, 0x38, 0xf3, 0xc9, 0xcf, 0x44, 0xc9, 0x98, 0x1b, + 0x31, 0x6d, 0xc4, 0xca, 0x31, 0xc1, 0xa5, 0x7d, 0xb7, 0x08, 0x8d, 0x30, 0xe9, 0x03, 0xf9, 0x02, + 0xd4, 0xf6, 0x3c, 0xf7, 0x90, 0x7a, 0xc2, 0x73, 0x27, 0xcf, 0x44, 0xb5, 0x45, 0x11, 0x2a, 0x1a, + 0xf9, 0x3c, 0x54, 0x02, 0xb7, 0x6f, 0x19, 0x69, 0x83, 0xda, 0x0e, 0x2b, 0x44, 0x41, 0xbb, 0xb8, + 0x01, 0xfe, 0xc5, 0x84, 0x6a, 0xd7, 0x18, 0xa9, 0x8c, 0xbd, 0x07, 0x65, 0x5f, 0xf7, 0x6d, 0xb9, + 0x9e, 0xe6, 0xc8, 0x9f, 0xb0, 0xdc, 0xd9, 0x94, 0xf9, 0x13, 0x96, 0x3b, 0x9b, 0xc8, 0x41, 0xb5, + 0x3f, 0x28, 0x42, 0x53, 0xf4, 0x9b, 0x98, 0x15, 0x26, 0xd9, 0x73, 0x6f, 0xf1, 0x50, 0x0a, 0x7f, + 0xd0, 0xa3, 0x1e, 0x37, 0x33, 0xc9, 0x49, 0x2e, 0xee, 0x1f, 0x88, 0x88, 0x61, 0x38, 0x45, 0x54, + 0xa4, 0xba, 0xbe, 0x7c, 0x81, 0x5d, 0x5f, 0x39, 0x53, 0xd7, 0x57, 0x2f, 0xa2, 0xeb, 0x3f, 0x2e, + 0x42, 0x63, 0xd3, 0xda, 0xa7, 0xc6, 0xb1, 0x61, 0xf3, 0xd3, 0x9f, 0x26, 0xb5, 0x69, 0x40, 0xd7, + 0x3d, 0xdd, 0xa0, 0xdb, 0xd4, 0xb3, 0x78, 0x52, 0x24, 0xf6, 0x7d, 0xf0, 0x19, 0x48, 0x9e, 0xfe, + 0x5c, 0x1d, 0xc1, 0x83, 0x23, 0x6b, 0x93, 0x0d, 0x98, 0x32, 0xa9, 0x6f, 0x79, 0xd4, 0xdc, 0x8e, + 0x6d, 0x54, 0xbe, 0xa0, 0x96, 0x9a, 0xd5, 0x18, 0xed, 0xf1, 0x49, 0x6b, 0x5a, 0x19, 0x28, 0xc5, + 0x8e, 0x25, 0x51, 0x95, 0x7d, 0xf2, 0x7d, 0x7d, 0xe0, 0x67, 0xb5, 0x31, 0xf6, 0xc9, 0x6f, 0x67, + 0xb3, 0xe0, 0xa8, 0xba, 0x5a, 0x05, 0x4a, 0x9b, 0x6e, 0x57, 0xfb, 0x4e, 0x09, 0xc2, 0xec, 0x59, + 0xe4, 0xcf, 0x15, 0xa0, 0xa9, 0x3b, 0x8e, 0x1b, 0xc8, 0xcc, 0x54, 0xc2, 0x03, 0x8f, 0xb9, 0x93, + 0x74, 0x2d, 0x2c, 0x47, 0xa0, 0xc2, 0x79, 0x1b, 0x3a, 0x94, 0x63, 0x14, 0x8c, 0xcb, 0x26, 0x83, + 0x94, 0x3f, 0x79, 0x2b, 0x7f, 0x2b, 0xce, 0xe0, 0x3d, 0xbe, 0xf6, 0x35, 0x98, 0x4b, 0x37, 0xf6, + 0x3c, 0xee, 0xa0, 0x5c, 0x8e, 0xf9, 0x22, 0x40, 0x14, 0x53, 0xf2, 0x0c, 0x8c, 0x58, 0x56, 0xc2, + 0x88, 0x35, 0x7e, 0x0a, 0x83, 0xa8, 0xd1, 0x23, 0x0d, 0x57, 0xdf, 0x4a, 0x19, 0xae, 0x36, 0x26, + 0x21, 0xec, 0xc9, 0xc6, 0xaa, 0xbf, 0x55, 0x80, 0xb9, 0x88, 0x59, 0x9e, 0x85, 0xfe, 0x32, 0x4c, + 0x7b, 0x54, 0x37, 0xdb, 0x7a, 0x60, 0x1c, 0xf0, 0x50, 0xef, 0x02, 0x8f, 0xcd, 0xe6, 0xa7, 0xbf, + 0x30, 0x4e, 0xc0, 0x24, 0x1f, 0xd1, 0xa1, 0xc9, 0x0a, 0x76, 0xac, 0x1e, 0x75, 0x07, 0xc1, 0x98, + 0x56, 0x53, 0xbe, 0x61, 0xc1, 0x08, 0x06, 0xe3, 0x98, 0xda, 0x0f, 0x0a, 0x30, 0x13, 0x6f, 0xf0, + 0x85, 0x5b, 0xd4, 0x0e, 0x92, 0x16, 0xb5, 0x95, 0x09, 0xbc, 0x93, 0x11, 0x56, 0xb4, 0x8f, 0x20, + 0xfe, 0x68, 0xdc, 0x72, 0x16, 0x37, 0x16, 0x14, 0x9e, 0x68, 0x2c, 0xf8, 0xf4, 0x27, 0x4c, 0x1a, + 0xa5, 0xe5, 0x96, 0x9f, 0x63, 0x2d, 0xf7, 0x93, 0xcc, 0xba, 0x14, 0xcb, 0x1c, 0x54, 0xcd, 0x91, + 0x39, 0xa8, 0x17, 0x66, 0x0e, 0xaa, 0x4d, 0x6c, 0xd2, 0x39, 0x4b, 0xf6, 0xa0, 0xfa, 0x33, 0xcd, + 0x1e, 0xd4, 0xb8, 0xa8, 0xec, 0x41, 0x90, 0x37, 0x7b, 0xd0, 0x47, 0x05, 0x98, 0x31, 0x13, 0x27, + 0x66, 0xe5, 0x19, 0xf3, 0xf1, 0x97, 0x9a, 0xe4, 0x01, 0x5c, 0x71, 0x64, 0x2a, 0x59, 0x86, 0x29, + 0x91, 0x59, 0x39, 0x7b, 0xa6, 0x3e, 0x99, 0x9c, 0x3d, 0xbf, 0x5f, 0x8b, 0xaf, 0x48, 0xcf, 0xda, + 0x68, 0xfe, 0x46, 0xd2, 0x68, 0x7e, 0x23, 0x6d, 0x34, 0x9f, 0x8d, 0xc5, 0xb3, 0xc6, 0x0d, 0xe7, + 0x3f, 0x19, 0x9b, 0xa8, 0x4b, 0x3c, 0x5b, 0x4f, 0xf8, 0xce, 0x33, 0x26, 0xeb, 0x65, 0x98, 0x95, + 0xda, 0xab, 0x22, 0xf2, 0x59, 0x6e, 0x3a, 0x0a, 0x73, 0x5a, 0x4d, 0x92, 0x31, 0xcd, 0xcf, 0x04, + 0xfa, 0x2a, 0x69, 0xab, 0xd8, 0x2a, 0x44, 0x83, 0x4c, 0x25, 0x54, 0x0d, 0x39, 0xd8, 0xb6, 0xc2, + 0xa3, 0xba, 0x2f, 0x4d, 0xdf, 0xb1, 0x6d, 0x05, 0xf2, 0x52, 0x94, 0xd4, 0xb8, 0xfd, 0xbf, 0xf6, + 0x14, 0xfb, 0xbf, 0x0e, 0x4d, 0x5b, 0xf7, 0x03, 0xf1, 0x36, 0x4d, 0xf9, 0x39, 0xff, 0xb1, 0xb3, + 0x2d, 0xbc, 0x6c, 0x31, 0x8f, 0xb4, 0xdb, 0xcd, 0x08, 0x06, 0xe3, 0x98, 0xc4, 0x84, 0x29, 0xf6, + 0x97, 0x7f, 0xda, 0xe6, 0x72, 0x20, 0x53, 0x9b, 0x9d, 0x47, 0x46, 0x68, 0xb6, 0xda, 0x8c, 0xe1, + 0x60, 0x02, 0x75, 0x84, 0x8b, 0x00, 0xc6, 0x71, 0x11, 0x90, 0x9f, 0x15, 0x9a, 0xd3, 0x71, 0xf8, + 0x5a, 0x9b, 0xfc, 0xb5, 0x86, 0x21, 0x92, 0x18, 0x27, 0x62, 0x92, 0x97, 0x8d, 0x8a, 0x81, 0xec, + 0x06, 0x55, 0x7d, 0x2a, 0x39, 0x2a, 0x76, 0x93, 0x64, 0x4c, 0xf3, 0x93, 0x6d, 0xb8, 0x1c, 0x16, + 0xc5, 0x9b, 0x31, 0xcd, 0x71, 0xc2, 0x98, 0xb5, 0xdd, 0x0c, 0x1e, 0xcc, 0xac, 0xc9, 0x0f, 0x81, + 0x0c, 0x3c, 0x8f, 0x3a, 0xc1, 0x6d, 0xdd, 0x3f, 0x90, 0xc1, 0x6f, 0xd1, 0x21, 0x90, 0x88, 0x84, + 0x71, 0x3e, 0xb2, 0x04, 0x20, 0xe0, 0x78, 0xad, 0xd9, 0x64, 0x7c, 0xe9, 0x6e, 0x48, 0xc1, 0x18, + 0x97, 0xf6, 0x51, 0x03, 0x9a, 0xf7, 0xf4, 0xc0, 0x3a, 0xa2, 0xdc, 0x9f, 0x77, 0x31, 0x4e, 0x95, + 0xbf, 0x5a, 0x80, 0x2b, 0xc9, 0xa0, 0xcd, 0x0b, 0xf4, 0xac, 0xf0, 0x64, 0x3f, 0x98, 0x29, 0x0d, + 0x47, 0xb4, 0x82, 0xfb, 0x58, 0x86, 0x62, 0x40, 0x2f, 0xda, 0xc7, 0xd2, 0x19, 0x25, 0x10, 0x47, + 0xb7, 0xe5, 0xd3, 0xe2, 0x63, 0x79, 0xbe, 0xb3, 0x53, 0xa6, 0x3c, 0x40, 0xb5, 0xe7, 0xc6, 0x03, + 0x54, 0x7f, 0x2e, 0xd4, 0xee, 0x7e, 0xcc, 0x03, 0xd4, 0xc8, 0x19, 0x89, 0x24, 0xcf, 0x39, 0x08, + 0xb4, 0x51, 0x9e, 0x24, 0x9e, 0xa2, 0x40, 0x59, 0xe6, 0x99, 0xb6, 0xba, 0xa7, 0xfb, 0x96, 0x21, + 0xd5, 0x8e, 0x1c, 0xd9, 0x78, 0x55, 0x96, 0x3e, 0x11, 0xb0, 0xc0, 0xff, 0xa2, 0xc0, 0x8e, 0x92, + 0x12, 0x16, 0x73, 0x25, 0x25, 0x24, 0x2b, 0x50, 0x76, 0x0e, 0xe9, 0xf1, 0xf9, 0x0e, 0xfb, 0xf3, + 0x5d, 0xd8, 0xbd, 0xbb, 0xf4, 0x18, 0x79, 0x65, 0xed, 0xbb, 0x45, 0x00, 0xf6, 0xf8, 0x67, 0xf3, + 0xc5, 0xfc, 0x38, 0xd4, 0xfc, 0x01, 0xb7, 0x9a, 0x48, 0x85, 0x29, 0x0a, 0xdf, 0x12, 0xc5, 0xa8, + 0xe8, 0xe4, 0xf3, 0x50, 0xf9, 0xd6, 0x80, 0x0e, 0x54, 0x60, 0x41, 0xa8, 0xb8, 0x7f, 0x9d, 0x15, + 0xa2, 0xa0, 0x5d, 0x9c, 0x5d, 0x55, 0xf9, 0x6c, 0x2a, 0x17, 0xe5, 0xb3, 0x69, 0x40, 0xed, 0x9e, + 0xcb, 0xa3, 0x41, 0xb5, 0xff, 0x56, 0x04, 0x88, 0xa2, 0xed, 0xc8, 0xaf, 0x17, 0xe0, 0xa5, 0xf0, + 0x83, 0x0b, 0xc4, 0xfe, 0x8b, 0x27, 0xc0, 0xce, 0xed, 0xbf, 0xc9, 0xfa, 0xd8, 0xf9, 0x0c, 0xb4, + 0x9d, 0x25, 0x0e, 0xb3, 0x5b, 0x41, 0x10, 0xea, 0xb4, 0xd7, 0x0f, 0x8e, 0x57, 0x2d, 0x4f, 0x8e, + 0xc0, 0xcc, 0xa0, 0xce, 0x5b, 0x92, 0x47, 0x54, 0x95, 0x46, 0x02, 0xfe, 0x11, 0x29, 0x0a, 0x86, + 0x38, 0xe4, 0x00, 0xea, 0x8e, 0xfb, 0xbe, 0xcf, 0xba, 0x43, 0x0e, 0xc7, 0xb7, 0xc7, 0xef, 0x72, + 0xd1, 0xad, 0xc2, 0xde, 0x2f, 0xff, 0x60, 0xcd, 0x91, 0x9d, 0xfd, 0x6b, 0x45, 0xb8, 0x94, 0xd1, + 0x0f, 0xe4, 0x6d, 0x98, 0x93, 0x81, 0x8d, 0x51, 0x26, 0xf8, 0x42, 0x94, 0x09, 0xbe, 0x93, 0xa2, + 0xe1, 0x10, 0x37, 0x79, 0x1f, 0x40, 0x37, 0x0c, 0xea, 0xfb, 0x5b, 0xae, 0xa9, 0xf6, 0x03, 0x6f, + 0x31, 0xf5, 0x65, 0x39, 0x2c, 0x7d, 0x7c, 0xd2, 0xfa, 0xa9, 0xac, 0x58, 0xe5, 0x54, 0x3f, 0x47, + 0x15, 0x30, 0x06, 0x49, 0xbe, 0x09, 0x20, 0x36, 0xe1, 0x61, 0x3a, 0x85, 0xa7, 0x58, 0xae, 0x16, + 0x54, 0xb6, 0xae, 0x85, 0xaf, 0x0f, 0x74, 0x27, 0xb0, 0x82, 0x63, 0x91, 0xbd, 0xe6, 0x41, 0x88, + 0x82, 0x31, 0x44, 0xed, 0x9f, 0x16, 0xa1, 0xae, 0x6c, 0xe6, 0xcf, 0xc0, 0x50, 0xda, 0x4d, 0x18, + 0x4a, 0x27, 0x14, 0x9d, 0x9c, 0x65, 0x26, 0x75, 0x53, 0x66, 0xd2, 0xf5, 0xfc, 0xa2, 0x9e, 0x6c, + 0x24, 0xfd, 0xad, 0x22, 0xcc, 0x28, 0xd6, 0xbc, 0x26, 0xd2, 0xaf, 0xc2, 0xac, 0x88, 0x2a, 0xd8, + 0xd2, 0x1f, 0x89, 0x44, 0x3e, 0xbc, 0xc3, 0xca, 0x22, 0x20, 0xb8, 0x9d, 0x24, 0x61, 0x9a, 0x97, + 0x0d, 0x6b, 0x51, 0xb4, 0xcb, 0x36, 0x61, 0xc2, 0x0f, 0x29, 0xf6, 0x9b, 0x7c, 0x58, 0xb7, 0x53, + 0x34, 0x1c, 0xe2, 0x4e, 0xdb, 0x68, 0xcb, 0x17, 0x60, 0xa3, 0xfd, 0xf7, 0x05, 0x98, 0x8a, 0xfa, + 0xeb, 0xc2, 0x2d, 0xb4, 0xfb, 0x49, 0x0b, 0xed, 0x72, 0xee, 0xe1, 0x30, 0xc2, 0x3e, 0xfb, 0x17, + 0x6b, 0x90, 0x08, 0x92, 0x27, 0x7b, 0x70, 0xcd, 0xca, 0x0c, 0xf5, 0x8b, 0xcd, 0x36, 0xe1, 0xa9, + 0xef, 0x8d, 0x91, 0x9c, 0xf8, 0x04, 0x14, 0x32, 0x80, 0xfa, 0x11, 0xf5, 0x02, 0xcb, 0xa0, 0xea, + 0xf9, 0xd6, 0x73, 0xab, 0x64, 0xd2, 0x0a, 0x1d, 0xf6, 0xe9, 0x03, 0x29, 0x00, 0x43, 0x51, 0x64, + 0x0f, 0x2a, 0xd4, 0xec, 0x52, 0x95, 0x5a, 0x29, 0x67, 0x8a, 0xda, 0xb0, 0x3f, 0xd9, 0x3f, 0x1f, + 0x05, 0x34, 0xf1, 0xa1, 0x61, 0x2b, 0x2f, 0xa3, 0x1c, 0x87, 0xe3, 0x2b, 0x58, 0xa1, 0xbf, 0x32, + 0xca, 0xba, 0x10, 0x16, 0x61, 0x24, 0x87, 0x1c, 0x86, 0xe6, 0xce, 0xca, 0x84, 0x26, 0x8f, 0x27, + 0x18, 0x3b, 0x7d, 0x68, 0x3c, 0xd4, 0x03, 0xea, 0xf5, 0x74, 0xef, 0x50, 0xee, 0x36, 0xc6, 0x7f, + 0xc2, 0x77, 0x14, 0x52, 0xf4, 0x84, 0x61, 0x11, 0x46, 0x72, 0x88, 0x0b, 0x8d, 0x40, 0xaa, 0xcf, + 0xca, 0xa6, 0x3b, 0xbe, 0x50, 0xa5, 0x88, 0xfb, 0x32, 0x58, 0x5e, 0xfd, 0xc5, 0x48, 0x06, 0x39, + 0x4a, 0xe4, 0x33, 0x17, 0x59, 0xec, 0xdb, 0x39, 0x7c, 0x03, 0x12, 0x2a, 0x5a, 0x6e, 0xb2, 0xf3, + 0xa2, 0x6b, 0xff, 0xb3, 0x12, 0x4d, 0xcb, 0xcf, 0xda, 0x4e, 0xf8, 0xa5, 0xa4, 0x9d, 0xf0, 0x7a, + 0xda, 0x4e, 0x98, 0x72, 0x56, 0x9f, 0x3f, 0xbc, 0x36, 0x65, 0x5e, 0x2b, 0x5f, 0x80, 0x79, 0xed, + 0x35, 0x68, 0x1e, 0xf1, 0x99, 0x40, 0xe4, 0x69, 0xaa, 0xf0, 0x65, 0x84, 0xcf, 0xec, 0x0f, 0xa2, + 0x62, 0x8c, 0xf3, 0xb0, 0x2a, 0xf2, 0x06, 0x97, 0x30, 0xa5, 0xb1, 0xac, 0xd2, 0x89, 0x8a, 0x31, + 0xce, 0xc3, 0x23, 0xf3, 0x2c, 0xe7, 0x50, 0x54, 0xa8, 0xf1, 0x0a, 0x22, 0x32, 0x4f, 0x15, 0x62, + 0x44, 0x27, 0x37, 0xa1, 0x3e, 0x30, 0xf7, 0x05, 0x6f, 0x9d, 0xf3, 0x72, 0x0d, 0x73, 0x77, 0x75, + 0x4d, 0xe6, 0x8d, 0x52, 0x54, 0xd6, 0x92, 0x9e, 0xde, 0x57, 0x04, 0xbe, 0x37, 0x94, 0x2d, 0xd9, + 0x8a, 0x8a, 0x31, 0xce, 0x43, 0x7e, 0x06, 0x66, 0x3c, 0x6a, 0x0e, 0x0c, 0x1a, 0xd6, 0x02, 0x5e, + 0x4b, 0x26, 0xd4, 0x8c, 0x53, 0x30, 0xc5, 0x39, 0xc2, 0x48, 0xd8, 0x1c, 0xcb, 0x48, 0xf8, 0x35, + 0x98, 0x31, 0x3d, 0xdd, 0x72, 0xa8, 0x79, 0xdf, 0xe1, 0x11, 0x09, 0x32, 0x3e, 0x30, 0xb4, 0x90, + 0xaf, 0x26, 0xa8, 0x98, 0xe2, 0xd6, 0xfe, 0x65, 0x11, 0x2a, 0x22, 0xcd, 0xe7, 0x06, 0x5c, 0xb2, + 0x1c, 0x2b, 0xb0, 0x74, 0x7b, 0x95, 0xda, 0xfa, 0x71, 0x32, 0x2a, 0xe3, 0x65, 0xb6, 0xd1, 0xde, + 0x18, 0x26, 0x63, 0x56, 0x1d, 0xd6, 0x39, 0x81, 0x58, 0xbe, 0x15, 0x8a, 0xb0, 0xa3, 0x89, 0xdc, + 0xd0, 0x09, 0x0a, 0xa6, 0x38, 0x99, 0x32, 0xd4, 0xcf, 0x08, 0xb9, 0xe0, 0xca, 0x50, 0x32, 0xd0, + 0x22, 0xc9, 0xc7, 0x95, 0xf4, 0x01, 0x57, 0x88, 0xc3, 0x53, 0x38, 0x32, 0xaa, 0x4a, 0x28, 0xe9, + 0x29, 0x1a, 0x0e, 0x71, 0x33, 0x84, 0x7d, 0xdd, 0xb2, 0x07, 0x1e, 0x8d, 0x10, 0x2a, 0x11, 0xc2, + 0x5a, 0x8a, 0x86, 0x43, 0xdc, 0xda, 0x7f, 0x2f, 0x00, 0x19, 0x3e, 0x57, 0x40, 0x0e, 0xa0, 0xea, + 0x70, 0x5b, 0x64, 0xee, 0x94, 0xf4, 0x31, 0x93, 0xa6, 0x58, 0x24, 0x64, 0x81, 0xc4, 0x27, 0x0e, + 0xd4, 0xe9, 0xa3, 0x80, 0x7a, 0x4e, 0x78, 0xce, 0x68, 0x32, 0xe9, 0xef, 0xc5, 0xde, 0x4c, 0x22, + 0x63, 0x28, 0x43, 0xfb, 0xbd, 0x22, 0x34, 0x63, 0x7c, 0x4f, 0xdb, 0xe2, 0xf3, 0x54, 0x07, 0xc2, + 0x04, 0xb8, 0xeb, 0xd9, 0x72, 0xbe, 0x8b, 0xa5, 0x3a, 0x90, 0x24, 0xdc, 0xc4, 0x38, 0x1f, 0x59, + 0x02, 0xe8, 0xe9, 0x7e, 0x40, 0x3d, 0xae, 0x0b, 0xa5, 0x12, 0x0c, 0x6c, 0x85, 0x14, 0x8c, 0x71, + 0x91, 0x1b, 0xf2, 0x02, 0x83, 0x72, 0x32, 0x21, 0xe4, 0x88, 0xdb, 0x09, 0x2a, 0x13, 0xb8, 0x9d, + 0x80, 0x74, 0x61, 0x4e, 0xb5, 0x5a, 0x51, 0xcf, 0x97, 0x2e, 0x50, 0x0c, 0xd4, 0x14, 0x04, 0x0e, + 0x81, 0x6a, 0xdf, 0x2d, 0xc0, 0x74, 0xc2, 0x00, 0x25, 0x52, 0x39, 0xaa, 0x53, 0x31, 0x89, 0x54, + 0x8e, 0xb1, 0xc3, 0x2c, 0x5f, 0x84, 0xaa, 0xe8, 0xa0, 0x74, 0xb0, 0xab, 0xe8, 0x42, 0x94, 0x54, + 0xb6, 0xb2, 0x48, 0x13, 0x77, 0x7a, 0x65, 0x91, 0x36, 0x70, 0x54, 0x74, 0xe1, 0x39, 0x12, 0xad, + 0x93, 0x3d, 0x1d, 0xf3, 0x1c, 0x89, 0x72, 0x0c, 0x39, 0xb4, 0x7f, 0xc8, 0xdb, 0x1d, 0x78, 0xc7, + 0xe1, 0xce, 0xba, 0x0b, 0x35, 0x19, 0xe0, 0x28, 0x3f, 0x8d, 0xb7, 0x73, 0x58, 0xc5, 0x38, 0x8e, + 0x0c, 0xe5, 0xd3, 0x8d, 0xc3, 0xfb, 0xfb, 0xfb, 0xa8, 0xd0, 0xc9, 0x2d, 0x68, 0xb8, 0x8e, 0xfc, + 0x82, 0xe5, 0xe3, 0xff, 0x18, 0x5b, 0x39, 0xee, 0xab, 0xc2, 0xc7, 0x27, 0xad, 0x2b, 0xe1, 0x9f, + 0x44, 0x23, 0x31, 0xaa, 0xa9, 0xfd, 0xd9, 0x02, 0xbc, 0x84, 0xae, 0x6d, 0x5b, 0x4e, 0x37, 0xe9, + 0x7a, 0x24, 0x36, 0xcc, 0xf4, 0xf4, 0x47, 0xbb, 0x8e, 0x7e, 0xa4, 0x5b, 0xb6, 0xbe, 0x67, 0xd3, + 0xa7, 0xee, 0x8c, 0x07, 0x81, 0x65, 0x2f, 0x88, 0x0b, 0x1d, 0x17, 0x36, 0x9c, 0xe0, 0xbe, 0xd7, + 0x09, 0x3c, 0xcb, 0xe9, 0x8a, 0x59, 0x72, 0x2b, 0x81, 0x85, 0x29, 0x6c, 0xed, 0xf7, 0x4b, 0xc0, + 0x83, 0xec, 0xc8, 0x97, 0xa1, 0xd1, 0xa3, 0xc6, 0x81, 0xee, 0x58, 0xbe, 0x4a, 0x8a, 0x7b, 0x95, + 0x3d, 0xd7, 0x96, 0x2a, 0x7c, 0xcc, 0x5e, 0xc5, 0x72, 0x67, 0x93, 0x9f, 0x63, 0x89, 0x78, 0x89, + 0x01, 0xd5, 0xae, 0xef, 0xeb, 0x7d, 0x2b, 0x77, 0x8c, 0x87, 0x48, 0x42, 0x2a, 0xa6, 0x23, 0xf1, + 0x1b, 0x25, 0x34, 0x31, 0xa0, 0xd2, 0xb7, 0x75, 0xcb, 0xc9, 0x7d, 0x01, 0x19, 0x7b, 0x82, 0x6d, + 0x86, 0x24, 0x4c, 0x95, 0xfc, 0x27, 0x0a, 0x6c, 0x32, 0x80, 0xa6, 0x6f, 0x78, 0x7a, 0xcf, 0x3f, + 0xd0, 0x97, 0x5e, 0x7f, 0x23, 0xb7, 0xf2, 0x1f, 0x89, 0x12, 0xba, 0xc8, 0x0a, 0x2e, 0x6f, 0x75, + 0x6e, 0x2f, 0x2f, 0xbd, 0xfe, 0x06, 0xc6, 0xe5, 0xc4, 0xc5, 0xbe, 0xfe, 0xda, 0x92, 0x9c, 0x41, + 0x26, 0x2e, 0xf6, 0xf5, 0xd7, 0x96, 0x30, 0x2e, 0x47, 0xfb, 0x5f, 0x05, 0x68, 0x84, 0xbc, 0x64, + 0x17, 0x80, 0xcd, 0x65, 0x32, 0x6d, 0xe8, 0xb9, 0x2e, 0x6b, 0xe1, 0xd6, 0x9e, 0xdd, 0xb0, 0x32, + 0xc6, 0x80, 0x32, 0xf2, 0xaa, 0x16, 0x27, 0x9d, 0x57, 0x75, 0x11, 0x1a, 0x07, 0xba, 0x63, 0xfa, + 0x07, 0xfa, 0xa1, 0x98, 0xd2, 0x63, 0x99, 0x86, 0x6f, 0x2b, 0x02, 0x46, 0x3c, 0xda, 0x3f, 0xae, + 0x82, 0x08, 0xcc, 0x60, 0x93, 0x8e, 0x69, 0xf9, 0xe2, 0x64, 0x40, 0x81, 0xd7, 0x0c, 0x27, 0x9d, + 0x55, 0x59, 0x8e, 0x21, 0x07, 0xb9, 0x0a, 0xa5, 0x9e, 0xe5, 0x48, 0x0d, 0x84, 0x1b, 0x72, 0xb7, + 0x2c, 0x07, 0x59, 0x19, 0x27, 0xe9, 0x8f, 0xa4, 0x86, 0x21, 0x48, 0xfa, 0x23, 0x64, 0x65, 0xe4, + 0xab, 0x30, 0x6b, 0xbb, 0xee, 0x21, 0x9b, 0x3e, 0x94, 0x22, 0x22, 0xbc, 0xea, 0xdc, 0xb4, 0xb2, + 0x99, 0x24, 0x61, 0x9a, 0x97, 0xec, 0xc2, 0xcb, 0x1f, 0x52, 0xcf, 0x95, 0xf3, 0x65, 0xc7, 0xa6, + 0xb4, 0xaf, 0x60, 0x84, 0x6a, 0xcc, 0x43, 0x48, 0x7f, 0x3e, 0x9b, 0x05, 0x47, 0xd5, 0xe5, 0xc1, + 0xe8, 0xba, 0xd7, 0xa5, 0xc1, 0xb6, 0xe7, 0x32, 0xdd, 0xc5, 0x72, 0xba, 0x0a, 0xb6, 0x1a, 0xc1, + 0xee, 0x64, 0xb3, 0xe0, 0xa8, 0xba, 0xe4, 0x5d, 0x98, 0x17, 0x24, 0xa1, 0xb6, 0x2c, 0x8b, 0x69, + 0xc6, 0xb2, 0xd5, 0xbd, 0x9d, 0xd3, 0xc2, 0x5f, 0xb6, 0x33, 0x82, 0x07, 0x47, 0xd6, 0x26, 0x77, + 0x60, 0x4e, 0x79, 0x4b, 0xb7, 0xa9, 0xd7, 0x09, 0x83, 0x75, 0xa6, 0xdb, 0xd7, 0x4f, 0x4f, 0x5a, + 0xd7, 0x56, 0x69, 0xdf, 0xa3, 0x46, 0xdc, 0xeb, 0xac, 0xb8, 0x70, 0xa8, 0x1e, 0x41, 0xb8, 0xc2, + 0x23, 0x72, 0x76, 0xfb, 0x2b, 0xae, 0x6b, 0x9b, 0xee, 0x43, 0x47, 0x3d, 0xbb, 0x50, 0xd8, 0xb9, + 0x83, 0xb4, 0x93, 0xc9, 0x81, 0x23, 0x6a, 0xb2, 0x27, 0xe7, 0x94, 0x55, 0xf7, 0xa1, 0x93, 0x46, + 0x85, 0xe8, 0xc9, 0x3b, 0x23, 0x78, 0x70, 0x64, 0x6d, 0xb2, 0x06, 0x24, 0xfd, 0x04, 0xbb, 0x7d, + 0xe9, 0xc2, 0xbf, 0x22, 0x32, 0x00, 0xa5, 0xa9, 0x98, 0x51, 0x83, 0x6c, 0xc2, 0xe5, 0x74, 0x29, + 0x13, 0x27, 0xbd, 0xf9, 0x3c, 0xf7, 0x2f, 0x66, 0xd0, 0x31, 0xb3, 0x96, 0xf6, 0x4f, 0x8a, 0x30, + 0x9d, 0x48, 0x19, 0xf1, 0xdc, 0x1d, 0xcd, 0x67, 0x9b, 0x87, 0x9e, 0xdf, 0xdd, 0x58, 0xbd, 0x4d, + 0x75, 0x93, 0x7a, 0x77, 0xa9, 0x4a, 0xef, 0x21, 0x96, 0xc5, 0x04, 0x05, 0x53, 0x9c, 0x64, 0x1f, + 0x2a, 0xc2, 0x4f, 0x90, 0xf7, 0xda, 0x1f, 0xd5, 0x47, 0xdc, 0x59, 0x20, 0xef, 0xca, 0x72, 0x3d, + 0x8a, 0x02, 0x5e, 0x0b, 0x60, 0x2a, 0xce, 0xc1, 0x26, 0x92, 0x48, 0xed, 0xad, 0x25, 0x54, 0xde, + 0x0d, 0x28, 0x05, 0xc1, 0xb8, 0x87, 0xfe, 0x85, 0xdf, 0x69, 0x67, 0x13, 0x19, 0x86, 0xb6, 0xcf, + 0xde, 0x9d, 0xef, 0x5b, 0xae, 0x23, 0x33, 0xc0, 0xef, 0x42, 0x4d, 0xee, 0x9e, 0xc6, 0x4c, 0x5a, + 0xc0, 0x75, 0x25, 0x65, 0x76, 0x55, 0x58, 0xda, 0x7f, 0x28, 0x42, 0x23, 0x34, 0x93, 0x9c, 0x21, + 0xb3, 0xba, 0x0b, 0x8d, 0x30, 0xa2, 0x30, 0xf7, 0x9d, 0xa6, 0x51, 0xa0, 0x1b, 0xdf, 0xd9, 0x87, + 0x7f, 0x31, 0x92, 0x11, 0x8f, 0x56, 0x2c, 0xe5, 0x88, 0x56, 0xec, 0x43, 0x2d, 0xf0, 0xac, 0x6e, + 0x57, 0xee, 0x12, 0xf2, 0x84, 0x2b, 0x86, 0xdd, 0xb5, 0x23, 0x00, 0x65, 0xcf, 0x8a, 0x3f, 0xa8, + 0xc4, 0x68, 0x1f, 0xc0, 0x5c, 0x9a, 0x93, 0xab, 0xd0, 0xc6, 0x01, 0x35, 0x07, 0xb6, 0xea, 0xe3, + 0x48, 0x85, 0x96, 0xe5, 0x18, 0x72, 0x90, 0x9b, 0x50, 0x67, 0xaf, 0xe9, 0x43, 0xd7, 0x51, 0x6a, + 0x2c, 0xdf, 0x8d, 0xec, 0xc8, 0x32, 0x0c, 0xa9, 0xda, 0x7f, 0x2d, 0xc1, 0xd5, 0xc8, 0xd8, 0xb5, + 0xa5, 0x3b, 0x7a, 0xf7, 0x0c, 0x17, 0x59, 0x7e, 0x76, 0x0c, 0xec, 0xbc, 0xd7, 0x63, 0x94, 0x9e, + 0x83, 0xeb, 0x31, 0xfe, 0x4f, 0x11, 0x78, 0xf4, 0x33, 0xf9, 0x36, 0x4c, 0xe9, 0xb1, 0x3b, 0x8c, + 0xe5, 0xeb, 0xbc, 0x95, 0xfb, 0x75, 0xf2, 0x20, 0xeb, 0x30, 0x00, 0x2e, 0x5e, 0x8a, 0x09, 0x81, + 0xc4, 0x85, 0xfa, 0xbe, 0x6e, 0xdb, 0x4c, 0x17, 0xca, 0xed, 0xbc, 0x4b, 0x08, 0xe7, 0xc3, 0x7c, + 0x4d, 0x42, 0x63, 0x28, 0x84, 0x7c, 0x54, 0x80, 0x69, 0x2f, 0xbe, 0x5d, 0x93, 0x2f, 0x24, 0x4f, + 0x68, 0x47, 0x0c, 0x2d, 0x1e, 0x6e, 0x17, 0xdf, 0x13, 0x26, 0x65, 0x6a, 0xff, 0xa5, 0x00, 0xd3, + 0x1d, 0xdb, 0x32, 0x2d, 0xa7, 0x7b, 0x81, 0xb7, 0x73, 0xdc, 0x87, 0x8a, 0x6f, 0x5b, 0x26, 0x1d, + 0x73, 0x35, 0x11, 0xeb, 0x18, 0x03, 0x40, 0x81, 0x93, 0xbc, 0xee, 0xa3, 0x74, 0x86, 0xeb, 0x3e, + 0xfe, 0xb0, 0x0a, 0x32, 0x8e, 0x9f, 0x0c, 0xa0, 0xd1, 0x55, 0xb7, 0x08, 0xc8, 0x67, 0xbc, 0x9d, + 0x23, 0x03, 0x65, 0xe2, 0x3e, 0x02, 0x31, 0xf7, 0x87, 0x85, 0x18, 0x49, 0x22, 0x34, 0x79, 0x79, + 0xf6, 0x6a, 0xce, 0xcb, 0xb3, 0x85, 0xb8, 0xe1, 0xeb, 0xb3, 0x75, 0x28, 0x1f, 0x04, 0x41, 0x5f, + 0x0e, 0xa6, 0xf1, 0x0f, 0x6a, 0x44, 0x49, 0x90, 0x84, 0x4e, 0xc4, 0xfe, 0x23, 0x87, 0x66, 0x22, + 0x1c, 0x3d, 0xbc, 0xa2, 0x70, 0x25, 0x57, 0x18, 0x49, 0x5c, 0x04, 0xfb, 0x8f, 0x1c, 0x9a, 0xfc, + 0x22, 0x34, 0x03, 0x4f, 0x77, 0xfc, 0x7d, 0xd7, 0xeb, 0x51, 0x4f, 0xee, 0x51, 0xd7, 0x72, 0xdc, + 0x1f, 0xbd, 0x13, 0xa1, 0x09, 0x93, 0x6c, 0xa2, 0x08, 0xe3, 0xd2, 0xc8, 0x21, 0xd4, 0x07, 0xa6, + 0x68, 0x98, 0x34, 0x83, 0x2d, 0xe7, 0xb9, 0x12, 0x3c, 0x16, 0x24, 0xa2, 0xfe, 0x61, 0x28, 0x20, + 0x79, 0x1b, 0x67, 0x6d, 0x52, 0xb7, 0x71, 0xc6, 0x47, 0x63, 0x56, 0x86, 0x16, 0xd2, 0x93, 0x7a, + 0xad, 0xd3, 0x95, 0x31, 0x6e, 0x6b, 0xb9, 0x55, 0x4e, 0x21, 0xb2, 0x19, 0xea, 0xc6, 0x4e, 0x17, + 0x95, 0x0c, 0xad, 0x07, 0xd2, 0x77, 0x44, 0x8c, 0xc4, 0x4d, 0x46, 0xe2, 0xd8, 0xe0, 0xe2, 0xd9, + 0xe6, 0x83, 0xf0, 0x4a, 0x9d, 0x58, 0x26, 0xf5, 0xcc, 0x2b, 0x8b, 0xb4, 0xff, 0x58, 0x84, 0xd2, + 0xce, 0x66, 0x47, 0x64, 0x47, 0xe5, 0x77, 0xa3, 0xd1, 0xce, 0xa1, 0xd5, 0x7f, 0x40, 0x3d, 0x6b, + 0xff, 0x58, 0x6e, 0xbd, 0x63, 0xd9, 0x51, 0xd3, 0x1c, 0x98, 0x51, 0x8b, 0xbc, 0x07, 0x53, 0x86, + 0xbe, 0x42, 0xbd, 0x60, 0x1c, 0xc3, 0x02, 0x3f, 0x1f, 0xbd, 0xb2, 0x1c, 0x55, 0xc7, 0x04, 0x18, + 0xd9, 0x05, 0x30, 0x22, 0xe8, 0xd2, 0xb9, 0xcd, 0x21, 0x31, 0xe0, 0x18, 0x10, 0x41, 0x68, 0x1c, + 0x32, 0x56, 0x8e, 0x5a, 0x3e, 0x0f, 0x2a, 0x1f, 0x39, 0x77, 0x55, 0x5d, 0x8c, 0x60, 0x34, 0x07, + 0xa6, 0x13, 0xd7, 0x1b, 0x91, 0xaf, 0x40, 0xdd, 0xed, 0xc7, 0xa6, 0xd3, 0x06, 0x8f, 0xa6, 0xad, + 0xdf, 0x97, 0x65, 0x8f, 0x4f, 0x5a, 0xd3, 0x9b, 0x6e, 0xd7, 0x32, 0x54, 0x01, 0x86, 0xec, 0x44, + 0x83, 0x2a, 0x3f, 0xd4, 0xa8, 0x2e, 0x37, 0xe2, 0x6b, 0x07, 0xbf, 0x7f, 0xc4, 0x47, 0x49, 0xd1, + 0x7e, 0xa9, 0x0c, 0x91, 0xc7, 0x95, 0xf8, 0x50, 0x15, 0x87, 0x36, 0xe4, 0xcc, 0x7d, 0xa1, 0xe7, + 0x43, 0xa4, 0x28, 0xd2, 0x85, 0xd2, 0x07, 0xee, 0x5e, 0xee, 0x89, 0x3b, 0x96, 0xcd, 0x40, 0xd8, + 0xca, 0x62, 0x05, 0xc8, 0x24, 0x90, 0xbf, 0x56, 0x80, 0x17, 0xfd, 0xb4, 0xea, 0x2b, 0x87, 0x03, + 0xe6, 0xd7, 0xf1, 0xd3, 0xca, 0xb4, 0x0c, 0x7b, 0x1e, 0x45, 0xc6, 0xe1, 0xb6, 0xb0, 0xfe, 0x17, + 0xae, 0x50, 0x39, 0x9c, 0xd6, 0x73, 0x5e, 0xbe, 0x9a, 0xec, 0xff, 0x64, 0x19, 0x4a, 0x51, 0xda, + 0xaf, 0x14, 0xa1, 0x19, 0x9b, 0xad, 0x73, 0xdf, 0x99, 0xf5, 0x28, 0x75, 0x67, 0xd6, 0xf6, 0xf8, + 0x91, 0x01, 0x51, 0xab, 0x2e, 0xfa, 0xda, 0xac, 0x7f, 0x5e, 0x84, 0xd2, 0xee, 0xea, 0x5a, 0x72, + 0xd3, 0x5a, 0x78, 0x06, 0x9b, 0xd6, 0x03, 0xa8, 0xed, 0x0d, 0x2c, 0x3b, 0xb0, 0x9c, 0xdc, 0xf9, + 0x56, 0xd4, 0x15, 0x63, 0xd2, 0xd7, 0x21, 0x50, 0x51, 0xc1, 0x93, 0x2e, 0xd4, 0xba, 0x22, 0xe1, + 0x65, 0xee, 0x78, 0x49, 0x99, 0x38, 0x53, 0x08, 0x92, 0x7f, 0x50, 0xa1, 0x6b, 0xc7, 0x50, 0xdd, + 0x5d, 0x95, 0x6a, 0xff, 0xb3, 0xed, 0x4d, 0xed, 0x17, 0x21, 0xd4, 0x02, 0x9e, 0xbd, 0xf0, 0xdf, + 0x29, 0x40, 0x52, 0xf1, 0x79, 0xf6, 0xa3, 0xe9, 0x30, 0x3d, 0x9a, 0x56, 0x27, 0xf1, 0xf1, 0x65, + 0x0f, 0x28, 0xed, 0xdf, 0x15, 0x20, 0x75, 0xd2, 0x8e, 0xbc, 0x21, 0x73, 0xa7, 0x25, 0x03, 0xd3, + 0x54, 0xee, 0x34, 0x92, 0xe4, 0x8e, 0xe5, 0x50, 0xfb, 0x98, 0x6d, 0xd7, 0xe2, 0x0e, 0x34, 0xd9, + 0xfc, 0x7b, 0xe3, 0x6f, 0xd7, 0xb2, 0xdc, 0x71, 0x32, 0x78, 0x32, 0x4e, 0xc2, 0xa4, 0x5c, 0xed, + 0x1f, 0x15, 0xa1, 0xfa, 0xcc, 0x0e, 0xfe, 0xd3, 0x44, 0x3c, 0xeb, 0x4a, 0xce, 0xd9, 0x7e, 0x64, + 0x34, 0x6b, 0x2f, 0x15, 0xcd, 0x9a, 0xf7, 0x4e, 0xef, 0xa7, 0xc4, 0xb2, 0xfe, 0x9b, 0x02, 0xc8, + 0xb5, 0x66, 0xc3, 0xf1, 0x03, 0xdd, 0x31, 0x28, 0x31, 0xc2, 0x85, 0x2d, 0x6f, 0xd0, 0x94, 0x0c, + 0x2c, 0x14, 0xba, 0x0c, 0xff, 0xad, 0x16, 0x32, 0xf2, 0x93, 0x50, 0x3f, 0x70, 0xfd, 0x80, 0x2f, + 0x5e, 0xc5, 0xa4, 0xc9, 0xec, 0xb6, 0x2c, 0xc7, 0x90, 0x23, 0xed, 0xce, 0xae, 0x8c, 0x76, 0x67, + 0x6b, 0xbf, 0x59, 0x84, 0xa9, 0x4f, 0x4b, 0xf6, 0x82, 0xac, 0xe8, 0xdf, 0x52, 0xce, 0xe8, 0xdf, + 0xf2, 0x79, 0xa2, 0x7f, 0xb5, 0xef, 0x17, 0x00, 0x9e, 0x59, 0xea, 0x04, 0x33, 0x19, 0x98, 0x9b, + 0x7b, 0x5c, 0x65, 0x87, 0xe5, 0xfe, 0xfd, 0x8a, 0x7a, 0x24, 0x1e, 0x94, 0xfb, 0x71, 0x01, 0x66, + 0xf4, 0x44, 0xa0, 0x6b, 0x6e, 0x7d, 0x39, 0x15, 0x37, 0x1b, 0xc6, 0x69, 0x25, 0xcb, 0x31, 0x25, + 0x96, 0xbc, 0x19, 0xa5, 0xed, 0xbe, 0x17, 0x0d, 0xfb, 0xa1, 0x7c, 0xdb, 0x5c, 0x77, 0x4b, 0x70, + 0x3e, 0x25, 0xb0, 0xb8, 0x34, 0x91, 0xc0, 0xe2, 0xf8, 0x91, 0xc9, 0xf2, 0x13, 0x8f, 0x4c, 0x1e, + 0x41, 0x63, 0xdf, 0x73, 0x7b, 0x3c, 0x76, 0x57, 0x5e, 0x8c, 0x7d, 0x2b, 0xc7, 0x42, 0xd9, 0xdb, + 0xb3, 0x1c, 0x6a, 0xf2, 0xb8, 0xe0, 0xd0, 0x70, 0xb5, 0xa6, 0xf0, 0x31, 0x12, 0xc5, 0x6d, 0xfd, + 0xae, 0x90, 0x5a, 0x9d, 0xa4, 0xd4, 0x70, 0x2e, 0xd9, 0x11, 0xe8, 0xa8, 0xc4, 0x24, 0xe3, 0x75, + 0x6b, 0xcf, 0x26, 0x5e, 0x57, 0xfb, 0x0b, 0x35, 0x35, 0x81, 0x3d, 0x77, 0x19, 0x62, 0x3f, 0x3b, + 0xe8, 0xde, 0xa5, 0x43, 0xa7, 0xd0, 0xeb, 0xcf, 0xf0, 0x14, 0x7a, 0x63, 0x32, 0xa7, 0xd0, 0x21, + 0xdf, 0x29, 0xf4, 0xe6, 0x84, 0x4e, 0xa1, 0x4f, 0x4d, 0xea, 0x14, 0xfa, 0xf4, 0x58, 0xa7, 0xd0, + 0x67, 0xce, 0x74, 0x0a, 0xfd, 0xa4, 0x04, 0xa9, 0xcd, 0xf8, 0x67, 0x8e, 0xb7, 0xff, 0xa7, 0x1c, + 0x6f, 0xdf, 0x29, 0x42, 0x34, 0x11, 0x9f, 0x33, 0x30, 0xe9, 0x5d, 0xa8, 0xf7, 0xf4, 0x47, 0x3c, + 0x70, 0x3a, 0xcf, 0xc5, 0xca, 0x5b, 0x12, 0x03, 0x43, 0x34, 0xe2, 0x03, 0x58, 0xe1, 0xe5, 0x06, + 0xb9, 0x5d, 0x18, 0xd1, 0x3d, 0x09, 0xc2, 0x48, 0x1a, 0xfd, 0xc7, 0x98, 0x18, 0xed, 0x5f, 0x17, + 0x41, 0xde, 0x82, 0x41, 0x28, 0x54, 0xf6, 0xad, 0x47, 0xd4, 0xcc, 0x1d, 0xee, 0x1c, 0xbb, 0xee, + 0x5e, 0xf8, 0x68, 0x78, 0x01, 0x0a, 0x74, 0x6e, 0x7c, 0x17, 0x3e, 0x37, 0xd9, 0x7f, 0x39, 0x8c, + 0xef, 0x71, 0xdf, 0x9d, 0x34, 0xbe, 0x8b, 0x22, 0x54, 0x32, 0x84, 0xad, 0x9f, 0x87, 0x5f, 0xe4, + 0x76, 0x31, 0x26, 0xc2, 0x38, 0x94, 0xad, 0xdf, 0x17, 0x69, 0x28, 0xa4, 0x8c, 0xf6, 0x2f, 0x7c, + 0xef, 0x87, 0xd7, 0x5f, 0xf8, 0xfe, 0x0f, 0xaf, 0xbf, 0xf0, 0x83, 0x1f, 0x5e, 0x7f, 0xe1, 0x97, + 0x4e, 0xaf, 0x17, 0xbe, 0x77, 0x7a, 0xbd, 0xf0, 0xfd, 0xd3, 0xeb, 0x85, 0x1f, 0x9c, 0x5e, 0x2f, + 0xfc, 0xa7, 0xd3, 0xeb, 0x85, 0xbf, 0xfc, 0x9f, 0xaf, 0xbf, 0xf0, 0xf3, 0x5f, 0x8e, 0x9a, 0xb0, + 0xa8, 0x9a, 0xb0, 0xa8, 0x04, 0x2e, 0xf6, 0x0f, 0xbb, 0x8b, 0xac, 0x09, 0x51, 0x89, 0x6a, 0xc2, + 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xea, 0x57, 0x1d, 0x48, 0x12, 0x9e, 0x00, 0x00, } func (m *AbstractPodTemplate) Marshal() (dAtA []byte, err error) { @@ -4053,6 +4091,30 @@ func (m *Container) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.LivenessProbe != nil { + { + size, err := m.LivenessProbe.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x5a + } + if m.ReadinessProbe != nil { + { + size, err := m.ReadinessProbe.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 + } if m.ImagePullPolicy != nil { i -= len(*m.ImagePullPolicy) copy(dAtA[i:], *m.ImagePullPolicy) @@ -4170,6 +4232,30 @@ func (m *ContainerTemplate) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.LivenessProbe != nil { + { + size, err := m.LivenessProbe.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + if m.ReadinessProbe != nil { + { + size, err := m.ReadinessProbe.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } if len(m.EnvFrom) > 0 { for iNdEx := len(m.EnvFrom) - 1; iNdEx >= 0; iNdEx-- { { @@ -7380,6 +7466,54 @@ func (m *PipelineStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *Probe) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Probe) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Probe) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.FailureThreshold != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.FailureThreshold)) + i-- + dAtA[i] = 0x28 + } + if m.SuccessThreshold != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.SuccessThreshold)) + i-- + dAtA[i] = 0x20 + } + if m.PeriodSeconds != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.PeriodSeconds)) + i-- + dAtA[i] = 0x18 + } + if m.TimeoutSeconds != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.TimeoutSeconds)) + i-- + dAtA[i] = 0x10 + } + if m.InitialDelaySeconds != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.InitialDelaySeconds)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *RedisBufferService) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -9715,6 +9849,14 @@ func (m *Container) Size() (n int) { l = len(*m.ImagePullPolicy) n += 1 + l + sovGenerated(uint64(l)) } + if m.ReadinessProbe != nil { + l = m.ReadinessProbe.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.LivenessProbe != nil { + l = m.LivenessProbe.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -9744,6 +9886,14 @@ func (m *ContainerTemplate) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + if m.ReadinessProbe != nil { + l = m.ReadinessProbe.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.LivenessProbe != nil { + l = m.LivenessProbe.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -10892,6 +11042,30 @@ func (m *PipelineStatus) Size() (n int) { return n } +func (m *Probe) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.InitialDelaySeconds != nil { + n += 1 + sovGenerated(uint64(*m.InitialDelaySeconds)) + } + if m.TimeoutSeconds != nil { + n += 1 + sovGenerated(uint64(*m.TimeoutSeconds)) + } + if m.PeriodSeconds != nil { + n += 1 + sovGenerated(uint64(*m.PeriodSeconds)) + } + if m.SuccessThreshold != nil { + n += 1 + sovGenerated(uint64(*m.SuccessThreshold)) + } + if m.FailureThreshold != nil { + n += 1 + sovGenerated(uint64(*m.FailureThreshold)) + } + return n +} + func (m *RedisBufferService) Size() (n int) { if m == nil { return 0 @@ -11838,6 +12012,8 @@ func (this *Container) String() string { `Resources:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Resources), "ResourceRequirements", "v1.ResourceRequirements", 1), `&`, ``, 1) + `,`, `SecurityContext:` + strings.Replace(fmt.Sprintf("%v", this.SecurityContext), "SecurityContext", "v1.SecurityContext", 1) + `,`, `ImagePullPolicy:` + valueToStringGenerated(this.ImagePullPolicy) + `,`, + `ReadinessProbe:` + strings.Replace(this.ReadinessProbe.String(), "Probe", "Probe", 1) + `,`, + `LivenessProbe:` + strings.Replace(this.LivenessProbe.String(), "Probe", "Probe", 1) + `,`, `}`, }, "") return s @@ -11862,6 +12038,8 @@ func (this *ContainerTemplate) String() string { `SecurityContext:` + strings.Replace(fmt.Sprintf("%v", this.SecurityContext), "SecurityContext", "v1.SecurityContext", 1) + `,`, `Env:` + repeatedStringForEnv + `,`, `EnvFrom:` + repeatedStringForEnvFrom + `,`, + `ReadinessProbe:` + strings.Replace(this.ReadinessProbe.String(), "Probe", "Probe", 1) + `,`, + `LivenessProbe:` + strings.Replace(this.LivenessProbe.String(), "Probe", "Probe", 1) + `,`, `}`, }, "") return s @@ -12679,6 +12857,20 @@ func (this *PipelineStatus) String() string { }, "") return s } +func (this *Probe) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Probe{`, + `InitialDelaySeconds:` + valueToStringGenerated(this.InitialDelaySeconds) + `,`, + `TimeoutSeconds:` + valueToStringGenerated(this.TimeoutSeconds) + `,`, + `PeriodSeconds:` + valueToStringGenerated(this.PeriodSeconds) + `,`, + `SuccessThreshold:` + valueToStringGenerated(this.SuccessThreshold) + `,`, + `FailureThreshold:` + valueToStringGenerated(this.FailureThreshold) + `,`, + `}`, + }, "") + return s +} func (this *RedisBufferService) String() string { if this == nil { return "nil" @@ -15624,6 +15816,78 @@ func (m *Container) Unmarshal(dAtA []byte) error { s := k8s_io_api_core_v1.PullPolicy(dAtA[iNdEx:postIndex]) m.ImagePullPolicy = &s iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ReadinessProbe", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ReadinessProbe == nil { + m.ReadinessProbe = &Probe{} + } + if err := m.ReadinessProbe.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LivenessProbe", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LivenessProbe == nil { + m.LivenessProbe = &Probe{} + } + if err := m.LivenessProbe.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -15843,6 +16107,78 @@ func (m *ContainerTemplate) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ReadinessProbe", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ReadinessProbe == nil { + m.ReadinessProbe = &Probe{} + } + if err := m.ReadinessProbe.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LivenessProbe", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LivenessProbe == nil { + m.LivenessProbe = &Probe{} + } + if err := m.LivenessProbe.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -26300,6 +26636,156 @@ func (m *PipelineStatus) Unmarshal(dAtA []byte) error { } return nil } +func (m *Probe) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Probe: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Probe: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InitialDelaySeconds", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.InitialDelaySeconds = &v + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TimeoutSeconds", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.TimeoutSeconds = &v + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PeriodSeconds", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.PeriodSeconds = &v + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SuccessThreshold", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.SuccessThreshold = &v + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field FailureThreshold", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.FailureThreshold = &v + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *RedisBufferService) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/pkg/apis/numaflow/v1alpha1/generated.proto b/pkg/apis/numaflow/v1alpha1/generated.proto index 70936b9d47..035f4cf46b 100644 --- a/pkg/apis/numaflow/v1alpha1/generated.proto +++ b/pkg/apis/numaflow/v1alpha1/generated.proto @@ -304,6 +304,12 @@ message Container { // +optional optional string imagePullPolicy = 9; + + // +optional + optional Probe readinessProbe = 10; + + // +optional + optional Probe livenessProbe = 11; } // ContainerTemplate defines customized spec for a container @@ -322,6 +328,12 @@ message ContainerTemplate { // +optional repeated k8s.io.api.core.v1.EnvFromSource envFrom = 5; + + // +optional + optional Probe readinessProbe = 6; + + // +optional + optional Probe livenessProbe = 7; } message DaemonTemplate { @@ -1240,6 +1252,33 @@ message PipelineStatus { optional bool drainedOnPause = 12; } +// Probe is used to customize the configuration for Readiness and Liveness probes. +message Probe { + // Number of seconds after the container has started before liveness probes are initiated. + // More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes + // +optional + optional int32 initialDelaySeconds = 1; + + // Number of seconds after which the probe times out. + // More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes + // +optional + optional int32 timeoutSeconds = 2; + + // How often (in seconds) to perform the probe. + // +optional + optional int32 periodSeconds = 3; + + // Minimum consecutive successes for the probe to be considered successful after having failed. + // Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + // +optional + optional int32 successThreshold = 4; + + // Minimum consecutive failures for the probe to be considered failed after having succeeded. + // Defaults to 3. Minimum value is 1. + // +optional + optional int32 failureThreshold = 5; +} + message RedisBufferService { // Native brings up a native Redis service optional NativeRedis native = 1; diff --git a/pkg/apis/numaflow/v1alpha1/mono_vertex_types.go b/pkg/apis/numaflow/v1alpha1/mono_vertex_types.go index 934d497878..e3b8e28f64 100644 --- a/pkg/apis/numaflow/v1alpha1/mono_vertex_types.go +++ b/pkg/apis/numaflow/v1alpha1/mono_vertex_types.go @@ -345,6 +345,18 @@ func (mv MonoVertex) GetPodSpec(req GetMonoVertexPodSpecReq) (*corev1.PodSpec, e volumeMounts: volumeMounts, }) + var readyzInitDeploy, readyzPeriodSeconds, readyzTimeoutSeconds, readyzFailureThreshold int32 = NumaContainerReadyzInitialDelaySeconds, NumaContainerReadyzPeriodSeconds, NumaContainerReadyzTimeoutSeconds, NumaContainerReadyzFailureThreshold + var liveZInitDeploy, liveZPeriodSeconds, liveZTimeoutSeconds, liveZFailureThreshold int32 = NumaContainerLivezInitialDelaySeconds, NumaContainerLivezPeriodSeconds, NumaContainerLivezTimeoutSeconds, NumaContainerLivezFailureThreshold + if x := mv.Spec.ContainerTemplate; x != nil { + readyzInitDeploy = GetProbeInitialDelaySecondsOr(x.ReadinessProbe, readyzInitDeploy) + readyzPeriodSeconds = GetProbePeriodSecondsOr(x.ReadinessProbe, readyzPeriodSeconds) + readyzTimeoutSeconds = GetProbeTimeoutSecondsOr(x.ReadinessProbe, readyzTimeoutSeconds) + readyzFailureThreshold = GetProbeFailureThresholdOr(x.ReadinessProbe, readyzFailureThreshold) + liveZInitDeploy = GetProbeInitialDelaySecondsOr(x.LivenessProbe, liveZInitDeploy) + liveZPeriodSeconds = GetProbePeriodSecondsOr(x.LivenessProbe, liveZPeriodSeconds) + liveZTimeoutSeconds = GetProbeTimeoutSecondsOr(x.LivenessProbe, liveZTimeoutSeconds) + liveZFailureThreshold = GetProbeFailureThresholdOr(x.LivenessProbe, liveZFailureThreshold) + } containers[0].ReadinessProbe = &corev1.Probe{ ProbeHandler: corev1.ProbeHandler{ HTTPGet: &corev1.HTTPGetAction{ @@ -353,9 +365,10 @@ func (mv MonoVertex) GetPodSpec(req GetMonoVertexPodSpecReq) (*corev1.PodSpec, e Scheme: corev1.URISchemeHTTPS, }, }, - InitialDelaySeconds: 3, - PeriodSeconds: 3, - TimeoutSeconds: 1, + InitialDelaySeconds: readyzInitDeploy, + PeriodSeconds: readyzPeriodSeconds, + TimeoutSeconds: readyzTimeoutSeconds, + FailureThreshold: readyzFailureThreshold, } containers[0].LivenessProbe = &corev1.Probe{ ProbeHandler: corev1.ProbeHandler{ @@ -365,9 +378,10 @@ func (mv MonoVertex) GetPodSpec(req GetMonoVertexPodSpecReq) (*corev1.PodSpec, e Scheme: corev1.URISchemeHTTPS, }, }, - InitialDelaySeconds: 20, - PeriodSeconds: 60, - TimeoutSeconds: 30, + InitialDelaySeconds: liveZInitDeploy, + PeriodSeconds: liveZPeriodSeconds, + TimeoutSeconds: liveZTimeoutSeconds, + FailureThreshold: liveZFailureThreshold, } containers[0].Ports = []corev1.ContainerPort{ {Name: MonoVertexMetricsPortName, ContainerPort: MonoVertexMetricsPort}, diff --git a/pkg/apis/numaflow/v1alpha1/mono_vertex_types_test.go b/pkg/apis/numaflow/v1alpha1/mono_vertex_types_test.go index 665acd8b32..ae6a62c09d 100644 --- a/pkg/apis/numaflow/v1alpha1/mono_vertex_types_test.go +++ b/pkg/apis/numaflow/v1alpha1/mono_vertex_types_test.go @@ -34,6 +34,20 @@ var ( Namespace: "default", }, Spec: MonoVertexSpec{ + ContainerTemplate: &ContainerTemplate{ + ReadinessProbe: &Probe{ + InitialDelaySeconds: ptr.To[int32](24), + PeriodSeconds: ptr.To[int32](25), + FailureThreshold: ptr.To[int32](2), + TimeoutSeconds: ptr.To[int32](21), + }, + LivenessProbe: &Probe{ + InitialDelaySeconds: ptr.To[int32](14), + PeriodSeconds: ptr.To[int32](15), + FailureThreshold: ptr.To[int32](1), + TimeoutSeconds: ptr.To[int32](11), + }, + }, Scale: Scale{ Min: ptr.To[int32](2), Max: ptr.To[int32](4), @@ -195,6 +209,16 @@ func TestMonoVertexGetPodSpec(t *testing.T) { } assert.Contains(t, envNames, "ENV_VAR_NAME") assert.Contains(t, envNames, EnvMonoVertexObject) + assert.NotNil(t, podSpec.Containers[0].ReadinessProbe) + assert.Equal(t, int32(24), podSpec.Containers[0].ReadinessProbe.InitialDelaySeconds) + assert.Equal(t, int32(25), podSpec.Containers[0].ReadinessProbe.PeriodSeconds) + assert.Equal(t, int32(2), podSpec.Containers[0].ReadinessProbe.FailureThreshold) + assert.Equal(t, int32(21), podSpec.Containers[0].ReadinessProbe.TimeoutSeconds) + assert.NotNil(t, podSpec.Containers[0].LivenessProbe) + assert.Equal(t, int32(14), podSpec.Containers[0].LivenessProbe.InitialDelaySeconds) + assert.Equal(t, int32(15), podSpec.Containers[0].LivenessProbe.PeriodSeconds) + assert.Equal(t, int32(1), podSpec.Containers[0].LivenessProbe.FailureThreshold) + assert.Equal(t, int32(11), podSpec.Containers[0].LivenessProbe.TimeoutSeconds) }) } diff --git a/pkg/apis/numaflow/v1alpha1/openapi_generated.go b/pkg/apis/numaflow/v1alpha1/openapi_generated.go index 5987162567..bd59769897 100644 --- a/pkg/apis/numaflow/v1alpha1/openapi_generated.go +++ b/pkg/apis/numaflow/v1alpha1/openapi_generated.go @@ -89,6 +89,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.PipelineList": schema_pkg_apis_numaflow_v1alpha1_PipelineList(ref), "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.PipelineSpec": schema_pkg_apis_numaflow_v1alpha1_PipelineSpec(ref), "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.PipelineStatus": schema_pkg_apis_numaflow_v1alpha1_PipelineStatus(ref), + "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.Probe": schema_pkg_apis_numaflow_v1alpha1_Probe(ref), "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.RedisBufferService": schema_pkg_apis_numaflow_v1alpha1_RedisBufferService(ref), "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.RedisConfig": schema_pkg_apis_numaflow_v1alpha1_RedisConfig(ref), "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.RedisSettings": schema_pkg_apis_numaflow_v1alpha1_RedisSettings(ref), @@ -890,11 +891,21 @@ func schema_pkg_apis_numaflow_v1alpha1_Container(ref common.ReferenceCallback) c Format: "", }, }, + "readinessProbe": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.Probe"), + }, + }, + "livenessProbe": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.Probe"), + }, + }, }, }, }, Dependencies: []string{ - "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeMount"}, + "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.Probe", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeMount"}, } } @@ -948,11 +959,21 @@ func schema_pkg_apis_numaflow_v1alpha1_ContainerTemplate(ref common.ReferenceCal }, }, }, + "readinessProbe": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.Probe"), + }, + }, + "livenessProbe": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.Probe"), + }, + }, }, }, }, Dependencies: []string{ - "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext"}, + "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.Probe", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext"}, } } @@ -4171,6 +4192,54 @@ func schema_pkg_apis_numaflow_v1alpha1_PipelineStatus(ref common.ReferenceCallba } } +func schema_pkg_apis_numaflow_v1alpha1_Probe(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Probe is used to customize the configuration for Readiness and Liveness probes.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "initialDelaySeconds": { + SchemaProps: spec.SchemaProps{ + Description: "Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "timeoutSeconds": { + SchemaProps: spec.SchemaProps{ + Description: "Number of seconds after which the probe times out. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "periodSeconds": { + SchemaProps: spec.SchemaProps{ + Description: "How often (in seconds) to perform the probe.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "successThreshold": { + SchemaProps: spec.SchemaProps{ + Description: "Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "failureThreshold": { + SchemaProps: spec.SchemaProps{ + Description: "Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + }, + }, + }, + } +} + func schema_pkg_apis_numaflow_v1alpha1_RedisBufferService(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ diff --git a/pkg/apis/numaflow/v1alpha1/probe.go b/pkg/apis/numaflow/v1alpha1/probe.go new file mode 100644 index 0000000000..44c2801f94 --- /dev/null +++ b/pkg/apis/numaflow/v1alpha1/probe.go @@ -0,0 +1,74 @@ +/* +Copyright 2022 The Numaproj Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha1 + +// Probe is used to customize the configuration for Readiness and Liveness probes. +type Probe struct { + // Number of seconds after the container has started before liveness probes are initiated. + // More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes + // +optional + InitialDelaySeconds *int32 `json:"initialDelaySeconds,omitempty" protobuf:"varint,1,opt,name=initialDelaySeconds"` + // Number of seconds after which the probe times out. + // More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes + // +optional + TimeoutSeconds *int32 `json:"timeoutSeconds,omitempty" protobuf:"varint,2,opt,name=timeoutSeconds"` + // How often (in seconds) to perform the probe. + // +optional + PeriodSeconds *int32 `json:"periodSeconds,omitempty" protobuf:"varint,3,opt,name=periodSeconds"` + // Minimum consecutive successes for the probe to be considered successful after having failed. + // Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + // +optional + SuccessThreshold *int32 `json:"successThreshold,omitempty" protobuf:"varint,4,opt,name=successThreshold"` + // Minimum consecutive failures for the probe to be considered failed after having succeeded. + // Defaults to 3. Minimum value is 1. + // +optional + FailureThreshold *int32 `json:"failureThreshold,omitempty" protobuf:"varint,5,opt,name=failureThreshold"` +} + +func GetProbeInitialDelaySecondsOr(probe *Probe, defaultValue int32) int32 { + if probe == nil || probe.InitialDelaySeconds == nil { + return defaultValue + } + return *probe.InitialDelaySeconds +} + +func GetProbeTimeoutSecondsOr(probe *Probe, defaultValue int32) int32 { + if probe == nil || probe.TimeoutSeconds == nil { + return defaultValue + } + return *probe.TimeoutSeconds +} + +func GetProbePeriodSecondsOr(probe *Probe, defaultValue int32) int32 { + if probe == nil || probe.PeriodSeconds == nil { + return defaultValue + } + return *probe.PeriodSeconds +} + +func GetProbeSuccessThresholdOr(probe *Probe, defaultValue int32) int32 { + if probe == nil || probe.SuccessThreshold == nil { + return defaultValue + } + return *probe.SuccessThreshold +} +func GetProbeFailureThresholdOr(probe *Probe, defaultValue int32) int32 { + if probe == nil || probe.FailureThreshold == nil { + return defaultValue + } + return *probe.FailureThreshold +} diff --git a/pkg/apis/numaflow/v1alpha1/probe_test.go b/pkg/apis/numaflow/v1alpha1/probe_test.go new file mode 100644 index 0000000000..8383944451 --- /dev/null +++ b/pkg/apis/numaflow/v1alpha1/probe_test.go @@ -0,0 +1,199 @@ +/* +Copyright 2022 The Numaproj Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "k8s.io/utils/ptr" +) + +func TestGetProbeInitialDelaySecondsOr(t *testing.T) { + tests := []struct { + name string + probe *Probe + defaultValue int32 + expected int32 + }{ + { + name: "nil probe", + probe: nil, + defaultValue: 10, + expected: 10, + }, + { + name: "nil InitialDelaySeconds", + probe: &Probe{}, + defaultValue: 5, + expected: 5, + }, + { + name: "non-nil InitialDelaySeconds", + probe: &Probe{InitialDelaySeconds: ptr.To[int32](15)}, + defaultValue: 10, + expected: 15, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := GetProbeInitialDelaySecondsOr(tt.probe, tt.defaultValue) + assert.Equal(t, tt.expected, result) + }) + } +} + +func TestGetProbeTimeoutSeconds(t *testing.T) { + tests := []struct { + name string + probe *Probe + defaultValue int32 + expected int32 + }{ + { + name: "nil probe", + probe: nil, + defaultValue: 5, + expected: 5, + }, + { + name: "nil TimeoutSeconds", + probe: &Probe{}, + defaultValue: 3, + expected: 3, + }, + { + name: "non-nil TimeoutSeconds", + probe: &Probe{TimeoutSeconds: ptr.To[int32](8)}, + defaultValue: 5, + expected: 8, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := GetProbeTimeoutSecondsOr(tt.probe, tt.defaultValue) + assert.Equal(t, tt.expected, result) + }) + } +} + +func TestGetProbePeriodSeconds(t *testing.T) { + tests := []struct { + name string + probe *Probe + defaultValue int32 + expected int32 + }{ + { + name: "nil probe", + probe: nil, + defaultValue: 10, + expected: 10, + }, + { + name: "nil PeriodSeconds", + probe: &Probe{}, + defaultValue: 15, + expected: 15, + }, + { + name: "non-nil PeriodSeconds", + probe: &Probe{PeriodSeconds: ptr.To[int32](20)}, + defaultValue: 10, + expected: 20, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := GetProbePeriodSecondsOr(tt.probe, tt.defaultValue) + assert.Equal(t, tt.expected, result) + }) + } +} + +func TestGetProbeSuccessThreshold(t *testing.T) { + tests := []struct { + name string + probe *Probe + defaultValue int32 + expected int32 + }{ + { + name: "nil probe", + probe: nil, + defaultValue: 1, + expected: 1, + }, + { + name: "nil SuccessThreshold", + probe: &Probe{}, + defaultValue: 2, + expected: 2, + }, + { + name: "non-nil SuccessThreshold", + probe: &Probe{SuccessThreshold: ptr.To[int32](3)}, + defaultValue: 1, + expected: 3, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := GetProbeSuccessThresholdOr(tt.probe, tt.defaultValue) + assert.Equal(t, tt.expected, result) + }) + } +} + +func TestGetProbeFailureThreshold(t *testing.T) { + tests := []struct { + name string + probe *Probe + defaultValue int32 + expected int32 + }{ + { + name: "nil probe", + probe: nil, + defaultValue: 3, + expected: 3, + }, + { + name: "nil FailureThreshold", + probe: &Probe{}, + defaultValue: 5, + expected: 5, + }, + { + name: "non-nil FailureThreshold", + probe: &Probe{FailureThreshold: ptr.To[int32](7)}, + defaultValue: 3, + expected: 7, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := GetProbeFailureThresholdOr(tt.probe, tt.defaultValue) + assert.Equal(t, tt.expected, result) + }) + } +} diff --git a/pkg/apis/numaflow/v1alpha1/sink.go b/pkg/apis/numaflow/v1alpha1/sink.go index d596a079e6..d35f323e9e 100644 --- a/pkg/apis/numaflow/v1alpha1/sink.go +++ b/pkg/apis/numaflow/v1alpha1/sink.go @@ -92,9 +92,10 @@ func (s Sink) getUDSinkContainer(mainContainerReq getContainerReq) corev1.Contai Scheme: corev1.URISchemeHTTPS, }, }, - InitialDelaySeconds: 30, - PeriodSeconds: 60, - TimeoutSeconds: 30, + InitialDelaySeconds: GetProbeInitialDelaySecondsOr(x.LivenessProbe, UDContainerLivezInitialDelaySeconds), + PeriodSeconds: GetProbePeriodSecondsOr(x.LivenessProbe, UDContainerLivezPeriodSeconds), + TimeoutSeconds: GetProbeTimeoutSecondsOr(x.LivenessProbe, UDContainerLivezTimeoutSeconds), + FailureThreshold: GetProbeFailureThresholdOr(x.LivenessProbe, UDContainerLivezFailureThreshold), } return container } @@ -126,9 +127,10 @@ func (s Sink) getFallbackUDSinkContainer(mainContainerReq getContainerReq) corev Scheme: corev1.URISchemeHTTPS, }, }, - InitialDelaySeconds: 30, - PeriodSeconds: 60, - TimeoutSeconds: 30, + InitialDelaySeconds: GetProbeInitialDelaySecondsOr(x.LivenessProbe, UDContainerLivezInitialDelaySeconds), + PeriodSeconds: GetProbePeriodSecondsOr(x.LivenessProbe, UDContainerLivezPeriodSeconds), + TimeoutSeconds: GetProbeTimeoutSecondsOr(x.LivenessProbe, UDContainerLivezTimeoutSeconds), + FailureThreshold: GetProbeFailureThresholdOr(x.LivenessProbe, UDContainerLivezFailureThreshold), } return container } diff --git a/pkg/apis/numaflow/v1alpha1/sink_test.go b/pkg/apis/numaflow/v1alpha1/sink_test.go index 0fe7f002af..f63cb751bd 100644 --- a/pkg/apis/numaflow/v1alpha1/sink_test.go +++ b/pkg/apis/numaflow/v1alpha1/sink_test.go @@ -22,6 +22,7 @@ import ( "github.com/stretchr/testify/assert" corev1 "k8s.io/api/core/v1" resource "k8s.io/apimachinery/pkg/api/resource" + "k8s.io/utils/ptr" ) func Test_Sink_getContainers(t *testing.T) { @@ -52,6 +53,12 @@ func Test_Sink_getUDSinkContainer(t *testing.T) { EnvFrom: []corev1.EnvFromSource{{ConfigMapRef: &corev1.ConfigMapEnvSource{ LocalObjectReference: corev1.LocalObjectReference{Name: "test-cm"}, }}}, + LivenessProbe: &Probe{ + InitialDelaySeconds: ptr.To[int32](10), + TimeoutSeconds: ptr.To[int32](15), + PeriodSeconds: ptr.To[int32](14), + FailureThreshold: ptr.To[int32](5), + }, }, }, }, @@ -78,6 +85,10 @@ func Test_Sink_getUDSinkContainer(t *testing.T) { }) assert.Equal(t, testImagePullPolicy, c.ImagePullPolicy) assert.True(t, c.LivenessProbe != nil) + assert.Equal(t, int32(10), c.LivenessProbe.InitialDelaySeconds) + assert.Equal(t, int32(15), c.LivenessProbe.TimeoutSeconds) + assert.Equal(t, int32(14), c.LivenessProbe.PeriodSeconds) + assert.Equal(t, int32(5), c.LivenessProbe.FailureThreshold) } func Test_Sink_getFallbackUDSinkContainer(t *testing.T) { @@ -103,6 +114,12 @@ func Test_Sink_getFallbackUDSinkContainer(t *testing.T) { EnvFrom: []corev1.EnvFromSource{{ConfigMapRef: &corev1.ConfigMapEnvSource{ LocalObjectReference: corev1.LocalObjectReference{Name: "test-cm"}, }}}, + LivenessProbe: &Probe{ + InitialDelaySeconds: ptr.To[int32](20), + TimeoutSeconds: ptr.To[int32](25), + PeriodSeconds: ptr.To[int32](24), + FailureThreshold: ptr.To[int32](10), + }, }, }, }, @@ -122,6 +139,11 @@ func Test_Sink_getFallbackUDSinkContainer(t *testing.T) { envs[e.Name] = e.Value } assert.Equal(t, envs[EnvUDContainerType], UDContainerFallbackSink) + assert.True(t, c.LivenessProbe != nil) + assert.Equal(t, int32(20), c.LivenessProbe.InitialDelaySeconds) + assert.Equal(t, int32(25), c.LivenessProbe.TimeoutSeconds) + assert.Equal(t, int32(24), c.LivenessProbe.PeriodSeconds) + assert.Equal(t, int32(10), c.LivenessProbe.FailureThreshold) x.UDSink.Container.ImagePullPolicy = &testImagePullPolicy c = x.getUDSinkContainer(getContainerReq{ image: "main-image", diff --git a/pkg/apis/numaflow/v1alpha1/source.go b/pkg/apis/numaflow/v1alpha1/source.go index bc78831ff6..b89016d9c2 100644 --- a/pkg/apis/numaflow/v1alpha1/source.go +++ b/pkg/apis/numaflow/v1alpha1/source.go @@ -102,6 +102,14 @@ func (s Source) getUDTransformerContainer(mainContainerReq getContainerReq) core } } container := c.build() + + var initialDelaySeconds, periodSeconds, timeoutSeconds, failureThreshold int32 = UDContainerLivezInitialDelaySeconds, UDContainerLivezPeriodSeconds, UDContainerLivezTimeoutSeconds, UDContainerLivezFailureThreshold + if x := s.UDTransformer.Container; x != nil { + initialDelaySeconds = GetProbeInitialDelaySecondsOr(x.LivenessProbe, initialDelaySeconds) + periodSeconds = GetProbePeriodSecondsOr(x.LivenessProbe, periodSeconds) + timeoutSeconds = GetProbeTimeoutSecondsOr(x.LivenessProbe, timeoutSeconds) + failureThreshold = GetProbeFailureThresholdOr(x.LivenessProbe, failureThreshold) + } container.LivenessProbe = &corev1.Probe{ ProbeHandler: corev1.ProbeHandler{ HTTPGet: &corev1.HTTPGetAction{ @@ -110,9 +118,10 @@ func (s Source) getUDTransformerContainer(mainContainerReq getContainerReq) core Scheme: corev1.URISchemeHTTPS, }, }, - InitialDelaySeconds: 30, - PeriodSeconds: 60, - TimeoutSeconds: 30, + InitialDelaySeconds: initialDelaySeconds, + PeriodSeconds: periodSeconds, + TimeoutSeconds: timeoutSeconds, + FailureThreshold: failureThreshold, } return container } @@ -139,6 +148,14 @@ func (s Source) getUDSourceContainer(mainContainerReq getContainerReq) corev1.Co } } container := c.build() + + var initialDelaySeconds, periodSeconds, timeoutSeconds, failureThreshold int32 = UDContainerLivezInitialDelaySeconds, UDContainerLivezPeriodSeconds, UDContainerLivezTimeoutSeconds, UDContainerLivezFailureThreshold + if x := s.UDSource.Container; x != nil { + initialDelaySeconds = GetProbeInitialDelaySecondsOr(x.LivenessProbe, initialDelaySeconds) + periodSeconds = GetProbePeriodSecondsOr(x.LivenessProbe, periodSeconds) + timeoutSeconds = GetProbeTimeoutSecondsOr(x.LivenessProbe, timeoutSeconds) + failureThreshold = GetProbeFailureThresholdOr(x.LivenessProbe, failureThreshold) + } container.LivenessProbe = &corev1.Probe{ ProbeHandler: corev1.ProbeHandler{ HTTPGet: &corev1.HTTPGetAction{ @@ -147,9 +164,10 @@ func (s Source) getUDSourceContainer(mainContainerReq getContainerReq) corev1.Co Scheme: corev1.URISchemeHTTPS, }, }, - InitialDelaySeconds: 30, - PeriodSeconds: 60, - TimeoutSeconds: 30, + InitialDelaySeconds: initialDelaySeconds, + PeriodSeconds: periodSeconds, + TimeoutSeconds: timeoutSeconds, + FailureThreshold: failureThreshold, } return container } diff --git a/pkg/apis/numaflow/v1alpha1/source_test.go b/pkg/apis/numaflow/v1alpha1/source_test.go index d762eef84a..01f26f2cd6 100644 --- a/pkg/apis/numaflow/v1alpha1/source_test.go +++ b/pkg/apis/numaflow/v1alpha1/source_test.go @@ -23,12 +23,36 @@ import ( "github.com/stretchr/testify/assert" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" + "k8s.io/utils/ptr" ) var testImagePullPolicy = corev1.PullNever func TestSource_getContainers(t *testing.T) { x := Source{ + UDSource: &UDSource{ + Container: &Container{ + Image: "my-image-s", + VolumeMounts: []corev1.VolumeMount{{Name: "my-vm"}}, + Command: []string{"my-cmd-s"}, + Args: []string{"my-arg-s"}, + Env: []corev1.EnvVar{{Name: "my-envvar-s"}}, + EnvFrom: []corev1.EnvFromSource{{ConfigMapRef: &corev1.ConfigMapEnvSource{ + LocalObjectReference: corev1.LocalObjectReference{Name: "test-cm"}, + }}}, + Resources: corev1.ResourceRequirements{ + Requests: map[corev1.ResourceName]resource.Quantity{ + "cpu": resource.MustParse("2"), + }, + }, + LivenessProbe: &Probe{ + InitialDelaySeconds: ptr.To[int32](10), + TimeoutSeconds: ptr.To[int32](15), + PeriodSeconds: ptr.To[int32](14), + FailureThreshold: ptr.To[int32](5), + }, + }, + }, UDTransformer: &UDTransformer{ Container: &Container{ Image: "my-image", @@ -44,6 +68,12 @@ func TestSource_getContainers(t *testing.T) { "cpu": resource.MustParse("2"), }, }, + LivenessProbe: &Probe{ + InitialDelaySeconds: ptr.To[int32](20), + TimeoutSeconds: ptr.To[int32](25), + PeriodSeconds: ptr.To[int32](24), + FailureThreshold: ptr.To[int32](5), + }, }, }, } @@ -51,8 +81,33 @@ func TestSource_getContainers(t *testing.T) { image: "main-image", }) assert.NoError(t, err) - assert.Equal(t, 2, len(c)) + assert.Equal(t, 3, len(c)) assert.Equal(t, "main-image", c[0].Image) + + assert.Equal(t, x.UDSource.Container.Image, c[2].Image) + assert.Contains(t, c[2].VolumeMounts, c[2].VolumeMounts[0]) + assert.Equal(t, x.UDSource.Container.Command, c[2].Command) + assert.Equal(t, x.UDSource.Container.Args, c[2].Args) + envsUDSource := map[string]string{} + for _, e := range c[2].Env { + envsUDSource[e.Name] = e.Value + } + assert.Equal(t, envsUDSource[EnvUDContainerType], UDContainerSource) + assert.Equal(t, x.UDSource.Container.EnvFrom, c[2].EnvFrom) + assert.Equal(t, corev1.ResourceRequirements{Requests: map[corev1.ResourceName]resource.Quantity{"cpu": resource.MustParse("2")}}, c[2].Resources) + assert.Equal(t, c[0].ImagePullPolicy, c[2].ImagePullPolicy) + assert.NotNil(t, c[1].LivenessProbe) + assert.Equal(t, int32(10), c[2].LivenessProbe.InitialDelaySeconds) + assert.Equal(t, int32(15), c[2].LivenessProbe.TimeoutSeconds) + assert.Equal(t, int32(14), c[2].LivenessProbe.PeriodSeconds) + assert.Equal(t, int32(5), c[2].LivenessProbe.FailureThreshold) + x.UDSource.Container.ImagePullPolicy = &testImagePullPolicy + c, _ = x.getContainers(getContainerReq{ + image: "main-image", + imagePullPolicy: corev1.PullAlways, + }) + assert.Equal(t, testImagePullPolicy, c[2].ImagePullPolicy) + assert.Equal(t, x.UDTransformer.Container.Image, c[1].Image) assert.Contains(t, c[1].VolumeMounts, c[1].VolumeMounts[0]) assert.Equal(t, x.UDTransformer.Container.Command, c[1].Command) @@ -65,6 +120,11 @@ func TestSource_getContainers(t *testing.T) { assert.Equal(t, x.UDTransformer.Container.EnvFrom, c[1].EnvFrom) assert.Equal(t, corev1.ResourceRequirements{Requests: map[corev1.ResourceName]resource.Quantity{"cpu": resource.MustParse("2")}}, c[1].Resources) assert.Equal(t, c[0].ImagePullPolicy, c[1].ImagePullPolicy) + assert.NotNil(t, c[1].LivenessProbe) + assert.Equal(t, int32(20), c[1].LivenessProbe.InitialDelaySeconds) + assert.Equal(t, int32(25), c[1].LivenessProbe.TimeoutSeconds) + assert.Equal(t, int32(24), c[1].LivenessProbe.PeriodSeconds) + assert.Equal(t, int32(5), c[1].LivenessProbe.FailureThreshold) x.UDTransformer.Container.ImagePullPolicy = &testImagePullPolicy c, _ = x.getContainers(getContainerReq{ image: "main-image", diff --git a/pkg/apis/numaflow/v1alpha1/udf.go b/pkg/apis/numaflow/v1alpha1/udf.go index c29d54b2cb..23e9bcf085 100644 --- a/pkg/apis/numaflow/v1alpha1/udf.go +++ b/pkg/apis/numaflow/v1alpha1/udf.go @@ -98,6 +98,14 @@ func (in UDF) getUDFContainer(mainContainerReq getContainerReq) corev1.Container } c = c.appendEnv(corev1.EnvVar{Name: EnvUDContainerType, Value: UDContainerFunction}) container := c.build() + + var initialDelaySeconds, periodSeconds, timeoutSeconds, failureThreshold int32 = UDContainerLivezInitialDelaySeconds, UDContainerLivezPeriodSeconds, UDContainerLivezTimeoutSeconds, UDContainerLivezFailureThreshold + if x := in.Container; x != nil { + initialDelaySeconds = GetProbeInitialDelaySecondsOr(x.LivenessProbe, initialDelaySeconds) + periodSeconds = GetProbePeriodSecondsOr(x.LivenessProbe, periodSeconds) + timeoutSeconds = GetProbeTimeoutSecondsOr(x.LivenessProbe, timeoutSeconds) + failureThreshold = GetProbeFailureThresholdOr(x.LivenessProbe, failureThreshold) + } container.LivenessProbe = &corev1.Probe{ ProbeHandler: corev1.ProbeHandler{ HTTPGet: &corev1.HTTPGetAction{ @@ -106,9 +114,10 @@ func (in UDF) getUDFContainer(mainContainerReq getContainerReq) corev1.Container Scheme: corev1.URISchemeHTTPS, }, }, - InitialDelaySeconds: 30, - PeriodSeconds: 60, - TimeoutSeconds: 30, + InitialDelaySeconds: initialDelaySeconds, + PeriodSeconds: periodSeconds, + TimeoutSeconds: timeoutSeconds, + FailureThreshold: failureThreshold, } return container } diff --git a/pkg/apis/numaflow/v1alpha1/udf_test.go b/pkg/apis/numaflow/v1alpha1/udf_test.go index f96e9c3756..0bb8e3862a 100644 --- a/pkg/apis/numaflow/v1alpha1/udf_test.go +++ b/pkg/apis/numaflow/v1alpha1/udf_test.go @@ -22,6 +22,7 @@ import ( "github.com/stretchr/testify/assert" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" + "k8s.io/utils/ptr" ) func TestUDF_getContainers(t *testing.T) { @@ -40,6 +41,12 @@ func TestUDF_getContainers(t *testing.T) { "cpu": resource.MustParse("2"), }, }, + LivenessProbe: &Probe{ + InitialDelaySeconds: ptr.To[int32](10), + TimeoutSeconds: ptr.To[int32](15), + PeriodSeconds: ptr.To[int32](14), + FailureThreshold: ptr.To[int32](5), + }, }, } c, err := x.getContainers(getContainerReq{ @@ -68,6 +75,10 @@ func TestUDF_getContainers(t *testing.T) { }) assert.Equal(t, testImagePullPolicy, c[1].ImagePullPolicy) assert.True(t, c[1].LivenessProbe != nil) + assert.Equal(t, int32(10), c[1].LivenessProbe.InitialDelaySeconds) + assert.Equal(t, int32(15), c[1].LivenessProbe.TimeoutSeconds) + assert.Equal(t, int32(14), c[1].LivenessProbe.PeriodSeconds) + assert.Equal(t, int32(5), c[1].LivenessProbe.FailureThreshold) } func Test_getUDFContainer(t *testing.T) { diff --git a/pkg/apis/numaflow/v1alpha1/user_defined_container.go b/pkg/apis/numaflow/v1alpha1/user_defined_container.go index 369a6d3eb3..5e8746097e 100644 --- a/pkg/apis/numaflow/v1alpha1/user_defined_container.go +++ b/pkg/apis/numaflow/v1alpha1/user_defined_container.go @@ -38,4 +38,8 @@ type Container struct { SecurityContext *corev1.SecurityContext `json:"securityContext,omitempty" protobuf:"bytes,8,opt,name=securityContext"` // +optional ImagePullPolicy *corev1.PullPolicy `json:"imagePullPolicy,omitempty" protobuf:"bytes,9,opt,name=imagePullPolicy,casttype=PullPolicy"` + // +optional + ReadinessProbe *Probe `json:"readinessProbe,omitempty" protobuf:"bytes,10,opt,name=readinessProbe"` + // +optional + LivenessProbe *Probe `json:"livenessProbe,omitempty" protobuf:"bytes,11,opt,name=livenessProbe"` } diff --git a/pkg/apis/numaflow/v1alpha1/vertex_types.go b/pkg/apis/numaflow/v1alpha1/vertex_types.go index 965e9f4bcc..f403d074c3 100644 --- a/pkg/apis/numaflow/v1alpha1/vertex_types.go +++ b/pkg/apis/numaflow/v1alpha1/vertex_types.go @@ -253,6 +253,18 @@ func (v Vertex) GetPodSpec(req GetVertexPodSpecReq) (*corev1.PodSpec, error) { return nil, err } + var readyzInitDeploy, readyzPeriodSeconds, readyzTimeoutSeconds, readyzFailureThreshold int32 = NumaContainerReadyzInitialDelaySeconds, NumaContainerReadyzPeriodSeconds, NumaContainerReadyzTimeoutSeconds, NumaContainerReadyzFailureThreshold + var liveZInitDeploy, liveZPeriodSeconds, liveZTimeoutSeconds, liveZFailureThreshold int32 = NumaContainerLivezInitialDelaySeconds, NumaContainerLivezPeriodSeconds, NumaContainerLivezTimeoutSeconds, NumaContainerLivezFailureThreshold + if x := v.Spec.ContainerTemplate; x != nil { + readyzInitDeploy = GetProbeInitialDelaySecondsOr(x.ReadinessProbe, readyzInitDeploy) + readyzPeriodSeconds = GetProbePeriodSecondsOr(x.ReadinessProbe, readyzPeriodSeconds) + readyzTimeoutSeconds = GetProbeTimeoutSecondsOr(x.ReadinessProbe, readyzTimeoutSeconds) + readyzFailureThreshold = GetProbeFailureThresholdOr(x.ReadinessProbe, readyzFailureThreshold) + liveZInitDeploy = GetProbeInitialDelaySecondsOr(x.LivenessProbe, liveZInitDeploy) + liveZPeriodSeconds = GetProbePeriodSecondsOr(x.LivenessProbe, liveZPeriodSeconds) + liveZTimeoutSeconds = GetProbeTimeoutSecondsOr(x.LivenessProbe, liveZTimeoutSeconds) + liveZFailureThreshold = GetProbeFailureThresholdOr(x.LivenessProbe, liveZFailureThreshold) + } containers[0].ReadinessProbe = &corev1.Probe{ ProbeHandler: corev1.ProbeHandler{ HTTPGet: &corev1.HTTPGetAction{ @@ -261,10 +273,12 @@ func (v Vertex) GetPodSpec(req GetVertexPodSpecReq) (*corev1.PodSpec, error) { Scheme: corev1.URISchemeHTTPS, }, }, - InitialDelaySeconds: 3, - PeriodSeconds: 3, - TimeoutSeconds: 1, + InitialDelaySeconds: readyzInitDeploy, + PeriodSeconds: readyzPeriodSeconds, + TimeoutSeconds: readyzTimeoutSeconds, + FailureThreshold: readyzFailureThreshold, } + containers[0].LivenessProbe = &corev1.Probe{ ProbeHandler: corev1.ProbeHandler{ HTTPGet: &corev1.HTTPGetAction{ @@ -273,9 +287,10 @@ func (v Vertex) GetPodSpec(req GetVertexPodSpecReq) (*corev1.PodSpec, error) { Scheme: corev1.URISchemeHTTPS, }, }, - InitialDelaySeconds: 20, - PeriodSeconds: 60, - TimeoutSeconds: 30, + InitialDelaySeconds: liveZInitDeploy, + PeriodSeconds: liveZPeriodSeconds, + TimeoutSeconds: liveZTimeoutSeconds, + FailureThreshold: liveZFailureThreshold, } containers[0].Ports = []corev1.ContainerPort{ {Name: VertexMetricsPortName, ContainerPort: VertexMetricsPort}, diff --git a/pkg/apis/numaflow/v1alpha1/vertex_types_test.go b/pkg/apis/numaflow/v1alpha1/vertex_types_test.go index 1f5572c424..83384cf624 100644 --- a/pkg/apis/numaflow/v1alpha1/vertex_types_test.go +++ b/pkg/apis/numaflow/v1alpha1/vertex_types_test.go @@ -286,6 +286,20 @@ func TestGetPodSpec(t *testing.T) { t.Run("test sink", func(t *testing.T) { testObj := testVertex.DeepCopy() testObj.Spec.Sink = &Sink{} + testObj.Spec.ContainerTemplate = &ContainerTemplate{ + ReadinessProbe: &Probe{ + InitialDelaySeconds: ptr.To[int32](24), + PeriodSeconds: ptr.To[int32](25), + FailureThreshold: ptr.To[int32](2), + TimeoutSeconds: ptr.To[int32](21), + }, + LivenessProbe: &Probe{ + InitialDelaySeconds: ptr.To[int32](14), + PeriodSeconds: ptr.To[int32](15), + FailureThreshold: ptr.To[int32](2), + TimeoutSeconds: ptr.To[int32](11), + }, + } s, err := testObj.GetPodSpec(req) assert.NoError(t, err) assert.Equal(t, 1, len(s.Containers)) @@ -294,10 +308,20 @@ func TestGetPodSpec(t *testing.T) { assert.Equal(t, corev1.PullIfNotPresent, s.Containers[0].ImagePullPolicy) assert.NotNil(t, s.Containers[0].ReadinessProbe) assert.NotNil(t, s.Containers[0].ReadinessProbe.HTTPGet) + assert.Equal(t, "/readyz", s.Containers[0].ReadinessProbe.HTTPGet.Path) + assert.Equal(t, int32(24), s.Containers[0].ReadinessProbe.InitialDelaySeconds) + assert.Equal(t, int32(25), s.Containers[0].ReadinessProbe.PeriodSeconds) + assert.Equal(t, int32(2), s.Containers[0].ReadinessProbe.FailureThreshold) + assert.Equal(t, int32(21), s.Containers[0].ReadinessProbe.TimeoutSeconds) assert.Equal(t, corev1.URISchemeHTTPS, s.Containers[0].ReadinessProbe.HTTPGet.Scheme) assert.Equal(t, VertexMetricsPort, s.Containers[0].ReadinessProbe.HTTPGet.Port.IntValue()) assert.NotNil(t, s.Containers[0].LivenessProbe) assert.NotNil(t, s.Containers[0].LivenessProbe.HTTPGet) + assert.Equal(t, "/livez", s.Containers[0].LivenessProbe.HTTPGet.Path) + assert.Equal(t, int32(14), s.Containers[0].LivenessProbe.InitialDelaySeconds) + assert.Equal(t, int32(15), s.Containers[0].LivenessProbe.PeriodSeconds) + assert.Equal(t, int32(2), s.Containers[0].LivenessProbe.FailureThreshold) + assert.Equal(t, int32(11), s.Containers[0].LivenessProbe.TimeoutSeconds) assert.Equal(t, corev1.URISchemeHTTPS, s.Containers[0].LivenessProbe.HTTPGet.Scheme) assert.Equal(t, VertexMetricsPort, s.Containers[0].LivenessProbe.HTTPGet.Port.IntValue()) assert.Equal(t, 1, len(s.Containers[0].Ports)) diff --git a/pkg/shared/clients/nats/test/server.go b/pkg/shared/clients/nats/test/server.go index af3c25036e..556a7390c2 100644 --- a/pkg/shared/clients/nats/test/server.go +++ b/pkg/shared/clients/nats/test/server.go @@ -27,6 +27,7 @@ import ( func RunNatsServer(t *testing.T) *server.Server { t.Helper() opts := natstestserver.DefaultTestOptions + opts.Port = 4223 return natstestserver.RunServer(&opts) } diff --git a/pkg/sources/nats/nats_test.go b/pkg/sources/nats/nats_test.go index 739d215018..db4a0c25b7 100644 --- a/pkg/sources/nats/nats_test.go +++ b/pkg/sources/nats/nats_test.go @@ -68,7 +68,7 @@ func Test_Single(t *testing.T) { server := natstest.RunNatsServer(t) defer server.Shutdown() - url := "127.0.0.1" + url := server.ClientURL() testSubject := "test-single" testQueue := "test-queue-single" vi := testVertex(t, url, testSubject, testQueue, "test-host", 0) @@ -112,9 +112,9 @@ func Test_Multiple(t *testing.T) { server := natstest.RunNatsServer(t) defer server.Shutdown() - url := "127.0.0.1" testSubject := "test-multiple" testQueue := "test-queue-multiple" + url := server.ClientURL() v1 := testVertex(t, url, testSubject, testQueue, "test-host1", 0) ns1, err := newInstance(t, v1) assert.NoError(t, err) diff --git a/rust/numaflow-models/src/models/container.rs b/rust/numaflow-models/src/models/container.rs index 69f3206a00..3599d6a243 100644 --- a/rust/numaflow-models/src/models/container.rs +++ b/rust/numaflow-models/src/models/container.rs @@ -32,6 +32,10 @@ pub struct Container { pub image: Option, #[serde(rename = "imagePullPolicy", skip_serializing_if = "Option::is_none")] pub image_pull_policy: Option, + #[serde(rename = "livenessProbe", skip_serializing_if = "Option::is_none")] + pub liveness_probe: Option>, + #[serde(rename = "readinessProbe", skip_serializing_if = "Option::is_none")] + pub readiness_probe: Option>, #[serde(rename = "resources", skip_serializing_if = "Option::is_none")] pub resources: Option, #[serde(rename = "securityContext", skip_serializing_if = "Option::is_none")] @@ -50,6 +54,8 @@ impl Container { env_from: None, image: None, image_pull_policy: None, + liveness_probe: None, + readiness_probe: None, resources: None, security_context: None, volume_mounts: None, diff --git a/rust/numaflow-models/src/models/container_template.rs b/rust/numaflow-models/src/models/container_template.rs index 71bd4e068c..2b478cadf1 100644 --- a/rust/numaflow-models/src/models/container_template.rs +++ b/rust/numaflow-models/src/models/container_template.rs @@ -26,6 +26,10 @@ pub struct ContainerTemplate { pub env_from: Option>, #[serde(rename = "imagePullPolicy", skip_serializing_if = "Option::is_none")] pub image_pull_policy: Option, + #[serde(rename = "livenessProbe", skip_serializing_if = "Option::is_none")] + pub liveness_probe: Option>, + #[serde(rename = "readinessProbe", skip_serializing_if = "Option::is_none")] + pub readiness_probe: Option>, #[serde(rename = "resources", skip_serializing_if = "Option::is_none")] pub resources: Option, #[serde(rename = "securityContext", skip_serializing_if = "Option::is_none")] @@ -39,6 +43,8 @@ impl ContainerTemplate { env: None, env_from: None, image_pull_policy: None, + liveness_probe: None, + readiness_probe: None, resources: None, security_context: None, } diff --git a/rust/numaflow-models/src/models/mod.rs b/rust/numaflow-models/src/models/mod.rs index 29846575d2..423e21fd9c 100644 --- a/rust/numaflow-models/src/models/mod.rs +++ b/rust/numaflow-models/src/models/mod.rs @@ -120,6 +120,8 @@ pub mod pipeline_spec; pub use self::pipeline_spec::PipelineSpec; pub mod pipeline_status; pub use self::pipeline_status::PipelineStatus; +pub mod probe; +pub use self::probe::Probe; pub mod redis_buffer_service; pub use self::redis_buffer_service::RedisBufferService; pub mod redis_config; diff --git a/rust/numaflow-models/src/models/probe.rs b/rust/numaflow-models/src/models/probe.rs new file mode 100644 index 0000000000..9980e9ea79 --- /dev/null +++ b/rust/numaflow-models/src/models/probe.rs @@ -0,0 +1,54 @@ +/* +Copyright 2022 The Numaproj Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by Openapi Generator. DO NOT EDIT. + +/// Probe : Probe is used to customize the configuration for Readiness and Liveness probes. + +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct Probe { + /// Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + #[serde(rename = "failureThreshold", skip_serializing_if = "Option::is_none")] + pub failure_threshold: Option, + /// Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes + #[serde( + rename = "initialDelaySeconds", + skip_serializing_if = "Option::is_none" + )] + pub initial_delay_seconds: Option, + /// How often (in seconds) to perform the probe. + #[serde(rename = "periodSeconds", skip_serializing_if = "Option::is_none")] + pub period_seconds: Option, + /// Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + #[serde(rename = "successThreshold", skip_serializing_if = "Option::is_none")] + pub success_threshold: Option, + /// Number of seconds after which the probe times out. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes + #[serde(rename = "timeoutSeconds", skip_serializing_if = "Option::is_none")] + pub timeout_seconds: Option, +} + +impl Probe { + /// Probe is used to customize the configuration for Readiness and Liveness probes. + pub fn new() -> Probe { + Probe { + failure_threshold: None, + initial_delay_seconds: None, + period_seconds: None, + success_threshold: None, + timeout_seconds: None, + } + } +} diff --git a/test/e2e/functional_test.go b/test/e2e/functional_test.go index 2d0989ac7e..1c72af9229 100644 --- a/test/e2e/functional_test.go +++ b/test/e2e/functional_test.go @@ -316,12 +316,12 @@ func (s *FunctionalSuite) TestFallbackSink() { defer w.DeletePipelineAndWait() pipelineName := "simple-fallback" - // send a message to the pipeline - w.SendMessageTo(pipelineName, "in", NewHttpPostRequest().WithBody([]byte("fallback-message"))) - // wait for all the pods to come up w.Expect().VertexPodsRunning() + // send a message to the pipeline + w.SendMessageTo(pipelineName, "in", NewHttpPostRequest().WithBody([]byte("fallback-message"))) + w.Expect().RedisSinkContains("simple-fallback-output", "fallback-message") } diff --git a/test/fixtures/util.go b/test/fixtures/util.go index c88d28d1af..13a4026384 100644 --- a/test/fixtures/util.go +++ b/test/fixtures/util.go @@ -310,7 +310,7 @@ func WaitForVertexPodRunning(kubeClient kubernetes.Interface, vertexClient flowp } ok = ok && len(podList.Items) > 0 && len(podList.Items) == vertexList.Items[0].GetReplicas() // pod number should equal to desired replicas for _, p := range podList.Items { - ok = ok && p.Status.Phase == corev1.PodRunning + ok = ok && isPodReady(p) } if ok { return nil @@ -319,6 +319,18 @@ func WaitForVertexPodRunning(kubeClient kubernetes.Interface, vertexClient flowp } } +func isPodReady(pod corev1.Pod) bool { + if pod.Status.Phase != corev1.PodRunning { + return false + } + for _, c := range pod.Status.ContainerStatuses { + if !c.Ready { + return false + } + } + return true +} + func WaitForVertexPodScalingTo(kubeClient kubernetes.Interface, vertexClient flowpkg.VertexInterface, namespace, pipelineName, vertexName string, timeout time.Duration, size int) error { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel()