diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index e087955d02a..72edd44da41 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -9652,6 +9652,14 @@ "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", "description": "LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain." }, + "matchLabelKeys": { + "description": "MatchLabelKeys is a set of pod label keys to select the pods over which spreading will be calculated. The keys are used to lookup values from the incoming pod labels, those key-value labels are ANDed with labelSelector to select the group of existing pods over which spreading will be calculated for the incoming pod. Keys that don't exist in the incoming pod labels will be ignored. A null or empty list means only match against labelSelector.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "maxSkew": { "description": "MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | | P P | P P | P | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It's a required field. Default value is 1 and 0 is not allowed.", "format": "int32", diff --git a/api/openapi-spec/v3/api__v1_openapi.json b/api/openapi-spec/v3/api__v1_openapi.json index 83771f357dd..ae075a05d2e 100644 --- a/api/openapi-spec/v3/api__v1_openapi.json +++ b/api/openapi-spec/v3/api__v1_openapi.json @@ -7251,6 +7251,15 @@ ], "description": "LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain." }, + "matchLabelKeys": { + "description": "MatchLabelKeys is a set of pod label keys to select the pods over which spreading will be calculated. The keys are used to lookup values from the incoming pod labels, those key-value labels are ANDed with labelSelector to select the group of existing pods over which spreading will be calculated for the incoming pod. Keys that don't exist in the incoming pod labels will be ignored. A null or empty list means only match against labelSelector.", + "items": { + "default": "", + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "maxSkew": { "default": 0, "description": "MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | | P P | P P | P | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It's a required field. Default value is 1 and 0 is not allowed.", diff --git a/api/openapi-spec/v3/apis__apps__v1_openapi.json b/api/openapi-spec/v3/apis__apps__v1_openapi.json index fa4975cf324..6be2b86cc3d 100644 --- a/api/openapi-spec/v3/apis__apps__v1_openapi.json +++ b/api/openapi-spec/v3/apis__apps__v1_openapi.json @@ -4348,6 +4348,15 @@ ], "description": "LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain." }, + "matchLabelKeys": { + "description": "MatchLabelKeys is a set of pod label keys to select the pods over which spreading will be calculated. The keys are used to lookup values from the incoming pod labels, those key-value labels are ANDed with labelSelector to select the group of existing pods over which spreading will be calculated for the incoming pod. Keys that don't exist in the incoming pod labels will be ignored. A null or empty list means only match against labelSelector.", + "items": { + "default": "", + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "maxSkew": { "default": 0, "description": "MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | | P P | P P | P | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It's a required field. Default value is 1 and 0 is not allowed.", diff --git a/api/openapi-spec/v3/apis__batch__v1_openapi.json b/api/openapi-spec/v3/apis__batch__v1_openapi.json index f61ecbf6e16..dcfb9c4a727 100644 --- a/api/openapi-spec/v3/apis__batch__v1_openapi.json +++ b/api/openapi-spec/v3/apis__batch__v1_openapi.json @@ -3427,6 +3427,15 @@ ], "description": "LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain." }, + "matchLabelKeys": { + "description": "MatchLabelKeys is a set of pod label keys to select the pods over which spreading will be calculated. The keys are used to lookup values from the incoming pod labels, those key-value labels are ANDed with labelSelector to select the group of existing pods over which spreading will be calculated for the incoming pod. Keys that don't exist in the incoming pod labels will be ignored. A null or empty list means only match against labelSelector.", + "items": { + "default": "", + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "maxSkew": { "default": 0, "description": "MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | | P P | P P | P | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It's a required field. Default value is 1 and 0 is not allowed.", diff --git a/pkg/api/pod/util.go b/pkg/api/pod/util.go index bf14aceed93..36e1e86c405 100644 --- a/pkg/api/pod/util.go +++ b/pkg/api/pod/util.go @@ -545,6 +545,7 @@ func dropDisabledFields( dropDisabledTopologySpreadConstraintsFields(podSpec, oldPodSpec) dropDisabledNodeInclusionPolicyFields(podSpec, oldPodSpec) + dropDisabledMatchLabelKeysField(podSpec, oldPodSpec) } // dropDisabledTopologySpreadConstraintsFields removes disabled fields from PodSpec related @@ -618,6 +619,31 @@ func dropDisabledNodeInclusionPolicyFields(podSpec, oldPodSpec *api.PodSpec) { } } +// dropDisabledMatchLabelKeysField removes disabled fields from PodSpec related +// to MatchLabelKeys only if it is not already used by the old spec. +func dropDisabledMatchLabelKeysField(podSpec, oldPodSpec *api.PodSpec) { + if !utilfeature.DefaultFeatureGate.Enabled(features.MatchLabelKeysInPodTopologySpread) && !matchLabelKeysInUse(oldPodSpec) { + for i := range podSpec.TopologySpreadConstraints { + podSpec.TopologySpreadConstraints[i].MatchLabelKeys = nil + } + } +} + +// matchLabelKeysInUse returns true if the pod spec is non-nil +// and has MatchLabelKeys field set in TopologySpreadConstraints. +func matchLabelKeysInUse(podSpec *api.PodSpec) bool { + if podSpec == nil { + return false + } + + for _, c := range podSpec.TopologySpreadConstraints { + if len(c.MatchLabelKeys) > 0 { + return true + } + } + return false +} + // nodeAffinityPolicyInUse returns true if the pod spec is non-nil and has NodeAffinityPolicy field set // in TopologySpreadConstraints func nodeAffinityPolicyInUse(podSpec *api.PodSpec) bool { diff --git a/pkg/api/pod/util_test.go b/pkg/api/pod/util_test.go index 130d7c79286..c536cc006ff 100644 --- a/pkg/api/pod/util_test.go +++ b/pkg/api/pod/util_test.go @@ -1814,3 +1814,138 @@ func TestDropNodeInclusionPolicyFields(t *testing.T) { }) } } + +func TestDropDisabledMatchLabelKeysField(t *testing.T) { + tests := []struct { + name string + enabled bool + podSpec *api.PodSpec + oldPodSpec *api.PodSpec + wantPodSpec *api.PodSpec + }{ + { + name: "feature disabled, both pods don't use MatchLabelKeys fields", + enabled: false, + oldPodSpec: &api.PodSpec{ + TopologySpreadConstraints: []api.TopologySpreadConstraint{}, + }, + podSpec: &api.PodSpec{ + TopologySpreadConstraints: []api.TopologySpreadConstraint{}, + }, + wantPodSpec: &api.PodSpec{ + TopologySpreadConstraints: []api.TopologySpreadConstraint{}, + }, + }, + { + name: "feature disabled, only old pod uses MatchLabelKeys field", + enabled: false, + oldPodSpec: &api.PodSpec{ + TopologySpreadConstraints: []api.TopologySpreadConstraint{ + {MatchLabelKeys: []string{"foo"}}, + }, + }, + podSpec: &api.PodSpec{ + TopologySpreadConstraints: []api.TopologySpreadConstraint{}, + }, + wantPodSpec: &api.PodSpec{ + TopologySpreadConstraints: []api.TopologySpreadConstraint{}, + }, + }, + { + name: "feature disabled, only current pod uses MatchLabelKeys field", + enabled: false, + oldPodSpec: &api.PodSpec{ + TopologySpreadConstraints: []api.TopologySpreadConstraint{}, + }, + podSpec: &api.PodSpec{ + TopologySpreadConstraints: []api.TopologySpreadConstraint{ + {MatchLabelKeys: []string{"foo"}}, + }, + }, + wantPodSpec: &api.PodSpec{ + TopologySpreadConstraints: []api.TopologySpreadConstraint{{}}, + }, + }, + { + name: "feature disabled, both pods use MatchLabelKeys fields", + enabled: false, + oldPodSpec: &api.PodSpec{ + TopologySpreadConstraints: []api.TopologySpreadConstraint{ + {MatchLabelKeys: []string{"foo"}}, + }, + }, + podSpec: &api.PodSpec{ + TopologySpreadConstraints: []api.TopologySpreadConstraint{ + {MatchLabelKeys: []string{"foo"}}, + }, + }, + wantPodSpec: &api.PodSpec{ + TopologySpreadConstraints: []api.TopologySpreadConstraint{ + {MatchLabelKeys: []string{"foo"}}, + }, + }, + }, + { + name: "feature enabled, only old pod uses MatchLabelKeys field", + enabled: true, + oldPodSpec: &api.PodSpec{ + TopologySpreadConstraints: []api.TopologySpreadConstraint{ + {MatchLabelKeys: []string{"foo"}}, + }, + }, + podSpec: &api.PodSpec{ + TopologySpreadConstraints: []api.TopologySpreadConstraint{}, + }, + wantPodSpec: &api.PodSpec{ + TopologySpreadConstraints: []api.TopologySpreadConstraint{}, + }, + }, + { + name: "feature enabled, only current pod uses MatchLabelKeys field", + enabled: true, + oldPodSpec: &api.PodSpec{ + TopologySpreadConstraints: []api.TopologySpreadConstraint{}, + }, + podSpec: &api.PodSpec{ + TopologySpreadConstraints: []api.TopologySpreadConstraint{ + {MatchLabelKeys: []string{"foo"}}, + }, + }, + wantPodSpec: &api.PodSpec{ + TopologySpreadConstraints: []api.TopologySpreadConstraint{ + {MatchLabelKeys: []string{"foo"}}, + }, + }, + }, + { + name: "feature enabled, both pods use MatchLabelKeys fields", + enabled: false, + oldPodSpec: &api.PodSpec{ + TopologySpreadConstraints: []api.TopologySpreadConstraint{ + {MatchLabelKeys: []string{"foo"}}, + }, + }, + podSpec: &api.PodSpec{ + TopologySpreadConstraints: []api.TopologySpreadConstraint{ + {MatchLabelKeys: []string{"foo"}}, + }, + }, + wantPodSpec: &api.PodSpec{ + TopologySpreadConstraints: []api.TopologySpreadConstraint{ + {MatchLabelKeys: []string{"foo"}}, + }, + }, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.MatchLabelKeysInPodTopologySpread, test.enabled)() + + dropDisabledFields(test.podSpec, nil, test.oldPodSpec, nil) + if diff := cmp.Diff(test.wantPodSpec, test.podSpec); diff != "" { + t.Errorf("unexpected pod spec (-want, +got):\n%s", diff) + } + }) + } +} diff --git a/pkg/apis/core/types.go b/pkg/apis/core/types.go index d5d86b7d1b9..8d49b3bd3a4 100644 --- a/pkg/apis/core/types.go +++ b/pkg/apis/core/types.go @@ -5733,6 +5733,15 @@ type TopologySpreadConstraint struct { // This is a alpha-level feature enabled by the NodeInclusionPolicyInPodTopologySpread feature flag. // +optional NodeTaintsPolicy *NodeInclusionPolicy + // MatchLabelKeys is a set of pod label keys to select the pods over which + // spreading will be calculated. The keys are used to lookup values from the + // incoming pod labels, those key-value labels are ANDed with labelSelector + // to select the group of existing pods over which spreading will be calculated + // for the incoming pod. Keys that don't exist in the incoming pod labels will + // be ignored. A null or empty list means only match against labelSelector. + // +listType=atomic + // +optional + MatchLabelKeys []string } // These are the built-in errors for PortStatus. diff --git a/pkg/apis/core/v1/zz_generated.conversion.go b/pkg/apis/core/v1/zz_generated.conversion.go index 7bbf7d5e98b..686c22e5a3a 100644 --- a/pkg/apis/core/v1/zz_generated.conversion.go +++ b/pkg/apis/core/v1/zz_generated.conversion.go @@ -7999,6 +7999,7 @@ func autoConvert_v1_TopologySpreadConstraint_To_core_TopologySpreadConstraint(in out.MinDomains = (*int32)(unsafe.Pointer(in.MinDomains)) out.NodeAffinityPolicy = (*core.NodeInclusionPolicy)(unsafe.Pointer(in.NodeAffinityPolicy)) out.NodeTaintsPolicy = (*core.NodeInclusionPolicy)(unsafe.Pointer(in.NodeTaintsPolicy)) + out.MatchLabelKeys = *(*[]string)(unsafe.Pointer(&in.MatchLabelKeys)) return nil } @@ -8015,6 +8016,7 @@ func autoConvert_core_TopologySpreadConstraint_To_v1_TopologySpreadConstraint(in out.MinDomains = (*int32)(unsafe.Pointer(in.MinDomains)) out.NodeAffinityPolicy = (*v1.NodeInclusionPolicy)(unsafe.Pointer(in.NodeAffinityPolicy)) out.NodeTaintsPolicy = (*v1.NodeInclusionPolicy)(unsafe.Pointer(in.NodeTaintsPolicy)) + out.MatchLabelKeys = *(*[]string)(unsafe.Pointer(&in.MatchLabelKeys)) return nil } diff --git a/pkg/apis/core/validation/validation.go b/pkg/apis/core/validation/validation.go index 4992a928ada..a5e24e83cad 100644 --- a/pkg/apis/core/validation/validation.go +++ b/pkg/apis/core/validation/validation.go @@ -6520,6 +6520,7 @@ func validateTopologySpreadConstraints(constraints []core.TopologySpreadConstrai if err := validateNodeInclusionPolicy(subFldPath.Child("nodeTaintsPolicy"), constraint.NodeTaintsPolicy); err != nil { allErrs = append(allErrs, err) } + allErrs = append(allErrs, validateMatchLabelKeys(subFldPath.Child("matchLabelKeys"), constraint.MatchLabelKeys, constraint.LabelSelector)...) } return allErrs @@ -6593,6 +6594,33 @@ func validateNodeInclusionPolicy(fldPath *field.Path, policy *core.NodeInclusion return nil } +// validateMatchLabelKeys tests that the elements are a valid label name and are not already included in labelSelector. +func validateMatchLabelKeys(fldPath *field.Path, matchLabelKeys []string, labelSelector *metav1.LabelSelector) field.ErrorList { + if len(matchLabelKeys) == 0 { + return nil + } + + labelSelectorKeys := sets.String{} + if labelSelector != nil { + for key := range labelSelector.MatchLabels { + labelSelectorKeys.Insert(key) + } + for _, matchExpression := range labelSelector.MatchExpressions { + labelSelectorKeys.Insert(matchExpression.Key) + } + } + + allErrs := field.ErrorList{} + for i, key := range matchLabelKeys { + allErrs = append(allErrs, unversionedvalidation.ValidateLabelName(key, fldPath.Index(i))...) + if labelSelectorKeys.Has(key) { + allErrs = append(allErrs, field.Invalid(fldPath.Index(i), key, "exists in both matchLabelKeys and labelSelector")) + } + } + + return allErrs +} + // ValidateServiceClusterIPsRelatedFields validates .spec.ClusterIPs,, // .spec.IPFamilies, .spec.ipFamilyPolicy. This is exported because it is used // during IP init and allocation. diff --git a/pkg/apis/core/validation/validation_test.go b/pkg/apis/core/validation/validation_test.go index 3fa96c85a14..ce7008bdbc8 100644 --- a/pkg/apis/core/validation/validation_test.go +++ b/pkg/apis/core/validation/validation_test.go @@ -19539,6 +19539,7 @@ func TestValidateTopologySpreadConstraints(t *testing.T) { fieldPathTopologyKey := subFldPath0.Child("topologyKey") fieldPathWhenUnsatisfiable := subFldPath0.Child("whenUnsatisfiable") fieldPathTopologyKeyAndWhenUnsatisfiable := subFldPath0.Child("{topologyKey, whenUnsatisfiable}") + fieldPathMatchLabelKeys := subFldPath0.Child("matchLabelKeys") nodeAffinityField := subFldPath0.Child("nodeAffinityPolicy") nodeTaintsField := subFldPath0.Child("nodeTaintsPolicy") unknown := core.NodeInclusionPolicy("Unknown") @@ -19717,6 +19718,39 @@ func TestValidateTopologySpreadConstraints(t *testing.T) { field.NotSupported(nodeTaintsField, &unknown, supportedPodTopologySpreadNodePolicies.List()), }, }, + { + name: "key in MatchLabelKeys isn't correctly defined", + constraints: []core.TopologySpreadConstraint{ + { + MaxSkew: 1, + TopologyKey: "k8s.io/zone", + WhenUnsatisfiable: core.DoNotSchedule, + MatchLabelKeys: []string{"/simple"}, + }, + }, + wantFieldErrors: []*field.Error{field.Invalid(fieldPathMatchLabelKeys.Index(0), "/simple", "prefix part must be non-empty")}, + }, + { + name: "key exists in both matchLabelKeys and labelSelector", + constraints: []core.TopologySpreadConstraint{ + { + MaxSkew: 1, + TopologyKey: "k8s.io/zone", + WhenUnsatisfiable: core.DoNotSchedule, + MatchLabelKeys: []string{"foo"}, + LabelSelector: &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{ + { + Key: "foo", + Operator: metav1.LabelSelectorOpNotIn, + Values: []string{"value1", "value2"}, + }, + }, + }, + }, + }, + wantFieldErrors: []*field.Error{field.Invalid(fieldPathMatchLabelKeys.Index(0), "foo", "exists in both matchLabelKeys and labelSelector")}, + }, } for _, tc := range testCases { diff --git a/pkg/apis/core/zz_generated.deepcopy.go b/pkg/apis/core/zz_generated.deepcopy.go index dc48711ad72..2c8da9001fd 100644 --- a/pkg/apis/core/zz_generated.deepcopy.go +++ b/pkg/apis/core/zz_generated.deepcopy.go @@ -5649,6 +5649,11 @@ func (in *TopologySpreadConstraint) DeepCopyInto(out *TopologySpreadConstraint) *out = new(NodeInclusionPolicy) **out = **in } + if in.MatchLabelKeys != nil { + in, out := &in.MatchLabelKeys, &out.MatchLabelKeys + *out = make([]string, len(*in)) + copy(*out, *in) + } return } diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index c64c836ed07..9d7678a71cd 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -518,6 +518,13 @@ const ( // Enables scaling down replicas via logarithmic comparison of creation/ready timestamps LogarithmicScaleDown featuregate.Feature = "LogarithmicScaleDown" + // owner: @denkensk + // kep: http://kep.k8s.io/3243 + // alpha: v1.25 + // + // Enable MatchLabelKeys in PodTopologySpread. + MatchLabelKeysInPodTopologySpread featuregate.Feature = "MatchLabelKeysInPodTopologySpread" + // owner: @krmayankk // alpha: v1.24 // @@ -951,6 +958,8 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS LogarithmicScaleDown: {Default: true, PreRelease: featuregate.Beta}, + MatchLabelKeysInPodTopologySpread: {Default: false, PreRelease: featuregate.Alpha}, + MaxUnavailableStatefulSet: {Default: false, PreRelease: featuregate.Alpha}, MemoryManager: {Default: true, PreRelease: featuregate.Beta}, diff --git a/pkg/generated/openapi/zz_generated.openapi.go b/pkg/generated/openapi/zz_generated.openapi.go index 44fc265da72..5304cbffc5a 100644 --- a/pkg/generated/openapi/zz_generated.openapi.go +++ b/pkg/generated/openapi/zz_generated.openapi.go @@ -25478,6 +25478,26 @@ func schema_k8sio_api_core_v1_TopologySpreadConstraint(ref common.ReferenceCallb Format: "", }, }, + "matchLabelKeys": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "MatchLabelKeys is a set of pod label keys to select the pods over which spreading will be calculated. The keys are used to lookup values from the incoming pod labels, those key-value labels are ANDed with labelSelector to select the group of existing pods over which spreading will be calculated for the incoming pod. Keys that don't exist in the incoming pod labels will be ignored. A null or empty list means only match against labelSelector.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, }, Required: []string{"maxSkew", "topologyKey", "whenUnsatisfiable"}, }, diff --git a/pkg/scheduler/framework/plugins/defaultpreemption/default_preemption_test.go b/pkg/scheduler/framework/plugins/defaultpreemption/default_preemption_test.go index ebbbcaf7291..9cc7641a5cd 100644 --- a/pkg/scheduler/framework/plugins/defaultpreemption/default_preemption_test.go +++ b/pkg/scheduler/framework/plugins/defaultpreemption/default_preemption_test.go @@ -644,8 +644,8 @@ func TestDryRunPreemption(t *testing.T) { nodeNames: []string{"node-a/zone1", "node-b/zone1", "node-x/zone2"}, testPods: []*v1.Pod{ st.MakePod().Name("p").UID("p").Label("foo", "").Priority(highPriority). - SpreadConstraint(1, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil). - SpreadConstraint(1, "hostname", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, nil). + SpreadConstraint(1, "hostname", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, nil). Obj(), }, initPods: []*v1.Pod{ @@ -1486,8 +1486,8 @@ func TestPreempt(t *testing.T) { { name: "preemption for topology spread constraints", pod: st.MakePod().Name("p").UID("p").Namespace(v1.NamespaceDefault).Label("foo", "").Priority(highPriority). - SpreadConstraint(1, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil). - SpreadConstraint(1, "hostname", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, nil). + SpreadConstraint(1, "hostname", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, nil). Obj(), pods: []*v1.Pod{ st.MakePod().Name("p-a1").UID("p-a1").Namespace(v1.NamespaceDefault).Node("node-a").Label("foo", "").Priority(highPriority).Obj(), diff --git a/pkg/scheduler/framework/plugins/feature/feature.go b/pkg/scheduler/framework/plugins/feature/feature.go index 32be4e2dce8..55bd2991518 100644 --- a/pkg/scheduler/framework/plugins/feature/feature.go +++ b/pkg/scheduler/framework/plugins/feature/feature.go @@ -24,4 +24,5 @@ type Features struct { EnableVolumeCapacityPriority bool EnableMinDomainsInPodTopologySpread bool EnableNodeInclusionPolicyInPodTopologySpread bool + EnableMatchLabelKeysInPodTopologySpread bool } diff --git a/pkg/scheduler/framework/plugins/podtopologyspread/common.go b/pkg/scheduler/framework/plugins/podtopologyspread/common.go index 29c61a4c770..c7f4d19287a 100644 --- a/pkg/scheduler/framework/plugins/podtopologyspread/common.go +++ b/pkg/scheduler/framework/plugins/podtopologyspread/common.go @@ -63,7 +63,7 @@ func (tsc *topologySpreadConstraint) matchNodeInclusionPolicies(pod *v1.Pod, nod // .DefaultConstraints and the selectors from the services, replication // controllers, replica sets and stateful sets that match the pod. func (pl *PodTopologySpread) buildDefaultConstraints(p *v1.Pod, action v1.UnsatisfiableConstraintAction) ([]topologySpreadConstraint, error) { - constraints, err := filterTopologySpreadConstraints(pl.defaultConstraints, action, pl.enableMinDomainsInPodTopologySpread, pl.enableNodeInclusionPolicyInPodTopologySpread) + constraints, err := pl.filterTopologySpreadConstraints(pl.defaultConstraints, p.Labels, action) if err != nil || len(constraints) == 0 { return nil, err } @@ -87,7 +87,7 @@ func nodeLabelsMatchSpreadConstraints(nodeLabels map[string]string, constraints return true } -func filterTopologySpreadConstraints(constraints []v1.TopologySpreadConstraint, action v1.UnsatisfiableConstraintAction, enableMinDomainsInPodTopologySpread, enableNodeInclusionPolicyInPodTopologySpread bool) ([]topologySpreadConstraint, error) { +func (pl *PodTopologySpread) filterTopologySpreadConstraints(constraints []v1.TopologySpreadConstraint, podLabels map[string]string, action v1.UnsatisfiableConstraintAction) ([]topologySpreadConstraint, error) { var result []topologySpreadConstraint for _, c := range constraints { if c.WhenUnsatisfiable == action { @@ -95,6 +95,19 @@ func filterTopologySpreadConstraints(constraints []v1.TopologySpreadConstraint, if err != nil { return nil, err } + + if pl.enableMatchLabelKeysInPodTopologySpread && len(c.MatchLabelKeys) > 0 { + matchLabels := make(labels.Set) + for _, labelKey := range c.MatchLabelKeys { + if value, ok := podLabels[labelKey]; ok { + matchLabels[labelKey] = value + } + } + if len(matchLabels) > 0 { + selector = mergeLabelSetWithSelector(matchLabels, selector) + } + } + tsc := topologySpreadConstraint{ MaxSkew: c.MaxSkew, TopologyKey: c.TopologyKey, @@ -103,10 +116,10 @@ func filterTopologySpreadConstraints(constraints []v1.TopologySpreadConstraint, NodeAffinityPolicy: v1.NodeInclusionPolicyHonor, // If NodeAffinityPolicy is nil, we treat NodeAffinityPolicy as "Honor". NodeTaintsPolicy: v1.NodeInclusionPolicyIgnore, // If NodeTaintsPolicy is nil, we treat NodeTaintsPolicy as "Ignore". } - if enableMinDomainsInPodTopologySpread && c.MinDomains != nil { + if pl.enableMinDomainsInPodTopologySpread && c.MinDomains != nil { tsc.MinDomains = *c.MinDomains } - if enableNodeInclusionPolicyInPodTopologySpread { + if pl.enableNodeInclusionPolicyInPodTopologySpread { if c.NodeAffinityPolicy != nil { tsc.NodeAffinityPolicy = *c.NodeAffinityPolicy } @@ -120,6 +133,17 @@ func filterTopologySpreadConstraints(constraints []v1.TopologySpreadConstraint, return result, nil } +func mergeLabelSetWithSelector(matchLabels labels.Set, s labels.Selector) labels.Selector { + mergedSelector := labels.SelectorFromSet(matchLabels) + if requirements, ok := s.Requirements(); ok { + for _, r := range requirements { + mergedSelector = mergedSelector.Add(r) + } + } + + return mergedSelector +} + func countPodsMatchSelector(podInfos []*framework.PodInfo, selector labels.Selector, ns string) int { count := 0 for _, p := range podInfos { diff --git a/pkg/scheduler/framework/plugins/podtopologyspread/filtering.go b/pkg/scheduler/framework/plugins/podtopologyspread/filtering.go index 8e2f03225fd..800f2b4d755 100644 --- a/pkg/scheduler/framework/plugins/podtopologyspread/filtering.go +++ b/pkg/scheduler/framework/plugins/podtopologyspread/filtering.go @@ -244,11 +244,10 @@ func (pl *PodTopologySpread) calPreFilterState(ctx context.Context, pod *v1.Pod) if len(pod.Spec.TopologySpreadConstraints) > 0 { // We have feature gating in APIServer to strip the spec // so don't need to re-check feature gate, just check length of Constraints. - constraints, err = filterTopologySpreadConstraints( + constraints, err = pl.filterTopologySpreadConstraints( pod.Spec.TopologySpreadConstraints, + pod.Labels, v1.DoNotSchedule, - pl.enableMinDomainsInPodTopologySpread, - pl.enableNodeInclusionPolicyInPodTopologySpread, ) if err != nil { return nil, fmt.Errorf("obtaining pod's hard topology spread constraints: %w", err) diff --git a/pkg/scheduler/framework/plugins/podtopologyspread/filtering_test.go b/pkg/scheduler/framework/plugins/podtopologyspread/filtering_test.go index 0184df35090..cd7ea098e3f 100644 --- a/pkg/scheduler/framework/plugins/podtopologyspread/filtering_test.go +++ b/pkg/scheduler/framework/plugins/podtopologyspread/filtering_test.go @@ -55,7 +55,8 @@ var ( honorPolicy = v1.NodeInclusionPolicyHonor fooSelector = st.MakeLabelSelector().Exists("foo").Obj() barSelector = st.MakeLabelSelector().Exists("bar").Obj() - taints = []v1.Taint{{Key: v1.TaintNodeUnschedulable, Value: "", Effect: v1.TaintEffectPreferNoSchedule}} + + taints = []v1.Taint{{Key: v1.TaintNodeUnschedulable, Value: "", Effect: v1.TaintEffectPreferNoSchedule}} ) func (p *criticalPaths) sort() { @@ -77,11 +78,12 @@ func TestPreFilterState(t *testing.T) { want *preFilterState enableMinDomains bool enableNodeInclustionPolicy bool + enableMatchLabelKeys bool }{ { name: "clean cluster with one spreadConstraint", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(5, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Label("foo", "bar").Obj(), nil, nil, nil). + SpreadConstraint(5, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Label("foo", "bar").Obj(), nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -112,7 +114,7 @@ func TestPreFilterState(t *testing.T) { { name: "normal case with one spreadConstraint", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -150,7 +152,7 @@ func TestPreFilterState(t *testing.T) { { name: "normal case with one spreadConstraint, on a 3-zone cluster", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -191,7 +193,7 @@ func TestPreFilterState(t *testing.T) { { name: "namespace mismatch doesn't count", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -229,8 +231,8 @@ func TestPreFilterState(t *testing.T) { { name: "normal case with two spreadConstraints", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -283,10 +285,10 @@ func TestPreFilterState(t *testing.T) { { name: "soft spreadConstraints should be bypassed", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.ScheduleAnyway, fooSelector, nil, nil, nil). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). - SpreadConstraint(1, "node", v1.ScheduleAnyway, fooSelector, nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -337,8 +339,8 @@ func TestPreFilterState(t *testing.T) { { name: "different labelSelectors - simple version", pod: st.MakePod().Name("p").Label("foo", "").Label("bar", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -384,8 +386,8 @@ func TestPreFilterState(t *testing.T) { { name: "different labelSelectors - complex pods", pod: st.MakePod().Name("p").Label("foo", "").Label("bar", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -437,8 +439,8 @@ func TestPreFilterState(t *testing.T) { name: "two spreadConstraints, and with podAffinity", pod: st.MakePod().Name("p").Label("foo", ""). NodeAffinityNotIn("node", []string{"node-x"}). // exclude node-x - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -538,8 +540,8 @@ func TestPreFilterState(t *testing.T) { { name: "default constraints and a service, but pod has constraints", pod: st.MakePod().Name("p").Label("foo", "bar").Label("baz", "tar"). - SpreadConstraint(1, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Label("baz", "tar").Obj(), nil, nil, nil). - SpreadConstraint(2, "planet", v1.ScheduleAnyway, st.MakeLabelSelector().Label("fot", "rok").Obj(), nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Label("baz", "tar").Obj(), nil, nil, nil, nil). + SpreadConstraint(2, "planet", v1.ScheduleAnyway, st.MakeLabelSelector().Label("fot", "rok").Obj(), nil, nil, nil, nil). Obj(), defaultConstraints: []v1.TopologySpreadConstraint{ {MaxSkew: 2, TopologyKey: "node", WhenUnsatisfiable: v1.DoNotSchedule}, @@ -578,8 +580,8 @@ func TestPreFilterState(t *testing.T) { { name: "TpKeyToDomainsNum is calculated when MinDomains is enabled", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -638,7 +640,7 @@ func TestPreFilterState(t *testing.T) { name: "feature gate disabled with NodeAffinityPolicy", pod: st.MakePod().Name("p").Label("foo", ""). NodeSelector(map[string]string{"foo": ""}). - SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Label("foo", "").Obj(), @@ -676,7 +678,7 @@ func TestPreFilterState(t *testing.T) { name: "NodeAffinityPolicy honored with labelSelectors", pod: st.MakePod().Name("p").Label("foo", ""). NodeSelector(map[string]string{"foo": ""}). - SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Label("foo", "").Obj(), @@ -714,7 +716,7 @@ func TestPreFilterState(t *testing.T) { name: "NodeAffinityPolicy ignored with labelSelectors", pod: st.MakePod().Name("p").Label("foo", ""). NodeSelector(map[string]string{"foo": ""}). - SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, &ignorePolicy, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, &ignorePolicy, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Label("foo", "").Obj(), @@ -753,7 +755,7 @@ func TestPreFilterState(t *testing.T) { name: "NodeAffinityPolicy honored with nodeAffinity", pod: st.MakePod().Name("p").Label("foo", ""). NodeAffinityIn("foo", []string{""}). - SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Label("foo", "").Obj(), @@ -791,7 +793,7 @@ func TestPreFilterState(t *testing.T) { name: "NodeAffinityPolicy ignored with nodeAffinity", pod: st.MakePod().Name("p").Label("foo", ""). NodeAffinityIn("foo", []string{""}). - SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, &ignorePolicy, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, &ignorePolicy, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Label("foo", "").Obj(), @@ -829,7 +831,7 @@ func TestPreFilterState(t *testing.T) { { name: "feature gate disabled with NodeTaintsPolicy", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Obj(), @@ -867,7 +869,7 @@ func TestPreFilterState(t *testing.T) { { name: "NodeTaintsPolicy ignored", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Obj(), @@ -905,7 +907,7 @@ func TestPreFilterState(t *testing.T) { { name: "NodeTaintsPolicy honored", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, &honorPolicy). + SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, &honorPolicy, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Obj(), @@ -943,7 +945,7 @@ func TestPreFilterState(t *testing.T) { name: "NodeTaintsPolicy honored with tolerated taints", pod: st.MakePod().Name("p").Label("foo", ""). Toleration(v1.TaintNodeUnschedulable). - SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, &honorPolicy). + SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, &honorPolicy, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Obj(), @@ -982,8 +984,8 @@ func TestPreFilterState(t *testing.T) { name: "two node inclusion Constraints, zone: honor/ignore, node: ignore/ignore", pod: st.MakePod().Name("p").Label("foo", ""). NodeSelector(map[string]string{"foo": ""}). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, &ignorePolicy, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, &ignorePolicy, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Label("foo", "").Obj(), @@ -1031,8 +1033,8 @@ func TestPreFilterState(t *testing.T) { { name: "two node inclusion Constraints, zone: honor/honor, node: honor/ignore", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, &honorPolicy). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, &honorPolicy, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Label("foo", "").Obj(), @@ -1081,8 +1083,8 @@ func TestPreFilterState(t *testing.T) { name: "two node inclusion Constraints, zone: honor/ignore, node: honor/ignore", pod: st.MakePod().Name("p").Label("foo", ""). NodeSelector(map[string]string{"foo": ""}). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -1132,8 +1134,8 @@ func TestPreFilterState(t *testing.T) { name: "two node inclusion Constraints, zone: ignore/ignore, node: honor/honor", pod: st.MakePod().Name("p").Label("foo", ""). NodeSelector(map[string]string{"foo": ""}). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, &ignorePolicy, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, &honorPolicy). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, &ignorePolicy, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, &honorPolicy, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -1180,6 +1182,162 @@ func TestPreFilterState(t *testing.T) { }, enableNodeInclustionPolicy: true, }, + { + name: "matchLabelKeys ignored when feature gate disabled", + pod: st.MakePod().Name("p").Label("foo", "").Label("bar", ""). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, []string{"bar"}). + Obj(), + nodes: []*v1.Node{ + st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), + st.MakeNode().Name("node-b").Label("zone", "zone1").Label("node", "node-b").Obj(), + st.MakeNode().Name("node-x").Label("zone", "zone2").Label("node", "node-x").Obj(), + st.MakeNode().Name("node-y").Label("zone", "zone2").Label("node", "node-y").Obj(), + }, + existingPods: []*v1.Pod{ + st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(), + st.MakePod().Name("p-a2").Node("node-a").Label("foo", "").Obj(), + st.MakePod().Name("p-b1").Node("node-b").Label("foo", "").Obj(), + st.MakePod().Name("p-y1").Node("node-y").Label("foo", "").Obj(), + st.MakePod().Name("p-y2").Node("node-y").Label("foo", "").Obj(), + }, + want: &preFilterState{ + Constraints: []topologySpreadConstraint{ + { + MaxSkew: 1, + TopologyKey: "zone", + Selector: mustConvertLabelSelectorAsSelector(t, fooSelector), + MinDomains: 1, + NodeAffinityPolicy: v1.NodeInclusionPolicyHonor, + NodeTaintsPolicy: v1.NodeInclusionPolicyIgnore, + }, + }, + TpKeyToCriticalPaths: map[string]*criticalPaths{ + "zone": {{"zone2", 2}, {"zone1", 3}}, + }, + TpPairToMatchNum: map[topologyPair]int{ + {key: "zone", value: "zone1"}: 3, + {key: "zone", value: "zone2"}: 2, + }, + }, + enableMatchLabelKeys: false, + }, + { + name: "matchLabelKeys ANDed with LabelSelector when LabelSelector isn't empty", + pod: st.MakePod().Name("p").Label("foo", "").Label("bar", "a"). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, []string{"bar"}). + Obj(), + nodes: []*v1.Node{ + st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), + st.MakeNode().Name("node-b").Label("zone", "zone1").Label("node", "node-b").Obj(), + st.MakeNode().Name("node-x").Label("zone", "zone2").Label("node", "node-x").Obj(), + st.MakeNode().Name("node-y").Label("zone", "zone2").Label("node", "node-y").Obj(), + }, + existingPods: []*v1.Pod{ + st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(), + st.MakePod().Name("p-a2").Node("node-a").Label("foo", "").Label("bar", "a").Obj(), + st.MakePod().Name("p-b1").Node("node-b").Label("foo", "").Obj(), + st.MakePod().Name("p-y1").Node("node-y").Label("foo", "").Label("bar", "a").Obj(), + st.MakePod().Name("p-y2").Node("node-y").Label("bar", "").Obj(), + }, + want: &preFilterState{ + Constraints: []topologySpreadConstraint{ + { + MaxSkew: 1, + TopologyKey: "zone", + Selector: mustConvertLabelSelectorAsSelector(t, st.MakeLabelSelector().Exists("foo").Label("bar", "a").Obj()), + MinDomains: 1, + NodeAffinityPolicy: v1.NodeInclusionPolicyHonor, + NodeTaintsPolicy: v1.NodeInclusionPolicyIgnore, + }, + }, + TpKeyToCriticalPaths: map[string]*criticalPaths{ + "zone": {{"zone2", 1}, {"zone1", 1}}, + }, + TpPairToMatchNum: map[topologyPair]int{ + {key: "zone", value: "zone1"}: 1, + {key: "zone", value: "zone2"}: 1, + }, + }, + enableMatchLabelKeys: true, + }, + { + name: "matchLabelKeys ANDed with LabelSelector when LabelSelector is empty", + pod: st.MakePod().Name("p").Label("foo", "a"). + SpreadConstraint(1, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Obj(), nil, nil, nil, []string{"foo"}). + Obj(), + nodes: []*v1.Node{ + st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), + st.MakeNode().Name("node-b").Label("zone", "zone1").Label("node", "node-b").Obj(), + st.MakeNode().Name("node-x").Label("zone", "zone2").Label("node", "node-x").Obj(), + st.MakeNode().Name("node-y").Label("zone", "zone2").Label("node", "node-y").Obj(), + }, + existingPods: []*v1.Pod{ + st.MakePod().Name("p-a1").Node("node-a").Label("foo", "a").Obj(), + st.MakePod().Name("p-a2").Node("node-a").Label("foo", "a").Obj(), + st.MakePod().Name("p-b1").Node("node-b").Label("foo", "a").Obj(), + st.MakePod().Name("p-y1").Node("node-y").Label("foo", "a").Obj(), + st.MakePod().Name("p-y2").Node("node-y").Label("foo", "a").Obj(), + }, + want: &preFilterState{ + Constraints: []topologySpreadConstraint{ + { + MaxSkew: 1, + TopologyKey: "zone", + Selector: mustConvertLabelSelectorAsSelector(t, st.MakeLabelSelector().Label("foo", "a").Obj()), + MinDomains: 1, + NodeAffinityPolicy: v1.NodeInclusionPolicyHonor, + NodeTaintsPolicy: v1.NodeInclusionPolicyIgnore, + }, + }, + TpKeyToCriticalPaths: map[string]*criticalPaths{ + "zone": {{"zone2", 2}, {"zone1", 3}}, + }, + TpPairToMatchNum: map[topologyPair]int{ + {key: "zone", value: "zone1"}: 3, + {key: "zone", value: "zone2"}: 2, + }, + }, + enableMatchLabelKeys: true, + }, + { + name: "key in matchLabelKeys is ignored when it isn't exist in pod.labels", + pod: st.MakePod().Name("p").Label("foo", ""). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, []string{"bar"}). + Obj(), + nodes: []*v1.Node{ + st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), + st.MakeNode().Name("node-b").Label("zone", "zone1").Label("node", "node-b").Obj(), + st.MakeNode().Name("node-x").Label("zone", "zone2").Label("node", "node-x").Obj(), + st.MakeNode().Name("node-y").Label("zone", "zone2").Label("node", "node-y").Obj(), + }, + existingPods: []*v1.Pod{ + st.MakePod().Name("p-a1").Node("node-a").Label("foo", "a").Obj(), + st.MakePod().Name("p-a2").Node("node-a").Label("foo", "a").Obj(), + st.MakePod().Name("p-b1").Node("node-b").Label("foo", "a").Obj(), + st.MakePod().Name("p-y1").Node("node-y").Label("foo", "a").Obj(), + st.MakePod().Name("p-y2").Node("node-y").Label("foo", "a").Obj(), + }, + want: &preFilterState{ + Constraints: []topologySpreadConstraint{ + { + MaxSkew: 1, + TopologyKey: "zone", + Selector: mustConvertLabelSelectorAsSelector(t, fooSelector), + MinDomains: 1, + NodeAffinityPolicy: v1.NodeInclusionPolicyHonor, + NodeTaintsPolicy: v1.NodeInclusionPolicyIgnore, + }, + }, + TpKeyToCriticalPaths: map[string]*criticalPaths{ + "zone": {{"zone2", 2}, {"zone1", 3}}, + }, + TpPairToMatchNum: map[topologyPair]int{ + {key: "zone", value: "zone1"}: 3, + {key: "zone", value: "zone2"}: 2, + }, + }, + enableMatchLabelKeys: true, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -1193,6 +1351,7 @@ func TestPreFilterState(t *testing.T) { p := plugintesting.SetupPluginWithInformers(ctx, t, topologySpreadFunc, args, cache.NewSnapshot(tt.existingPods, tt.nodes), tt.objs) p.(*PodTopologySpread).enableMinDomainsInPodTopologySpread = tt.enableMinDomains p.(*PodTopologySpread).enableNodeInclusionPolicyInPodTopologySpread = tt.enableNodeInclustionPolicy + p.(*PodTopologySpread).enableMatchLabelKeysInPodTopologySpread = tt.enableMatchLabelKeys cs := framework.NewCycleState() if _, s := p.(*PodTopologySpread).PreFilter(ctx, cs, tt.pod); !s.IsSuccess() { @@ -1233,7 +1392,7 @@ func TestPreFilterStateAddPod(t *testing.T) { { name: "node a and b both impact current min match", preemptor: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), addedPod: st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(), existingPods: nil, // it's an empty cluster @@ -1256,7 +1415,7 @@ func TestPreFilterStateAddPod(t *testing.T) { { name: "only node a impacts current min match", preemptor: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), addedPod: st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(), existingPods: []*v1.Pod{ @@ -1281,7 +1440,7 @@ func TestPreFilterStateAddPod(t *testing.T) { { name: "add a pod in a different namespace doesn't change topologyKeyToMinPodsMap", preemptor: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), addedPod: st.MakePod().Name("p-a1").Namespace("ns1").Node("node-a").Label("foo", "").Obj(), existingPods: []*v1.Pod{ @@ -1306,7 +1465,7 @@ func TestPreFilterStateAddPod(t *testing.T) { { name: "add pod on non-critical node won't trigger re-calculation", preemptor: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), addedPod: st.MakePod().Name("p-b2").Node("node-b").Label("foo", "").Obj(), existingPods: []*v1.Pod{ @@ -1331,8 +1490,8 @@ func TestPreFilterStateAddPod(t *testing.T) { { name: "node a and x both impact topologyKeyToMinPodsMap on zone and node", preemptor: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), addedPod: st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(), existingPods: nil, // it's an empty cluster @@ -1358,8 +1517,8 @@ func TestPreFilterStateAddPod(t *testing.T) { { name: "only node a impacts topologyKeyToMinPodsMap on zone and node", preemptor: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), addedPod: st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(), existingPods: []*v1.Pod{ @@ -1387,8 +1546,8 @@ func TestPreFilterStateAddPod(t *testing.T) { { name: "node a impacts topologyKeyToMinPodsMap on node, node x impacts topologyKeyToMinPodsMap on zone", preemptor: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), addedPod: st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(), existingPods: []*v1.Pod{ @@ -1420,8 +1579,8 @@ func TestPreFilterStateAddPod(t *testing.T) { { name: "Constraints hold different labelSelectors, node a impacts topologyKeyToMinPodsMap on zone", preemptor: st.MakePod().Name("p").Label("foo", "").Label("bar", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil, nil). Obj(), addedPod: st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(), existingPods: []*v1.Pod{ @@ -1463,8 +1622,8 @@ func TestPreFilterStateAddPod(t *testing.T) { { name: "Constraints hold different labelSelectors, node a impacts topologyKeyToMinPodsMap on both zone and node", preemptor: st.MakePod().Name("p").Label("foo", "").Label("bar", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil, nil). Obj(), addedPod: st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Label("bar", "").Obj(), existingPods: []*v1.Pod{ @@ -1506,7 +1665,7 @@ func TestPreFilterStateAddPod(t *testing.T) { { name: "add a pod that doesn't match node affinity when NodeInclustionPolicy disabled", preemptor: st.MakePod().Name("p").Label("foo", "").NodeAffinityNotIn("foo", []string{"bar"}). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodeIdx: 0, addedPod: st.MakePod().Name("p-a1").Node("node-b").Label("foo", "").Label("zone", "zone2").Obj(), @@ -1532,7 +1691,7 @@ func TestPreFilterStateAddPod(t *testing.T) { { name: "add a pod that doesn't match node affinity when NodeInclustionPolicy enabled", preemptor: st.MakePod().Name("p").Label("foo", "").NodeAffinityNotIn("foo", []string{"bar"}). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodeIdx: 0, addedPod: st.MakePod().Name("p-a1").Node("node-b").Label("foo", "").Label("zone", "zone2").Obj(), @@ -1612,7 +1771,7 @@ func TestPreFilterStateRemovePod(t *testing.T) { // So preemption is triggered. name: "one spreadConstraint on zone, topologyKeyToMinPodsMap unchanged", preemptor: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -1640,7 +1799,7 @@ func TestPreFilterStateRemovePod(t *testing.T) { { name: "one spreadConstraint on node, topologyKeyToMinPodsMap changed", preemptor: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -1670,7 +1829,7 @@ func TestPreFilterStateRemovePod(t *testing.T) { { name: "delete an irrelevant pod won't help", preemptor: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -1701,7 +1860,7 @@ func TestPreFilterStateRemovePod(t *testing.T) { { name: "delete a non-existing pod won't help", preemptor: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -1732,8 +1891,8 @@ func TestPreFilterStateRemovePod(t *testing.T) { { name: "two spreadConstraints", preemptor: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -1811,7 +1970,7 @@ func BenchmarkFilter(b *testing.B) { { name: "1000nodes/single-constraint-zone", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, v1.LabelTopologyZone, v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, v1.LabelTopologyZone, v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), existingPodsNum: 10000, allNodesNum: 1000, @@ -1820,7 +1979,7 @@ func BenchmarkFilter(b *testing.B) { { name: "1000nodes/single-constraint-node", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, v1.LabelHostname, v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, v1.LabelHostname, v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), existingPodsNum: 10000, allNodesNum: 1000, @@ -1829,8 +1988,8 @@ func BenchmarkFilter(b *testing.B) { { name: "1000nodes/two-Constraints-zone-node", pod: st.MakePod().Name("p").Label("foo", "").Label("bar", ""). - SpreadConstraint(1, v1.LabelTopologyZone, v1.DoNotSchedule, fooSelector, nil, nil, nil). - SpreadConstraint(1, v1.LabelHostname, v1.DoNotSchedule, barSelector, nil, nil, nil). + SpreadConstraint(1, v1.LabelTopologyZone, v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, v1.LabelHostname, v1.DoNotSchedule, barSelector, nil, nil, nil, nil). Obj(), existingPodsNum: 10000, allNodesNum: 1000, @@ -1887,7 +2046,7 @@ func TestSingleConstraint(t *testing.T) { { name: "no existing pods", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -1905,7 +2064,7 @@ func TestSingleConstraint(t *testing.T) { { name: "no existing pods, incoming pod doesn't match itself", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, barSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, barSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -1923,7 +2082,7 @@ func TestSingleConstraint(t *testing.T) { { name: "existing pods in a different namespace do not count", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -1947,7 +2106,7 @@ func TestSingleConstraint(t *testing.T) { { name: "pods spread across zones as 3/3, all nodes fit", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -1975,7 +2134,7 @@ func TestSingleConstraint(t *testing.T) { // can cause unexpected behavior name: "pods spread across zones as 1/2 due to absence of label 'zone' on node-b", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -1999,7 +2158,7 @@ func TestSingleConstraint(t *testing.T) { { name: "pod cannot be scheduled as all nodes don't have label 'rack'", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "rack", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "rack", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -2013,7 +2172,7 @@ func TestSingleConstraint(t *testing.T) { { name: "pods spread across nodes as 2/1/0/3, only node-x fits", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -2039,7 +2198,7 @@ func TestSingleConstraint(t *testing.T) { { name: "pods spread across nodes as 2/1/0/3, maxSkew is 2, node-b and node-x fit", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(2, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(2, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -2069,7 +2228,7 @@ func TestSingleConstraint(t *testing.T) { // as the incoming pod doesn't have label "foo" name: "pods spread across nodes as 2/1/0/3, but pod doesn't match itself", pod: st.MakePod().Name("p").Label("bar", ""). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -2101,7 +2260,7 @@ func TestSingleConstraint(t *testing.T) { name: "incoming pod has nodeAffinity, pods spread as 2/~1~/~0~/3, hence node-a fits", pod: st.MakePod().Name("p").Label("foo", ""). NodeAffinityIn("node", []string{"node-a", "node-y"}). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -2127,7 +2286,7 @@ func TestSingleConstraint(t *testing.T) { { name: "terminating Pods should be excluded", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Obj(), @@ -2147,7 +2306,7 @@ func TestSingleConstraint(t *testing.T) { name: "incoming pod has nodeAffinity, pods spread as 0/~2~/0/1, hence node-a fits", pod: st.MakePod().Name("p").Label("foo", ""). NodeAffinityNotIn("node", []string{"node-b"}). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -2177,6 +2336,7 @@ func TestSingleConstraint(t *testing.T) { pointer.Int32(4), // larger than the number of domains(3) nil, nil, + nil, ).Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Obj(), @@ -2207,6 +2367,7 @@ func TestSingleConstraint(t *testing.T) { pointer.Int32(2), // smaller than the number of domains(3) nil, nil, + nil, ).Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Obj(), @@ -2237,6 +2398,7 @@ func TestSingleConstraint(t *testing.T) { pointer.Int32(3), // larger than the number of domains(2) nil, nil, + nil, ).Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -2267,6 +2429,7 @@ func TestSingleConstraint(t *testing.T) { pointer.Int32(1), // smaller than the number of domains(2) nil, nil, + nil, ).Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -2292,7 +2455,7 @@ func TestSingleConstraint(t *testing.T) { name: "NodeAffinityPolicy honored with labelSelectors", pod: st.MakePod().Name("p").Label("foo", ""). NodeSelector(map[string]string{"foo": ""}). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Label("foo", "").Obj(), @@ -2318,7 +2481,7 @@ func TestSingleConstraint(t *testing.T) { name: "NodeAffinityPolicy ignored with labelSelectors", pod: st.MakePod().Name("p").Label("foo", ""). NodeSelector(map[string]string{"foo": ""}). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, &ignorePolicy, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, &ignorePolicy, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Label("foo", "").Obj(), @@ -2344,7 +2507,7 @@ func TestSingleConstraint(t *testing.T) { name: "NodeAffinityPolicy honored with nodeAffinity", pod: st.MakePod().Name("p").Label("foo", ""). NodeAffinityIn("foo", []string{""}). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Label("foo", "").Obj(), @@ -2370,7 +2533,7 @@ func TestSingleConstraint(t *testing.T) { name: "NodeAffinityPolicy ignored with labelSelectors", pod: st.MakePod().Name("p").Label("foo", ""). NodeAffinityIn("foo", []string{""}). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, &ignorePolicy, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, &ignorePolicy, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Label("foo", "").Obj(), @@ -2395,7 +2558,7 @@ func TestSingleConstraint(t *testing.T) { // pods spread across node as 1/1/0/~0~ name: "NodeTaintsPolicy honored", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, &honorPolicy). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, &honorPolicy, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Label("foo", "").Obj(), @@ -2420,7 +2583,7 @@ func TestSingleConstraint(t *testing.T) { // pods spread across node as 1/1/0/~1~ name: "NodeTaintsPolicy ignored", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Label("foo", "").Obj(), @@ -2480,8 +2643,8 @@ func TestMultipleConstraints(t *testing.T) { // intersection of (1) and (2) returns node-x name: "two Constraints on zone and node, spreads = [3/3, 2/1/0/3]", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -2510,8 +2673,8 @@ func TestMultipleConstraints(t *testing.T) { // intersection of (1) and (2) returns no node name: "two Constraints on zone and node, spreads = [3/4, 2/1/0/4]", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -2541,8 +2704,8 @@ func TestMultipleConstraints(t *testing.T) { // intersection of (1) and (2) returns node-x name: "Constraints hold different labelSelectors, spreads = [1/0, 1/0/0/1]", pod: st.MakePod().Name("p").Label("foo", "").Label("bar", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -2567,8 +2730,8 @@ func TestMultipleConstraints(t *testing.T) { // intersection of (1) and (2) returns no node name: "Constraints hold different labelSelectors, spreads = [1/0, 0/0/1/1]", pod: st.MakePod().Name("p").Label("foo", "").Label("bar", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -2594,8 +2757,8 @@ func TestMultipleConstraints(t *testing.T) { // intersection of (1) and (2) returns node-b name: "Constraints hold different labelSelectors, spreads = [2/3, 1/0/0/1]", pod: st.MakePod().Name("p").Label("foo", "").Label("bar", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -2623,8 +2786,8 @@ func TestMultipleConstraints(t *testing.T) { // intersection of (1) and (2) returns node-a and node-b name: "Constraints hold different labelSelectors but pod doesn't match itself on 'zone' constraint", pod: st.MakePod().Name("p").Label("bar", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, barSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -2650,8 +2813,8 @@ func TestMultipleConstraints(t *testing.T) { // intersection of (1) and (2) returns node-b name: "two Constraints on zone and node, absence of label 'node' on node-x, spreads = [1/1, 1/0/0/1]", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(), @@ -2677,8 +2840,8 @@ func TestMultipleConstraints(t *testing.T) { name: "two node inclusion Constraints, zone: honor/ignore, node: ignore/ignore", pod: st.MakePod().Name("p").Label("foo", ""). NodeSelector(map[string]string{"foo": ""}). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, &ignorePolicy, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, &ignorePolicy, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Label("foo", "").Obj(), @@ -2705,8 +2868,8 @@ func TestMultipleConstraints(t *testing.T) { // intersection of (1) and (2) returns node-x name: "two node inclusion Constraints, zone: honor/honor, node: honor/ignore", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, &honorPolicy). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, &honorPolicy, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Label("foo", "").Obj(), @@ -2734,8 +2897,8 @@ func TestMultipleConstraints(t *testing.T) { name: "two node inclusion Constraints, zone: honor/ignore, node: honor/ignore", pod: st.MakePod().Name("p").Label("foo", ""). NodeSelector(map[string]string{"foo": ""}). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Label("foo", "").Obj(), @@ -2763,8 +2926,8 @@ func TestMultipleConstraints(t *testing.T) { name: "two node inclusion Constraints, zone: honor/honor, node: ignore/ignore", pod: st.MakePod().Name("p").Label("foo", ""). NodeSelector(map[string]string{"foo": ""}). - SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, &honorPolicy). - SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, &ignorePolicy, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, fooSelector, nil, nil, &honorPolicy, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, fooSelector, nil, &ignorePolicy, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Label("foo", "").Obj(), diff --git a/pkg/scheduler/framework/plugins/podtopologyspread/plugin.go b/pkg/scheduler/framework/plugins/podtopologyspread/plugin.go index 4ca762ca4c8..ed2333e76df 100644 --- a/pkg/scheduler/framework/plugins/podtopologyspread/plugin.go +++ b/pkg/scheduler/framework/plugins/podtopologyspread/plugin.go @@ -64,6 +64,7 @@ type PodTopologySpread struct { statefulSets appslisters.StatefulSetLister enableMinDomainsInPodTopologySpread bool enableNodeInclusionPolicyInPodTopologySpread bool + enableMatchLabelKeysInPodTopologySpread bool } var _ framework.PreFilterPlugin = &PodTopologySpread{} @@ -98,6 +99,7 @@ func New(plArgs runtime.Object, h framework.Handle, fts feature.Features) (frame defaultConstraints: args.DefaultConstraints, enableMinDomainsInPodTopologySpread: fts.EnableMinDomainsInPodTopologySpread, enableNodeInclusionPolicyInPodTopologySpread: fts.EnableNodeInclusionPolicyInPodTopologySpread, + enableMatchLabelKeysInPodTopologySpread: fts.EnableMatchLabelKeysInPodTopologySpread, } if args.DefaultingType == config.SystemDefaulting { pl.defaultConstraints = systemDefaultConstraints diff --git a/pkg/scheduler/framework/plugins/podtopologyspread/scoring.go b/pkg/scheduler/framework/plugins/podtopologyspread/scoring.go index 1cb7355e2a7..2bf96ccf277 100644 --- a/pkg/scheduler/framework/plugins/podtopologyspread/scoring.go +++ b/pkg/scheduler/framework/plugins/podtopologyspread/scoring.go @@ -59,11 +59,10 @@ func (s *preScoreState) Clone() framework.StateData { func (pl *PodTopologySpread) initPreScoreState(s *preScoreState, pod *v1.Pod, filteredNodes []*v1.Node, requireAllTopologies bool) error { var err error if len(pod.Spec.TopologySpreadConstraints) > 0 { - s.Constraints, err = filterTopologySpreadConstraints( + s.Constraints, err = pl.filterTopologySpreadConstraints( pod.Spec.TopologySpreadConstraints, + pod.Labels, v1.ScheduleAnyway, - pl.enableMinDomainsInPodTopologySpread, - pl.enableNodeInclusionPolicyInPodTopologySpread, ) if err != nil { return fmt.Errorf("obtaining pod's soft topology spread constraints: %w", err) diff --git a/pkg/scheduler/framework/plugins/podtopologyspread/scoring_test.go b/pkg/scheduler/framework/plugins/podtopologyspread/scoring_test.go index 97e3e9e3a09..863f4b48c68 100644 --- a/pkg/scheduler/framework/plugins/podtopologyspread/scoring_test.go +++ b/pkg/scheduler/framework/plugins/podtopologyspread/scoring_test.go @@ -55,8 +55,8 @@ func TestPreScoreStateEmptyNodes(t *testing.T) { { name: "normal case", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.ScheduleAnyway, fooSelector, nil, nil, nil). - SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label(v1.LabelHostname, "node-a").Obj(), @@ -96,8 +96,8 @@ func TestPreScoreStateEmptyNodes(t *testing.T) { { name: "node-x doesn't have label zone", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.ScheduleAnyway, fooSelector, nil, nil, nil). - SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, barSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, barSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label(v1.LabelHostname, "node-a").Obj(), @@ -253,8 +253,8 @@ func TestPreScoreStateEmptyNodes(t *testing.T) { name: "default constraints and a replicaset, but pod has constraints", pod: st.MakePod().Name("p").Namespace("default").Label("foo", "bar").Label("baz", "sup"). OwnerReference("rs1", appsv1.SchemeGroupVersion.WithKind("ReplicaSet")). - SpreadConstraint(1, "zone", v1.DoNotSchedule, barSelector, nil, nil, nil). - SpreadConstraint(2, "planet", v1.ScheduleAnyway, st.MakeLabelSelector().Label("baz", "sup").Obj(), nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, barSelector, nil, nil, nil, nil). + SpreadConstraint(2, "planet", v1.ScheduleAnyway, st.MakeLabelSelector().Label("baz", "sup").Obj(), nil, nil, nil, nil). Obj(), config: config.PodTopologySpreadArgs{ DefaultConstraints: []v1.TopologySpreadConstraint{ @@ -294,7 +294,7 @@ func TestPreScoreStateEmptyNodes(t *testing.T) { name: "NodeAffinityPolicy honored with labelSelectors", pod: st.MakePod().Name("p").Label("foo", ""). NodeSelector(map[string]string{"foo": ""}). - SpreadConstraint(1, "zone", v1.ScheduleAnyway, barSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.ScheduleAnyway, barSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("foo", "").Label(v1.LabelHostname, "node-a").Obj(), @@ -328,7 +328,7 @@ func TestPreScoreStateEmptyNodes(t *testing.T) { name: "NodeAffinityPolicy ignored with labelSelectors", pod: st.MakePod().Name("p").Label("foo", ""). NodeSelector(map[string]string{"foo": ""}). - SpreadConstraint(1, "zone", v1.ScheduleAnyway, barSelector, nil, &ignorePolicy, nil). + SpreadConstraint(1, "zone", v1.ScheduleAnyway, barSelector, nil, &ignorePolicy, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("foo", "").Label(v1.LabelHostname, "node-a").Obj(), @@ -362,7 +362,7 @@ func TestPreScoreStateEmptyNodes(t *testing.T) { name: "NodeAffinityPolicy honored with nodeAffinity", pod: st.MakePod().Name("p").Label("foo", ""). NodeAffinityIn("foo", []string{""}). - SpreadConstraint(1, "zone", v1.ScheduleAnyway, barSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.ScheduleAnyway, barSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("foo", "").Label(v1.LabelHostname, "node-a").Obj(), @@ -396,7 +396,7 @@ func TestPreScoreStateEmptyNodes(t *testing.T) { name: "NodeAffinityPolicy ignored with nodeAffinity", pod: st.MakePod().Name("p").Label("foo", ""). NodeAffinityIn("foo", []string{""}). - SpreadConstraint(1, "zone", v1.ScheduleAnyway, barSelector, nil, &ignorePolicy, nil). + SpreadConstraint(1, "zone", v1.ScheduleAnyway, barSelector, nil, &ignorePolicy, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("foo", "").Label(v1.LabelHostname, "node-a").Obj(), @@ -429,7 +429,7 @@ func TestPreScoreStateEmptyNodes(t *testing.T) { { name: "NodeTaintsPolicy honored", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.ScheduleAnyway, barSelector, nil, nil, &honorPolicy). + SpreadConstraint(1, "zone", v1.ScheduleAnyway, barSelector, nil, nil, &honorPolicy, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("foo", "").Label(v1.LabelHostname, "node-a").Obj(), @@ -462,7 +462,7 @@ func TestPreScoreStateEmptyNodes(t *testing.T) { { name: "NodeTaintsPolicy ignored", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.ScheduleAnyway, barSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.ScheduleAnyway, barSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("zone", "zone1").Label("foo", "").Label(v1.LabelHostname, "node-a").Obj(), @@ -537,6 +537,7 @@ func TestPodTopologySpreadScore(t *testing.T) { objs []runtime.Object want framework.NodeScoreList enableNodeInclustionPolicy bool + enableMatchLabelKeys bool }{ // Explanation on the Legend: // a) X/Y means there are X matching pods on node1 and Y on node2, both nodes are candidates @@ -547,7 +548,7 @@ func TestPodTopologySpreadScore(t *testing.T) { { name: "one constraint on node, no existing pods", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil). + SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label(v1.LabelHostname, "node-a").Obj(), @@ -562,7 +563,7 @@ func TestPodTopologySpreadScore(t *testing.T) { // if there is only one candidate node, it should be scored to 100 name: "one constraint on node, only one node is candidate", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil). + SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(), @@ -582,7 +583,7 @@ func TestPodTopologySpreadScore(t *testing.T) { { name: "one constraint on node, all nodes have the same number of matching pods", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil). + SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(), @@ -601,7 +602,7 @@ func TestPodTopologySpreadScore(t *testing.T) { // matching pods spread as 2/1/0/3. name: "one constraint on node, all 4 nodes are candidates", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil). + SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(), @@ -628,7 +629,7 @@ func TestPodTopologySpreadScore(t *testing.T) { { name: "one constraint on node, all 4 nodes are candidates, maxSkew=2", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(2, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil). + SpreadConstraint(2, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). Obj(), // matching pods spread as 2/1/0/3. existingPods: []*v1.Pod{ @@ -656,7 +657,7 @@ func TestPodTopologySpreadScore(t *testing.T) { { name: "one constraint on node, all 4 nodes are candidates, maxSkew=3", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(3, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil). + SpreadConstraint(3, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ // matching pods spread as 4/3/2/1. @@ -723,7 +724,7 @@ func TestPodTopologySpreadScore(t *testing.T) { // matching pods spread as 4/2/1/~3~ (node4 is not a candidate) name: "one constraint on node, 3 out of 4 nodes are candidates", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil). + SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(), @@ -755,7 +756,7 @@ func TestPodTopologySpreadScore(t *testing.T) { // matching pods spread as 4/?2?/1/~3~, total = 4+?+1 = 5 (as node2 is problematic) name: "one constraint on node, 3 out of 4 nodes are candidates, one node doesn't match topology key", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil). + SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(), @@ -787,7 +788,7 @@ func TestPodTopologySpreadScore(t *testing.T) { // matching pods spread as 4/2/1/~3~ name: "one constraint on zone, 3 out of 4 nodes are candidates", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.ScheduleAnyway, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(), @@ -819,8 +820,8 @@ func TestPodTopologySpreadScore(t *testing.T) { // matching pods spread as 2/~1~/2/~4~. name: "two Constraints on zone and node, 2 out of 4 nodes are candidates", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "zone", v1.ScheduleAnyway, fooSelector, nil, nil, nil). - SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(), @@ -859,8 +860,8 @@ func TestPodTopologySpreadScore(t *testing.T) { // For the second constraint (node): the matching pods spread as 0/1/0/1 name: "two Constraints on zone and node, with different labelSelectors", pod: st.MakePod().Name("p").Label("foo", "").Label("bar", ""). - SpreadConstraint(1, "zone", v1.ScheduleAnyway, fooSelector, nil, nil, nil). - SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, barSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, barSelector, nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(), @@ -887,8 +888,8 @@ func TestPodTopologySpreadScore(t *testing.T) { // For the second constraint (node): the matching pods spread as 0/1/0/1 name: "two Constraints on zone and node, with different labelSelectors, some nodes have 0 pods", pod: st.MakePod().Name("p").Label("foo", "").Label("bar", ""). - SpreadConstraint(1, "zone", v1.ScheduleAnyway, fooSelector, nil, nil, nil). - SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, barSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, barSelector, nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p-b1").Node("node-b").Label("bar", "").Obj(), @@ -914,8 +915,8 @@ func TestPodTopologySpreadScore(t *testing.T) { // For the second constraint (node): the matching pods spread as 0/1/0/~1~ name: "two Constraints on zone and node, with different labelSelectors, 3 out of 4 nodes are candidates", pod: st.MakePod().Name("p").Label("foo", "").Label("bar", ""). - SpreadConstraint(1, "zone", v1.ScheduleAnyway, fooSelector, nil, nil, nil). - SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, barSelector, nil, nil, nil). + SpreadConstraint(1, "zone", v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, barSelector, nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(), @@ -940,7 +941,7 @@ func TestPodTopologySpreadScore(t *testing.T) { { name: "existing pods in a different namespace do not count", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil). + SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p-a1").Namespace("ns1").Node("node-a").Label("foo", "").Obj(), @@ -960,7 +961,7 @@ func TestPodTopologySpreadScore(t *testing.T) { { name: "terminating Pods should be excluded", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil). + SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label(v1.LabelHostname, "node-a").Obj(), @@ -987,6 +988,7 @@ func TestPodTopologySpreadScore(t *testing.T) { pointer.Int32(10), // larger than the number of domains(3) nil, nil, + nil, ).Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Obj(), @@ -1010,7 +1012,7 @@ func TestPodTopologySpreadScore(t *testing.T) { name: "NodeAffinityPolicy honoed with labelSelectors", pod: st.MakePod().Name("p").Label("foo", ""). NodeSelector(map[string]string{"foo": ""}). - SpreadConstraint(1, "node", v1.ScheduleAnyway, fooSelector, nil, nil, nil). + SpreadConstraint(1, "node", v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Label("foo", "").Obj(), @@ -1034,7 +1036,7 @@ func TestPodTopologySpreadScore(t *testing.T) { name: "NodeAffinityPolicy ignored with labelSelectors", pod: st.MakePod().Name("p").Label("foo", ""). NodeSelector(map[string]string{"foo": ""}). - SpreadConstraint(1, "node", v1.ScheduleAnyway, fooSelector, nil, &ignorePolicy, nil). + SpreadConstraint(1, "node", v1.ScheduleAnyway, fooSelector, nil, &ignorePolicy, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Label("foo", "").Obj(), @@ -1058,7 +1060,7 @@ func TestPodTopologySpreadScore(t *testing.T) { name: "NodeAffinityPolicy honoed with nodeAffinity", pod: st.MakePod().Name("p").Label("foo", ""). NodeAffinityIn("foo", []string{""}). - SpreadConstraint(1, "node", v1.ScheduleAnyway, fooSelector, nil, nil, nil). + SpreadConstraint(1, "node", v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Label("foo", "").Obj(), @@ -1082,7 +1084,7 @@ func TestPodTopologySpreadScore(t *testing.T) { name: "NodeAffinityPolicy ignored with nodeAffinity", pod: st.MakePod().Name("p").Label("foo", ""). NodeAffinityIn("foo", []string{""}). - SpreadConstraint(1, "node", v1.ScheduleAnyway, fooSelector, nil, &ignorePolicy, nil). + SpreadConstraint(1, "node", v1.ScheduleAnyway, fooSelector, nil, &ignorePolicy, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Label("foo", "").Obj(), @@ -1105,7 +1107,7 @@ func TestPodTopologySpreadScore(t *testing.T) { { name: "NodeTaintsPolicy honored", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "node", v1.ScheduleAnyway, fooSelector, nil, nil, &honorPolicy). + SpreadConstraint(1, "node", v1.ScheduleAnyway, fooSelector, nil, nil, &honorPolicy, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Obj(), @@ -1128,7 +1130,7 @@ func TestPodTopologySpreadScore(t *testing.T) { { name: "NodeTaintsPolicy ignored", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, "node", v1.ScheduleAnyway, fooSelector, nil, nil, nil). + SpreadConstraint(1, "node", v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). Obj(), nodes: []*v1.Node{ st.MakeNode().Name("node-a").Label("node", "node-a").Obj(), @@ -1148,6 +1150,85 @@ func TestPodTopologySpreadScore(t *testing.T) { }, enableNodeInclustionPolicy: true, }, + { + name: "matchLabelKeys ignored when feature gate disabled", + pod: st.MakePod().Name("p").Label("foo", "").Label("bar", "").Label("baz", ""). + SpreadConstraint(1, "zone", v1.ScheduleAnyway, fooSelector, nil, nil, nil, []string{"baz"}). + SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, barSelector, nil, nil, nil, []string{"baz"}). + Obj(), + existingPods: []*v1.Pod{ + st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(), + st.MakePod().Name("p-b1").Node("node-b").Label("foo", "").Label("bar", "").Obj(), + st.MakePod().Name("p-y1").Node("node-c").Label("foo", "").Obj(), + st.MakePod().Name("p-y2").Node("node-c").Label("bar", "").Obj(), + }, + nodes: []*v1.Node{ + st.MakeNode().Name("node-a").Label("zone", "zone1").Label(v1.LabelHostname, "node-a").Obj(), + st.MakeNode().Name("node-b").Label("zone", "zone1").Label(v1.LabelHostname, "node-b").Obj(), + st.MakeNode().Name("node-c").Label("zone", "zone2").Label(v1.LabelHostname, "node-c").Obj(), + st.MakeNode().Name("node-d").Label("zone", "zone2").Label(v1.LabelHostname, "node-d").Obj(), + }, + want: []framework.NodeScore{ + {Name: "node-a", Score: 60}, + {Name: "node-b", Score: 20}, + {Name: "node-c", Score: 60}, + {Name: "node-d", Score: 100}, + }, + enableMatchLabelKeys: false, + }, + { + name: "matchLabelKeys ANDed with LabelSelector when LabelSelector is empty", + pod: st.MakePod().Name("p").Label("foo", "").Label("bar", ""). + SpreadConstraint(1, "zone", v1.ScheduleAnyway, st.MakeLabelSelector().Obj(), nil, nil, nil, []string{"foo"}). + SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, st.MakeLabelSelector().Obj(), nil, nil, nil, []string{"bar"}). + Obj(), + existingPods: []*v1.Pod{ + st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(), + st.MakePod().Name("p-b1").Node("node-b").Label("foo", "").Label("bar", "").Obj(), + st.MakePod().Name("p-y1").Node("node-c").Label("foo", "").Obj(), + st.MakePod().Name("p-y2").Node("node-c").Label("bar", "").Obj(), + }, + nodes: []*v1.Node{ + st.MakeNode().Name("node-a").Label("zone", "zone1").Label(v1.LabelHostname, "node-a").Obj(), + st.MakeNode().Name("node-b").Label("zone", "zone1").Label(v1.LabelHostname, "node-b").Obj(), + st.MakeNode().Name("node-c").Label("zone", "zone2").Label(v1.LabelHostname, "node-c").Obj(), + st.MakeNode().Name("node-d").Label("zone", "zone2").Label(v1.LabelHostname, "node-d").Obj(), + }, + want: []framework.NodeScore{ + {Name: "node-a", Score: 60}, + {Name: "node-b", Score: 20}, + {Name: "node-c", Score: 60}, + {Name: "node-d", Score: 100}, + }, + enableMatchLabelKeys: true, + }, + { + name: "matchLabelKeys ANDed with LabelSelector when LabelSelector isn't empty", + pod: st.MakePod().Name("p").Label("foo", "").Label("bar", "").Label("baz", ""). + SpreadConstraint(1, "zone", v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, barSelector, nil, nil, nil, []string{"baz"}). + Obj(), + existingPods: []*v1.Pod{ + st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(), + st.MakePod().Name("p-b1").Node("node-b").Label("foo", "").Label("bar", "").Label("baz", "").Obj(), + st.MakePod().Name("p-c1").Node("node-c").Label("foo", "").Obj(), + st.MakePod().Name("p-c2").Node("node-c").Label("bar", "").Obj(), + st.MakePod().Name("p-d3").Node("node-c").Label("bar", "").Label("baz", "").Obj(), + }, + nodes: []*v1.Node{ + st.MakeNode().Name("node-a").Label("zone", "zone1").Label(v1.LabelHostname, "node-a").Obj(), + st.MakeNode().Name("node-b").Label("zone", "zone1").Label(v1.LabelHostname, "node-b").Obj(), + st.MakeNode().Name("node-c").Label("zone", "zone2").Label(v1.LabelHostname, "node-c").Obj(), + st.MakeNode().Name("node-d").Label("zone", "zone2").Label(v1.LabelHostname, "node-d").Obj(), + }, + want: []framework.NodeScore{ + {Name: "node-a", Score: 60}, + {Name: "node-b", Score: 20}, + {Name: "node-c", Score: 60}, + {Name: "node-d", Score: 100}, + }, + enableMatchLabelKeys: true, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -1159,6 +1240,7 @@ func TestPodTopologySpreadScore(t *testing.T) { pl := plugintesting.SetupPluginWithInformers(ctx, t, podTopologySpreadFunc, &config.PodTopologySpreadArgs{DefaultingType: config.SystemDefaulting}, cache.NewSnapshot(tt.existingPods, allNodes), tt.objs) p := pl.(*PodTopologySpread) p.enableNodeInclusionPolicyInPodTopologySpread = tt.enableNodeInclustionPolicy + p.enableMatchLabelKeysInPodTopologySpread = tt.enableMatchLabelKeys status := p.PreScore(context.Background(), state, tt.pod, tt.nodes) if !status.IsSuccess() { @@ -1199,7 +1281,7 @@ func BenchmarkTestPodTopologySpreadScore(b *testing.B) { { name: "1000nodes/single-constraint-zone", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, v1.LabelTopologyZone, v1.ScheduleAnyway, fooSelector, nil, nil, nil). + SpreadConstraint(1, v1.LabelTopologyZone, v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). Obj(), existingPodsNum: 10000, allNodesNum: 1000, @@ -1208,7 +1290,7 @@ func BenchmarkTestPodTopologySpreadScore(b *testing.B) { { name: "1000nodes/single-constraint-node", pod: st.MakePod().Name("p").Label("foo", ""). - SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil). + SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). Obj(), existingPodsNum: 10000, allNodesNum: 1000, @@ -1217,8 +1299,8 @@ func BenchmarkTestPodTopologySpreadScore(b *testing.B) { { name: "1000nodes/two-Constraints-zone-node", pod: st.MakePod().Name("p").Label("foo", "").Label("bar", ""). - SpreadConstraint(1, v1.LabelTopologyZone, v1.ScheduleAnyway, fooSelector, nil, nil, nil). - SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, barSelector, nil, nil, nil). + SpreadConstraint(1, v1.LabelTopologyZone, v1.ScheduleAnyway, fooSelector, nil, nil, nil, nil). + SpreadConstraint(1, v1.LabelHostname, v1.ScheduleAnyway, barSelector, nil, nil, nil, nil). Obj(), existingPodsNum: 10000, allNodesNum: 1000, diff --git a/pkg/scheduler/framework/plugins/registry.go b/pkg/scheduler/framework/plugins/registry.go index 3093e681c93..0f29e6ce96a 100644 --- a/pkg/scheduler/framework/plugins/registry.go +++ b/pkg/scheduler/framework/plugins/registry.go @@ -49,6 +49,7 @@ func NewInTreeRegistry() runtime.Registry { EnableVolumeCapacityPriority: feature.DefaultFeatureGate.Enabled(features.VolumeCapacityPriority), EnableMinDomainsInPodTopologySpread: feature.DefaultFeatureGate.Enabled(features.MinDomainsInPodTopologySpread), EnableNodeInclusionPolicyInPodTopologySpread: feature.DefaultFeatureGate.Enabled(features.NodeInclusionPolicyInPodTopologySpread), + EnableMatchLabelKeysInPodTopologySpread: feature.DefaultFeatureGate.Enabled(features.MatchLabelKeysInPodTopologySpread), } return runtime.Registry{ diff --git a/pkg/scheduler/schedule_one_test.go b/pkg/scheduler/schedule_one_test.go index 03e88b341cb..bd58ae7a0e6 100644 --- a/pkg/scheduler/schedule_one_test.go +++ b/pkg/scheduler/schedule_one_test.go @@ -1759,7 +1759,7 @@ func TestSchedulerSchedulePod(t *testing.T) { Operator: metav1.LabelSelectorOpExists, }, }, - }, nil, nil, nil).Obj(), + }, nil, nil, nil, nil).Obj(), pods: []*v1.Pod{ st.MakePod().Name("pod1").UID("pod1").Label("foo", "").Node("node1").Phase(v1.PodRunning).Obj(), }, @@ -1786,7 +1786,7 @@ func TestSchedulerSchedulePod(t *testing.T) { Operator: metav1.LabelSelectorOpExists, }, }, - }, nil, nil, nil).Obj(), + }, nil, nil, nil, nil).Obj(), pods: []*v1.Pod{ st.MakePod().Name("pod1a").UID("pod1a").Label("foo", "").Node("node1").Phase(v1.PodRunning).Obj(), st.MakePod().Name("pod1b").UID("pod1b").Label("foo", "").Node("node1").Phase(v1.PodRunning).Obj(), diff --git a/pkg/scheduler/testing/wrappers.go b/pkg/scheduler/testing/wrappers.go index fe84987e439..a77cdc40ad6 100644 --- a/pkg/scheduler/testing/wrappers.go +++ b/pkg/scheduler/testing/wrappers.go @@ -547,7 +547,7 @@ func (p *PodWrapper) PodAntiAffinityNotIn(labelKey, topologyKey string, vals []s // SpreadConstraint constructs a TopologySpreadConstraint object and injects // into the inner pod. -func (p *PodWrapper) SpreadConstraint(maxSkew int, tpKey string, mode v1.UnsatisfiableConstraintAction, selector *metav1.LabelSelector, minDomains *int32, nodeAffinityPolicy, nodeTaintsPolicy *v1.NodeInclusionPolicy) *PodWrapper { +func (p *PodWrapper) SpreadConstraint(maxSkew int, tpKey string, mode v1.UnsatisfiableConstraintAction, selector *metav1.LabelSelector, minDomains *int32, nodeAffinityPolicy, nodeTaintsPolicy *v1.NodeInclusionPolicy, matchLabelKeys []string) *PodWrapper { c := v1.TopologySpreadConstraint{ MaxSkew: int32(maxSkew), TopologyKey: tpKey, @@ -556,6 +556,7 @@ func (p *PodWrapper) SpreadConstraint(maxSkew int, tpKey string, mode v1.Unsatis MinDomains: minDomains, NodeAffinityPolicy: nodeAffinityPolicy, NodeTaintsPolicy: nodeTaintsPolicy, + MatchLabelKeys: matchLabelKeys, } p.Spec.TopologySpreadConstraints = append(p.Spec.TopologySpreadConstraints, c) return p diff --git a/staging/src/k8s.io/api/core/v1/generated.pb.go b/staging/src/k8s.io/api/core/v1/generated.pb.go index 46eb95842c4..a5172d70723 100644 --- a/staging/src/k8s.io/api/core/v1/generated.pb.go +++ b/staging/src/k8s.io/api/core/v1/generated.pb.go @@ -6175,904 +6175,905 @@ func init() { } var fileDescriptor_83c10c24ec417dc9 = []byte{ - // 14340 bytes of a gzipped FileDescriptorProto + // 14361 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x70, 0x24, 0xd7, 0x79, 0x18, 0xaa, 0x9e, 0xc1, 0x6b, 0x3e, 0xbc, 0x0f, 0x76, 0x97, 0x58, 0x90, 0xbb, 0xb3, 0x6c, 0x52, 0xcb, 0xa5, 0x48, 0x62, 0xb5, 0x7c, 0x48, 0x34, 0x29, 0xd1, 0x02, 0x30, 0xc0, 0x2e, 0xb8, 0x0b, 0xec, 0xf0, 0x0c, 0x76, 0x57, 0x92, 0x29, 0x95, 0x1a, 0x33, 0x07, 0x40, 0x0b, 0x33, 0xdd, - 0xc3, 0xee, 0x1e, 0xec, 0x82, 0x57, 0xae, 0xeb, 0x2b, 0x3f, 0x65, 0xfb, 0xde, 0x52, 0xdd, 0x72, - 0x1e, 0x25, 0xbb, 0x5c, 0x29, 0xc7, 0x89, 0xad, 0x28, 0x49, 0xc5, 0x91, 0x63, 0x3b, 0x96, 0x13, - 0x3b, 0x6f, 0x27, 0x3f, 0x6c, 0xc7, 0x55, 0xb1, 0x5c, 0xe5, 0x0a, 0x62, 0xaf, 0x53, 0xe5, 0x52, - 0x55, 0x62, 0x3b, 0x71, 0xf2, 0x23, 0x88, 0x13, 0xa7, 0xce, 0xb3, 0xcf, 0xe9, 0xc7, 0xcc, 0x60, - 0x89, 0x85, 0x28, 0x15, 0xff, 0xcd, 0x9c, 0xef, 0x3b, 0xdf, 0x39, 0x7d, 0x9e, 0xdf, 0xf9, 0x9e, - 0xf0, 0xea, 0xee, 0xcb, 0xe1, 0xbc, 0xeb, 0x5f, 0xde, 0xed, 0x6c, 0x92, 0xc0, 0x23, 0x11, 0x09, - 0x2f, 0xef, 0x11, 0xaf, 0xe1, 0x07, 0x97, 0x05, 0xc0, 0x69, 0xbb, 0x97, 0xeb, 0x7e, 0x40, 0x2e, - 0xef, 0x5d, 0xb9, 0xbc, 0x4d, 0x3c, 0x12, 0x38, 0x11, 0x69, 0xcc, 0xb7, 0x03, 0x3f, 0xf2, 0x11, - 0xe2, 0x38, 0xf3, 0x4e, 0xdb, 0x9d, 0xa7, 0x38, 0xf3, 0x7b, 0x57, 0xe6, 0x9e, 0xdb, 0x76, 0xa3, - 0x9d, 0xce, 0xe6, 0x7c, 0xdd, 0x6f, 0x5d, 0xde, 0xf6, 0xb7, 0xfd, 0xcb, 0x0c, 0x75, 0xb3, 0xb3, - 0xc5, 0xfe, 0xb1, 0x3f, 0xec, 0x17, 0x27, 0x31, 0xf7, 0x62, 0xdc, 0x4c, 0xcb, 0xa9, 0xef, 0xb8, - 0x1e, 0x09, 0xf6, 0x2f, 0xb7, 0x77, 0xb7, 0x59, 0xbb, 0x01, 0x09, 0xfd, 0x4e, 0x50, 0x27, 0xc9, - 0x86, 0xbb, 0xd6, 0x0a, 0x2f, 0xb7, 0x48, 0xe4, 0x64, 0x74, 0x77, 0xee, 0x72, 0x5e, 0xad, 0xa0, - 0xe3, 0x45, 0x6e, 0x2b, 0xdd, 0xcc, 0x87, 0x7a, 0x55, 0x08, 0xeb, 0x3b, 0xa4, 0xe5, 0xa4, 0xea, - 0xbd, 0x90, 0x57, 0xaf, 0x13, 0xb9, 0xcd, 0xcb, 0xae, 0x17, 0x85, 0x51, 0x90, 0xac, 0x64, 0x7f, - 0xdd, 0x82, 0x0b, 0x0b, 0x77, 0x6a, 0xcb, 0x4d, 0x27, 0x8c, 0xdc, 0xfa, 0x62, 0xd3, 0xaf, 0xef, - 0xd6, 0x22, 0x3f, 0x20, 0xb7, 0xfd, 0x66, 0xa7, 0x45, 0x6a, 0x6c, 0x20, 0xd0, 0xb3, 0x30, 0xb2, - 0xc7, 0xfe, 0xaf, 0x56, 0x66, 0xad, 0x0b, 0xd6, 0xa5, 0xd2, 0xe2, 0xd4, 0xaf, 0x1f, 0x94, 0xdf, - 0x77, 0xff, 0xa0, 0x3c, 0x72, 0x5b, 0x94, 0x63, 0x85, 0x81, 0x2e, 0xc2, 0xd0, 0x56, 0xb8, 0xb1, - 0xdf, 0x26, 0xb3, 0x05, 0x86, 0x3b, 0x21, 0x70, 0x87, 0x56, 0x6a, 0xb4, 0x14, 0x0b, 0x28, 0xba, - 0x0c, 0xa5, 0xb6, 0x13, 0x44, 0x6e, 0xe4, 0xfa, 0xde, 0x6c, 0xf1, 0x82, 0x75, 0x69, 0x70, 0x71, - 0x5a, 0xa0, 0x96, 0xaa, 0x12, 0x80, 0x63, 0x1c, 0xda, 0x8d, 0x80, 0x38, 0x8d, 0x9b, 0x5e, 0x73, - 0x7f, 0x76, 0xe0, 0x82, 0x75, 0x69, 0x24, 0xee, 0x06, 0x16, 0xe5, 0x58, 0x61, 0xd8, 0x5f, 0x2a, - 0xc0, 0xc8, 0xc2, 0xd6, 0x96, 0xeb, 0xb9, 0xd1, 0x3e, 0xba, 0x0d, 0x63, 0x9e, 0xdf, 0x20, 0xf2, - 0x3f, 0xfb, 0x8a, 0xd1, 0xe7, 0x2f, 0xcc, 0xa7, 0x97, 0xd2, 0xfc, 0xba, 0x86, 0xb7, 0x38, 0x75, - 0xff, 0xa0, 0x3c, 0xa6, 0x97, 0x60, 0x83, 0x0e, 0xc2, 0x30, 0xda, 0xf6, 0x1b, 0x8a, 0x6c, 0x81, - 0x91, 0x2d, 0x67, 0x91, 0xad, 0xc6, 0x68, 0x8b, 0x93, 0xf7, 0x0f, 0xca, 0xa3, 0x5a, 0x01, 0xd6, - 0x89, 0xa0, 0x4d, 0x98, 0xa4, 0x7f, 0xbd, 0xc8, 0x55, 0x74, 0x8b, 0x8c, 0xee, 0x13, 0x79, 0x74, - 0x35, 0xd4, 0xc5, 0x99, 0xfb, 0x07, 0xe5, 0xc9, 0x44, 0x21, 0x4e, 0x12, 0xb4, 0xdf, 0x86, 0x89, - 0x85, 0x28, 0x72, 0xea, 0x3b, 0xa4, 0xc1, 0x67, 0x10, 0xbd, 0x08, 0x03, 0x9e, 0xd3, 0x22, 0x62, - 0x7e, 0x2f, 0x88, 0x81, 0x1d, 0x58, 0x77, 0x5a, 0xe4, 0xf0, 0xa0, 0x3c, 0x75, 0xcb, 0x73, 0xdf, - 0xea, 0x88, 0x55, 0x41, 0xcb, 0x30, 0xc3, 0x46, 0xcf, 0x03, 0x34, 0xc8, 0x9e, 0x5b, 0x27, 0x55, - 0x27, 0xda, 0x11, 0xf3, 0x8d, 0x44, 0x5d, 0xa8, 0x28, 0x08, 0xd6, 0xb0, 0xec, 0x7b, 0x50, 0x5a, - 0xd8, 0xf3, 0xdd, 0x46, 0xd5, 0x6f, 0x84, 0x68, 0x17, 0x26, 0xdb, 0x01, 0xd9, 0x22, 0x81, 0x2a, - 0x9a, 0xb5, 0x2e, 0x14, 0x2f, 0x8d, 0x3e, 0x7f, 0x29, 0xf3, 0x63, 0x4d, 0xd4, 0x65, 0x2f, 0x0a, - 0xf6, 0x17, 0x1f, 0x11, 0xed, 0x4d, 0x26, 0xa0, 0x38, 0x49, 0xd9, 0xfe, 0xe7, 0x05, 0x38, 0xbd, - 0xf0, 0x76, 0x27, 0x20, 0x15, 0x37, 0xdc, 0x4d, 0xae, 0xf0, 0x86, 0x1b, 0xee, 0xae, 0xc7, 0x23, - 0xa0, 0x96, 0x56, 0x45, 0x94, 0x63, 0x85, 0x81, 0x9e, 0x83, 0x61, 0xfa, 0xfb, 0x16, 0x5e, 0x15, - 0x9f, 0x3c, 0x23, 0x90, 0x47, 0x2b, 0x4e, 0xe4, 0x54, 0x38, 0x08, 0x4b, 0x1c, 0xb4, 0x06, 0xa3, - 0x75, 0xb6, 0x21, 0xb7, 0xd7, 0xfc, 0x06, 0x61, 0x93, 0x59, 0x5a, 0x7c, 0x86, 0xa2, 0x2f, 0xc5, - 0xc5, 0x87, 0x07, 0xe5, 0x59, 0xde, 0x37, 0x41, 0x42, 0x83, 0x61, 0xbd, 0x3e, 0xb2, 0xd5, 0xfe, - 0x1a, 0x60, 0x94, 0x20, 0x63, 0x6f, 0x5d, 0xd2, 0xb6, 0xca, 0x20, 0xdb, 0x2a, 0x63, 0xd9, 0xdb, - 0x04, 0x5d, 0x81, 0x81, 0x5d, 0xd7, 0x6b, 0xcc, 0x0e, 0x31, 0x5a, 0xe7, 0xe8, 0x9c, 0x5f, 0x77, - 0xbd, 0xc6, 0xe1, 0x41, 0x79, 0xda, 0xe8, 0x0e, 0x2d, 0xc4, 0x0c, 0xd5, 0xfe, 0x33, 0x0b, 0xca, - 0x0c, 0xb6, 0xe2, 0x36, 0x49, 0x95, 0x04, 0xa1, 0x1b, 0x46, 0xc4, 0x8b, 0x8c, 0x01, 0x7d, 0x1e, - 0x20, 0x24, 0xf5, 0x80, 0x44, 0xda, 0x90, 0xaa, 0x85, 0x51, 0x53, 0x10, 0xac, 0x61, 0xd1, 0x03, - 0x21, 0xdc, 0x71, 0x02, 0xb6, 0xbe, 0xc4, 0xc0, 0xaa, 0x03, 0xa1, 0x26, 0x01, 0x38, 0xc6, 0x31, - 0x0e, 0x84, 0x62, 0xaf, 0x03, 0x01, 0x7d, 0x14, 0x26, 0xe3, 0xc6, 0xc2, 0xb6, 0x53, 0x97, 0x03, - 0xc8, 0xb6, 0x4c, 0xcd, 0x04, 0xe1, 0x24, 0xae, 0xfd, 0xb7, 0x2c, 0xb1, 0x78, 0xe8, 0x57, 0xbf, - 0xcb, 0xbf, 0xd5, 0xfe, 0x25, 0x0b, 0x86, 0x17, 0x5d, 0xaf, 0xe1, 0x7a, 0xdb, 0xe8, 0x33, 0x30, - 0x42, 0xef, 0xa6, 0x86, 0x13, 0x39, 0xe2, 0xdc, 0xfb, 0xa0, 0xb6, 0xb7, 0xd4, 0x55, 0x31, 0xdf, - 0xde, 0xdd, 0xa6, 0x05, 0xe1, 0x3c, 0xc5, 0xa6, 0xbb, 0xed, 0xe6, 0xe6, 0x67, 0x49, 0x3d, 0x5a, - 0x23, 0x91, 0x13, 0x7f, 0x4e, 0x5c, 0x86, 0x15, 0x55, 0x74, 0x1d, 0x86, 0x22, 0x27, 0xd8, 0x26, - 0x91, 0x38, 0x00, 0x33, 0x0f, 0x2a, 0x5e, 0x13, 0xd3, 0x1d, 0x49, 0xbc, 0x3a, 0x89, 0xaf, 0x85, - 0x0d, 0x56, 0x15, 0x0b, 0x12, 0xf6, 0xff, 0x1a, 0x86, 0xb3, 0x4b, 0xb5, 0xd5, 0x9c, 0x75, 0x75, - 0x11, 0x86, 0x1a, 0x81, 0xbb, 0x47, 0x02, 0x31, 0xce, 0x8a, 0x4a, 0x85, 0x95, 0x62, 0x01, 0x45, - 0x2f, 0xc3, 0x18, 0xbf, 0x90, 0xae, 0x39, 0x5e, 0xa3, 0x29, 0x87, 0xf8, 0x94, 0xc0, 0x1e, 0xbb, - 0xad, 0xc1, 0xb0, 0x81, 0x79, 0xc4, 0x45, 0x75, 0x31, 0xb1, 0x19, 0xf3, 0x2e, 0xbb, 0x2f, 0x58, - 0x30, 0xc5, 0x9b, 0x59, 0x88, 0xa2, 0xc0, 0xdd, 0xec, 0x44, 0x24, 0x9c, 0x1d, 0x64, 0x27, 0xdd, - 0x52, 0xd6, 0x68, 0xe5, 0x8e, 0xc0, 0xfc, 0xed, 0x04, 0x15, 0x7e, 0x08, 0xce, 0x8a, 0x76, 0xa7, - 0x92, 0x60, 0x9c, 0x6a, 0x16, 0x7d, 0xaf, 0x05, 0x73, 0x75, 0xdf, 0x8b, 0x02, 0xbf, 0xd9, 0x24, - 0x41, 0xb5, 0xb3, 0xd9, 0x74, 0xc3, 0x1d, 0xbe, 0x4e, 0x31, 0xd9, 0x62, 0x27, 0x41, 0xce, 0x1c, - 0x2a, 0x24, 0x31, 0x87, 0xe7, 0xef, 0x1f, 0x94, 0xe7, 0x96, 0x72, 0x49, 0xe1, 0x2e, 0xcd, 0xa0, - 0x5d, 0x40, 0xf4, 0x2a, 0xad, 0x45, 0xce, 0x36, 0x89, 0x1b, 0x1f, 0xee, 0xbf, 0xf1, 0x33, 0xf7, - 0x0f, 0xca, 0x68, 0x3d, 0x45, 0x02, 0x67, 0x90, 0x45, 0x6f, 0xc1, 0x29, 0x5a, 0x9a, 0xfa, 0xd6, - 0x91, 0xfe, 0x9b, 0x9b, 0xbd, 0x7f, 0x50, 0x3e, 0xb5, 0x9e, 0x41, 0x04, 0x67, 0x92, 0x46, 0xdf, - 0x63, 0xc1, 0xd9, 0xf8, 0xf3, 0x97, 0xef, 0xb5, 0x1d, 0xaf, 0x11, 0x37, 0x5c, 0xea, 0xbf, 0x61, - 0x7a, 0x26, 0x9f, 0x5d, 0xca, 0xa3, 0x84, 0xf3, 0x1b, 0x41, 0x1e, 0xcc, 0xd0, 0xae, 0x25, 0xdb, - 0x86, 0xfe, 0xdb, 0x7e, 0xe4, 0xfe, 0x41, 0x79, 0x66, 0x3d, 0x4d, 0x03, 0x67, 0x11, 0x9e, 0x5b, - 0x82, 0xd3, 0x99, 0xab, 0x13, 0x4d, 0x41, 0x71, 0x97, 0x70, 0xae, 0xab, 0x84, 0xe9, 0x4f, 0x74, - 0x0a, 0x06, 0xf7, 0x9c, 0x66, 0x47, 0x6c, 0x4c, 0xcc, 0xff, 0xbc, 0x52, 0x78, 0xd9, 0xb2, 0xff, - 0x45, 0x11, 0x26, 0x97, 0x6a, 0xab, 0x0f, 0xb4, 0xeb, 0xf5, 0x6b, 0xaf, 0xd0, 0xf5, 0xda, 0x8b, - 0x2f, 0xd1, 0x62, 0xee, 0x25, 0xfa, 0x7f, 0x67, 0x6c, 0xd9, 0x01, 0xb6, 0x65, 0xbf, 0x23, 0x67, - 0xcb, 0x1e, 0xf3, 0x46, 0xdd, 0xcb, 0x59, 0xb5, 0x83, 0x6c, 0x02, 0x33, 0x39, 0xa4, 0x1b, 0x7e, - 0xdd, 0x69, 0x26, 0x8f, 0xda, 0x23, 0x2e, 0xdd, 0xe3, 0x99, 0xc7, 0x3a, 0x8c, 0x2d, 0x39, 0x6d, - 0x67, 0xd3, 0x6d, 0xba, 0x91, 0x4b, 0x42, 0xf4, 0x14, 0x14, 0x9d, 0x46, 0x83, 0x71, 0x77, 0xa5, - 0xc5, 0xd3, 0xf7, 0x0f, 0xca, 0xc5, 0x85, 0x06, 0x65, 0x33, 0x40, 0x61, 0xed, 0x63, 0x8a, 0x81, - 0x3e, 0x00, 0x03, 0x8d, 0xc0, 0x6f, 0xcf, 0x16, 0x18, 0x26, 0xdd, 0xe5, 0x03, 0x95, 0xc0, 0x6f, - 0x27, 0x50, 0x19, 0x8e, 0xfd, 0x6b, 0x05, 0x78, 0x6c, 0x89, 0xb4, 0x77, 0x56, 0x6a, 0x39, 0xf7, - 0xc5, 0x25, 0x18, 0x69, 0xf9, 0x9e, 0x1b, 0xf9, 0x41, 0x28, 0x9a, 0x66, 0x2b, 0x62, 0x4d, 0x94, - 0x61, 0x05, 0x45, 0x17, 0x60, 0xa0, 0x1d, 0x33, 0xb1, 0x63, 0x92, 0x01, 0x66, 0xec, 0x2b, 0x83, - 0x50, 0x8c, 0x4e, 0x48, 0x02, 0xb1, 0x62, 0x14, 0xc6, 0xad, 0x90, 0x04, 0x98, 0x41, 0x62, 0x4e, - 0x80, 0xf2, 0x08, 0xe2, 0x46, 0x48, 0x70, 0x02, 0x14, 0x82, 0x35, 0x2c, 0x54, 0x85, 0x52, 0x98, - 0x98, 0xd9, 0xbe, 0xb6, 0xe6, 0x38, 0x63, 0x15, 0xd4, 0x4c, 0xc6, 0x44, 0x8c, 0x1b, 0x6c, 0xa8, - 0x27, 0xab, 0xf0, 0xb5, 0x02, 0x20, 0x3e, 0x84, 0xdf, 0x62, 0x03, 0x77, 0x2b, 0x3d, 0x70, 0xfd, - 0x6f, 0x89, 0xe3, 0x1a, 0xbd, 0xff, 0x66, 0xc1, 0x63, 0x4b, 0xae, 0xd7, 0x20, 0x41, 0xce, 0x02, - 0x7c, 0x38, 0x6f, 0xe7, 0xa3, 0x31, 0x29, 0xc6, 0x12, 0x1b, 0x38, 0x86, 0x25, 0x66, 0xff, 0x89, - 0x05, 0x88, 0x7f, 0xf6, 0xbb, 0xee, 0x63, 0x6f, 0xa5, 0x3f, 0xf6, 0x18, 0x96, 0x85, 0x7d, 0x03, - 0x26, 0x96, 0x9a, 0x2e, 0xf1, 0xa2, 0xd5, 0xea, 0x92, 0xef, 0x6d, 0xb9, 0xdb, 0xe8, 0x15, 0x98, - 0x88, 0xdc, 0x16, 0xf1, 0x3b, 0x51, 0x8d, 0xd4, 0x7d, 0x8f, 0xbd, 0x5c, 0xad, 0x4b, 0x83, 0x8b, - 0xe8, 0xfe, 0x41, 0x79, 0x62, 0xc3, 0x80, 0xe0, 0x04, 0xa6, 0xfd, 0x7b, 0x74, 0xfc, 0xfc, 0x56, - 0xdb, 0xf7, 0x88, 0x17, 0x2d, 0xf9, 0x5e, 0x83, 0x4b, 0x38, 0x5e, 0x81, 0x81, 0x88, 0x8e, 0x07, - 0x1f, 0xbb, 0x8b, 0x72, 0xa3, 0xd0, 0x51, 0x38, 0x3c, 0x28, 0x9f, 0x49, 0xd7, 0x60, 0xe3, 0xc4, - 0xea, 0xa0, 0xef, 0x80, 0xa1, 0x30, 0x72, 0xa2, 0x4e, 0x28, 0x46, 0xf3, 0x71, 0x39, 0x9a, 0x35, - 0x56, 0x7a, 0x78, 0x50, 0x9e, 0x54, 0xd5, 0x78, 0x11, 0x16, 0x15, 0xd0, 0xd3, 0x30, 0xdc, 0x22, - 0x61, 0xe8, 0x6c, 0xcb, 0xdb, 0x70, 0x52, 0xd4, 0x1d, 0x5e, 0xe3, 0xc5, 0x58, 0xc2, 0xd1, 0x13, - 0x30, 0x48, 0x82, 0xc0, 0x0f, 0xc4, 0x1e, 0x1d, 0x17, 0x88, 0x83, 0xcb, 0xb4, 0x10, 0x73, 0x98, - 0xfd, 0x9b, 0x16, 0x4c, 0xaa, 0xbe, 0xf2, 0xb6, 0x4e, 0xe0, 0x15, 0xf2, 0x49, 0x80, 0xba, 0xfc, - 0xc0, 0x90, 0xdd, 0x1e, 0xa3, 0xcf, 0x5f, 0xcc, 0xbc, 0xa8, 0x53, 0xc3, 0x18, 0x53, 0x56, 0x45, - 0x21, 0xd6, 0xa8, 0xd9, 0xff, 0xc8, 0x82, 0x99, 0xc4, 0x17, 0xdd, 0x70, 0xc3, 0x08, 0xbd, 0x99, - 0xfa, 0xaa, 0xf9, 0xfe, 0xbe, 0x8a, 0xd6, 0x66, 0xdf, 0xa4, 0x96, 0xb2, 0x2c, 0xd1, 0xbe, 0xe8, - 0x1a, 0x0c, 0xba, 0x11, 0x69, 0xc9, 0x8f, 0x79, 0xa2, 0xeb, 0xc7, 0xf0, 0x5e, 0xc5, 0x33, 0xb2, - 0x4a, 0x6b, 0x62, 0x4e, 0xc0, 0xfe, 0xb5, 0x22, 0x94, 0xf8, 0xb2, 0x5d, 0x73, 0xda, 0x27, 0x30, - 0x17, 0xcf, 0x40, 0xc9, 0x6d, 0xb5, 0x3a, 0x91, 0xb3, 0x29, 0x8e, 0xf3, 0x11, 0xbe, 0xb5, 0x56, - 0x65, 0x21, 0x8e, 0xe1, 0x68, 0x15, 0x06, 0x58, 0x57, 0xf8, 0x57, 0x3e, 0x95, 0xfd, 0x95, 0xa2, - 0xef, 0xf3, 0x15, 0x27, 0x72, 0x38, 0x27, 0xa5, 0xee, 0x11, 0x5a, 0x84, 0x19, 0x09, 0xe4, 0x00, - 0x6c, 0xba, 0x9e, 0x13, 0xec, 0xd3, 0xb2, 0xd9, 0x22, 0x23, 0xf8, 0x5c, 0x77, 0x82, 0x8b, 0x0a, - 0x9f, 0x93, 0x55, 0x1f, 0x16, 0x03, 0xb0, 0x46, 0x74, 0xee, 0xc3, 0x50, 0x52, 0xc8, 0x47, 0x61, - 0x88, 0xe6, 0x3e, 0x0a, 0x93, 0x89, 0xb6, 0x7a, 0x55, 0x1f, 0xd3, 0xf9, 0xa9, 0x5f, 0x66, 0x47, - 0x86, 0xe8, 0xf5, 0xb2, 0xb7, 0x27, 0x8e, 0xdc, 0xb7, 0xe1, 0x54, 0x33, 0xe3, 0x24, 0x13, 0xf3, - 0xda, 0xff, 0xc9, 0xf7, 0x98, 0xf8, 0xec, 0x53, 0x59, 0x50, 0x9c, 0xd9, 0x06, 0xe5, 0x11, 0xfc, - 0x36, 0xdd, 0x20, 0x4e, 0x53, 0x67, 0xb7, 0x6f, 0x8a, 0x32, 0xac, 0xa0, 0xf4, 0xbc, 0x3b, 0xa5, - 0x3a, 0x7f, 0x9d, 0xec, 0xd7, 0x48, 0x93, 0xd4, 0x23, 0x3f, 0xf8, 0xa6, 0x76, 0xff, 0x1c, 0x1f, - 0x7d, 0x7e, 0x5c, 0x8e, 0x0a, 0x02, 0xc5, 0xeb, 0x64, 0x9f, 0x4f, 0x85, 0xfe, 0x75, 0xc5, 0xae, - 0x5f, 0xf7, 0x73, 0x16, 0x8c, 0xab, 0xaf, 0x3b, 0x81, 0x73, 0x61, 0xd1, 0x3c, 0x17, 0xce, 0x75, - 0x5d, 0xe0, 0x39, 0x27, 0xc2, 0xd7, 0x0a, 0x70, 0x56, 0xe1, 0xd0, 0xb7, 0x01, 0xff, 0x23, 0x56, - 0xd5, 0x65, 0x28, 0x79, 0x4a, 0x4a, 0x66, 0x99, 0xe2, 0xa9, 0x58, 0x46, 0x16, 0xe3, 0x50, 0x16, - 0xcf, 0x8b, 0x45, 0x59, 0x63, 0xba, 0xf8, 0x58, 0x88, 0x8a, 0x17, 0xa1, 0xd8, 0x71, 0x1b, 0xe2, - 0x82, 0xf9, 0xa0, 0x1c, 0xed, 0x5b, 0xab, 0x95, 0xc3, 0x83, 0xf2, 0xe3, 0x79, 0xaa, 0x0b, 0x7a, - 0xb3, 0x85, 0xf3, 0xb7, 0x56, 0x2b, 0x98, 0x56, 0x46, 0x0b, 0x30, 0x29, 0xb5, 0x33, 0xb7, 0x29, - 0xbb, 0xe5, 0x7b, 0xe2, 0x1e, 0x52, 0x32, 0x60, 0x6c, 0x82, 0x71, 0x12, 0x1f, 0x55, 0x60, 0x6a, - 0xb7, 0xb3, 0x49, 0x9a, 0x24, 0xe2, 0x1f, 0x7c, 0x9d, 0x70, 0x09, 0x69, 0x29, 0x7e, 0x99, 0x5d, - 0x4f, 0xc0, 0x71, 0xaa, 0x86, 0xfd, 0x17, 0xec, 0x3e, 0x10, 0xa3, 0x57, 0x0d, 0x7c, 0xba, 0xb0, - 0x28, 0xf5, 0x6f, 0xe6, 0x72, 0xee, 0x67, 0x55, 0x5c, 0x27, 0xfb, 0x1b, 0x3e, 0xe5, 0xcc, 0xb3, - 0x57, 0x85, 0xb1, 0xe6, 0x07, 0xba, 0xae, 0xf9, 0x9f, 0x2f, 0xc0, 0x69, 0x35, 0x02, 0x06, 0x13, - 0xf8, 0xad, 0x3e, 0x06, 0x57, 0x60, 0xb4, 0x41, 0xb6, 0x9c, 0x4e, 0x33, 0x52, 0xe2, 0xfa, 0x41, - 0xae, 0xb2, 0xa9, 0xc4, 0xc5, 0x58, 0xc7, 0x39, 0xc2, 0xb0, 0xfd, 0xf7, 0x51, 0x76, 0x11, 0x47, - 0x0e, 0x5d, 0xe3, 0x6a, 0xd7, 0x58, 0xb9, 0xbb, 0xe6, 0x09, 0x18, 0x74, 0x5b, 0x94, 0x31, 0x2b, - 0x98, 0xfc, 0xd6, 0x2a, 0x2d, 0xc4, 0x1c, 0x86, 0xde, 0x0f, 0xc3, 0x75, 0xbf, 0xd5, 0x72, 0xbc, - 0x06, 0xbb, 0xf2, 0x4a, 0x8b, 0xa3, 0x94, 0x77, 0x5b, 0xe2, 0x45, 0x58, 0xc2, 0xd0, 0x63, 0x30, - 0xe0, 0x04, 0xdb, 0x5c, 0x86, 0x51, 0x5a, 0x1c, 0xa1, 0x2d, 0x2d, 0x04, 0xdb, 0x21, 0x66, 0xa5, - 0xf4, 0x09, 0x76, 0xd7, 0x0f, 0x76, 0x5d, 0x6f, 0xbb, 0xe2, 0x06, 0x62, 0x4b, 0xa8, 0xbb, 0xf0, - 0x8e, 0x82, 0x60, 0x0d, 0x0b, 0xad, 0xc0, 0x60, 0xdb, 0x0f, 0xa2, 0x70, 0x76, 0x88, 0x0d, 0xf7, - 0xe3, 0x39, 0x07, 0x11, 0xff, 0xda, 0xaa, 0x1f, 0x44, 0xf1, 0x07, 0xd0, 0x7f, 0x21, 0xe6, 0xd5, - 0xd1, 0x0d, 0x18, 0x26, 0xde, 0xde, 0x4a, 0xe0, 0xb7, 0x66, 0x67, 0xf2, 0x29, 0x2d, 0x73, 0x14, - 0xbe, 0xcc, 0x62, 0x1e, 0x55, 0x14, 0x63, 0x49, 0x02, 0x7d, 0x07, 0x14, 0x89, 0xb7, 0x37, 0x3b, - 0xcc, 0x28, 0xcd, 0xe5, 0x50, 0xba, 0xed, 0x04, 0xf1, 0x99, 0xbf, 0xec, 0xed, 0x61, 0x5a, 0x07, - 0x7d, 0x02, 0x4a, 0xf2, 0xc0, 0x08, 0x85, 0x70, 0x30, 0x73, 0xc1, 0xca, 0x63, 0x06, 0x93, 0xb7, - 0x3a, 0x6e, 0x40, 0x5a, 0xc4, 0x8b, 0xc2, 0xf8, 0x84, 0x94, 0xd0, 0x10, 0xc7, 0xd4, 0xd0, 0x27, - 0xa4, 0x44, 0x7a, 0xcd, 0xef, 0x78, 0x51, 0x38, 0x5b, 0x62, 0xdd, 0xcb, 0xd4, 0x15, 0xde, 0x8e, - 0xf1, 0x92, 0x22, 0x6b, 0x5e, 0x19, 0x1b, 0xa4, 0xd0, 0xa7, 0x60, 0x9c, 0xff, 0xe7, 0x1a, 0xb7, - 0x70, 0xf6, 0x34, 0xa3, 0x7d, 0x21, 0x9f, 0x36, 0x47, 0x5c, 0x3c, 0x2d, 0x88, 0x8f, 0xeb, 0xa5, - 0x21, 0x36, 0xa9, 0x21, 0x0c, 0xe3, 0x4d, 0x77, 0x8f, 0x78, 0x24, 0x0c, 0xab, 0x81, 0xbf, 0x49, - 0x84, 0x00, 0xf1, 0x6c, 0xb6, 0x86, 0xce, 0xdf, 0x24, 0x8b, 0xd3, 0x94, 0xe6, 0x0d, 0xbd, 0x0e, - 0x36, 0x49, 0xa0, 0x5b, 0x30, 0x41, 0x5f, 0x6c, 0x6e, 0x4c, 0x74, 0xb4, 0x17, 0x51, 0xf6, 0xae, - 0xc2, 0x46, 0x25, 0x9c, 0x20, 0x82, 0x6e, 0xc2, 0x58, 0x18, 0x39, 0x41, 0xd4, 0x69, 0x73, 0xa2, - 0x67, 0x7a, 0x11, 0x65, 0x0a, 0xde, 0x9a, 0x56, 0x05, 0x1b, 0x04, 0xd0, 0xeb, 0x50, 0x6a, 0xba, - 0x5b, 0xa4, 0xbe, 0x5f, 0x6f, 0x92, 0xd9, 0x31, 0x46, 0x2d, 0xf3, 0x50, 0xb9, 0x21, 0x91, 0x38, - 0x9f, 0xab, 0xfe, 0xe2, 0xb8, 0x3a, 0xba, 0x0d, 0x67, 0x22, 0x12, 0xb4, 0x5c, 0xcf, 0xa1, 0x87, - 0x81, 0x78, 0x5a, 0x31, 0xc5, 0xe9, 0x38, 0xdb, 0x6d, 0xe7, 0xc5, 0x6c, 0x9c, 0xd9, 0xc8, 0xc4, - 0xc2, 0x39, 0xb5, 0xd1, 0x3d, 0x98, 0xcd, 0x80, 0xf8, 0x4d, 0xb7, 0xbe, 0x3f, 0x7b, 0x8a, 0x51, - 0xfe, 0x88, 0xa0, 0x3c, 0xbb, 0x91, 0x83, 0x77, 0xd8, 0x05, 0x86, 0x73, 0xa9, 0xa3, 0x9b, 0x30, - 0xc9, 0x4e, 0xa0, 0x6a, 0xa7, 0xd9, 0x14, 0x0d, 0x4e, 0xb0, 0x06, 0xdf, 0x2f, 0xef, 0xe3, 0x55, - 0x13, 0x7c, 0x78, 0x50, 0x86, 0xf8, 0x1f, 0x4e, 0xd6, 0x46, 0x9b, 0x4c, 0x47, 0xd7, 0x09, 0xdc, - 0x68, 0x9f, 0x9e, 0x1b, 0xe4, 0x5e, 0x34, 0x3b, 0xd9, 0x55, 0x5e, 0xa1, 0xa3, 0x2a, 0x45, 0x9e, - 0x5e, 0x88, 0x93, 0x04, 0xe9, 0x91, 0x1a, 0x46, 0x0d, 0xd7, 0x9b, 0x9d, 0xe2, 0xef, 0x12, 0x79, - 0x22, 0xd5, 0x68, 0x21, 0xe6, 0x30, 0xa6, 0x9f, 0xa3, 0x3f, 0x6e, 0xd2, 0x9b, 0x6b, 0x9a, 0x21, - 0xc6, 0xfa, 0x39, 0x09, 0xc0, 0x31, 0x0e, 0x65, 0x26, 0xa3, 0x68, 0x7f, 0x16, 0x31, 0x54, 0x75, - 0xb0, 0x6c, 0x6c, 0x7c, 0x02, 0xd3, 0x72, 0x7b, 0x13, 0x26, 0xd4, 0x41, 0xc8, 0xc6, 0x04, 0x95, - 0x61, 0x90, 0xb1, 0x4f, 0x42, 0xba, 0x56, 0xa2, 0x5d, 0x60, 0xac, 0x15, 0xe6, 0xe5, 0xac, 0x0b, - 0xee, 0xdb, 0x64, 0x71, 0x3f, 0x22, 0xfc, 0x4d, 0x5f, 0xd4, 0xba, 0x20, 0x01, 0x38, 0xc6, 0xb1, - 0xff, 0x37, 0x67, 0x43, 0xe3, 0xd3, 0xb6, 0x8f, 0xfb, 0xe5, 0x59, 0x18, 0xd9, 0xf1, 0xc3, 0x88, - 0x62, 0xb3, 0x36, 0x06, 0x63, 0xc6, 0xf3, 0x9a, 0x28, 0xc7, 0x0a, 0x03, 0xbd, 0x0a, 0xe3, 0x75, - 0xbd, 0x01, 0x71, 0x39, 0xaa, 0x63, 0xc4, 0x68, 0x1d, 0x9b, 0xb8, 0xe8, 0x65, 0x18, 0x61, 0x36, - 0x27, 0x75, 0xbf, 0x29, 0xb8, 0x36, 0x79, 0xc3, 0x8f, 0x54, 0x45, 0xf9, 0xa1, 0xf6, 0x1b, 0x2b, - 0x6c, 0x74, 0x11, 0x86, 0x68, 0x17, 0x56, 0xab, 0xe2, 0x5a, 0x52, 0x82, 0xa2, 0x6b, 0xac, 0x14, - 0x0b, 0xa8, 0xfd, 0xff, 0x17, 0xb4, 0x51, 0xa6, 0xef, 0x61, 0x82, 0xaa, 0x30, 0x7c, 0xd7, 0x71, - 0x23, 0xd7, 0xdb, 0x16, 0xfc, 0xc7, 0xd3, 0x5d, 0xef, 0x28, 0x56, 0xe9, 0x0e, 0xaf, 0xc0, 0x6f, - 0x51, 0xf1, 0x07, 0x4b, 0x32, 0x94, 0x62, 0xd0, 0xf1, 0x3c, 0x4a, 0xb1, 0xd0, 0x2f, 0x45, 0xcc, - 0x2b, 0x70, 0x8a, 0xe2, 0x0f, 0x96, 0x64, 0xd0, 0x9b, 0x00, 0x72, 0x87, 0x91, 0x86, 0xb0, 0xf5, - 0x78, 0xb6, 0x37, 0xd1, 0x0d, 0x55, 0x67, 0x71, 0x82, 0xde, 0xd1, 0xf1, 0x7f, 0xac, 0xd1, 0xb3, - 0x23, 0xc6, 0xa7, 0xa5, 0x3b, 0x83, 0xbe, 0x8b, 0x2e, 0x71, 0x27, 0x88, 0x48, 0x63, 0x21, 0x12, - 0x83, 0xf3, 0x81, 0xfe, 0x1e, 0x29, 0x1b, 0x6e, 0x8b, 0xe8, 0xdb, 0x41, 0x10, 0xc1, 0x31, 0x3d, - 0xfb, 0x17, 0x8b, 0x30, 0x9b, 0xd7, 0x5d, 0xba, 0xe8, 0xc8, 0x3d, 0x37, 0x5a, 0xa2, 0xec, 0x95, - 0x65, 0x2e, 0xba, 0x65, 0x51, 0x8e, 0x15, 0x06, 0x9d, 0xfd, 0xd0, 0xdd, 0x96, 0x6f, 0xcc, 0xc1, - 0x78, 0xf6, 0x6b, 0xac, 0x14, 0x0b, 0x28, 0xc5, 0x0b, 0x88, 0x13, 0x0a, 0x63, 0x22, 0x6d, 0x95, - 0x60, 0x56, 0x8a, 0x05, 0x54, 0x97, 0x76, 0x0d, 0xf4, 0x90, 0x76, 0x19, 0x43, 0x34, 0x78, 0xbc, - 0x43, 0x84, 0x3e, 0x0d, 0xb0, 0xe5, 0x7a, 0x6e, 0xb8, 0xc3, 0xa8, 0x0f, 0x1d, 0x99, 0xba, 0x62, - 0xce, 0x56, 0x14, 0x15, 0xac, 0x51, 0x44, 0x2f, 0xc1, 0xa8, 0xda, 0x80, 0xab, 0x15, 0xa6, 0x59, - 0xd5, 0x2c, 0x55, 0xe2, 0xd3, 0xa8, 0x82, 0x75, 0x3c, 0xfb, 0xb3, 0xc9, 0xf5, 0x22, 0x76, 0x80, - 0x36, 0xbe, 0x56, 0xbf, 0xe3, 0x5b, 0xe8, 0x3e, 0xbe, 0xf6, 0x37, 0x8a, 0x30, 0x69, 0x34, 0xd6, - 0x09, 0xfb, 0x38, 0xb3, 0xae, 0xd2, 0x03, 0xdc, 0x89, 0x88, 0xd8, 0x7f, 0x76, 0xef, 0xad, 0xa2, - 0x1f, 0xf2, 0x74, 0x07, 0xf0, 0xfa, 0xe8, 0xd3, 0x50, 0x6a, 0x3a, 0x21, 0x93, 0x9c, 0x11, 0xb1, - 0xef, 0xfa, 0x21, 0x16, 0x3f, 0x4c, 0x9c, 0x30, 0xd2, 0x6e, 0x4d, 0x4e, 0x3b, 0x26, 0x49, 0x6f, - 0x1a, 0xca, 0x9f, 0x48, 0x6b, 0x35, 0xd5, 0x09, 0xca, 0xc4, 0xec, 0x63, 0x0e, 0x43, 0x2f, 0xc3, - 0x58, 0x40, 0xd8, 0xaa, 0x58, 0xa2, 0xdc, 0x1c, 0x5b, 0x66, 0x83, 0x31, 0xdb, 0x87, 0x35, 0x18, - 0x36, 0x30, 0xe3, 0xb7, 0xc1, 0x50, 0x97, 0xb7, 0xc1, 0xd3, 0x30, 0xcc, 0x7e, 0xa8, 0x15, 0xa0, - 0x66, 0x63, 0x95, 0x17, 0x63, 0x09, 0x4f, 0x2e, 0x98, 0x91, 0xfe, 0x16, 0x0c, 0x7d, 0x7d, 0x88, - 0x45, 0xcd, 0xb4, 0xda, 0x23, 0xfc, 0x94, 0x13, 0x4b, 0x1e, 0x4b, 0x98, 0xfd, 0x01, 0x98, 0xa8, - 0x38, 0xa4, 0xe5, 0x7b, 0xcb, 0x5e, 0xa3, 0xed, 0xbb, 0x5e, 0x84, 0x66, 0x61, 0x80, 0x5d, 0x22, - 0xfc, 0x08, 0x18, 0xa0, 0x0d, 0x61, 0x56, 0x62, 0x6f, 0xc3, 0xe9, 0x8a, 0x7f, 0xd7, 0xbb, 0xeb, - 0x04, 0x8d, 0x85, 0xea, 0xaa, 0xf6, 0xbe, 0x5e, 0x97, 0xef, 0x3b, 0x6e, 0x24, 0x96, 0x79, 0xf4, - 0x6a, 0x35, 0x39, 0x5b, 0xbb, 0xe2, 0x36, 0x49, 0x8e, 0x14, 0xe4, 0xaf, 0x14, 0x8c, 0x96, 0x62, - 0x7c, 0xa5, 0xd5, 0xb2, 0x72, 0xb5, 0x5a, 0x6f, 0xc0, 0xc8, 0x96, 0x4b, 0x9a, 0x0d, 0x4c, 0xb6, - 0xc4, 0x4a, 0x7c, 0x2a, 0xdf, 0xee, 0x65, 0x85, 0x62, 0x4a, 0xa9, 0x17, 0x7f, 0x1d, 0xae, 0x88, - 0xca, 0x58, 0x91, 0x41, 0xbb, 0x30, 0x25, 0x1f, 0x0c, 0x12, 0x2a, 0xd6, 0xe5, 0xd3, 0xdd, 0x5e, - 0x21, 0x26, 0xf1, 0x53, 0xf7, 0x0f, 0xca, 0x53, 0x38, 0x41, 0x06, 0xa7, 0x08, 0xd3, 0xe7, 0x60, - 0x8b, 0x9e, 0xc0, 0x03, 0x6c, 0xf8, 0xd9, 0x73, 0x90, 0xbd, 0x6c, 0x59, 0xa9, 0xfd, 0x13, 0x16, - 0x3c, 0x92, 0x1a, 0x19, 0xf1, 0xc2, 0x3f, 0xe6, 0x59, 0x48, 0xbe, 0xb8, 0x0b, 0xbd, 0x5f, 0xdc, - 0xf6, 0xdf, 0xb6, 0xe0, 0xd4, 0x72, 0xab, 0x1d, 0xed, 0x57, 0x5c, 0x53, 0x05, 0xf5, 0x61, 0x18, - 0x6a, 0x91, 0x86, 0xdb, 0x69, 0x89, 0x99, 0x2b, 0xcb, 0x53, 0x6a, 0x8d, 0x95, 0x1e, 0x1e, 0x94, - 0xc7, 0x6b, 0x91, 0x1f, 0x38, 0xdb, 0x84, 0x17, 0x60, 0x81, 0xce, 0xce, 0x7a, 0xf7, 0x6d, 0x72, - 0xc3, 0x6d, 0xb9, 0xd2, 0x8e, 0xa9, 0xab, 0xcc, 0x6e, 0x5e, 0x0e, 0xe8, 0xfc, 0x1b, 0x1d, 0xc7, - 0x8b, 0xdc, 0x68, 0x5f, 0x68, 0x8f, 0x24, 0x11, 0x1c, 0xd3, 0xb3, 0xbf, 0x6e, 0xc1, 0xa4, 0x5c, - 0xf7, 0x0b, 0x8d, 0x46, 0x40, 0xc2, 0x10, 0xcd, 0x41, 0xc1, 0x6d, 0x8b, 0x5e, 0x82, 0xe8, 0x65, - 0x61, 0xb5, 0x8a, 0x0b, 0x6e, 0x5b, 0xb2, 0x65, 0xec, 0x20, 0x2c, 0x9a, 0x8a, 0xb4, 0x6b, 0xa2, - 0x1c, 0x2b, 0x0c, 0x74, 0x09, 0x46, 0x3c, 0xbf, 0xc1, 0x6d, 0xc9, 0xf8, 0x95, 0xc6, 0x16, 0xd8, - 0xba, 0x28, 0xc3, 0x0a, 0x8a, 0xaa, 0x50, 0xe2, 0x66, 0x56, 0xf1, 0xa2, 0xed, 0xcb, 0x58, 0x8b, - 0x7d, 0xd9, 0x86, 0xac, 0x89, 0x63, 0x22, 0xf6, 0xaf, 0x5a, 0x30, 0x26, 0xbf, 0xac, 0x4f, 0x9e, - 0x93, 0x6e, 0xad, 0x98, 0xdf, 0x8c, 0xb7, 0x16, 0xe5, 0x19, 0x19, 0xc4, 0x60, 0x15, 0x8b, 0x47, - 0x62, 0x15, 0xaf, 0xc0, 0xa8, 0xd3, 0x6e, 0x57, 0x4d, 0x3e, 0x93, 0x2d, 0xa5, 0x85, 0xb8, 0x18, - 0xeb, 0x38, 0xf6, 0x8f, 0x17, 0x60, 0x42, 0x7e, 0x41, 0xad, 0xb3, 0x19, 0x92, 0x08, 0x6d, 0x40, - 0xc9, 0xe1, 0xb3, 0x44, 0xe4, 0x22, 0x7f, 0x22, 0x5b, 0x8e, 0x60, 0x4c, 0x69, 0x7c, 0xe1, 0x2f, - 0xc8, 0xda, 0x38, 0x26, 0x84, 0x9a, 0x30, 0xed, 0xf9, 0x11, 0x3b, 0xfc, 0x15, 0xbc, 0x9b, 0x6a, - 0x27, 0x49, 0xfd, 0xac, 0xa0, 0x3e, 0xbd, 0x9e, 0xa4, 0x82, 0xd3, 0x84, 0xd1, 0xb2, 0x94, 0xcd, - 0x14, 0xf3, 0x85, 0x01, 0xfa, 0xc4, 0x65, 0x8b, 0x66, 0xec, 0x5f, 0xb1, 0xa0, 0x24, 0xd1, 0x4e, - 0x42, 0x8b, 0xb7, 0x06, 0xc3, 0x21, 0x9b, 0x04, 0x39, 0x34, 0x76, 0xb7, 0x8e, 0xf3, 0xf9, 0x8a, - 0xef, 0x34, 0xfe, 0x3f, 0xc4, 0x92, 0x06, 0x13, 0xcd, 0xab, 0xee, 0xbf, 0x4b, 0x44, 0xf3, 0xaa, - 0x3f, 0x39, 0x97, 0xd2, 0x1f, 0xb1, 0x3e, 0x6b, 0xb2, 0x2e, 0xca, 0x7a, 0xb5, 0x03, 0xb2, 0xe5, - 0xde, 0x4b, 0xb2, 0x5e, 0x55, 0x56, 0x8a, 0x05, 0x14, 0xbd, 0x09, 0x63, 0x75, 0x29, 0x93, 0x8d, - 0x77, 0xf8, 0xc5, 0xae, 0xfa, 0x01, 0xa5, 0x4a, 0xe2, 0xb2, 0x90, 0x25, 0xad, 0x3e, 0x36, 0xa8, - 0x99, 0x66, 0x04, 0xc5, 0x5e, 0x66, 0x04, 0x31, 0xdd, 0x7c, 0xa5, 0xfa, 0x4f, 0x5a, 0x30, 0xc4, - 0x65, 0x71, 0xfd, 0x89, 0x42, 0x35, 0xcd, 0x5a, 0x3c, 0x76, 0xb7, 0x69, 0xa1, 0xd0, 0x94, 0xa1, - 0x35, 0x28, 0xb1, 0x1f, 0x4c, 0x96, 0x58, 0xcc, 0xb7, 0xf2, 0xe7, 0xad, 0xea, 0x1d, 0xbc, 0x2d, - 0xab, 0xe1, 0x98, 0x82, 0xfd, 0x63, 0x45, 0x7a, 0xba, 0xc5, 0xa8, 0xc6, 0xa5, 0x6f, 0x3d, 0xbc, - 0x4b, 0xbf, 0xf0, 0xb0, 0x2e, 0xfd, 0x6d, 0x98, 0xac, 0x6b, 0x7a, 0xb8, 0x78, 0x26, 0x2f, 0x75, - 0x5d, 0x24, 0x9a, 0xca, 0x8e, 0x4b, 0x59, 0x96, 0x4c, 0x22, 0x38, 0x49, 0x15, 0x7d, 0x17, 0x8c, - 0xf1, 0x79, 0x16, 0xad, 0x70, 0x4b, 0x8c, 0xf7, 0xe7, 0xaf, 0x17, 0xbd, 0x09, 0x2e, 0x95, 0xd3, - 0xaa, 0x63, 0x83, 0x98, 0xfd, 0xa7, 0x16, 0xa0, 0xe5, 0xf6, 0x0e, 0x69, 0x91, 0xc0, 0x69, 0xc6, - 0xe2, 0xf4, 0x1f, 0xb6, 0x60, 0x96, 0xa4, 0x8a, 0x97, 0xfc, 0x56, 0x4b, 0x3c, 0x5a, 0x72, 0xde, - 0xd5, 0xcb, 0x39, 0x75, 0x94, 0x1b, 0xc4, 0x6c, 0x1e, 0x06, 0xce, 0x6d, 0x0f, 0xad, 0xc1, 0x0c, - 0xbf, 0x25, 0x15, 0x40, 0xb3, 0xf5, 0x7e, 0x54, 0x10, 0x9e, 0xd9, 0x48, 0xa3, 0xe0, 0xac, 0x7a, - 0xf6, 0xf7, 0x8d, 0x41, 0x6e, 0x2f, 0xde, 0xd3, 0x23, 0xbc, 0xa7, 0x47, 0x78, 0x4f, 0x8f, 0xf0, - 0x9e, 0x1e, 0xe1, 0x3d, 0x3d, 0xc2, 0xb7, 0xbd, 0x1e, 0xe1, 0x2f, 0x59, 0x70, 0x5a, 0x5d, 0x03, - 0xc6, 0xc3, 0xf7, 0x73, 0x30, 0xc3, 0xb7, 0xdb, 0x52, 0xd3, 0x71, 0x5b, 0x1b, 0xa4, 0xd5, 0x6e, - 0x3a, 0x91, 0xd4, 0xba, 0x5f, 0xc9, 0x5c, 0xb9, 0x09, 0x8b, 0x55, 0xa3, 0x22, 0x37, 0xfd, 0xcf, - 0x00, 0xe0, 0xac, 0x66, 0xec, 0x5f, 0x1c, 0x81, 0xc1, 0xe5, 0x3d, 0xe2, 0x45, 0x27, 0xf0, 0x44, - 0xa8, 0xc3, 0x84, 0xeb, 0xed, 0xf9, 0xcd, 0x3d, 0xd2, 0xe0, 0xf0, 0xa3, 0xbc, 0x64, 0xcf, 0x08, - 0xd2, 0x13, 0xab, 0x06, 0x09, 0x9c, 0x20, 0xf9, 0x30, 0xa4, 0xc9, 0x57, 0x61, 0x88, 0x1f, 0xe2, - 0x42, 0x94, 0x9c, 0x79, 0x66, 0xb3, 0x41, 0x14, 0x57, 0x53, 0x2c, 0xe9, 0xe6, 0x97, 0x84, 0xa8, - 0x8e, 0x3e, 0x0b, 0x13, 0x5b, 0x6e, 0x10, 0x46, 0x1b, 0x6e, 0x8b, 0x84, 0x91, 0xd3, 0x6a, 0x3f, - 0x80, 0xf4, 0x58, 0x8d, 0xc3, 0x8a, 0x41, 0x09, 0x27, 0x28, 0xa3, 0x6d, 0x18, 0x6f, 0x3a, 0x7a, - 0x53, 0xc3, 0x47, 0x6e, 0x4a, 0xdd, 0x0e, 0x37, 0x74, 0x42, 0xd8, 0xa4, 0x4b, 0xb7, 0x53, 0x9d, - 0x09, 0x40, 0x47, 0x98, 0x58, 0x40, 0x6d, 0x27, 0x2e, 0xf9, 0xe4, 0x30, 0xca, 0xe8, 0x30, 0x03, - 0xd9, 0x92, 0xc9, 0xe8, 0x68, 0x66, 0xb0, 0x9f, 0x81, 0x12, 0xa1, 0x43, 0x48, 0x09, 0x8b, 0x0b, - 0xe6, 0x72, 0x7f, 0x7d, 0x5d, 0x73, 0xeb, 0x81, 0x6f, 0xca, 0xed, 0x97, 0x25, 0x25, 0x1c, 0x13, - 0x45, 0x4b, 0x30, 0x14, 0x92, 0xc0, 0x25, 0xa1, 0xb8, 0x6a, 0xba, 0x4c, 0x23, 0x43, 0xe3, 0xbe, - 0x25, 0xfc, 0x37, 0x16, 0x55, 0xe9, 0xf2, 0x72, 0x98, 0x48, 0x93, 0x5d, 0x06, 0xda, 0xf2, 0x5a, - 0x60, 0xa5, 0x58, 0x40, 0xd1, 0xeb, 0x30, 0x1c, 0x90, 0x26, 0x53, 0x0c, 0x8d, 0xf7, 0xbf, 0xc8, - 0xb9, 0x9e, 0x89, 0xd7, 0xc3, 0x92, 0x00, 0xba, 0x0e, 0x28, 0x20, 0x94, 0x51, 0x72, 0xbd, 0x6d, - 0x65, 0x36, 0x2a, 0x0e, 0x5a, 0xc5, 0x90, 0xe2, 0x18, 0x43, 0xba, 0x15, 0xe1, 0x8c, 0x6a, 0xe8, - 0x2a, 0x4c, 0xab, 0xd2, 0x55, 0x2f, 0x8c, 0x1c, 0x7a, 0xc0, 0x4d, 0x32, 0x5a, 0x4a, 0x4e, 0x81, - 0x93, 0x08, 0x38, 0x5d, 0xc7, 0xfe, 0xb2, 0x05, 0x7c, 0x9c, 0x4f, 0xe0, 0x75, 0xfe, 0x9a, 0xf9, - 0x3a, 0x3f, 0x9b, 0x3b, 0x73, 0x39, 0x2f, 0xf3, 0x2f, 0x5b, 0x30, 0xaa, 0xcd, 0x6c, 0xbc, 0x66, - 0xad, 0x2e, 0x6b, 0xb6, 0x03, 0x53, 0x74, 0xa5, 0xdf, 0xdc, 0x0c, 0x49, 0xb0, 0x47, 0x1a, 0x6c, - 0x61, 0x16, 0x1e, 0x6c, 0x61, 0x2a, 0x13, 0xb5, 0x1b, 0x09, 0x82, 0x38, 0xd5, 0x84, 0xfd, 0x19, - 0xd9, 0x55, 0x65, 0xd1, 0x57, 0x57, 0x73, 0x9e, 0xb0, 0xe8, 0x53, 0xb3, 0x8a, 0x63, 0x1c, 0xba, - 0xd5, 0x76, 0xfc, 0x30, 0x4a, 0x5a, 0xf4, 0x5d, 0xf3, 0xc3, 0x08, 0x33, 0x88, 0xfd, 0x02, 0xc0, - 0xf2, 0x3d, 0x52, 0xe7, 0x2b, 0x56, 0x7f, 0x3c, 0x58, 0xf9, 0x8f, 0x07, 0xfb, 0xb7, 0x2d, 0x98, - 0x58, 0x59, 0x32, 0x6e, 0xae, 0x79, 0x00, 0xfe, 0xe2, 0xb9, 0x73, 0x67, 0x5d, 0xaa, 0xc3, 0xb9, - 0x46, 0x53, 0x95, 0x62, 0x0d, 0x03, 0x9d, 0x85, 0x62, 0xb3, 0xe3, 0x09, 0xf1, 0xe1, 0x30, 0xbd, - 0x1e, 0x6f, 0x74, 0x3c, 0x4c, 0xcb, 0x34, 0x97, 0x82, 0x62, 0xdf, 0x2e, 0x05, 0x3d, 0x43, 0x09, - 0xa0, 0x32, 0x0c, 0xde, 0xbd, 0xeb, 0x36, 0xb8, 0xc3, 0xa6, 0x50, 0xd5, 0xdf, 0xb9, 0xb3, 0x5a, - 0x09, 0x31, 0x2f, 0xb7, 0xbf, 0x58, 0x84, 0xb9, 0x95, 0x26, 0xb9, 0xf7, 0x0e, 0x9d, 0x56, 0xfb, - 0x75, 0x88, 0x38, 0x9a, 0x20, 0xe6, 0xa8, 0x4e, 0x2f, 0xbd, 0xc7, 0x63, 0x0b, 0x86, 0xb9, 0x41, - 0x9b, 0x74, 0x61, 0x7d, 0x35, 0xab, 0xf5, 0xfc, 0x01, 0x99, 0xe7, 0x86, 0x71, 0xc2, 0x23, 0x4e, - 0x5d, 0x98, 0xa2, 0x14, 0x4b, 0xe2, 0x73, 0xaf, 0xc0, 0x98, 0x8e, 0x79, 0x24, 0xf7, 0xb3, 0xff, - 0xa7, 0x08, 0x53, 0xb4, 0x07, 0x0f, 0x75, 0x22, 0x6e, 0xa5, 0x27, 0xe2, 0xb8, 0x5d, 0x90, 0x7a, - 0xcf, 0xc6, 0x9b, 0xc9, 0xd9, 0xb8, 0x92, 0x37, 0x1b, 0x27, 0x3d, 0x07, 0xdf, 0x6b, 0xc1, 0xcc, - 0x4a, 0xd3, 0xaf, 0xef, 0x26, 0xdc, 0x84, 0x5e, 0x82, 0x51, 0x7a, 0x1c, 0x87, 0x86, 0xc7, 0xbc, - 0x11, 0x43, 0x41, 0x80, 0xb0, 0x8e, 0xa7, 0x55, 0xbb, 0x75, 0x6b, 0xb5, 0x92, 0x15, 0x7a, 0x41, - 0x80, 0xb0, 0x8e, 0x67, 0xff, 0x86, 0x05, 0xe7, 0xae, 0x2e, 0x2d, 0xc7, 0x4b, 0x31, 0x15, 0xfd, - 0xe1, 0x22, 0x0c, 0xb5, 0x1b, 0x5a, 0x57, 0x62, 0xf1, 0x6a, 0x85, 0xf5, 0x42, 0x40, 0xdf, 0x2d, - 0x91, 0x4d, 0x6e, 0x01, 0x5c, 0xc5, 0xd5, 0x25, 0x71, 0xee, 0x4a, 0x6d, 0x8a, 0x95, 0xab, 0x4d, - 0x79, 0x3f, 0x0c, 0xd3, 0x7b, 0xc1, 0xad, 0xcb, 0x7e, 0x73, 0x05, 0x2d, 0x2f, 0xc2, 0x12, 0x66, - 0xff, 0xac, 0x05, 0x33, 0x57, 0xdd, 0x88, 0x5e, 0xda, 0xc9, 0xf0, 0x06, 0xf4, 0xd6, 0x0e, 0xdd, - 0xc8, 0x0f, 0xf6, 0x93, 0xe1, 0x0d, 0xb0, 0x82, 0x60, 0x0d, 0x8b, 0x7f, 0xd0, 0x9e, 0xcb, 0x2c, - 0xb4, 0x0b, 0xa6, 0xfe, 0x0a, 0x8b, 0x72, 0xac, 0x30, 0xe8, 0x78, 0x35, 0xdc, 0x80, 0x89, 0xfe, - 0xf6, 0xc5, 0xc1, 0xad, 0xc6, 0xab, 0x22, 0x01, 0x38, 0xc6, 0xb1, 0xff, 0xd8, 0x82, 0xf2, 0xd5, - 0x66, 0x27, 0x8c, 0x48, 0xb0, 0x15, 0xe6, 0x1c, 0xba, 0x2f, 0x40, 0x89, 0x48, 0x41, 0xbb, 0xe8, - 0xb5, 0x62, 0x44, 0x95, 0x04, 0x9e, 0x47, 0x59, 0x50, 0x78, 0x7d, 0xf8, 0x32, 0x1e, 0xcd, 0x19, - 0x6d, 0x05, 0x10, 0xd1, 0xdb, 0xd2, 0xc3, 0x4e, 0x30, 0xff, 0xf5, 0xe5, 0x14, 0x14, 0x67, 0xd4, - 0xb0, 0x7f, 0xc2, 0x82, 0xd3, 0xea, 0x83, 0xdf, 0x75, 0x9f, 0x69, 0x7f, 0xb5, 0x00, 0xe3, 0xd7, - 0x36, 0x36, 0xaa, 0x57, 0x49, 0xa4, 0xad, 0xca, 0xee, 0xea, 0x73, 0xac, 0x69, 0x01, 0xbb, 0xbd, - 0x11, 0x3b, 0x91, 0xdb, 0x9c, 0xe7, 0xd1, 0x8b, 0xe6, 0x57, 0xbd, 0xe8, 0x66, 0x50, 0x8b, 0x02, - 0xd7, 0xdb, 0xce, 0x5c, 0xe9, 0x92, 0x67, 0x29, 0xe6, 0xf1, 0x2c, 0xe8, 0x05, 0x18, 0x62, 0xe1, - 0x93, 0xe4, 0x24, 0x3c, 0xaa, 0x9e, 0x58, 0xac, 0xf4, 0xf0, 0xa0, 0x5c, 0xba, 0x85, 0x57, 0xf9, - 0x1f, 0x2c, 0x50, 0xd1, 0x2d, 0x18, 0xdd, 0x89, 0xa2, 0xf6, 0x35, 0xe2, 0x34, 0x48, 0x20, 0x4f, - 0xd9, 0xf3, 0x59, 0xa7, 0x2c, 0x1d, 0x04, 0x8e, 0x16, 0x1f, 0x4c, 0x71, 0x59, 0x88, 0x75, 0x3a, - 0x76, 0x0d, 0x20, 0x86, 0x1d, 0x93, 0x02, 0xc4, 0xde, 0x80, 0x12, 0xfd, 0xdc, 0x85, 0xa6, 0xeb, - 0x74, 0x57, 0x31, 0x3f, 0x03, 0x25, 0xa9, 0x40, 0x0e, 0x85, 0xaf, 0x35, 0xbb, 0x91, 0xa4, 0x7e, - 0x39, 0xc4, 0x31, 0xdc, 0xde, 0x82, 0x53, 0xcc, 0x1c, 0xd0, 0x89, 0x76, 0x8c, 0xd5, 0xd7, 0x7b, - 0x9a, 0x9f, 0x15, 0x2f, 0x36, 0xde, 0xe7, 0x59, 0xcd, 0x9d, 0x71, 0x4c, 0x52, 0x8c, 0x5f, 0x6f, - 0xf6, 0x37, 0x06, 0xe0, 0xd1, 0xd5, 0x5a, 0x7e, 0xf8, 0x8f, 0x97, 0x61, 0x8c, 0x33, 0x82, 0x74, - 0xd2, 0x9d, 0xa6, 0x68, 0x57, 0xc9, 0x36, 0x37, 0x34, 0x18, 0x36, 0x30, 0xd1, 0x39, 0x28, 0xba, - 0x6f, 0x79, 0x49, 0x67, 0x9f, 0xd5, 0x37, 0xd6, 0x31, 0x2d, 0xa7, 0x60, 0xca, 0x53, 0xf2, 0xc3, - 0x5a, 0x81, 0x15, 0x5f, 0xf9, 0x1a, 0x4c, 0xb8, 0x61, 0x3d, 0x74, 0x57, 0x3d, 0xba, 0x03, 0xb5, - 0x3d, 0xac, 0xa4, 0x09, 0xb4, 0xd3, 0x0a, 0x8a, 0x13, 0xd8, 0xda, 0xcd, 0x31, 0xd8, 0x37, 0x5f, - 0xda, 0xd3, 0xf9, 0x98, 0x1e, 0xec, 0x6d, 0xf6, 0x75, 0x21, 0x13, 0x52, 0x8b, 0x83, 0x9d, 0x7f, - 0x70, 0x88, 0x25, 0x8c, 0x3e, 0xd5, 0xea, 0x3b, 0x4e, 0x7b, 0xa1, 0x13, 0xed, 0x54, 0xdc, 0xb0, - 0xee, 0xef, 0x91, 0x60, 0x9f, 0xbd, 0xb2, 0x47, 0xe2, 0xa7, 0x9a, 0x02, 0x2c, 0x5d, 0x5b, 0xa8, - 0x52, 0x4c, 0x9c, 0xae, 0x83, 0x16, 0x60, 0x52, 0x16, 0xd6, 0x48, 0xc8, 0x0e, 0xf7, 0x51, 0x46, - 0x46, 0xb9, 0xdf, 0x88, 0x62, 0x45, 0x24, 0x89, 0x6f, 0xb2, 0xae, 0x70, 0x1c, 0xac, 0xeb, 0x87, - 0x61, 0xdc, 0xf5, 0xdc, 0xc8, 0x75, 0x22, 0x9f, 0x6b, 0x58, 0xf8, 0x83, 0x9a, 0x89, 0x8e, 0x57, - 0x75, 0x00, 0x36, 0xf1, 0xec, 0xff, 0x38, 0x00, 0xd3, 0x6c, 0xda, 0xde, 0x5b, 0x61, 0xdf, 0x4e, - 0x2b, 0xec, 0x56, 0x7a, 0x85, 0x1d, 0x07, 0x4f, 0xfe, 0xc0, 0xcb, 0xec, 0xb3, 0x50, 0x52, 0x1e, - 0x47, 0xd2, 0xe5, 0xd0, 0xca, 0x71, 0x39, 0xec, 0x7d, 0x2f, 0x4b, 0xa3, 0xad, 0x62, 0xa6, 0xd1, - 0xd6, 0x57, 0x2c, 0x88, 0x55, 0x06, 0xe8, 0x0d, 0x28, 0xb5, 0x7d, 0x66, 0x8b, 0x18, 0x48, 0x03, - 0xdf, 0x27, 0xbb, 0xea, 0x1c, 0x78, 0x04, 0xa4, 0x80, 0x8f, 0x42, 0x55, 0x56, 0xc5, 0x31, 0x15, - 0x74, 0x1d, 0x86, 0xdb, 0x01, 0xa9, 0x45, 0x2c, 0x3c, 0x47, 0xff, 0x04, 0xf9, 0xaa, 0xe1, 0x15, - 0xb1, 0xa4, 0x60, 0xff, 0x27, 0x0b, 0xa6, 0x92, 0xa8, 0xe8, 0x23, 0x30, 0x40, 0xee, 0x91, 0xba, - 0xe8, 0x6f, 0xe6, 0x25, 0x1b, 0x0b, 0x1d, 0xf8, 0x00, 0xd0, 0xff, 0x98, 0xd5, 0x42, 0xd7, 0x60, - 0x98, 0xde, 0xb0, 0x57, 0x55, 0x28, 0xaa, 0xc7, 0xf3, 0x6e, 0x69, 0xc5, 0xaa, 0xf0, 0xce, 0x89, - 0x22, 0x2c, 0xab, 0x33, 0x4b, 0xa9, 0x7a, 0xbb, 0x46, 0x1f, 0x2f, 0x51, 0xb7, 0x37, 0xf6, 0xc6, - 0x52, 0x95, 0x23, 0x09, 0x6a, 0xdc, 0x52, 0x4a, 0x16, 0xe2, 0x98, 0x88, 0xfd, 0xf3, 0x16, 0x00, - 0x37, 0x0c, 0x73, 0xbc, 0x6d, 0x72, 0x02, 0x72, 0xf2, 0x0a, 0x0c, 0x84, 0x6d, 0x52, 0xef, 0x66, - 0x26, 0x1b, 0xf7, 0xa7, 0xd6, 0x26, 0xf5, 0x78, 0xc5, 0xd1, 0x7f, 0x98, 0xd5, 0xb6, 0xbf, 0x1f, - 0x60, 0x22, 0x46, 0x5b, 0x8d, 0x48, 0x0b, 0x3d, 0x67, 0x84, 0x29, 0x38, 0x9b, 0x08, 0x53, 0x50, - 0x62, 0xd8, 0x9a, 0x48, 0xf6, 0xb3, 0x50, 0x6c, 0x39, 0xf7, 0x84, 0xcc, 0xed, 0x99, 0xee, 0xdd, - 0xa0, 0xf4, 0xe7, 0xd7, 0x9c, 0x7b, 0xfc, 0x59, 0xfa, 0x8c, 0xdc, 0x21, 0x6b, 0xce, 0xbd, 0x43, - 0x6e, 0x0c, 0xcb, 0x4e, 0xe9, 0x1b, 0x6e, 0x18, 0x7d, 0xfe, 0x3f, 0xc4, 0xff, 0xd9, 0xbe, 0xa3, - 0x8d, 0xb0, 0xb6, 0x5c, 0x4f, 0xd8, 0x3c, 0xf5, 0xd5, 0x96, 0xeb, 0x25, 0xdb, 0x72, 0xbd, 0x3e, - 0xda, 0x72, 0x3d, 0xf4, 0x36, 0x0c, 0x0b, 0x93, 0x44, 0x11, 0x16, 0xe8, 0x72, 0x1f, 0xed, 0x09, - 0x8b, 0x46, 0xde, 0xe6, 0x65, 0xf9, 0xec, 0x16, 0xa5, 0x3d, 0xdb, 0x95, 0x0d, 0xa2, 0xbf, 0x6c, - 0xc1, 0x84, 0xf8, 0x8d, 0xc9, 0x5b, 0x1d, 0x12, 0x46, 0x82, 0x2d, 0xfd, 0x50, 0xff, 0x7d, 0x10, - 0x15, 0x79, 0x57, 0x3e, 0x24, 0xef, 0x19, 0x13, 0xd8, 0xb3, 0x47, 0x89, 0x5e, 0xa0, 0xbf, 0x6b, - 0xc1, 0xa9, 0x96, 0x73, 0x8f, 0xb7, 0xc8, 0xcb, 0xb0, 0x13, 0xb9, 0xbe, 0x50, 0xed, 0x7f, 0xa4, - 0xbf, 0xe9, 0x4f, 0x55, 0xe7, 0x9d, 0x94, 0xfa, 0xc7, 0x53, 0x59, 0x28, 0x3d, 0xbb, 0x9a, 0xd9, - 0xaf, 0xb9, 0x2d, 0x18, 0x91, 0xeb, 0x2d, 0x43, 0xb8, 0x51, 0xd1, 0x79, 0xee, 0x23, 0x5b, 0x84, - 0xea, 0xee, 0xff, 0xb4, 0x1d, 0xb1, 0xd6, 0x1e, 0x6a, 0x3b, 0x9f, 0x85, 0x31, 0x7d, 0x8d, 0x3d, - 0xd4, 0xb6, 0xde, 0x82, 0x99, 0x8c, 0xb5, 0xf4, 0x50, 0x9b, 0xbc, 0x0b, 0x67, 0x73, 0xd7, 0xc7, - 0xc3, 0x6c, 0xd8, 0xfe, 0xaa, 0xa5, 0x9f, 0x83, 0x27, 0xa0, 0xac, 0x58, 0x32, 0x95, 0x15, 0xe7, - 0xbb, 0xef, 0x9c, 0x1c, 0x8d, 0xc5, 0x9b, 0x7a, 0xa7, 0xe9, 0xa9, 0x8e, 0x5e, 0x87, 0xa1, 0x26, - 0x2d, 0x91, 0x86, 0xad, 0x76, 0xef, 0x1d, 0x19, 0x33, 0x93, 0xac, 0x3c, 0xc4, 0x82, 0x82, 0xfd, - 0x4b, 0x16, 0x0c, 0x9c, 0xc0, 0x48, 0x60, 0x73, 0x24, 0x9e, 0xcb, 0x25, 0x2d, 0x22, 0x24, 0xcf, - 0x63, 0xe7, 0xee, 0xf2, 0xbd, 0x88, 0x78, 0x21, 0xbb, 0x91, 0x33, 0x07, 0xe6, 0xa7, 0x2d, 0x98, - 0xb9, 0xe1, 0x3b, 0x8d, 0x45, 0xa7, 0xe9, 0x78, 0x75, 0x12, 0xac, 0x7a, 0xdb, 0x47, 0xb2, 0xca, - 0x2e, 0xf4, 0xb4, 0xca, 0x5e, 0x92, 0x46, 0x4d, 0x03, 0xf9, 0xf3, 0x47, 0x39, 0xe9, 0x64, 0xe0, - 0x16, 0xc3, 0xfc, 0x76, 0x07, 0x90, 0xde, 0x4b, 0xe1, 0x23, 0x83, 0x61, 0xd8, 0xe5, 0xfd, 0x15, - 0x93, 0xf8, 0x54, 0x36, 0x87, 0x9b, 0xfa, 0x3c, 0xcd, 0xfb, 0x83, 0x17, 0x60, 0x49, 0xc8, 0x7e, - 0x19, 0x32, 0x1d, 0xed, 0x7b, 0xcb, 0x25, 0xec, 0x4f, 0xc0, 0x34, 0xab, 0x79, 0x44, 0xc9, 0x80, - 0x9d, 0x90, 0xa6, 0x66, 0x84, 0xe0, 0xb3, 0xbf, 0x60, 0xc1, 0xe4, 0x7a, 0x22, 0x32, 0xd9, 0x45, - 0xa6, 0x7f, 0xcd, 0x10, 0xe2, 0xd7, 0x58, 0x29, 0x16, 0xd0, 0x63, 0x17, 0x72, 0xfd, 0x85, 0x05, - 0x71, 0xec, 0x8b, 0x13, 0x60, 0xdf, 0x96, 0x0c, 0xf6, 0x2d, 0x93, 0x91, 0x55, 0xdd, 0xc9, 0xe3, - 0xde, 0xd0, 0x75, 0x15, 0x15, 0xaa, 0x0b, 0x0f, 0x1b, 0x93, 0xe1, 0x4b, 0x71, 0xc2, 0x0c, 0x1d, - 0x25, 0xe3, 0x44, 0xd9, 0xbf, 0x53, 0x00, 0xa4, 0x70, 0xfb, 0x8e, 0x5a, 0x95, 0xae, 0x71, 0x3c, - 0x51, 0xab, 0xf6, 0x00, 0x31, 0x0b, 0x82, 0xc0, 0xf1, 0x42, 0x4e, 0xd6, 0x15, 0x62, 0xbd, 0xa3, - 0x99, 0x27, 0xcc, 0x89, 0x26, 0xd1, 0x8d, 0x14, 0x35, 0x9c, 0xd1, 0x82, 0x66, 0x19, 0x32, 0xd8, - 0xaf, 0x65, 0xc8, 0x50, 0x0f, 0x3f, 0xb8, 0x9f, 0xb3, 0x60, 0x5c, 0x0d, 0xd3, 0xbb, 0xc4, 0x4a, - 0x5d, 0xf5, 0x27, 0xe7, 0x00, 0xad, 0x6a, 0x5d, 0x66, 0x17, 0xcb, 0x77, 0x32, 0x7f, 0x46, 0xa7, - 0xe9, 0xbe, 0x4d, 0x54, 0xcc, 0xc0, 0xb2, 0xf0, 0x4f, 0x14, 0xa5, 0x87, 0x07, 0xe5, 0x71, 0xf5, - 0x8f, 0xc7, 0x44, 0x8e, 0xab, 0xd0, 0x23, 0x79, 0x32, 0xb1, 0x14, 0xd1, 0x4b, 0x30, 0xd8, 0xde, - 0x71, 0x42, 0x92, 0xf0, 0xe6, 0x19, 0xac, 0xd2, 0xc2, 0xc3, 0x83, 0xf2, 0x84, 0xaa, 0xc0, 0x4a, - 0x30, 0xc7, 0xee, 0x3f, 0x16, 0x58, 0x7a, 0x71, 0xf6, 0x8c, 0x05, 0xf6, 0xa7, 0x16, 0x0c, 0xac, - 0xfb, 0x8d, 0x93, 0x38, 0x02, 0x5e, 0x33, 0x8e, 0x80, 0xc7, 0xf2, 0xc2, 0xd5, 0xe7, 0xee, 0xfe, - 0x95, 0xc4, 0xee, 0x3f, 0x9f, 0x4b, 0xa1, 0xfb, 0xc6, 0x6f, 0xc1, 0x28, 0x0b, 0x82, 0x2f, 0x3c, - 0x97, 0x5e, 0x30, 0x36, 0x7c, 0x39, 0xb1, 0xe1, 0x27, 0x35, 0x54, 0x6d, 0xa7, 0x3f, 0x0d, 0xc3, - 0xc2, 0x15, 0x26, 0xe9, 0x16, 0x2a, 0x70, 0xb1, 0x84, 0xdb, 0x3f, 0x59, 0x04, 0x23, 0xe8, 0x3e, - 0xfa, 0x15, 0x0b, 0xe6, 0x03, 0x6e, 0x22, 0xdb, 0xa8, 0x74, 0x02, 0xd7, 0xdb, 0xae, 0xd5, 0x77, - 0x48, 0xa3, 0xd3, 0x74, 0xbd, 0xed, 0xd5, 0x6d, 0xcf, 0x57, 0xc5, 0xcb, 0xf7, 0x48, 0xbd, 0xc3, - 0xd4, 0x6e, 0x3d, 0x22, 0xfc, 0x2b, 0x53, 0xf3, 0xe7, 0xef, 0x1f, 0x94, 0xe7, 0xf1, 0x91, 0x68, - 0xe3, 0x23, 0xf6, 0x05, 0xfd, 0x86, 0x05, 0x97, 0x79, 0x2c, 0xfa, 0xfe, 0xfb, 0xdf, 0xe5, 0xb5, - 0x5c, 0x95, 0xa4, 0x62, 0x22, 0x1b, 0x24, 0x68, 0x2d, 0x7e, 0x58, 0x0c, 0xe8, 0xe5, 0xea, 0xd1, - 0xda, 0xc2, 0x47, 0xed, 0x9c, 0xfd, 0x4f, 0x8a, 0x30, 0x2e, 0x62, 0x46, 0x89, 0x3b, 0xe0, 0x25, - 0x63, 0x49, 0x3c, 0x9e, 0x58, 0x12, 0xd3, 0x06, 0xf2, 0xf1, 0x1c, 0xff, 0x21, 0x4c, 0xd3, 0xc3, - 0xf9, 0x1a, 0x71, 0x82, 0x68, 0x93, 0x38, 0xdc, 0xe0, 0xab, 0x78, 0xe4, 0xd3, 0x5f, 0xc9, 0x27, - 0x6f, 0x24, 0x89, 0xe1, 0x34, 0xfd, 0x6f, 0xa7, 0x3b, 0xc7, 0x83, 0xa9, 0x54, 0xd8, 0xaf, 0x4f, - 0x42, 0x49, 0xf9, 0x71, 0x88, 0x43, 0xa7, 0x7b, 0xf4, 0xbc, 0x24, 0x05, 0x2e, 0xfe, 0x8a, 0x7d, - 0x88, 0x62, 0x72, 0xf6, 0xdf, 0x2b, 0x18, 0x0d, 0xf2, 0x49, 0x5c, 0x87, 0x11, 0x27, 0x0c, 0xdd, - 0x6d, 0x8f, 0x34, 0xba, 0x49, 0x28, 0x53, 0xcd, 0x30, 0x5f, 0x9a, 0x05, 0x51, 0x13, 0x2b, 0x1a, - 0xe8, 0x1a, 0x37, 0xab, 0xdb, 0x23, 0xdd, 0xc4, 0x93, 0x29, 0x6a, 0x20, 0x0d, 0xef, 0xf6, 0x08, - 0x16, 0xf5, 0xd1, 0xa7, 0xb8, 0xdd, 0xe3, 0x75, 0xcf, 0xbf, 0xeb, 0x5d, 0xf5, 0x7d, 0x19, 0x97, - 0xa1, 0x3f, 0x82, 0xd3, 0xd2, 0xda, 0x51, 0x55, 0xc7, 0x26, 0xb5, 0xfe, 0xe2, 0x68, 0x7e, 0x0e, - 0x58, 0xec, 0x6d, 0xd3, 0x6d, 0x3a, 0x44, 0x04, 0x26, 0x45, 0x40, 0x32, 0x59, 0x26, 0xc6, 0x2e, - 0xf3, 0x29, 0x67, 0xd6, 0x8e, 0x05, 0xe9, 0xd7, 0x4d, 0x12, 0x38, 0x49, 0xd3, 0xfe, 0x19, 0x0b, - 0x98, 0x0b, 0xe9, 0x09, 0xf0, 0x23, 0x1f, 0x35, 0xf9, 0x91, 0xd9, 0xbc, 0x41, 0xce, 0x61, 0x45, - 0x5e, 0xe4, 0x2b, 0xab, 0x1a, 0xf8, 0xf7, 0xf6, 0x85, 0xb1, 0x4a, 0xef, 0xf7, 0x87, 0xfd, 0x3f, - 0x2d, 0x7e, 0x88, 0x29, 0x2f, 0x0b, 0xf4, 0xdd, 0x30, 0x52, 0x77, 0xda, 0x4e, 0x9d, 0x67, 0x88, - 0xc9, 0x95, 0xe8, 0x19, 0x95, 0xe6, 0x97, 0x44, 0x0d, 0x2e, 0xa1, 0x92, 0x81, 0xed, 0x46, 0x64, - 0x71, 0x4f, 0xa9, 0x94, 0x6a, 0x72, 0x6e, 0x17, 0xc6, 0x0d, 0x62, 0x0f, 0x55, 0x9c, 0xf1, 0xdd, - 0xfc, 0x8a, 0x55, 0x81, 0x18, 0x5b, 0x30, 0xed, 0x69, 0xff, 0xe9, 0x85, 0x22, 0x1f, 0x97, 0x4f, - 0xf6, 0xba, 0x44, 0xd9, 0xed, 0xa3, 0x79, 0xa7, 0x26, 0xc8, 0xe0, 0x34, 0x65, 0xfb, 0xa7, 0x2c, - 0x78, 0x44, 0x47, 0xd4, 0x1c, 0x60, 0x7a, 0x29, 0x49, 0x2a, 0x30, 0xe2, 0xb7, 0x49, 0xe0, 0x44, - 0x7e, 0x20, 0x6e, 0x8d, 0x4b, 0x72, 0xd0, 0x6f, 0x8a, 0xf2, 0x43, 0x11, 0xef, 0x5c, 0x52, 0x97, - 0xe5, 0x58, 0xd5, 0xa4, 0xaf, 0x4f, 0x36, 0x18, 0xa1, 0x70, 0x75, 0x62, 0x67, 0x00, 0xd3, 0xa4, - 0x87, 0x58, 0x40, 0xec, 0x6f, 0x58, 0x7c, 0x61, 0xe9, 0x5d, 0x47, 0x6f, 0xc1, 0x54, 0xcb, 0x89, - 0xea, 0x3b, 0xcb, 0xf7, 0xda, 0x01, 0x57, 0x39, 0xc9, 0x71, 0x7a, 0xa6, 0xd7, 0x38, 0x69, 0x1f, - 0x19, 0x9b, 0x72, 0xae, 0x25, 0x88, 0xe1, 0x14, 0x79, 0xb4, 0x09, 0xa3, 0xac, 0x8c, 0x79, 0xf1, - 0x85, 0xdd, 0x58, 0x83, 0xbc, 0xd6, 0x94, 0x31, 0xc2, 0x5a, 0x4c, 0x07, 0xeb, 0x44, 0xed, 0xaf, - 0x14, 0xf9, 0x6e, 0x67, 0xac, 0xfc, 0xd3, 0x30, 0xdc, 0xf6, 0x1b, 0x4b, 0xab, 0x15, 0x2c, 0x66, - 0x41, 0x5d, 0x23, 0x55, 0x5e, 0x8c, 0x25, 0x1c, 0x5d, 0x82, 0x11, 0xf1, 0x53, 0xaa, 0x08, 0xd9, - 0xd9, 0x2c, 0xf0, 0x42, 0xac, 0xa0, 0xe8, 0x79, 0x80, 0x76, 0xe0, 0xef, 0xb9, 0x0d, 0x16, 0x5d, - 0xa2, 0x68, 0xda, 0x11, 0x55, 0x15, 0x04, 0x6b, 0x58, 0xe8, 0x55, 0x18, 0xef, 0x78, 0x21, 0x67, - 0x47, 0xb4, 0x58, 0xb2, 0xca, 0xc2, 0xe5, 0x96, 0x0e, 0xc4, 0x26, 0x2e, 0x5a, 0x80, 0xa1, 0xc8, - 0x61, 0x76, 0x31, 0x83, 0xf9, 0xe6, 0xbe, 0x1b, 0x14, 0x43, 0x4f, 0x46, 0x42, 0x2b, 0x60, 0x51, - 0x11, 0x7d, 0x52, 0x3a, 0xd4, 0xf2, 0x83, 0x5d, 0xd8, 0xd9, 0xf7, 0x77, 0x09, 0x68, 0xee, 0xb4, - 0xc2, 0x7e, 0xdf, 0xa0, 0x85, 0x5e, 0x01, 0x20, 0xf7, 0x22, 0x12, 0x78, 0x4e, 0x53, 0x59, 0xb3, - 0x29, 0xbe, 0xa0, 0xe2, 0xaf, 0xfb, 0xd1, 0xad, 0x90, 0x2c, 0x2b, 0x0c, 0xac, 0x61, 0xdb, 0xbf, - 0x51, 0x02, 0x88, 0xf9, 0x76, 0xf4, 0x76, 0xea, 0xe0, 0x7a, 0xb6, 0x3b, 0xa7, 0x7f, 0x7c, 0xa7, - 0x16, 0xfa, 0x01, 0x0b, 0x46, 0x9d, 0x66, 0xd3, 0xaf, 0x3b, 0x3c, 0xda, 0x6f, 0xa1, 0xfb, 0xc1, - 0x29, 0xda, 0x5f, 0x88, 0x6b, 0xf0, 0x2e, 0xbc, 0x20, 0x57, 0xa8, 0x06, 0xe9, 0xd9, 0x0b, 0xbd, - 0x61, 0xf4, 0x41, 0xf9, 0x54, 0x2c, 0x1a, 0x43, 0xa9, 0x9e, 0x8a, 0x25, 0x76, 0x47, 0xe8, 0xaf, - 0xc4, 0x5b, 0xc6, 0x2b, 0x71, 0x20, 0xdf, 0x63, 0xd0, 0x60, 0x5f, 0x7b, 0x3d, 0x10, 0x51, 0x55, - 0x8f, 0x1e, 0x30, 0x98, 0xef, 0x9e, 0xa7, 0xbd, 0x93, 0x7a, 0x44, 0x0e, 0xf8, 0x2c, 0x4c, 0x36, - 0x4c, 0x26, 0x40, 0xac, 0xc4, 0xa7, 0xf2, 0xe8, 0x26, 0x78, 0x86, 0xf8, 0xda, 0x4f, 0x00, 0x70, - 0x92, 0x30, 0xaa, 0xf2, 0x60, 0x12, 0xab, 0xde, 0x96, 0x2f, 0x7c, 0x3d, 0xec, 0xdc, 0xb9, 0xdc, - 0x0f, 0x23, 0xd2, 0xa2, 0x98, 0xf1, 0xed, 0xbe, 0x2e, 0xea, 0x62, 0x45, 0x05, 0xbd, 0x0e, 0x43, - 0xcc, 0x3f, 0x2b, 0x9c, 0x1d, 0xc9, 0x97, 0x38, 0x9b, 0xd1, 0xd1, 0xe2, 0x0d, 0xc9, 0xfe, 0x86, - 0x58, 0x50, 0x40, 0xd7, 0xa4, 0xf7, 0x63, 0xb8, 0xea, 0xdd, 0x0a, 0x09, 0xf3, 0x7e, 0x2c, 0x2d, - 0x3e, 0x19, 0x3b, 0x36, 0xf2, 0xf2, 0xcc, 0x94, 0x65, 0x46, 0x4d, 0xca, 0x45, 0x89, 0xff, 0x32, - 0x13, 0xda, 0x2c, 0xe4, 0x77, 0xcf, 0xcc, 0x96, 0x16, 0x0f, 0xe7, 0x6d, 0x93, 0x04, 0x4e, 0xd2, - 0xa4, 0x1c, 0x29, 0xdf, 0xf5, 0xc2, 0x5b, 0xa4, 0xd7, 0xd9, 0xc1, 0x1f, 0xe2, 0xec, 0x36, 0xe2, - 0x25, 0x58, 0xd4, 0x3f, 0x51, 0xf6, 0x60, 0xce, 0x83, 0xa9, 0xe4, 0x16, 0x7d, 0xa8, 0xec, 0xc8, - 0x1f, 0x0e, 0xc0, 0x84, 0xb9, 0xa4, 0xd0, 0x65, 0x28, 0x09, 0x22, 0x2a, 0x9b, 0x80, 0xda, 0x25, - 0x6b, 0x12, 0x80, 0x63, 0x1c, 0x96, 0x44, 0x82, 0x55, 0xd7, 0xcc, 0x83, 0xe3, 0x24, 0x12, 0x0a, - 0x82, 0x35, 0x2c, 0xfa, 0xb0, 0xda, 0xf4, 0xfd, 0x48, 0x5d, 0x48, 0x6a, 0xdd, 0x2d, 0xb2, 0x52, - 0x2c, 0xa0, 0xf4, 0x22, 0xda, 0x25, 0x81, 0x47, 0x9a, 0x66, 0xdc, 0x61, 0x75, 0x11, 0x5d, 0xd7, - 0x81, 0xd8, 0xc4, 0xa5, 0xd7, 0xa9, 0x1f, 0xb2, 0x85, 0x2c, 0x9e, 0x6f, 0xb1, 0xb9, 0x75, 0x8d, - 0x3b, 0x60, 0x4b, 0x38, 0xfa, 0x04, 0x3c, 0xa2, 0x62, 0x2b, 0x61, 0xae, 0xcd, 0x90, 0x2d, 0x0e, - 0x19, 0xd2, 0x96, 0x47, 0x96, 0xb2, 0xd1, 0x70, 0x5e, 0x7d, 0xf4, 0x1a, 0x4c, 0x08, 0x16, 0x5f, - 0x52, 0x1c, 0x36, 0x2d, 0x8c, 0xae, 0x1b, 0x50, 0x9c, 0xc0, 0x96, 0x91, 0x93, 0x19, 0x97, 0x2d, - 0x29, 0x8c, 0xa4, 0x23, 0x27, 0xeb, 0x70, 0x9c, 0xaa, 0x81, 0x16, 0x60, 0x92, 0xf3, 0x60, 0xae, - 0xb7, 0xcd, 0xe7, 0x44, 0x38, 0x73, 0xa9, 0x2d, 0x75, 0xd3, 0x04, 0xe3, 0x24, 0x3e, 0x7a, 0x19, - 0xc6, 0x9c, 0xa0, 0xbe, 0xe3, 0x46, 0xa4, 0x1e, 0x75, 0x02, 0xee, 0xe5, 0xa5, 0x99, 0x68, 0x2d, - 0x68, 0x30, 0x6c, 0x60, 0xda, 0x6f, 0xc3, 0x4c, 0x46, 0x64, 0x06, 0xba, 0x70, 0x9c, 0xb6, 0x2b, - 0xbf, 0x29, 0x61, 0xe1, 0xbc, 0x50, 0x5d, 0x95, 0x5f, 0xa3, 0x61, 0xd1, 0xd5, 0xc9, 0x22, 0x38, - 0x68, 0x89, 0x0f, 0xd5, 0xea, 0x5c, 0x91, 0x00, 0x1c, 0xe3, 0xd8, 0xff, 0xb5, 0x00, 0x93, 0x19, - 0xba, 0x15, 0x96, 0x7c, 0x2f, 0xf1, 0x48, 0x89, 0x73, 0xed, 0x99, 0x81, 0xb8, 0x0b, 0x47, 0x08, - 0xc4, 0x5d, 0xec, 0x15, 0x88, 0x7b, 0xe0, 0x9d, 0x04, 0xe2, 0x36, 0x47, 0x6c, 0xb0, 0xaf, 0x11, - 0xcb, 0x08, 0xde, 0x3d, 0x74, 0xc4, 0xe0, 0xdd, 0xc6, 0xa0, 0x0f, 0xf7, 0x31, 0xe8, 0x3f, 0x56, - 0x80, 0xa9, 0xa4, 0x29, 0xe9, 0x09, 0xc8, 0x6d, 0x5f, 0x37, 0xe4, 0xb6, 0x97, 0xfa, 0x71, 0xbe, - 0xcd, 0x95, 0xe1, 0xe2, 0x84, 0x0c, 0xf7, 0x03, 0x7d, 0x51, 0xeb, 0x2e, 0xcf, 0xfd, 0xeb, 0x05, - 0x38, 0x9d, 0xe9, 0xfd, 0x7b, 0x02, 0x63, 0x73, 0xd3, 0x18, 0x9b, 0xe7, 0xfa, 0x76, 0x4c, 0xce, - 0x1d, 0xa0, 0x3b, 0x89, 0x01, 0xba, 0xdc, 0x3f, 0xc9, 0xee, 0xa3, 0xf4, 0xf5, 0x22, 0x9c, 0xcf, - 0xac, 0x17, 0x8b, 0x3d, 0x57, 0x0c, 0xb1, 0xe7, 0xf3, 0x09, 0xb1, 0xa7, 0xdd, 0xbd, 0xf6, 0xf1, - 0xc8, 0x41, 0x85, 0x83, 0x2e, 0x0b, 0x33, 0xf0, 0x80, 0x32, 0x50, 0xc3, 0x41, 0x57, 0x11, 0xc2, - 0x26, 0xdd, 0x6f, 0x27, 0xd9, 0xe7, 0xbf, 0xb6, 0xe0, 0x6c, 0xe6, 0xdc, 0x9c, 0x80, 0xac, 0x6b, - 0xdd, 0x94, 0x75, 0x3d, 0xdd, 0xf7, 0x6a, 0xcd, 0x11, 0x7e, 0x7d, 0x65, 0x30, 0xe7, 0x5b, 0xd8, - 0x4b, 0xfe, 0x26, 0x8c, 0x3a, 0xf5, 0x3a, 0x09, 0xc3, 0x35, 0xbf, 0xa1, 0x62, 0x0d, 0x3f, 0xc7, - 0xde, 0x59, 0x71, 0xf1, 0xe1, 0x41, 0x79, 0x2e, 0x49, 0x22, 0x06, 0x63, 0x9d, 0x02, 0xfa, 0x14, - 0x8c, 0x84, 0xe2, 0xde, 0x14, 0x73, 0xff, 0x42, 0x9f, 0x83, 0xe3, 0x6c, 0x92, 0xa6, 0x19, 0x0c, - 0x49, 0x49, 0x2a, 0x14, 0x49, 0x33, 0x70, 0x4a, 0xe1, 0x58, 0x03, 0xa7, 0x3c, 0x0f, 0xb0, 0xa7, - 0x1e, 0x03, 0x49, 0xf9, 0x83, 0xf6, 0x4c, 0xd0, 0xb0, 0xd0, 0xc7, 0x60, 0x2a, 0xe4, 0xd1, 0x02, - 0x97, 0x9a, 0x4e, 0xc8, 0xfc, 0x68, 0xc4, 0x2a, 0x64, 0x01, 0x97, 0x6a, 0x09, 0x18, 0x4e, 0x61, - 0xa3, 0x15, 0xd9, 0x2a, 0x0b, 0x6d, 0xc8, 0x17, 0xe6, 0xc5, 0xb8, 0x45, 0x91, 0xfa, 0xf7, 0x54, - 0x72, 0xf8, 0xd9, 0xc0, 0x6b, 0x35, 0xd1, 0xa7, 0x00, 0xe8, 0xf2, 0x11, 0x72, 0x88, 0xe1, 0xfc, - 0xc3, 0x93, 0x9e, 0x2a, 0x8d, 0x4c, 0xe3, 0x66, 0xe6, 0x53, 0x5b, 0x51, 0x44, 0xb0, 0x46, 0x10, - 0x6d, 0xc1, 0x78, 0xfc, 0x2f, 0xce, 0x8c, 0x79, 0xc4, 0x16, 0x98, 0xdc, 0xbb, 0xa2, 0xd3, 0xc1, - 0x26, 0x59, 0xfb, 0x27, 0x86, 0xe1, 0xd1, 0x2e, 0x67, 0x31, 0x5a, 0x30, 0xf5, 0xbd, 0xcf, 0x24, - 0x1f, 0xf1, 0x73, 0x99, 0x95, 0x8d, 0x57, 0x7d, 0x62, 0xc9, 0x17, 0xde, 0xf1, 0x92, 0xff, 0x11, - 0x4b, 0x13, 0xaf, 0x70, 0xcb, 0xd2, 0x8f, 0x1e, 0xf1, 0x8e, 0x39, 0x46, 0x79, 0xcb, 0x56, 0x86, - 0xd0, 0xe2, 0xf9, 0xbe, 0xbb, 0xd3, 0xbf, 0x14, 0xe3, 0xab, 0x16, 0x20, 0x21, 0x5e, 0x21, 0x0d, - 0xb5, 0xa1, 0x84, 0x3c, 0xe3, 0xea, 0x51, 0xbf, 0x7f, 0x21, 0x45, 0x89, 0x8f, 0xc4, 0x2b, 0xf2, - 0x32, 0x48, 0x23, 0xf4, 0x1c, 0x93, 0x8c, 0xee, 0xa1, 0x4f, 0xb0, 0x68, 0xba, 0xee, 0xdb, 0x82, - 0x03, 0x12, 0x1b, 0xee, 0x25, 0x11, 0x49, 0x57, 0x95, 0x53, 0x56, 0x37, 0xb3, 0xbb, 0x3a, 0x12, - 0x36, 0x48, 0x9d, 0xec, 0xfb, 0xbb, 0x03, 0x8f, 0xe4, 0x0c, 0xd9, 0x43, 0x7d, 0x86, 0xff, 0xb6, - 0x05, 0xe7, 0xba, 0x86, 0x85, 0xf9, 0x16, 0x64, 0x10, 0xed, 0xcf, 0x5b, 0x90, 0x3d, 0xd9, 0x86, - 0x59, 0xd9, 0x65, 0x28, 0xd5, 0x69, 0xa1, 0xe6, 0x07, 0x1c, 0x07, 0x48, 0x90, 0x00, 0x1c, 0xe3, - 0x18, 0xd6, 0x63, 0x85, 0x9e, 0xd6, 0x63, 0xbf, 0x6a, 0x41, 0xea, 0x90, 0x3f, 0x01, 0x6e, 0x63, - 0xd5, 0xe4, 0x36, 0x9e, 0xec, 0x67, 0x34, 0x73, 0x18, 0x8d, 0x3f, 0x99, 0x84, 0x33, 0x39, 0x6e, - 0x79, 0x7b, 0x30, 0xbd, 0x5d, 0x27, 0xa6, 0x87, 0x75, 0xb7, 0xc8, 0x43, 0x5d, 0xdd, 0xb1, 0x59, - 0x72, 0xd8, 0xe9, 0x14, 0x0a, 0x4e, 0x37, 0x81, 0x3e, 0x6f, 0xc1, 0x29, 0xe7, 0x6e, 0xb8, 0x4c, - 0xb9, 0x46, 0xb7, 0xbe, 0xd8, 0xf4, 0xeb, 0xbb, 0xf4, 0x4a, 0x96, 0x1b, 0xe1, 0xc5, 0x4c, 0x49, - 0xde, 0x9d, 0x5a, 0x0a, 0xdf, 0x68, 0x9e, 0x65, 0xcb, 0xcd, 0xc2, 0xc2, 0x99, 0x6d, 0x21, 0x2c, - 0x52, 0x28, 0xd0, 0x37, 0x69, 0x97, 0x18, 0x00, 0x59, 0xfe, 0x93, 0x9c, 0x0d, 0x92, 0x10, 0xac, - 0xe8, 0xa0, 0xcf, 0x40, 0x69, 0x5b, 0xba, 0xfb, 0x66, 0xb0, 0x59, 0xf1, 0x40, 0x76, 0x77, 0x82, - 0xe6, 0xea, 0x78, 0x85, 0x84, 0x63, 0xa2, 0xe8, 0x35, 0x28, 0x7a, 0x5b, 0x61, 0xb7, 0x84, 0xb3, - 0x09, 0xbb, 0x4b, 0x1e, 0x69, 0x63, 0x7d, 0xa5, 0x86, 0x69, 0x45, 0x74, 0x0d, 0x8a, 0xc1, 0x66, - 0x43, 0x88, 0xa1, 0x33, 0x37, 0x29, 0x5e, 0xac, 0xe4, 0xf4, 0x8a, 0x51, 0xc2, 0x8b, 0x15, 0x4c, - 0x49, 0xa0, 0x2a, 0x0c, 0x32, 0x5f, 0x36, 0xc1, 0xd4, 0x64, 0x3e, 0xdf, 0xba, 0xf8, 0x84, 0xf2, - 0x70, 0x1c, 0x0c, 0x01, 0x73, 0x42, 0x68, 0x03, 0x86, 0xea, 0x2c, 0x39, 0xa9, 0xe0, 0x62, 0x3e, - 0x98, 0x29, 0x70, 0xee, 0x92, 0xb5, 0x55, 0xc8, 0x5f, 0x19, 0x06, 0x16, 0xb4, 0x18, 0x55, 0xd2, - 0xde, 0xd9, 0x0a, 0x45, 0xf2, 0xee, 0x6c, 0xaa, 0x5d, 0x92, 0x11, 0x0b, 0xaa, 0x0c, 0x03, 0x0b, - 0x5a, 0xe8, 0x15, 0x28, 0x6c, 0xd5, 0x85, 0x9f, 0x5a, 0xa6, 0xe4, 0xd9, 0x0c, 0x96, 0xb2, 0x38, - 0x74, 0xff, 0xa0, 0x5c, 0x58, 0x59, 0xc2, 0x85, 0xad, 0x3a, 0x5a, 0x87, 0xe1, 0x2d, 0x1e, 0x5e, - 0x41, 0x08, 0x97, 0x9f, 0xca, 0x8e, 0xfc, 0x90, 0x8a, 0xc0, 0xc0, 0x7d, 0x9e, 0x04, 0x00, 0x4b, - 0x22, 0x2c, 0x23, 0x81, 0x0a, 0x13, 0x21, 0xa2, 0xd4, 0xcd, 0x1f, 0x2d, 0xb4, 0x07, 0x67, 0x32, - 0xe3, 0x60, 0x13, 0x58, 0xa3, 0x48, 0x57, 0xb5, 0xf3, 0x76, 0x27, 0x60, 0xa1, 0xc0, 0x45, 0x38, - 0xa3, 0xcc, 0x55, 0xbd, 0x20, 0x91, 0xba, 0xad, 0x6a, 0x85, 0x84, 0x63, 0xa2, 0x68, 0x17, 0xc6, - 0xf7, 0xc2, 0xf6, 0x0e, 0x91, 0x5b, 0x9a, 0x45, 0x37, 0xca, 0xe1, 0x8f, 0x6e, 0x0b, 0x44, 0x37, - 0x88, 0x3a, 0x4e, 0x33, 0x75, 0x0a, 0x31, 0x5e, 0xf6, 0xb6, 0x4e, 0x0c, 0x9b, 0xb4, 0xe9, 0xf0, - 0xbf, 0xd5, 0xf1, 0x37, 0xf7, 0x23, 0x22, 0x82, 0xcb, 0x65, 0x0e, 0xff, 0x1b, 0x1c, 0x25, 0x3d, - 0xfc, 0x02, 0x80, 0x25, 0x11, 0x74, 0x5b, 0x0c, 0x0f, 0x3b, 0x3d, 0xa7, 0xf2, 0x23, 0xc0, 0x2e, - 0x48, 0xa4, 0x9c, 0x41, 0x61, 0xa7, 0x65, 0x4c, 0x8a, 0x9d, 0x92, 0xed, 0x1d, 0x3f, 0xf2, 0xbd, - 0xc4, 0x09, 0x3d, 0x9d, 0x7f, 0x4a, 0x56, 0x33, 0xf0, 0xd3, 0xa7, 0x64, 0x16, 0x16, 0xce, 0x6c, - 0x0b, 0x35, 0x60, 0xa2, 0xed, 0x07, 0xd1, 0x5d, 0x3f, 0x90, 0xeb, 0x0b, 0x75, 0x11, 0x8e, 0x19, - 0x98, 0xa2, 0x45, 0x16, 0xb7, 0xd1, 0x84, 0xe0, 0x04, 0x4d, 0xf4, 0x71, 0x18, 0x0e, 0xeb, 0x4e, - 0x93, 0xac, 0xde, 0x9c, 0x9d, 0xc9, 0xbf, 0x7e, 0x6a, 0x1c, 0x25, 0x67, 0x75, 0xf1, 0xe8, 0x18, - 0x1c, 0x05, 0x4b, 0x72, 0x68, 0x05, 0x06, 0x59, 0xc6, 0x39, 0x16, 0x09, 0x31, 0x27, 0x90, 0x6d, - 0xca, 0x0a, 0x9e, 0x9f, 0x4d, 0xac, 0x18, 0xf3, 0xea, 0x74, 0x0f, 0x88, 0x37, 0xa2, 0x1f, 0xce, - 0x9e, 0xce, 0xdf, 0x03, 0xe2, 0x69, 0x79, 0xb3, 0xd6, 0x6d, 0x0f, 0x28, 0x24, 0x1c, 0x13, 0xa5, - 0x27, 0x33, 0x3d, 0x4d, 0xcf, 0x74, 0x31, 0xdf, 0xca, 0x3d, 0x4b, 0xd9, 0xc9, 0x4c, 0x4f, 0x52, - 0x4a, 0xc2, 0xfe, 0xfd, 0xe1, 0x34, 0xcf, 0xc2, 0xa4, 0x0a, 0xdf, 0x67, 0xa5, 0x14, 0xce, 0x1f, - 0xea, 0x57, 0xc8, 0x79, 0x8c, 0x4f, 0xa1, 0xcf, 0x5b, 0x70, 0xa6, 0x9d, 0xf9, 0x21, 0x82, 0x01, - 0xe8, 0x4f, 0x56, 0xca, 0x3f, 0x5d, 0x45, 0xcd, 0xcc, 0x86, 0xe3, 0x9c, 0x96, 0x92, 0xcf, 0xcd, - 0xe2, 0x3b, 0x7e, 0x6e, 0xae, 0xc1, 0x48, 0x9d, 0x3f, 0x45, 0xba, 0x26, 0xeb, 0x4e, 0xbe, 0xbd, - 0x19, 0x2b, 0x21, 0xde, 0x30, 0x5b, 0x58, 0x91, 0x40, 0x3f, 0x6a, 0xc1, 0xb9, 0x64, 0xd7, 0x31, - 0x61, 0x60, 0x11, 0x6a, 0x93, 0x0b, 0x34, 0x56, 0xc4, 0xf7, 0xa7, 0xf8, 0x7f, 0x03, 0xf9, 0xb0, - 0x17, 0x02, 0xee, 0xde, 0x18, 0xaa, 0x64, 0x48, 0x54, 0x86, 0x4c, 0x2d, 0x52, 0x1f, 0x52, 0x95, - 0x17, 0x61, 0xac, 0xe5, 0x77, 0xbc, 0x48, 0x58, 0x7b, 0x09, 0xcb, 0x13, 0x66, 0x71, 0xb1, 0xa6, - 0x95, 0x63, 0x03, 0x2b, 0x21, 0x8b, 0x19, 0x79, 0x60, 0x59, 0xcc, 0x9b, 0x30, 0xe6, 0x69, 0xe6, - 0xc9, 0x82, 0x1f, 0xb8, 0x98, 0x1f, 0x26, 0x57, 0x37, 0x66, 0xe6, 0xbd, 0xd4, 0x4b, 0xb0, 0x41, - 0xed, 0x64, 0xcd, 0xc0, 0xbe, 0x6c, 0x65, 0x30, 0xf5, 0x5c, 0x14, 0xf3, 0x11, 0x53, 0x14, 0x73, - 0x31, 0x29, 0x8a, 0x49, 0x69, 0x10, 0x0c, 0x29, 0x4c, 0xff, 0x59, 0x80, 0xfa, 0x0d, 0xb5, 0x69, - 0x37, 0xe1, 0x42, 0xaf, 0x6b, 0x89, 0x99, 0xfd, 0x35, 0x94, 0xbe, 0x38, 0x36, 0xfb, 0x6b, 0xac, - 0x56, 0x30, 0x83, 0xf4, 0x1b, 0xc4, 0xc9, 0xfe, 0xcf, 0x16, 0x14, 0xab, 0x7e, 0xe3, 0x04, 0x1e, - 0xbc, 0x1f, 0x35, 0x1e, 0xbc, 0x8f, 0x66, 0x5f, 0x88, 0x8d, 0x5c, 0xfd, 0xc7, 0x72, 0x42, 0xff, - 0x71, 0x2e, 0x8f, 0x40, 0x77, 0x6d, 0xc7, 0x4f, 0x17, 0x61, 0xb4, 0xea, 0x37, 0x94, 0xcd, 0xfd, - 0x3f, 0x7b, 0x10, 0x9b, 0xfb, 0xdc, 0x5c, 0x16, 0x1a, 0x65, 0x66, 0x2d, 0x28, 0xdd, 0x8d, 0xbf, - 0xc5, 0x4c, 0xef, 0xef, 0x10, 0x77, 0x7b, 0x27, 0x22, 0x8d, 0xe4, 0xe7, 0x9c, 0x9c, 0xe9, 0xfd, - 0xef, 0x17, 0x60, 0x32, 0xd1, 0x3a, 0x6a, 0xc2, 0x78, 0x53, 0x97, 0xae, 0x8b, 0x75, 0xfa, 0x40, - 0x82, 0x79, 0x61, 0xba, 0xac, 0x15, 0x61, 0x93, 0x38, 0x9a, 0x07, 0x50, 0xea, 0x66, 0x29, 0x5e, - 0x65, 0x5c, 0xbf, 0xd2, 0x47, 0x87, 0x58, 0xc3, 0x40, 0x2f, 0xc1, 0x68, 0xe4, 0xb7, 0xfd, 0xa6, - 0xbf, 0xbd, 0x7f, 0x9d, 0xc8, 0xf8, 0x5e, 0xca, 0x20, 0x71, 0x23, 0x06, 0x61, 0x1d, 0x0f, 0xdd, - 0x83, 0x69, 0x45, 0xa4, 0x76, 0x0c, 0x1a, 0x07, 0x26, 0x55, 0x58, 0x4f, 0x52, 0xc4, 0xe9, 0x46, - 0xec, 0x9f, 0x2d, 0xf2, 0x21, 0xf6, 0x22, 0xf7, 0xbd, 0xdd, 0xf0, 0xee, 0xde, 0x0d, 0x5f, 0xb7, - 0x60, 0x8a, 0xb6, 0xce, 0xac, 0xad, 0xe4, 0x35, 0xaf, 0x02, 0x73, 0x5b, 0x5d, 0x02, 0x73, 0x5f, - 0xa4, 0xa7, 0x66, 0xc3, 0xef, 0x44, 0x42, 0x76, 0xa7, 0x1d, 0x8b, 0xb4, 0x14, 0x0b, 0xa8, 0xc0, - 0x23, 0x41, 0x20, 0x3c, 0x44, 0x75, 0x3c, 0x12, 0x04, 0x58, 0x40, 0x65, 0xdc, 0xee, 0x81, 0xec, - 0xb8, 0xdd, 0x3c, 0xfc, 0xaa, 0xb0, 0xcb, 0x11, 0x0c, 0x97, 0x16, 0x7e, 0x55, 0x1a, 0xec, 0xc4, - 0x38, 0xf6, 0x57, 0x8b, 0x30, 0x56, 0xf5, 0x1b, 0xb1, 0xaa, 0xf9, 0x45, 0x43, 0xd5, 0x7c, 0x21, - 0xa1, 0x6a, 0x9e, 0xd2, 0x71, 0xdf, 0x53, 0x2c, 0x7f, 0xb3, 0x14, 0xcb, 0xff, 0xd8, 0x62, 0xb3, - 0x56, 0x59, 0xaf, 0x71, 0xe3, 0x3d, 0x74, 0x05, 0x46, 0xd9, 0x01, 0xc3, 0x5c, 0x92, 0xa5, 0xfe, - 0x95, 0xe5, 0xa3, 0x5a, 0x8f, 0x8b, 0xb1, 0x8e, 0x83, 0x2e, 0xc1, 0x48, 0x48, 0x9c, 0xa0, 0xbe, - 0xa3, 0x4e, 0x57, 0xa1, 0x2c, 0xe5, 0x65, 0x58, 0x41, 0xd1, 0x1b, 0x71, 0xe4, 0xcf, 0x62, 0xbe, - 0x8b, 0xa3, 0xde, 0x1f, 0xbe, 0x45, 0xf2, 0xc3, 0x7d, 0xda, 0x77, 0x00, 0xa5, 0xf1, 0xfb, 0x88, - 0x4d, 0x57, 0x36, 0x63, 0xd3, 0x95, 0x52, 0x71, 0xe9, 0xfe, 0xdc, 0x82, 0x89, 0xaa, 0xdf, 0xa0, - 0x5b, 0xf7, 0xdb, 0x69, 0x9f, 0xea, 0x61, 0x8f, 0x87, 0xba, 0x84, 0x3d, 0x7e, 0x02, 0x06, 0xab, - 0x7e, 0x63, 0xb5, 0xda, 0x2d, 0xbe, 0x80, 0xfd, 0x37, 0x2c, 0x18, 0xae, 0xfa, 0x8d, 0x13, 0x50, - 0x0b, 0x7c, 0xc4, 0x54, 0x0b, 0x3c, 0x92, 0xb3, 0x6e, 0x72, 0x34, 0x01, 0x7f, 0x6d, 0x00, 0xc6, - 0x69, 0x3f, 0xfd, 0x6d, 0x39, 0x95, 0xc6, 0xb0, 0x59, 0x7d, 0x0c, 0x1b, 0xe5, 0xc2, 0xfd, 0x66, - 0xd3, 0xbf, 0x9b, 0x9c, 0xd6, 0x15, 0x56, 0x8a, 0x05, 0x14, 0x3d, 0x0b, 0x23, 0xed, 0x80, 0xec, - 0xb9, 0xbe, 0x60, 0x6f, 0x35, 0x25, 0x4b, 0x55, 0x94, 0x63, 0x85, 0x41, 0x9f, 0x85, 0xa1, 0xeb, - 0xd1, 0xab, 0xbc, 0xee, 0x7b, 0x0d, 0x2e, 0x39, 0x2f, 0x8a, 0xdc, 0x1c, 0x5a, 0x39, 0x36, 0xb0, - 0xd0, 0x1d, 0x28, 0xb1, 0xff, 0xec, 0xd8, 0x39, 0x7a, 0x96, 0x57, 0x91, 0xf5, 0x4f, 0x10, 0xc0, - 0x31, 0x2d, 0xf4, 0x3c, 0x40, 0x24, 0xe3, 0xdb, 0x87, 0x22, 0xda, 0x9a, 0x7a, 0x0a, 0xa8, 0xc8, - 0xf7, 0x21, 0xd6, 0xb0, 0xd0, 0x33, 0x50, 0x8a, 0x1c, 0xb7, 0x79, 0xc3, 0xf5, 0x48, 0xc8, 0x24, - 0xe2, 0x45, 0x99, 0x7c, 0x4f, 0x14, 0xe2, 0x18, 0x4e, 0x59, 0x31, 0x16, 0x89, 0x83, 0xe7, 0x88, - 0x1e, 0x61, 0xd8, 0x8c, 0x15, 0xbb, 0xa1, 0x4a, 0xb1, 0x86, 0x81, 0x76, 0xe0, 0x31, 0xd7, 0x63, - 0x79, 0x2c, 0x48, 0x6d, 0xd7, 0x6d, 0x6f, 0xdc, 0xa8, 0xdd, 0x26, 0x81, 0xbb, 0xb5, 0xbf, 0xe8, - 0xd4, 0x77, 0x89, 0x27, 0xf3, 0x77, 0x3e, 0x29, 0xba, 0xf8, 0xd8, 0x6a, 0x17, 0x5c, 0xdc, 0x95, - 0x92, 0xfd, 0x02, 0x5b, 0xef, 0x37, 0x6b, 0xe8, 0x03, 0xc6, 0xd1, 0x71, 0x46, 0x3f, 0x3a, 0x0e, - 0x0f, 0xca, 0x43, 0x37, 0x6b, 0x5a, 0x20, 0x89, 0x97, 0xe1, 0x74, 0xd5, 0x6f, 0x54, 0xfd, 0x20, - 0x5a, 0xf1, 0x83, 0xbb, 0x4e, 0xd0, 0x90, 0xcb, 0xab, 0x2c, 0x43, 0x69, 0xd0, 0xf3, 0x73, 0x90, - 0x9f, 0x2e, 0x46, 0x98, 0x8c, 0x17, 0x18, 0xc7, 0x76, 0x44, 0x07, 0xb0, 0x3a, 0xe3, 0x1d, 0x54, - 0x26, 0x98, 0xab, 0x4e, 0x44, 0xd0, 0x4d, 0x96, 0xe1, 0x3a, 0xbe, 0x46, 0x45, 0xf5, 0xa7, 0xb5, - 0x0c, 0xd7, 0x31, 0x30, 0xf3, 0xde, 0x35, 0xeb, 0xdb, 0xff, 0x65, 0x90, 0x9d, 0xa8, 0x89, 0x6c, - 0x22, 0xe8, 0xd3, 0x30, 0x11, 0x92, 0x1b, 0xae, 0xd7, 0xb9, 0x27, 0x45, 0x18, 0x5d, 0x5c, 0xf8, - 0x6a, 0xcb, 0x3a, 0x26, 0x17, 0x84, 0x9a, 0x65, 0x38, 0x41, 0x0d, 0xb5, 0x60, 0xe2, 0xae, 0xeb, - 0x35, 0xfc, 0xbb, 0xa1, 0xa4, 0x3f, 0x92, 0x2f, 0x0f, 0xbd, 0xc3, 0x31, 0x13, 0x7d, 0x34, 0x9a, - 0xbb, 0x63, 0x10, 0xc3, 0x09, 0xe2, 0x74, 0xd5, 0x06, 0x1d, 0x6f, 0x21, 0xbc, 0x15, 0x92, 0x40, - 0xe4, 0x2a, 0x67, 0xab, 0x16, 0xcb, 0x42, 0x1c, 0xc3, 0xe9, 0xaa, 0x65, 0x7f, 0xae, 0x06, 0x7e, - 0x87, 0xa7, 0xae, 0x10, 0xab, 0x16, 0xab, 0x52, 0xac, 0x61, 0xd0, 0x5d, 0xcd, 0xfe, 0xad, 0xfb, - 0x1e, 0xf6, 0xfd, 0x48, 0x9e, 0x03, 0x4c, 0xa7, 0xaf, 0x95, 0x63, 0x03, 0x0b, 0xad, 0x00, 0x0a, - 0x3b, 0xed, 0x76, 0x93, 0xd9, 0x06, 0x39, 0x4d, 0x46, 0x8a, 0xdb, 0x4b, 0x14, 0x79, 0xe8, 0xdd, - 0x5a, 0x0a, 0x8a, 0x33, 0x6a, 0xd0, 0x03, 0x7e, 0x4b, 0x74, 0x75, 0x90, 0x75, 0x95, 0xeb, 0x4e, - 0x6a, 0xbc, 0x9f, 0x12, 0x86, 0x96, 0x61, 0x38, 0xdc, 0x0f, 0xeb, 0x91, 0x88, 0x94, 0x98, 0x93, - 0x30, 0xaa, 0xc6, 0x50, 0xb4, 0x7c, 0x85, 0xbc, 0x0a, 0x96, 0x75, 0x51, 0x1d, 0x66, 0x04, 0xc5, - 0xa5, 0x1d, 0xc7, 0x53, 0xe9, 0x77, 0xb8, 0x89, 0xf4, 0x95, 0xfb, 0x07, 0xe5, 0x19, 0xd1, 0xb2, - 0x0e, 0x3e, 0x3c, 0x28, 0x9f, 0xa9, 0xfa, 0x8d, 0x0c, 0x08, 0xce, 0xa2, 0xc6, 0x17, 0x5f, 0xbd, - 0xee, 0xb7, 0xda, 0xd5, 0xc0, 0xdf, 0x72, 0x9b, 0xa4, 0x9b, 0xfe, 0xa9, 0x66, 0x60, 0x8a, 0xc5, - 0x67, 0x94, 0xe1, 0x04, 0x35, 0xfb, 0xbb, 0x19, 0x13, 0xc4, 0xd2, 0x73, 0x47, 0x9d, 0x80, 0xa0, - 0x16, 0x8c, 0xb7, 0xd9, 0x36, 0x11, 0x09, 0x25, 0xc4, 0x5a, 0x7f, 0xb1, 0x4f, 0x39, 0xca, 0x5d, - 0x7a, 0x77, 0x98, 0x36, 0x46, 0x55, 0x9d, 0x1c, 0x36, 0xa9, 0xdb, 0xbf, 0xf9, 0x08, 0xbb, 0x46, - 0x6b, 0x5c, 0x38, 0x32, 0x2c, 0x3c, 0x32, 0xc4, 0x7b, 0x6c, 0x2e, 0x5f, 0x4a, 0x17, 0x4f, 0x8b, - 0xf0, 0xea, 0xc0, 0xb2, 0x2e, 0xfa, 0x14, 0x4c, 0xd0, 0xe7, 0x8d, 0xba, 0xca, 0xc2, 0xd9, 0x53, - 0xf9, 0x91, 0x33, 0x14, 0x96, 0x9e, 0x6c, 0x46, 0xaf, 0x8c, 0x13, 0xc4, 0xd0, 0x1b, 0xcc, 0xa6, - 0x47, 0x92, 0x2e, 0xf4, 0x43, 0x5a, 0x37, 0xdf, 0x91, 0x64, 0x35, 0x22, 0xa8, 0x03, 0x33, 0xe9, - 0xd4, 0x74, 0xe1, 0xac, 0x9d, 0xcf, 0x27, 0xa6, 0xb3, 0xcb, 0xc5, 0x59, 0x41, 0xd2, 0xb0, 0x10, - 0x67, 0xd1, 0x47, 0x37, 0x60, 0x5c, 0xe4, 0xa8, 0x16, 0x2b, 0xb7, 0x68, 0x08, 0x0f, 0xc7, 0xb1, - 0x0e, 0x3c, 0x4c, 0x16, 0x60, 0xb3, 0x32, 0xda, 0x86, 0x73, 0x5a, 0xce, 0xa8, 0xab, 0x81, 0xc3, - 0x2c, 0x00, 0x5c, 0x76, 0x9c, 0x6a, 0x17, 0xfc, 0xe3, 0xf7, 0x0f, 0xca, 0xe7, 0x36, 0xba, 0x21, - 0xe2, 0xee, 0x74, 0xd0, 0x4d, 0x38, 0xcd, 0xfd, 0xbe, 0x2b, 0xc4, 0x69, 0x34, 0x5d, 0x4f, 0x71, - 0x10, 0x7c, 0xcb, 0x9f, 0xbd, 0x7f, 0x50, 0x3e, 0xbd, 0x90, 0x85, 0x80, 0xb3, 0xeb, 0xa1, 0x8f, - 0x40, 0xa9, 0xe1, 0x85, 0x62, 0x0c, 0x86, 0x8c, 0xb4, 0x5c, 0xa5, 0xca, 0x7a, 0x4d, 0x7d, 0x7f, - 0xfc, 0x07, 0xc7, 0x15, 0xd0, 0x36, 0x17, 0x30, 0x2b, 0xb1, 0xc7, 0x70, 0x2a, 0xee, 0x55, 0x52, - 0x32, 0x68, 0x78, 0x7e, 0x72, 0xcd, 0x8a, 0x72, 0x88, 0x30, 0x9c, 0x42, 0x0d, 0xc2, 0xe8, 0x75, - 0x40, 0x22, 0xfc, 0xfb, 0x42, 0x9d, 0x65, 0x2b, 0x61, 0xf2, 0xf8, 0x11, 0xd3, 0x17, 0xb1, 0x96, - 0xc2, 0xc0, 0x19, 0xb5, 0xd0, 0x35, 0x7a, 0xaa, 0xe8, 0xa5, 0xe2, 0xd4, 0x52, 0x49, 0x14, 0x2b, - 0xa4, 0x1d, 0x10, 0x66, 0xd1, 0x64, 0x52, 0xc4, 0x89, 0x7a, 0xa8, 0x01, 0x8f, 0x39, 0x9d, 0xc8, - 0x67, 0xb2, 0x7b, 0x13, 0x75, 0xc3, 0xdf, 0x25, 0x1e, 0x53, 0x9b, 0x8d, 0x2c, 0x5e, 0xa0, 0x2c, - 0xca, 0x42, 0x17, 0x3c, 0xdc, 0x95, 0x0a, 0x65, 0x2d, 0x55, 0xd6, 0x64, 0x30, 0xa3, 0x79, 0x65, - 0x64, 0x4e, 0x7e, 0x09, 0x46, 0x77, 0xfc, 0x30, 0x5a, 0x27, 0xd1, 0x5d, 0x3f, 0xd8, 0x15, 0x51, - 0x69, 0xe3, 0x18, 0xdf, 0x31, 0x08, 0xeb, 0x78, 0xf4, 0xed, 0xc8, 0x8c, 0x3a, 0x56, 0x2b, 0x4c, - 0x9f, 0x3e, 0x12, 0x9f, 0x31, 0xd7, 0x78, 0x31, 0x96, 0x70, 0x89, 0xba, 0x5a, 0x5d, 0x62, 0xba, - 0xf1, 0x04, 0xea, 0x6a, 0x75, 0x09, 0x4b, 0x38, 0x5d, 0xae, 0xe1, 0x8e, 0x13, 0x90, 0x6a, 0xe0, - 0xd7, 0x49, 0xa8, 0x45, 0x96, 0x7f, 0x94, 0xc7, 0xdc, 0xa5, 0xcb, 0xb5, 0x96, 0x85, 0x80, 0xb3, - 0xeb, 0x21, 0x92, 0xce, 0x97, 0x36, 0x91, 0xaf, 0xd4, 0x48, 0xf3, 0x33, 0x7d, 0xa6, 0x4c, 0xf3, - 0x60, 0x4a, 0x65, 0x6a, 0xe3, 0x51, 0x76, 0xc3, 0xd9, 0x49, 0xb6, 0xb6, 0xfb, 0x0f, 0xd1, 0xab, - 0xd4, 0x44, 0xab, 0x09, 0x4a, 0x38, 0x45, 0xdb, 0x08, 0xd8, 0x36, 0xd5, 0x33, 0x60, 0xdb, 0x65, - 0x28, 0x85, 0x9d, 0xcd, 0x86, 0xdf, 0x72, 0x5c, 0x8f, 0xe9, 0xc6, 0xb5, 0x47, 0x4c, 0x4d, 0x02, - 0x70, 0x8c, 0x83, 0x56, 0x60, 0xc4, 0x91, 0x3a, 0x20, 0x94, 0x1f, 0xa2, 0x47, 0x69, 0x7e, 0x78, - 0xd4, 0x0a, 0xa9, 0xf5, 0x51, 0x75, 0xd1, 0xab, 0x30, 0x2e, 0xfc, 0x96, 0x45, 0x92, 0xd0, 0x19, - 0xd3, 0xb9, 0xac, 0xa6, 0x03, 0xb1, 0x89, 0x8b, 0x6e, 0xc1, 0x68, 0xe4, 0x37, 0x99, 0x87, 0x14, - 0x65, 0xf3, 0xce, 0xe4, 0x07, 0x9b, 0xdb, 0x50, 0x68, 0xba, 0xf8, 0x55, 0x55, 0xc5, 0x3a, 0x1d, - 0xb4, 0xc1, 0xd7, 0x3b, 0x8b, 0x23, 0x4f, 0xc2, 0xd9, 0x47, 0xf2, 0xef, 0x24, 0x15, 0x6e, 0xde, - 0xdc, 0x0e, 0xa2, 0x26, 0xd6, 0xc9, 0xa0, 0xab, 0x30, 0xdd, 0x0e, 0x5c, 0x9f, 0xad, 0x09, 0xa5, - 0xfe, 0x9b, 0x35, 0xb3, 0x46, 0x55, 0x93, 0x08, 0x38, 0x5d, 0x87, 0xb9, 0x9d, 0x8b, 0xc2, 0xd9, - 0xb3, 0x3c, 0xf3, 0x05, 0x7f, 0x13, 0xf2, 0x32, 0xac, 0xa0, 0x68, 0x8d, 0x9d, 0xc4, 0x5c, 0x9c, - 0x31, 0x3b, 0x97, 0x1f, 0x15, 0x48, 0x17, 0x7b, 0x70, 0xe6, 0x55, 0xfd, 0xc5, 0x31, 0x05, 0xd4, - 0xd0, 0x12, 0x4e, 0xd2, 0x17, 0x43, 0x38, 0xfb, 0x58, 0x17, 0xcb, 0xba, 0xc4, 0xf3, 0x22, 0x66, - 0x08, 0x8c, 0xe2, 0x10, 0x27, 0x68, 0xa2, 0x8f, 0xc1, 0x94, 0x88, 0x65, 0x18, 0x0f, 0xd3, 0xb9, - 0xd8, 0xee, 0x1c, 0x27, 0x60, 0x38, 0x85, 0xcd, 0x33, 0x4f, 0x38, 0x9b, 0x4d, 0x22, 0x8e, 0xbe, - 0x1b, 0xae, 0xb7, 0x1b, 0xce, 0x9e, 0x67, 0xe7, 0x83, 0xc8, 0x3c, 0x91, 0x84, 0xe2, 0x8c, 0x1a, - 0x68, 0x03, 0xa6, 0xda, 0x01, 0x21, 0x2d, 0xc6, 0xe8, 0x8b, 0xfb, 0xac, 0xcc, 0xa3, 0x2e, 0xd0, - 0x9e, 0x54, 0x13, 0xb0, 0xc3, 0x8c, 0x32, 0x9c, 0xa2, 0x80, 0xee, 0xc2, 0x88, 0xbf, 0x47, 0x82, - 0x1d, 0xe2, 0x34, 0x66, 0x2f, 0x74, 0xf1, 0x83, 0x10, 0x97, 0xdb, 0x4d, 0x81, 0x9b, 0x30, 0x19, - 0x90, 0xc5, 0xbd, 0x4d, 0x06, 0x64, 0x63, 0xe8, 0xff, 0xb5, 0xe0, 0xac, 0xd4, 0x32, 0xd4, 0xda, - 0x74, 0xd4, 0x97, 0x7c, 0x2f, 0x8c, 0x02, 0x1e, 0x27, 0xe0, 0xf1, 0x7c, 0xdf, 0xf9, 0x8d, 0x9c, - 0x4a, 0x4a, 0xa2, 0x7a, 0x36, 0x0f, 0x23, 0xc4, 0xf9, 0x2d, 0xa2, 0x25, 0x98, 0x0e, 0x49, 0x24, - 0x0f, 0xa3, 0x85, 0x70, 0xe5, 0x8d, 0xca, 0xfa, 0xec, 0x13, 0x3c, 0xc8, 0x01, 0xdd, 0x0c, 0xb5, - 0x24, 0x10, 0xa7, 0xf1, 0xd1, 0x15, 0x28, 0xf8, 0xe1, 0xec, 0x93, 0x5d, 0x72, 0x94, 0xd2, 0xa7, - 0x38, 0x37, 0x1d, 0xbb, 0x59, 0xc3, 0x05, 0x3f, 0x9c, 0xfb, 0x4e, 0x98, 0x4e, 0x71, 0x0c, 0x47, - 0xc9, 0xed, 0x33, 0xb7, 0x0b, 0xe3, 0xc6, 0xac, 0x3c, 0x54, 0x2d, 0xf5, 0xbf, 0x1c, 0x86, 0x92, - 0xd2, 0x60, 0xa2, 0xcb, 0xa6, 0x62, 0xfa, 0x6c, 0x52, 0x31, 0x3d, 0x52, 0xf5, 0x1b, 0x86, 0x2e, - 0x7a, 0x23, 0x23, 0x1a, 0x5c, 0xde, 0x19, 0xd0, 0xbf, 0x81, 0xbc, 0x26, 0x16, 0x2e, 0xf6, 0xad, - 0xe1, 0x1e, 0xe8, 0x2a, 0x69, 0xbe, 0x0a, 0xd3, 0x9e, 0xcf, 0xd8, 0x54, 0xd2, 0x90, 0x3c, 0x08, - 0x63, 0x35, 0x4a, 0x7a, 0x78, 0x95, 0x04, 0x02, 0x4e, 0xd7, 0xa1, 0x0d, 0x72, 0x5e, 0x21, 0x29, - 0xda, 0xe6, 0xac, 0x04, 0x16, 0x50, 0xf4, 0x04, 0x0c, 0xb6, 0xfd, 0xc6, 0x6a, 0x55, 0xb0, 0xa8, - 0x5a, 0x0c, 0xd2, 0xc6, 0x6a, 0x15, 0x73, 0x18, 0x5a, 0x80, 0x21, 0xf6, 0x23, 0x9c, 0x1d, 0xcb, - 0x8f, 0xa3, 0xc1, 0x6a, 0x68, 0x99, 0x93, 0x58, 0x05, 0x2c, 0x2a, 0x32, 0x11, 0x1b, 0xe5, 0xeb, - 0x99, 0x88, 0x6d, 0xf8, 0x01, 0x45, 0x6c, 0x92, 0x00, 0x8e, 0x69, 0xa1, 0x7b, 0x70, 0xda, 0x78, - 0x4b, 0xf1, 0x25, 0x42, 0x42, 0xe1, 0xcb, 0xff, 0x44, 0xd7, 0x47, 0x94, 0xd0, 0x88, 0x9f, 0x13, - 0x9d, 0x3e, 0xbd, 0x9a, 0x45, 0x09, 0x67, 0x37, 0x80, 0x9a, 0x30, 0x5d, 0x4f, 0xb5, 0x3a, 0xd2, - 0x7f, 0xab, 0x6a, 0x42, 0xd3, 0x2d, 0xa6, 0x09, 0xa3, 0x57, 0x61, 0xe4, 0x2d, 0x3f, 0x64, 0xc7, - 0xbb, 0x60, 0xab, 0xa5, 0x23, 0xf8, 0xc8, 0x1b, 0x37, 0x6b, 0xac, 0xfc, 0xf0, 0xa0, 0x3c, 0x5a, - 0xf5, 0x1b, 0xf2, 0x2f, 0x56, 0x15, 0xd0, 0x0f, 0x5a, 0x30, 0x97, 0x7e, 0xac, 0xa9, 0x4e, 0x8f, - 0xf7, 0xdf, 0x69, 0x5b, 0x34, 0x3a, 0xb7, 0x9c, 0x4b, 0x0e, 0x77, 0x69, 0xca, 0xfe, 0x65, 0x8b, - 0x09, 0xea, 0x84, 0xa6, 0x89, 0x84, 0x9d, 0xe6, 0x49, 0x24, 0x8c, 0x5d, 0x36, 0x94, 0x60, 0x0f, - 0x6c, 0x21, 0xf1, 0x4f, 0x2d, 0x66, 0x21, 0x71, 0x82, 0xae, 0x10, 0x6f, 0xc0, 0x48, 0x24, 0x13, - 0xf9, 0x76, 0xc9, 0x71, 0xab, 0x75, 0x8a, 0x59, 0x89, 0x28, 0x26, 0x57, 0xe5, 0xec, 0x55, 0x64, - 0xec, 0x7f, 0xc0, 0x67, 0x40, 0x42, 0x4e, 0x40, 0xd7, 0x50, 0x31, 0x75, 0x0d, 0xe5, 0x1e, 0x5f, - 0x90, 0xa3, 0x73, 0xf8, 0xfb, 0x66, 0xbf, 0x99, 0x70, 0xe7, 0xdd, 0x6e, 0x9a, 0x63, 0x7f, 0xc1, - 0x02, 0x88, 0x43, 0x3c, 0xf7, 0x91, 0xaa, 0xed, 0x65, 0xca, 0xd6, 0xfa, 0x91, 0x5f, 0xf7, 0x9b, - 0x42, 0x93, 0xf6, 0x58, 0xac, 0xee, 0xe0, 0xe5, 0x87, 0xda, 0x6f, 0xac, 0xb0, 0x51, 0x59, 0x06, - 0x94, 0x2b, 0xc6, 0x0a, 0x38, 0x23, 0x98, 0xdc, 0x97, 0x2c, 0x38, 0x95, 0x65, 0x57, 0x4b, 0x1f, - 0x49, 0x5c, 0xcc, 0xa5, 0xcc, 0xa6, 0xd4, 0x6c, 0xde, 0x16, 0xe5, 0x58, 0x61, 0xf4, 0x9d, 0x03, - 0xef, 0x68, 0xb1, 0x95, 0x6f, 0xc2, 0x78, 0x35, 0x20, 0xda, 0xe5, 0xfa, 0x1a, 0x0f, 0x52, 0xc0, - 0xfb, 0xf3, 0xec, 0x91, 0x03, 0x14, 0xd8, 0x5f, 0x29, 0xc0, 0x29, 0x6e, 0x7d, 0xb0, 0xb0, 0xe7, - 0xbb, 0x8d, 0xaa, 0xdf, 0x10, 0xde, 0x53, 0x9f, 0x84, 0xb1, 0xb6, 0x26, 0x9b, 0xec, 0x16, 0x27, - 0x54, 0x97, 0x61, 0xc6, 0xd2, 0x14, 0xbd, 0x14, 0x1b, 0xb4, 0x50, 0x03, 0xc6, 0xc8, 0x9e, 0x5b, - 0x57, 0x2a, 0xec, 0xc2, 0x91, 0x2f, 0x3a, 0xd5, 0xca, 0xb2, 0x46, 0x07, 0x1b, 0x54, 0x1f, 0x42, - 0x66, 0x6a, 0xfb, 0xc7, 0x2d, 0x78, 0x24, 0x27, 0xaa, 0x28, 0x6d, 0xee, 0x2e, 0xb3, 0xf3, 0x10, - 0xcb, 0x56, 0x35, 0xc7, 0xad, 0x3f, 0xb0, 0x80, 0xa2, 0x8f, 0x03, 0x70, 0xeb, 0x0d, 0xfa, 0x4a, - 0xef, 0x15, 0x7e, 0xd1, 0x88, 0x1c, 0xa7, 0x05, 0x01, 0x93, 0xf5, 0xb1, 0x46, 0xcb, 0xfe, 0xd2, - 0x00, 0x0c, 0xf2, 0x2c, 0xfa, 0x55, 0x18, 0xde, 0xe1, 0x79, 0x62, 0xba, 0xce, 0x1b, 0xc5, 0x95, - 0xa9, 0x67, 0xe2, 0x79, 0xd3, 0x4a, 0xb1, 0x24, 0x83, 0xd6, 0x60, 0x86, 0xa7, 0xeb, 0x69, 0x56, - 0x48, 0xd3, 0xd9, 0x97, 0x62, 0x3f, 0x9e, 0x5b, 0x56, 0x89, 0x3f, 0x57, 0xd3, 0x28, 0x38, 0xab, - 0x1e, 0x7a, 0x0d, 0x26, 0xe8, 0x33, 0xcc, 0xef, 0x44, 0x92, 0x12, 0x4f, 0xd4, 0xa3, 0xde, 0x7d, - 0x1b, 0x06, 0x14, 0x27, 0xb0, 0xd1, 0xab, 0x30, 0xde, 0x4e, 0x09, 0x38, 0x07, 0x63, 0x49, 0x80, - 0x29, 0xd4, 0x34, 0x71, 0x99, 0x69, 0x6d, 0x87, 0x19, 0x12, 0x6f, 0xec, 0x04, 0x24, 0xdc, 0xf1, - 0x9b, 0x0d, 0xc6, 0xfe, 0x0d, 0x6a, 0xa6, 0xb5, 0x09, 0x38, 0x4e, 0xd5, 0xa0, 0x54, 0xb6, 0x1c, - 0xb7, 0xd9, 0x09, 0x48, 0x4c, 0x65, 0xc8, 0xa4, 0xb2, 0x92, 0x80, 0xe3, 0x54, 0x8d, 0xde, 0x92, - 0xdb, 0xe1, 0xe3, 0x91, 0xdc, 0xda, 0x7f, 0xb3, 0x00, 0xc6, 0xd4, 0x7e, 0xfb, 0x26, 0x10, 0xa2, - 0x5f, 0xb6, 0x1d, 0xb4, 0xeb, 0xc2, 0x32, 0x26, 0xf3, 0xcb, 0xe2, 0xbc, 0xa0, 0xfc, 0xcb, 0xe8, - 0x7f, 0xcc, 0x6a, 0xd1, 0x3d, 0x7e, 0xba, 0x1a, 0xf8, 0xf4, 0x92, 0x93, 0x61, 0xac, 0x94, 0x05, - 0xfb, 0xb0, 0xf4, 0xee, 0xed, 0x12, 0xf0, 0x51, 0xd8, 0xf8, 0x72, 0x0a, 0x86, 0x11, 0x49, 0x4d, - 0xf8, 0xda, 0x4b, 0x2a, 0xe8, 0x0a, 0x8c, 0x8a, 0xac, 0x30, 0xcc, 0xd0, 0x9a, 0x6f, 0x26, 0x66, - 0xf4, 0x52, 0x89, 0x8b, 0xb1, 0x8e, 0x63, 0xff, 0x50, 0x01, 0x66, 0x32, 0x3c, 0x65, 0xf8, 0x35, - 0xb2, 0xed, 0x86, 0x91, 0x4a, 0x3d, 0xaa, 0x5d, 0x23, 0xbc, 0x1c, 0x2b, 0x0c, 0x7a, 0x56, 0xf1, - 0x8b, 0x2a, 0x79, 0x39, 0x09, 0x4b, 0x74, 0x01, 0x3d, 0x62, 0x12, 0xcf, 0x0b, 0x30, 0xd0, 0x09, - 0x89, 0x0c, 0xd5, 0xaa, 0xae, 0x6d, 0xa6, 0xd6, 0x64, 0x10, 0xfa, 0x8c, 0xda, 0x56, 0x1a, 0x42, - 0xed, 0x19, 0xc5, 0x75, 0x84, 0x1c, 0x46, 0x3b, 0x17, 0x11, 0xcf, 0xf1, 0x22, 0xf1, 0xd8, 0x8a, - 0x63, 0x0e, 0xb2, 0x52, 0x2c, 0xa0, 0xf6, 0x17, 0x8b, 0x70, 0x36, 0xd7, 0x77, 0x8e, 0x76, 0xbd, - 0xe5, 0x7b, 0x6e, 0xe4, 0x2b, 0x6b, 0x22, 0x1e, 0x67, 0x90, 0xb4, 0x77, 0xd6, 0x44, 0x39, 0x56, - 0x18, 0xe8, 0x22, 0x0c, 0x32, 0xa1, 0x68, 0x2a, 0x09, 0xeb, 0x62, 0x85, 0x07, 0x9e, 0xe2, 0xe0, - 0xbe, 0xf3, 0x66, 0x3f, 0x41, 0x39, 0x18, 0xbf, 0x99, 0xbc, 0x50, 0x68, 0x77, 0x7d, 0xbf, 0x89, - 0x19, 0x10, 0xbd, 0x5f, 0x8c, 0x57, 0xc2, 0x7c, 0x06, 0x3b, 0x0d, 0x3f, 0xd4, 0x06, 0xed, 0x69, - 0x18, 0xde, 0x25, 0xfb, 0x81, 0xeb, 0x6d, 0x27, 0xcd, 0xaa, 0xae, 0xf3, 0x62, 0x2c, 0xe1, 0x66, - 0xd6, 0xc0, 0xe1, 0xe3, 0x4e, 0x78, 0x3d, 0xd2, 0x93, 0x3d, 0xf9, 0x91, 0x22, 0x4c, 0xe2, 0xc5, - 0xca, 0x7b, 0x13, 0x71, 0x2b, 0x3d, 0x11, 0xc7, 0x9d, 0xf0, 0xba, 0xf7, 0x6c, 0xfc, 0x82, 0x05, - 0x93, 0x2c, 0x37, 0x8d, 0xf0, 0x90, 0x77, 0x7d, 0xef, 0x04, 0x9e, 0x02, 0x4f, 0xc0, 0x60, 0x40, - 0x1b, 0x4d, 0x66, 0x5f, 0x65, 0x3d, 0xc1, 0x1c, 0x86, 0x1e, 0x83, 0x01, 0xd6, 0x05, 0x3a, 0x79, - 0x63, 0xfc, 0x08, 0xae, 0x38, 0x91, 0x83, 0x59, 0x29, 0x0b, 0xbb, 0x84, 0x49, 0xbb, 0xe9, 0xf2, - 0x4e, 0xc7, 0x2a, 0xeb, 0x77, 0x87, 0x57, 0x7d, 0x66, 0xd7, 0xde, 0x59, 0xd8, 0xa5, 0x6c, 0x92, - 0xdd, 0x9f, 0xd9, 0x7f, 0x5c, 0x80, 0xf3, 0x99, 0xf5, 0xfa, 0x0e, 0xbb, 0xd4, 0xbd, 0xf6, 0xc3, - 0xcc, 0x3e, 0x52, 0x3c, 0x41, 0xa3, 0xd5, 0x81, 0x7e, 0xb9, 0xff, 0xc1, 0x3e, 0xa2, 0x21, 0x65, - 0x0e, 0xd9, 0xbb, 0x24, 0x1a, 0x52, 0x66, 0xdf, 0x72, 0xc4, 0x04, 0x7f, 0x51, 0xc8, 0xf9, 0x16, - 0x26, 0x30, 0xb8, 0x44, 0xcf, 0x19, 0x06, 0x0c, 0xe5, 0x23, 0x9c, 0x9f, 0x31, 0xbc, 0x0c, 0x2b, - 0x28, 0x5a, 0x80, 0xc9, 0x96, 0xeb, 0xd1, 0xc3, 0x67, 0xdf, 0x64, 0xc5, 0x55, 0xb0, 0xba, 0x35, - 0x13, 0x8c, 0x93, 0xf8, 0xc8, 0xd5, 0x22, 0x25, 0xf1, 0xaf, 0x7b, 0xf5, 0x48, 0xbb, 0x6e, 0xde, - 0x54, 0xe7, 0xab, 0x51, 0xcc, 0x88, 0x9a, 0xb4, 0xa6, 0xc9, 0x89, 0x8a, 0xfd, 0xcb, 0x89, 0xc6, - 0xb2, 0x65, 0x44, 0x73, 0xaf, 0xc2, 0xf8, 0x03, 0x2b, 0x06, 0xec, 0xaf, 0x17, 0xe1, 0xd1, 0x2e, - 0xdb, 0x9e, 0x9f, 0xf5, 0xc6, 0x1c, 0x68, 0x67, 0x7d, 0x6a, 0x1e, 0xaa, 0x70, 0x6a, 0xab, 0xd3, - 0x6c, 0xee, 0x33, 0x5f, 0x0e, 0xd2, 0x90, 0x18, 0x82, 0xa7, 0x94, 0xc2, 0x91, 0x53, 0x2b, 0x19, - 0x38, 0x38, 0xb3, 0x26, 0x7d, 0x62, 0xd1, 0x9b, 0x64, 0x5f, 0x91, 0x4a, 0x3c, 0xb1, 0xb0, 0x0e, - 0xc4, 0x26, 0x2e, 0xba, 0x0a, 0xd3, 0xce, 0x9e, 0xe3, 0xf2, 0x70, 0xd3, 0x92, 0x00, 0x7f, 0x63, - 0x29, 0x79, 0xee, 0x42, 0x12, 0x01, 0xa7, 0xeb, 0xa0, 0xd7, 0x01, 0xf9, 0x9b, 0xcc, 0xe2, 0xbb, - 0x71, 0x95, 0x78, 0x42, 0xeb, 0xca, 0xe6, 0xae, 0x18, 0x1f, 0x09, 0x37, 0x53, 0x18, 0x38, 0xa3, - 0x56, 0x22, 0x22, 0xd0, 0x50, 0x7e, 0x44, 0xa0, 0xee, 0xe7, 0x62, 0xcf, 0xc4, 0x37, 0xff, 0xde, - 0xa2, 0xd7, 0x17, 0x67, 0xf2, 0xcd, 0x00, 0x9a, 0xaf, 0x32, 0xab, 0x49, 0x2e, 0xeb, 0xd5, 0xe2, - 0xa7, 0x9c, 0xd6, 0xac, 0x26, 0x63, 0x20, 0x36, 0x71, 0xf9, 0x82, 0x08, 0x63, 0xb7, 0x5d, 0x83, - 0xc5, 0x17, 0x51, 0xbe, 0x14, 0x06, 0xfa, 0x04, 0x0c, 0x37, 0xdc, 0x3d, 0x37, 0x14, 0x92, 0xae, - 0x23, 0xab, 0x95, 0xe2, 0x73, 0xb0, 0xc2, 0xc9, 0x60, 0x49, 0xcf, 0xfe, 0x91, 0x02, 0x8c, 0xcb, - 0x16, 0xdf, 0xe8, 0xf8, 0x91, 0x73, 0x02, 0xd7, 0xf2, 0x55, 0xe3, 0x5a, 0x7e, 0x7f, 0xb7, 0x50, - 0x67, 0xac, 0x4b, 0xb9, 0xd7, 0xf1, 0xcd, 0xc4, 0x75, 0xfc, 0x54, 0x6f, 0x52, 0xdd, 0xaf, 0xe1, - 0x7f, 0x68, 0xc1, 0xb4, 0x81, 0x7f, 0x02, 0xb7, 0xc1, 0x8a, 0x79, 0x1b, 0x3c, 0xde, 0xf3, 0x1b, - 0x72, 0x6e, 0x81, 0xef, 0x2f, 0x26, 0xfa, 0xce, 0x4e, 0xff, 0xb7, 0x60, 0x60, 0xc7, 0x09, 0x1a, - 0xdd, 0x52, 0x3b, 0xa4, 0x2a, 0xcd, 0x5f, 0x73, 0x02, 0xa1, 0x76, 0x7e, 0x56, 0x8e, 0x3a, 0x2d, - 0xea, 0xa9, 0x72, 0x66, 0x4d, 0xa1, 0x97, 0x61, 0x28, 0xac, 0xfb, 0x6d, 0xe5, 0xc9, 0x71, 0x81, - 0x0d, 0x34, 0x2b, 0x39, 0x3c, 0x28, 0x23, 0xb3, 0x39, 0x5a, 0x8c, 0x05, 0x3e, 0xfa, 0x24, 0x8c, - 0xb3, 0x5f, 0xca, 0x06, 0xac, 0x98, 0x2f, 0x8e, 0xa8, 0xe9, 0x88, 0xdc, 0x40, 0xd2, 0x28, 0xc2, - 0x26, 0xa9, 0xb9, 0x6d, 0x28, 0xa9, 0xcf, 0x7a, 0xa8, 0x7a, 0xdb, 0x7f, 0x5b, 0x84, 0x99, 0x8c, - 0x35, 0x87, 0x42, 0x63, 0x26, 0xae, 0xf4, 0xb9, 0x54, 0xdf, 0xe1, 0x5c, 0x84, 0xec, 0x35, 0xd4, - 0x10, 0x6b, 0xab, 0xef, 0x46, 0x6f, 0x85, 0x24, 0xd9, 0x28, 0x2d, 0xea, 0xdd, 0x28, 0x6d, 0xec, - 0xc4, 0x86, 0x9a, 0x36, 0xa4, 0x7a, 0xfa, 0x50, 0xe7, 0xf4, 0xcf, 0x8a, 0x70, 0x2a, 0x2b, 0xfa, - 0x22, 0xfa, 0x5c, 0x22, 0xb1, 0xe8, 0x8b, 0xfd, 0xc6, 0x6d, 0xe4, 0xd9, 0x46, 0x45, 0x40, 0xb8, - 0x79, 0x33, 0xd5, 0x68, 0xcf, 0x61, 0x16, 0x6d, 0xb2, 0x90, 0x14, 0x01, 0x4f, 0x08, 0x2b, 0x8f, - 0x8f, 0x0f, 0xf5, 0xdd, 0x01, 0x91, 0x49, 0x36, 0x4c, 0xd8, 0x97, 0xc8, 0xe2, 0xde, 0xf6, 0x25, - 0xb2, 0xe5, 0x39, 0x17, 0x46, 0xb5, 0xaf, 0x79, 0xa8, 0x33, 0xbe, 0x4b, 0x6f, 0x2b, 0xad, 0xdf, - 0x0f, 0x75, 0xd6, 0x7f, 0xdc, 0x82, 0x84, 0xcb, 0x81, 0x12, 0x8b, 0x59, 0xb9, 0x62, 0xb1, 0x0b, - 0x30, 0x10, 0xf8, 0x4d, 0x92, 0xcc, 0xc0, 0x89, 0xfd, 0x26, 0xc1, 0x0c, 0x42, 0x31, 0xa2, 0x58, - 0xd8, 0x31, 0xa6, 0x3f, 0xe4, 0xc4, 0x13, 0xed, 0x09, 0x18, 0x6c, 0x92, 0x3d, 0xd2, 0x4c, 0x26, - 0x4a, 0xba, 0x41, 0x0b, 0x31, 0x87, 0xd9, 0xbf, 0x30, 0x00, 0xe7, 0xba, 0x06, 0x75, 0xa1, 0xcf, - 0xa1, 0x6d, 0x27, 0x22, 0x77, 0x9d, 0xfd, 0x64, 0x46, 0x93, 0xab, 0xbc, 0x18, 0x4b, 0x38, 0xf3, - 0x24, 0xe3, 0x81, 0xc9, 0x13, 0x42, 0x44, 0x11, 0x8f, 0x5c, 0x40, 0x4d, 0xa1, 0x54, 0xf1, 0x38, - 0x84, 0x52, 0xcf, 0x03, 0x84, 0x61, 0x93, 0x1b, 0x66, 0x35, 0x84, 0x8b, 0x5a, 0x1c, 0xc0, 0xbe, - 0x76, 0x43, 0x40, 0xb0, 0x86, 0x85, 0x2a, 0x30, 0xd5, 0x0e, 0xfc, 0x88, 0xcb, 0x64, 0x2b, 0xdc, - 0x76, 0x71, 0xd0, 0x8c, 0xa7, 0x51, 0x4d, 0xc0, 0x71, 0xaa, 0x06, 0x7a, 0x09, 0x46, 0x45, 0x8c, - 0x8d, 0xaa, 0xef, 0x37, 0x85, 0x18, 0x48, 0x99, 0xf3, 0xd5, 0x62, 0x10, 0xd6, 0xf1, 0xb4, 0x6a, - 0x4c, 0xd0, 0x3b, 0x9c, 0x59, 0x8d, 0x0b, 0x7b, 0x35, 0xbc, 0x44, 0x24, 0xd6, 0x91, 0xbe, 0x22, - 0xb1, 0xc6, 0x82, 0xb1, 0x52, 0xdf, 0x7a, 0x47, 0xe8, 0x29, 0x4a, 0xfa, 0xb9, 0x01, 0x98, 0x11, - 0x0b, 0xe7, 0x61, 0x2f, 0x97, 0x5b, 0xe9, 0xe5, 0x72, 0x1c, 0xa2, 0xb3, 0xf7, 0xd6, 0xcc, 0x49, - 0xaf, 0x99, 0x1f, 0xb5, 0xc0, 0x64, 0xaf, 0xd0, 0xff, 0x95, 0x9b, 0x12, 0xea, 0xa5, 0x5c, 0x76, - 0x4d, 0x45, 0xf5, 0x7c, 0x87, 0xc9, 0xa1, 0xec, 0x7f, 0x67, 0xc1, 0xe3, 0x3d, 0x29, 0xa2, 0x65, - 0x28, 0x31, 0x1e, 0x50, 0x7b, 0x9d, 0x3d, 0xa5, 0x6c, 0x9b, 0x25, 0x20, 0x87, 0x25, 0x8d, 0x6b, - 0xa2, 0xe5, 0x54, 0xee, 0xad, 0xa7, 0x33, 0x72, 0x6f, 0x9d, 0x36, 0x86, 0xe7, 0x01, 0x93, 0x6f, - 0xfd, 0x30, 0xbd, 0x71, 0x0c, 0xbf, 0x22, 0xf4, 0x21, 0x43, 0xec, 0x67, 0x27, 0xc4, 0x7e, 0xc8, - 0xc4, 0xd6, 0xee, 0x90, 0x8f, 0xc1, 0x14, 0x0b, 0xbe, 0xc5, 0x2c, 0xed, 0x85, 0xc7, 0x53, 0x21, - 0xb6, 0xa6, 0xbd, 0x91, 0x80, 0xe1, 0x14, 0xb6, 0xfd, 0x47, 0x45, 0x18, 0xe2, 0xdb, 0xef, 0x04, - 0xde, 0x84, 0xcf, 0x40, 0xc9, 0x6d, 0xb5, 0x3a, 0x3c, 0x9d, 0xd2, 0x20, 0xf7, 0x8d, 0xa6, 0xf3, - 0xb4, 0x2a, 0x0b, 0x71, 0x0c, 0x47, 0x2b, 0x42, 0xe2, 0xdc, 0x25, 0xbe, 0x27, 0xef, 0xf8, 0x7c, - 0xc5, 0x89, 0x1c, 0xce, 0xe0, 0xa8, 0x7b, 0x36, 0x96, 0x4d, 0xa3, 0x4f, 0x03, 0x84, 0x51, 0xe0, - 0x7a, 0xdb, 0xb4, 0x4c, 0x84, 0x15, 0xfe, 0x40, 0x17, 0x6a, 0x35, 0x85, 0xcc, 0x69, 0xc6, 0x67, - 0x8e, 0x02, 0x60, 0x8d, 0x22, 0x9a, 0x37, 0x6e, 0xfa, 0xb9, 0xc4, 0xdc, 0x01, 0xa7, 0x1a, 0xcf, - 0xd9, 0xdc, 0x87, 0xa1, 0xa4, 0x88, 0xf7, 0x92, 0x3f, 0x8d, 0xe9, 0x6c, 0xd1, 0x47, 0x61, 0x32, - 0xd1, 0xb7, 0x23, 0x89, 0xaf, 0x7e, 0xd1, 0x82, 0x49, 0xde, 0x99, 0x65, 0x6f, 0x4f, 0xdc, 0x06, - 0x6f, 0xc3, 0xa9, 0x66, 0xc6, 0xa9, 0x2c, 0xa6, 0xbf, 0xff, 0x53, 0x5c, 0x89, 0xab, 0xb2, 0xa0, - 0x38, 0xb3, 0x0d, 0x74, 0x89, 0xee, 0x38, 0x7a, 0xea, 0x3a, 0x4d, 0xe1, 0x2a, 0x3d, 0xc6, 0x77, - 0x1b, 0x2f, 0xc3, 0x0a, 0x6a, 0xff, 0xae, 0x05, 0xd3, 0xbc, 0xe7, 0xd7, 0xc9, 0xbe, 0x3a, 0x9b, - 0xbe, 0x99, 0x7d, 0x17, 0x89, 0xfc, 0x0a, 0x39, 0x89, 0xfc, 0xf4, 0x4f, 0x2b, 0x76, 0xfd, 0xb4, - 0xaf, 0x58, 0x20, 0x56, 0xc8, 0x09, 0x08, 0x21, 0xbe, 0xd3, 0x14, 0x42, 0xcc, 0xe5, 0x6f, 0x82, - 0x1c, 0xe9, 0xc3, 0x9f, 0x5b, 0x30, 0xc5, 0x11, 0x62, 0x6d, 0xf9, 0x37, 0x75, 0x1e, 0xfa, 0x49, - 0xf7, 0x7d, 0x9d, 0xec, 0x6f, 0xf8, 0x55, 0x27, 0xda, 0xc9, 0xfe, 0x28, 0x63, 0xb2, 0x06, 0xba, - 0x4e, 0x56, 0x43, 0x6e, 0x20, 0x23, 0xcf, 0x4d, 0x8f, 0xf8, 0x11, 0x47, 0xcd, 0x73, 0x63, 0x7f, - 0xc3, 0x02, 0xc4, 0x9b, 0x31, 0x18, 0x37, 0xca, 0x0e, 0xb1, 0x52, 0xed, 0xa2, 0x8b, 0x8f, 0x26, - 0x05, 0xc1, 0x1a, 0xd6, 0xb1, 0x0c, 0x4f, 0xc2, 0xe4, 0xa1, 0xd8, 0xdb, 0xe4, 0xe1, 0x08, 0x23, - 0xfa, 0xaf, 0x86, 0x20, 0xe9, 0x5b, 0x85, 0x6e, 0xc3, 0x58, 0xdd, 0x69, 0x3b, 0x9b, 0x6e, 0xd3, - 0x8d, 0x5c, 0x12, 0x76, 0xb3, 0x87, 0x5a, 0xd2, 0xf0, 0x84, 0x92, 0x5a, 0x2b, 0xc1, 0x06, 0x1d, - 0x34, 0x0f, 0xd0, 0x0e, 0xdc, 0x3d, 0xb7, 0x49, 0xb6, 0x99, 0xac, 0x84, 0x05, 0x67, 0xe0, 0xc6, - 0x59, 0xb2, 0x14, 0x6b, 0x18, 0x19, 0x8e, 0xec, 0xc5, 0x87, 0xec, 0xc8, 0x0e, 0x27, 0xe6, 0xc8, - 0x3e, 0x70, 0x24, 0x47, 0xf6, 0x91, 0x23, 0x3b, 0xb2, 0x0f, 0xf6, 0xe5, 0xc8, 0x8e, 0xe1, 0x8c, - 0xe4, 0x3d, 0xe9, 0xff, 0x15, 0xb7, 0x49, 0xc4, 0x83, 0x83, 0x47, 0x94, 0x98, 0xbb, 0x7f, 0x50, - 0x3e, 0x83, 0x33, 0x31, 0x70, 0x4e, 0x4d, 0xf4, 0x71, 0x98, 0x75, 0x9a, 0x4d, 0xff, 0xae, 0x9a, - 0xd4, 0xe5, 0xb0, 0xee, 0x34, 0xb9, 0x12, 0x62, 0x98, 0x51, 0x7d, 0xec, 0xfe, 0x41, 0x79, 0x76, - 0x21, 0x07, 0x07, 0xe7, 0xd6, 0x46, 0x1f, 0x81, 0x52, 0x3b, 0xf0, 0xeb, 0x6b, 0x9a, 0x03, 0xe8, - 0x79, 0x3a, 0x80, 0x55, 0x59, 0x78, 0x78, 0x50, 0x1e, 0x57, 0x7f, 0xd8, 0x85, 0x1f, 0x57, 0xc8, - 0xf0, 0x4c, 0x1f, 0x3d, 0x56, 0xcf, 0xf4, 0x5d, 0x98, 0xa9, 0x91, 0xc0, 0x75, 0x9a, 0xee, 0xdb, - 0x94, 0x5f, 0x96, 0xe7, 0xd3, 0x06, 0x94, 0x82, 0xc4, 0x89, 0xdc, 0x57, 0xcc, 0x4d, 0x2d, 0xe1, - 0x88, 0x3c, 0x81, 0x63, 0x42, 0xf6, 0xff, 0xb0, 0x60, 0x58, 0xf8, 0x52, 0x9d, 0x00, 0xd7, 0xb8, - 0x60, 0x68, 0x12, 0xca, 0xd9, 0x03, 0xc6, 0x3a, 0x93, 0xab, 0x43, 0x58, 0x4d, 0xe8, 0x10, 0x1e, - 0xef, 0x46, 0xa4, 0xbb, 0xf6, 0xe0, 0xaf, 0x16, 0x29, 0xf7, 0x6e, 0x78, 0xf5, 0x3e, 0xfc, 0x21, - 0x58, 0x87, 0xe1, 0x50, 0x78, 0x95, 0x16, 0xf2, 0x7d, 0x1a, 0x92, 0x93, 0x18, 0xdb, 0xb1, 0x09, - 0x3f, 0x52, 0x49, 0x24, 0xd3, 0x5d, 0xb5, 0xf8, 0x10, 0xdd, 0x55, 0x7b, 0xf9, 0x3d, 0x0f, 0x1c, - 0x87, 0xdf, 0xb3, 0xfd, 0x35, 0x76, 0x73, 0xea, 0xe5, 0x27, 0xc0, 0x54, 0x5d, 0x35, 0xef, 0x58, - 0xbb, 0xcb, 0xca, 0x12, 0x9d, 0xca, 0x61, 0xae, 0x7e, 0xde, 0x82, 0x73, 0x19, 0x5f, 0xa5, 0x71, - 0x5a, 0xcf, 0xc2, 0x88, 0xd3, 0x69, 0xb8, 0x6a, 0x2f, 0x6b, 0xfa, 0xc4, 0x05, 0x51, 0x8e, 0x15, - 0x06, 0x5a, 0x82, 0x69, 0x72, 0xaf, 0xed, 0x72, 0x55, 0xaa, 0x6e, 0xfe, 0x5b, 0xe4, 0x0e, 0x78, - 0xcb, 0x49, 0x20, 0x4e, 0xe3, 0xab, 0x58, 0x33, 0xc5, 0xdc, 0x58, 0x33, 0x7f, 0xc7, 0x82, 0x51, - 0xe5, 0x57, 0xf9, 0xd0, 0x47, 0xfb, 0x63, 0xe6, 0x68, 0x3f, 0xda, 0x65, 0xb4, 0x73, 0x86, 0xf9, - 0xb7, 0x0b, 0xaa, 0xbf, 0x55, 0x3f, 0x88, 0xfa, 0xe0, 0xe0, 0x1e, 0xdc, 0x75, 0xe1, 0x0a, 0x8c, - 0x3a, 0xed, 0xb6, 0x04, 0x48, 0x1b, 0x34, 0x16, 0x41, 0x39, 0x2e, 0xc6, 0x3a, 0x8e, 0xf2, 0xa4, - 0x28, 0xe6, 0x7a, 0x52, 0x34, 0x00, 0x22, 0x27, 0xd8, 0x26, 0x11, 0x2d, 0x13, 0x26, 0xb3, 0xf9, - 0xe7, 0x4d, 0x27, 0x72, 0x9b, 0xf3, 0xae, 0x17, 0x85, 0x51, 0x30, 0xbf, 0xea, 0x45, 0x37, 0x03, - 0xfe, 0x84, 0xd4, 0xa2, 0x35, 0x29, 0x5a, 0x58, 0xa3, 0x2b, 0x63, 0x08, 0xb0, 0x36, 0x06, 0x4d, - 0x63, 0x86, 0x75, 0x51, 0x8e, 0x15, 0x86, 0xfd, 0x61, 0x76, 0xfb, 0xb0, 0x31, 0x3d, 0x5a, 0xa4, - 0xa2, 0xaf, 0x8c, 0xa9, 0xd9, 0x60, 0x9a, 0xcc, 0x8a, 0x1e, 0x0f, 0xa9, 0xfb, 0x61, 0x4f, 0x1b, - 0xd6, 0xfd, 0xfa, 0xe2, 0xa0, 0x49, 0xe8, 0xbb, 0x52, 0x06, 0x2a, 0xcf, 0xf5, 0xb8, 0x35, 0x8e, - 0x60, 0x92, 0xc2, 0xd2, 0xa9, 0xb0, 0x64, 0x13, 0xab, 0x55, 0xb1, 0x2f, 0xb4, 0x74, 0x2a, 0x02, - 0x80, 0x63, 0x1c, 0xca, 0x4c, 0xa9, 0x3f, 0xe1, 0x2c, 0x8a, 0xc3, 0x8a, 0x2a, 0xec, 0x10, 0x6b, - 0x18, 0xe8, 0xb2, 0x10, 0x28, 0x70, 0xbd, 0xc0, 0xa3, 0x09, 0x81, 0x82, 0x1c, 0x2e, 0x4d, 0x0a, - 0x74, 0x05, 0x46, 0x55, 0x06, 0xed, 0x2a, 0x4f, 0x64, 0x24, 0x96, 0xd9, 0x72, 0x5c, 0x8c, 0x75, - 0x1c, 0xb4, 0x01, 0x93, 0x21, 0x97, 0xb3, 0xa9, 0x58, 0xcf, 0x5c, 0x5e, 0xf9, 0x01, 0x69, 0x05, - 0x54, 0x33, 0xc1, 0x87, 0xac, 0x88, 0x9f, 0x4e, 0xd2, 0xcf, 0x3f, 0x49, 0x02, 0xbd, 0x06, 0x13, - 0x4d, 0xdf, 0x69, 0x2c, 0x3a, 0x4d, 0xc7, 0xab, 0xb3, 0xf1, 0x19, 0x31, 0x13, 0xb1, 0xde, 0x30, - 0xa0, 0x38, 0x81, 0x4d, 0x99, 0x37, 0xbd, 0x44, 0xc4, 0x27, 0x77, 0xbc, 0x6d, 0x12, 0x8a, 0x7c, - 0xc8, 0x8c, 0x79, 0xbb, 0x91, 0x83, 0x83, 0x73, 0x6b, 0xa3, 0x97, 0x61, 0x4c, 0x7e, 0xbe, 0x16, - 0x16, 0x23, 0x76, 0x4a, 0xd1, 0x60, 0xd8, 0xc0, 0x44, 0x77, 0xe1, 0xb4, 0xfc, 0xbf, 0x11, 0x38, - 0x5b, 0x5b, 0x6e, 0x5d, 0xf8, 0x8a, 0x73, 0xef, 0xd5, 0x05, 0xe9, 0x62, 0xb9, 0x9c, 0x85, 0x74, - 0x78, 0x50, 0xbe, 0x20, 0x46, 0x2d, 0x13, 0xce, 0x26, 0x31, 0x9b, 0x3e, 0x5a, 0x83, 0x99, 0x1d, - 0xe2, 0x34, 0xa3, 0x9d, 0xa5, 0x1d, 0x52, 0xdf, 0x95, 0x9b, 0x8e, 0x05, 0xdb, 0xd0, 0x1c, 0x38, - 0xae, 0xa5, 0x51, 0x70, 0x56, 0x3d, 0xf4, 0x26, 0xcc, 0xb6, 0x3b, 0x9b, 0x4d, 0x37, 0xdc, 0x59, - 0xf7, 0x23, 0x66, 0x0a, 0xa4, 0x12, 0x72, 0x8b, 0xa8, 0x1c, 0x2a, 0x9c, 0x49, 0x35, 0x07, 0x0f, - 0xe7, 0x52, 0x40, 0x6f, 0xc3, 0xe9, 0xc4, 0x62, 0x10, 0x71, 0x09, 0x26, 0xf2, 0xb3, 0x3d, 0xd4, - 0xb2, 0x2a, 0x88, 0x10, 0x1f, 0x59, 0x20, 0x9c, 0xdd, 0x04, 0x7a, 0x05, 0xc0, 0x6d, 0xaf, 0x38, - 0x2d, 0xb7, 0x49, 0x9f, 0x8b, 0x33, 0x6c, 0x9d, 0xd0, 0xa7, 0x03, 0xac, 0x56, 0x65, 0x29, 0x3d, - 0x9f, 0xc5, 0xbf, 0x7d, 0xac, 0x61, 0xa3, 0x1b, 0x30, 0x21, 0xfe, 0xed, 0x8b, 0x69, 0xe5, 0xe1, - 0x31, 0x9e, 0x64, 0xb1, 0x8d, 0xaa, 0x3a, 0xe4, 0x30, 0x55, 0x82, 0x13, 0x75, 0xd1, 0x36, 0x9c, - 0x93, 0x99, 0xbb, 0xf4, 0x35, 0x2a, 0xe7, 0x20, 0x64, 0x29, 0x16, 0x46, 0xb8, 0x6f, 0xc8, 0x42, - 0x37, 0x44, 0xdc, 0x9d, 0x0e, 0xbd, 0xdb, 0xf5, 0xa5, 0xce, 0xbd, 0x67, 0x4f, 0x73, 0xd3, 0x24, - 0x7a, 0xb7, 0xdf, 0x48, 0x02, 0x71, 0x1a, 0x1f, 0x85, 0x70, 0xda, 0xf5, 0xb2, 0x56, 0xf6, 0x19, - 0x46, 0xe8, 0xa3, 0xdc, 0x71, 0xb8, 0xfb, 0xaa, 0xce, 0x84, 0xf3, 0x55, 0x9d, 0x49, 0xfb, 0x9d, - 0x59, 0xe0, 0xfd, 0x8e, 0x45, 0x6b, 0x6b, 0x5c, 0x3a, 0xfa, 0x0c, 0x8c, 0xe9, 0x1f, 0x26, 0x38, - 0x8e, 0x8b, 0xd9, 0x4c, 0xac, 0x76, 0x36, 0x70, 0x1e, 0x5f, 0xed, 0x7f, 0x1d, 0x86, 0x0d, 0x8a, - 0xa8, 0x9e, 0xe1, 0x62, 0x7f, 0xb9, 0x3f, 0x8e, 0xa6, 0x7f, 0x03, 0x34, 0x02, 0xd9, 0x4b, 0x1e, - 0xdd, 0x80, 0x91, 0x7a, 0xd3, 0x25, 0x5e, 0xb4, 0x5a, 0xed, 0x16, 0x47, 0x6f, 0x49, 0xe0, 0x88, - 0x3d, 0x24, 0x32, 0x26, 0xf0, 0x32, 0xac, 0x28, 0xd8, 0xbf, 0x56, 0x80, 0x72, 0x8f, 0xf4, 0x1b, - 0x09, 0x75, 0x94, 0xd5, 0x97, 0x3a, 0x6a, 0x41, 0x66, 0x9c, 0x5f, 0x4f, 0x48, 0xba, 0x12, 0xd9, - 0xe4, 0x63, 0x79, 0x57, 0x12, 0xbf, 0x6f, 0xf7, 0x00, 0x5d, 0xa3, 0x35, 0xd0, 0xd3, 0xc1, 0xc5, - 0xd0, 0x64, 0x0f, 0xf6, 0xff, 0xfc, 0xcd, 0xd5, 0x4a, 0xda, 0x5f, 0x2b, 0xc0, 0x69, 0x35, 0x84, - 0xdf, 0xbe, 0x03, 0x77, 0x2b, 0x3d, 0x70, 0xc7, 0xa0, 0xd3, 0xb5, 0x6f, 0xc2, 0x10, 0x0f, 0x0c, - 0xd8, 0x07, 0xdb, 0xfd, 0x84, 0x19, 0x78, 0x57, 0x71, 0x7a, 0x46, 0xf0, 0xdd, 0x1f, 0xb4, 0x60, - 0x32, 0xe1, 0x67, 0x86, 0xb0, 0xe6, 0x8c, 0xfc, 0x20, 0xac, 0x71, 0x16, 0xd3, 0x7d, 0x01, 0x06, - 0x76, 0xfc, 0x30, 0x4a, 0x1a, 0x7c, 0x5c, 0xf3, 0xc3, 0x08, 0x33, 0x88, 0xfd, 0x7b, 0x16, 0x0c, - 0x6e, 0x38, 0xae, 0x17, 0x49, 0xe5, 0x80, 0x95, 0xa3, 0x1c, 0xe8, 0xe7, 0xbb, 0xd0, 0x4b, 0x30, - 0x44, 0xb6, 0xb6, 0x48, 0x3d, 0x12, 0xb3, 0x2a, 0x23, 0x39, 0x0c, 0x2d, 0xb3, 0x52, 0xca, 0x07, - 0xb2, 0xc6, 0xf8, 0x5f, 0x2c, 0x90, 0xd1, 0x1d, 0x28, 0x45, 0x6e, 0x8b, 0x2c, 0x34, 0x1a, 0x42, - 0x65, 0xfe, 0x00, 0xd1, 0x28, 0x36, 0x24, 0x01, 0x1c, 0xd3, 0xb2, 0xbf, 0x58, 0x00, 0x88, 0x23, - 0x2a, 0xf5, 0xfa, 0xc4, 0xc5, 0x94, 0x32, 0xf5, 0x62, 0x86, 0x32, 0x15, 0xc5, 0x04, 0x33, 0x34, - 0xa9, 0x6a, 0x98, 0x8a, 0x7d, 0x0d, 0xd3, 0xc0, 0x51, 0x86, 0x69, 0x09, 0xa6, 0xe3, 0x88, 0x50, - 0x66, 0x40, 0x3c, 0x76, 0x7d, 0x6e, 0x24, 0x81, 0x38, 0x8d, 0x6f, 0x13, 0xb8, 0xa0, 0x02, 0xe3, - 0x88, 0x1b, 0x8d, 0x59, 0x64, 0xeb, 0xca, 0xe9, 0x1e, 0xe3, 0x14, 0x6b, 0x8b, 0x0b, 0xb9, 0xda, - 0xe2, 0x9f, 0xb2, 0xe0, 0x54, 0xb2, 0x1d, 0xe6, 0xbe, 0xfc, 0x05, 0x0b, 0x4e, 0x33, 0x9d, 0x39, - 0x6b, 0x35, 0xad, 0xa1, 0x7f, 0xb1, 0x6b, 0xb0, 0x9f, 0x9c, 0x1e, 0xc7, 0x21, 0x43, 0xd6, 0xb2, - 0x48, 0xe3, 0xec, 0x16, 0xed, 0x5f, 0x19, 0x80, 0xd9, 0xbc, 0x28, 0x41, 0xcc, 0x61, 0xc3, 0xb9, - 0x57, 0xdb, 0x25, 0x77, 0x85, 0x59, 0x7c, 0xec, 0xb0, 0xc1, 0x8b, 0xb1, 0x84, 0x27, 0x33, 0x2a, - 0x14, 0xfa, 0xcc, 0xa8, 0xb0, 0x03, 0xd3, 0x77, 0x77, 0x88, 0x77, 0xcb, 0x0b, 0x9d, 0xc8, 0x0d, - 0xb7, 0x5c, 0xa6, 0x5f, 0xe6, 0xeb, 0x46, 0xa6, 0x61, 0x9d, 0xbe, 0x93, 0x44, 0x38, 0x3c, 0x28, - 0x9f, 0x33, 0x0a, 0xe2, 0x2e, 0xf3, 0x83, 0x04, 0xa7, 0x89, 0xa6, 0x13, 0x52, 0x0c, 0x3c, 0xe4, - 0x84, 0x14, 0x2d, 0x57, 0x58, 0xa5, 0x48, 0x6b, 0x7c, 0xf6, 0x72, 0x5c, 0x53, 0xa5, 0x58, 0xc3, - 0x40, 0x9f, 0x02, 0xa4, 0x27, 0xdc, 0x31, 0x82, 0x34, 0x3e, 0x77, 0xff, 0xa0, 0x8c, 0xd6, 0x53, - 0xd0, 0xc3, 0x83, 0xf2, 0x0c, 0x2d, 0x5d, 0xf5, 0xe8, 0x0b, 0x34, 0x8e, 0x6c, 0x95, 0x41, 0x08, - 0xdd, 0x81, 0x29, 0x5a, 0xca, 0x76, 0x94, 0x8c, 0x00, 0xc9, 0x5f, 0x8d, 0xcf, 0xdc, 0x3f, 0x28, - 0x4f, 0xad, 0x27, 0x60, 0x79, 0xa4, 0x53, 0x44, 0xec, 0x2f, 0x58, 0x70, 0x36, 0x37, 0xf7, 0x32, - 0xba, 0x04, 0x23, 0x4e, 0xdb, 0xe5, 0xaa, 0x08, 0x71, 0x5d, 0x30, 0x91, 0x57, 0x75, 0x95, 0x2b, - 0x22, 0x14, 0x94, 0x9e, 0xd2, 0xbb, 0xae, 0xd7, 0x48, 0x9e, 0xd2, 0xd7, 0x5d, 0xaf, 0x81, 0x19, - 0x44, 0x5d, 0x3b, 0xc5, 0xbc, 0x6b, 0xc7, 0xfe, 0x01, 0x0b, 0x84, 0x53, 0x6d, 0x1f, 0x77, 0xd4, - 0x27, 0x61, 0x6c, 0x2f, 0x9d, 0x9c, 0xeb, 0x42, 0xbe, 0x97, 0xb1, 0x48, 0xc9, 0xa5, 0x18, 0x4f, - 0x23, 0x11, 0x97, 0x41, 0xcb, 0x6e, 0x80, 0x80, 0x56, 0x08, 0x13, 0xb4, 0xf7, 0xee, 0xcd, 0xf3, - 0x00, 0x0d, 0x86, 0xcb, 0x32, 0x76, 0x16, 0x4c, 0x0e, 0xa4, 0xa2, 0x20, 0x58, 0xc3, 0xb2, 0xff, - 0x4d, 0x01, 0x46, 0x65, 0x32, 0xa8, 0x8e, 0xd7, 0x8f, 0x38, 0xec, 0x48, 0xd9, 0x61, 0xd1, 0x65, - 0x28, 0x31, 0x79, 0x6d, 0x35, 0x96, 0x22, 0x2a, 0x69, 0xc9, 0x9a, 0x04, 0xe0, 0x18, 0x87, 0x9e, - 0x16, 0x61, 0x67, 0x93, 0xa1, 0x27, 0x5c, 0x40, 0x6b, 0xbc, 0x18, 0x4b, 0x38, 0xfa, 0x38, 0x4c, - 0xf1, 0x7a, 0x81, 0xdf, 0x76, 0xb6, 0xb9, 0x8e, 0x67, 0x50, 0xc5, 0xd5, 0x98, 0x5a, 0x4b, 0xc0, - 0x0e, 0x0f, 0xca, 0xa7, 0x92, 0x65, 0x4c, 0x79, 0x99, 0xa2, 0xc2, 0x4c, 0xb9, 0x78, 0x23, 0xf4, - 0x94, 0x4b, 0x59, 0x80, 0xc5, 0x20, 0xac, 0xe3, 0xd9, 0x9f, 0x01, 0x94, 0x4e, 0x8b, 0x85, 0x5e, - 0xe7, 0xf6, 0xbb, 0x6e, 0x40, 0x1a, 0xdd, 0x94, 0x99, 0x7a, 0xf4, 0x08, 0xe9, 0xbd, 0xc5, 0x6b, - 0x61, 0x55, 0xdf, 0xfe, 0xff, 0x8a, 0x30, 0x95, 0xf4, 0x57, 0x47, 0xd7, 0x60, 0x88, 0xb3, 0x58, - 0x82, 0x7c, 0x17, 0x5b, 0x19, 0xcd, 0xcb, 0x9d, 0x5d, 0x36, 0x82, 0x4b, 0x13, 0xf5, 0xd1, 0x9b, - 0x30, 0xda, 0xf0, 0xef, 0x7a, 0x77, 0x9d, 0xa0, 0xb1, 0x50, 0x5d, 0x15, 0xcb, 0x39, 0xf3, 0xf1, - 0x5e, 0x89, 0xd1, 0x74, 0xcf, 0x79, 0xa6, 0x17, 0x8e, 0x41, 0x58, 0x27, 0x87, 0x36, 0x58, 0x2c, - 0xfd, 0x2d, 0x77, 0x7b, 0xcd, 0x69, 0x77, 0x73, 0xe6, 0x58, 0x92, 0x48, 0x1a, 0xe5, 0x71, 0x11, - 0x70, 0x9f, 0x03, 0x70, 0x4c, 0x08, 0x7d, 0x0e, 0x66, 0xc2, 0x1c, 0x95, 0x42, 0x5e, 0x96, 0xc4, - 0x6e, 0x52, 0xf6, 0xc5, 0x47, 0xee, 0x1f, 0x94, 0x67, 0xb2, 0x94, 0x0f, 0x59, 0xcd, 0xd8, 0x5f, - 0x3a, 0x05, 0xc6, 0x26, 0x36, 0x92, 0xe6, 0x5a, 0xc7, 0x94, 0x34, 0x17, 0xc3, 0x08, 0x69, 0xb5, - 0xa3, 0xfd, 0x8a, 0x1b, 0x88, 0x39, 0xc9, 0xa4, 0xb9, 0x2c, 0x70, 0xd2, 0x34, 0x25, 0x04, 0x2b, - 0x3a, 0xd9, 0x99, 0x8d, 0x8b, 0xdf, 0xc4, 0xcc, 0xc6, 0x03, 0x27, 0x98, 0xd9, 0x78, 0x1d, 0x86, - 0xb7, 0xdd, 0x08, 0x93, 0xb6, 0x2f, 0x1e, 0x37, 0x99, 0xeb, 0xf0, 0x2a, 0x47, 0x49, 0xe7, 0xd0, - 0x14, 0x00, 0x2c, 0x89, 0xa0, 0xd7, 0xd5, 0x0e, 0x1c, 0xca, 0x17, 0x40, 0xa4, 0x8d, 0x3a, 0x32, - 0xf7, 0xa0, 0xc8, 0x5f, 0x3c, 0xfc, 0xa0, 0xf9, 0x8b, 0x57, 0x64, 0xd6, 0xe1, 0x91, 0x7c, 0xcf, - 0x2b, 0x96, 0x54, 0xb8, 0x47, 0xae, 0xe1, 0xdb, 0x7a, 0xa6, 0xe6, 0x52, 0xfe, 0x49, 0xa0, 0x92, - 0x30, 0xf7, 0x99, 0x9f, 0xf9, 0x07, 0x2c, 0x38, 0xdd, 0xce, 0x4a, 0x5a, 0x2e, 0xec, 0x1f, 0x5e, - 0xea, 0x3b, 0x2f, 0xba, 0xd1, 0x20, 0x93, 0x1b, 0x66, 0x67, 0xbe, 0xcf, 0x6e, 0x8e, 0x0e, 0x74, - 0xb0, 0xd9, 0x10, 0x7a, 0xf8, 0x27, 0x72, 0x12, 0x3d, 0x77, 0x49, 0xef, 0xbc, 0x91, 0x91, 0x54, - 0xf8, 0xc9, 0xbc, 0xa4, 0xc2, 0x7d, 0xa7, 0x12, 0x7e, 0x5d, 0xa5, 0x78, 0x1e, 0xcf, 0x5f, 0x4a, - 0x3c, 0x81, 0x73, 0xcf, 0xc4, 0xce, 0xaf, 0xab, 0xc4, 0xce, 0x5d, 0x62, 0x1e, 0xf3, 0xb4, 0xcd, - 0x3d, 0xd3, 0x39, 0x6b, 0x29, 0x99, 0x27, 0x8f, 0x27, 0x25, 0xb3, 0x71, 0xd5, 0xf0, 0xac, 0xc0, - 0xcf, 0xf4, 0xb8, 0x6a, 0x0c, 0xba, 0xdd, 0x2f, 0x1b, 0x9e, 0x7e, 0x7a, 0xfa, 0x81, 0xd2, 0x4f, - 0xdf, 0xd6, 0xd3, 0x39, 0xa3, 0x1e, 0xf9, 0x8a, 0x29, 0x52, 0x9f, 0x49, 0x9c, 0x6f, 0xeb, 0x17, - 0xe0, 0x4c, 0x3e, 0x5d, 0x75, 0xcf, 0xa5, 0xe9, 0x66, 0x5e, 0x81, 0xa9, 0xe4, 0xd0, 0xa7, 0x4e, - 0x26, 0x39, 0xf4, 0xe9, 0x63, 0x4f, 0x0e, 0x7d, 0xe6, 0x04, 0x92, 0x43, 0x3f, 0x72, 0x82, 0xc9, - 0xa1, 0x6f, 0x33, 0xa3, 0x21, 0x1e, 0x9a, 0x48, 0xc4, 0x68, 0x7e, 0x3a, 0x27, 0xb2, 0x57, 0x3a, - 0x7e, 0x11, 0xff, 0x38, 0x05, 0xc2, 0x31, 0xa9, 0x8c, 0xa4, 0xd3, 0xb3, 0x0f, 0x21, 0xe9, 0xf4, - 0x7a, 0x9c, 0x74, 0xfa, 0x6c, 0xfe, 0x54, 0x67, 0xb8, 0x99, 0xe4, 0xa4, 0x9a, 0xbe, 0xad, 0xa7, - 0x88, 0x7e, 0xb4, 0x8b, 0x66, 0x28, 0x4b, 0xc0, 0xda, 0x25, 0x31, 0xf4, 0x6b, 0x3c, 0x31, 0xf4, - 0x63, 0xf9, 0x27, 0x79, 0xf2, 0xba, 0x33, 0xd2, 0x41, 0xd3, 0x7e, 0xa9, 0xd0, 0x9e, 0x2c, 0x1a, - 0x75, 0x4e, 0xbf, 0x54, 0x6c, 0xd0, 0x74, 0xbf, 0x14, 0x08, 0xc7, 0xa4, 0xec, 0x1f, 0x2a, 0xc0, - 0xf9, 0xee, 0xfb, 0x2d, 0x96, 0x1a, 0x57, 0x63, 0x45, 0x79, 0x42, 0x6a, 0xcc, 0xdf, 0x6c, 0x31, - 0x56, 0xdf, 0x91, 0x0a, 0xaf, 0xc2, 0xb4, 0xf2, 0x4f, 0xa1, 0xef, 0xec, 0xf5, 0xf8, 0xe5, 0xab, - 0x7c, 0xfa, 0x6b, 0x49, 0x04, 0x9c, 0xae, 0x83, 0x16, 0x60, 0xd2, 0x28, 0x5c, 0xad, 0x88, 0xb7, - 0x99, 0x12, 0x53, 0xd7, 0x4c, 0x30, 0x4e, 0xe2, 0xdb, 0x5f, 0xb6, 0xe0, 0x91, 0x9c, 0xac, 0x8a, - 0x7d, 0x07, 0xe2, 0xdb, 0x82, 0xc9, 0xb6, 0x59, 0xb5, 0x47, 0xec, 0x50, 0x23, 0x77, 0xa3, 0xea, - 0x6b, 0x02, 0x80, 0x93, 0x44, 0xed, 0x9f, 0x29, 0xc0, 0xb9, 0xae, 0x06, 0x97, 0x08, 0xc3, 0x99, - 0xed, 0x56, 0xe8, 0x2c, 0x05, 0xa4, 0x41, 0xbc, 0xc8, 0x75, 0x9a, 0xb5, 0x36, 0xa9, 0x6b, 0x72, - 0x7f, 0x66, 0xb9, 0x78, 0x75, 0xad, 0xb6, 0x90, 0xc6, 0xc0, 0x39, 0x35, 0xd1, 0x0a, 0xa0, 0x34, - 0x44, 0xcc, 0x30, 0x8b, 0x6b, 0x9e, 0xa6, 0x87, 0x33, 0x6a, 0xa0, 0x0f, 0xc3, 0xb8, 0x32, 0xe4, - 0xd4, 0x66, 0x9c, 0x1d, 0xec, 0x58, 0x07, 0x60, 0x13, 0x0f, 0x5d, 0xe1, 0x81, 0xf1, 0x45, 0x0a, - 0x05, 0xa1, 0x24, 0x98, 0x94, 0x51, 0xef, 0x45, 0x31, 0xd6, 0x71, 0x16, 0x5f, 0xfe, 0xf5, 0x3f, - 0x38, 0xff, 0xbe, 0xdf, 0xfa, 0x83, 0xf3, 0xef, 0xfb, 0xdd, 0x3f, 0x38, 0xff, 0xbe, 0xef, 0xb9, - 0x7f, 0xde, 0xfa, 0xf5, 0xfb, 0xe7, 0xad, 0xdf, 0xba, 0x7f, 0xde, 0xfa, 0xdd, 0xfb, 0xe7, 0xad, - 0xdf, 0xbf, 0x7f, 0xde, 0xfa, 0xe2, 0x1f, 0x9e, 0x7f, 0xdf, 0x27, 0x51, 0x1c, 0xda, 0xf2, 0x32, - 0x9d, 0x9d, 0xcb, 0x7b, 0x57, 0xfe, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x88, 0xa9, 0xf6, 0xda, - 0x29, 0x09, 0x01, 0x00, + 0xc3, 0xee, 0x1e, 0xec, 0x82, 0x57, 0xae, 0xeb, 0x2b, 0x3f, 0x65, 0xfb, 0xde, 0x52, 0xdd, 0xf2, + 0xbd, 0x49, 0xc9, 0x2e, 0x57, 0xca, 0x71, 0x62, 0x2b, 0x4a, 0x52, 0x71, 0xe4, 0xd8, 0x8e, 0xe5, + 0xc4, 0xce, 0xdb, 0xc9, 0x0f, 0xdb, 0x71, 0x55, 0x2c, 0x57, 0xb9, 0x82, 0xd8, 0xeb, 0x54, 0xb9, + 0x54, 0x95, 0xd8, 0x4e, 0x9c, 0x54, 0x25, 0x88, 0x13, 0xa7, 0xce, 0xb3, 0xcf, 0xe9, 0xc7, 0xcc, + 0x60, 0x89, 0x85, 0x28, 0x15, 0xff, 0xcd, 0x9c, 0xef, 0x3b, 0xdf, 0x39, 0x7d, 0x9e, 0xdf, 0xf9, + 0x9e, 0xf0, 0xea, 0xee, 0xcb, 0xe1, 0xbc, 0xeb, 0x5f, 0xde, 0xed, 0x6c, 0x92, 0xc0, 0x23, 0x11, + 0x09, 0x2f, 0xef, 0x11, 0xaf, 0xe1, 0x07, 0x97, 0x05, 0xc0, 0x69, 0xbb, 0x97, 0xeb, 0x7e, 0x40, + 0x2e, 0xef, 0x5d, 0xb9, 0xbc, 0x4d, 0x3c, 0x12, 0x38, 0x11, 0x69, 0xcc, 0xb7, 0x03, 0x3f, 0xf2, + 0x11, 0xe2, 0x38, 0xf3, 0x4e, 0xdb, 0x9d, 0xa7, 0x38, 0xf3, 0x7b, 0x57, 0xe6, 0x9e, 0xdb, 0x76, + 0xa3, 0x9d, 0xce, 0xe6, 0x7c, 0xdd, 0x6f, 0x5d, 0xde, 0xf6, 0xb7, 0xfd, 0xcb, 0x0c, 0x75, 0xb3, + 0xb3, 0xc5, 0xfe, 0xb1, 0x3f, 0xec, 0x17, 0x27, 0x31, 0xf7, 0x62, 0xdc, 0x4c, 0xcb, 0xa9, 0xef, + 0xb8, 0x1e, 0x09, 0xf6, 0x2f, 0xb7, 0x77, 0xb7, 0x59, 0xbb, 0x01, 0x09, 0xfd, 0x4e, 0x50, 0x27, + 0xc9, 0x86, 0xbb, 0xd6, 0x0a, 0x2f, 0xb7, 0x48, 0xe4, 0x64, 0x74, 0x77, 0xee, 0x72, 0x5e, 0xad, + 0xa0, 0xe3, 0x45, 0x6e, 0x2b, 0xdd, 0xcc, 0x87, 0x7a, 0x55, 0x08, 0xeb, 0x3b, 0xa4, 0xe5, 0xa4, + 0xea, 0xbd, 0x90, 0x57, 0xaf, 0x13, 0xb9, 0xcd, 0xcb, 0xae, 0x17, 0x85, 0x51, 0x90, 0xac, 0x64, + 0x7f, 0xdd, 0x82, 0x0b, 0x0b, 0x77, 0x6a, 0xcb, 0x4d, 0x27, 0x8c, 0xdc, 0xfa, 0x62, 0xd3, 0xaf, + 0xef, 0xd6, 0x22, 0x3f, 0x20, 0xb7, 0xfd, 0x66, 0xa7, 0x45, 0x6a, 0x6c, 0x20, 0xd0, 0xb3, 0x30, + 0xb2, 0xc7, 0xfe, 0xaf, 0x56, 0x66, 0xad, 0x0b, 0xd6, 0xa5, 0xd2, 0xe2, 0xd4, 0xaf, 0x1f, 0x94, + 0xdf, 0x77, 0xff, 0xa0, 0x3c, 0x72, 0x5b, 0x94, 0x63, 0x85, 0x81, 0x2e, 0xc2, 0xd0, 0x56, 0xb8, + 0xb1, 0xdf, 0x26, 0xb3, 0x05, 0x86, 0x3b, 0x21, 0x70, 0x87, 0x56, 0x6a, 0xb4, 0x14, 0x0b, 0x28, + 0xba, 0x0c, 0xa5, 0xb6, 0x13, 0x44, 0x6e, 0xe4, 0xfa, 0xde, 0x6c, 0xf1, 0x82, 0x75, 0x69, 0x70, + 0x71, 0x5a, 0xa0, 0x96, 0xaa, 0x12, 0x80, 0x63, 0x1c, 0xda, 0x8d, 0x80, 0x38, 0x8d, 0x9b, 0x5e, + 0x73, 0x7f, 0x76, 0xe0, 0x82, 0x75, 0x69, 0x24, 0xee, 0x06, 0x16, 0xe5, 0x58, 0x61, 0xd8, 0x5f, + 0x2a, 0xc0, 0xc8, 0xc2, 0xd6, 0x96, 0xeb, 0xb9, 0xd1, 0x3e, 0xba, 0x0d, 0x63, 0x9e, 0xdf, 0x20, + 0xf2, 0x3f, 0xfb, 0x8a, 0xd1, 0xe7, 0x2f, 0xcc, 0xa7, 0x97, 0xd2, 0xfc, 0xba, 0x86, 0xb7, 0x38, + 0x75, 0xff, 0xa0, 0x3c, 0xa6, 0x97, 0x60, 0x83, 0x0e, 0xc2, 0x30, 0xda, 0xf6, 0x1b, 0x8a, 0x6c, + 0x81, 0x91, 0x2d, 0x67, 0x91, 0xad, 0xc6, 0x68, 0x8b, 0x93, 0xf7, 0x0f, 0xca, 0xa3, 0x5a, 0x01, + 0xd6, 0x89, 0xa0, 0x4d, 0x98, 0xa4, 0x7f, 0xbd, 0xc8, 0x55, 0x74, 0x8b, 0x8c, 0xee, 0x13, 0x79, + 0x74, 0x35, 0xd4, 0xc5, 0x99, 0xfb, 0x07, 0xe5, 0xc9, 0x44, 0x21, 0x4e, 0x12, 0xb4, 0xdf, 0x86, + 0x89, 0x85, 0x28, 0x72, 0xea, 0x3b, 0xa4, 0xc1, 0x67, 0x10, 0xbd, 0x08, 0x03, 0x9e, 0xd3, 0x22, + 0x62, 0x7e, 0x2f, 0x88, 0x81, 0x1d, 0x58, 0x77, 0x5a, 0xe4, 0xf0, 0xa0, 0x3c, 0x75, 0xcb, 0x73, + 0xdf, 0xea, 0x88, 0x55, 0x41, 0xcb, 0x30, 0xc3, 0x46, 0xcf, 0x03, 0x34, 0xc8, 0x9e, 0x5b, 0x27, + 0x55, 0x27, 0xda, 0x11, 0xf3, 0x8d, 0x44, 0x5d, 0xa8, 0x28, 0x08, 0xd6, 0xb0, 0xec, 0x7b, 0x50, + 0x5a, 0xd8, 0xf3, 0xdd, 0x46, 0xd5, 0x6f, 0x84, 0x68, 0x17, 0x26, 0xdb, 0x01, 0xd9, 0x22, 0x81, + 0x2a, 0x9a, 0xb5, 0x2e, 0x14, 0x2f, 0x8d, 0x3e, 0x7f, 0x29, 0xf3, 0x63, 0x4d, 0xd4, 0x65, 0x2f, + 0x0a, 0xf6, 0x17, 0x1f, 0x11, 0xed, 0x4d, 0x26, 0xa0, 0x38, 0x49, 0xd9, 0xfe, 0xa7, 0x05, 0x38, + 0xbd, 0xf0, 0x76, 0x27, 0x20, 0x15, 0x37, 0xdc, 0x4d, 0xae, 0xf0, 0x86, 0x1b, 0xee, 0xae, 0xc7, + 0x23, 0xa0, 0x96, 0x56, 0x45, 0x94, 0x63, 0x85, 0x81, 0x9e, 0x83, 0x61, 0xfa, 0xfb, 0x16, 0x5e, + 0x15, 0x9f, 0x3c, 0x23, 0x90, 0x47, 0x2b, 0x4e, 0xe4, 0x54, 0x38, 0x08, 0x4b, 0x1c, 0xb4, 0x06, + 0xa3, 0x75, 0xb6, 0x21, 0xb7, 0xd7, 0xfc, 0x06, 0x61, 0x93, 0x59, 0x5a, 0x7c, 0x86, 0xa2, 0x2f, + 0xc5, 0xc5, 0x87, 0x07, 0xe5, 0x59, 0xde, 0x37, 0x41, 0x42, 0x83, 0x61, 0xbd, 0x3e, 0xb2, 0xd5, + 0xfe, 0x1a, 0x60, 0x94, 0x20, 0x63, 0x6f, 0x5d, 0xd2, 0xb6, 0xca, 0x20, 0xdb, 0x2a, 0x63, 0xd9, + 0xdb, 0x04, 0x5d, 0x81, 0x81, 0x5d, 0xd7, 0x6b, 0xcc, 0x0e, 0x31, 0x5a, 0xe7, 0xe8, 0x9c, 0x5f, + 0x77, 0xbd, 0xc6, 0xe1, 0x41, 0x79, 0xda, 0xe8, 0x0e, 0x2d, 0xc4, 0x0c, 0xd5, 0xfe, 0x33, 0x0b, + 0xca, 0x0c, 0xb6, 0xe2, 0x36, 0x49, 0x95, 0x04, 0xa1, 0x1b, 0x46, 0xc4, 0x8b, 0x8c, 0x01, 0x7d, + 0x1e, 0x20, 0x24, 0xf5, 0x80, 0x44, 0xda, 0x90, 0xaa, 0x85, 0x51, 0x53, 0x10, 0xac, 0x61, 0xd1, + 0x03, 0x21, 0xdc, 0x71, 0x02, 0xb6, 0xbe, 0xc4, 0xc0, 0xaa, 0x03, 0xa1, 0x26, 0x01, 0x38, 0xc6, + 0x31, 0x0e, 0x84, 0x62, 0xaf, 0x03, 0x01, 0x7d, 0x14, 0x26, 0xe3, 0xc6, 0xc2, 0xb6, 0x53, 0x97, + 0x03, 0xc8, 0xb6, 0x4c, 0xcd, 0x04, 0xe1, 0x24, 0xae, 0xfd, 0x37, 0x2c, 0xb1, 0x78, 0xe8, 0x57, + 0xbf, 0xcb, 0xbf, 0xd5, 0xfe, 0x25, 0x0b, 0x86, 0x17, 0x5d, 0xaf, 0xe1, 0x7a, 0xdb, 0xe8, 0x33, + 0x30, 0x42, 0xef, 0xa6, 0x86, 0x13, 0x39, 0xe2, 0xdc, 0xfb, 0xa0, 0xb6, 0xb7, 0xd4, 0x55, 0x31, + 0xdf, 0xde, 0xdd, 0xa6, 0x05, 0xe1, 0x3c, 0xc5, 0xa6, 0xbb, 0xed, 0xe6, 0xe6, 0x67, 0x49, 0x3d, + 0x5a, 0x23, 0x91, 0x13, 0x7f, 0x4e, 0x5c, 0x86, 0x15, 0x55, 0x74, 0x1d, 0x86, 0x22, 0x27, 0xd8, + 0x26, 0x91, 0x38, 0x00, 0x33, 0x0f, 0x2a, 0x5e, 0x13, 0xd3, 0x1d, 0x49, 0xbc, 0x3a, 0x89, 0xaf, + 0x85, 0x0d, 0x56, 0x15, 0x0b, 0x12, 0xf6, 0xff, 0x1c, 0x86, 0xb3, 0x4b, 0xb5, 0xd5, 0x9c, 0x75, + 0x75, 0x11, 0x86, 0x1a, 0x81, 0xbb, 0x47, 0x02, 0x31, 0xce, 0x8a, 0x4a, 0x85, 0x95, 0x62, 0x01, + 0x45, 0x2f, 0xc3, 0x18, 0xbf, 0x90, 0xae, 0x39, 0x5e, 0xa3, 0x29, 0x87, 0xf8, 0x94, 0xc0, 0x1e, + 0xbb, 0xad, 0xc1, 0xb0, 0x81, 0x79, 0xc4, 0x45, 0x75, 0x31, 0xb1, 0x19, 0xf3, 0x2e, 0xbb, 0x2f, + 0x58, 0x30, 0xc5, 0x9b, 0x59, 0x88, 0xa2, 0xc0, 0xdd, 0xec, 0x44, 0x24, 0x9c, 0x1d, 0x64, 0x27, + 0xdd, 0x52, 0xd6, 0x68, 0xe5, 0x8e, 0xc0, 0xfc, 0xed, 0x04, 0x15, 0x7e, 0x08, 0xce, 0x8a, 0x76, + 0xa7, 0x92, 0x60, 0x9c, 0x6a, 0x16, 0x7d, 0xaf, 0x05, 0x73, 0x75, 0xdf, 0x8b, 0x02, 0xbf, 0xd9, + 0x24, 0x41, 0xb5, 0xb3, 0xd9, 0x74, 0xc3, 0x1d, 0xbe, 0x4e, 0x31, 0xd9, 0x62, 0x27, 0x41, 0xce, + 0x1c, 0x2a, 0x24, 0x31, 0x87, 0xe7, 0xef, 0x1f, 0x94, 0xe7, 0x96, 0x72, 0x49, 0xe1, 0x2e, 0xcd, + 0xa0, 0x5d, 0x40, 0xf4, 0x2a, 0xad, 0x45, 0xce, 0x36, 0x89, 0x1b, 0x1f, 0xee, 0xbf, 0xf1, 0x33, + 0xf7, 0x0f, 0xca, 0x68, 0x3d, 0x45, 0x02, 0x67, 0x90, 0x45, 0x6f, 0xc1, 0x29, 0x5a, 0x9a, 0xfa, + 0xd6, 0x91, 0xfe, 0x9b, 0x9b, 0xbd, 0x7f, 0x50, 0x3e, 0xb5, 0x9e, 0x41, 0x04, 0x67, 0x92, 0x46, + 0xdf, 0x63, 0xc1, 0xd9, 0xf8, 0xf3, 0x97, 0xef, 0xb5, 0x1d, 0xaf, 0x11, 0x37, 0x5c, 0xea, 0xbf, + 0x61, 0x7a, 0x26, 0x9f, 0x5d, 0xca, 0xa3, 0x84, 0xf3, 0x1b, 0x41, 0x1e, 0xcc, 0xd0, 0xae, 0x25, + 0xdb, 0x86, 0xfe, 0xdb, 0x7e, 0xe4, 0xfe, 0x41, 0x79, 0x66, 0x3d, 0x4d, 0x03, 0x67, 0x11, 0x9e, + 0x5b, 0x82, 0xd3, 0x99, 0xab, 0x13, 0x4d, 0x41, 0x71, 0x97, 0x70, 0xae, 0xab, 0x84, 0xe9, 0x4f, + 0x74, 0x0a, 0x06, 0xf7, 0x9c, 0x66, 0x47, 0x6c, 0x4c, 0xcc, 0xff, 0xbc, 0x52, 0x78, 0xd9, 0xb2, + 0xff, 0x59, 0x11, 0x26, 0x97, 0x6a, 0xab, 0x0f, 0xb4, 0xeb, 0xf5, 0x6b, 0xaf, 0xd0, 0xf5, 0xda, + 0x8b, 0x2f, 0xd1, 0x62, 0xee, 0x25, 0xfa, 0x7f, 0x66, 0x6c, 0xd9, 0x01, 0xb6, 0x65, 0xbf, 0x23, + 0x67, 0xcb, 0x1e, 0xf3, 0x46, 0xdd, 0xcb, 0x59, 0xb5, 0x83, 0x6c, 0x02, 0x33, 0x39, 0xa4, 0x1b, + 0x7e, 0xdd, 0x69, 0x26, 0x8f, 0xda, 0x23, 0x2e, 0xdd, 0xe3, 0x99, 0xc7, 0x3a, 0x8c, 0x2d, 0x39, + 0x6d, 0x67, 0xd3, 0x6d, 0xba, 0x91, 0x4b, 0x42, 0xf4, 0x14, 0x14, 0x9d, 0x46, 0x83, 0x71, 0x77, + 0xa5, 0xc5, 0xd3, 0xf7, 0x0f, 0xca, 0xc5, 0x85, 0x06, 0x65, 0x33, 0x40, 0x61, 0xed, 0x63, 0x8a, + 0x81, 0x3e, 0x00, 0x03, 0x8d, 0xc0, 0x6f, 0xcf, 0x16, 0x18, 0x26, 0xdd, 0xe5, 0x03, 0x95, 0xc0, + 0x6f, 0x27, 0x50, 0x19, 0x8e, 0xfd, 0x6b, 0x05, 0x78, 0x6c, 0x89, 0xb4, 0x77, 0x56, 0x6a, 0x39, + 0xf7, 0xc5, 0x25, 0x18, 0x69, 0xf9, 0x9e, 0x1b, 0xf9, 0x41, 0x28, 0x9a, 0x66, 0x2b, 0x62, 0x4d, + 0x94, 0x61, 0x05, 0x45, 0x17, 0x60, 0xa0, 0x1d, 0x33, 0xb1, 0x63, 0x92, 0x01, 0x66, 0xec, 0x2b, + 0x83, 0x50, 0x8c, 0x4e, 0x48, 0x02, 0xb1, 0x62, 0x14, 0xc6, 0xad, 0x90, 0x04, 0x98, 0x41, 0x62, + 0x4e, 0x80, 0xf2, 0x08, 0xe2, 0x46, 0x48, 0x70, 0x02, 0x14, 0x82, 0x35, 0x2c, 0x54, 0x85, 0x52, + 0x98, 0x98, 0xd9, 0xbe, 0xb6, 0xe6, 0x38, 0x63, 0x15, 0xd4, 0x4c, 0xc6, 0x44, 0x8c, 0x1b, 0x6c, + 0xa8, 0x27, 0xab, 0xf0, 0xb5, 0x02, 0x20, 0x3e, 0x84, 0xdf, 0x62, 0x03, 0x77, 0x2b, 0x3d, 0x70, + 0xfd, 0x6f, 0x89, 0xe3, 0x1a, 0xbd, 0xff, 0x62, 0xc1, 0x63, 0x4b, 0xae, 0xd7, 0x20, 0x41, 0xce, + 0x02, 0x7c, 0x38, 0x6f, 0xe7, 0xa3, 0x31, 0x29, 0xc6, 0x12, 0x1b, 0x38, 0x86, 0x25, 0x66, 0xff, + 0x89, 0x05, 0x88, 0x7f, 0xf6, 0xbb, 0xee, 0x63, 0x6f, 0xa5, 0x3f, 0xf6, 0x18, 0x96, 0x85, 0x7d, + 0x03, 0x26, 0x96, 0x9a, 0x2e, 0xf1, 0xa2, 0xd5, 0xea, 0x92, 0xef, 0x6d, 0xb9, 0xdb, 0xe8, 0x15, + 0x98, 0x88, 0xdc, 0x16, 0xf1, 0x3b, 0x51, 0x8d, 0xd4, 0x7d, 0x8f, 0xbd, 0x5c, 0xad, 0x4b, 0x83, + 0x8b, 0xe8, 0xfe, 0x41, 0x79, 0x62, 0xc3, 0x80, 0xe0, 0x04, 0xa6, 0xfd, 0x7b, 0x74, 0xfc, 0xfc, + 0x56, 0xdb, 0xf7, 0x88, 0x17, 0x2d, 0xf9, 0x5e, 0x83, 0x4b, 0x38, 0x5e, 0x81, 0x81, 0x88, 0x8e, + 0x07, 0x1f, 0xbb, 0x8b, 0x72, 0xa3, 0xd0, 0x51, 0x38, 0x3c, 0x28, 0x9f, 0x49, 0xd7, 0x60, 0xe3, + 0xc4, 0xea, 0xa0, 0xef, 0x80, 0xa1, 0x30, 0x72, 0xa2, 0x4e, 0x28, 0x46, 0xf3, 0x71, 0x39, 0x9a, + 0x35, 0x56, 0x7a, 0x78, 0x50, 0x9e, 0x54, 0xd5, 0x78, 0x11, 0x16, 0x15, 0xd0, 0xd3, 0x30, 0xdc, + 0x22, 0x61, 0xe8, 0x6c, 0xcb, 0xdb, 0x70, 0x52, 0xd4, 0x1d, 0x5e, 0xe3, 0xc5, 0x58, 0xc2, 0xd1, + 0x13, 0x30, 0x48, 0x82, 0xc0, 0x0f, 0xc4, 0x1e, 0x1d, 0x17, 0x88, 0x83, 0xcb, 0xb4, 0x10, 0x73, + 0x98, 0xfd, 0x9b, 0x16, 0x4c, 0xaa, 0xbe, 0xf2, 0xb6, 0x4e, 0xe0, 0x15, 0xf2, 0x49, 0x80, 0xba, + 0xfc, 0xc0, 0x90, 0xdd, 0x1e, 0xa3, 0xcf, 0x5f, 0xcc, 0xbc, 0xa8, 0x53, 0xc3, 0x18, 0x53, 0x56, + 0x45, 0x21, 0xd6, 0xa8, 0xd9, 0xff, 0xc0, 0x82, 0x99, 0xc4, 0x17, 0xdd, 0x70, 0xc3, 0x08, 0xbd, + 0x99, 0xfa, 0xaa, 0xf9, 0xfe, 0xbe, 0x8a, 0xd6, 0x66, 0xdf, 0xa4, 0x96, 0xb2, 0x2c, 0xd1, 0xbe, + 0xe8, 0x1a, 0x0c, 0xba, 0x11, 0x69, 0xc9, 0x8f, 0x79, 0xa2, 0xeb, 0xc7, 0xf0, 0x5e, 0xc5, 0x33, + 0xb2, 0x4a, 0x6b, 0x62, 0x4e, 0xc0, 0xfe, 0xb5, 0x22, 0x94, 0xf8, 0xb2, 0x5d, 0x73, 0xda, 0x27, + 0x30, 0x17, 0xcf, 0x40, 0xc9, 0x6d, 0xb5, 0x3a, 0x91, 0xb3, 0x29, 0x8e, 0xf3, 0x11, 0xbe, 0xb5, + 0x56, 0x65, 0x21, 0x8e, 0xe1, 0x68, 0x15, 0x06, 0x58, 0x57, 0xf8, 0x57, 0x3e, 0x95, 0xfd, 0x95, + 0xa2, 0xef, 0xf3, 0x15, 0x27, 0x72, 0x38, 0x27, 0xa5, 0xee, 0x11, 0x5a, 0x84, 0x19, 0x09, 0xe4, + 0x00, 0x6c, 0xba, 0x9e, 0x13, 0xec, 0xd3, 0xb2, 0xd9, 0x22, 0x23, 0xf8, 0x5c, 0x77, 0x82, 0x8b, + 0x0a, 0x9f, 0x93, 0x55, 0x1f, 0x16, 0x03, 0xb0, 0x46, 0x74, 0xee, 0xc3, 0x50, 0x52, 0xc8, 0x47, + 0x61, 0x88, 0xe6, 0x3e, 0x0a, 0x93, 0x89, 0xb6, 0x7a, 0x55, 0x1f, 0xd3, 0xf9, 0xa9, 0x5f, 0x66, + 0x47, 0x86, 0xe8, 0xf5, 0xb2, 0xb7, 0x27, 0x8e, 0xdc, 0xb7, 0xe1, 0x54, 0x33, 0xe3, 0x24, 0x13, + 0xf3, 0xda, 0xff, 0xc9, 0xf7, 0x98, 0xf8, 0xec, 0x53, 0x59, 0x50, 0x9c, 0xd9, 0x06, 0xe5, 0x11, + 0xfc, 0x36, 0xdd, 0x20, 0x4e, 0x53, 0x67, 0xb7, 0x6f, 0x8a, 0x32, 0xac, 0xa0, 0xf4, 0xbc, 0x3b, + 0xa5, 0x3a, 0x7f, 0x9d, 0xec, 0xd7, 0x48, 0x93, 0xd4, 0x23, 0x3f, 0xf8, 0xa6, 0x76, 0xff, 0x1c, + 0x1f, 0x7d, 0x7e, 0x5c, 0x8e, 0x0a, 0x02, 0xc5, 0xeb, 0x64, 0x9f, 0x4f, 0x85, 0xfe, 0x75, 0xc5, + 0xae, 0x5f, 0xf7, 0x73, 0x16, 0x8c, 0xab, 0xaf, 0x3b, 0x81, 0x73, 0x61, 0xd1, 0x3c, 0x17, 0xce, + 0x75, 0x5d, 0xe0, 0x39, 0x27, 0xc2, 0xd7, 0x0a, 0x70, 0x56, 0xe1, 0xd0, 0xb7, 0x01, 0xff, 0x23, + 0x56, 0xd5, 0x65, 0x28, 0x79, 0x4a, 0x4a, 0x66, 0x99, 0xe2, 0xa9, 0x58, 0x46, 0x16, 0xe3, 0x50, + 0x16, 0xcf, 0x8b, 0x45, 0x59, 0x63, 0xba, 0xf8, 0x58, 0x88, 0x8a, 0x17, 0xa1, 0xd8, 0x71, 0x1b, + 0xe2, 0x82, 0xf9, 0xa0, 0x1c, 0xed, 0x5b, 0xab, 0x95, 0xc3, 0x83, 0xf2, 0xe3, 0x79, 0xaa, 0x0b, + 0x7a, 0xb3, 0x85, 0xf3, 0xb7, 0x56, 0x2b, 0x98, 0x56, 0x46, 0x0b, 0x30, 0x29, 0xb5, 0x33, 0xb7, + 0x29, 0xbb, 0xe5, 0x7b, 0xe2, 0x1e, 0x52, 0x32, 0x60, 0x6c, 0x82, 0x71, 0x12, 0x1f, 0x55, 0x60, + 0x6a, 0xb7, 0xb3, 0x49, 0x9a, 0x24, 0xe2, 0x1f, 0x7c, 0x9d, 0x70, 0x09, 0x69, 0x29, 0x7e, 0x99, + 0x5d, 0x4f, 0xc0, 0x71, 0xaa, 0x86, 0xfd, 0x17, 0xec, 0x3e, 0x10, 0xa3, 0x57, 0x0d, 0x7c, 0xba, + 0xb0, 0x28, 0xf5, 0x6f, 0xe6, 0x72, 0xee, 0x67, 0x55, 0x5c, 0x27, 0xfb, 0x1b, 0x3e, 0xe5, 0xcc, + 0xb3, 0x57, 0x85, 0xb1, 0xe6, 0x07, 0xba, 0xae, 0xf9, 0x9f, 0x2f, 0xc0, 0x69, 0x35, 0x02, 0x06, + 0x13, 0xf8, 0xad, 0x3e, 0x06, 0x57, 0x60, 0xb4, 0x41, 0xb6, 0x9c, 0x4e, 0x33, 0x52, 0xe2, 0xfa, + 0x41, 0xae, 0xb2, 0xa9, 0xc4, 0xc5, 0x58, 0xc7, 0x39, 0xc2, 0xb0, 0xfd, 0xd7, 0x51, 0x76, 0x11, + 0x47, 0x0e, 0x5d, 0xe3, 0x6a, 0xd7, 0x58, 0xb9, 0xbb, 0xe6, 0x09, 0x18, 0x74, 0x5b, 0x94, 0x31, + 0x2b, 0x98, 0xfc, 0xd6, 0x2a, 0x2d, 0xc4, 0x1c, 0x86, 0xde, 0x0f, 0xc3, 0x75, 0xbf, 0xd5, 0x72, + 0xbc, 0x06, 0xbb, 0xf2, 0x4a, 0x8b, 0xa3, 0x94, 0x77, 0x5b, 0xe2, 0x45, 0x58, 0xc2, 0xd0, 0x63, + 0x30, 0xe0, 0x04, 0xdb, 0x5c, 0x86, 0x51, 0x5a, 0x1c, 0xa1, 0x2d, 0x2d, 0x04, 0xdb, 0x21, 0x66, + 0xa5, 0xf4, 0x09, 0x76, 0xd7, 0x0f, 0x76, 0x5d, 0x6f, 0xbb, 0xe2, 0x06, 0x62, 0x4b, 0xa8, 0xbb, + 0xf0, 0x8e, 0x82, 0x60, 0x0d, 0x0b, 0xad, 0xc0, 0x60, 0xdb, 0x0f, 0xa2, 0x70, 0x76, 0x88, 0x0d, + 0xf7, 0xe3, 0x39, 0x07, 0x11, 0xff, 0xda, 0xaa, 0x1f, 0x44, 0xf1, 0x07, 0xd0, 0x7f, 0x21, 0xe6, + 0xd5, 0xd1, 0x0d, 0x18, 0x26, 0xde, 0xde, 0x4a, 0xe0, 0xb7, 0x66, 0x67, 0xf2, 0x29, 0x2d, 0x73, + 0x14, 0xbe, 0xcc, 0x62, 0x1e, 0x55, 0x14, 0x63, 0x49, 0x02, 0x7d, 0x07, 0x14, 0x89, 0xb7, 0x37, + 0x3b, 0xcc, 0x28, 0xcd, 0xe5, 0x50, 0xba, 0xed, 0x04, 0xf1, 0x99, 0xbf, 0xec, 0xed, 0x61, 0x5a, + 0x07, 0x7d, 0x02, 0x4a, 0xf2, 0xc0, 0x08, 0x85, 0x70, 0x30, 0x73, 0xc1, 0xca, 0x63, 0x06, 0x93, + 0xb7, 0x3a, 0x6e, 0x40, 0x5a, 0xc4, 0x8b, 0xc2, 0xf8, 0x84, 0x94, 0xd0, 0x10, 0xc7, 0xd4, 0xd0, + 0x27, 0xa4, 0x44, 0x7a, 0xcd, 0xef, 0x78, 0x51, 0x38, 0x5b, 0x62, 0xdd, 0xcb, 0xd4, 0x15, 0xde, + 0x8e, 0xf1, 0x92, 0x22, 0x6b, 0x5e, 0x19, 0x1b, 0xa4, 0xd0, 0xa7, 0x60, 0x9c, 0xff, 0xe7, 0x1a, + 0xb7, 0x70, 0xf6, 0x34, 0xa3, 0x7d, 0x21, 0x9f, 0x36, 0x47, 0x5c, 0x3c, 0x2d, 0x88, 0x8f, 0xeb, + 0xa5, 0x21, 0x36, 0xa9, 0x21, 0x0c, 0xe3, 0x4d, 0x77, 0x8f, 0x78, 0x24, 0x0c, 0xab, 0x81, 0xbf, + 0x49, 0x84, 0x00, 0xf1, 0x6c, 0xb6, 0x86, 0xce, 0xdf, 0x24, 0x8b, 0xd3, 0x94, 0xe6, 0x0d, 0xbd, + 0x0e, 0x36, 0x49, 0xa0, 0x5b, 0x30, 0x41, 0x5f, 0x6c, 0x6e, 0x4c, 0x74, 0xb4, 0x17, 0x51, 0xf6, + 0xae, 0xc2, 0x46, 0x25, 0x9c, 0x20, 0x82, 0x6e, 0xc2, 0x58, 0x18, 0x39, 0x41, 0xd4, 0x69, 0x73, + 0xa2, 0x67, 0x7a, 0x11, 0x65, 0x0a, 0xde, 0x9a, 0x56, 0x05, 0x1b, 0x04, 0xd0, 0xeb, 0x50, 0x6a, + 0xba, 0x5b, 0xa4, 0xbe, 0x5f, 0x6f, 0x92, 0xd9, 0x31, 0x46, 0x2d, 0xf3, 0x50, 0xb9, 0x21, 0x91, + 0x38, 0x9f, 0xab, 0xfe, 0xe2, 0xb8, 0x3a, 0xba, 0x0d, 0x67, 0x22, 0x12, 0xb4, 0x5c, 0xcf, 0xa1, + 0x87, 0x81, 0x78, 0x5a, 0x31, 0xc5, 0xe9, 0x38, 0xdb, 0x6d, 0xe7, 0xc5, 0x6c, 0x9c, 0xd9, 0xc8, + 0xc4, 0xc2, 0x39, 0xb5, 0xd1, 0x3d, 0x98, 0xcd, 0x80, 0xf8, 0x4d, 0xb7, 0xbe, 0x3f, 0x7b, 0x8a, + 0x51, 0xfe, 0x88, 0xa0, 0x3c, 0xbb, 0x91, 0x83, 0x77, 0xd8, 0x05, 0x86, 0x73, 0xa9, 0xa3, 0x9b, + 0x30, 0xc9, 0x4e, 0xa0, 0x6a, 0xa7, 0xd9, 0x14, 0x0d, 0x4e, 0xb0, 0x06, 0xdf, 0x2f, 0xef, 0xe3, + 0x55, 0x13, 0x7c, 0x78, 0x50, 0x86, 0xf8, 0x1f, 0x4e, 0xd6, 0x46, 0x9b, 0x4c, 0x47, 0xd7, 0x09, + 0xdc, 0x68, 0x9f, 0x9e, 0x1b, 0xe4, 0x5e, 0x34, 0x3b, 0xd9, 0x55, 0x5e, 0xa1, 0xa3, 0x2a, 0x45, + 0x9e, 0x5e, 0x88, 0x93, 0x04, 0xe9, 0x91, 0x1a, 0x46, 0x0d, 0xd7, 0x9b, 0x9d, 0xe2, 0xef, 0x12, + 0x79, 0x22, 0xd5, 0x68, 0x21, 0xe6, 0x30, 0xa6, 0x9f, 0xa3, 0x3f, 0x6e, 0xd2, 0x9b, 0x6b, 0x9a, + 0x21, 0xc6, 0xfa, 0x39, 0x09, 0xc0, 0x31, 0x0e, 0x65, 0x26, 0xa3, 0x68, 0x7f, 0x16, 0x31, 0x54, + 0x75, 0xb0, 0x6c, 0x6c, 0x7c, 0x02, 0xd3, 0x72, 0x7b, 0x13, 0x26, 0xd4, 0x41, 0xc8, 0xc6, 0x04, + 0x95, 0x61, 0x90, 0xb1, 0x4f, 0x42, 0xba, 0x56, 0xa2, 0x5d, 0x60, 0xac, 0x15, 0xe6, 0xe5, 0xac, + 0x0b, 0xee, 0xdb, 0x64, 0x71, 0x3f, 0x22, 0xfc, 0x4d, 0x5f, 0xd4, 0xba, 0x20, 0x01, 0x38, 0xc6, + 0xb1, 0xff, 0x17, 0x67, 0x43, 0xe3, 0xd3, 0xb6, 0x8f, 0xfb, 0xe5, 0x59, 0x18, 0xd9, 0xf1, 0xc3, + 0x88, 0x62, 0xb3, 0x36, 0x06, 0x63, 0xc6, 0xf3, 0x9a, 0x28, 0xc7, 0x0a, 0x03, 0xbd, 0x0a, 0xe3, + 0x75, 0xbd, 0x01, 0x71, 0x39, 0xaa, 0x63, 0xc4, 0x68, 0x1d, 0x9b, 0xb8, 0xe8, 0x65, 0x18, 0x61, + 0x36, 0x27, 0x75, 0xbf, 0x29, 0xb8, 0x36, 0x79, 0xc3, 0x8f, 0x54, 0x45, 0xf9, 0xa1, 0xf6, 0x1b, + 0x2b, 0x6c, 0x74, 0x11, 0x86, 0x68, 0x17, 0x56, 0xab, 0xe2, 0x5a, 0x52, 0x82, 0xa2, 0x6b, 0xac, + 0x14, 0x0b, 0xa8, 0xfd, 0xff, 0x16, 0xb4, 0x51, 0xa6, 0xef, 0x61, 0x82, 0xaa, 0x30, 0x7c, 0xd7, + 0x71, 0x23, 0xd7, 0xdb, 0x16, 0xfc, 0xc7, 0xd3, 0x5d, 0xef, 0x28, 0x56, 0xe9, 0x0e, 0xaf, 0xc0, + 0x6f, 0x51, 0xf1, 0x07, 0x4b, 0x32, 0x94, 0x62, 0xd0, 0xf1, 0x3c, 0x4a, 0xb1, 0xd0, 0x2f, 0x45, + 0xcc, 0x2b, 0x70, 0x8a, 0xe2, 0x0f, 0x96, 0x64, 0xd0, 0x9b, 0x00, 0x72, 0x87, 0x91, 0x86, 0xb0, + 0xf5, 0x78, 0xb6, 0x37, 0xd1, 0x0d, 0x55, 0x67, 0x71, 0x82, 0xde, 0xd1, 0xf1, 0x7f, 0xac, 0xd1, + 0xb3, 0x23, 0xc6, 0xa7, 0xa5, 0x3b, 0x83, 0xbe, 0x8b, 0x2e, 0x71, 0x27, 0x88, 0x48, 0x63, 0x21, + 0x12, 0x83, 0xf3, 0x81, 0xfe, 0x1e, 0x29, 0x1b, 0x6e, 0x8b, 0xe8, 0xdb, 0x41, 0x10, 0xc1, 0x31, + 0x3d, 0xfb, 0x17, 0x8b, 0x30, 0x9b, 0xd7, 0x5d, 0xba, 0xe8, 0xc8, 0x3d, 0x37, 0x5a, 0xa2, 0xec, + 0x95, 0x65, 0x2e, 0xba, 0x65, 0x51, 0x8e, 0x15, 0x06, 0x9d, 0xfd, 0xd0, 0xdd, 0x96, 0x6f, 0xcc, + 0xc1, 0x78, 0xf6, 0x6b, 0xac, 0x14, 0x0b, 0x28, 0xc5, 0x0b, 0x88, 0x13, 0x0a, 0x63, 0x22, 0x6d, + 0x95, 0x60, 0x56, 0x8a, 0x05, 0x54, 0x97, 0x76, 0x0d, 0xf4, 0x90, 0x76, 0x19, 0x43, 0x34, 0x78, + 0xbc, 0x43, 0x84, 0x3e, 0x0d, 0xb0, 0xe5, 0x7a, 0x6e, 0xb8, 0xc3, 0xa8, 0x0f, 0x1d, 0x99, 0xba, + 0x62, 0xce, 0x56, 0x14, 0x15, 0xac, 0x51, 0x44, 0x2f, 0xc1, 0xa8, 0xda, 0x80, 0xab, 0x15, 0xa6, + 0x59, 0xd5, 0x2c, 0x55, 0xe2, 0xd3, 0xa8, 0x82, 0x75, 0x3c, 0xfb, 0xb3, 0xc9, 0xf5, 0x22, 0x76, + 0x80, 0x36, 0xbe, 0x56, 0xbf, 0xe3, 0x5b, 0xe8, 0x3e, 0xbe, 0xf6, 0x37, 0x8a, 0x30, 0x69, 0x34, + 0xd6, 0x09, 0xfb, 0x38, 0xb3, 0xae, 0xd2, 0x03, 0xdc, 0x89, 0x88, 0xd8, 0x7f, 0x76, 0xef, 0xad, + 0xa2, 0x1f, 0xf2, 0x74, 0x07, 0xf0, 0xfa, 0xe8, 0xd3, 0x50, 0x6a, 0x3a, 0x21, 0x93, 0x9c, 0x11, + 0xb1, 0xef, 0xfa, 0x21, 0x16, 0x3f, 0x4c, 0x9c, 0x30, 0xd2, 0x6e, 0x4d, 0x4e, 0x3b, 0x26, 0x49, + 0x6f, 0x1a, 0xca, 0x9f, 0x48, 0x6b, 0x35, 0xd5, 0x09, 0xca, 0xc4, 0xec, 0x63, 0x0e, 0x43, 0x2f, + 0xc3, 0x58, 0x40, 0xd8, 0xaa, 0x58, 0xa2, 0xdc, 0x1c, 0x5b, 0x66, 0x83, 0x31, 0xdb, 0x87, 0x35, + 0x18, 0x36, 0x30, 0xe3, 0xb7, 0xc1, 0x50, 0x97, 0xb7, 0xc1, 0xd3, 0x30, 0xcc, 0x7e, 0xa8, 0x15, + 0xa0, 0x66, 0x63, 0x95, 0x17, 0x63, 0x09, 0x4f, 0x2e, 0x98, 0x91, 0xfe, 0x16, 0x0c, 0x7d, 0x7d, + 0x88, 0x45, 0xcd, 0xb4, 0xda, 0x23, 0xfc, 0x94, 0x13, 0x4b, 0x1e, 0x4b, 0x98, 0xfd, 0x01, 0x98, + 0xa8, 0x38, 0xa4, 0xe5, 0x7b, 0xcb, 0x5e, 0xa3, 0xed, 0xbb, 0x5e, 0x84, 0x66, 0x61, 0x80, 0x5d, + 0x22, 0xfc, 0x08, 0x18, 0xa0, 0x0d, 0x61, 0x56, 0x62, 0x6f, 0xc3, 0xe9, 0x8a, 0x7f, 0xd7, 0xbb, + 0xeb, 0x04, 0x8d, 0x85, 0xea, 0xaa, 0xf6, 0xbe, 0x5e, 0x97, 0xef, 0x3b, 0x6e, 0x24, 0x96, 0x79, + 0xf4, 0x6a, 0x35, 0x39, 0x5b, 0xbb, 0xe2, 0x36, 0x49, 0x8e, 0x14, 0xe4, 0x2f, 0x15, 0x8c, 0x96, + 0x62, 0x7c, 0xa5, 0xd5, 0xb2, 0x72, 0xb5, 0x5a, 0x6f, 0xc0, 0xc8, 0x96, 0x4b, 0x9a, 0x0d, 0x4c, + 0xb6, 0xc4, 0x4a, 0x7c, 0x2a, 0xdf, 0xee, 0x65, 0x85, 0x62, 0x4a, 0xa9, 0x17, 0x7f, 0x1d, 0xae, + 0x88, 0xca, 0x58, 0x91, 0x41, 0xbb, 0x30, 0x25, 0x1f, 0x0c, 0x12, 0x2a, 0xd6, 0xe5, 0xd3, 0xdd, + 0x5e, 0x21, 0x26, 0xf1, 0x53, 0xf7, 0x0f, 0xca, 0x53, 0x38, 0x41, 0x06, 0xa7, 0x08, 0xd3, 0xe7, + 0x60, 0x8b, 0x9e, 0xc0, 0x03, 0x6c, 0xf8, 0xd9, 0x73, 0x90, 0xbd, 0x6c, 0x59, 0xa9, 0xfd, 0x13, + 0x16, 0x3c, 0x92, 0x1a, 0x19, 0xf1, 0xc2, 0x3f, 0xe6, 0x59, 0x48, 0xbe, 0xb8, 0x0b, 0xbd, 0x5f, + 0xdc, 0xf6, 0xdf, 0xb4, 0xe0, 0xd4, 0x72, 0xab, 0x1d, 0xed, 0x57, 0x5c, 0x53, 0x05, 0xf5, 0x61, + 0x18, 0x6a, 0x91, 0x86, 0xdb, 0x69, 0x89, 0x99, 0x2b, 0xcb, 0x53, 0x6a, 0x8d, 0x95, 0x1e, 0x1e, + 0x94, 0xc7, 0x6b, 0x91, 0x1f, 0x38, 0xdb, 0x84, 0x17, 0x60, 0x81, 0xce, 0xce, 0x7a, 0xf7, 0x6d, + 0x72, 0xc3, 0x6d, 0xb9, 0xd2, 0x8e, 0xa9, 0xab, 0xcc, 0x6e, 0x5e, 0x0e, 0xe8, 0xfc, 0x1b, 0x1d, + 0xc7, 0x8b, 0xdc, 0x68, 0x5f, 0x68, 0x8f, 0x24, 0x11, 0x1c, 0xd3, 0xb3, 0xbf, 0x6e, 0xc1, 0xa4, + 0x5c, 0xf7, 0x0b, 0x8d, 0x46, 0x40, 0xc2, 0x10, 0xcd, 0x41, 0xc1, 0x6d, 0x8b, 0x5e, 0x82, 0xe8, + 0x65, 0x61, 0xb5, 0x8a, 0x0b, 0x6e, 0x5b, 0xb2, 0x65, 0xec, 0x20, 0x2c, 0x9a, 0x8a, 0xb4, 0x6b, + 0xa2, 0x1c, 0x2b, 0x0c, 0x74, 0x09, 0x46, 0x3c, 0xbf, 0xc1, 0x6d, 0xc9, 0xf8, 0x95, 0xc6, 0x16, + 0xd8, 0xba, 0x28, 0xc3, 0x0a, 0x8a, 0xaa, 0x50, 0xe2, 0x66, 0x56, 0xf1, 0xa2, 0xed, 0xcb, 0x58, + 0x8b, 0x7d, 0xd9, 0x86, 0xac, 0x89, 0x63, 0x22, 0xf6, 0xaf, 0x5a, 0x30, 0x26, 0xbf, 0xac, 0x4f, + 0x9e, 0x93, 0x6e, 0xad, 0x98, 0xdf, 0x8c, 0xb7, 0x16, 0xe5, 0x19, 0x19, 0xc4, 0x60, 0x15, 0x8b, + 0x47, 0x62, 0x15, 0xaf, 0xc0, 0xa8, 0xd3, 0x6e, 0x57, 0x4d, 0x3e, 0x93, 0x2d, 0xa5, 0x85, 0xb8, + 0x18, 0xeb, 0x38, 0xf6, 0x8f, 0x17, 0x60, 0x42, 0x7e, 0x41, 0xad, 0xb3, 0x19, 0x92, 0x08, 0x6d, + 0x40, 0xc9, 0xe1, 0xb3, 0x44, 0xe4, 0x22, 0x7f, 0x22, 0x5b, 0x8e, 0x60, 0x4c, 0x69, 0x7c, 0xe1, + 0x2f, 0xc8, 0xda, 0x38, 0x26, 0x84, 0x9a, 0x30, 0xed, 0xf9, 0x11, 0x3b, 0xfc, 0x15, 0xbc, 0x9b, + 0x6a, 0x27, 0x49, 0xfd, 0xac, 0xa0, 0x3e, 0xbd, 0x9e, 0xa4, 0x82, 0xd3, 0x84, 0xd1, 0xb2, 0x94, + 0xcd, 0x14, 0xf3, 0x85, 0x01, 0xfa, 0xc4, 0x65, 0x8b, 0x66, 0xec, 0x5f, 0xb1, 0xa0, 0x24, 0xd1, + 0x4e, 0x42, 0x8b, 0xb7, 0x06, 0xc3, 0x21, 0x9b, 0x04, 0x39, 0x34, 0x76, 0xb7, 0x8e, 0xf3, 0xf9, + 0x8a, 0xef, 0x34, 0xfe, 0x3f, 0xc4, 0x92, 0x06, 0x13, 0xcd, 0xab, 0xee, 0xbf, 0x4b, 0x44, 0xf3, + 0xaa, 0x3f, 0x39, 0x97, 0xd2, 0x1f, 0xb1, 0x3e, 0x6b, 0xb2, 0x2e, 0xca, 0x7a, 0xb5, 0x03, 0xb2, + 0xe5, 0xde, 0x4b, 0xb2, 0x5e, 0x55, 0x56, 0x8a, 0x05, 0x14, 0xbd, 0x09, 0x63, 0x75, 0x29, 0x93, + 0x8d, 0x77, 0xf8, 0xc5, 0xae, 0xfa, 0x01, 0xa5, 0x4a, 0xe2, 0xb2, 0x90, 0x25, 0xad, 0x3e, 0x36, + 0xa8, 0x99, 0x66, 0x04, 0xc5, 0x5e, 0x66, 0x04, 0x31, 0xdd, 0x7c, 0xa5, 0xfa, 0x4f, 0x5a, 0x30, + 0xc4, 0x65, 0x71, 0xfd, 0x89, 0x42, 0x35, 0xcd, 0x5a, 0x3c, 0x76, 0xb7, 0x69, 0xa1, 0xd0, 0x94, + 0xa1, 0x35, 0x28, 0xb1, 0x1f, 0x4c, 0x96, 0x58, 0xcc, 0xb7, 0xf2, 0xe7, 0xad, 0xea, 0x1d, 0xbc, + 0x2d, 0xab, 0xe1, 0x98, 0x82, 0xfd, 0x63, 0x45, 0x7a, 0xba, 0xc5, 0xa8, 0xc6, 0xa5, 0x6f, 0x3d, + 0xbc, 0x4b, 0xbf, 0xf0, 0xb0, 0x2e, 0xfd, 0x6d, 0x98, 0xac, 0x6b, 0x7a, 0xb8, 0x78, 0x26, 0x2f, + 0x75, 0x5d, 0x24, 0x9a, 0xca, 0x8e, 0x4b, 0x59, 0x96, 0x4c, 0x22, 0x38, 0x49, 0x15, 0x7d, 0x17, + 0x8c, 0xf1, 0x79, 0x16, 0xad, 0x70, 0x4b, 0x8c, 0xf7, 0xe7, 0xaf, 0x17, 0xbd, 0x09, 0x2e, 0x95, + 0xd3, 0xaa, 0x63, 0x83, 0x98, 0xfd, 0xa7, 0x16, 0xa0, 0xe5, 0xf6, 0x0e, 0x69, 0x91, 0xc0, 0x69, + 0xc6, 0xe2, 0xf4, 0x1f, 0xb6, 0x60, 0x96, 0xa4, 0x8a, 0x97, 0xfc, 0x56, 0x4b, 0x3c, 0x5a, 0x72, + 0xde, 0xd5, 0xcb, 0x39, 0x75, 0x94, 0x1b, 0xc4, 0x6c, 0x1e, 0x06, 0xce, 0x6d, 0x0f, 0xad, 0xc1, + 0x0c, 0xbf, 0x25, 0x15, 0x40, 0xb3, 0xf5, 0x7e, 0x54, 0x10, 0x9e, 0xd9, 0x48, 0xa3, 0xe0, 0xac, + 0x7a, 0xf6, 0xf7, 0x8d, 0x41, 0x6e, 0x2f, 0xde, 0xd3, 0x23, 0xbc, 0xa7, 0x47, 0x78, 0x4f, 0x8f, + 0xf0, 0x9e, 0x1e, 0xe1, 0x3d, 0x3d, 0xc2, 0xb7, 0xbd, 0x1e, 0xe1, 0xff, 0xb3, 0xe0, 0xb4, 0xba, + 0x06, 0x8c, 0x87, 0xef, 0xe7, 0x60, 0x86, 0x6f, 0xb7, 0xa5, 0xa6, 0xe3, 0xb6, 0x36, 0x48, 0xab, + 0xdd, 0x74, 0x22, 0xa9, 0x75, 0xbf, 0x92, 0xb9, 0x72, 0x13, 0x16, 0xab, 0x46, 0x45, 0x6e, 0xfa, + 0x9f, 0x01, 0xc0, 0x59, 0xcd, 0xd8, 0xbf, 0x38, 0x02, 0x83, 0xcb, 0x7b, 0xc4, 0x8b, 0x4e, 0xe0, + 0x89, 0x50, 0x87, 0x09, 0xd7, 0xdb, 0xf3, 0x9b, 0x7b, 0xa4, 0xc1, 0xe1, 0x47, 0x79, 0xc9, 0x9e, + 0x11, 0xa4, 0x27, 0x56, 0x0d, 0x12, 0x38, 0x41, 0xf2, 0x61, 0x48, 0x93, 0xaf, 0xc2, 0x10, 0x3f, + 0xc4, 0x85, 0x28, 0x39, 0xf3, 0xcc, 0x66, 0x83, 0x28, 0xae, 0xa6, 0x58, 0xd2, 0xcd, 0x2f, 0x09, + 0x51, 0x1d, 0x7d, 0x16, 0x26, 0xb6, 0xdc, 0x20, 0x8c, 0x36, 0xdc, 0x16, 0x09, 0x23, 0xa7, 0xd5, + 0x7e, 0x00, 0xe9, 0xb1, 0x1a, 0x87, 0x15, 0x83, 0x12, 0x4e, 0x50, 0x46, 0xdb, 0x30, 0xde, 0x74, + 0xf4, 0xa6, 0x86, 0x8f, 0xdc, 0x94, 0xba, 0x1d, 0x6e, 0xe8, 0x84, 0xb0, 0x49, 0x97, 0x6e, 0xa7, + 0x3a, 0x13, 0x80, 0x8e, 0x30, 0xb1, 0x80, 0xda, 0x4e, 0x5c, 0xf2, 0xc9, 0x61, 0x94, 0xd1, 0x61, + 0x06, 0xb2, 0x25, 0x93, 0xd1, 0xd1, 0xcc, 0x60, 0x3f, 0x03, 0x25, 0x42, 0x87, 0x90, 0x12, 0x16, + 0x17, 0xcc, 0xe5, 0xfe, 0xfa, 0xba, 0xe6, 0xd6, 0x03, 0xdf, 0x94, 0xdb, 0x2f, 0x4b, 0x4a, 0x38, + 0x26, 0x8a, 0x96, 0x60, 0x28, 0x24, 0x81, 0x4b, 0x42, 0x71, 0xd5, 0x74, 0x99, 0x46, 0x86, 0xc6, + 0x7d, 0x4b, 0xf8, 0x6f, 0x2c, 0xaa, 0xd2, 0xe5, 0xe5, 0x30, 0x91, 0x26, 0xbb, 0x0c, 0xb4, 0xe5, + 0xb5, 0xc0, 0x4a, 0xb1, 0x80, 0xa2, 0xd7, 0x61, 0x38, 0x20, 0x4d, 0xa6, 0x18, 0x1a, 0xef, 0x7f, + 0x91, 0x73, 0x3d, 0x13, 0xaf, 0x87, 0x25, 0x01, 0x74, 0x1d, 0x50, 0x40, 0x28, 0xa3, 0xe4, 0x7a, + 0xdb, 0xca, 0x6c, 0x54, 0x1c, 0xb4, 0x8a, 0x21, 0xc5, 0x31, 0x86, 0x74, 0x2b, 0xc2, 0x19, 0xd5, + 0xd0, 0x55, 0x98, 0x56, 0xa5, 0xab, 0x5e, 0x18, 0x39, 0xf4, 0x80, 0x9b, 0x64, 0xb4, 0x94, 0x9c, + 0x02, 0x27, 0x11, 0x70, 0xba, 0x8e, 0xfd, 0x65, 0x0b, 0xf8, 0x38, 0x9f, 0xc0, 0xeb, 0xfc, 0x35, + 0xf3, 0x75, 0x7e, 0x36, 0x77, 0xe6, 0x72, 0x5e, 0xe6, 0x5f, 0xb6, 0x60, 0x54, 0x9b, 0xd9, 0x78, + 0xcd, 0x5a, 0x5d, 0xd6, 0x6c, 0x07, 0xa6, 0xe8, 0x4a, 0xbf, 0xb9, 0x19, 0x92, 0x60, 0x8f, 0x34, + 0xd8, 0xc2, 0x2c, 0x3c, 0xd8, 0xc2, 0x54, 0x26, 0x6a, 0x37, 0x12, 0x04, 0x71, 0xaa, 0x09, 0xfb, + 0x33, 0xb2, 0xab, 0xca, 0xa2, 0xaf, 0xae, 0xe6, 0x3c, 0x61, 0xd1, 0xa7, 0x66, 0x15, 0xc7, 0x38, + 0x74, 0xab, 0xed, 0xf8, 0x61, 0x94, 0xb4, 0xe8, 0xbb, 0xe6, 0x87, 0x11, 0x66, 0x10, 0xfb, 0x05, + 0x80, 0xe5, 0x7b, 0xa4, 0xce, 0x57, 0xac, 0xfe, 0x78, 0xb0, 0xf2, 0x1f, 0x0f, 0xf6, 0x6f, 0x5b, + 0x30, 0xb1, 0xb2, 0x64, 0xdc, 0x5c, 0xf3, 0x00, 0xfc, 0xc5, 0x73, 0xe7, 0xce, 0xba, 0x54, 0x87, + 0x73, 0x8d, 0xa6, 0x2a, 0xc5, 0x1a, 0x06, 0x3a, 0x0b, 0xc5, 0x66, 0xc7, 0x13, 0xe2, 0xc3, 0x61, + 0x7a, 0x3d, 0xde, 0xe8, 0x78, 0x98, 0x96, 0x69, 0x2e, 0x05, 0xc5, 0xbe, 0x5d, 0x0a, 0x7a, 0x86, + 0x12, 0x40, 0x65, 0x18, 0xbc, 0x7b, 0xd7, 0x6d, 0x70, 0x87, 0x4d, 0xa1, 0xaa, 0xbf, 0x73, 0x67, + 0xb5, 0x12, 0x62, 0x5e, 0x6e, 0x7f, 0xb1, 0x08, 0x73, 0x2b, 0x4d, 0x72, 0xef, 0x1d, 0x3a, 0xad, + 0xf6, 0xeb, 0x10, 0x71, 0x34, 0x41, 0xcc, 0x51, 0x9d, 0x5e, 0x7a, 0x8f, 0xc7, 0x16, 0x0c, 0x73, + 0x83, 0x36, 0xe9, 0xc2, 0xfa, 0x6a, 0x56, 0xeb, 0xf9, 0x03, 0x32, 0xcf, 0x0d, 0xe3, 0x84, 0x47, + 0x9c, 0xba, 0x30, 0x45, 0x29, 0x96, 0xc4, 0xe7, 0x5e, 0x81, 0x31, 0x1d, 0xf3, 0x48, 0xee, 0x67, + 0xff, 0x57, 0x11, 0xa6, 0x68, 0x0f, 0x1e, 0xea, 0x44, 0xdc, 0x4a, 0x4f, 0xc4, 0x71, 0xbb, 0x20, + 0xf5, 0x9e, 0x8d, 0x37, 0x93, 0xb3, 0x71, 0x25, 0x6f, 0x36, 0x4e, 0x7a, 0x0e, 0xbe, 0xd7, 0x82, + 0x99, 0x95, 0xa6, 0x5f, 0xdf, 0x4d, 0xb8, 0x09, 0xbd, 0x04, 0xa3, 0xf4, 0x38, 0x0e, 0x0d, 0x8f, + 0x79, 0x23, 0x86, 0x82, 0x00, 0x61, 0x1d, 0x4f, 0xab, 0x76, 0xeb, 0xd6, 0x6a, 0x25, 0x2b, 0xf4, + 0x82, 0x00, 0x61, 0x1d, 0xcf, 0xfe, 0x0d, 0x0b, 0xce, 0x5d, 0x5d, 0x5a, 0x8e, 0x97, 0x62, 0x2a, + 0xfa, 0xc3, 0x45, 0x18, 0x6a, 0x37, 0xb4, 0xae, 0xc4, 0xe2, 0xd5, 0x0a, 0xeb, 0x85, 0x80, 0xbe, + 0x5b, 0x22, 0x9b, 0xdc, 0x02, 0xb8, 0x8a, 0xab, 0x4b, 0xe2, 0xdc, 0x95, 0xda, 0x14, 0x2b, 0x57, + 0x9b, 0xf2, 0x7e, 0x18, 0xa6, 0xf7, 0x82, 0x5b, 0x97, 0xfd, 0xe6, 0x0a, 0x5a, 0x5e, 0x84, 0x25, + 0xcc, 0xfe, 0x59, 0x0b, 0x66, 0xae, 0xba, 0x11, 0xbd, 0xb4, 0x93, 0xe1, 0x0d, 0xe8, 0xad, 0x1d, + 0xba, 0x91, 0x1f, 0xec, 0x27, 0xc3, 0x1b, 0x60, 0x05, 0xc1, 0x1a, 0x16, 0xff, 0xa0, 0x3d, 0x97, + 0x59, 0x68, 0x17, 0x4c, 0xfd, 0x15, 0x16, 0xe5, 0x58, 0x61, 0xd0, 0xf1, 0x6a, 0xb8, 0x01, 0x13, + 0xfd, 0xed, 0x8b, 0x83, 0x5b, 0x8d, 0x57, 0x45, 0x02, 0x70, 0x8c, 0x63, 0xff, 0xb1, 0x05, 0xe5, + 0xab, 0xcd, 0x4e, 0x18, 0x91, 0x60, 0x2b, 0xcc, 0x39, 0x74, 0x5f, 0x80, 0x12, 0x91, 0x82, 0x76, + 0xd1, 0x6b, 0xc5, 0x88, 0x2a, 0x09, 0x3c, 0x8f, 0xb2, 0xa0, 0xf0, 0xfa, 0xf0, 0x65, 0x3c, 0x9a, + 0x33, 0xda, 0x0a, 0x20, 0xa2, 0xb7, 0xa5, 0x87, 0x9d, 0x60, 0xfe, 0xeb, 0xcb, 0x29, 0x28, 0xce, + 0xa8, 0x61, 0xff, 0x84, 0x05, 0xa7, 0xd5, 0x07, 0xbf, 0xeb, 0x3e, 0xd3, 0xfe, 0x6a, 0x01, 0xc6, + 0xaf, 0x6d, 0x6c, 0x54, 0xaf, 0x92, 0x48, 0x5b, 0x95, 0xdd, 0xd5, 0xe7, 0x58, 0xd3, 0x02, 0x76, + 0x7b, 0x23, 0x76, 0x22, 0xb7, 0x39, 0xcf, 0xa3, 0x17, 0xcd, 0xaf, 0x7a, 0xd1, 0xcd, 0xa0, 0x16, + 0x05, 0xae, 0xb7, 0x9d, 0xb9, 0xd2, 0x25, 0xcf, 0x52, 0xcc, 0xe3, 0x59, 0xd0, 0x0b, 0x30, 0xc4, + 0xc2, 0x27, 0xc9, 0x49, 0x78, 0x54, 0x3d, 0xb1, 0x58, 0xe9, 0xe1, 0x41, 0xb9, 0x74, 0x0b, 0xaf, + 0xf2, 0x3f, 0x58, 0xa0, 0xa2, 0x5b, 0x30, 0xba, 0x13, 0x45, 0xed, 0x6b, 0xc4, 0x69, 0x90, 0x40, + 0x9e, 0xb2, 0xe7, 0xb3, 0x4e, 0x59, 0x3a, 0x08, 0x1c, 0x2d, 0x3e, 0x98, 0xe2, 0xb2, 0x10, 0xeb, + 0x74, 0xec, 0x1a, 0x40, 0x0c, 0x3b, 0x26, 0x05, 0x88, 0xbd, 0x01, 0x25, 0xfa, 0xb9, 0x0b, 0x4d, + 0xd7, 0xe9, 0xae, 0x62, 0x7e, 0x06, 0x4a, 0x52, 0x81, 0x1c, 0x0a, 0x5f, 0x6b, 0x76, 0x23, 0x49, + 0xfd, 0x72, 0x88, 0x63, 0xb8, 0xbd, 0x05, 0xa7, 0x98, 0x39, 0xa0, 0x13, 0xed, 0x18, 0xab, 0xaf, + 0xf7, 0x34, 0x3f, 0x2b, 0x5e, 0x6c, 0xbc, 0xcf, 0xb3, 0x9a, 0x3b, 0xe3, 0x98, 0xa4, 0x18, 0xbf, + 0xde, 0xec, 0x6f, 0x0c, 0xc0, 0xa3, 0xab, 0xb5, 0xfc, 0xf0, 0x1f, 0x2f, 0xc3, 0x18, 0x67, 0x04, + 0xe9, 0xa4, 0x3b, 0x4d, 0xd1, 0xae, 0x92, 0x6d, 0x6e, 0x68, 0x30, 0x6c, 0x60, 0xa2, 0x73, 0x50, + 0x74, 0xdf, 0xf2, 0x92, 0xce, 0x3e, 0xab, 0x6f, 0xac, 0x63, 0x5a, 0x4e, 0xc1, 0x94, 0xa7, 0xe4, + 0x87, 0xb5, 0x02, 0x2b, 0xbe, 0xf2, 0x35, 0x98, 0x70, 0xc3, 0x7a, 0xe8, 0xae, 0x7a, 0x74, 0x07, + 0x6a, 0x7b, 0x58, 0x49, 0x13, 0x68, 0xa7, 0x15, 0x14, 0x27, 0xb0, 0xb5, 0x9b, 0x63, 0xb0, 0x6f, + 0xbe, 0xb4, 0xa7, 0xf3, 0x31, 0x3d, 0xd8, 0xdb, 0xec, 0xeb, 0x42, 0x26, 0xa4, 0x16, 0x07, 0x3b, + 0xff, 0xe0, 0x10, 0x4b, 0x18, 0x7d, 0xaa, 0xd5, 0x77, 0x9c, 0xf6, 0x42, 0x27, 0xda, 0xa9, 0xb8, + 0x61, 0xdd, 0xdf, 0x23, 0xc1, 0x3e, 0x7b, 0x65, 0x8f, 0xc4, 0x4f, 0x35, 0x05, 0x58, 0xba, 0xb6, + 0x50, 0xa5, 0x98, 0x38, 0x5d, 0x07, 0x2d, 0xc0, 0xa4, 0x2c, 0xac, 0x91, 0x90, 0x1d, 0xee, 0xa3, + 0x8c, 0x8c, 0x72, 0xbf, 0x11, 0xc5, 0x8a, 0x48, 0x12, 0xdf, 0x64, 0x5d, 0xe1, 0x38, 0x58, 0xd7, + 0x0f, 0xc3, 0xb8, 0xeb, 0xb9, 0x91, 0xeb, 0x44, 0x3e, 0xd7, 0xb0, 0xf0, 0x07, 0x35, 0x13, 0x1d, + 0xaf, 0xea, 0x00, 0x6c, 0xe2, 0xd9, 0xff, 0x7e, 0x00, 0xa6, 0xd9, 0xb4, 0xbd, 0xb7, 0xc2, 0xbe, + 0x9d, 0x56, 0xd8, 0xad, 0xf4, 0x0a, 0x3b, 0x0e, 0x9e, 0xfc, 0x81, 0x97, 0xd9, 0x67, 0xa1, 0xa4, + 0x3c, 0x8e, 0xa4, 0xcb, 0xa1, 0x95, 0xe3, 0x72, 0xd8, 0xfb, 0x5e, 0x96, 0x46, 0x5b, 0xc5, 0x4c, + 0xa3, 0xad, 0xaf, 0x58, 0x10, 0xab, 0x0c, 0xd0, 0x1b, 0x50, 0x6a, 0xfb, 0xcc, 0x16, 0x31, 0x90, + 0x06, 0xbe, 0x4f, 0x76, 0xd5, 0x39, 0xf0, 0x08, 0x48, 0x01, 0x1f, 0x85, 0xaa, 0xac, 0x8a, 0x63, + 0x2a, 0xe8, 0x3a, 0x0c, 0xb7, 0x03, 0x52, 0x8b, 0x58, 0x78, 0x8e, 0xfe, 0x09, 0xf2, 0x55, 0xc3, + 0x2b, 0x62, 0x49, 0xc1, 0xfe, 0x0f, 0x16, 0x4c, 0x25, 0x51, 0xd1, 0x47, 0x60, 0x80, 0xdc, 0x23, + 0x75, 0xd1, 0xdf, 0xcc, 0x4b, 0x36, 0x16, 0x3a, 0xf0, 0x01, 0xa0, 0xff, 0x31, 0xab, 0x85, 0xae, + 0xc1, 0x30, 0xbd, 0x61, 0xaf, 0xaa, 0x50, 0x54, 0x8f, 0xe7, 0xdd, 0xd2, 0x8a, 0x55, 0xe1, 0x9d, + 0x13, 0x45, 0x58, 0x56, 0x67, 0x96, 0x52, 0xf5, 0x76, 0x8d, 0x3e, 0x5e, 0xa2, 0x6e, 0x6f, 0xec, + 0x8d, 0xa5, 0x2a, 0x47, 0x12, 0xd4, 0xb8, 0xa5, 0x94, 0x2c, 0xc4, 0x31, 0x11, 0xfb, 0xe7, 0x2d, + 0x00, 0x6e, 0x18, 0xe6, 0x78, 0xdb, 0xe4, 0x04, 0xe4, 0xe4, 0x15, 0x18, 0x08, 0xdb, 0xa4, 0xde, + 0xcd, 0x4c, 0x36, 0xee, 0x4f, 0xad, 0x4d, 0xea, 0xf1, 0x8a, 0xa3, 0xff, 0x30, 0xab, 0x6d, 0x7f, + 0x3f, 0xc0, 0x44, 0x8c, 0xb6, 0x1a, 0x91, 0x16, 0x7a, 0xce, 0x08, 0x53, 0x70, 0x36, 0x11, 0xa6, + 0xa0, 0xc4, 0xb0, 0x35, 0x91, 0xec, 0x67, 0xa1, 0xd8, 0x72, 0xee, 0x09, 0x99, 0xdb, 0x33, 0xdd, + 0xbb, 0x41, 0xe9, 0xcf, 0xaf, 0x39, 0xf7, 0xf8, 0xb3, 0xf4, 0x19, 0xb9, 0x43, 0xd6, 0x9c, 0x7b, + 0x87, 0xdc, 0x18, 0x96, 0x9d, 0xd2, 0x37, 0xdc, 0x30, 0xfa, 0xfc, 0xbf, 0x8b, 0xff, 0xb3, 0x7d, + 0x47, 0x1b, 0x61, 0x6d, 0xb9, 0x9e, 0xb0, 0x79, 0xea, 0xab, 0x2d, 0xd7, 0x4b, 0xb6, 0xe5, 0x7a, + 0x7d, 0xb4, 0xe5, 0x7a, 0xe8, 0x6d, 0x18, 0x16, 0x26, 0x89, 0x22, 0x2c, 0xd0, 0xe5, 0x3e, 0xda, + 0x13, 0x16, 0x8d, 0xbc, 0xcd, 0xcb, 0xf2, 0xd9, 0x2d, 0x4a, 0x7b, 0xb6, 0x2b, 0x1b, 0x44, 0xff, + 0xbf, 0x05, 0x13, 0xe2, 0x37, 0x26, 0x6f, 0x75, 0x48, 0x18, 0x09, 0xb6, 0xf4, 0x43, 0xfd, 0xf7, + 0x41, 0x54, 0xe4, 0x5d, 0xf9, 0x90, 0xbc, 0x67, 0x4c, 0x60, 0xcf, 0x1e, 0x25, 0x7a, 0x81, 0xfe, + 0xb6, 0x05, 0xa7, 0x5a, 0xce, 0x3d, 0xde, 0x22, 0x2f, 0xc3, 0x4e, 0xe4, 0xfa, 0x42, 0xb5, 0xff, + 0x91, 0xfe, 0xa6, 0x3f, 0x55, 0x9d, 0x77, 0x52, 0xea, 0x1f, 0x4f, 0x65, 0xa1, 0xf4, 0xec, 0x6a, + 0x66, 0xbf, 0xe6, 0xb6, 0x60, 0x44, 0xae, 0xb7, 0x0c, 0xe1, 0x46, 0x45, 0xe7, 0xb9, 0x8f, 0x6c, + 0x11, 0xaa, 0xbb, 0xff, 0xd3, 0x76, 0xc4, 0x5a, 0x7b, 0xa8, 0xed, 0x7c, 0x16, 0xc6, 0xf4, 0x35, + 0xf6, 0x50, 0xdb, 0x7a, 0x0b, 0x66, 0x32, 0xd6, 0xd2, 0x43, 0x6d, 0xf2, 0x2e, 0x9c, 0xcd, 0x5d, + 0x1f, 0x0f, 0xb3, 0x61, 0xfb, 0xab, 0x96, 0x7e, 0x0e, 0x9e, 0x80, 0xb2, 0x62, 0xc9, 0x54, 0x56, + 0x9c, 0xef, 0xbe, 0x73, 0x72, 0x34, 0x16, 0x6f, 0xea, 0x9d, 0xa6, 0xa7, 0x3a, 0x7a, 0x1d, 0x86, + 0x9a, 0xb4, 0x44, 0x1a, 0xb6, 0xda, 0xbd, 0x77, 0x64, 0xcc, 0x4c, 0xb2, 0xf2, 0x10, 0x0b, 0x0a, + 0xf6, 0x2f, 0x59, 0x30, 0x70, 0x02, 0x23, 0x81, 0xcd, 0x91, 0x78, 0x2e, 0x97, 0xb4, 0x88, 0x90, + 0x3c, 0x8f, 0x9d, 0xbb, 0xcb, 0xf7, 0x22, 0xe2, 0x85, 0xec, 0x46, 0xce, 0x1c, 0x98, 0x9f, 0xb6, + 0x60, 0xe6, 0x86, 0xef, 0x34, 0x16, 0x9d, 0xa6, 0xe3, 0xd5, 0x49, 0xb0, 0xea, 0x6d, 0x1f, 0xc9, + 0x2a, 0xbb, 0xd0, 0xd3, 0x2a, 0x7b, 0x49, 0x1a, 0x35, 0x0d, 0xe4, 0xcf, 0x1f, 0xe5, 0xa4, 0x93, + 0x81, 0x5b, 0x0c, 0xf3, 0xdb, 0x1d, 0x40, 0x7a, 0x2f, 0x85, 0x8f, 0x0c, 0x86, 0x61, 0x97, 0xf7, + 0x57, 0x4c, 0xe2, 0x53, 0xd9, 0x1c, 0x6e, 0xea, 0xf3, 0x34, 0xef, 0x0f, 0x5e, 0x80, 0x25, 0x21, + 0xfb, 0x65, 0xc8, 0x74, 0xb4, 0xef, 0x2d, 0x97, 0xb0, 0x3f, 0x01, 0xd3, 0xac, 0xe6, 0x11, 0x25, + 0x03, 0x76, 0x42, 0x9a, 0x9a, 0x11, 0x82, 0xcf, 0xfe, 0x82, 0x05, 0x93, 0xeb, 0x89, 0xc8, 0x64, + 0x17, 0x99, 0xfe, 0x35, 0x43, 0x88, 0x5f, 0x63, 0xa5, 0x58, 0x40, 0x8f, 0x5d, 0xc8, 0xf5, 0x17, + 0x16, 0xc4, 0xb1, 0x2f, 0x4e, 0x80, 0x7d, 0x5b, 0x32, 0xd8, 0xb7, 0x4c, 0x46, 0x56, 0x75, 0x27, + 0x8f, 0x7b, 0x43, 0xd7, 0x55, 0x54, 0xa8, 0x2e, 0x3c, 0x6c, 0x4c, 0x86, 0x2f, 0xc5, 0x09, 0x33, + 0x74, 0x94, 0x8c, 0x13, 0x65, 0xff, 0x4e, 0x01, 0x90, 0xc2, 0xed, 0x3b, 0x6a, 0x55, 0xba, 0xc6, + 0xf1, 0x44, 0xad, 0xda, 0x03, 0xc4, 0x2c, 0x08, 0x02, 0xc7, 0x0b, 0x39, 0x59, 0x57, 0x88, 0xf5, + 0x8e, 0x66, 0x9e, 0x30, 0x27, 0x9a, 0x44, 0x37, 0x52, 0xd4, 0x70, 0x46, 0x0b, 0x9a, 0x65, 0xc8, + 0x60, 0xbf, 0x96, 0x21, 0x43, 0x3d, 0xfc, 0xe0, 0x7e, 0xce, 0x82, 0x71, 0x35, 0x4c, 0xef, 0x12, + 0x2b, 0x75, 0xd5, 0x9f, 0x9c, 0x03, 0xb4, 0xaa, 0x75, 0x99, 0x5d, 0x2c, 0xdf, 0xc9, 0xfc, 0x19, + 0x9d, 0xa6, 0xfb, 0x36, 0x51, 0x31, 0x03, 0xcb, 0xc2, 0x3f, 0x51, 0x94, 0x1e, 0x1e, 0x94, 0xc7, + 0xd5, 0x3f, 0x1e, 0x13, 0x39, 0xae, 0x42, 0x8f, 0xe4, 0xc9, 0xc4, 0x52, 0x44, 0x2f, 0xc1, 0x60, + 0x7b, 0xc7, 0x09, 0x49, 0xc2, 0x9b, 0x67, 0xb0, 0x4a, 0x0b, 0x0f, 0x0f, 0xca, 0x13, 0xaa, 0x02, + 0x2b, 0xc1, 0x1c, 0xbb, 0xff, 0x58, 0x60, 0xe9, 0xc5, 0xd9, 0x33, 0x16, 0xd8, 0x9f, 0x5a, 0x30, + 0xb0, 0xee, 0x37, 0x4e, 0xe2, 0x08, 0x78, 0xcd, 0x38, 0x02, 0x1e, 0xcb, 0x0b, 0x57, 0x9f, 0xbb, + 0xfb, 0x57, 0x12, 0xbb, 0xff, 0x7c, 0x2e, 0x85, 0xee, 0x1b, 0xbf, 0x05, 0xa3, 0x2c, 0x08, 0xbe, + 0xf0, 0x5c, 0x7a, 0xc1, 0xd8, 0xf0, 0xe5, 0xc4, 0x86, 0x9f, 0xd4, 0x50, 0xb5, 0x9d, 0xfe, 0x34, + 0x0c, 0x0b, 0x57, 0x98, 0xa4, 0x5b, 0xa8, 0xc0, 0xc5, 0x12, 0x6e, 0xff, 0x64, 0x11, 0x8c, 0xa0, + 0xfb, 0xe8, 0x57, 0x2c, 0x98, 0x0f, 0xb8, 0x89, 0x6c, 0xa3, 0xd2, 0x09, 0x5c, 0x6f, 0xbb, 0x56, + 0xdf, 0x21, 0x8d, 0x4e, 0xd3, 0xf5, 0xb6, 0x57, 0xb7, 0x3d, 0x5f, 0x15, 0x2f, 0xdf, 0x23, 0xf5, + 0x0e, 0x53, 0xbb, 0xf5, 0x88, 0xf0, 0xaf, 0x4c, 0xcd, 0x9f, 0xbf, 0x7f, 0x50, 0x9e, 0xc7, 0x47, + 0xa2, 0x8d, 0x8f, 0xd8, 0x17, 0xf4, 0x1b, 0x16, 0x5c, 0xe6, 0xb1, 0xe8, 0xfb, 0xef, 0x7f, 0x97, + 0xd7, 0x72, 0x55, 0x92, 0x8a, 0x89, 0x6c, 0x90, 0xa0, 0xb5, 0xf8, 0x61, 0x31, 0xa0, 0x97, 0xab, + 0x47, 0x6b, 0x0b, 0x1f, 0xb5, 0x73, 0xf6, 0x3f, 0x2a, 0xc2, 0xb8, 0x88, 0x19, 0x25, 0xee, 0x80, + 0x97, 0x8c, 0x25, 0xf1, 0x78, 0x62, 0x49, 0x4c, 0x1b, 0xc8, 0xc7, 0x73, 0xfc, 0x87, 0x30, 0x4d, + 0x0f, 0xe7, 0x6b, 0xc4, 0x09, 0xa2, 0x4d, 0xe2, 0x70, 0x83, 0xaf, 0xe2, 0x91, 0x4f, 0x7f, 0x25, + 0x9f, 0xbc, 0x91, 0x24, 0x86, 0xd3, 0xf4, 0xbf, 0x9d, 0xee, 0x1c, 0x0f, 0xa6, 0x52, 0x61, 0xbf, + 0x3e, 0x09, 0x25, 0xe5, 0xc7, 0x21, 0x0e, 0x9d, 0xee, 0xd1, 0xf3, 0x92, 0x14, 0xb8, 0xf8, 0x2b, + 0xf6, 0x21, 0x8a, 0xc9, 0xd9, 0x7f, 0xa7, 0x60, 0x34, 0xc8, 0x27, 0x71, 0x1d, 0x46, 0x9c, 0x30, + 0x74, 0xb7, 0x3d, 0xd2, 0xe8, 0x26, 0xa1, 0x4c, 0x35, 0xc3, 0x7c, 0x69, 0x16, 0x44, 0x4d, 0xac, + 0x68, 0xa0, 0x6b, 0xdc, 0xac, 0x6e, 0x8f, 0x74, 0x13, 0x4f, 0xa6, 0xa8, 0x81, 0x34, 0xbc, 0xdb, + 0x23, 0x58, 0xd4, 0x47, 0x9f, 0xe2, 0x76, 0x8f, 0xd7, 0x3d, 0xff, 0xae, 0x77, 0xd5, 0xf7, 0x65, + 0x5c, 0x86, 0xfe, 0x08, 0x4e, 0x4b, 0x6b, 0x47, 0x55, 0x1d, 0x9b, 0xd4, 0xfa, 0x8b, 0xa3, 0xf9, + 0x39, 0x60, 0xb1, 0xb7, 0x4d, 0xb7, 0xe9, 0x10, 0x11, 0x98, 0x14, 0x01, 0xc9, 0x64, 0x99, 0x18, + 0xbb, 0xcc, 0xa7, 0x9c, 0x59, 0x3b, 0x16, 0xa4, 0x5f, 0x37, 0x49, 0xe0, 0x24, 0x4d, 0xfb, 0x67, + 0x2c, 0x60, 0x2e, 0xa4, 0x27, 0xc0, 0x8f, 0x7c, 0xd4, 0xe4, 0x47, 0x66, 0xf3, 0x06, 0x39, 0x87, + 0x15, 0x79, 0x91, 0xaf, 0xac, 0x6a, 0xe0, 0xdf, 0xdb, 0x17, 0xc6, 0x2a, 0xbd, 0xdf, 0x1f, 0xf6, + 0xff, 0xb0, 0xf8, 0x21, 0xa6, 0xbc, 0x2c, 0xd0, 0x77, 0xc3, 0x48, 0xdd, 0x69, 0x3b, 0x75, 0x9e, + 0x21, 0x26, 0x57, 0xa2, 0x67, 0x54, 0x9a, 0x5f, 0x12, 0x35, 0xb8, 0x84, 0x4a, 0x06, 0xb6, 0x1b, + 0x91, 0xc5, 0x3d, 0xa5, 0x52, 0xaa, 0xc9, 0xb9, 0x5d, 0x18, 0x37, 0x88, 0x3d, 0x54, 0x71, 0xc6, + 0x77, 0xf3, 0x2b, 0x56, 0x05, 0x62, 0x6c, 0xc1, 0xb4, 0xa7, 0xfd, 0xa7, 0x17, 0x8a, 0x7c, 0x5c, + 0x3e, 0xd9, 0xeb, 0x12, 0x65, 0xb7, 0x8f, 0xe6, 0x9d, 0x9a, 0x20, 0x83, 0xd3, 0x94, 0xed, 0x9f, + 0xb2, 0xe0, 0x11, 0x1d, 0x51, 0x73, 0x80, 0xe9, 0xa5, 0x24, 0xa9, 0xc0, 0x88, 0xdf, 0x26, 0x81, + 0x13, 0xf9, 0x81, 0xb8, 0x35, 0x2e, 0xc9, 0x41, 0xbf, 0x29, 0xca, 0x0f, 0x45, 0xbc, 0x73, 0x49, + 0x5d, 0x96, 0x63, 0x55, 0x93, 0xbe, 0x3e, 0xd9, 0x60, 0x84, 0xc2, 0xd5, 0x89, 0x9d, 0x01, 0x4c, + 0x93, 0x1e, 0x62, 0x01, 0xb1, 0xbf, 0x61, 0xf1, 0x85, 0xa5, 0x77, 0x1d, 0xbd, 0x05, 0x53, 0x2d, + 0x27, 0xaa, 0xef, 0x2c, 0xdf, 0x6b, 0x07, 0x5c, 0xe5, 0x24, 0xc7, 0xe9, 0x99, 0x5e, 0xe3, 0xa4, + 0x7d, 0x64, 0x6c, 0xca, 0xb9, 0x96, 0x20, 0x86, 0x53, 0xe4, 0xd1, 0x26, 0x8c, 0xb2, 0x32, 0xe6, + 0xc5, 0x17, 0x76, 0x63, 0x0d, 0xf2, 0x5a, 0x53, 0xc6, 0x08, 0x6b, 0x31, 0x1d, 0xac, 0x13, 0xb5, + 0xbf, 0x52, 0xe4, 0xbb, 0x9d, 0xb1, 0xf2, 0x4f, 0xc3, 0x70, 0xdb, 0x6f, 0x2c, 0xad, 0x56, 0xb0, + 0x98, 0x05, 0x75, 0x8d, 0x54, 0x79, 0x31, 0x96, 0x70, 0x74, 0x09, 0x46, 0xc4, 0x4f, 0xa9, 0x22, + 0x64, 0x67, 0xb3, 0xc0, 0x0b, 0xb1, 0x82, 0xa2, 0xe7, 0x01, 0xda, 0x81, 0xbf, 0xe7, 0x36, 0x58, + 0x74, 0x89, 0xa2, 0x69, 0x47, 0x54, 0x55, 0x10, 0xac, 0x61, 0xa1, 0x57, 0x61, 0xbc, 0xe3, 0x85, + 0x9c, 0x1d, 0xd1, 0x62, 0xc9, 0x2a, 0x0b, 0x97, 0x5b, 0x3a, 0x10, 0x9b, 0xb8, 0x68, 0x01, 0x86, + 0x22, 0x87, 0xd9, 0xc5, 0x0c, 0xe6, 0x9b, 0xfb, 0x6e, 0x50, 0x0c, 0x3d, 0x19, 0x09, 0xad, 0x80, + 0x45, 0x45, 0xf4, 0x49, 0xe9, 0x50, 0xcb, 0x0f, 0x76, 0x61, 0x67, 0xdf, 0xdf, 0x25, 0xa0, 0xb9, + 0xd3, 0x0a, 0xfb, 0x7d, 0x83, 0x16, 0x7a, 0x05, 0x80, 0xdc, 0x8b, 0x48, 0xe0, 0x39, 0x4d, 0x65, + 0xcd, 0xa6, 0xf8, 0x82, 0x8a, 0xbf, 0xee, 0x47, 0xb7, 0x42, 0xb2, 0xac, 0x30, 0xb0, 0x86, 0x6d, + 0xff, 0x46, 0x09, 0x20, 0xe6, 0xdb, 0xd1, 0xdb, 0xa9, 0x83, 0xeb, 0xd9, 0xee, 0x9c, 0xfe, 0xf1, + 0x9d, 0x5a, 0xe8, 0x07, 0x2c, 0x18, 0x75, 0x9a, 0x4d, 0xbf, 0xee, 0xf0, 0x68, 0xbf, 0x85, 0xee, + 0x07, 0xa7, 0x68, 0x7f, 0x21, 0xae, 0xc1, 0xbb, 0xf0, 0x82, 0x5c, 0xa1, 0x1a, 0xa4, 0x67, 0x2f, + 0xf4, 0x86, 0xd1, 0x07, 0xe5, 0x53, 0xb1, 0x68, 0x0c, 0xa5, 0x7a, 0x2a, 0x96, 0xd8, 0x1d, 0xa1, + 0xbf, 0x12, 0x6f, 0x19, 0xaf, 0xc4, 0x81, 0x7c, 0x8f, 0x41, 0x83, 0x7d, 0xed, 0xf5, 0x40, 0x44, + 0x55, 0x3d, 0x7a, 0xc0, 0x60, 0xbe, 0x7b, 0x9e, 0xf6, 0x4e, 0xea, 0x11, 0x39, 0xe0, 0xb3, 0x30, + 0xd9, 0x30, 0x99, 0x00, 0xb1, 0x12, 0x9f, 0xca, 0xa3, 0x9b, 0xe0, 0x19, 0xe2, 0x6b, 0x3f, 0x01, + 0xc0, 0x49, 0xc2, 0xa8, 0xca, 0x83, 0x49, 0xac, 0x7a, 0x5b, 0xbe, 0xf0, 0xf5, 0xb0, 0x73, 0xe7, + 0x72, 0x3f, 0x8c, 0x48, 0x8b, 0x62, 0xc6, 0xb7, 0xfb, 0xba, 0xa8, 0x8b, 0x15, 0x15, 0xf4, 0x3a, + 0x0c, 0x31, 0xff, 0xac, 0x70, 0x76, 0x24, 0x5f, 0xe2, 0x6c, 0x46, 0x47, 0x8b, 0x37, 0x24, 0xfb, + 0x1b, 0x62, 0x41, 0x01, 0x5d, 0x93, 0xde, 0x8f, 0xe1, 0xaa, 0x77, 0x2b, 0x24, 0xcc, 0xfb, 0xb1, + 0xb4, 0xf8, 0x64, 0xec, 0xd8, 0xc8, 0xcb, 0x33, 0x53, 0x96, 0x19, 0x35, 0x29, 0x17, 0x25, 0xfe, + 0xcb, 0x4c, 0x68, 0xb3, 0x90, 0xdf, 0x3d, 0x33, 0x5b, 0x5a, 0x3c, 0x9c, 0xb7, 0x4d, 0x12, 0x38, + 0x49, 0x93, 0x72, 0xa4, 0x7c, 0xd7, 0x0b, 0x6f, 0x91, 0x5e, 0x67, 0x07, 0x7f, 0x88, 0xb3, 0xdb, + 0x88, 0x97, 0x60, 0x51, 0xff, 0x44, 0xd9, 0x83, 0x39, 0x0f, 0xa6, 0x92, 0x5b, 0xf4, 0xa1, 0xb2, + 0x23, 0x7f, 0x38, 0x00, 0x13, 0xe6, 0x92, 0x42, 0x97, 0xa1, 0x24, 0x88, 0xa8, 0x6c, 0x02, 0x6a, + 0x97, 0xac, 0x49, 0x00, 0x8e, 0x71, 0x58, 0x12, 0x09, 0x56, 0x5d, 0x33, 0x0f, 0x8e, 0x93, 0x48, + 0x28, 0x08, 0xd6, 0xb0, 0xe8, 0xc3, 0x6a, 0xd3, 0xf7, 0x23, 0x75, 0x21, 0xa9, 0x75, 0xb7, 0xc8, + 0x4a, 0xb1, 0x80, 0xd2, 0x8b, 0x68, 0x97, 0x04, 0x1e, 0x69, 0x9a, 0x71, 0x87, 0xd5, 0x45, 0x74, + 0x5d, 0x07, 0x62, 0x13, 0x97, 0x5e, 0xa7, 0x7e, 0xc8, 0x16, 0xb2, 0x78, 0xbe, 0xc5, 0xe6, 0xd6, + 0x35, 0xee, 0x80, 0x2d, 0xe1, 0xe8, 0x13, 0xf0, 0x88, 0x8a, 0xad, 0x84, 0xb9, 0x36, 0x43, 0xb6, + 0x38, 0x64, 0x48, 0x5b, 0x1e, 0x59, 0xca, 0x46, 0xc3, 0x79, 0xf5, 0xd1, 0x6b, 0x30, 0x21, 0x58, + 0x7c, 0x49, 0x71, 0xd8, 0xb4, 0x30, 0xba, 0x6e, 0x40, 0x71, 0x02, 0x5b, 0x46, 0x4e, 0x66, 0x5c, + 0xb6, 0xa4, 0x30, 0x92, 0x8e, 0x9c, 0xac, 0xc3, 0x71, 0xaa, 0x06, 0x5a, 0x80, 0x49, 0xce, 0x83, + 0xb9, 0xde, 0x36, 0x9f, 0x13, 0xe1, 0xcc, 0xa5, 0xb6, 0xd4, 0x4d, 0x13, 0x8c, 0x93, 0xf8, 0xe8, + 0x65, 0x18, 0x73, 0x82, 0xfa, 0x8e, 0x1b, 0x91, 0x7a, 0xd4, 0x09, 0xb8, 0x97, 0x97, 0x66, 0xa2, + 0xb5, 0xa0, 0xc1, 0xb0, 0x81, 0x69, 0xbf, 0x0d, 0x33, 0x19, 0x91, 0x19, 0xe8, 0xc2, 0x71, 0xda, + 0xae, 0xfc, 0xa6, 0x84, 0x85, 0xf3, 0x42, 0x75, 0x55, 0x7e, 0x8d, 0x86, 0x45, 0x57, 0x27, 0x8b, + 0xe0, 0xa0, 0x25, 0x3e, 0x54, 0xab, 0x73, 0x45, 0x02, 0x70, 0x8c, 0x63, 0xff, 0xe7, 0x02, 0x4c, + 0x66, 0xe8, 0x56, 0x58, 0xf2, 0xbd, 0xc4, 0x23, 0x25, 0xce, 0xb5, 0x67, 0x06, 0xe2, 0x2e, 0x1c, + 0x21, 0x10, 0x77, 0xb1, 0x57, 0x20, 0xee, 0x81, 0x77, 0x12, 0x88, 0xdb, 0x1c, 0xb1, 0xc1, 0xbe, + 0x46, 0x2c, 0x23, 0x78, 0xf7, 0xd0, 0x11, 0x83, 0x77, 0x1b, 0x83, 0x3e, 0xdc, 0xc7, 0xa0, 0xff, + 0x58, 0x01, 0xa6, 0x92, 0xa6, 0xa4, 0x27, 0x20, 0xb7, 0x7d, 0xdd, 0x90, 0xdb, 0x5e, 0xea, 0xc7, + 0xf9, 0x36, 0x57, 0x86, 0x8b, 0x13, 0x32, 0xdc, 0x0f, 0xf4, 0x45, 0xad, 0xbb, 0x3c, 0xf7, 0xaf, + 0x16, 0xe0, 0x74, 0xa6, 0xf7, 0xef, 0x09, 0x8c, 0xcd, 0x4d, 0x63, 0x6c, 0x9e, 0xeb, 0xdb, 0x31, + 0x39, 0x77, 0x80, 0xee, 0x24, 0x06, 0xe8, 0x72, 0xff, 0x24, 0xbb, 0x8f, 0xd2, 0xd7, 0x8b, 0x70, + 0x3e, 0xb3, 0x5e, 0x2c, 0xf6, 0x5c, 0x31, 0xc4, 0x9e, 0xcf, 0x27, 0xc4, 0x9e, 0x76, 0xf7, 0xda, + 0xc7, 0x23, 0x07, 0x15, 0x0e, 0xba, 0x2c, 0xcc, 0xc0, 0x03, 0xca, 0x40, 0x0d, 0x07, 0x5d, 0x45, + 0x08, 0x9b, 0x74, 0xbf, 0x9d, 0x64, 0x9f, 0xff, 0xd2, 0x82, 0xb3, 0x99, 0x73, 0x73, 0x02, 0xb2, + 0xae, 0x75, 0x53, 0xd6, 0xf5, 0x74, 0xdf, 0xab, 0x35, 0x47, 0xf8, 0xf5, 0x95, 0xc1, 0x9c, 0x6f, + 0x61, 0x2f, 0xf9, 0x9b, 0x30, 0xea, 0xd4, 0xeb, 0x24, 0x0c, 0xd7, 0xfc, 0x86, 0x8a, 0x35, 0xfc, + 0x1c, 0x7b, 0x67, 0xc5, 0xc5, 0x87, 0x07, 0xe5, 0xb9, 0x24, 0x89, 0x18, 0x8c, 0x75, 0x0a, 0xe8, + 0x53, 0x30, 0x12, 0x8a, 0x7b, 0x53, 0xcc, 0xfd, 0x0b, 0x7d, 0x0e, 0x8e, 0xb3, 0x49, 0x9a, 0x66, + 0x30, 0x24, 0x25, 0xa9, 0x50, 0x24, 0xcd, 0xc0, 0x29, 0x85, 0x63, 0x0d, 0x9c, 0xf2, 0x3c, 0xc0, + 0x9e, 0x7a, 0x0c, 0x24, 0xe5, 0x0f, 0xda, 0x33, 0x41, 0xc3, 0x42, 0x1f, 0x83, 0xa9, 0x90, 0x47, + 0x0b, 0x5c, 0x6a, 0x3a, 0x21, 0xf3, 0xa3, 0x11, 0xab, 0x90, 0x05, 0x5c, 0xaa, 0x25, 0x60, 0x38, + 0x85, 0x8d, 0x56, 0x64, 0xab, 0x2c, 0xb4, 0x21, 0x5f, 0x98, 0x17, 0xe3, 0x16, 0x45, 0xea, 0xdf, + 0x53, 0xc9, 0xe1, 0x67, 0x03, 0xaf, 0xd5, 0x44, 0x9f, 0x02, 0xa0, 0xcb, 0x47, 0xc8, 0x21, 0x86, + 0xf3, 0x0f, 0x4f, 0x7a, 0xaa, 0x34, 0x32, 0x8d, 0x9b, 0x99, 0x4f, 0x6d, 0x45, 0x11, 0xc1, 0x1a, + 0x41, 0xb4, 0x05, 0xe3, 0xf1, 0xbf, 0x38, 0x33, 0xe6, 0x11, 0x5b, 0x60, 0x72, 0xef, 0x8a, 0x4e, + 0x07, 0x9b, 0x64, 0xed, 0x9f, 0x18, 0x86, 0x47, 0xbb, 0x9c, 0xc5, 0x68, 0xc1, 0xd4, 0xf7, 0x3e, + 0x93, 0x7c, 0xc4, 0xcf, 0x65, 0x56, 0x36, 0x5e, 0xf5, 0x89, 0x25, 0x5f, 0x78, 0xc7, 0x4b, 0xfe, + 0x47, 0x2c, 0x4d, 0xbc, 0xc2, 0x2d, 0x4b, 0x3f, 0x7a, 0xc4, 0x3b, 0xe6, 0x18, 0xe5, 0x2d, 0x5b, + 0x19, 0x42, 0x8b, 0xe7, 0xfb, 0xee, 0x4e, 0xff, 0x52, 0x8c, 0xaf, 0x5a, 0x80, 0x84, 0x78, 0x85, + 0x34, 0xd4, 0x86, 0x12, 0xf2, 0x8c, 0xab, 0x47, 0xfd, 0xfe, 0x85, 0x14, 0x25, 0x3e, 0x12, 0xaf, + 0xc8, 0xcb, 0x20, 0x8d, 0xd0, 0x73, 0x4c, 0x32, 0xba, 0x87, 0x3e, 0xc1, 0xa2, 0xe9, 0xba, 0x6f, + 0x0b, 0x0e, 0x48, 0x6c, 0xb8, 0x97, 0x44, 0x24, 0x5d, 0x55, 0x4e, 0x59, 0xdd, 0xcc, 0xee, 0xea, + 0x48, 0xd8, 0x20, 0x75, 0xb2, 0xef, 0xef, 0x0e, 0x3c, 0x92, 0x33, 0x64, 0x0f, 0xf5, 0x19, 0xfe, + 0xdb, 0x16, 0x9c, 0xeb, 0x1a, 0x16, 0xe6, 0x5b, 0x90, 0x41, 0xb4, 0x3f, 0x6f, 0x41, 0xf6, 0x64, + 0x1b, 0x66, 0x65, 0x97, 0xa1, 0x54, 0xa7, 0x85, 0x9a, 0x1f, 0x70, 0x1c, 0x20, 0x41, 0x02, 0x70, + 0x8c, 0x63, 0x58, 0x8f, 0x15, 0x7a, 0x5a, 0x8f, 0xfd, 0xaa, 0x05, 0xa9, 0x43, 0xfe, 0x04, 0xb8, + 0x8d, 0x55, 0x93, 0xdb, 0x78, 0xb2, 0x9f, 0xd1, 0xcc, 0x61, 0x34, 0xfe, 0x64, 0x12, 0xce, 0xe4, + 0xb8, 0xe5, 0xed, 0xc1, 0xf4, 0x76, 0x9d, 0x98, 0x1e, 0xd6, 0xdd, 0x22, 0x0f, 0x75, 0x75, 0xc7, + 0x66, 0xc9, 0x61, 0xa7, 0x53, 0x28, 0x38, 0xdd, 0x04, 0xfa, 0xbc, 0x05, 0xa7, 0x9c, 0xbb, 0xe1, + 0x32, 0xe5, 0x1a, 0xdd, 0xfa, 0x62, 0xd3, 0xaf, 0xef, 0xd2, 0x2b, 0x59, 0x6e, 0x84, 0x17, 0x33, + 0x25, 0x79, 0x77, 0x6a, 0x29, 0x7c, 0xa3, 0x79, 0x96, 0x2d, 0x37, 0x0b, 0x0b, 0x67, 0xb6, 0x85, + 0xb0, 0x48, 0xa1, 0x40, 0xdf, 0xa4, 0x5d, 0x62, 0x00, 0x64, 0xf9, 0x4f, 0x72, 0x36, 0x48, 0x42, + 0xb0, 0xa2, 0x83, 0x3e, 0x03, 0xa5, 0x6d, 0xe9, 0xee, 0x9b, 0xc1, 0x66, 0xc5, 0x03, 0xd9, 0xdd, + 0x09, 0x9a, 0xab, 0xe3, 0x15, 0x12, 0x8e, 0x89, 0xa2, 0xd7, 0xa0, 0xe8, 0x6d, 0x85, 0xdd, 0x12, + 0xce, 0x26, 0xec, 0x2e, 0x79, 0xa4, 0x8d, 0xf5, 0x95, 0x1a, 0xa6, 0x15, 0xd1, 0x35, 0x28, 0x06, + 0x9b, 0x0d, 0x21, 0x86, 0xce, 0xdc, 0xa4, 0x78, 0xb1, 0x92, 0xd3, 0x2b, 0x46, 0x09, 0x2f, 0x56, + 0x30, 0x25, 0x81, 0xaa, 0x30, 0xc8, 0x7c, 0xd9, 0x04, 0x53, 0x93, 0xf9, 0x7c, 0xeb, 0xe2, 0x13, + 0xca, 0xc3, 0x71, 0x30, 0x04, 0xcc, 0x09, 0xa1, 0x0d, 0x18, 0xaa, 0xb3, 0xe4, 0xa4, 0x82, 0x8b, + 0xf9, 0x60, 0xa6, 0xc0, 0xb9, 0x4b, 0xd6, 0x56, 0x21, 0x7f, 0x65, 0x18, 0x58, 0xd0, 0x62, 0x54, + 0x49, 0x7b, 0x67, 0x2b, 0x14, 0xc9, 0xbb, 0xb3, 0xa9, 0x76, 0x49, 0x46, 0x2c, 0xa8, 0x32, 0x0c, + 0x2c, 0x68, 0xa1, 0x57, 0xa0, 0xb0, 0x55, 0x17, 0x7e, 0x6a, 0x99, 0x92, 0x67, 0x33, 0x58, 0xca, + 0xe2, 0xd0, 0xfd, 0x83, 0x72, 0x61, 0x65, 0x09, 0x17, 0xb6, 0xea, 0x68, 0x1d, 0x86, 0xb7, 0x78, + 0x78, 0x05, 0x21, 0x5c, 0x7e, 0x2a, 0x3b, 0xf2, 0x43, 0x2a, 0x02, 0x03, 0xf7, 0x79, 0x12, 0x00, + 0x2c, 0x89, 0xb0, 0x8c, 0x04, 0x2a, 0x4c, 0x84, 0x88, 0x52, 0x37, 0x7f, 0xb4, 0xd0, 0x1e, 0x9c, + 0xc9, 0x8c, 0x83, 0x4d, 0x60, 0x8d, 0x22, 0x5d, 0xd5, 0xce, 0xdb, 0x9d, 0x80, 0x85, 0x02, 0x17, + 0xe1, 0x8c, 0x32, 0x57, 0xf5, 0x82, 0x44, 0xea, 0xb6, 0xaa, 0x15, 0x12, 0x8e, 0x89, 0xa2, 0x5d, + 0x18, 0xdf, 0x0b, 0xdb, 0x3b, 0x44, 0x6e, 0x69, 0x16, 0xdd, 0x28, 0x87, 0x3f, 0xba, 0x2d, 0x10, + 0xdd, 0x20, 0xea, 0x38, 0xcd, 0xd4, 0x29, 0xc4, 0x78, 0xd9, 0xdb, 0x3a, 0x31, 0x6c, 0xd2, 0xa6, + 0xc3, 0xff, 0x56, 0xc7, 0xdf, 0xdc, 0x8f, 0x88, 0x08, 0x2e, 0x97, 0x39, 0xfc, 0x6f, 0x70, 0x94, + 0xf4, 0xf0, 0x0b, 0x00, 0x96, 0x44, 0xd0, 0x6d, 0x31, 0x3c, 0xec, 0xf4, 0x9c, 0xca, 0x8f, 0x00, + 0xbb, 0x20, 0x91, 0x72, 0x06, 0x85, 0x9d, 0x96, 0x31, 0x29, 0x76, 0x4a, 0xb6, 0x77, 0xfc, 0xc8, + 0xf7, 0x12, 0x27, 0xf4, 0x74, 0xfe, 0x29, 0x59, 0xcd, 0xc0, 0x4f, 0x9f, 0x92, 0x59, 0x58, 0x38, + 0xb3, 0x2d, 0xd4, 0x80, 0x89, 0xb6, 0x1f, 0x44, 0x77, 0xfd, 0x40, 0xae, 0x2f, 0xd4, 0x45, 0x38, + 0x66, 0x60, 0x8a, 0x16, 0x59, 0xdc, 0x46, 0x13, 0x82, 0x13, 0x34, 0xd1, 0xc7, 0x61, 0x38, 0xac, + 0x3b, 0x4d, 0xb2, 0x7a, 0x73, 0x76, 0x26, 0xff, 0xfa, 0xa9, 0x71, 0x94, 0x9c, 0xd5, 0xc5, 0xa3, + 0x63, 0x70, 0x14, 0x2c, 0xc9, 0xa1, 0x15, 0x18, 0x64, 0x19, 0xe7, 0x58, 0x24, 0xc4, 0x9c, 0x40, + 0xb6, 0x29, 0x2b, 0x78, 0x7e, 0x36, 0xb1, 0x62, 0xcc, 0xab, 0xd3, 0x3d, 0x20, 0xde, 0x88, 0x7e, + 0x38, 0x7b, 0x3a, 0x7f, 0x0f, 0x88, 0xa7, 0xe5, 0xcd, 0x5a, 0xb7, 0x3d, 0xa0, 0x90, 0x70, 0x4c, + 0x94, 0x9e, 0xcc, 0xf4, 0x34, 0x3d, 0xd3, 0xc5, 0x7c, 0x2b, 0xf7, 0x2c, 0x65, 0x27, 0x33, 0x3d, + 0x49, 0x29, 0x09, 0xfb, 0xf7, 0x87, 0xd3, 0x3c, 0x0b, 0x93, 0x2a, 0x7c, 0x9f, 0x95, 0x52, 0x38, + 0x7f, 0xa8, 0x5f, 0x21, 0xe7, 0x31, 0x3e, 0x85, 0x3e, 0x6f, 0xc1, 0x99, 0x76, 0xe6, 0x87, 0x08, + 0x06, 0xa0, 0x3f, 0x59, 0x29, 0xff, 0x74, 0x15, 0x35, 0x33, 0x1b, 0x8e, 0x73, 0x5a, 0x4a, 0x3e, + 0x37, 0x8b, 0xef, 0xf8, 0xb9, 0xb9, 0x06, 0x23, 0x75, 0xfe, 0x14, 0xe9, 0x9a, 0xac, 0x3b, 0xf9, + 0xf6, 0x66, 0xac, 0x84, 0x78, 0xc3, 0x6c, 0x61, 0x45, 0x02, 0xfd, 0xa8, 0x05, 0xe7, 0x92, 0x5d, + 0xc7, 0x84, 0x81, 0x45, 0xa8, 0x4d, 0x2e, 0xd0, 0x58, 0x11, 0xdf, 0x9f, 0xe2, 0xff, 0x0d, 0xe4, + 0xc3, 0x5e, 0x08, 0xb8, 0x7b, 0x63, 0xa8, 0x92, 0x21, 0x51, 0x19, 0x32, 0xb5, 0x48, 0x7d, 0x48, + 0x55, 0x5e, 0x84, 0xb1, 0x96, 0xdf, 0xf1, 0x22, 0x61, 0xed, 0x25, 0x2c, 0x4f, 0x98, 0xc5, 0xc5, + 0x9a, 0x56, 0x8e, 0x0d, 0xac, 0x84, 0x2c, 0x66, 0xe4, 0x81, 0x65, 0x31, 0x6f, 0xc2, 0x98, 0xa7, + 0x99, 0x27, 0x0b, 0x7e, 0xe0, 0x62, 0x7e, 0x98, 0x5c, 0xdd, 0x98, 0x99, 0xf7, 0x52, 0x2f, 0xc1, + 0x06, 0xb5, 0x93, 0x35, 0x03, 0xfb, 0xb2, 0x95, 0xc1, 0xd4, 0x73, 0x51, 0xcc, 0x47, 0x4c, 0x51, + 0xcc, 0xc5, 0xa4, 0x28, 0x26, 0xa5, 0x41, 0x30, 0xa4, 0x30, 0xfd, 0x67, 0x01, 0xea, 0x37, 0xd4, + 0xa6, 0xdd, 0x84, 0x0b, 0xbd, 0xae, 0x25, 0x66, 0xf6, 0xd7, 0x50, 0xfa, 0xe2, 0xd8, 0xec, 0xaf, + 0xb1, 0x5a, 0xc1, 0x0c, 0xd2, 0x6f, 0x10, 0x27, 0xfb, 0x3f, 0x5a, 0x50, 0xac, 0xfa, 0x8d, 0x13, + 0x78, 0xf0, 0x7e, 0xd4, 0x78, 0xf0, 0x3e, 0x9a, 0x7d, 0x21, 0x36, 0x72, 0xf5, 0x1f, 0xcb, 0x09, + 0xfd, 0xc7, 0xb9, 0x3c, 0x02, 0xdd, 0xb5, 0x1d, 0x3f, 0x5d, 0x84, 0xd1, 0xaa, 0xdf, 0x50, 0x36, + 0xf7, 0xff, 0xe4, 0x41, 0x6c, 0xee, 0x73, 0x73, 0x59, 0x68, 0x94, 0x99, 0xb5, 0xa0, 0x74, 0x37, + 0xfe, 0x16, 0x33, 0xbd, 0xbf, 0x43, 0xdc, 0xed, 0x9d, 0x88, 0x34, 0x92, 0x9f, 0x73, 0x72, 0xa6, + 0xf7, 0xbf, 0x5f, 0x80, 0xc9, 0x44, 0xeb, 0xa8, 0x09, 0xe3, 0x4d, 0x5d, 0xba, 0x2e, 0xd6, 0xe9, + 0x03, 0x09, 0xe6, 0x85, 0xe9, 0xb2, 0x56, 0x84, 0x4d, 0xe2, 0x68, 0x1e, 0x40, 0xa9, 0x9b, 0xa5, + 0x78, 0x95, 0x71, 0xfd, 0x4a, 0x1f, 0x1d, 0x62, 0x0d, 0x03, 0xbd, 0x04, 0xa3, 0x91, 0xdf, 0xf6, + 0x9b, 0xfe, 0xf6, 0xfe, 0x75, 0x22, 0xe3, 0x7b, 0x29, 0x83, 0xc4, 0x8d, 0x18, 0x84, 0x75, 0x3c, + 0x74, 0x0f, 0xa6, 0x15, 0x91, 0xda, 0x31, 0x68, 0x1c, 0x98, 0x54, 0x61, 0x3d, 0x49, 0x11, 0xa7, + 0x1b, 0xb1, 0x7f, 0xb6, 0xc8, 0x87, 0xd8, 0x8b, 0xdc, 0xf7, 0x76, 0xc3, 0xbb, 0x7b, 0x37, 0x7c, + 0xdd, 0x82, 0x29, 0xda, 0x3a, 0xb3, 0xb6, 0x92, 0xd7, 0xbc, 0x0a, 0xcc, 0x6d, 0x75, 0x09, 0xcc, + 0x7d, 0x91, 0x9e, 0x9a, 0x0d, 0xbf, 0x13, 0x09, 0xd9, 0x9d, 0x76, 0x2c, 0xd2, 0x52, 0x2c, 0xa0, + 0x02, 0x8f, 0x04, 0x81, 0xf0, 0x10, 0xd5, 0xf1, 0x48, 0x10, 0x60, 0x01, 0x95, 0x71, 0xbb, 0x07, + 0xb2, 0xe3, 0x76, 0xf3, 0xf0, 0xab, 0xc2, 0x2e, 0x47, 0x30, 0x5c, 0x5a, 0xf8, 0x55, 0x69, 0xb0, + 0x13, 0xe3, 0xd8, 0x5f, 0x2d, 0xc2, 0x58, 0xd5, 0x6f, 0xc4, 0xaa, 0xe6, 0x17, 0x0d, 0x55, 0xf3, + 0x85, 0x84, 0xaa, 0x79, 0x4a, 0xc7, 0x7d, 0x4f, 0xb1, 0xfc, 0xcd, 0x52, 0x2c, 0xff, 0x43, 0x8b, + 0xcd, 0x5a, 0x65, 0xbd, 0xc6, 0x8d, 0xf7, 0xd0, 0x15, 0x18, 0x65, 0x07, 0x0c, 0x73, 0x49, 0x96, + 0xfa, 0x57, 0x96, 0x8f, 0x6a, 0x3d, 0x2e, 0xc6, 0x3a, 0x0e, 0xba, 0x04, 0x23, 0x21, 0x71, 0x82, + 0xfa, 0x8e, 0x3a, 0x5d, 0x85, 0xb2, 0x94, 0x97, 0x61, 0x05, 0x45, 0x6f, 0xc4, 0x91, 0x3f, 0x8b, + 0xf9, 0x2e, 0x8e, 0x7a, 0x7f, 0xf8, 0x16, 0xc9, 0x0f, 0xf7, 0x69, 0xdf, 0x01, 0x94, 0xc6, 0xef, + 0x23, 0x36, 0x5d, 0xd9, 0x8c, 0x4d, 0x57, 0x4a, 0xc5, 0xa5, 0xfb, 0x73, 0x0b, 0x26, 0xaa, 0x7e, + 0x83, 0x6e, 0xdd, 0x6f, 0xa7, 0x7d, 0xaa, 0x87, 0x3d, 0x1e, 0xea, 0x12, 0xf6, 0xf8, 0x09, 0x18, + 0xac, 0xfa, 0x8d, 0xd5, 0x6a, 0xb7, 0xf8, 0x02, 0xf6, 0x5f, 0xb3, 0x60, 0xb8, 0xea, 0x37, 0x4e, + 0x40, 0x2d, 0xf0, 0x11, 0x53, 0x2d, 0xf0, 0x48, 0xce, 0xba, 0xc9, 0xd1, 0x04, 0xfc, 0x95, 0x01, + 0x18, 0xa7, 0xfd, 0xf4, 0xb7, 0xe5, 0x54, 0x1a, 0xc3, 0x66, 0xf5, 0x31, 0x6c, 0x94, 0x0b, 0xf7, + 0x9b, 0x4d, 0xff, 0x6e, 0x72, 0x5a, 0x57, 0x58, 0x29, 0x16, 0x50, 0xf4, 0x2c, 0x8c, 0xb4, 0x03, + 0xb2, 0xe7, 0xfa, 0x82, 0xbd, 0xd5, 0x94, 0x2c, 0x55, 0x51, 0x8e, 0x15, 0x06, 0x7d, 0x16, 0x86, + 0xae, 0x47, 0xaf, 0xf2, 0xba, 0xef, 0x35, 0xb8, 0xe4, 0xbc, 0x28, 0x72, 0x73, 0x68, 0xe5, 0xd8, + 0xc0, 0x42, 0x77, 0xa0, 0xc4, 0xfe, 0xb3, 0x63, 0xe7, 0xe8, 0x59, 0x5e, 0x45, 0xd6, 0x3f, 0x41, + 0x00, 0xc7, 0xb4, 0xd0, 0xf3, 0x00, 0x91, 0x8c, 0x6f, 0x1f, 0x8a, 0x68, 0x6b, 0xea, 0x29, 0xa0, + 0x22, 0xdf, 0x87, 0x58, 0xc3, 0x42, 0xcf, 0x40, 0x29, 0x72, 0xdc, 0xe6, 0x0d, 0xd7, 0x23, 0x21, + 0x93, 0x88, 0x17, 0x65, 0xf2, 0x3d, 0x51, 0x88, 0x63, 0x38, 0x65, 0xc5, 0x58, 0x24, 0x0e, 0x9e, + 0x23, 0x7a, 0x84, 0x61, 0x33, 0x56, 0xec, 0x86, 0x2a, 0xc5, 0x1a, 0x06, 0xda, 0x81, 0xc7, 0x5c, + 0x8f, 0xe5, 0xb1, 0x20, 0xb5, 0x5d, 0xb7, 0xbd, 0x71, 0xa3, 0x76, 0x9b, 0x04, 0xee, 0xd6, 0xfe, + 0xa2, 0x53, 0xdf, 0x25, 0x9e, 0xcc, 0xdf, 0xf9, 0xa4, 0xe8, 0xe2, 0x63, 0xab, 0x5d, 0x70, 0x71, + 0x57, 0x4a, 0xf6, 0x0b, 0x6c, 0xbd, 0xdf, 0xac, 0xa1, 0x0f, 0x18, 0x47, 0xc7, 0x19, 0xfd, 0xe8, + 0x38, 0x3c, 0x28, 0x0f, 0xdd, 0xac, 0x69, 0x81, 0x24, 0x5e, 0x86, 0xd3, 0x55, 0xbf, 0x51, 0xf5, + 0x83, 0x68, 0xc5, 0x0f, 0xee, 0x3a, 0x41, 0x43, 0x2e, 0xaf, 0xb2, 0x0c, 0xa5, 0x41, 0xcf, 0xcf, + 0x41, 0x7e, 0xba, 0x18, 0x61, 0x32, 0x5e, 0x60, 0x1c, 0xdb, 0x11, 0x1d, 0xc0, 0xea, 0x8c, 0x77, + 0x50, 0x99, 0x60, 0xae, 0x3a, 0x11, 0x41, 0x37, 0x59, 0x86, 0xeb, 0xf8, 0x1a, 0x15, 0xd5, 0x9f, + 0xd6, 0x32, 0x5c, 0xc7, 0xc0, 0xcc, 0x7b, 0xd7, 0xac, 0x6f, 0xff, 0xa7, 0x41, 0x76, 0xa2, 0x26, + 0xb2, 0x89, 0xa0, 0x4f, 0xc3, 0x44, 0x48, 0x6e, 0xb8, 0x5e, 0xe7, 0x9e, 0x14, 0x61, 0x74, 0x71, + 0xe1, 0xab, 0x2d, 0xeb, 0x98, 0x5c, 0x10, 0x6a, 0x96, 0xe1, 0x04, 0x35, 0xd4, 0x82, 0x89, 0xbb, + 0xae, 0xd7, 0xf0, 0xef, 0x86, 0x92, 0xfe, 0x48, 0xbe, 0x3c, 0xf4, 0x0e, 0xc7, 0x4c, 0xf4, 0xd1, + 0x68, 0xee, 0x8e, 0x41, 0x0c, 0x27, 0x88, 0xd3, 0x55, 0x1b, 0x74, 0xbc, 0x85, 0xf0, 0x56, 0x48, + 0x02, 0x91, 0xab, 0x9c, 0xad, 0x5a, 0x2c, 0x0b, 0x71, 0x0c, 0xa7, 0xab, 0x96, 0xfd, 0xb9, 0x1a, + 0xf8, 0x1d, 0x9e, 0xba, 0x42, 0xac, 0x5a, 0xac, 0x4a, 0xb1, 0x86, 0x41, 0x77, 0x35, 0xfb, 0xb7, + 0xee, 0x7b, 0xd8, 0xf7, 0x23, 0x79, 0x0e, 0x30, 0x9d, 0xbe, 0x56, 0x8e, 0x0d, 0x2c, 0xb4, 0x02, + 0x28, 0xec, 0xb4, 0xdb, 0x4d, 0x66, 0x1b, 0xe4, 0x34, 0x19, 0x29, 0x6e, 0x2f, 0x51, 0xe4, 0xa1, + 0x77, 0x6b, 0x29, 0x28, 0xce, 0xa8, 0x41, 0x0f, 0xf8, 0x2d, 0xd1, 0xd5, 0x41, 0xd6, 0x55, 0xae, + 0x3b, 0xa9, 0xf1, 0x7e, 0x4a, 0x18, 0x5a, 0x86, 0xe1, 0x70, 0x3f, 0xac, 0x47, 0x22, 0x52, 0x62, + 0x4e, 0xc2, 0xa8, 0x1a, 0x43, 0xd1, 0xf2, 0x15, 0xf2, 0x2a, 0x58, 0xd6, 0x45, 0x75, 0x98, 0x11, + 0x14, 0x97, 0x76, 0x1c, 0x4f, 0xa5, 0xdf, 0xe1, 0x26, 0xd2, 0x57, 0xee, 0x1f, 0x94, 0x67, 0x44, + 0xcb, 0x3a, 0xf8, 0xf0, 0xa0, 0x7c, 0xa6, 0xea, 0x37, 0x32, 0x20, 0x38, 0x8b, 0x1a, 0x5f, 0x7c, + 0xf5, 0xba, 0xdf, 0x6a, 0x57, 0x03, 0x7f, 0xcb, 0x6d, 0x92, 0x6e, 0xfa, 0xa7, 0x9a, 0x81, 0x29, + 0x16, 0x9f, 0x51, 0x86, 0x13, 0xd4, 0xec, 0xef, 0x66, 0x4c, 0x10, 0x4b, 0xcf, 0x1d, 0x75, 0x02, + 0x82, 0x5a, 0x30, 0xde, 0x66, 0xdb, 0x44, 0x24, 0x94, 0x10, 0x6b, 0xfd, 0xc5, 0x3e, 0xe5, 0x28, + 0x77, 0xe9, 0xdd, 0x61, 0xda, 0x18, 0x55, 0x75, 0x72, 0xd8, 0xa4, 0x6e, 0xff, 0xe6, 0x23, 0xec, + 0x1a, 0xad, 0x71, 0xe1, 0xc8, 0xb0, 0xf0, 0xc8, 0x10, 0xef, 0xb1, 0xb9, 0x7c, 0x29, 0x5d, 0x3c, + 0x2d, 0xc2, 0xab, 0x03, 0xcb, 0xba, 0xe8, 0x53, 0x30, 0x41, 0x9f, 0x37, 0xea, 0x2a, 0x0b, 0x67, + 0x4f, 0xe5, 0x47, 0xce, 0x50, 0x58, 0x7a, 0xb2, 0x19, 0xbd, 0x32, 0x4e, 0x10, 0x43, 0x6f, 0x30, + 0x9b, 0x1e, 0x49, 0xba, 0xd0, 0x0f, 0x69, 0xdd, 0x7c, 0x47, 0x92, 0xd5, 0x88, 0xa0, 0x0e, 0xcc, + 0xa4, 0x53, 0xd3, 0x85, 0xb3, 0x76, 0x3e, 0x9f, 0x98, 0xce, 0x2e, 0x17, 0x67, 0x05, 0x49, 0xc3, + 0x42, 0x9c, 0x45, 0x1f, 0xdd, 0x80, 0x71, 0x91, 0xa3, 0x5a, 0xac, 0xdc, 0xa2, 0x21, 0x3c, 0x1c, + 0xc7, 0x3a, 0xf0, 0x30, 0x59, 0x80, 0xcd, 0xca, 0x68, 0x1b, 0xce, 0x69, 0x39, 0xa3, 0xae, 0x06, + 0x0e, 0xb3, 0x00, 0x70, 0xd9, 0x71, 0xaa, 0x5d, 0xf0, 0x8f, 0xdf, 0x3f, 0x28, 0x9f, 0xdb, 0xe8, + 0x86, 0x88, 0xbb, 0xd3, 0x41, 0x37, 0xe1, 0x34, 0xf7, 0xfb, 0xae, 0x10, 0xa7, 0xd1, 0x74, 0x3d, + 0xc5, 0x41, 0xf0, 0x2d, 0x7f, 0xf6, 0xfe, 0x41, 0xf9, 0xf4, 0x42, 0x16, 0x02, 0xce, 0xae, 0x87, + 0x3e, 0x02, 0xa5, 0x86, 0x17, 0x8a, 0x31, 0x18, 0x32, 0xd2, 0x72, 0x95, 0x2a, 0xeb, 0x35, 0xf5, + 0xfd, 0xf1, 0x1f, 0x1c, 0x57, 0x40, 0xdb, 0x5c, 0xc0, 0xac, 0xc4, 0x1e, 0xc3, 0xa9, 0xb8, 0x57, + 0x49, 0xc9, 0xa0, 0xe1, 0xf9, 0xc9, 0x35, 0x2b, 0xca, 0x21, 0xc2, 0x70, 0x0a, 0x35, 0x08, 0xa3, + 0xd7, 0x01, 0x89, 0xf0, 0xef, 0x0b, 0x75, 0x96, 0xad, 0x84, 0xc9, 0xe3, 0x47, 0x4c, 0x5f, 0xc4, + 0x5a, 0x0a, 0x03, 0x67, 0xd4, 0x42, 0xd7, 0xe8, 0xa9, 0xa2, 0x97, 0x8a, 0x53, 0x4b, 0x25, 0x51, + 0xac, 0x90, 0x76, 0x40, 0x98, 0x45, 0x93, 0x49, 0x11, 0x27, 0xea, 0xa1, 0x06, 0x3c, 0xe6, 0x74, + 0x22, 0x9f, 0xc9, 0xee, 0x4d, 0xd4, 0x0d, 0x7f, 0x97, 0x78, 0x4c, 0x6d, 0x36, 0xb2, 0x78, 0x81, + 0xb2, 0x28, 0x0b, 0x5d, 0xf0, 0x70, 0x57, 0x2a, 0x94, 0xb5, 0x54, 0x59, 0x93, 0xc1, 0x8c, 0xe6, + 0x95, 0x91, 0x39, 0xf9, 0x25, 0x18, 0xdd, 0xf1, 0xc3, 0x68, 0x9d, 0x44, 0x77, 0xfd, 0x60, 0x57, + 0x44, 0xa5, 0x8d, 0x63, 0x7c, 0xc7, 0x20, 0xac, 0xe3, 0xd1, 0xb7, 0x23, 0x33, 0xea, 0x58, 0xad, + 0x30, 0x7d, 0xfa, 0x48, 0x7c, 0xc6, 0x5c, 0xe3, 0xc5, 0x58, 0xc2, 0x25, 0xea, 0x6a, 0x75, 0x89, + 0xe9, 0xc6, 0x13, 0xa8, 0xab, 0xd5, 0x25, 0x2c, 0xe1, 0x74, 0xb9, 0x86, 0x3b, 0x4e, 0x40, 0xaa, + 0x81, 0x5f, 0x27, 0xa1, 0x16, 0x59, 0xfe, 0x51, 0x1e, 0x73, 0x97, 0x2e, 0xd7, 0x5a, 0x16, 0x02, + 0xce, 0xae, 0x87, 0x48, 0x3a, 0x5f, 0xda, 0x44, 0xbe, 0x52, 0x23, 0xcd, 0xcf, 0xf4, 0x99, 0x32, + 0xcd, 0x83, 0x29, 0x95, 0xa9, 0x8d, 0x47, 0xd9, 0x0d, 0x67, 0x27, 0xd9, 0xda, 0xee, 0x3f, 0x44, + 0xaf, 0x52, 0x13, 0xad, 0x26, 0x28, 0xe1, 0x14, 0x6d, 0x23, 0x60, 0xdb, 0x54, 0xcf, 0x80, 0x6d, + 0x97, 0xa1, 0x14, 0x76, 0x36, 0x1b, 0x7e, 0xcb, 0x71, 0x3d, 0xa6, 0x1b, 0xd7, 0x1e, 0x31, 0x35, + 0x09, 0xc0, 0x31, 0x0e, 0x5a, 0x81, 0x11, 0x47, 0xea, 0x80, 0x50, 0x7e, 0x88, 0x1e, 0xa5, 0xf9, + 0xe1, 0x51, 0x2b, 0xa4, 0xd6, 0x47, 0xd5, 0x45, 0xaf, 0xc2, 0xb8, 0xf0, 0x5b, 0x16, 0x49, 0x42, + 0x67, 0x4c, 0xe7, 0xb2, 0x9a, 0x0e, 0xc4, 0x26, 0x2e, 0xba, 0x05, 0xa3, 0x91, 0xdf, 0x64, 0x1e, + 0x52, 0x94, 0xcd, 0x3b, 0x93, 0x1f, 0x6c, 0x6e, 0x43, 0xa1, 0xe9, 0xe2, 0x57, 0x55, 0x15, 0xeb, + 0x74, 0xd0, 0x06, 0x5f, 0xef, 0x2c, 0x8e, 0x3c, 0x09, 0x67, 0x1f, 0xc9, 0xbf, 0x93, 0x54, 0xb8, + 0x79, 0x73, 0x3b, 0x88, 0x9a, 0x58, 0x27, 0x83, 0xae, 0xc2, 0x74, 0x3b, 0x70, 0x7d, 0xb6, 0x26, + 0x94, 0xfa, 0x6f, 0xd6, 0xcc, 0x1a, 0x55, 0x4d, 0x22, 0xe0, 0x74, 0x1d, 0xe6, 0x76, 0x2e, 0x0a, + 0x67, 0xcf, 0xf2, 0xcc, 0x17, 0xfc, 0x4d, 0xc8, 0xcb, 0xb0, 0x82, 0xa2, 0x35, 0x76, 0x12, 0x73, + 0x71, 0xc6, 0xec, 0x5c, 0x7e, 0x54, 0x20, 0x5d, 0xec, 0xc1, 0x99, 0x57, 0xf5, 0x17, 0xc7, 0x14, + 0x50, 0x43, 0x4b, 0x38, 0x49, 0x5f, 0x0c, 0xe1, 0xec, 0x63, 0x5d, 0x2c, 0xeb, 0x12, 0xcf, 0x8b, + 0x98, 0x21, 0x30, 0x8a, 0x43, 0x9c, 0xa0, 0x89, 0x3e, 0x06, 0x53, 0x22, 0x96, 0x61, 0x3c, 0x4c, + 0xe7, 0x62, 0xbb, 0x73, 0x9c, 0x80, 0xe1, 0x14, 0x36, 0xcf, 0x3c, 0xe1, 0x6c, 0x36, 0x89, 0x38, + 0xfa, 0x6e, 0xb8, 0xde, 0x6e, 0x38, 0x7b, 0x9e, 0x9d, 0x0f, 0x22, 0xf3, 0x44, 0x12, 0x8a, 0x33, + 0x6a, 0xa0, 0x0d, 0x98, 0x6a, 0x07, 0x84, 0xb4, 0x18, 0xa3, 0x2f, 0xee, 0xb3, 0x32, 0x8f, 0xba, + 0x40, 0x7b, 0x52, 0x4d, 0xc0, 0x0e, 0x33, 0xca, 0x70, 0x8a, 0x02, 0xba, 0x0b, 0x23, 0xfe, 0x1e, + 0x09, 0x76, 0x88, 0xd3, 0x98, 0xbd, 0xd0, 0xc5, 0x0f, 0x42, 0x5c, 0x6e, 0x37, 0x05, 0x6e, 0xc2, + 0x64, 0x40, 0x16, 0xf7, 0x36, 0x19, 0x90, 0x8d, 0xa1, 0xff, 0xdb, 0x82, 0xb3, 0x52, 0xcb, 0x50, + 0x6b, 0xd3, 0x51, 0x5f, 0xf2, 0xbd, 0x30, 0x0a, 0x78, 0x9c, 0x80, 0xc7, 0xf3, 0x7d, 0xe7, 0x37, + 0x72, 0x2a, 0x29, 0x89, 0xea, 0xd9, 0x3c, 0x8c, 0x10, 0xe7, 0xb7, 0x88, 0x96, 0x60, 0x3a, 0x24, + 0x91, 0x3c, 0x8c, 0x16, 0xc2, 0x95, 0x37, 0x2a, 0xeb, 0xb3, 0x4f, 0xf0, 0x20, 0x07, 0x74, 0x33, + 0xd4, 0x92, 0x40, 0x9c, 0xc6, 0x47, 0x57, 0xa0, 0xe0, 0x87, 0xb3, 0x4f, 0x76, 0xc9, 0x51, 0x4a, + 0x9f, 0xe2, 0xdc, 0x74, 0xec, 0x66, 0x0d, 0x17, 0xfc, 0x70, 0xee, 0x3b, 0x61, 0x3a, 0xc5, 0x31, + 0x1c, 0x25, 0xb7, 0xcf, 0xdc, 0x2e, 0x8c, 0x1b, 0xb3, 0xf2, 0x50, 0xb5, 0xd4, 0xff, 0x7c, 0x18, + 0x4a, 0x4a, 0x83, 0x89, 0x2e, 0x9b, 0x8a, 0xe9, 0xb3, 0x49, 0xc5, 0xf4, 0x48, 0xd5, 0x6f, 0x18, + 0xba, 0xe8, 0x8d, 0x8c, 0x68, 0x70, 0x79, 0x67, 0x40, 0xff, 0x06, 0xf2, 0x9a, 0x58, 0xb8, 0xd8, + 0xb7, 0x86, 0x7b, 0xa0, 0xab, 0xa4, 0xf9, 0x2a, 0x4c, 0x7b, 0x3e, 0x63, 0x53, 0x49, 0x43, 0xf2, + 0x20, 0x8c, 0xd5, 0x28, 0xe9, 0xe1, 0x55, 0x12, 0x08, 0x38, 0x5d, 0x87, 0x36, 0xc8, 0x79, 0x85, + 0xa4, 0x68, 0x9b, 0xb3, 0x12, 0x58, 0x40, 0xd1, 0x13, 0x30, 0xd8, 0xf6, 0x1b, 0xab, 0x55, 0xc1, + 0xa2, 0x6a, 0x31, 0x48, 0x1b, 0xab, 0x55, 0xcc, 0x61, 0x68, 0x01, 0x86, 0xd8, 0x8f, 0x70, 0x76, + 0x2c, 0x3f, 0x8e, 0x06, 0xab, 0xa1, 0x65, 0x4e, 0x62, 0x15, 0xb0, 0xa8, 0xc8, 0x44, 0x6c, 0x94, + 0xaf, 0x67, 0x22, 0xb6, 0xe1, 0x07, 0x14, 0xb1, 0x49, 0x02, 0x38, 0xa6, 0x85, 0xee, 0xc1, 0x69, + 0xe3, 0x2d, 0xc5, 0x97, 0x08, 0x09, 0x85, 0x2f, 0xff, 0x13, 0x5d, 0x1f, 0x51, 0x42, 0x23, 0x7e, + 0x4e, 0x74, 0xfa, 0xf4, 0x6a, 0x16, 0x25, 0x9c, 0xdd, 0x00, 0x6a, 0xc2, 0x74, 0x3d, 0xd5, 0xea, + 0x48, 0xff, 0xad, 0xaa, 0x09, 0x4d, 0xb7, 0x98, 0x26, 0x8c, 0x5e, 0x85, 0x91, 0xb7, 0xfc, 0x90, + 0x1d, 0xef, 0x82, 0xad, 0x96, 0x8e, 0xe0, 0x23, 0x6f, 0xdc, 0xac, 0xb1, 0xf2, 0xc3, 0x83, 0xf2, + 0x68, 0xd5, 0x6f, 0xc8, 0xbf, 0x58, 0x55, 0x40, 0x3f, 0x68, 0xc1, 0x5c, 0xfa, 0xb1, 0xa6, 0x3a, + 0x3d, 0xde, 0x7f, 0xa7, 0x6d, 0xd1, 0xe8, 0xdc, 0x72, 0x2e, 0x39, 0xdc, 0xa5, 0x29, 0xfb, 0x97, + 0x2d, 0x26, 0xa8, 0x13, 0x9a, 0x26, 0x12, 0x76, 0x9a, 0x27, 0x91, 0x30, 0x76, 0xd9, 0x50, 0x82, + 0x3d, 0xb0, 0x85, 0xc4, 0x3f, 0xb6, 0x98, 0x85, 0xc4, 0x09, 0xba, 0x42, 0xbc, 0x01, 0x23, 0x91, + 0x4c, 0xe4, 0xdb, 0x25, 0xc7, 0xad, 0xd6, 0x29, 0x66, 0x25, 0xa2, 0x98, 0x5c, 0x95, 0xb3, 0x57, + 0x91, 0xb1, 0xff, 0x1e, 0x9f, 0x01, 0x09, 0x39, 0x01, 0x5d, 0x43, 0xc5, 0xd4, 0x35, 0x94, 0x7b, + 0x7c, 0x41, 0x8e, 0xce, 0xe1, 0xef, 0x9a, 0xfd, 0x66, 0xc2, 0x9d, 0x77, 0xbb, 0x69, 0x8e, 0xfd, + 0x05, 0x0b, 0x20, 0x0e, 0xf1, 0xdc, 0x47, 0xaa, 0xb6, 0x97, 0x29, 0x5b, 0xeb, 0x47, 0x7e, 0xdd, + 0x6f, 0x0a, 0x4d, 0xda, 0x63, 0xb1, 0xba, 0x83, 0x97, 0x1f, 0x6a, 0xbf, 0xb1, 0xc2, 0x46, 0x65, + 0x19, 0x50, 0xae, 0x18, 0x2b, 0xe0, 0x8c, 0x60, 0x72, 0x5f, 0xb2, 0xe0, 0x54, 0x96, 0x5d, 0x2d, + 0x7d, 0x24, 0x71, 0x31, 0x97, 0x32, 0x9b, 0x52, 0xb3, 0x79, 0x5b, 0x94, 0x63, 0x85, 0xd1, 0x77, + 0x0e, 0xbc, 0xa3, 0xc5, 0x56, 0xbe, 0x09, 0xe3, 0xd5, 0x80, 0x68, 0x97, 0xeb, 0x6b, 0x3c, 0x48, + 0x01, 0xef, 0xcf, 0xb3, 0x47, 0x0e, 0x50, 0x60, 0x7f, 0xa5, 0x00, 0xa7, 0xb8, 0xf5, 0xc1, 0xc2, + 0x9e, 0xef, 0x36, 0xaa, 0x7e, 0x43, 0x78, 0x4f, 0x7d, 0x12, 0xc6, 0xda, 0x9a, 0x6c, 0xb2, 0x5b, + 0x9c, 0x50, 0x5d, 0x86, 0x19, 0x4b, 0x53, 0xf4, 0x52, 0x6c, 0xd0, 0x42, 0x0d, 0x18, 0x23, 0x7b, + 0x6e, 0x5d, 0xa9, 0xb0, 0x0b, 0x47, 0xbe, 0xe8, 0x54, 0x2b, 0xcb, 0x1a, 0x1d, 0x6c, 0x50, 0x7d, + 0x08, 0x99, 0xa9, 0xed, 0x1f, 0xb7, 0xe0, 0x91, 0x9c, 0xa8, 0xa2, 0xb4, 0xb9, 0xbb, 0xcc, 0xce, + 0x43, 0x2c, 0x5b, 0xd5, 0x1c, 0xb7, 0xfe, 0xc0, 0x02, 0x8a, 0x3e, 0x0e, 0xc0, 0xad, 0x37, 0xe8, + 0x2b, 0xbd, 0x57, 0xf8, 0x45, 0x23, 0x72, 0x9c, 0x16, 0x04, 0x4c, 0xd6, 0xc7, 0x1a, 0x2d, 0xfb, + 0x4b, 0x03, 0x30, 0xc8, 0xb3, 0xe8, 0x57, 0x61, 0x78, 0x87, 0xe7, 0x89, 0xe9, 0x3a, 0x6f, 0x14, + 0x57, 0xa6, 0x9e, 0x89, 0xe7, 0x4d, 0x2b, 0xc5, 0x92, 0x0c, 0x5a, 0x83, 0x19, 0x9e, 0xae, 0xa7, + 0x59, 0x21, 0x4d, 0x67, 0x5f, 0x8a, 0xfd, 0x78, 0x6e, 0x59, 0x25, 0xfe, 0x5c, 0x4d, 0xa3, 0xe0, + 0xac, 0x7a, 0xe8, 0x35, 0x98, 0xa0, 0xcf, 0x30, 0xbf, 0x13, 0x49, 0x4a, 0x3c, 0x51, 0x8f, 0x7a, + 0xf7, 0x6d, 0x18, 0x50, 0x9c, 0xc0, 0x46, 0xaf, 0xc2, 0x78, 0x3b, 0x25, 0xe0, 0x1c, 0x8c, 0x25, + 0x01, 0xa6, 0x50, 0xd3, 0xc4, 0x65, 0xa6, 0xb5, 0x1d, 0x66, 0x48, 0xbc, 0xb1, 0x13, 0x90, 0x70, + 0xc7, 0x6f, 0x36, 0x18, 0xfb, 0x37, 0xa8, 0x99, 0xd6, 0x26, 0xe0, 0x38, 0x55, 0x83, 0x52, 0xd9, + 0x72, 0xdc, 0x66, 0x27, 0x20, 0x31, 0x95, 0x21, 0x93, 0xca, 0x4a, 0x02, 0x8e, 0x53, 0x35, 0x7a, + 0x4b, 0x6e, 0x87, 0x8f, 0x47, 0x72, 0x6b, 0xff, 0xf5, 0x02, 0x18, 0x53, 0xfb, 0xed, 0x9b, 0x40, + 0x88, 0x7e, 0xd9, 0x76, 0xd0, 0xae, 0x0b, 0xcb, 0x98, 0xcc, 0x2f, 0x8b, 0xf3, 0x82, 0xf2, 0x2f, + 0xa3, 0xff, 0x31, 0xab, 0x45, 0xf7, 0xf8, 0xe9, 0x6a, 0xe0, 0xd3, 0x4b, 0x4e, 0x86, 0xb1, 0x52, + 0x16, 0xec, 0xc3, 0xd2, 0xbb, 0xb7, 0x4b, 0xc0, 0x47, 0x61, 0xe3, 0xcb, 0x29, 0x18, 0x46, 0x24, + 0x35, 0xe1, 0x6b, 0x2f, 0xa9, 0xa0, 0x2b, 0x30, 0x2a, 0xb2, 0xc2, 0x30, 0x43, 0x6b, 0xbe, 0x99, + 0x98, 0xd1, 0x4b, 0x25, 0x2e, 0xc6, 0x3a, 0x8e, 0xfd, 0x43, 0x05, 0x98, 0xc9, 0xf0, 0x94, 0xe1, + 0xd7, 0xc8, 0xb6, 0x1b, 0x46, 0x2a, 0xf5, 0xa8, 0x76, 0x8d, 0xf0, 0x72, 0xac, 0x30, 0xe8, 0x59, + 0xc5, 0x2f, 0xaa, 0xe4, 0xe5, 0x24, 0x2c, 0xd1, 0x05, 0xf4, 0x88, 0x49, 0x3c, 0x2f, 0xc0, 0x40, + 0x27, 0x24, 0x32, 0x54, 0xab, 0xba, 0xb6, 0x99, 0x5a, 0x93, 0x41, 0xe8, 0x33, 0x6a, 0x5b, 0x69, + 0x08, 0xb5, 0x67, 0x14, 0xd7, 0x11, 0x72, 0x18, 0xed, 0x5c, 0x44, 0x3c, 0xc7, 0x8b, 0xc4, 0x63, + 0x2b, 0x8e, 0x39, 0xc8, 0x4a, 0xb1, 0x80, 0xda, 0x5f, 0x2c, 0xc2, 0xd9, 0x5c, 0xdf, 0x39, 0xda, + 0xf5, 0x96, 0xef, 0xb9, 0x91, 0xaf, 0xac, 0x89, 0x78, 0x9c, 0x41, 0xd2, 0xde, 0x59, 0x13, 0xe5, + 0x58, 0x61, 0xa0, 0x8b, 0x30, 0xc8, 0x84, 0xa2, 0xa9, 0x24, 0xac, 0x8b, 0x15, 0x1e, 0x78, 0x8a, + 0x83, 0xfb, 0xce, 0x9b, 0xfd, 0x04, 0xe5, 0x60, 0xfc, 0x66, 0xf2, 0x42, 0xa1, 0xdd, 0xf5, 0xfd, + 0x26, 0x66, 0x40, 0xf4, 0x7e, 0x31, 0x5e, 0x09, 0xf3, 0x19, 0xec, 0x34, 0xfc, 0x50, 0x1b, 0xb4, + 0xa7, 0x61, 0x78, 0x97, 0xec, 0x07, 0xae, 0xb7, 0x9d, 0x34, 0xab, 0xba, 0xce, 0x8b, 0xb1, 0x84, + 0x9b, 0x59, 0x03, 0x87, 0x8f, 0x3b, 0xe1, 0xf5, 0x48, 0x4f, 0xf6, 0xe4, 0x47, 0x8a, 0x30, 0x89, + 0x17, 0x2b, 0xef, 0x4d, 0xc4, 0xad, 0xf4, 0x44, 0x1c, 0x77, 0xc2, 0xeb, 0xde, 0xb3, 0xf1, 0x0b, + 0x16, 0x4c, 0xb2, 0xdc, 0x34, 0xc2, 0x43, 0xde, 0xf5, 0xbd, 0x13, 0x78, 0x0a, 0x3c, 0x01, 0x83, + 0x01, 0x6d, 0x34, 0x99, 0x7d, 0x95, 0xf5, 0x04, 0x73, 0x18, 0x7a, 0x0c, 0x06, 0x58, 0x17, 0xe8, + 0xe4, 0x8d, 0xf1, 0x23, 0xb8, 0xe2, 0x44, 0x0e, 0x66, 0xa5, 0x2c, 0xec, 0x12, 0x26, 0xed, 0xa6, + 0xcb, 0x3b, 0x1d, 0xab, 0xac, 0xdf, 0x1d, 0x5e, 0xf5, 0x99, 0x5d, 0x7b, 0x67, 0x61, 0x97, 0xb2, + 0x49, 0x76, 0x7f, 0x66, 0xff, 0x71, 0x01, 0xce, 0x67, 0xd6, 0xeb, 0x3b, 0xec, 0x52, 0xf7, 0xda, + 0x0f, 0x33, 0xfb, 0x48, 0xf1, 0x04, 0x8d, 0x56, 0x07, 0xfa, 0xe5, 0xfe, 0x07, 0xfb, 0x88, 0x86, + 0x94, 0x39, 0x64, 0xef, 0x92, 0x68, 0x48, 0x99, 0x7d, 0xcb, 0x11, 0x13, 0xfc, 0x45, 0x21, 0xe7, + 0x5b, 0x98, 0xc0, 0xe0, 0x12, 0x3d, 0x67, 0x18, 0x30, 0x94, 0x8f, 0x70, 0x7e, 0xc6, 0xf0, 0x32, + 0xac, 0xa0, 0x68, 0x01, 0x26, 0x5b, 0xae, 0x47, 0x0f, 0x9f, 0x7d, 0x93, 0x15, 0x57, 0xc1, 0xea, + 0xd6, 0x4c, 0x30, 0x4e, 0xe2, 0x23, 0x57, 0x8b, 0x94, 0xc4, 0xbf, 0xee, 0xd5, 0x23, 0xed, 0xba, + 0x79, 0x53, 0x9d, 0xaf, 0x46, 0x31, 0x23, 0x6a, 0xd2, 0x9a, 0x26, 0x27, 0x2a, 0xf6, 0x2f, 0x27, + 0x1a, 0xcb, 0x96, 0x11, 0xcd, 0xbd, 0x0a, 0xe3, 0x0f, 0xac, 0x18, 0xb0, 0xbf, 0x5e, 0x84, 0x47, + 0xbb, 0x6c, 0x7b, 0x7e, 0xd6, 0x1b, 0x73, 0xa0, 0x9d, 0xf5, 0xa9, 0x79, 0xa8, 0xc2, 0xa9, 0xad, + 0x4e, 0xb3, 0xb9, 0xcf, 0x7c, 0x39, 0x48, 0x43, 0x62, 0x08, 0x9e, 0x52, 0x0a, 0x47, 0x4e, 0xad, + 0x64, 0xe0, 0xe0, 0xcc, 0x9a, 0xf4, 0x89, 0x45, 0x6f, 0x92, 0x7d, 0x45, 0x2a, 0xf1, 0xc4, 0xc2, + 0x3a, 0x10, 0x9b, 0xb8, 0xe8, 0x2a, 0x4c, 0x3b, 0x7b, 0x8e, 0xcb, 0xc3, 0x4d, 0x4b, 0x02, 0xfc, + 0x8d, 0xa5, 0xe4, 0xb9, 0x0b, 0x49, 0x04, 0x9c, 0xae, 0x83, 0x5e, 0x07, 0xe4, 0x6f, 0x32, 0x8b, + 0xef, 0xc6, 0x55, 0xe2, 0x09, 0xad, 0x2b, 0x9b, 0xbb, 0x62, 0x7c, 0x24, 0xdc, 0x4c, 0x61, 0xe0, + 0x8c, 0x5a, 0x89, 0x88, 0x40, 0x43, 0xf9, 0x11, 0x81, 0xba, 0x9f, 0x8b, 0x3d, 0x13, 0xdf, 0xfc, + 0x5b, 0x8b, 0x5e, 0x5f, 0x9c, 0xc9, 0x37, 0x03, 0x68, 0xbe, 0xca, 0xac, 0x26, 0xb9, 0xac, 0x57, + 0x8b, 0x9f, 0x72, 0x5a, 0xb3, 0x9a, 0x8c, 0x81, 0xd8, 0xc4, 0xe5, 0x0b, 0x22, 0x8c, 0xdd, 0x76, + 0x0d, 0x16, 0x5f, 0x44, 0xf9, 0x52, 0x18, 0xe8, 0x13, 0x30, 0xdc, 0x70, 0xf7, 0xdc, 0x50, 0x48, + 0xba, 0x8e, 0xac, 0x56, 0x8a, 0xcf, 0xc1, 0x0a, 0x27, 0x83, 0x25, 0x3d, 0xfb, 0x47, 0x0a, 0x30, + 0x2e, 0x5b, 0x7c, 0xa3, 0xe3, 0x47, 0xce, 0x09, 0x5c, 0xcb, 0x57, 0x8d, 0x6b, 0xf9, 0xfd, 0xdd, + 0x42, 0x9d, 0xb1, 0x2e, 0xe5, 0x5e, 0xc7, 0x37, 0x13, 0xd7, 0xf1, 0x53, 0xbd, 0x49, 0x75, 0xbf, + 0x86, 0xff, 0xbe, 0x05, 0xd3, 0x06, 0xfe, 0x09, 0xdc, 0x06, 0x2b, 0xe6, 0x6d, 0xf0, 0x78, 0xcf, + 0x6f, 0xc8, 0xb9, 0x05, 0xbe, 0xbf, 0x98, 0xe8, 0x3b, 0x3b, 0xfd, 0xdf, 0x82, 0x81, 0x1d, 0x27, + 0x68, 0x74, 0x4b, 0xed, 0x90, 0xaa, 0x34, 0x7f, 0xcd, 0x09, 0x84, 0xda, 0xf9, 0x59, 0x39, 0xea, + 0xb4, 0xa8, 0xa7, 0xca, 0x99, 0x35, 0x85, 0x5e, 0x86, 0xa1, 0xb0, 0xee, 0xb7, 0x95, 0x27, 0xc7, + 0x05, 0x36, 0xd0, 0xac, 0xe4, 0xf0, 0xa0, 0x8c, 0xcc, 0xe6, 0x68, 0x31, 0x16, 0xf8, 0xe8, 0x93, + 0x30, 0xce, 0x7e, 0x29, 0x1b, 0xb0, 0x62, 0xbe, 0x38, 0xa2, 0xa6, 0x23, 0x72, 0x03, 0x49, 0xa3, + 0x08, 0x9b, 0xa4, 0xe6, 0xb6, 0xa1, 0xa4, 0x3e, 0xeb, 0xa1, 0xea, 0x6d, 0xff, 0x75, 0x11, 0x66, + 0x32, 0xd6, 0x1c, 0x0a, 0x8d, 0x99, 0xb8, 0xd2, 0xe7, 0x52, 0x7d, 0x87, 0x73, 0x11, 0xb2, 0xd7, + 0x50, 0x43, 0xac, 0xad, 0xbe, 0x1b, 0xbd, 0x15, 0x92, 0x64, 0xa3, 0xb4, 0xa8, 0x77, 0xa3, 0xb4, + 0xb1, 0x13, 0x1b, 0x6a, 0xda, 0x90, 0xea, 0xe9, 0x43, 0x9d, 0xd3, 0x3f, 0x2b, 0xc2, 0xa9, 0xac, + 0xe8, 0x8b, 0xe8, 0x73, 0x89, 0xc4, 0xa2, 0x2f, 0xf6, 0x1b, 0xb7, 0x91, 0x67, 0x1b, 0x15, 0x01, + 0xe1, 0xe6, 0xcd, 0x54, 0xa3, 0x3d, 0x87, 0x59, 0xb4, 0xc9, 0x42, 0x52, 0x04, 0x3c, 0x21, 0xac, + 0x3c, 0x3e, 0x3e, 0xd4, 0x77, 0x07, 0x44, 0x26, 0xd9, 0x30, 0x61, 0x5f, 0x22, 0x8b, 0x7b, 0xdb, + 0x97, 0xc8, 0x96, 0xe7, 0x5c, 0x18, 0xd5, 0xbe, 0xe6, 0xa1, 0xce, 0xf8, 0x2e, 0xbd, 0xad, 0xb4, + 0x7e, 0x3f, 0xd4, 0x59, 0xff, 0x71, 0x0b, 0x12, 0x2e, 0x07, 0x4a, 0x2c, 0x66, 0xe5, 0x8a, 0xc5, + 0x2e, 0xc0, 0x40, 0xe0, 0x37, 0x49, 0x32, 0x03, 0x27, 0xf6, 0x9b, 0x04, 0x33, 0x08, 0xc5, 0x88, + 0x62, 0x61, 0xc7, 0x98, 0xfe, 0x90, 0x13, 0x4f, 0xb4, 0x27, 0x60, 0xb0, 0x49, 0xf6, 0x48, 0x33, + 0x99, 0x28, 0xe9, 0x06, 0x2d, 0xc4, 0x1c, 0x66, 0xff, 0xc2, 0x00, 0x9c, 0xeb, 0x1a, 0xd4, 0x85, + 0x3e, 0x87, 0xb6, 0x9d, 0x88, 0xdc, 0x75, 0xf6, 0x93, 0x19, 0x4d, 0xae, 0xf2, 0x62, 0x2c, 0xe1, + 0xcc, 0x93, 0x8c, 0x07, 0x26, 0x4f, 0x08, 0x11, 0x45, 0x3c, 0x72, 0x01, 0x35, 0x85, 0x52, 0xc5, + 0xe3, 0x10, 0x4a, 0x3d, 0x0f, 0x10, 0x86, 0x4d, 0x6e, 0x98, 0xd5, 0x10, 0x2e, 0x6a, 0x71, 0x00, + 0xfb, 0xda, 0x0d, 0x01, 0xc1, 0x1a, 0x16, 0xaa, 0xc0, 0x54, 0x3b, 0xf0, 0x23, 0x2e, 0x93, 0xad, + 0x70, 0xdb, 0xc5, 0x41, 0x33, 0x9e, 0x46, 0x35, 0x01, 0xc7, 0xa9, 0x1a, 0xe8, 0x25, 0x18, 0x15, + 0x31, 0x36, 0xaa, 0xbe, 0xdf, 0x14, 0x62, 0x20, 0x65, 0xce, 0x57, 0x8b, 0x41, 0x58, 0xc7, 0xd3, + 0xaa, 0x31, 0x41, 0xef, 0x70, 0x66, 0x35, 0x2e, 0xec, 0xd5, 0xf0, 0x12, 0x91, 0x58, 0x47, 0xfa, + 0x8a, 0xc4, 0x1a, 0x0b, 0xc6, 0x4a, 0x7d, 0xeb, 0x1d, 0xa1, 0xa7, 0x28, 0xe9, 0xe7, 0x06, 0x60, + 0x46, 0x2c, 0x9c, 0x87, 0xbd, 0x5c, 0x6e, 0xa5, 0x97, 0xcb, 0x71, 0x88, 0xce, 0xde, 0x5b, 0x33, + 0x27, 0xbd, 0x66, 0x7e, 0xd4, 0x02, 0x93, 0xbd, 0x42, 0xff, 0x47, 0x6e, 0x4a, 0xa8, 0x97, 0x72, + 0xd9, 0x35, 0x15, 0xd5, 0xf3, 0x1d, 0x26, 0x87, 0xb2, 0xff, 0x8d, 0x05, 0x8f, 0xf7, 0xa4, 0x88, + 0x96, 0xa1, 0xc4, 0x78, 0x40, 0xed, 0x75, 0xf6, 0x94, 0xb2, 0x6d, 0x96, 0x80, 0x1c, 0x96, 0x34, + 0xae, 0x89, 0x96, 0x53, 0xb9, 0xb7, 0x9e, 0xce, 0xc8, 0xbd, 0x75, 0xda, 0x18, 0x9e, 0x07, 0x4c, + 0xbe, 0xf5, 0xc3, 0xf4, 0xc6, 0x31, 0xfc, 0x8a, 0xd0, 0x87, 0x0c, 0xb1, 0x9f, 0x9d, 0x10, 0xfb, + 0x21, 0x13, 0x5b, 0xbb, 0x43, 0x3e, 0x06, 0x53, 0x2c, 0xf8, 0x16, 0xb3, 0xb4, 0x17, 0x1e, 0x4f, + 0x85, 0xd8, 0x9a, 0xf6, 0x46, 0x02, 0x86, 0x53, 0xd8, 0xf6, 0x1f, 0x15, 0x61, 0x88, 0x6f, 0xbf, + 0x13, 0x78, 0x13, 0x3e, 0x03, 0x25, 0xb7, 0xd5, 0xea, 0xf0, 0x74, 0x4a, 0x83, 0xdc, 0x37, 0x9a, + 0xce, 0xd3, 0xaa, 0x2c, 0xc4, 0x31, 0x1c, 0xad, 0x08, 0x89, 0x73, 0x97, 0xf8, 0x9e, 0xbc, 0xe3, + 0xf3, 0x15, 0x27, 0x72, 0x38, 0x83, 0xa3, 0xee, 0xd9, 0x58, 0x36, 0x8d, 0x3e, 0x0d, 0x10, 0x46, + 0x81, 0xeb, 0x6d, 0xd3, 0x32, 0x11, 0x56, 0xf8, 0x03, 0x5d, 0xa8, 0xd5, 0x14, 0x32, 0xa7, 0x19, + 0x9f, 0x39, 0x0a, 0x80, 0x35, 0x8a, 0x68, 0xde, 0xb8, 0xe9, 0xe7, 0x12, 0x73, 0x07, 0x9c, 0x6a, + 0x3c, 0x67, 0x73, 0x1f, 0x86, 0x92, 0x22, 0xde, 0x4b, 0xfe, 0x34, 0xa6, 0xb3, 0x45, 0x1f, 0x85, + 0xc9, 0x44, 0xdf, 0x8e, 0x24, 0xbe, 0xfa, 0x45, 0x0b, 0x26, 0x79, 0x67, 0x96, 0xbd, 0x3d, 0x71, + 0x1b, 0xbc, 0x0d, 0xa7, 0x9a, 0x19, 0xa7, 0xb2, 0x98, 0xfe, 0xfe, 0x4f, 0x71, 0x25, 0xae, 0xca, + 0x82, 0xe2, 0xcc, 0x36, 0xd0, 0x25, 0xba, 0xe3, 0xe8, 0xa9, 0xeb, 0x34, 0x85, 0xab, 0xf4, 0x18, + 0xdf, 0x6d, 0xbc, 0x0c, 0x2b, 0xa8, 0xfd, 0xbb, 0x16, 0x4c, 0xf3, 0x9e, 0x5f, 0x27, 0xfb, 0xea, + 0x6c, 0xfa, 0x66, 0xf6, 0x5d, 0x24, 0xf2, 0x2b, 0xe4, 0x24, 0xf2, 0xd3, 0x3f, 0xad, 0xd8, 0xf5, + 0xd3, 0xbe, 0x62, 0x81, 0x58, 0x21, 0x27, 0x20, 0x84, 0xf8, 0x4e, 0x53, 0x08, 0x31, 0x97, 0xbf, + 0x09, 0x72, 0xa4, 0x0f, 0x7f, 0x6e, 0xc1, 0x14, 0x47, 0x88, 0xb5, 0xe5, 0xdf, 0xd4, 0x79, 0xe8, + 0x27, 0xdd, 0xf7, 0x75, 0xb2, 0xbf, 0xe1, 0x57, 0x9d, 0x68, 0x27, 0xfb, 0xa3, 0x8c, 0xc9, 0x1a, + 0xe8, 0x3a, 0x59, 0x0d, 0xb9, 0x81, 0x8c, 0x3c, 0x37, 0x3d, 0xe2, 0x47, 0x1c, 0x35, 0xcf, 0x8d, + 0xfd, 0x0d, 0x0b, 0x10, 0x6f, 0xc6, 0x60, 0xdc, 0x28, 0x3b, 0xc4, 0x4a, 0xb5, 0x8b, 0x2e, 0x3e, + 0x9a, 0x14, 0x04, 0x6b, 0x58, 0xc7, 0x32, 0x3c, 0x09, 0x93, 0x87, 0x62, 0x6f, 0x93, 0x87, 0x23, + 0x8c, 0xe8, 0xbf, 0x18, 0x82, 0xa4, 0x6f, 0x15, 0xba, 0x0d, 0x63, 0x75, 0xa7, 0xed, 0x6c, 0xba, + 0x4d, 0x37, 0x72, 0x49, 0xd8, 0xcd, 0x1e, 0x6a, 0x49, 0xc3, 0x13, 0x4a, 0x6a, 0xad, 0x04, 0x1b, + 0x74, 0xd0, 0x3c, 0x40, 0x3b, 0x70, 0xf7, 0xdc, 0x26, 0xd9, 0x66, 0xb2, 0x12, 0x16, 0x9c, 0x81, + 0x1b, 0x67, 0xc9, 0x52, 0xac, 0x61, 0x64, 0x38, 0xb2, 0x17, 0x1f, 0xb2, 0x23, 0x3b, 0x9c, 0x98, + 0x23, 0xfb, 0xc0, 0x91, 0x1c, 0xd9, 0x47, 0x8e, 0xec, 0xc8, 0x3e, 0xd8, 0x97, 0x23, 0x3b, 0x86, + 0x33, 0x92, 0xf7, 0xa4, 0xff, 0x57, 0xdc, 0x26, 0x11, 0x0f, 0x0e, 0x1e, 0x51, 0x62, 0xee, 0xfe, + 0x41, 0xf9, 0x0c, 0xce, 0xc4, 0xc0, 0x39, 0x35, 0xd1, 0xc7, 0x61, 0xd6, 0x69, 0x36, 0xfd, 0xbb, + 0x6a, 0x52, 0x97, 0xc3, 0xba, 0xd3, 0xe4, 0x4a, 0x88, 0x61, 0x46, 0xf5, 0xb1, 0xfb, 0x07, 0xe5, + 0xd9, 0x85, 0x1c, 0x1c, 0x9c, 0x5b, 0x1b, 0x7d, 0x04, 0x4a, 0xed, 0xc0, 0xaf, 0xaf, 0x69, 0x0e, + 0xa0, 0xe7, 0xe9, 0x00, 0x56, 0x65, 0xe1, 0xe1, 0x41, 0x79, 0x5c, 0xfd, 0x61, 0x17, 0x7e, 0x5c, + 0x21, 0xc3, 0x33, 0x7d, 0xf4, 0x58, 0x3d, 0xd3, 0x77, 0x61, 0xa6, 0x46, 0x02, 0xd7, 0x69, 0xba, + 0x6f, 0x53, 0x7e, 0x59, 0x9e, 0x4f, 0x1b, 0x50, 0x0a, 0x12, 0x27, 0x72, 0x5f, 0x31, 0x37, 0xb5, + 0x84, 0x23, 0xf2, 0x04, 0x8e, 0x09, 0xd9, 0xff, 0xdd, 0x82, 0x61, 0xe1, 0x4b, 0x75, 0x02, 0x5c, + 0xe3, 0x82, 0xa1, 0x49, 0x28, 0x67, 0x0f, 0x18, 0xeb, 0x4c, 0xae, 0x0e, 0x61, 0x35, 0xa1, 0x43, + 0x78, 0xbc, 0x1b, 0x91, 0xee, 0xda, 0x83, 0xbf, 0x5c, 0xa4, 0xdc, 0xbb, 0xe1, 0xd5, 0xfb, 0xf0, + 0x87, 0x60, 0x1d, 0x86, 0x43, 0xe1, 0x55, 0x5a, 0xc8, 0xf7, 0x69, 0x48, 0x4e, 0x62, 0x6c, 0xc7, + 0x26, 0xfc, 0x48, 0x25, 0x91, 0x4c, 0x77, 0xd5, 0xe2, 0x43, 0x74, 0x57, 0xed, 0xe5, 0xf7, 0x3c, + 0x70, 0x1c, 0x7e, 0xcf, 0xf6, 0xd7, 0xd8, 0xcd, 0xa9, 0x97, 0x9f, 0x00, 0x53, 0x75, 0xd5, 0xbc, + 0x63, 0xed, 0x2e, 0x2b, 0x4b, 0x74, 0x2a, 0x87, 0xb9, 0xfa, 0x79, 0x0b, 0xce, 0x65, 0x7c, 0x95, + 0xc6, 0x69, 0x3d, 0x0b, 0x23, 0x4e, 0xa7, 0xe1, 0xaa, 0xbd, 0xac, 0xe9, 0x13, 0x17, 0x44, 0x39, + 0x56, 0x18, 0x68, 0x09, 0xa6, 0xc9, 0xbd, 0xb6, 0xcb, 0x55, 0xa9, 0xba, 0xf9, 0x6f, 0x91, 0x3b, + 0xe0, 0x2d, 0x27, 0x81, 0x38, 0x8d, 0xaf, 0x62, 0xcd, 0x14, 0x73, 0x63, 0xcd, 0xfc, 0x2d, 0x0b, + 0x46, 0x95, 0x5f, 0xe5, 0x43, 0x1f, 0xed, 0x8f, 0x99, 0xa3, 0xfd, 0x68, 0x97, 0xd1, 0xce, 0x19, + 0xe6, 0xdf, 0x2e, 0xa8, 0xfe, 0x56, 0xfd, 0x20, 0xea, 0x83, 0x83, 0x7b, 0x70, 0xd7, 0x85, 0x2b, + 0x30, 0xea, 0xb4, 0xdb, 0x12, 0x20, 0x6d, 0xd0, 0x58, 0x04, 0xe5, 0xb8, 0x18, 0xeb, 0x38, 0xca, + 0x93, 0xa2, 0x98, 0xeb, 0x49, 0xd1, 0x00, 0x88, 0x9c, 0x60, 0x9b, 0x44, 0xb4, 0x4c, 0x98, 0xcc, + 0xe6, 0x9f, 0x37, 0x9d, 0xc8, 0x6d, 0xce, 0xbb, 0x5e, 0x14, 0x46, 0xc1, 0xfc, 0xaa, 0x17, 0xdd, + 0x0c, 0xf8, 0x13, 0x52, 0x8b, 0xd6, 0xa4, 0x68, 0x61, 0x8d, 0xae, 0x8c, 0x21, 0xc0, 0xda, 0x18, + 0x34, 0x8d, 0x19, 0xd6, 0x45, 0x39, 0x56, 0x18, 0xf6, 0x87, 0xd9, 0xed, 0xc3, 0xc6, 0xf4, 0x68, + 0x91, 0x8a, 0xbe, 0x32, 0xa6, 0x66, 0x83, 0x69, 0x32, 0x2b, 0x7a, 0x3c, 0xa4, 0xee, 0x87, 0x3d, + 0x6d, 0x58, 0xf7, 0xeb, 0x8b, 0x83, 0x26, 0xa1, 0xef, 0x4a, 0x19, 0xa8, 0x3c, 0xd7, 0xe3, 0xd6, + 0x38, 0x82, 0x49, 0x0a, 0x4b, 0xa7, 0xc2, 0x92, 0x4d, 0xac, 0x56, 0xc5, 0xbe, 0xd0, 0xd2, 0xa9, + 0x08, 0x00, 0x8e, 0x71, 0x28, 0x33, 0xa5, 0xfe, 0x84, 0xb3, 0x28, 0x0e, 0x2b, 0xaa, 0xb0, 0x43, + 0xac, 0x61, 0xa0, 0xcb, 0x42, 0xa0, 0xc0, 0xf5, 0x02, 0x8f, 0x26, 0x04, 0x0a, 0x72, 0xb8, 0x34, + 0x29, 0xd0, 0x15, 0x18, 0x55, 0x19, 0xb4, 0xab, 0x3c, 0x91, 0x91, 0x58, 0x66, 0xcb, 0x71, 0x31, + 0xd6, 0x71, 0xd0, 0x06, 0x4c, 0x86, 0x5c, 0xce, 0xa6, 0x62, 0x3d, 0x73, 0x79, 0xe5, 0x07, 0xa4, + 0x15, 0x50, 0xcd, 0x04, 0x1f, 0xb2, 0x22, 0x7e, 0x3a, 0x49, 0x3f, 0xff, 0x24, 0x09, 0xf4, 0x1a, + 0x4c, 0x34, 0x7d, 0xa7, 0xb1, 0xe8, 0x34, 0x1d, 0xaf, 0xce, 0xc6, 0x67, 0xc4, 0x4c, 0xc4, 0x7a, + 0xc3, 0x80, 0xe2, 0x04, 0x36, 0x65, 0xde, 0xf4, 0x12, 0x11, 0x9f, 0xdc, 0xf1, 0xb6, 0x49, 0x28, + 0xf2, 0x21, 0x33, 0xe6, 0xed, 0x46, 0x0e, 0x0e, 0xce, 0xad, 0x8d, 0x5e, 0x86, 0x31, 0xf9, 0xf9, + 0x5a, 0x58, 0x8c, 0xd8, 0x29, 0x45, 0x83, 0x61, 0x03, 0x13, 0xdd, 0x85, 0xd3, 0xf2, 0xff, 0x46, + 0xe0, 0x6c, 0x6d, 0xb9, 0x75, 0xe1, 0x2b, 0xce, 0xbd, 0x57, 0x17, 0xa4, 0x8b, 0xe5, 0x72, 0x16, + 0xd2, 0xe1, 0x41, 0xf9, 0x82, 0x18, 0xb5, 0x4c, 0x38, 0x9b, 0xc4, 0x6c, 0xfa, 0x68, 0x0d, 0x66, + 0x76, 0x88, 0xd3, 0x8c, 0x76, 0x96, 0x76, 0x48, 0x7d, 0x57, 0x6e, 0x3a, 0x16, 0x6c, 0x43, 0x73, + 0xe0, 0xb8, 0x96, 0x46, 0xc1, 0x59, 0xf5, 0xd0, 0x9b, 0x30, 0xdb, 0xee, 0x6c, 0x36, 0xdd, 0x70, + 0x67, 0xdd, 0x8f, 0x98, 0x29, 0x90, 0x4a, 0xc8, 0x2d, 0xa2, 0x72, 0xa8, 0x70, 0x26, 0xd5, 0x1c, + 0x3c, 0x9c, 0x4b, 0x01, 0xbd, 0x0d, 0xa7, 0x13, 0x8b, 0x41, 0xc4, 0x25, 0x98, 0xc8, 0xcf, 0xf6, + 0x50, 0xcb, 0xaa, 0x20, 0x42, 0x7c, 0x64, 0x81, 0x70, 0x76, 0x13, 0xe8, 0x15, 0x00, 0xb7, 0xbd, + 0xe2, 0xb4, 0xdc, 0x26, 0x7d, 0x2e, 0xce, 0xb0, 0x75, 0x42, 0x9f, 0x0e, 0xb0, 0x5a, 0x95, 0xa5, + 0xf4, 0x7c, 0x16, 0xff, 0xf6, 0xb1, 0x86, 0x8d, 0x6e, 0xc0, 0x84, 0xf8, 0xb7, 0x2f, 0xa6, 0x95, + 0x87, 0xc7, 0x78, 0x92, 0xc5, 0x36, 0xaa, 0xea, 0x90, 0xc3, 0x54, 0x09, 0x4e, 0xd4, 0x45, 0xdb, + 0x70, 0x4e, 0x66, 0xee, 0xd2, 0xd7, 0xa8, 0x9c, 0x83, 0x90, 0xa5, 0x58, 0x18, 0xe1, 0xbe, 0x21, + 0x0b, 0xdd, 0x10, 0x71, 0x77, 0x3a, 0xf4, 0x6e, 0xd7, 0x97, 0x3a, 0xf7, 0x9e, 0x3d, 0xcd, 0x4d, + 0x93, 0xe8, 0xdd, 0x7e, 0x23, 0x09, 0xc4, 0x69, 0x7c, 0x14, 0xc2, 0x69, 0xd7, 0xcb, 0x5a, 0xd9, + 0x67, 0x18, 0xa1, 0x8f, 0x72, 0xc7, 0xe1, 0xee, 0xab, 0x3a, 0x13, 0xce, 0x57, 0x75, 0x26, 0xed, + 0x77, 0x66, 0x81, 0xf7, 0x3b, 0x16, 0xad, 0xad, 0x71, 0xe9, 0xe8, 0x33, 0x30, 0xa6, 0x7f, 0x98, + 0xe0, 0x38, 0x2e, 0x66, 0x33, 0xb1, 0xda, 0xd9, 0xc0, 0x79, 0x7c, 0xb5, 0xff, 0x75, 0x18, 0x36, + 0x28, 0xa2, 0x7a, 0x86, 0x8b, 0xfd, 0xe5, 0xfe, 0x38, 0x9a, 0xfe, 0x0d, 0xd0, 0x08, 0x64, 0x2f, + 0x79, 0x74, 0x03, 0x46, 0xea, 0x4d, 0x97, 0x78, 0xd1, 0x6a, 0xb5, 0x5b, 0x1c, 0xbd, 0x25, 0x81, + 0x23, 0xf6, 0x90, 0xc8, 0x98, 0xc0, 0xcb, 0xb0, 0xa2, 0x60, 0xff, 0x5a, 0x01, 0xca, 0x3d, 0xd2, + 0x6f, 0x24, 0xd4, 0x51, 0x56, 0x5f, 0xea, 0xa8, 0x05, 0x99, 0x71, 0x7e, 0x3d, 0x21, 0xe9, 0x4a, + 0x64, 0x93, 0x8f, 0xe5, 0x5d, 0x49, 0xfc, 0xbe, 0xdd, 0x03, 0x74, 0x8d, 0xd6, 0x40, 0x4f, 0x07, + 0x17, 0x43, 0x93, 0x3d, 0xd8, 0xff, 0xf3, 0x37, 0x57, 0x2b, 0x69, 0x7f, 0xad, 0x00, 0xa7, 0xd5, + 0x10, 0x7e, 0xfb, 0x0e, 0xdc, 0xad, 0xf4, 0xc0, 0x1d, 0x83, 0x4e, 0xd7, 0xbe, 0x09, 0x43, 0x3c, + 0x30, 0x60, 0x1f, 0x6c, 0xf7, 0x13, 0x66, 0xe0, 0x5d, 0xc5, 0xe9, 0x19, 0xc1, 0x77, 0x7f, 0xd0, + 0x82, 0xc9, 0x84, 0x9f, 0x19, 0xc2, 0x9a, 0x33, 0xf2, 0x83, 0xb0, 0xc6, 0x59, 0x4c, 0xf7, 0x05, + 0x18, 0xd8, 0xf1, 0xc3, 0x28, 0x69, 0xf0, 0x71, 0xcd, 0x0f, 0x23, 0xcc, 0x20, 0xf6, 0xef, 0x59, + 0x30, 0xb8, 0xe1, 0xb8, 0x5e, 0x24, 0x95, 0x03, 0x56, 0x8e, 0x72, 0xa0, 0x9f, 0xef, 0x42, 0x2f, + 0xc1, 0x10, 0xd9, 0xda, 0x22, 0xf5, 0x48, 0xcc, 0xaa, 0x8c, 0xe4, 0x30, 0xb4, 0xcc, 0x4a, 0x29, + 0x1f, 0xc8, 0x1a, 0xe3, 0x7f, 0xb1, 0x40, 0x46, 0x77, 0xa0, 0x14, 0xb9, 0x2d, 0xb2, 0xd0, 0x68, + 0x08, 0x95, 0xf9, 0x03, 0x44, 0xa3, 0xd8, 0x90, 0x04, 0x70, 0x4c, 0xcb, 0xfe, 0x62, 0x01, 0x20, + 0x8e, 0xa8, 0xd4, 0xeb, 0x13, 0x17, 0x53, 0xca, 0xd4, 0x8b, 0x19, 0xca, 0x54, 0x14, 0x13, 0xcc, + 0xd0, 0xa4, 0xaa, 0x61, 0x2a, 0xf6, 0x35, 0x4c, 0x03, 0x47, 0x19, 0xa6, 0x25, 0x98, 0x8e, 0x23, + 0x42, 0x99, 0x01, 0xf1, 0xd8, 0xf5, 0xb9, 0x91, 0x04, 0xe2, 0x34, 0xbe, 0x4d, 0xe0, 0x82, 0x0a, + 0x8c, 0x23, 0x6e, 0x34, 0x66, 0x91, 0xad, 0x2b, 0xa7, 0x7b, 0x8c, 0x53, 0xac, 0x2d, 0x2e, 0xe4, + 0x6a, 0x8b, 0x7f, 0xca, 0x82, 0x53, 0xc9, 0x76, 0x98, 0xfb, 0xf2, 0x17, 0x2c, 0x38, 0xcd, 0x74, + 0xe6, 0xac, 0xd5, 0xb4, 0x86, 0xfe, 0xc5, 0xae, 0xc1, 0x7e, 0x72, 0x7a, 0x1c, 0x87, 0x0c, 0x59, + 0xcb, 0x22, 0x8d, 0xb3, 0x5b, 0xb4, 0xff, 0xdb, 0x00, 0xcc, 0xe6, 0x45, 0x09, 0x62, 0x0e, 0x1b, + 0xce, 0xbd, 0xda, 0x2e, 0xb9, 0x2b, 0xcc, 0xe2, 0x63, 0x87, 0x0d, 0x5e, 0x8c, 0x25, 0x3c, 0x99, + 0x51, 0xa1, 0xd0, 0x67, 0x46, 0x85, 0x1d, 0x98, 0xbe, 0xbb, 0x43, 0xbc, 0x5b, 0x5e, 0xe8, 0x44, + 0x6e, 0xb8, 0xe5, 0x32, 0xfd, 0x32, 0x5f, 0x37, 0x32, 0x0d, 0xeb, 0xf4, 0x9d, 0x24, 0xc2, 0xe1, + 0x41, 0xf9, 0x9c, 0x51, 0x10, 0x77, 0x99, 0x1f, 0x24, 0x38, 0x4d, 0x34, 0x9d, 0x90, 0x62, 0xe0, + 0x21, 0x27, 0xa4, 0x68, 0xb9, 0xc2, 0x2a, 0x45, 0x5a, 0xe3, 0xb3, 0x97, 0xe3, 0x9a, 0x2a, 0xc5, + 0x1a, 0x06, 0xfa, 0x14, 0x20, 0x3d, 0xe1, 0x8e, 0x11, 0xa4, 0xf1, 0xb9, 0xfb, 0x07, 0x65, 0xb4, + 0x9e, 0x82, 0x1e, 0x1e, 0x94, 0x67, 0x68, 0xe9, 0xaa, 0x47, 0x5f, 0xa0, 0x71, 0x64, 0xab, 0x0c, + 0x42, 0xe8, 0x0e, 0x4c, 0xd1, 0x52, 0xb6, 0xa3, 0x64, 0x04, 0x48, 0xfe, 0x6a, 0x7c, 0xe6, 0xfe, + 0x41, 0x79, 0x6a, 0x3d, 0x01, 0xcb, 0x23, 0x9d, 0x22, 0x82, 0x5e, 0x81, 0x89, 0x78, 0x5d, 0x5d, + 0x27, 0xfb, 0x3c, 0xdc, 0x4c, 0x89, 0x0b, 0xbe, 0xd7, 0x0c, 0x08, 0x4e, 0x60, 0xda, 0x5f, 0xb0, + 0xe0, 0x6c, 0x6e, 0xde, 0x66, 0x74, 0x09, 0x46, 0x9c, 0xb6, 0xcb, 0xd5, 0x18, 0xe2, 0xaa, 0x61, + 0xe2, 0xb2, 0xea, 0x2a, 0x57, 0x62, 0x28, 0x28, 0x3d, 0xe1, 0x77, 0x5d, 0xaf, 0x91, 0x3c, 0xe1, + 0xaf, 0xbb, 0x5e, 0x03, 0x33, 0x88, 0xba, 0xb2, 0x8a, 0x79, 0x57, 0x96, 0xfd, 0x03, 0x16, 0x08, + 0x87, 0xdc, 0x3e, 0xee, 0xb7, 0x4f, 0xc2, 0xd8, 0x5e, 0x3a, 0xb1, 0xd7, 0x85, 0x7c, 0x0f, 0x65, + 0x91, 0xce, 0x4b, 0x31, 0xad, 0x46, 0x12, 0x2f, 0x83, 0x96, 0xdd, 0x00, 0x01, 0xad, 0x10, 0x26, + 0xa4, 0xef, 0xdd, 0x9b, 0xe7, 0x01, 0x1a, 0x0c, 0x97, 0x65, 0xfb, 0x2c, 0x98, 0xdc, 0x4b, 0x45, + 0x41, 0xb0, 0x86, 0x65, 0xff, 0xab, 0x02, 0x8c, 0xca, 0x44, 0x52, 0x1d, 0xaf, 0x1f, 0x51, 0xda, + 0x91, 0x32, 0xcb, 0xa2, 0xcb, 0x50, 0x62, 0xb2, 0xde, 0x6a, 0x2c, 0x81, 0x54, 0x92, 0x96, 0x35, + 0x09, 0xc0, 0x31, 0x0e, 0x3d, 0x69, 0xc2, 0xce, 0x26, 0x43, 0x4f, 0xb8, 0x8f, 0xd6, 0x78, 0x31, + 0x96, 0x70, 0xf4, 0x71, 0x98, 0xe2, 0xf5, 0x02, 0xbf, 0xed, 0x6c, 0x73, 0xfd, 0xd0, 0xa0, 0x8a, + 0xc9, 0x31, 0xb5, 0x96, 0x80, 0x1d, 0x1e, 0x94, 0x4f, 0x25, 0xcb, 0x98, 0xe2, 0x33, 0x45, 0x85, + 0x99, 0x81, 0xf1, 0x46, 0xe8, 0x09, 0x99, 0xb2, 0x1e, 0x8b, 0x41, 0x58, 0xc7, 0xb3, 0x3f, 0x03, + 0x28, 0x9d, 0x52, 0x0b, 0xbd, 0xce, 0x6d, 0x7f, 0xdd, 0x80, 0x34, 0xba, 0x29, 0x42, 0xf5, 0xc8, + 0x13, 0xd2, 0xf3, 0x8b, 0xd7, 0xc2, 0xaa, 0xbe, 0xfd, 0xff, 0x14, 0x61, 0x2a, 0xe9, 0xeb, 0x8e, + 0xae, 0xc1, 0x10, 0x67, 0xcf, 0x04, 0xf9, 0x2e, 0x76, 0x36, 0x9a, 0x87, 0x3c, 0xbb, 0xa8, 0x04, + 0x87, 0x27, 0xea, 0xa3, 0x37, 0x61, 0xb4, 0xe1, 0xdf, 0xf5, 0xee, 0x3a, 0x41, 0x63, 0xa1, 0xba, + 0x2a, 0x96, 0x73, 0xe6, 0xc3, 0xbf, 0x12, 0xa3, 0xe9, 0x5e, 0xf7, 0x4c, 0xa7, 0x1c, 0x83, 0xb0, + 0x4e, 0x0e, 0x6d, 0xb0, 0x38, 0xfc, 0x5b, 0xee, 0xf6, 0x9a, 0xd3, 0xee, 0xe6, 0x08, 0xb2, 0x24, + 0x91, 0x34, 0xca, 0xe3, 0x22, 0x58, 0x3f, 0x07, 0xe0, 0x98, 0x10, 0xfa, 0x1c, 0xcc, 0x84, 0x39, + 0xea, 0x88, 0xbc, 0x0c, 0x8b, 0xdd, 0x24, 0xf4, 0x8b, 0x8f, 0xdc, 0x3f, 0x28, 0xcf, 0x64, 0x29, + 0x2e, 0xb2, 0x9a, 0xb1, 0xbf, 0x74, 0x0a, 0x8c, 0x4d, 0x6c, 0x24, 0xdc, 0xb5, 0x8e, 0x29, 0xe1, + 0x2e, 0x86, 0x11, 0xd2, 0x6a, 0x47, 0xfb, 0x15, 0x37, 0x10, 0x73, 0x92, 0x49, 0x73, 0x59, 0xe0, + 0xa4, 0x69, 0x4a, 0x08, 0x56, 0x74, 0xb2, 0xb3, 0x22, 0x17, 0xbf, 0x89, 0x59, 0x91, 0x07, 0x4e, + 0x30, 0x2b, 0xf2, 0x3a, 0x0c, 0x6f, 0xbb, 0x11, 0x26, 0x6d, 0x5f, 0x3c, 0x8c, 0x32, 0xd7, 0xe1, + 0x55, 0x8e, 0x92, 0xce, 0xbf, 0x29, 0x00, 0x58, 0x12, 0x41, 0xaf, 0xab, 0x1d, 0x38, 0x94, 0x2f, + 0xbc, 0x48, 0x1b, 0x84, 0x64, 0xee, 0x41, 0x91, 0xfb, 0x78, 0xf8, 0x41, 0x73, 0x1f, 0xaf, 0xc8, + 0x8c, 0xc5, 0x23, 0xf9, 0x5e, 0x5b, 0x2c, 0x21, 0x71, 0x8f, 0x3c, 0xc5, 0xb7, 0xf5, 0x2c, 0xcf, + 0xa5, 0xfc, 0x93, 0x40, 0x25, 0x70, 0xee, 0x33, 0xb7, 0xf3, 0x0f, 0x58, 0x70, 0xba, 0x9d, 0x95, + 0xf0, 0x5c, 0xd8, 0x4e, 0xbc, 0xd4, 0x77, 0x4e, 0x75, 0xa3, 0x41, 0x26, 0x73, 0xcc, 0xce, 0x9a, + 0x9f, 0xdd, 0x1c, 0x1d, 0xe8, 0x60, 0xb3, 0x21, 0x74, 0xf8, 0x4f, 0xe4, 0x24, 0x89, 0xee, 0x92, + 0x1a, 0x7a, 0x23, 0x23, 0x21, 0xf1, 0x93, 0x79, 0x09, 0x89, 0xfb, 0x4e, 0x43, 0xfc, 0xba, 0x4a, + 0x0f, 0x3d, 0x9e, 0xbf, 0x94, 0x78, 0xf2, 0xe7, 0x9e, 0x49, 0xa1, 0x5f, 0x57, 0x49, 0xa1, 0xbb, + 0xc4, 0x4b, 0xe6, 0x29, 0x9f, 0x7b, 0xa6, 0x82, 0xd6, 0xd2, 0x39, 0x4f, 0x1e, 0x4f, 0x3a, 0x67, + 0xe3, 0xaa, 0xe1, 0x19, 0x85, 0x9f, 0xe9, 0x71, 0xd5, 0x18, 0x74, 0xbb, 0x5f, 0x36, 0x3c, 0x75, + 0xf5, 0xf4, 0x03, 0xa5, 0xae, 0xbe, 0xad, 0xa7, 0x82, 0x46, 0x3d, 0x72, 0x1d, 0x53, 0xa4, 0x3e, + 0x13, 0x40, 0xdf, 0xd6, 0x2f, 0xc0, 0x99, 0x7c, 0xba, 0xea, 0x9e, 0x4b, 0xd3, 0xcd, 0xbc, 0x02, + 0x53, 0x89, 0xa5, 0x4f, 0x9d, 0x4c, 0x62, 0xe9, 0xd3, 0xc7, 0x9e, 0x58, 0xfa, 0xcc, 0x09, 0x24, + 0x96, 0x7e, 0xe4, 0x04, 0x13, 0x4b, 0xdf, 0x66, 0x06, 0x47, 0x3c, 0xac, 0x91, 0x88, 0xef, 0xfc, + 0x74, 0x4e, 0x54, 0xb0, 0x74, 0xec, 0x23, 0xfe, 0x71, 0x0a, 0x84, 0x63, 0x52, 0x19, 0x09, 0xab, + 0x67, 0x1f, 0x42, 0xc2, 0xea, 0xf5, 0x38, 0x61, 0xf5, 0xd9, 0xfc, 0xa9, 0xce, 0x70, 0x51, 0xc9, + 0x49, 0x53, 0x7d, 0x5b, 0x4f, 0x2f, 0xfd, 0x68, 0x17, 0xad, 0x52, 0x96, 0x70, 0xb6, 0x4b, 0x52, + 0xe9, 0xd7, 0x78, 0x52, 0xe9, 0xc7, 0xf2, 0x4f, 0xf2, 0xe4, 0x75, 0x67, 0xa4, 0x92, 0xa6, 0xfd, + 0x52, 0x61, 0x41, 0x59, 0x24, 0xeb, 0x9c, 0x7e, 0xa9, 0xb8, 0xa2, 0xe9, 0x7e, 0x29, 0x10, 0x8e, + 0x49, 0xd9, 0x3f, 0x54, 0x80, 0xf3, 0xdd, 0xf7, 0x5b, 0x2c, 0x71, 0xae, 0xc6, 0x4a, 0xf6, 0x84, + 0xc4, 0x99, 0xbf, 0xd9, 0x62, 0xac, 0xbe, 0xa3, 0x1c, 0x5e, 0x85, 0x69, 0xe5, 0xdb, 0x42, 0xdf, + 0xe8, 0xeb, 0xf1, 0xcb, 0x57, 0xc5, 0x03, 0xa8, 0x25, 0x11, 0x70, 0xba, 0x0e, 0x5a, 0x80, 0x49, + 0xa3, 0x70, 0xb5, 0x22, 0xde, 0x66, 0x4a, 0xc4, 0x5d, 0x33, 0xc1, 0x38, 0x89, 0x6f, 0x7f, 0xd9, + 0x82, 0x47, 0x72, 0x32, 0x32, 0xf6, 0x1d, 0xc4, 0x6f, 0x0b, 0x26, 0xdb, 0x66, 0xd5, 0x1e, 0x71, + 0x47, 0x8d, 0xbc, 0x8f, 0xaa, 0xaf, 0x09, 0x00, 0x4e, 0x12, 0xb5, 0x7f, 0xa6, 0x00, 0xe7, 0xba, + 0x1a, 0x6b, 0x22, 0x0c, 0x67, 0xb6, 0x5b, 0xa1, 0xb3, 0x14, 0x90, 0x06, 0xf1, 0x22, 0xd7, 0x69, + 0xd6, 0xda, 0xa4, 0xae, 0xe9, 0x0c, 0x98, 0xd5, 0xe3, 0xd5, 0xb5, 0xda, 0x42, 0x1a, 0x03, 0xe7, + 0xd4, 0x44, 0x2b, 0x80, 0xd2, 0x10, 0x31, 0xc3, 0x2c, 0x26, 0x7a, 0x9a, 0x1e, 0xce, 0xa8, 0x81, + 0x3e, 0x0c, 0xe3, 0xca, 0x08, 0x54, 0x9b, 0x71, 0x76, 0xb0, 0x63, 0x1d, 0x80, 0x4d, 0x3c, 0x74, + 0x85, 0x07, 0xd5, 0x17, 0xe9, 0x17, 0x84, 0x82, 0x61, 0x52, 0x46, 0xcc, 0x17, 0xc5, 0x58, 0xc7, + 0x59, 0x7c, 0xf9, 0xd7, 0xff, 0xe0, 0xfc, 0xfb, 0x7e, 0xeb, 0x0f, 0xce, 0xbf, 0xef, 0x77, 0xff, + 0xe0, 0xfc, 0xfb, 0xbe, 0xe7, 0xfe, 0x79, 0xeb, 0xd7, 0xef, 0x9f, 0xb7, 0x7e, 0xeb, 0xfe, 0x79, + 0xeb, 0x77, 0xef, 0x9f, 0xb7, 0x7e, 0xff, 0xfe, 0x79, 0xeb, 0x8b, 0x7f, 0x78, 0xfe, 0x7d, 0x9f, + 0x44, 0x71, 0x58, 0xcc, 0xcb, 0x74, 0x76, 0x2e, 0xef, 0x5d, 0xf9, 0xdf, 0x01, 0x00, 0x00, 0xff, + 0xff, 0xd9, 0x48, 0x50, 0xbd, 0x65, 0x09, 0x01, 0x00, } func (m *AWSElasticBlockStoreVolumeSource) Marshal() (dAtA []byte, err error) { @@ -18919,6 +18920,15 @@ func (m *TopologySpreadConstraint) MarshalToSizedBuffer(dAtA []byte) (int, error _ = i var l int _ = l + if len(m.MatchLabelKeys) > 0 { + for iNdEx := len(m.MatchLabelKeys) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.MatchLabelKeys[iNdEx]) + copy(dAtA[i:], m.MatchLabelKeys[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.MatchLabelKeys[iNdEx]))) + i-- + dAtA[i] = 0x42 + } + } if m.NodeTaintsPolicy != nil { i -= len(*m.NodeTaintsPolicy) copy(dAtA[i:], *m.NodeTaintsPolicy) @@ -24136,6 +24146,12 @@ func (m *TopologySpreadConstraint) Size() (n int) { l = len(*m.NodeTaintsPolicy) n += 1 + l + sovGenerated(uint64(l)) } + if len(m.MatchLabelKeys) > 0 { + for _, s := range m.MatchLabelKeys { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -27727,6 +27743,7 @@ func (this *TopologySpreadConstraint) String() string { `MinDomains:` + valueToStringGenerated(this.MinDomains) + `,`, `NodeAffinityPolicy:` + valueToStringGenerated(this.NodeAffinityPolicy) + `,`, `NodeTaintsPolicy:` + valueToStringGenerated(this.NodeTaintsPolicy) + `,`, + `MatchLabelKeys:` + fmt.Sprintf("%v", this.MatchLabelKeys) + `,`, `}`, }, "") return s @@ -65850,6 +65867,38 @@ func (m *TopologySpreadConstraint) Unmarshal(dAtA []byte) error { s := NodeInclusionPolicy(dAtA[iNdEx:postIndex]) m.NodeTaintsPolicy = &s iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MatchLabelKeys", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MatchLabelKeys = append(m.MatchLabelKeys, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/staging/src/k8s.io/api/core/v1/generated.proto b/staging/src/k8s.io/api/core/v1/generated.proto index e9759a64eeb..0b7cec2d5c1 100644 --- a/staging/src/k8s.io/api/core/v1/generated.proto +++ b/staging/src/k8s.io/api/core/v1/generated.proto @@ -5499,6 +5499,16 @@ message TopologySpreadConstraint { // This is a alpha-level feature enabled by the NodeInclusionPolicyInPodTopologySpread feature flag. // +optional optional string nodeTaintsPolicy = 7; + + // MatchLabelKeys is a set of pod label keys to select the pods over which + // spreading will be calculated. The keys are used to lookup values from the + // incoming pod labels, those key-value labels are ANDed with labelSelector + // to select the group of existing pods over which spreading will be calculated + // for the incoming pod. Keys that don't exist in the incoming pod labels will + // be ignored. A null or empty list means only match against labelSelector. + // +listType=atomic + // +optional + repeated string matchLabelKeys = 8; } // TypedLocalObjectReference contains enough information to let you locate the diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go index 8ac330e9e11..77e9818c9ce 100644 --- a/staging/src/k8s.io/api/core/v1/types.go +++ b/staging/src/k8s.io/api/core/v1/types.go @@ -3454,6 +3454,15 @@ type TopologySpreadConstraint struct { // This is a alpha-level feature enabled by the NodeInclusionPolicyInPodTopologySpread feature flag. // +optional NodeTaintsPolicy *NodeInclusionPolicy `json:"nodeTaintsPolicy,omitempty" protobuf:"bytes,7,opt,name=nodeTaintsPolicy"` + // MatchLabelKeys is a set of pod label keys to select the pods over which + // spreading will be calculated. The keys are used to lookup values from the + // incoming pod labels, those key-value labels are ANDed with labelSelector + // to select the group of existing pods over which spreading will be calculated + // for the incoming pod. Keys that don't exist in the incoming pod labels will + // be ignored. A null or empty list means only match against labelSelector. + // +listType=atomic + // +optional + MatchLabelKeys []string `json:"matchLabelKeys,omitempty" protobuf:"bytes,8,opt,name=matchLabelKeys"` } const ( diff --git a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go index 6f1d02d611a..699dd2cc3c8 100644 --- a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -2408,6 +2408,7 @@ var map_TopologySpreadConstraint = map[string]string{ "minDomains": "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\nFor example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: ", "nodeAffinityPolicy": "NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector when calculating pod topology spread skew. Options are: - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\nIf this value is nil, the behavior is equivalent to the Honor policy. This is a alpha-level feature enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.", "nodeTaintsPolicy": "NodeTaintsPolicy indicates how we will treat node taints when calculating pod topology spread skew. Options are: - Honor: nodes without taints, along with tainted nodes for which the incoming pod has a toleration, are included. - Ignore: node taints are ignored. All nodes are included.\n\nIf this value is nil, the behavior is equivalent to the Ignore policy. This is a alpha-level feature enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.", + "matchLabelKeys": "MatchLabelKeys is a set of pod label keys to select the pods over which spreading will be calculated. The keys are used to lookup values from the incoming pod labels, those key-value labels are ANDed with labelSelector to select the group of existing pods over which spreading will be calculated for the incoming pod. Keys that don't exist in the incoming pod labels will be ignored. A null or empty list means only match against labelSelector.", } func (TopologySpreadConstraint) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go index f18b453fd5d..2574b3fad1e 100644 --- a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go @@ -5664,6 +5664,11 @@ func (in *TopologySpreadConstraint) DeepCopyInto(out *TopologySpreadConstraint) *out = new(NodeInclusionPolicy) **out = **in } + if in.MatchLabelKeys != nil { + in, out := &in.MatchLabelKeys, &out.MatchLabelKeys + *out = make([]string, len(*in)) + copy(*out, *in) + } return } diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.json index 81ae5895677..3f0b17693d0 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.json @@ -1616,7 +1616,10 @@ }, "minDomains": 5, "nodeAffinityPolicy": "nodeAffinityPolicyValue", - "nodeTaintsPolicy": "nodeTaintsPolicyValue" + "nodeTaintsPolicy": "nodeTaintsPolicyValue", + "matchLabelKeys": [ + "matchLabelKeysValue" + ] } ], "setHostnameAsFQDN": true, diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.pb index e52e2806398..c295730874d 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.pb and b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.yaml index 1bb37356d97..aebd268c935 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.yaml @@ -846,6 +846,8 @@ spec: - valuesValue matchLabels: matchLabelsKey: matchLabelsValue + matchLabelKeys: + - matchLabelKeysValue maxSkew: 1 minDomains: 5 nodeAffinityPolicy: nodeAffinityPolicyValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.json index 1e311db49fa..c6d08c291c7 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.json @@ -1617,7 +1617,10 @@ }, "minDomains": 5, "nodeAffinityPolicy": "nodeAffinityPolicyValue", - "nodeTaintsPolicy": "nodeTaintsPolicyValue" + "nodeTaintsPolicy": "nodeTaintsPolicyValue", + "matchLabelKeys": [ + "matchLabelKeysValue" + ] } ], "setHostnameAsFQDN": true, diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.pb index 828a170ac23..fea88fd2dc1 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.pb and b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.yaml index 1f3c68a02c2..6d29862f3f3 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.yaml @@ -854,6 +854,8 @@ spec: - valuesValue matchLabels: matchLabelsKey: matchLabelsValue + matchLabelKeys: + - matchLabelKeysValue maxSkew: 1 minDomains: 5 nodeAffinityPolicy: nodeAffinityPolicyValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.json index ec675bb9337..ca840df9b69 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.json @@ -1618,7 +1618,10 @@ }, "minDomains": 5, "nodeAffinityPolicy": "nodeAffinityPolicyValue", - "nodeTaintsPolicy": "nodeTaintsPolicyValue" + "nodeTaintsPolicy": "nodeTaintsPolicyValue", + "matchLabelKeys": [ + "matchLabelKeysValue" + ] } ], "setHostnameAsFQDN": true, diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.pb index 0a0aaeaf1b0..0c8b3f0fd0f 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.pb and b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.yaml index 0e1d10582d8..db7f07f305b 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.yaml @@ -846,6 +846,8 @@ spec: - valuesValue matchLabels: matchLabelsKey: matchLabelsValue + matchLabelKeys: + - matchLabelKeysValue maxSkew: 1 minDomains: 5 nodeAffinityPolicy: nodeAffinityPolicyValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.json index 93bae7f0aa3..4e9d91e28eb 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.json @@ -1617,7 +1617,10 @@ }, "minDomains": 5, "nodeAffinityPolicy": "nodeAffinityPolicyValue", - "nodeTaintsPolicy": "nodeTaintsPolicyValue" + "nodeTaintsPolicy": "nodeTaintsPolicyValue", + "matchLabelKeys": [ + "matchLabelKeysValue" + ] } ], "setHostnameAsFQDN": true, diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.pb index a6006d7917b..65bc93c0286 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.pb and b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.yaml index e68fae4ceb7..775629122c0 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.yaml @@ -852,6 +852,8 @@ spec: - valuesValue matchLabels: matchLabelsKey: matchLabelsValue + matchLabelKeys: + - matchLabelKeysValue maxSkew: 1 minDomains: 5 nodeAffinityPolicy: nodeAffinityPolicyValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.json index d4d83212d0c..d19f86116d3 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.json @@ -1617,7 +1617,10 @@ }, "minDomains": 5, "nodeAffinityPolicy": "nodeAffinityPolicyValue", - "nodeTaintsPolicy": "nodeTaintsPolicyValue" + "nodeTaintsPolicy": "nodeTaintsPolicyValue", + "matchLabelKeys": [ + "matchLabelKeysValue" + ] } ], "setHostnameAsFQDN": true, diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.pb index c227d630d68..7b1b2cf6738 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.pb and b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.yaml index 94a475e1bc6..a599f469310 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.yaml @@ -856,6 +856,8 @@ spec: - valuesValue matchLabels: matchLabelsKey: matchLabelsValue + matchLabelKeys: + - matchLabelKeysValue maxSkew: 1 minDomains: 5 nodeAffinityPolicy: nodeAffinityPolicyValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.json index c34f3b552cd..56141cc353a 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.json @@ -1617,7 +1617,10 @@ }, "minDomains": 5, "nodeAffinityPolicy": "nodeAffinityPolicyValue", - "nodeTaintsPolicy": "nodeTaintsPolicyValue" + "nodeTaintsPolicy": "nodeTaintsPolicyValue", + "matchLabelKeys": [ + "matchLabelKeysValue" + ] } ], "setHostnameAsFQDN": true, diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.pb index e2b5d47a9d2..a9dc176720a 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.pb and b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.yaml index b9045ab02f5..3390912b1f5 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.yaml @@ -852,6 +852,8 @@ spec: - valuesValue matchLabels: matchLabelsKey: matchLabelsValue + matchLabelKeys: + - matchLabelKeysValue maxSkew: 1 minDomains: 5 nodeAffinityPolicy: nodeAffinityPolicyValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.json index 460ba237409..404330b4e35 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.json @@ -1616,7 +1616,10 @@ }, "minDomains": 5, "nodeAffinityPolicy": "nodeAffinityPolicyValue", - "nodeTaintsPolicy": "nodeTaintsPolicyValue" + "nodeTaintsPolicy": "nodeTaintsPolicyValue", + "matchLabelKeys": [ + "matchLabelKeysValue" + ] } ], "setHostnameAsFQDN": true, diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.pb index 983b195a68e..4aa53c5ad1b 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.pb and b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.yaml index baee1f107a3..f0eae0673ab 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.yaml @@ -846,6 +846,8 @@ spec: - valuesValue matchLabels: matchLabelsKey: matchLabelsValue + matchLabelKeys: + - matchLabelKeysValue maxSkew: 1 minDomains: 5 nodeAffinityPolicy: nodeAffinityPolicyValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.json index e25afb906d9..45c8c6f0689 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.json @@ -1617,7 +1617,10 @@ }, "minDomains": 5, "nodeAffinityPolicy": "nodeAffinityPolicyValue", - "nodeTaintsPolicy": "nodeTaintsPolicyValue" + "nodeTaintsPolicy": "nodeTaintsPolicyValue", + "matchLabelKeys": [ + "matchLabelKeysValue" + ] } ], "setHostnameAsFQDN": true, diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.pb index 99fcdd4050c..496af02aa3f 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.pb and b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.yaml index bb15fcf4ff6..3ae1e33ae9f 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.yaml @@ -854,6 +854,8 @@ spec: - valuesValue matchLabels: matchLabelsKey: matchLabelsValue + matchLabelKeys: + - matchLabelKeysValue maxSkew: 1 minDomains: 5 nodeAffinityPolicy: nodeAffinityPolicyValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.ReplicaSet.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.ReplicaSet.json index ba710f959dc..555d2951037 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.ReplicaSet.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.ReplicaSet.json @@ -1618,7 +1618,10 @@ }, "minDomains": 5, "nodeAffinityPolicy": "nodeAffinityPolicyValue", - "nodeTaintsPolicy": "nodeTaintsPolicyValue" + "nodeTaintsPolicy": "nodeTaintsPolicyValue", + "matchLabelKeys": [ + "matchLabelKeysValue" + ] } ], "setHostnameAsFQDN": true, diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.ReplicaSet.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.ReplicaSet.pb index 71e4f3012a7..7d9cbdbb11f 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.ReplicaSet.pb and b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.ReplicaSet.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.ReplicaSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.ReplicaSet.yaml index d44100aead6..92e6277bc08 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.ReplicaSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.ReplicaSet.yaml @@ -846,6 +846,8 @@ spec: - valuesValue matchLabels: matchLabelsKey: matchLabelsValue + matchLabelKeys: + - matchLabelKeysValue maxSkew: 1 minDomains: 5 nodeAffinityPolicy: nodeAffinityPolicyValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.json index 48f2dd2bf53..9ac29c31e2a 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.json @@ -1617,7 +1617,10 @@ }, "minDomains": 5, "nodeAffinityPolicy": "nodeAffinityPolicyValue", - "nodeTaintsPolicy": "nodeTaintsPolicyValue" + "nodeTaintsPolicy": "nodeTaintsPolicyValue", + "matchLabelKeys": [ + "matchLabelKeysValue" + ] } ], "setHostnameAsFQDN": true, diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.pb index 4a851e2955b..d6787f20e34 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.pb and b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.yaml index 3da6c495138..7ff24cfcf34 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.yaml @@ -852,6 +852,8 @@ spec: - valuesValue matchLabels: matchLabelsKey: matchLabelsValue + matchLabelKeys: + - matchLabelKeysValue maxSkew: 1 minDomains: 5 nodeAffinityPolicy: nodeAffinityPolicyValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.json b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.json index d84133a66ef..1cf8885d506 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.json +++ b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.json @@ -1670,7 +1670,10 @@ }, "minDomains": 5, "nodeAffinityPolicy": "nodeAffinityPolicyValue", - "nodeTaintsPolicy": "nodeTaintsPolicyValue" + "nodeTaintsPolicy": "nodeTaintsPolicyValue", + "matchLabelKeys": [ + "matchLabelKeysValue" + ] } ], "setHostnameAsFQDN": true, diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.pb b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.pb index a688bd8be10..92b3be14ffb 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.pb and b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.yaml b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.yaml index dcde3ad108c..990fe564a56 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.yaml @@ -887,6 +887,8 @@ spec: - valuesValue matchLabels: matchLabelsKey: matchLabelsValue + matchLabelKeys: + - matchLabelKeysValue maxSkew: 1 minDomains: 5 nodeAffinityPolicy: nodeAffinityPolicyValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.json b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.json index 9daa56045a7..35f79000b1d 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.json +++ b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.json @@ -1621,7 +1621,10 @@ }, "minDomains": 5, "nodeAffinityPolicy": "nodeAffinityPolicyValue", - "nodeTaintsPolicy": "nodeTaintsPolicyValue" + "nodeTaintsPolicy": "nodeTaintsPolicyValue", + "matchLabelKeys": [ + "matchLabelKeysValue" + ] } ], "setHostnameAsFQDN": true, diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.pb b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.pb index 4cf522cef8e..d1a8a6b4987 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.pb and b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.yaml b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.yaml index 815e4fb5d3b..96f57ffa5fc 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.yaml @@ -851,6 +851,8 @@ spec: - valuesValue matchLabels: matchLabelsKey: matchLabelsValue + matchLabelKeys: + - matchLabelKeysValue maxSkew: 1 minDomains: 5 nodeAffinityPolicy: nodeAffinityPolicyValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.json b/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.json index 2c7f8dca92e..eae2caac582 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.json +++ b/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.json @@ -1670,7 +1670,10 @@ }, "minDomains": 5, "nodeAffinityPolicy": "nodeAffinityPolicyValue", - "nodeTaintsPolicy": "nodeTaintsPolicyValue" + "nodeTaintsPolicy": "nodeTaintsPolicyValue", + "matchLabelKeys": [ + "matchLabelKeysValue" + ] } ], "setHostnameAsFQDN": true, diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.pb b/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.pb index 593be1e12d7..c802eaf6863 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.pb and b/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.yaml b/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.yaml index 788705e789c..e64883c2219 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.yaml @@ -887,6 +887,8 @@ spec: - valuesValue matchLabels: matchLabelsKey: matchLabelsValue + matchLabelKeys: + - matchLabelKeysValue maxSkew: 1 minDomains: 5 nodeAffinityPolicy: nodeAffinityPolicyValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.JobTemplate.json b/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.JobTemplate.json index 0bae7605bf9..40183101d54 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.JobTemplate.json +++ b/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.JobTemplate.json @@ -1664,7 +1664,10 @@ }, "minDomains": 5, "nodeAffinityPolicy": "nodeAffinityPolicyValue", - "nodeTaintsPolicy": "nodeTaintsPolicyValue" + "nodeTaintsPolicy": "nodeTaintsPolicyValue", + "matchLabelKeys": [ + "matchLabelKeysValue" + ] } ], "setHostnameAsFQDN": true, diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.JobTemplate.pb b/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.JobTemplate.pb index 4b2b72d7c8c..22d220e2644 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.JobTemplate.pb and b/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.JobTemplate.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.JobTemplate.yaml b/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.JobTemplate.yaml index ac11c231a68..2ad39ca5abf 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.JobTemplate.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.JobTemplate.yaml @@ -884,6 +884,8 @@ template: - valuesValue matchLabels: matchLabelsKey: matchLabelsValue + matchLabelKeys: + - matchLabelKeysValue maxSkew: 1 minDomains: 5 nodeAffinityPolicy: nodeAffinityPolicyValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.json b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.json index 0ed02b42089..9ad828fae39 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.json +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.json @@ -1558,7 +1558,10 @@ }, "minDomains": 5, "nodeAffinityPolicy": "nodeAffinityPolicyValue", - "nodeTaintsPolicy": "nodeTaintsPolicyValue" + "nodeTaintsPolicy": "nodeTaintsPolicyValue", + "matchLabelKeys": [ + "matchLabelKeysValue" + ] } ], "setHostnameAsFQDN": true, diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.pb b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.pb index 09b8e0496ff..f38a301f21f 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.pb and b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.yaml b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.yaml index ffd39593308..16229eb1a37 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.yaml @@ -802,6 +802,8 @@ spec: - valuesValue matchLabels: matchLabelsKey: matchLabelsValue + matchLabelKeys: + - matchLabelKeysValue maxSkew: 1 minDomains: 5 nodeAffinityPolicy: nodeAffinityPolicyValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.json b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.json index b6a339baacd..fd77fc1cb8f 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.json +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.json @@ -1601,7 +1601,10 @@ }, "minDomains": 5, "nodeAffinityPolicy": "nodeAffinityPolicyValue", - "nodeTaintsPolicy": "nodeTaintsPolicyValue" + "nodeTaintsPolicy": "nodeTaintsPolicyValue", + "matchLabelKeys": [ + "matchLabelKeysValue" + ] } ], "setHostnameAsFQDN": true, diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.pb b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.pb index 011c3fbb934..53968607d06 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.pb and b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.yaml b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.yaml index 80d3b831981..c58249a482a 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.yaml @@ -835,6 +835,8 @@ template: - valuesValue matchLabels: matchLabelsKey: matchLabelsValue + matchLabelKeys: + - matchLabelKeysValue maxSkew: 1 minDomains: 5 nodeAffinityPolicy: nodeAffinityPolicyValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.json b/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.json index 110985b405a..7df532c9554 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.json +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.json @@ -1607,7 +1607,10 @@ }, "minDomains": 5, "nodeAffinityPolicy": "nodeAffinityPolicyValue", - "nodeTaintsPolicy": "nodeTaintsPolicyValue" + "nodeTaintsPolicy": "nodeTaintsPolicyValue", + "matchLabelKeys": [ + "matchLabelKeysValue" + ] } ], "setHostnameAsFQDN": true, diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.pb b/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.pb index 4d0c631c1e1..847e73ae455 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.pb and b/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.yaml b/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.yaml index d056352c245..e7f880f3e3c 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.yaml @@ -840,6 +840,8 @@ spec: - valuesValue matchLabels: matchLabelsKey: matchLabelsValue + matchLabelKeys: + - matchLabelKeysValue maxSkew: 1 minDomains: 5 nodeAffinityPolicy: nodeAffinityPolicyValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.json b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.json index da28d7789bd..6ad80e5b2e8 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.json +++ b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.json @@ -1616,7 +1616,10 @@ }, "minDomains": 5, "nodeAffinityPolicy": "nodeAffinityPolicyValue", - "nodeTaintsPolicy": "nodeTaintsPolicyValue" + "nodeTaintsPolicy": "nodeTaintsPolicyValue", + "matchLabelKeys": [ + "matchLabelKeysValue" + ] } ], "setHostnameAsFQDN": true, diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.pb b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.pb index 7e6d912d126..134b17040bd 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.pb and b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.yaml index eaaeaedebad..bffe05eb96b 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.yaml @@ -846,6 +846,8 @@ spec: - valuesValue matchLabels: matchLabelsKey: matchLabelsValue + matchLabelKeys: + - matchLabelKeysValue maxSkew: 1 minDomains: 5 nodeAffinityPolicy: nodeAffinityPolicyValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.json b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.json index 296f3a7924d..c817516bde0 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.json +++ b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.json @@ -1617,7 +1617,10 @@ }, "minDomains": 5, "nodeAffinityPolicy": "nodeAffinityPolicyValue", - "nodeTaintsPolicy": "nodeTaintsPolicyValue" + "nodeTaintsPolicy": "nodeTaintsPolicyValue", + "matchLabelKeys": [ + "matchLabelKeysValue" + ] } ], "setHostnameAsFQDN": true, diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.pb b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.pb index 55a0a736f3b..d9c2c3e0008 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.pb and b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.yaml b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.yaml index 62d91a93cfe..e9bca491e4f 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.yaml @@ -856,6 +856,8 @@ spec: - valuesValue matchLabels: matchLabelsKey: matchLabelsValue + matchLabelKeys: + - matchLabelKeysValue maxSkew: 1 minDomains: 5 nodeAffinityPolicy: nodeAffinityPolicyValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.json b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.json index 1a00b441fed..5ff2f516fcb 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.json +++ b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.json @@ -1618,7 +1618,10 @@ }, "minDomains": 5, "nodeAffinityPolicy": "nodeAffinityPolicyValue", - "nodeTaintsPolicy": "nodeTaintsPolicyValue" + "nodeTaintsPolicy": "nodeTaintsPolicyValue", + "matchLabelKeys": [ + "matchLabelKeysValue" + ] } ], "setHostnameAsFQDN": true, diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.pb b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.pb index 394f7d8587d..50d7695a1fc 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.pb and b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.yaml index 3ebc643681f..a7e826239e2 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.yaml @@ -846,6 +846,8 @@ spec: - valuesValue matchLabels: matchLabelsKey: matchLabelsValue + matchLabelKeys: + - matchLabelKeysValue maxSkew: 1 minDomains: 5 nodeAffinityPolicy: nodeAffinityPolicyValue diff --git a/staging/src/k8s.io/client-go/applyconfigurations/core/v1/topologyspreadconstraint.go b/staging/src/k8s.io/client-go/applyconfigurations/core/v1/topologyspreadconstraint.go index aad73888563..fbfa8fa886c 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/core/v1/topologyspreadconstraint.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/core/v1/topologyspreadconstraint.go @@ -33,6 +33,7 @@ type TopologySpreadConstraintApplyConfiguration struct { MinDomains *int32 `json:"minDomains,omitempty"` NodeAffinityPolicy *v1.NodeInclusionPolicy `json:"nodeAffinityPolicy,omitempty"` NodeTaintsPolicy *v1.NodeInclusionPolicy `json:"nodeTaintsPolicy,omitempty"` + MatchLabelKeys []string `json:"matchLabelKeys,omitempty"` } // TopologySpreadConstraintApplyConfiguration constructs an declarative configuration of the TopologySpreadConstraint type for use with @@ -96,3 +97,13 @@ func (b *TopologySpreadConstraintApplyConfiguration) WithNodeTaintsPolicy(value b.NodeTaintsPolicy = &value return b } + +// WithMatchLabelKeys adds the given value to the MatchLabelKeys field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the MatchLabelKeys field. +func (b *TopologySpreadConstraintApplyConfiguration) WithMatchLabelKeys(values ...string) *TopologySpreadConstraintApplyConfiguration { + for i := range values { + b.MatchLabelKeys = append(b.MatchLabelKeys, values[i]) + } + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/internal/internal.go b/staging/src/k8s.io/client-go/applyconfigurations/internal/internal.go index 0ba6a6f4d81..fd65afb173a 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/internal/internal.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/internal/internal.go @@ -6858,6 +6858,12 @@ var schemaYAML = typed.YAMLObject(`types: - name: labelSelector type: namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: matchLabelKeys + type: + list: + elementType: + scalar: string + elementRelationship: atomic - name: maxSkew type: scalar: numeric diff --git a/test/integration/scheduler/filters/filters_test.go b/test/integration/scheduler/filters/filters_test.go index 7428938e03b..edd3241e236 100644 --- a/test/integration/scheduler/filters/filters_test.go +++ b/test/integration/scheduler/filters/filters_test.go @@ -1076,12 +1076,13 @@ func TestPodTopologySpreadFilter(t *testing.T) { candidateNodes []string // nodes expected to schedule onto enableMinDomains bool enableNodeInclustionPolicy bool + enableMatchLabelKeys bool }{ // note: naming starts at index 0 { name: "place pod on a 1/1/0/1 cluster with MaxSkew=1, node-2 is the only fit", incomingPod: st.MakePod().Name("p").Label("foo", "").Container(pause). - SpreadConstraint(1, "node", hardSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil). + SpreadConstraint(1, "node", hardSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p0").Node("node-0").Label("foo", "").Container(pause).Obj(), @@ -1095,7 +1096,7 @@ func TestPodTopologySpreadFilter(t *testing.T) { { name: "place pod on a 2/0/0/1 cluster with MaxSkew=2, node-{1,2,3} are good fits", incomingPod: st.MakePod().Name("p").Label("foo", "").Container(pause). - SpreadConstraint(2, "node", hardSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil). + SpreadConstraint(2, "node", hardSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p0a").Node("node-0").Label("foo", "").Container(pause).Obj(), @@ -1110,7 +1111,7 @@ func TestPodTopologySpreadFilter(t *testing.T) { name: "pod is required to be placed on zone0, so only node-1 fits", incomingPod: st.MakePod().Name("p").Label("foo", "").Container(pause). NodeAffinityIn("zone", []string{"zone-0"}). - SpreadConstraint(1, "node", hardSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil). + SpreadConstraint(1, "node", hardSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p0").Node("node-0").Label("foo", "").Container(pause).Obj(), @@ -1123,8 +1124,8 @@ func TestPodTopologySpreadFilter(t *testing.T) { { name: "two constraints: pod can only be placed to zone-1/node-2", incomingPod: st.MakePod().Name("p").Label("foo", "").Container(pause). - SpreadConstraint(1, "zone", hardSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil). - SpreadConstraint(1, "node", hardSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil). + SpreadConstraint(1, "zone", hardSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, nil). + SpreadConstraint(1, "node", hardSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p0").Node("node-0").Label("foo", "").Container(pause).Obj(), @@ -1140,8 +1141,8 @@ func TestPodTopologySpreadFilter(t *testing.T) { name: "pod cannot be placed onto any node", incomingPod: st.MakePod().Name("p").Label("foo", "").Container(pause). NodeAffinityNotIn("node", []string{"node-0"}). // mock a 3-node cluster - SpreadConstraint(1, "zone", hardSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil). - SpreadConstraint(1, "node", hardSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil). + SpreadConstraint(1, "zone", hardSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, nil). + SpreadConstraint(1, "node", hardSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p1a").Node("node-1").Label("foo", "").Container(pause).Obj(), @@ -1157,8 +1158,8 @@ func TestPodTopologySpreadFilter(t *testing.T) { name: "high priority pod can preempt others", incomingPod: st.MakePod().Name("p").Label("foo", "").Container(pause).Priority(100). NodeAffinityNotIn("node", []string{"node-0"}). // mock a 3-node cluster - SpreadConstraint(1, "zone", hardSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil). - SpreadConstraint(1, "node", hardSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil). + SpreadConstraint(1, "zone", hardSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, nil). + SpreadConstraint(1, "node", hardSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().ZeroTerminationGracePeriod().Name("p1a").Node("node-1").Label("foo", "").Container(pause).Obj(), @@ -1183,6 +1184,7 @@ func TestPodTopologySpreadFilter(t *testing.T) { pointer.Int32(4), // larger than the number of domains (= 3) nil, nil, + nil, ). Obj(), existingPods: []*v1.Pod{ @@ -1209,6 +1211,7 @@ func TestPodTopologySpreadFilter(t *testing.T) { pointer.Int32(2), // smaller than the number of domains (= 3) nil, nil, + nil, ). Obj(), existingPods: []*v1.Pod{ @@ -1234,6 +1237,7 @@ func TestPodTopologySpreadFilter(t *testing.T) { pointer.Int32(3), // larger than the number of domains(2) nil, nil, + nil, ).Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p1a").Node("node-0").Label("foo", "").Container(pause).Obj(), @@ -1256,6 +1260,7 @@ func TestPodTopologySpreadFilter(t *testing.T) { pointer.Int32(1), // smaller than the number of domains(2) nil, nil, + nil, ).Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p1a").Node("node-1").Label("foo", "").Container(pause).Obj(), @@ -1271,7 +1276,7 @@ func TestPodTopologySpreadFilter(t *testing.T) { name: "NodeAffinityPolicy honored with labelSelectors, pods spread across zone as 2/1", incomingPod: st.MakePod().Name("p").Label("foo", "").Container(pause). NodeSelector(map[string]string{"foo": ""}). - SpreadConstraint(1, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p1a").Node("node-1").Label("foo", "").Container(pause).Obj(), @@ -1293,7 +1298,7 @@ func TestPodTopologySpreadFilter(t *testing.T) { name: "NodeAffinityPolicy ignored with nodeAffinity, pods spread across zone as 1/~2~", incomingPod: st.MakePod().Name("p").Label("foo", "").Container(pause). NodeAffinityIn("foo", []string{""}). - SpreadConstraint(1, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, &ignorePolicy, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, &ignorePolicy, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p1a").Node("node-1").Label("foo", "").Container(pause).Obj(), @@ -1313,7 +1318,7 @@ func TestPodTopologySpreadFilter(t *testing.T) { { name: "NodeTaintsPolicy honored, pods spread across zone as 2/1", incomingPod: st.MakePod().Name("p").Label("foo", "").Container(pause). - SpreadConstraint(1, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, &honorPolicy). + SpreadConstraint(1, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, &honorPolicy, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p1a").Node("node-1").Label("foo", "").Container(pause).Obj(), @@ -1334,7 +1339,7 @@ func TestPodTopologySpreadFilter(t *testing.T) { { name: "NodeTaintsPolicy ignored, pods spread across zone as 2/2", incomingPod: st.MakePod().Name("p").Label("foo", "").Container(pause). - SpreadConstraint(1, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p1a").Node("node-1").Label("foo", "").Container(pause).Obj(), @@ -1359,8 +1364,8 @@ func TestPodTopologySpreadFilter(t *testing.T) { name: "two node inclusion Constraints, zone: honor/ignore, node: honor/ignore", incomingPod: st.MakePod().Name("p").Label("foo", "").Container(pause). NodeSelector(map[string]string{"foo": ""}). - SpreadConstraint(1, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p1a").Node("node-1").Label("foo", "").Container(pause).Obj(), @@ -1385,8 +1390,8 @@ func TestPodTopologySpreadFilter(t *testing.T) { name: "feature gate disabled, two node inclusion Constraints, zone: honor/ignore, node: honor/ignore", incomingPod: st.MakePod().Name("p").Label("foo", "").Container(pause). NodeSelector(map[string]string{"foo": ""}). - SpreadConstraint(1, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil). + SpreadConstraint(1, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p1a").Node("node-1").Label("foo", "").Container(pause).Obj(), @@ -1411,8 +1416,8 @@ func TestPodTopologySpreadFilter(t *testing.T) { name: "two node inclusion Constraints, zone: ignore/ignore, node: honor/honor", incomingPod: st.MakePod().Name("p").Label("foo", "").Container(pause). NodeSelector(map[string]string{"foo": ""}). - SpreadConstraint(1, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, &ignorePolicy, nil). - SpreadConstraint(1, "node", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, &honorPolicy). + SpreadConstraint(1, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, &ignorePolicy, nil, nil). + SpreadConstraint(1, "node", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, &honorPolicy, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p1a").Node("node-1").Label("foo", "").Container(pause).Obj(), @@ -1430,11 +1435,57 @@ func TestPodTopologySpreadFilter(t *testing.T) { candidateNodes: []string{"node-1", "node-4"}, enableNodeInclustionPolicy: true, }, + { + name: "matchLabelKeys ignored when feature gate disabled, pods spread across zone as 2/1", + incomingPod: st.MakePod().Name("p").Label("foo", "").Label("bar", "").Container(pause). + SpreadConstraint(1, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, []string{"bar"}). + Obj(), + existingPods: []*v1.Pod{ + st.MakePod().Name("p1a").Node("node-0").Label("foo", "").Container(pause).Obj(), + st.MakePod().Name("p2a").Node("node-1").Label("foo", "").Container(pause).Obj(), + st.MakePod().Name("p3a").Node("node-2").Label("foo", "").Label("bar", "").Container(pause).Obj(), + }, + fits: true, + nodes: defaultNodes, + candidateNodes: []string{"node-2", "node-3"}, + enableMatchLabelKeys: false, + }, + { + name: "matchLabelKeys ANDed with LabelSelector when LabelSelector isn't empty, pods spread across zone as 0/1", + incomingPod: st.MakePod().Name("p").Label("foo", "").Label("bar", "").Container(pause). + SpreadConstraint(1, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, []string{"bar"}). + Obj(), + existingPods: []*v1.Pod{ + st.MakePod().Name("p1a").Node("node-0").Label("foo", "").Container(pause).Obj(), + st.MakePod().Name("p2a").Node("node-1").Label("foo", "").Container(pause).Obj(), + st.MakePod().Name("p3a").Node("node-2").Label("foo", "").Label("bar", "").Container(pause).Obj(), + }, + fits: true, + nodes: defaultNodes, + candidateNodes: []string{"node-0", "node-1"}, + enableMatchLabelKeys: true, + }, + { + name: "matchLabelKeys ANDed with LabelSelector when LabelSelector is empty, pods spread across zone as 2/1", + incomingPod: st.MakePod().Name("p").Label("foo", "").Container(pause). + SpreadConstraint(1, "zone", v1.DoNotSchedule, st.MakeLabelSelector().Obj(), nil, nil, nil, []string{"foo"}). + Obj(), + existingPods: []*v1.Pod{ + st.MakePod().Name("p1a").Node("node-0").Label("foo", "").Container(pause).Obj(), + st.MakePod().Name("p2a").Node("node-1").Label("foo", "").Container(pause).Obj(), + st.MakePod().Name("p3a").Node("node-2").Label("foo", "").Container(pause).Obj(), + }, + fits: true, + nodes: defaultNodes, + candidateNodes: []string{"node-2", "node-3"}, + enableMatchLabelKeys: true, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.MinDomainsInPodTopologySpread, tt.enableMinDomains)() defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.NodeInclusionPolicyInPodTopologySpread, tt.enableNodeInclustionPolicy)() + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.MatchLabelKeysInPodTopologySpread, tt.enableMatchLabelKeys)() testCtx := initTest(t, "pts-predicate") cs := testCtx.ClientSet diff --git a/test/integration/scheduler/scoring/priorities_test.go b/test/integration/scheduler/scoring/priorities_test.go index 3f75ab5eab1..117c1e8fbe3 100644 --- a/test/integration/scheduler/scoring/priorities_test.go +++ b/test/integration/scheduler/scoring/priorities_test.go @@ -449,13 +449,14 @@ func TestPodTopologySpreadScoring(t *testing.T) { nodes []*v1.Node want []string // nodes expected to schedule onto enableNodeInclustionPolicy bool + enableMatchLabelKeys bool }{ // note: naming starts at index 0 // the symbol ~X~ means that node is infeasible { name: "place pod on a ~0~/1/2/3 cluster with MaxSkew=1, node-1 is the preferred fit", incomingPod: st.MakePod().Name("p").Label("foo", "").Container(pause). - SpreadConstraint(1, "node", softSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil). + SpreadConstraint(1, "node", softSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p1").Node("node-1").Label("foo", "").Container(pause).Obj(), @@ -472,8 +473,8 @@ func TestPodTopologySpreadScoring(t *testing.T) { { name: "combined with hardSpread constraint on a ~4~/0/1/2 cluster", incomingPod: st.MakePod().Name("p").Label("foo", "").Container(pause). - SpreadConstraint(1, "node", softSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil). - SpreadConstraint(1, "zone", hardSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil). + SpreadConstraint(1, "node", softSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, nil). + SpreadConstraint(1, "zone", hardSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p0a").Node("node-0").Label("foo", "").Container(pause).Obj(), @@ -495,8 +496,8 @@ func TestPodTopologySpreadScoring(t *testing.T) { name: "soft constraint with two node inclusion Constraints, zone: honor/ignore, node: honor/ignore", incomingPod: st.MakePod().Name("p").Label("foo", "").Container(pause). NodeSelector(map[string]string{"foo": ""}). - SpreadConstraint(1, "zone", softSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil). - SpreadConstraint(1, "node", softSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil). + SpreadConstraint(1, "zone", softSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, nil). + SpreadConstraint(1, "node", softSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p1a").Node("node-1").Label("foo", "").Container(pause).Obj(), @@ -521,8 +522,8 @@ func TestPodTopologySpreadScoring(t *testing.T) { name: "soft constraint with two node inclusion Constraints, zone: ignore/ignore, node: honor/honor", incomingPod: st.MakePod().Name("p").Label("foo", "").Container(pause). NodeSelector(map[string]string{"foo": ""}). - SpreadConstraint(1, "zone", softSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, &ignorePolicy, nil). - SpreadConstraint(1, "node", softSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, &honorPolicy). + SpreadConstraint(1, "zone", softSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, &ignorePolicy, nil, nil). + SpreadConstraint(1, "node", softSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, &honorPolicy, nil). Obj(), existingPods: []*v1.Pod{ st.MakePod().Name("p1a").Node("node-1").Label("foo", "").Container(pause).Obj(), @@ -540,10 +541,65 @@ func TestPodTopologySpreadScoring(t *testing.T) { want: []string{"node-3"}, enableNodeInclustionPolicy: true, }, + { + name: "matchLabelKeys ignored when feature gate disabled, node-1 is the preferred fit", + incomingPod: st.MakePod().Name("p").Label("foo", "").Label("bar", "").Container(pause). + SpreadConstraint(1, "node", softSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, []string{"bar"}). + Obj(), + existingPods: []*v1.Pod{ + st.MakePod().Name("p1").Node("node-1").Label("foo", "").Label("bar", "").Container(pause).Obj(), + st.MakePod().Name("p2a").Node("node-2").Label("foo", "").Container(pause).Obj(), + st.MakePod().Name("p2b").Node("node-2").Label("foo", "").Container(pause).Obj(), + st.MakePod().Name("p3a").Node("node-3").Label("foo", "").Label("bar", "").Container(pause).Obj(), + st.MakePod().Name("p3b").Node("node-3").Label("foo", "").Label("bar", "").Container(pause).Obj(), + st.MakePod().Name("p3c").Node("node-3").Label("foo", "").Container(pause).Obj(), + }, + fits: true, + nodes: defaultNodes, + want: []string{"node-1"}, + enableMatchLabelKeys: false, + }, + { + name: "matchLabelKeys ANDed with LabelSelector when LabelSelector isn't empty, node-2 is the preferred fit", + incomingPod: st.MakePod().Name("p").Label("foo", "").Label("bar", "").Container(pause). + SpreadConstraint(1, "node", softSpread, st.MakeLabelSelector().Exists("foo").Obj(), nil, nil, nil, []string{"bar"}). + Obj(), + existingPods: []*v1.Pod{ + st.MakePod().Name("p1").Node("node-1").Label("foo", "").Label("bar", "").Container(pause).Obj(), + st.MakePod().Name("p2a").Node("node-2").Label("foo", "").Container(pause).Obj(), + st.MakePod().Name("p2b").Node("node-2").Label("foo", "").Container(pause).Obj(), + st.MakePod().Name("p3a").Node("node-3").Label("foo", "").Label("bar", "").Container(pause).Obj(), + st.MakePod().Name("p3b").Node("node-3").Label("foo", "").Label("bar", "").Container(pause).Obj(), + st.MakePod().Name("p3c").Node("node-3").Label("foo", "").Container(pause).Obj(), + }, + fits: true, + nodes: defaultNodes, + want: []string{"node-2"}, + enableMatchLabelKeys: true, + }, + { + name: "matchLabelKeys ANDed with LabelSelector when LabelSelector is empty, node-1 is the preferred fit", + incomingPod: st.MakePod().Name("p").Label("foo", "").Container(pause). + SpreadConstraint(1, "node", softSpread, st.MakeLabelSelector().Obj(), nil, nil, nil, []string{"foo"}). + Obj(), + existingPods: []*v1.Pod{ + st.MakePod().Name("p1").Node("node-1").Label("foo", "").Container(pause).Obj(), + st.MakePod().Name("p2a").Node("node-2").Label("foo", "").Container(pause).Obj(), + st.MakePod().Name("p2b").Node("node-2").Label("foo", "").Container(pause).Obj(), + st.MakePod().Name("p3a").Node("node-3").Label("foo", "").Container(pause).Obj(), + st.MakePod().Name("p3b").Node("node-3").Label("foo", "").Container(pause).Obj(), + st.MakePod().Name("p3c").Node("node-3").Label("foo", "").Container(pause).Obj(), + }, + fits: true, + nodes: defaultNodes, + want: []string{"node-1"}, + enableMatchLabelKeys: true, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.NodeInclusionPolicyInPodTopologySpread, tt.enableNodeInclustionPolicy)() + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.MatchLabelKeysInPodTopologySpread, tt.enableMatchLabelKeys)() testCtx := initTestSchedulerForPriorityTest(t, podtopologyspread.Name) defer testutils.CleanupTest(t, testCtx)