diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index a32d24d975..777908e3f9 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -80125,12 +80125,16 @@ "description": "ResourceQuotaSpec defines the desired hard limits to enforce for Quota.", "properties": { "hard": { - "description": "Hard is the set of desired hard limits for each named resource. More info: https://kubernetes.io/docs/concepts/policy/resource-quotas/", + "description": "hard is the set of desired hard limits for each named resource. More info: https://kubernetes.io/docs/concepts/policy/resource-quotas/", "type": "object", "additionalProperties": { "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity" } }, + "scopeSelector": { + "description": "scopeSelector is also a collection of filters like scopes that must match each object tracked by a quota but expressed using ScopeSelectorOperator in combination with possible values. For a resource to match, both scopes AND scopeSelector (if specified in spec), must be matched.", + "$ref": "#/definitions/io.k8s.api.core.v1.ScopeSelector" + }, "scopes": { "description": "A collection of filters that must match each object tracked by a quota. If not specified, the quota matches all objects.", "type": "array", @@ -80299,6 +80303,42 @@ } } }, + "io.k8s.api.core.v1.ScopeSelector": { + "description": "A scope selector represents the AND of the selectors represented by the scoped-resource selector requirements.", + "properties": { + "matchExpressions": { + "description": "A list of scope selector requirements by scope of the resources.", + "type": "array", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.ScopedResourceSelectorRequirement" + } + } + } + }, + "io.k8s.api.core.v1.ScopedResourceSelectorRequirement": { + "description": "A scoped-resource selector requirement is a selector that contains values, a scope name, and an operator that relates the scope name and values.", + "required": [ + "scopeName", + "operator" + ], + "properties": { + "operator": { + "description": "Represents a scope's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist.", + "type": "string" + }, + "scopeName": { + "description": "The name of the scope that the selector applies to.", + "type": "string" + }, + "values": { + "description": "An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, "io.k8s.api.core.v1.Secret": { "description": "Secret holds secret data of a certain type. The total bytes of the values in the Data field must be less than MaxSecretSize bytes.", "properties": { diff --git a/api/swagger-spec/v1.json b/api/swagger-spec/v1.json index a069643a40..3238f6a017 100644 --- a/api/swagger-spec/v1.json +++ b/api/swagger-spec/v1.json @@ -22532,7 +22532,7 @@ "properties": { "hard": { "type": "object", - "description": "Hard is the set of desired hard limits for each named resource. More info: https://kubernetes.io/docs/concepts/policy/resource-quotas/" + "description": "hard is the set of desired hard limits for each named resource. More info: https://kubernetes.io/docs/concepts/policy/resource-quotas/" }, "scopes": { "type": "array", @@ -22540,6 +22540,10 @@ "$ref": "v1.ResourceQuotaScope" }, "description": "A collection of filters that must match each object tracked by a quota. If not specified, the quota matches all objects." + }, + "scopeSelector": { + "$ref": "v1.ScopeSelector", + "description": "scopeSelector is also a collection of filters like scopes that must match each object tracked by a quota but expressed using ScopeSelectorOperator in combination with possible values. For a resource to match, both scopes AND scopeSelector (if specified in spec), must be matched." } } }, @@ -22547,6 +22551,44 @@ "id": "v1.ResourceQuotaScope", "properties": {} }, + "v1.ScopeSelector": { + "id": "v1.ScopeSelector", + "description": "A scope selector represents the AND of the selectors represented by the scoped-resource selector requirements.", + "properties": { + "matchExpressions": { + "type": "array", + "items": { + "$ref": "v1.ScopedResourceSelectorRequirement" + }, + "description": "A list of scope selector requirements by scope of the resources." + } + } + }, + "v1.ScopedResourceSelectorRequirement": { + "id": "v1.ScopedResourceSelectorRequirement", + "description": "A scoped-resource selector requirement is a selector that contains values, a scope name, and an operator that relates the scope name and values.", + "required": [ + "scopeName", + "operator" + ], + "properties": { + "scopeName": { + "type": "string", + "description": "The name of the scope that the selector applies to." + }, + "operator": { + "type": "string", + "description": "Represents a scope's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist." + }, + "values": { + "type": "array", + "items": { + "type": "string" + }, + "description": "An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch." + } + } + }, "v1.ResourceQuotaStatus": { "id": "v1.ResourceQuotaStatus", "description": "ResourceQuotaStatus defines the enforced hard limits and observed use.", diff --git a/docs/api-reference/v1/definitions.html b/docs/api-reference/v1/definitions.html index 0852798cd6..44a72a031a 100755 --- a/docs/api-reference/v1/definitions.html +++ b/docs/api-reference/v1/definitions.html @@ -5963,6 +5963,40 @@ Examples:
+ +
+

v1.ScopeSelector

+
+

A scope selector represents the AND of the selectors represented by the scoped-resource selector requirements.

+
+ +++++++ + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

matchExpressions

A list of scope selector requirements by scope of the resources.

false

v1.ScopedResourceSelectorRequirement array

+

v1.NodeSystemInfo

@@ -6870,7 +6904,7 @@ Examples:

hard

-

Hard is the set of desired hard limits for each named resource. More info: https://kubernetes.io/docs/concepts/policy/resource-quotas/

+

hard is the set of desired hard limits for each named resource. More info: https://kubernetes.io/docs/concepts/policy/resource-quotas/

false

object

@@ -6882,6 +6916,13 @@ Examples:

v1.ResourceQuotaScope array

+ +

scopeSelector

+

scopeSelector is also a collection of filters like scopes that must match each object tracked by a quota but expressed using ScopeSelectorOperator in combination with possible values. For a resource to match, both scopes AND scopeSelector (if specified in spec), must be matched.

+

false

+

v1.ScopeSelector

+ + @@ -8377,61 +8418,6 @@ Examples:
-
-
-

v1.LimitRangeList

-
-

LimitRangeList is a list of LimitRange items.

-
- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequiredSchemaDefault

kind

Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

false

string

apiVersion

APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

false

string

metadata

Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

false

v1.ListMeta

items

Items is a list of LimitRange objects. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/

true

v1.LimitRange array

-

v1.ServiceAccountList

@@ -8487,6 +8473,61 @@ Examples:
+
+
+

v1.LimitRangeList

+
+

LimitRangeList is a list of LimitRange items.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

kind

Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

false

string

apiVersion

APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

false

string

metadata

Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

false

v1.ListMeta

items

Items is a list of LimitRange objects. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/

true

v1.LimitRange array

+

v1.Endpoints

@@ -9607,6 +9648,54 @@ More info: +

v1.ScopedResourceSelectorRequirement

+
+

A scoped-resource selector requirement is a selector that contains values, a scope name, and an operator that relates the scope name and values.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

scopeName

The name of the scope that the selector applies to.

true

string

operator

Represents a scope’s relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist.

true

string

values

An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.

false

string array

+

v1.EventList

diff --git a/pkg/apis/core/helper/helpers.go b/pkg/apis/core/helper/helpers.go index 7f0523579e..6994778833 100644 --- a/pkg/apis/core/helper/helpers.go +++ b/pkg/apis/core/helper/helpers.go @@ -103,6 +103,7 @@ var standardResourceQuotaScopes = sets.NewString( string(core.ResourceQuotaScopeNotTerminating), string(core.ResourceQuotaScopeBestEffort), string(core.ResourceQuotaScopeNotBestEffort), + string(core.ResourceQuotaScopePriorityClass), ) // IsStandardResourceQuotaScope returns true if the scope is a standard value @@ -126,7 +127,7 @@ var podComputeQuotaResources = sets.NewString( // IsResourceQuotaScopeValidForResource returns true if the resource applies to the specified scope func IsResourceQuotaScopeValidForResource(scope core.ResourceQuotaScope, resource string) bool { switch scope { - case core.ResourceQuotaScopeTerminating, core.ResourceQuotaScopeNotTerminating, core.ResourceQuotaScopeNotBestEffort: + case core.ResourceQuotaScopeTerminating, core.ResourceQuotaScopeNotTerminating, core.ResourceQuotaScopeNotBestEffort, core.ResourceQuotaScopePriorityClass: return podObjectCountQuotaResources.Has(resource) || podComputeQuotaResources.Has(resource) case core.ResourceQuotaScopeBestEffort: return podObjectCountQuotaResources.Has(resource) @@ -584,3 +585,28 @@ func PersistentVolumeClaimHasClass(claim *core.PersistentVolumeClaim) bool { return false } + +// ScopedResourceSelectorRequirementsAsSelector converts the ScopedResourceSelectorRequirement api type into a struct that implements +// labels.Selector. +func ScopedResourceSelectorRequirementsAsSelector(ssr core.ScopedResourceSelectorRequirement) (labels.Selector, error) { + selector := labels.NewSelector() + var op selection.Operator + switch ssr.Operator { + case core.ScopeSelectorOpIn: + op = selection.In + case core.ScopeSelectorOpNotIn: + op = selection.NotIn + case core.ScopeSelectorOpExists: + op = selection.Exists + case core.ScopeSelectorOpDoesNotExist: + op = selection.DoesNotExist + default: + return nil, fmt.Errorf("%q is not a valid scope selector operator", ssr.Operator) + } + r, err := labels.NewRequirement(string(ssr.ScopeName), op, ssr.Values) + if err != nil { + return nil, err + } + selector = selector.Add(*r) + return selector, nil +} diff --git a/pkg/apis/core/types.go b/pkg/apis/core/types.go index bd8423bdc7..0f750b1b57 100644 --- a/pkg/apis/core/types.go +++ b/pkg/apis/core/types.go @@ -4168,6 +4168,8 @@ const ( ResourceQuotaScopeBestEffort ResourceQuotaScope = "BestEffort" // Match all pod objects that do not have best effort quality of service ResourceQuotaScopeNotBestEffort ResourceQuotaScope = "NotBestEffort" + // Match all pod objects that have priority class mentioned + ResourceQuotaScopePriorityClass ResourceQuotaScope = "PriorityClass" ) // ResourceQuotaSpec defines the desired hard limits to enforce for Quota @@ -4179,8 +4181,47 @@ type ResourceQuotaSpec struct { // If not specified, the quota matches all objects. // +optional Scopes []ResourceQuotaScope + // ScopeSelector is also a collection of filters like Scopes that must match each object tracked by a quota + // but expressed using ScopeSelectorOperator in combination with possible values. + // +optional + ScopeSelector *ScopeSelector } +// A scope selector represents the AND of the selectors represented +// by the scoped-resource selector terms. +type ScopeSelector struct { + // A list of scope selector requirements by scope of the resources. + // +optional + MatchExpressions []ScopedResourceSelectorRequirement +} + +// A scoped-resource selector requirement is a selector that contains values, a scope name, and an operator +// that relates the scope name and values. +type ScopedResourceSelectorRequirement struct { + // The name of the scope that the selector applies to. + ScopeName ResourceQuotaScope + // Represents a scope's relationship to a set of values. + // Valid operators are In, NotIn, Exists, DoesNotExist. + Operator ScopeSelectorOperator + // An array of string values. If the operator is In or NotIn, + // the values array must be non-empty. If the operator is Exists or DoesNotExist, + // the values array must be empty. + // This array is replaced during a strategic merge patch. + // +optional + Values []string +} + +// A scope selector operator is the set of operators that can be used in +// a scope selector requirement. +type ScopeSelectorOperator string + +const ( + ScopeSelectorOpIn ScopeSelectorOperator = "In" + ScopeSelectorOpNotIn ScopeSelectorOperator = "NotIn" + ScopeSelectorOpExists ScopeSelectorOperator = "Exists" + ScopeSelectorOpDoesNotExist ScopeSelectorOperator = "DoesNotExist" +) + // ResourceQuotaStatus defines the enforced hard limits and observed use type ResourceQuotaStatus struct { // Hard is the set of enforced hard limits for each named resource diff --git a/pkg/apis/core/v1/zz_generated.conversion.go b/pkg/apis/core/v1/zz_generated.conversion.go index 8799028077..2defb9e004 100644 --- a/pkg/apis/core/v1/zz_generated.conversion.go +++ b/pkg/apis/core/v1/zz_generated.conversion.go @@ -354,6 +354,10 @@ func RegisterConversions(scheme *runtime.Scheme) error { Convert_core_ScaleIOPersistentVolumeSource_To_v1_ScaleIOPersistentVolumeSource, Convert_v1_ScaleIOVolumeSource_To_core_ScaleIOVolumeSource, Convert_core_ScaleIOVolumeSource_To_v1_ScaleIOVolumeSource, + Convert_v1_ScopeSelector_To_core_ScopeSelector, + Convert_core_ScopeSelector_To_v1_ScopeSelector, + Convert_v1_ScopedResourceSelectorRequirement_To_core_ScopedResourceSelectorRequirement, + Convert_core_ScopedResourceSelectorRequirement_To_v1_ScopedResourceSelectorRequirement, Convert_v1_Secret_To_core_Secret, Convert_core_Secret_To_v1_Secret, Convert_v1_SecretEnvSource_To_core_SecretEnvSource, @@ -4641,6 +4645,7 @@ func Convert_core_ResourceQuotaList_To_v1_ResourceQuotaList(in *core.ResourceQuo func autoConvert_v1_ResourceQuotaSpec_To_core_ResourceQuotaSpec(in *v1.ResourceQuotaSpec, out *core.ResourceQuotaSpec, s conversion.Scope) error { out.Hard = *(*core.ResourceList)(unsafe.Pointer(&in.Hard)) out.Scopes = *(*[]core.ResourceQuotaScope)(unsafe.Pointer(&in.Scopes)) + out.ScopeSelector = (*core.ScopeSelector)(unsafe.Pointer(in.ScopeSelector)) return nil } @@ -4652,6 +4657,7 @@ func Convert_v1_ResourceQuotaSpec_To_core_ResourceQuotaSpec(in *v1.ResourceQuota func autoConvert_core_ResourceQuotaSpec_To_v1_ResourceQuotaSpec(in *core.ResourceQuotaSpec, out *v1.ResourceQuotaSpec, s conversion.Scope) error { out.Hard = *(*v1.ResourceList)(unsafe.Pointer(&in.Hard)) out.Scopes = *(*[]v1.ResourceQuotaScope)(unsafe.Pointer(&in.Scopes)) + out.ScopeSelector = (*v1.ScopeSelector)(unsafe.Pointer(in.ScopeSelector)) return nil } @@ -4806,6 +4812,50 @@ func Convert_core_ScaleIOVolumeSource_To_v1_ScaleIOVolumeSource(in *core.ScaleIO return autoConvert_core_ScaleIOVolumeSource_To_v1_ScaleIOVolumeSource(in, out, s) } +func autoConvert_v1_ScopeSelector_To_core_ScopeSelector(in *v1.ScopeSelector, out *core.ScopeSelector, s conversion.Scope) error { + out.MatchExpressions = *(*[]core.ScopedResourceSelectorRequirement)(unsafe.Pointer(&in.MatchExpressions)) + return nil +} + +// Convert_v1_ScopeSelector_To_core_ScopeSelector is an autogenerated conversion function. +func Convert_v1_ScopeSelector_To_core_ScopeSelector(in *v1.ScopeSelector, out *core.ScopeSelector, s conversion.Scope) error { + return autoConvert_v1_ScopeSelector_To_core_ScopeSelector(in, out, s) +} + +func autoConvert_core_ScopeSelector_To_v1_ScopeSelector(in *core.ScopeSelector, out *v1.ScopeSelector, s conversion.Scope) error { + out.MatchExpressions = *(*[]v1.ScopedResourceSelectorRequirement)(unsafe.Pointer(&in.MatchExpressions)) + return nil +} + +// Convert_core_ScopeSelector_To_v1_ScopeSelector is an autogenerated conversion function. +func Convert_core_ScopeSelector_To_v1_ScopeSelector(in *core.ScopeSelector, out *v1.ScopeSelector, s conversion.Scope) error { + return autoConvert_core_ScopeSelector_To_v1_ScopeSelector(in, out, s) +} + +func autoConvert_v1_ScopedResourceSelectorRequirement_To_core_ScopedResourceSelectorRequirement(in *v1.ScopedResourceSelectorRequirement, out *core.ScopedResourceSelectorRequirement, s conversion.Scope) error { + out.ScopeName = core.ResourceQuotaScope(in.ScopeName) + out.Operator = core.ScopeSelectorOperator(in.Operator) + out.Values = *(*[]string)(unsafe.Pointer(&in.Values)) + return nil +} + +// Convert_v1_ScopedResourceSelectorRequirement_To_core_ScopedResourceSelectorRequirement is an autogenerated conversion function. +func Convert_v1_ScopedResourceSelectorRequirement_To_core_ScopedResourceSelectorRequirement(in *v1.ScopedResourceSelectorRequirement, out *core.ScopedResourceSelectorRequirement, s conversion.Scope) error { + return autoConvert_v1_ScopedResourceSelectorRequirement_To_core_ScopedResourceSelectorRequirement(in, out, s) +} + +func autoConvert_core_ScopedResourceSelectorRequirement_To_v1_ScopedResourceSelectorRequirement(in *core.ScopedResourceSelectorRequirement, out *v1.ScopedResourceSelectorRequirement, s conversion.Scope) error { + out.ScopeName = v1.ResourceQuotaScope(in.ScopeName) + out.Operator = v1.ScopeSelectorOperator(in.Operator) + out.Values = *(*[]string)(unsafe.Pointer(&in.Values)) + return nil +} + +// Convert_core_ScopedResourceSelectorRequirement_To_v1_ScopedResourceSelectorRequirement is an autogenerated conversion function. +func Convert_core_ScopedResourceSelectorRequirement_To_v1_ScopedResourceSelectorRequirement(in *core.ScopedResourceSelectorRequirement, out *v1.ScopedResourceSelectorRequirement, s conversion.Scope) error { + return autoConvert_core_ScopedResourceSelectorRequirement_To_v1_ScopedResourceSelectorRequirement(in, out, s) +} + func autoConvert_v1_Secret_To_core_Secret(in *v1.Secret, out *core.Secret, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta out.Data = *(*map[string][]byte)(unsafe.Pointer(&in.Data)) diff --git a/pkg/apis/core/validation/validation.go b/pkg/apis/core/validation/validation.go index 3c1d29a04c..4001e8f433 100644 --- a/pkg/apis/core/validation/validation.go +++ b/pkg/apis/core/validation/validation.go @@ -4786,6 +4786,74 @@ func validateResourceQuotaScopes(resourceQuotaSpec *core.ResourceQuotaSpec, fld return allErrs } +// validateScopedResourceSelectorRequirement tests that the match expressions has valid data +func validateScopedResourceSelectorRequirement(resourceQuotaSpec *core.ResourceQuotaSpec, fld *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + hardLimits := sets.NewString() + for k := range resourceQuotaSpec.Hard { + hardLimits.Insert(string(k)) + } + fldPath := fld.Child("matchExpressions") + scopeSet := sets.NewString() + for _, req := range resourceQuotaSpec.ScopeSelector.MatchExpressions { + if !helper.IsStandardResourceQuotaScope(string(req.ScopeName)) { + allErrs = append(allErrs, field.Invalid(fldPath.Child("scopeName"), req.ScopeName, "unsupported scope")) + } + for _, k := range hardLimits.List() { + if helper.IsStandardQuotaResourceName(k) && !helper.IsResourceQuotaScopeValidForResource(req.ScopeName, k) { + allErrs = append(allErrs, field.Invalid(fldPath, resourceQuotaSpec.ScopeSelector, "unsupported scope applied to resource")) + } + } + switch req.ScopeName { + case core.ResourceQuotaScopeBestEffort, core.ResourceQuotaScopeNotBestEffort, core.ResourceQuotaScopeTerminating, core.ResourceQuotaScopeNotTerminating: + if req.Operator != core.ScopeSelectorOpExists { + allErrs = append(allErrs, field.Invalid(fldPath.Child("operator"), req.Operator, + "must be 'Exist' only operator when scope is any of ResourceQuotaScopeTerminating, ResourceQuotaScopeNotTerminating, ResourceQuotaScopeBestEffort and ResourceQuotaScopeNotBestEffort")) + } + } + + switch req.Operator { + case core.ScopeSelectorOpIn, core.ScopeSelectorOpNotIn: + if len(req.Values) == 0 { + allErrs = append(allErrs, field.Required(fldPath.Child("values"), + "must be atleast one value when `operator` is 'In' or 'NotIn' for scope selector")) + } + case core.ScopeSelectorOpExists, core.ScopeSelectorOpDoesNotExist: + if len(req.Values) != 0 { + allErrs = append(allErrs, field.Invalid(fldPath.Child("values"), req.Values, + "must be no value when `operator` is 'Exist' or 'DoesNotExist' for scope selector")) + } + default: + allErrs = append(allErrs, field.Invalid(fldPath.Child("operator"), req.Operator, "not a valid selector operator")) + } + scopeSet.Insert(string(req.ScopeName)) + } + invalidScopePairs := []sets.String{ + sets.NewString(string(core.ResourceQuotaScopeBestEffort), string(core.ResourceQuotaScopeNotBestEffort)), + sets.NewString(string(core.ResourceQuotaScopeTerminating), string(core.ResourceQuotaScopeNotTerminating)), + } + for _, invalidScopePair := range invalidScopePairs { + if scopeSet.HasAll(invalidScopePair.List()...) { + allErrs = append(allErrs, field.Invalid(fldPath, resourceQuotaSpec.Scopes, "conflicting scopes")) + } + } + + return allErrs +} + +// validateScopeSelector tests that the specified scope selector has valid data +func validateScopeSelector(resourceQuotaSpec *core.ResourceQuotaSpec, fld *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + if resourceQuotaSpec.ScopeSelector == nil { + return allErrs + } + if !utilfeature.DefaultFeatureGate.Enabled(features.ResourceQuotaScopeSelectors) && resourceQuotaSpec.ScopeSelector != nil { + allErrs = append(allErrs, field.Forbidden(fld.Child("scopeSelector"), "ResourceQuotaScopeSelectors feature-gate is disabled")) + } + allErrs = append(allErrs, validateScopedResourceSelectorRequirement(resourceQuotaSpec, fld.Child("scopeSelector"))...) + return allErrs +} + // ValidateResourceQuota tests if required fields in the ResourceQuota are set. func ValidateResourceQuota(resourceQuota *core.ResourceQuota) field.ErrorList { allErrs := ValidateObjectMeta(&resourceQuota.ObjectMeta, true, ValidateResourceQuotaName, field.NewPath("metadata")) @@ -4825,6 +4893,7 @@ func ValidateResourceQuotaSpec(resourceQuotaSpec *core.ResourceQuotaSpec, fld *f allErrs = append(allErrs, ValidateResourceQuantityValue(string(k), v, resPath)...) } allErrs = append(allErrs, validateResourceQuotaScopes(resourceQuotaSpec, fld)...) + allErrs = append(allErrs, validateScopeSelector(resourceQuotaSpec, fld)...) return allErrs } diff --git a/pkg/apis/core/validation/validation_test.go b/pkg/apis/core/validation/validation_test.go index 2def762882..301d523883 100644 --- a/pkg/apis/core/validation/validation_test.go +++ b/pkg/apis/core/validation/validation_test.go @@ -11508,6 +11508,18 @@ func TestValidateResourceQuota(t *testing.T) { Scopes: []core.ResourceQuotaScope{core.ResourceQuotaScopeNotBestEffort}, } + scopeSelectorSpec := core.ResourceQuotaSpec{ + ScopeSelector: &core.ScopeSelector{ + MatchExpressions: []core.ScopedResourceSelectorRequirement{ + { + ScopeName: core.ResourceQuotaScopePriorityClass, + Operator: core.ScopeSelectorOpIn, + Values: []string{"cluster-services"}, + }, + }, + }, + } + // storage is not yet supported as a quota tracked resource invalidQuotaResourceSpec := core.ResourceQuotaSpec{ Hard: core.ResourceList{ @@ -11600,6 +11612,13 @@ func TestValidateResourceQuota(t *testing.T) { }, Spec: bestEffortSpec, }, + { + ObjectMeta: metav1.ObjectMeta{ + Name: "abc", + Namespace: "foo", + }, + Spec: scopeSelectorSpec, + }, { ObjectMeta: metav1.ObjectMeta{ Name: "abc", @@ -11608,12 +11627,13 @@ func TestValidateResourceQuota(t *testing.T) { Spec: nonBestEffortSpec, }, } - + utilfeature.DefaultFeatureGate.Set("ResourceQuotaScopeSelectors=true") for _, successCase := range successCases { if errs := ValidateResourceQuota(&successCase); len(errs) != 0 { t.Errorf("expected success: %v", errs) } } + utilfeature.DefaultFeatureGate.Set("ResourceQuotaScopeSelectors=false") errorCases := map[string]struct { R core.ResourceQuota @@ -11659,6 +11679,10 @@ func TestValidateResourceQuota(t *testing.T) { core.ResourceQuota{ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: "foo"}, Spec: invalidScopeNameSpec}, "unsupported scope", }, + "forbidden-quota-scope-selector": { + core.ResourceQuota{ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: "foo"}, Spec: scopeSelectorSpec}, + "feature-gate is disabled", + }, } for k, v := range errorCases { errs := ValidateResourceQuota(&v.R) diff --git a/pkg/apis/core/zz_generated.deepcopy.go b/pkg/apis/core/zz_generated.deepcopy.go index 6ce9c9539e..ba1a07f7c2 100644 --- a/pkg/apis/core/zz_generated.deepcopy.go +++ b/pkg/apis/core/zz_generated.deepcopy.go @@ -4630,6 +4630,15 @@ func (in *ResourceQuotaSpec) DeepCopyInto(out *ResourceQuotaSpec) { *out = make([]ResourceQuotaScope, len(*in)) copy(*out, *in) } + if in.ScopeSelector != nil { + in, out := &in.ScopeSelector, &out.ScopeSelector + if *in == nil { + *out = nil + } else { + *out = new(ScopeSelector) + (*in).DeepCopyInto(*out) + } + } return } @@ -4769,6 +4778,50 @@ func (in *ScaleIOVolumeSource) DeepCopy() *ScaleIOVolumeSource { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ScopeSelector) DeepCopyInto(out *ScopeSelector) { + *out = *in + if in.MatchExpressions != nil { + in, out := &in.MatchExpressions, &out.MatchExpressions + *out = make([]ScopedResourceSelectorRequirement, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ScopeSelector. +func (in *ScopeSelector) DeepCopy() *ScopeSelector { + if in == nil { + return nil + } + out := new(ScopeSelector) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ScopedResourceSelectorRequirement) DeepCopyInto(out *ScopedResourceSelectorRequirement) { + *out = *in + if in.Values != nil { + in, out := &in.Values, &out.Values + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ScopedResourceSelectorRequirement. +func (in *ScopedResourceSelectorRequirement) DeepCopy() *ScopedResourceSelectorRequirement { + if in == nil { + return nil + } + out := new(ScopedResourceSelectorRequirement) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Secret) DeepCopyInto(out *Secret) { *out = *in diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index 06290be434..9f4192f7fb 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -324,6 +324,13 @@ const ( // // Enable probe based plugin watcher utility for discovering Kubelet plugins KubeletPluginsWatcher utilfeature.Feature = "KubeletPluginsWatcher" + + // owner: @vikaschoudhary16 + // alpha: v1.11 + // + // + // Enable resource quota scope selectors + ResourceQuotaScopeSelectors utilfeature.Feature = "ResourceQuotaScopeSelectors" ) func init() { @@ -379,6 +386,7 @@ var defaultKubernetesFeatureGates = map[utilfeature.Feature]utilfeature.FeatureS PodReadinessGates: {Default: false, PreRelease: utilfeature.Beta}, VolumeSubpathEnvExpansion: {Default: false, PreRelease: utilfeature.Alpha}, KubeletPluginsWatcher: {Default: false, PreRelease: utilfeature.Alpha}, + ResourceQuotaScopeSelectors: {Default: false, PreRelease: utilfeature.Alpha}, // inherited features from generic apiserver, relisted here to get a conflict if it is changed // unintentionally on either side: diff --git a/pkg/quota/evaluator/core/BUILD b/pkg/quota/evaluator/core/BUILD index 8d254028c7..7a6cbe11cf 100644 --- a/pkg/quota/evaluator/core/BUILD +++ b/pkg/quota/evaluator/core/BUILD @@ -27,6 +27,7 @@ go_library( "//pkg/quota/generic:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", diff --git a/pkg/quota/evaluator/core/persistent_volume_claims.go b/pkg/quota/evaluator/core/persistent_volume_claims.go index 4547f370d5..62051e4514 100644 --- a/pkg/quota/evaluator/core/persistent_volume_claims.go +++ b/pkg/quota/evaluator/core/persistent_volume_claims.go @@ -123,6 +123,17 @@ func (p *pvcEvaluator) Matches(resourceQuota *api.ResourceQuota, item runtime.Ob return generic.Matches(resourceQuota, item, p.MatchingResources, generic.MatchesNoScopeFunc) } +// MatchingScopes takes the input specified list of scopes and input object. Returns the set of scopes resource matches. +func (p *pvcEvaluator) MatchingScopes(item runtime.Object, scopes []api.ScopedResourceSelectorRequirement) ([]api.ScopedResourceSelectorRequirement, error) { + return []api.ScopedResourceSelectorRequirement{}, nil +} + +// UncoveredQuotaScopes takes the input matched scopes which are limited by configuration and the matched quota scopes. +// It returns the scopes which are in limited scopes but dont have a corresponding covering quota scope +func (p *pvcEvaluator) UncoveredQuotaScopes(limitedScopes []api.ScopedResourceSelectorRequirement, matchedQuotaScopes []api.ScopedResourceSelectorRequirement) ([]api.ScopedResourceSelectorRequirement, error) { + return []api.ScopedResourceSelectorRequirement{}, nil +} + // MatchingResources takes the input specified list of resources and returns the set of resources it matches. func (p *pvcEvaluator) MatchingResources(items []api.ResourceName) []api.ResourceName { result := []api.ResourceName{} diff --git a/pkg/quota/evaluator/core/pods.go b/pkg/quota/evaluator/core/pods.go index 06aa59e393..3d1572271a 100644 --- a/pkg/quota/evaluator/core/pods.go +++ b/pkg/quota/evaluator/core/pods.go @@ -23,6 +23,7 @@ import ( "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" + "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" @@ -117,7 +118,7 @@ type podEvaluator struct { func (p *podEvaluator) Constraints(required []api.ResourceName, item runtime.Object) error { pod, ok := item.(*api.Pod) if !ok { - return fmt.Errorf("Unexpected input object %v", item) + return fmt.Errorf("unexpected input object %v", item) } // BACKWARD COMPATIBILITY REQUIREMENT: if we quota cpu or memory, then each container @@ -181,6 +182,41 @@ func (p *podEvaluator) MatchingResources(input []api.ResourceName) []api.Resourc return result } +// MatchingScopes takes the input specified list of scopes and pod object. Returns the set of scope selectors pod matches. +func (p *podEvaluator) MatchingScopes(item runtime.Object, scopeSelectors []api.ScopedResourceSelectorRequirement) ([]api.ScopedResourceSelectorRequirement, error) { + matchedScopes := []api.ScopedResourceSelectorRequirement{} + for _, selector := range scopeSelectors { + match, err := podMatchesScopeFunc(selector, item) + if err != nil { + return []api.ScopedResourceSelectorRequirement{}, fmt.Errorf("error on matching scope %v: %v", selector, err) + } + if match { + matchedScopes = append(matchedScopes, selector) + } + } + return matchedScopes, nil +} + +// UncoveredQuotaScopes takes the input matched scopes which are limited by configuration and the matched quota scopes. +// It returns the scopes which are in limited scopes but dont have a corresponding covering quota scope +func (p *podEvaluator) UncoveredQuotaScopes(limitedScopes []api.ScopedResourceSelectorRequirement, matchedQuotaScopes []api.ScopedResourceSelectorRequirement) ([]api.ScopedResourceSelectorRequirement, error) { + uncoveredScopes := []api.ScopedResourceSelectorRequirement{} + for _, selector := range limitedScopes { + isCovered := false + for _, matchedScopeSelector := range matchedQuotaScopes { + if matchedScopeSelector.ScopeName == selector.ScopeName { + isCovered = true + break + } + } + + if !isCovered { + uncoveredScopes = append(uncoveredScopes, selector) + } + } + return uncoveredScopes, nil +} + // Usage knows how to measure usage associated with pods func (p *podEvaluator) Usage(item runtime.Object) (api.ResourceList, error) { // delegate to normal usage @@ -265,12 +301,12 @@ func toInternalPodOrError(obj runtime.Object) (*api.Pod, error) { } // podMatchesScopeFunc is a function that knows how to evaluate if a pod matches a scope -func podMatchesScopeFunc(scope api.ResourceQuotaScope, object runtime.Object) (bool, error) { +func podMatchesScopeFunc(selector api.ScopedResourceSelectorRequirement, object runtime.Object) (bool, error) { pod, err := toInternalPodOrError(object) if err != nil { return false, err } - switch scope { + switch selector.ScopeName { case api.ResourceQuotaScopeTerminating: return isTerminating(pod), nil case api.ResourceQuotaScopeNotTerminating: @@ -279,6 +315,8 @@ func podMatchesScopeFunc(scope api.ResourceQuotaScope, object runtime.Object) (b return isBestEffort(pod), nil case api.ResourceQuotaScopeNotBestEffort: return !isBestEffort(pod), nil + case api.ResourceQuotaScopePriorityClass: + return podMatchesSelector(pod, selector) } return false, nil } @@ -337,6 +375,18 @@ func isTerminating(pod *api.Pod) bool { return false } +func podMatchesSelector(pod *api.Pod, selector api.ScopedResourceSelectorRequirement) (bool, error) { + labelSelector, err := helper.ScopedResourceSelectorRequirementsAsSelector(selector) + if err != nil { + return false, fmt.Errorf("failed to parse and convert selector: %v", err) + } + m := map[string]string{string(api.ResourceQuotaScopePriorityClass): pod.Spec.PriorityClassName} + if labelSelector.Matches(labels.Set(m)) { + return true, nil + } + return false, nil +} + // QuotaPod returns true if the pod is eligible to track against a quota // A pod is eligible for quota, unless any of the following are true: // - pod has a terminal phase (failed or succeeded) diff --git a/pkg/quota/evaluator/core/services.go b/pkg/quota/evaluator/core/services.go index cdddaf064a..006c0e9b11 100644 --- a/pkg/quota/evaluator/core/services.go +++ b/pkg/quota/evaluator/core/services.go @@ -82,6 +82,17 @@ func (p *serviceEvaluator) MatchingResources(input []api.ResourceName) []api.Res return quota.Intersection(input, serviceResources) } +// MatchingScopes takes the input specified list of scopes and input object. Returns the set of scopes resource matches. +func (p *serviceEvaluator) MatchingScopes(item runtime.Object, scopes []api.ScopedResourceSelectorRequirement) ([]api.ScopedResourceSelectorRequirement, error) { + return []api.ScopedResourceSelectorRequirement{}, nil +} + +// UncoveredQuotaScopes takes the input matched scopes which are limited by configuration and the matched quota scopes. +// It returns the scopes which are in limited scopes but dont have a corresponding covering quota scope +func (p *serviceEvaluator) UncoveredQuotaScopes(limitedScopes []api.ScopedResourceSelectorRequirement, matchedQuotaScopes []api.ScopedResourceSelectorRequirement) ([]api.ScopedResourceSelectorRequirement, error) { + return []api.ScopedResourceSelectorRequirement{}, nil +} + // convert the input object to an internal service object or error. func toInternalServiceOrError(obj runtime.Object) (*api.Service, error) { svc := &api.Service{} diff --git a/pkg/quota/generic/evaluator.go b/pkg/quota/generic/evaluator.go index 6324ce5dde..7df5243e59 100644 --- a/pkg/quota/generic/evaluator.go +++ b/pkg/quota/generic/evaluator.go @@ -67,7 +67,7 @@ func ObjectCountQuotaResourceNameFor(groupResource schema.GroupResource) api.Res type ListFuncByNamespace func(namespace string) ([]runtime.Object, error) // MatchesScopeFunc knows how to evaluate if an object matches a scope -type MatchesScopeFunc func(scope api.ResourceQuotaScope, object runtime.Object) (bool, error) +type MatchesScopeFunc func(scope api.ScopedResourceSelectorRequirement, object runtime.Object) (bool, error) // UsageFunc knows how to measure usage associated with an object type UsageFunc func(object runtime.Object) (api.ResourceList, error) @@ -76,12 +76,14 @@ type UsageFunc func(object runtime.Object) (api.ResourceList, error) type MatchingResourceNamesFunc func(input []api.ResourceName) []api.ResourceName // MatchesNoScopeFunc returns false on all match checks -func MatchesNoScopeFunc(scope api.ResourceQuotaScope, object runtime.Object) (bool, error) { +func MatchesNoScopeFunc(scope api.ScopedResourceSelectorRequirement, object runtime.Object) (bool, error) { return false, nil } // Matches returns true if the quota matches the specified item. -func Matches(resourceQuota *api.ResourceQuota, item runtime.Object, matchFunc MatchingResourceNamesFunc, scopeFunc MatchesScopeFunc) (bool, error) { +func Matches( + resourceQuota *api.ResourceQuota, item runtime.Object, + matchFunc MatchingResourceNamesFunc, scopeFunc MatchesScopeFunc) (bool, error) { if resourceQuota == nil { return false, fmt.Errorf("expected non-nil quota") } @@ -89,7 +91,7 @@ func Matches(resourceQuota *api.ResourceQuota, item runtime.Object, matchFunc Ma matchResource := len(matchFunc(quota.ResourceNames(resourceQuota.Status.Hard))) > 0 // by default, no scopes matches all matchScope := true - for _, scope := range resourceQuota.Spec.Scopes { + for _, scope := range getScopeSelectorsFromQuota(resourceQuota) { innerMatch, err := scopeFunc(scope, item) if err != nil { return false, err @@ -99,6 +101,21 @@ func Matches(resourceQuota *api.ResourceQuota, item runtime.Object, matchFunc Ma return matchResource && matchScope, nil } +func getScopeSelectorsFromQuota(quota *api.ResourceQuota) []api.ScopedResourceSelectorRequirement { + selectors := []api.ScopedResourceSelectorRequirement{} + for _, scope := range quota.Spec.Scopes { + selectors = append(selectors, api.ScopedResourceSelectorRequirement{ + ScopeName: scope, + Operator: api.ScopeSelectorOpExists}) + } + if quota.Spec.ScopeSelector != nil { + for _, scopeSelector := range quota.Spec.ScopeSelector.MatchExpressions { + selectors = append(selectors, scopeSelector) + } + } + return selectors +} + // CalculateUsageStats is a utility function that knows how to calculate aggregate usage. func CalculateUsageStats(options quota.UsageStatsOptions, listFunc ListFuncByNamespace, @@ -117,7 +134,7 @@ func CalculateUsageStats(options quota.UsageStatsOptions, // need to verify that the item matches the set of scopes matchesScopes := true for _, scope := range options.Scopes { - innerMatch, err := scopeFunc(scope, item) + innerMatch, err := scopeFunc(api.ScopedResourceSelectorRequirement{ScopeName: scope}, item) if err != nil { return result, nil } @@ -125,6 +142,15 @@ func CalculateUsageStats(options quota.UsageStatsOptions, matchesScopes = false } } + if options.ScopeSelector != nil { + for _, selector := range options.ScopeSelector.MatchExpressions { + innerMatch, err := scopeFunc(selector, item) + if err != nil { + return result, nil + } + matchesScopes = matchesScopes && innerMatch + } + } // only count usage if there was a match if matchesScopes { usage, err := usageFunc(item) @@ -176,6 +202,17 @@ func (o *objectCountEvaluator) MatchingResources(input []api.ResourceName) []api return quota.Intersection(input, o.resourceNames) } +// MatchingScopes takes the input specified list of scopes and input object. Returns the set of scopes resource matches. +func (o *objectCountEvaluator) MatchingScopes(item runtime.Object, scopes []api.ScopedResourceSelectorRequirement) ([]api.ScopedResourceSelectorRequirement, error) { + return []api.ScopedResourceSelectorRequirement{}, nil +} + +// UncoveredQuotaScopes takes the input matched scopes which are limited by configuration and the matched quota scopes. +// It returns the scopes which are in limited scopes but dont have a corresponding covering quota scope +func (o *objectCountEvaluator) UncoveredQuotaScopes(limitedScopes []api.ScopedResourceSelectorRequirement, matchedQuotaScopes []api.ScopedResourceSelectorRequirement) ([]api.ScopedResourceSelectorRequirement, error) { + return []api.ScopedResourceSelectorRequirement{}, nil +} + // Usage returns the resource usage for the specified object func (o *objectCountEvaluator) Usage(object runtime.Object) (api.ResourceList, error) { quantity := resource.NewQuantity(1, resource.DecimalSI) diff --git a/pkg/quota/interfaces.go b/pkg/quota/interfaces.go index 8d7295ef0c..e6723b8aef 100644 --- a/pkg/quota/interfaces.go +++ b/pkg/quota/interfaces.go @@ -31,7 +31,8 @@ type UsageStatsOptions struct { // Scopes that must match counted objects Scopes []api.ResourceQuotaScope // Resources are the set of resources to include in the measurement - Resources []api.ResourceName + Resources []api.ResourceName + ScopeSelector *api.ScopeSelector } // UsageStats is result of measuring observed resource use in the system @@ -51,6 +52,10 @@ type Evaluator interface { Handles(operation admission.Attributes) bool // Matches returns true if the specified quota matches the input item Matches(resourceQuota *api.ResourceQuota, item runtime.Object) (bool, error) + // MatchingScopes takes the input specified list of scopes and input object and returns the set of scopes that matches input object. + MatchingScopes(item runtime.Object, scopes []api.ScopedResourceSelectorRequirement) ([]api.ScopedResourceSelectorRequirement, error) + // UncoveredQuotaScopes takes the input matched scopes which are limited by configuration and the matched quota scopes. It returns the scopes which are in limited scopes but dont have a corresponding covering quota scope + UncoveredQuotaScopes(limitedScopes []api.ScopedResourceSelectorRequirement, matchedQuotaScopes []api.ScopedResourceSelectorRequirement) ([]api.ScopedResourceSelectorRequirement, error) // MatchingResources takes the input specified list of resources and returns the set of resources evaluator matches. MatchingResources(input []api.ResourceName) []api.ResourceName // Usage returns the resource usage for the specified object diff --git a/plugin/pkg/admission/resourcequota/admission_test.go b/plugin/pkg/admission/resourcequota/admission_test.go index d94acdf2a3..d51ac50126 100644 --- a/plugin/pkg/admission/resourcequota/admission_test.go +++ b/plugin/pkg/admission/resourcequota/admission_test.go @@ -17,6 +17,7 @@ limitations under the License. package resourcequota import ( + "fmt" "strconv" "strings" "testing" @@ -73,6 +74,14 @@ func validPod(name string, numContainers int, resources api.ResourceRequirements return pod } +func validPodWithPriority(name string, numContainers int, resources api.ResourceRequirements, priorityClass string) *api.Pod { + pod := validPod(name, numContainers, resources) + if priorityClass != "" { + pod.Spec.PriorityClassName = priorityClass + } + return pod +} + func validPersistentVolumeClaim(name string, resources api.ResourceRequirements) *api.PersistentVolumeClaim { return &api.PersistentVolumeClaim{ ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: "test"}, @@ -1445,3 +1454,672 @@ func TestAdmitLimitedResourceWithQuotaThatDoesNotCover(t *testing.T) { t.Fatalf("Expected an error since the quota did not cover cpu") } } + +// TestAdmitLimitedScopeWithQuota verifies if a limited scope is configured the quota must cover the resource. +func TestAdmitLimitedScopeWithCoverQuota(t *testing.T) { + testCases := []struct { + description string + testPod *api.Pod + quota *api.ResourceQuota + anotherQuota *api.ResourceQuota + config *resourcequotaapi.Configuration + expErr string + }{ + { + description: "Covering quota exists for configured limited scope PriorityClassNameExists.", + testPod: validPodWithPriority("allowed-pod", 1, getResourceRequirements(getResourceList("3", "2Gi"), getResourceList("", "")), "fake-priority"), + quota: &api.ResourceQuota{ + ObjectMeta: metav1.ObjectMeta{Name: "quota", Namespace: "test", ResourceVersion: "124"}, + Spec: api.ResourceQuotaSpec{ + ScopeSelector: &api.ScopeSelector{ + MatchExpressions: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpExists}, + }, + }, + }, + }, + config: &resourcequotaapi.Configuration{ + LimitedResources: []resourcequotaapi.LimitedResource{ + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpExists, + }, + }, + }, + }, + }, + expErr: "", + }, + { + description: "configured limited scope PriorityClassNameExists and limited cpu resource. No covering quota for cpu and pod admit fails.", + testPod: validPodWithPriority("not-allowed-pod", 1, getResourceRequirements(getResourceList("3", "2Gi"), getResourceList("", "")), "fake-priority"), + quota: &api.ResourceQuota{ + ObjectMeta: metav1.ObjectMeta{Name: "quota", Namespace: "test", ResourceVersion: "124"}, + Spec: api.ResourceQuotaSpec{ + ScopeSelector: &api.ScopeSelector{ + MatchExpressions: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpExists}, + }, + }, + }, + }, + config: &resourcequotaapi.Configuration{ + LimitedResources: []resourcequotaapi.LimitedResource{ + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpExists, + }, + }, + MatchContains: []string{"requests.cpu"}, // match on "requests.cpu" only + }, + }, + }, + expErr: "insufficient quota to consume: requests.cpu", + }, + { + description: "Covering quota does not exist for configured limited scope PriorityClassNameExists.", + testPod: validPodWithPriority("not-allowed-pod", 1, getResourceRequirements(getResourceList("3", "2Gi"), getResourceList("", "")), "fake-priority"), + quota: &api.ResourceQuota{}, + config: &resourcequotaapi.Configuration{ + LimitedResources: []resourcequotaapi.LimitedResource{ + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpExists, + }, + }, + }, + }, + }, + expErr: "insufficient quota to match these scopes: [{PriorityClass Exists []}]", + }, + { + description: "Covering quota does not exist for configured limited scope resourceQuotaBestEffort", + testPod: validPodWithPriority("not-allowed-pod", 1, getResourceRequirements(getResourceList("", ""), getResourceList("", "")), "fake-priority"), + quota: &api.ResourceQuota{}, + config: &resourcequotaapi.Configuration{ + LimitedResources: []resourcequotaapi.LimitedResource{ + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopeBestEffort, + Operator: api.ScopeSelectorOpExists, + }, + }, + }, + }, + }, + expErr: "insufficient quota to match these scopes: [{BestEffort Exists []}]", + }, + { + description: "Covering quota exist for configured limited scope resourceQuotaBestEffort", + testPod: validPodWithPriority("allowed-pod", 1, getResourceRequirements(getResourceList("", ""), getResourceList("", "")), "fake-priority"), + quota: &api.ResourceQuota{ + ObjectMeta: metav1.ObjectMeta{Name: "quota-besteffort", Namespace: "test", ResourceVersion: "124"}, + Spec: api.ResourceQuotaSpec{ + Scopes: []api.ResourceQuotaScope{api.ResourceQuotaScopeBestEffort}, + }, + Status: api.ResourceQuotaStatus{ + Hard: api.ResourceList{ + api.ResourcePods: resource.MustParse("5"), + }, + Used: api.ResourceList{ + api.ResourcePods: resource.MustParse("3"), + }, + }, + }, + config: &resourcequotaapi.Configuration{ + LimitedResources: []resourcequotaapi.LimitedResource{ + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopeBestEffort, + Operator: api.ScopeSelectorOpExists, + }, + }, + }, + }, + }, + expErr: "", + }, + { + description: "Two scopes,BestEffort and PriorityClassIN, in two LimitedResources. Neither matches pod. Pod allowed", + testPod: validPodWithPriority("allowed-pod", 1, getResourceRequirements(getResourceList("100m", "1Gi"), getResourceList("", "")), "fake-priority"), + quota: &api.ResourceQuota{}, + config: &resourcequotaapi.Configuration{ + LimitedResources: []resourcequotaapi.LimitedResource{ + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopeBestEffort, + Operator: api.ScopeSelectorOpExists, + }, + }, + }, + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpIn, + Values: []string{"cluster-services"}, + }, + }, + }, + }, + }, + expErr: "", + }, + { + description: "Two scopes,BestEffort and PriorityClassIN, in two LimitedResources. Only BestEffort scope matches pod. Pod admit fails because covering quota is missing for BestEffort scope", + testPod: validPodWithPriority("allowed-pod", 1, getResourceRequirements(getResourceList("", ""), getResourceList("", "")), "fake-priority"), + quota: &api.ResourceQuota{}, + config: &resourcequotaapi.Configuration{ + LimitedResources: []resourcequotaapi.LimitedResource{ + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopeBestEffort, + Operator: api.ScopeSelectorOpExists, + }, + }, + }, + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpIn, + Values: []string{"cluster-services"}, + }, + }, + }, + }, + }, + expErr: "insufficient quota to match these scopes: [{BestEffort Exists []}]", + }, + { + description: "Two scopes,BestEffort and PriorityClassIN, in two LimitedResources. Only PriorityClass scope matches pod. Pod admit fails because covering quota is missing for PriorityClass scope", + testPod: validPodWithPriority("allowed-pod", 1, getResourceRequirements(getResourceList("100m", "1Gi"), getResourceList("", "")), "cluster-services"), + quota: &api.ResourceQuota{}, + config: &resourcequotaapi.Configuration{ + LimitedResources: []resourcequotaapi.LimitedResource{ + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopeBestEffort, + Operator: api.ScopeSelectorOpExists, + }, + }, + }, + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpIn, + Values: []string{"cluster-services"}, + }, + }, + }, + }, + }, + expErr: "insufficient quota to match these scopes: [{PriorityClass In [cluster-services]}]", + }, + { + description: "Two scopes,BestEffort and PriorityClassIN, in two LimitedResources. Both the scopes matches pod. Pod admit fails because covering quota is missing for PriorityClass scope and BestEffort scope", + testPod: validPodWithPriority("allowed-pod", 1, getResourceRequirements(getResourceList("", ""), getResourceList("", "")), "cluster-services"), + quota: &api.ResourceQuota{}, + config: &resourcequotaapi.Configuration{ + LimitedResources: []resourcequotaapi.LimitedResource{ + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopeBestEffort, + Operator: api.ScopeSelectorOpExists, + }, + }, + }, + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpIn, + Values: []string{"cluster-services"}, + }, + }, + }, + }, + }, + expErr: "insufficient quota to match these scopes: [{BestEffort Exists []} {PriorityClass In [cluster-services]}]", + }, + { + description: "Two scopes,BestEffort and PriorityClassIN, in two LimitedResources. Both the scopes matches pod. Quota available only for BestEffort scope. Pod admit fails because covering quota is missing for PriorityClass scope", + testPod: validPodWithPriority("allowed-pod", 1, getResourceRequirements(getResourceList("", ""), getResourceList("", "")), "cluster-services"), + quota: &api.ResourceQuota{ + ObjectMeta: metav1.ObjectMeta{Name: "quota-besteffort", Namespace: "test", ResourceVersion: "124"}, + Spec: api.ResourceQuotaSpec{ + Scopes: []api.ResourceQuotaScope{api.ResourceQuotaScopeBestEffort}, + }, + Status: api.ResourceQuotaStatus{ + Hard: api.ResourceList{ + api.ResourcePods: resource.MustParse("5"), + }, + Used: api.ResourceList{ + api.ResourcePods: resource.MustParse("3"), + }, + }, + }, + config: &resourcequotaapi.Configuration{ + LimitedResources: []resourcequotaapi.LimitedResource{ + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopeBestEffort, + Operator: api.ScopeSelectorOpExists, + }, + }, + }, + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpIn, + Values: []string{"cluster-services"}, + }, + }, + }, + }, + }, + expErr: "insufficient quota to match these scopes: [{PriorityClass In [cluster-services]}]", + }, + { + description: "Two scopes,BestEffort and PriorityClassIN, in two LimitedResources. Both the scopes matches pod. Quota available only for PriorityClass scope. Pod admit fails because covering quota is missing for BestEffort scope", + testPod: validPodWithPriority("allowed-pod", 1, getResourceRequirements(getResourceList("", ""), getResourceList("", "")), "cluster-services"), + quota: &api.ResourceQuota{ + ObjectMeta: metav1.ObjectMeta{Name: "quota", Namespace: "test", ResourceVersion: "124"}, + Spec: api.ResourceQuotaSpec{ + ScopeSelector: &api.ScopeSelector{ + MatchExpressions: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpIn, + Values: []string{"cluster-services"}, + }, + }, + }, + }, + }, + config: &resourcequotaapi.Configuration{ + LimitedResources: []resourcequotaapi.LimitedResource{ + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopeBestEffort, + Operator: api.ScopeSelectorOpExists, + }, + }, + }, + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpIn, + Values: []string{"cluster-services"}, + }, + }, + }, + }, + }, + expErr: "insufficient quota to match these scopes: [{BestEffort Exists []}]", + }, + { + description: "Two scopes,BestEffort and PriorityClassIN, in two LimitedResources. Both the scopes matches pod. Quota available only for both the scopes. Pod admit success. No Error", + testPod: validPodWithPriority("allowed-pod", 1, getResourceRequirements(getResourceList("", ""), getResourceList("", "")), "cluster-services"), + quota: &api.ResourceQuota{ + ObjectMeta: metav1.ObjectMeta{Name: "quota-besteffort", Namespace: "test", ResourceVersion: "124"}, + Spec: api.ResourceQuotaSpec{ + Scopes: []api.ResourceQuotaScope{api.ResourceQuotaScopeBestEffort}, + }, + Status: api.ResourceQuotaStatus{ + Hard: api.ResourceList{ + api.ResourcePods: resource.MustParse("5"), + }, + Used: api.ResourceList{ + api.ResourcePods: resource.MustParse("3"), + }, + }, + }, + anotherQuota: &api.ResourceQuota{ + ObjectMeta: metav1.ObjectMeta{Name: "quota", Namespace: "test", ResourceVersion: "124"}, + Spec: api.ResourceQuotaSpec{ + ScopeSelector: &api.ScopeSelector{ + MatchExpressions: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpIn, + Values: []string{"cluster-services"}, + }, + }, + }, + }, + }, + config: &resourcequotaapi.Configuration{ + LimitedResources: []resourcequotaapi.LimitedResource{ + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopeBestEffort, + Operator: api.ScopeSelectorOpExists, + }, + }, + }, + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpIn, + Values: []string{"cluster-services"}, + }, + }, + }, + }, + }, + expErr: "", + }, + { + description: "Pod allowed with priorityclass if limited scope PriorityClassNameExists not configured.", + testPod: validPodWithPriority("allowed-pod", 1, getResourceRequirements(getResourceList("3", "2Gi"), getResourceList("", "")), "fake-priority"), + quota: &api.ResourceQuota{}, + config: &resourcequotaapi.Configuration{}, + expErr: "", + }, + { + description: "quota fails, though covering quota for configured limited scope PriorityClassNameExists exists.", + testPod: validPodWithPriority("not-allowed-pod", 1, getResourceRequirements(getResourceList("3", "20Gi"), getResourceList("", "")), "fake-priority"), + quota: &api.ResourceQuota{ + ObjectMeta: metav1.ObjectMeta{Name: "quota", Namespace: "test", ResourceVersion: "124"}, + Spec: api.ResourceQuotaSpec{ + ScopeSelector: &api.ScopeSelector{ + MatchExpressions: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpExists}, + }, + }, + }, + Status: api.ResourceQuotaStatus{ + Hard: api.ResourceList{ + api.ResourceMemory: resource.MustParse("10Gi"), + }, + Used: api.ResourceList{ + api.ResourceMemory: resource.MustParse("1Gi"), + }, + }, + }, + config: &resourcequotaapi.Configuration{ + LimitedResources: []resourcequotaapi.LimitedResource{ + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpExists, + }, + }, + }, + }, + }, + expErr: "forbidden: exceeded quota: quota, requested: memory=20Gi, used: memory=1Gi, limited: memory=10Gi", + }, + { + description: "Pod has different priorityclass than configured limited. Covering quota exists for configured limited scope PriorityClassIn.", + testPod: validPodWithPriority("allowed-pod", 1, getResourceRequirements(getResourceList("3", "2Gi"), getResourceList("", "")), "fake-priority"), + quota: &api.ResourceQuota{ + ObjectMeta: metav1.ObjectMeta{Name: "quota", Namespace: "test", ResourceVersion: "124"}, + Spec: api.ResourceQuotaSpec{ + ScopeSelector: &api.ScopeSelector{ + MatchExpressions: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpIn, + Values: []string{"cluster-services"}, + }, + }, + }, + }, + }, + config: &resourcequotaapi.Configuration{ + LimitedResources: []resourcequotaapi.LimitedResource{ + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpIn, + Values: []string{"cluster-services"}, + }, + }, + }, + }, + }, + expErr: "", + }, + { + description: "Pod has limited priorityclass. Covering quota exists for configured limited scope PriorityClassIn.", + testPod: validPodWithPriority("allowed-pod", 1, getResourceRequirements(getResourceList("3", "2Gi"), getResourceList("", "")), "cluster-services"), + quota: &api.ResourceQuota{ + ObjectMeta: metav1.ObjectMeta{Name: "quota", Namespace: "test", ResourceVersion: "124"}, + Spec: api.ResourceQuotaSpec{ + ScopeSelector: &api.ScopeSelector{ + MatchExpressions: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpIn, + Values: []string{"cluster-services"}, + }, + }, + }, + }, + }, + config: &resourcequotaapi.Configuration{ + LimitedResources: []resourcequotaapi.LimitedResource{ + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpIn, + Values: []string{"another-priorityclass-name", "cluster-services"}, + }, + }, + }, + }, + }, + expErr: "", + }, + { + description: "Pod has limited priorityclass. Covering quota does not exist for configured limited scope PriorityClassIn.", + testPod: validPodWithPriority("not-allowed-pod", 1, getResourceRequirements(getResourceList("3", "2Gi"), getResourceList("", "")), "cluster-services"), + quota: &api.ResourceQuota{ + ObjectMeta: metav1.ObjectMeta{Name: "quota", Namespace: "test", ResourceVersion: "124"}, + Spec: api.ResourceQuotaSpec{ + ScopeSelector: &api.ScopeSelector{ + MatchExpressions: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpIn, + Values: []string{"another-priorityclass-name"}, + }, + }, + }, + }, + }, + config: &resourcequotaapi.Configuration{ + LimitedResources: []resourcequotaapi.LimitedResource{ + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpIn, + Values: []string{"another-priorityclass-name", "cluster-services"}, + }, + }, + }, + }, + }, + expErr: "insufficient quota to match these scopes: [{PriorityClass In [another-priorityclass-name cluster-services]}]", + }, + { + description: "From the above test case, just changing pod priority from cluster-services to another-priorityclass-name. expecting no error", + testPod: validPodWithPriority("allowed-pod", 1, getResourceRequirements(getResourceList("3", "2Gi"), getResourceList("", "")), "another-priorityclass-name"), + quota: &api.ResourceQuota{ + ObjectMeta: metav1.ObjectMeta{Name: "quota", Namespace: "test", ResourceVersion: "124"}, + Spec: api.ResourceQuotaSpec{ + ScopeSelector: &api.ScopeSelector{ + MatchExpressions: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpIn, + Values: []string{"another-priorityclass-name"}, + }, + }, + }, + }, + }, + config: &resourcequotaapi.Configuration{ + LimitedResources: []resourcequotaapi.LimitedResource{ + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpIn, + Values: []string{"another-priorityclass-name", "cluster-services"}, + }, + }, + }, + }, + }, + expErr: "", + }, + { + description: "Pod has limited priorityclass. Covering quota does NOT exists for configured limited scope PriorityClassIn.", + testPod: validPodWithPriority("not-allowed-pod", 1, getResourceRequirements(getResourceList("3", "2Gi"), getResourceList("", "")), "cluster-services"), + quota: &api.ResourceQuota{}, + config: &resourcequotaapi.Configuration{ + LimitedResources: []resourcequotaapi.LimitedResource{ + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpIn, + Values: []string{"another-priorityclass-name", "cluster-services"}, + }, + }, + }, + }, + }, + expErr: "insufficient quota to match these scopes: [{PriorityClass In [another-priorityclass-name cluster-services]}]", + }, + { + description: "Pod has limited priorityclass. Covering quota exists for configured limited scope PriorityClassIn through PriorityClassNameExists", + testPod: validPodWithPriority("allowed-pod", 1, getResourceRequirements(getResourceList("3", "2Gi"), getResourceList("", "")), "cluster-services"), + quota: &api.ResourceQuota{ + ObjectMeta: metav1.ObjectMeta{Name: "quota", Namespace: "test", ResourceVersion: "124"}, + Spec: api.ResourceQuotaSpec{ + ScopeSelector: &api.ScopeSelector{ + MatchExpressions: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpExists}, + }, + }, + }, + }, + config: &resourcequotaapi.Configuration{ + LimitedResources: []resourcequotaapi.LimitedResource{ + { + Resource: "pods", + MatchScopes: []api.ScopedResourceSelectorRequirement{ + { + ScopeName: api.ResourceQuotaScopePriorityClass, + Operator: api.ScopeSelectorOpIn, + Values: []string{"another-priorityclass-name", "cluster-services"}, + }, + }, + }, + }, + }, + expErr: "", + }, + } + + for _, testCase := range testCases { + newPod := testCase.testPod + config := testCase.config + resourceQuota := testCase.quota + kubeClient := fake.NewSimpleClientset(resourceQuota) + if testCase.anotherQuota != nil { + kubeClient = fake.NewSimpleClientset(resourceQuota, testCase.anotherQuota) + } + indexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{"namespace": cache.MetaNamespaceIndexFunc}) + stopCh := make(chan struct{}) + defer close(stopCh) + + informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) + quotaAccessor, _ := newQuotaAccessor() + quotaAccessor.client = kubeClient + quotaAccessor.lister = informerFactory.Core().InternalVersion().ResourceQuotas().Lister() + + quotaConfiguration := install.NewQuotaConfigurationForAdmission() + evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh) + + handler := &QuotaAdmission{ + Handler: admission.NewHandler(admission.Create, admission.Update), + evaluator: evaluator, + } + indexer.Add(resourceQuota) + if testCase.anotherQuota != nil { + indexer.Add(testCase.anotherQuota) + } + err := handler.Validate(admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, api.Resource("pods").WithVersion("version"), "", admission.Create, nil)) + if testCase.expErr == "" { + if err != nil { + t.Fatalf("Testcase, %v, failed with unexpected error: %v. ExpErr: %v", testCase.description, err, testCase.expErr) + } + } else { + if !strings.Contains(fmt.Sprintf("%v", err), testCase.expErr) { + t.Fatalf("Testcase, %v, failed with unexpected error: %v. ExpErr: %v", testCase.description, err, testCase.expErr) + } + } + + } +} diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/BUILD b/plugin/pkg/admission/resourcequota/apis/resourcequota/BUILD index 7c43ea4a12..0929b39651 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/BUILD +++ b/plugin/pkg/admission/resourcequota/apis/resourcequota/BUILD @@ -15,6 +15,7 @@ go_library( ], importpath = "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota", deps = [ + "//pkg/apis/core:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/types.go b/plugin/pkg/admission/resourcequota/apis/resourcequota/types.go index 88602d0158..7686e4dab5 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/types.go +++ b/plugin/pkg/admission/resourcequota/apis/resourcequota/types.go @@ -16,7 +16,10 @@ limitations under the License. package resourcequota -import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/kubernetes/pkg/apis/core" +) // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -54,4 +57,16 @@ type LimitedResource struct { // with any storage class, the list would include // ".storageclass.storage.k8s.io/requests.storage" MatchContains []string + + // For each intercepted request, the quota system will figure out if the input object + // satisfies a scope which is present in this listing, then + // quota system will ensure that there is a covering quota. In the + // absence of a covering quota, the quota system will deny the request. + // For example, if an administrator wants to globally enforce that + // a quota must exist to create a pod with "cluster-services" priorityclass + // the list would include + // "PriorityClassNameIn=cluster-services" + // +optional + // MatchScopes []string `json:"matchScopes,omitempty"` + MatchScopes []core.ScopedResourceSelectorRequirement `json:"matchScopes,omitempty"` } diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/BUILD b/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/BUILD index 0ffe75d6c0..1b4f8ae2d4 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/BUILD +++ b/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/BUILD @@ -18,7 +18,9 @@ go_library( ], importpath = "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1", deps = [ + "//pkg/apis/core:go_default_library", "//plugin/pkg/admission/resourcequota/apis/resourcequota:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/types.go b/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/types.go index 4774582314..9ea8fe5adb 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/types.go +++ b/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/types.go @@ -16,7 +16,10 @@ limitations under the License. package v1alpha1 -import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +import ( + "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -54,4 +57,13 @@ type LimitedResource struct { // with any storage class, the list would include // ".storageclass.storage.k8s.io/requests.storage" MatchContains []string `json:"matchContains,omitempty"` + // For each intercepted request, the quota system will figure out if the input object + // satisfies a scope which is present in this listing, then + // quota system will ensure that there is a covering quota. In the + // absence of a covering quota, the quota system will deny the request. + // For example, if an administrator wants to globally enforce that + // a quota must exist to create a pod with "cluster-services" priorityclass + // the list would include "scopeName=PriorityClass, Operator=In, Value=cluster-services" + // +optional + MatchScopes []v1.ScopedResourceSelectorRequirement `json:"matchScopes,omitempty"` } diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/zz_generated.conversion.go b/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/zz_generated.conversion.go index 9036411d5f..02f00e8f91 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/zz_generated.conversion.go +++ b/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/zz_generated.conversion.go @@ -23,8 +23,10 @@ package v1alpha1 import ( unsafe "unsafe" + v1 "k8s.io/api/core/v1" conversion "k8s.io/apimachinery/pkg/conversion" runtime "k8s.io/apimachinery/pkg/runtime" + core "k8s.io/kubernetes/pkg/apis/core" resourcequota "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota" ) @@ -67,6 +69,7 @@ func autoConvert_v1alpha1_LimitedResource_To_resourcequota_LimitedResource(in *L out.APIGroup = in.APIGroup out.Resource = in.Resource out.MatchContains = *(*[]string)(unsafe.Pointer(&in.MatchContains)) + out.MatchScopes = *(*[]core.ScopedResourceSelectorRequirement)(unsafe.Pointer(&in.MatchScopes)) return nil } @@ -79,6 +82,7 @@ func autoConvert_resourcequota_LimitedResource_To_v1alpha1_LimitedResource(in *r out.APIGroup = in.APIGroup out.Resource = in.Resource out.MatchContains = *(*[]string)(unsafe.Pointer(&in.MatchContains)) + out.MatchScopes = *(*[]v1.ScopedResourceSelectorRequirement)(unsafe.Pointer(&in.MatchScopes)) return nil } diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/zz_generated.deepcopy.go b/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/zz_generated.deepcopy.go index b09aca57bc..95a100b92e 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/zz_generated.deepcopy.go +++ b/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/zz_generated.deepcopy.go @@ -21,6 +21,7 @@ limitations under the License. package v1alpha1 import ( + v1 "k8s.io/api/core/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -64,6 +65,13 @@ func (in *LimitedResource) DeepCopyInto(out *LimitedResource) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.MatchScopes != nil { + in, out := &in.MatchScopes, &out.MatchScopes + *out = make([]v1.ScopedResourceSelectorRequirement, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/zz_generated.deepcopy.go b/plugin/pkg/admission/resourcequota/apis/resourcequota/zz_generated.deepcopy.go index 4cf223c33c..c33c217ca7 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/zz_generated.deepcopy.go +++ b/plugin/pkg/admission/resourcequota/apis/resourcequota/zz_generated.deepcopy.go @@ -22,6 +22,7 @@ package resourcequota import ( runtime "k8s.io/apimachinery/pkg/runtime" + core "k8s.io/kubernetes/pkg/apis/core" ) // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. @@ -64,6 +65,13 @@ func (in *LimitedResource) DeepCopyInto(out *LimitedResource) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.MatchScopes != nil { + in, out := &in.MatchScopes, &out.MatchScopes + *out = make([]core.ScopedResourceSelectorRequirement, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } diff --git a/plugin/pkg/admission/resourcequota/controller.go b/plugin/pkg/admission/resourcequota/controller.go index 0f25436588..063626d33e 100644 --- a/plugin/pkg/admission/resourcequota/controller.go +++ b/plugin/pkg/admission/resourcequota/controller.go @@ -27,6 +27,7 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/sets" @@ -367,6 +368,21 @@ func limitedByDefault(usage api.ResourceList, limitedResources []resourcequotaap return result } +func getMatchedLimitedScopes(evaluator quota.Evaluator, inputObject runtime.Object, limitedResources []resourcequotaapi.LimitedResource) ([]api.ScopedResourceSelectorRequirement, error) { + scopes := []api.ScopedResourceSelectorRequirement{} + for _, limitedResource := range limitedResources { + matched, err := evaluator.MatchingScopes(inputObject, limitedResource.MatchScopes) + if err != nil { + glog.Errorf("Error while matching limited Scopes: %v", err) + return []api.ScopedResourceSelectorRequirement{}, err + } + for _, scope := range matched { + scopes = append(scopes, scope) + } + } + return scopes, nil +} + // checkRequest verifies that the request does not exceed any quota constraint. it returns a copy of quotas not yet persisted // that capture what the usage would be if the request succeeded. It return an error if there is insufficient quota to satisfy the request func (e *quotaEvaluator) checkRequest(quotas []api.ResourceQuota, a admission.Attributes) ([]api.ResourceQuota, error) { @@ -383,6 +399,12 @@ func (e *quotaEvaluator) checkRequest(quotas []api.ResourceQuota, a admission.At // if we have limited resources enabled for this resource, always calculate usage inputObject := a.GetObject() + // Check if object matches AdmissionConfiguration matchScopes + limitedScopes, err := getMatchedLimitedScopes(evaluator, inputObject, e.config.LimitedResources) + if err != nil { + return quotas, nil + } + // determine the set of resource names that must exist in a covering quota limitedResourceNames := []api.ResourceName{} limitedResources := filterLimitedResourcesByGroupResource(e.config.LimitedResources, a.GetResource().GroupResource()) @@ -404,10 +426,21 @@ func (e *quotaEvaluator) checkRequest(quotas []api.ResourceQuota, a admission.At // this is needed to know if we have satisfied any constraints where consumption // was limited by default. restrictedResourcesSet := sets.String{} + restrictedScopes := []api.ScopedResourceSelectorRequirement{} for i := range quotas { resourceQuota := quotas[i] + scopeSelectors := getScopeSelectorsFromQuota(resourceQuota) + localRestrictedScopes, err := evaluator.MatchingScopes(inputObject, scopeSelectors) + if err != nil { + return nil, fmt.Errorf("error matching scopes of quota %s, err: %v", resourceQuota.Name, err) + } + for _, scope := range localRestrictedScopes { + restrictedScopes = append(restrictedScopes, scope) + } + match, err := evaluator.Matches(&resourceQuota, inputObject) if err != nil { + glog.Errorf("Error occurred while matching resource quota, %v, against input object. Err: %v", resourceQuota, err) return quotas, err } if !match { @@ -435,6 +468,17 @@ func (e *quotaEvaluator) checkRequest(quotas []api.ResourceQuota, a admission.At return quotas, admission.NewForbidden(a, fmt.Errorf("insufficient quota to consume: %v", strings.Join(hasNoCoveringQuota.List(), ","))) } + // verify that for every scope that had limited access enabled + // that there was a corresponding quota that covered it. + // if not, we reject the request. + scopesHasNoCoveringQuota, err := evaluator.UncoveredQuotaScopes(limitedScopes, restrictedScopes) + if err != nil { + return quotas, err + } + if len(scopesHasNoCoveringQuota) > 0 { + return quotas, fmt.Errorf("insufficient quota to match these scopes: %v", scopesHasNoCoveringQuota) + } + if len(interestingQuotaIndexes) == 0 { return quotas, nil } @@ -516,6 +560,21 @@ func (e *quotaEvaluator) checkRequest(quotas []api.ResourceQuota, a admission.At return outQuotas, nil } +func getScopeSelectorsFromQuota(quota api.ResourceQuota) []api.ScopedResourceSelectorRequirement { + selectors := []api.ScopedResourceSelectorRequirement{} + for _, scope := range quota.Spec.Scopes { + selectors = append(selectors, api.ScopedResourceSelectorRequirement{ + ScopeName: scope, + Operator: api.ScopeSelectorOpExists}) + } + if quota.Spec.ScopeSelector != nil { + for _, scopeSelector := range quota.Spec.ScopeSelector.MatchExpressions { + selectors = append(selectors, scopeSelector) + } + } + return selectors +} + func (e *quotaEvaluator) Evaluate(a admission.Attributes) error { e.init.Do(func() { go e.run() 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 c10c1584d9..9a7a9c40f6 100644 --- a/staging/src/k8s.io/api/core/v1/generated.pb.go +++ b/staging/src/k8s.io/api/core/v1/generated.pb.go @@ -182,6 +182,8 @@ limitations under the License. SELinuxOptions ScaleIOPersistentVolumeSource ScaleIOVolumeSource + ScopeSelector + ScopedResourceSelectorRequirement Secret SecretEnvSource SecretKeySelector @@ -928,144 +930,154 @@ func (m *ScaleIOVolumeSource) Reset() { *m = ScaleIOVolumeSou func (*ScaleIOVolumeSource) ProtoMessage() {} func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} } +func (m *ScopeSelector) Reset() { *m = ScopeSelector{} } +func (*ScopeSelector) ProtoMessage() {} +func (*ScopeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} } + +func (m *ScopedResourceSelectorRequirement) Reset() { *m = ScopedResourceSelectorRequirement{} } +func (*ScopedResourceSelectorRequirement) ProtoMessage() {} +func (*ScopedResourceSelectorRequirement) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{158} +} + func (m *Secret) Reset() { *m = Secret{} } func (*Secret) ProtoMessage() {} -func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} } +func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{159} } func (m *SecretEnvSource) Reset() { *m = SecretEnvSource{} } func (*SecretEnvSource) ProtoMessage() {} -func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{158} } +func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{160} } func (m *SecretKeySelector) Reset() { *m = SecretKeySelector{} } func (*SecretKeySelector) ProtoMessage() {} -func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{159} } +func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} } func (m *SecretList) Reset() { *m = SecretList{} } func (*SecretList) ProtoMessage() {} -func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{160} } +func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} } func (m *SecretProjection) Reset() { *m = SecretProjection{} } func (*SecretProjection) ProtoMessage() {} -func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} } +func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{163} } func (m *SecretReference) Reset() { *m = SecretReference{} } func (*SecretReference) ProtoMessage() {} -func (*SecretReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} } +func (*SecretReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{164} } func (m *SecretVolumeSource) Reset() { *m = SecretVolumeSource{} } func (*SecretVolumeSource) ProtoMessage() {} -func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{163} } +func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{165} } func (m *SecurityContext) Reset() { *m = SecurityContext{} } func (*SecurityContext) ProtoMessage() {} -func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{164} } +func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{166} } func (m *SerializedReference) Reset() { *m = SerializedReference{} } func (*SerializedReference) ProtoMessage() {} -func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{165} } +func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{167} } func (m *Service) Reset() { *m = Service{} } func (*Service) ProtoMessage() {} -func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{166} } +func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{168} } func (m *ServiceAccount) Reset() { *m = ServiceAccount{} } func (*ServiceAccount) ProtoMessage() {} -func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{167} } +func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{169} } func (m *ServiceAccountList) Reset() { *m = ServiceAccountList{} } func (*ServiceAccountList) ProtoMessage() {} -func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{168} } +func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{170} } func (m *ServiceAccountTokenProjection) Reset() { *m = ServiceAccountTokenProjection{} } func (*ServiceAccountTokenProjection) ProtoMessage() {} func (*ServiceAccountTokenProjection) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{169} + return fileDescriptorGenerated, []int{171} } func (m *ServiceList) Reset() { *m = ServiceList{} } func (*ServiceList) ProtoMessage() {} -func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{170} } +func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{172} } func (m *ServicePort) Reset() { *m = ServicePort{} } func (*ServicePort) ProtoMessage() {} -func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{171} } +func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{173} } func (m *ServiceProxyOptions) Reset() { *m = ServiceProxyOptions{} } func (*ServiceProxyOptions) ProtoMessage() {} -func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{172} } +func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{174} } func (m *ServiceSpec) Reset() { *m = ServiceSpec{} } func (*ServiceSpec) ProtoMessage() {} -func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{173} } +func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{175} } func (m *ServiceStatus) Reset() { *m = ServiceStatus{} } func (*ServiceStatus) ProtoMessage() {} -func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{174} } +func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{176} } func (m *SessionAffinityConfig) Reset() { *m = SessionAffinityConfig{} } func (*SessionAffinityConfig) ProtoMessage() {} -func (*SessionAffinityConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{175} } +func (*SessionAffinityConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{177} } func (m *StorageOSPersistentVolumeSource) Reset() { *m = StorageOSPersistentVolumeSource{} } func (*StorageOSPersistentVolumeSource) ProtoMessage() {} func (*StorageOSPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{176} + return fileDescriptorGenerated, []int{178} } func (m *StorageOSVolumeSource) Reset() { *m = StorageOSVolumeSource{} } func (*StorageOSVolumeSource) ProtoMessage() {} -func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{177} } +func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{179} } func (m *Sysctl) Reset() { *m = Sysctl{} } func (*Sysctl) ProtoMessage() {} -func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{178} } +func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{180} } func (m *TCPSocketAction) Reset() { *m = TCPSocketAction{} } func (*TCPSocketAction) ProtoMessage() {} -func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{179} } +func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{181} } func (m *Taint) Reset() { *m = Taint{} } func (*Taint) ProtoMessage() {} -func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{180} } +func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{182} } func (m *Toleration) Reset() { *m = Toleration{} } func (*Toleration) ProtoMessage() {} -func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{181} } +func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{183} } func (m *Volume) Reset() { *m = Volume{} } func (*Volume) ProtoMessage() {} -func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{182} } +func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{184} } func (m *VolumeDevice) Reset() { *m = VolumeDevice{} } func (*VolumeDevice) ProtoMessage() {} -func (*VolumeDevice) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{183} } +func (*VolumeDevice) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{185} } func (m *VolumeMount) Reset() { *m = VolumeMount{} } func (*VolumeMount) ProtoMessage() {} -func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{184} } +func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{186} } func (m *VolumeNodeAffinity) Reset() { *m = VolumeNodeAffinity{} } func (*VolumeNodeAffinity) ProtoMessage() {} -func (*VolumeNodeAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{185} } +func (*VolumeNodeAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{187} } func (m *VolumeProjection) Reset() { *m = VolumeProjection{} } func (*VolumeProjection) ProtoMessage() {} -func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{186} } +func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{188} } func (m *VolumeSource) Reset() { *m = VolumeSource{} } func (*VolumeSource) ProtoMessage() {} -func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{187} } +func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{189} } func (m *VsphereVirtualDiskVolumeSource) Reset() { *m = VsphereVirtualDiskVolumeSource{} } func (*VsphereVirtualDiskVolumeSource) ProtoMessage() {} func (*VsphereVirtualDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{188} + return fileDescriptorGenerated, []int{190} } func (m *WeightedPodAffinityTerm) Reset() { *m = WeightedPodAffinityTerm{} } func (*WeightedPodAffinityTerm) ProtoMessage() {} func (*WeightedPodAffinityTerm) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{189} + return fileDescriptorGenerated, []int{191} } func init() { @@ -1226,6 +1238,8 @@ func init() { proto.RegisterType((*SELinuxOptions)(nil), "k8s.io.api.core.v1.SELinuxOptions") proto.RegisterType((*ScaleIOPersistentVolumeSource)(nil), "k8s.io.api.core.v1.ScaleIOPersistentVolumeSource") proto.RegisterType((*ScaleIOVolumeSource)(nil), "k8s.io.api.core.v1.ScaleIOVolumeSource") + proto.RegisterType((*ScopeSelector)(nil), "k8s.io.api.core.v1.ScopeSelector") + proto.RegisterType((*ScopedResourceSelectorRequirement)(nil), "k8s.io.api.core.v1.ScopedResourceSelectorRequirement") proto.RegisterType((*Secret)(nil), "k8s.io.api.core.v1.Secret") proto.RegisterType((*SecretEnvSource)(nil), "k8s.io.api.core.v1.SecretEnvSource") proto.RegisterType((*SecretKeySelector)(nil), "k8s.io.api.core.v1.SecretKeySelector") @@ -8672,6 +8686,16 @@ func (m *ResourceQuotaSpec) MarshalTo(dAtA []byte) (int, error) { i += copy(dAtA[i:], s) } } + if m.ScopeSelector != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ScopeSelector.Size())) + n178, err := m.ScopeSelector.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n178 + } return i, nil } @@ -8714,11 +8738,11 @@ func (m *ResourceQuotaStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n178, err := (&v).MarshalTo(dAtA[i:]) + n179, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n178 + i += n179 } } if len(m.Used) > 0 { @@ -8745,11 +8769,11 @@ func (m *ResourceQuotaStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n179, err := (&v).MarshalTo(dAtA[i:]) + n180, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n179 + i += n180 } } return i, nil @@ -8794,11 +8818,11 @@ func (m *ResourceRequirements) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n180, err := (&v).MarshalTo(dAtA[i:]) + n181, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n180 + i += n181 } } if len(m.Requests) > 0 { @@ -8825,11 +8849,11 @@ func (m *ResourceRequirements) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n181, err := (&v).MarshalTo(dAtA[i:]) + n182, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n181 + i += n182 } } return i, nil @@ -8896,11 +8920,11 @@ func (m *ScaleIOPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n182, err := m.SecretRef.MarshalTo(dAtA[i:]) + n183, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n182 + i += n183 } dAtA[i] = 0x20 i++ @@ -8968,11 +8992,11 @@ func (m *ScaleIOVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n183, err := m.SecretRef.MarshalTo(dAtA[i:]) + n184, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n183 + i += n184 } dAtA[i] = 0x20 i++ @@ -9013,6 +9037,77 @@ func (m *ScaleIOVolumeSource) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *ScopeSelector) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ScopeSelector) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.MatchExpressions) > 0 { + for _, msg := range m.MatchExpressions { + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *ScopedResourceSelectorRequirement) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ScopedResourceSelectorRequirement) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ScopeName))) + i += copy(dAtA[i:], m.ScopeName) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Operator))) + i += copy(dAtA[i:], m.Operator) + if len(m.Values) > 0 { + for _, s := range m.Values { + dAtA[i] = 0x1a + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + return i, nil +} + func (m *Secret) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -9031,11 +9126,11 @@ func (m *Secret) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n184, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n185, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n184 + i += n185 if len(m.Data) > 0 { keysForData := make([]string, 0, len(m.Data)) for k := range m.Data { @@ -9111,11 +9206,11 @@ func (m *SecretEnvSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n185, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n186, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n185 + i += n186 if m.Optional != nil { dAtA[i] = 0x10 i++ @@ -9147,11 +9242,11 @@ func (m *SecretKeySelector) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n186, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n187, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n186 + i += n187 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Key))) @@ -9187,11 +9282,11 @@ func (m *SecretList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n187, err := m.ListMeta.MarshalTo(dAtA[i:]) + n188, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n187 + i += n188 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -9225,11 +9320,11 @@ func (m *SecretProjection) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n188, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n189, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n188 + i += n189 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -9349,11 +9444,11 @@ func (m *SecurityContext) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Capabilities.Size())) - n189, err := m.Capabilities.MarshalTo(dAtA[i:]) + n190, err := m.Capabilities.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n189 + i += n190 } if m.Privileged != nil { dAtA[i] = 0x10 @@ -9369,11 +9464,11 @@ func (m *SecurityContext) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SELinuxOptions.Size())) - n190, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) + n191, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n190 + i += n191 } if m.RunAsUser != nil { dAtA[i] = 0x20 @@ -9436,11 +9531,11 @@ func (m *SerializedReference) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Reference.Size())) - n191, err := m.Reference.MarshalTo(dAtA[i:]) + n192, err := m.Reference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n191 + i += n192 return i, nil } @@ -9462,27 +9557,27 @@ func (m *Service) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n192, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n192 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n193, err := m.Spec.MarshalTo(dAtA[i:]) + n193, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n193 - dAtA[i] = 0x1a + dAtA[i] = 0x12 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n194, err := m.Status.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n194, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n194 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n195, err := m.Status.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n195 return i, nil } @@ -9504,11 +9599,11 @@ func (m *ServiceAccount) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n195, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n196, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n195 + i += n196 if len(m.Secrets) > 0 { for _, msg := range m.Secrets { dAtA[i] = 0x12 @@ -9564,11 +9659,11 @@ func (m *ServiceAccountList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n196, err := m.ListMeta.MarshalTo(dAtA[i:]) + n197, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n196 + i += n197 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -9633,11 +9728,11 @@ func (m *ServiceList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n197, err := m.ListMeta.MarshalTo(dAtA[i:]) + n198, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n197 + i += n198 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -9682,11 +9777,11 @@ func (m *ServicePort) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TargetPort.Size())) - n198, err := m.TargetPort.MarshalTo(dAtA[i:]) + n199, err := m.TargetPort.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n198 + i += n199 dAtA[i] = 0x28 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.NodePort)) @@ -9833,11 +9928,11 @@ func (m *ServiceSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x72 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SessionAffinityConfig.Size())) - n199, err := m.SessionAffinityConfig.MarshalTo(dAtA[i:]) + n200, err := m.SessionAffinityConfig.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n199 + i += n200 } return i, nil } @@ -9860,11 +9955,11 @@ func (m *ServiceStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LoadBalancer.Size())) - n200, err := m.LoadBalancer.MarshalTo(dAtA[i:]) + n201, err := m.LoadBalancer.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n200 + i += n201 return i, nil } @@ -9887,11 +9982,11 @@ func (m *SessionAffinityConfig) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ClientIP.Size())) - n201, err := m.ClientIP.MarshalTo(dAtA[i:]) + n202, err := m.ClientIP.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n201 + i += n202 } return i, nil } @@ -9935,11 +10030,11 @@ func (m *StorageOSPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n202, err := m.SecretRef.MarshalTo(dAtA[i:]) + n203, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n202 + i += n203 } return i, nil } @@ -9983,11 +10078,11 @@ func (m *StorageOSVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n203, err := m.SecretRef.MarshalTo(dAtA[i:]) + n204, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n203 + i += n204 } return i, nil } @@ -10036,11 +10131,11 @@ func (m *TCPSocketAction) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Port.Size())) - n204, err := m.Port.MarshalTo(dAtA[i:]) + n205, err := m.Port.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n204 + i += n205 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Host))) @@ -10079,11 +10174,11 @@ func (m *Taint) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TimeAdded.Size())) - n205, err := m.TimeAdded.MarshalTo(dAtA[i:]) + n206, err := m.TimeAdded.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n205 + i += n206 } return i, nil } @@ -10149,11 +10244,11 @@ func (m *Volume) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.VolumeSource.Size())) - n206, err := m.VolumeSource.MarshalTo(dAtA[i:]) + n207, err := m.VolumeSource.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n206 + i += n207 return i, nil } @@ -10246,11 +10341,11 @@ func (m *VolumeNodeAffinity) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Required.Size())) - n207, err := m.Required.MarshalTo(dAtA[i:]) + n208, err := m.Required.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n207 + i += n208 } return i, nil } @@ -10274,42 +10369,42 @@ func (m *VolumeProjection) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size())) - n208, err := m.Secret.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n208 - } - if m.DownwardAPI != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.DownwardAPI.Size())) - n209, err := m.DownwardAPI.MarshalTo(dAtA[i:]) + n209, err := m.Secret.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n209 } - if m.ConfigMap != nil { - dAtA[i] = 0x1a + if m.DownwardAPI != nil { + dAtA[i] = 0x12 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size())) - n210, err := m.ConfigMap.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.DownwardAPI.Size())) + n210, err := m.DownwardAPI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n210 } - if m.ServiceAccountToken != nil { - dAtA[i] = 0x22 + if m.ConfigMap != nil { + dAtA[i] = 0x1a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.ServiceAccountToken.Size())) - n211, err := m.ServiceAccountToken.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size())) + n211, err := m.ConfigMap.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n211 } + if m.ServiceAccountToken != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ServiceAccountToken.Size())) + n212, err := m.ServiceAccountToken.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n212 + } return i, nil } @@ -10332,163 +10427,163 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.HostPath.Size())) - n212, err := m.HostPath.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n212 - } - if m.EmptyDir != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.EmptyDir.Size())) - n213, err := m.EmptyDir.MarshalTo(dAtA[i:]) + n213, err := m.HostPath.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n213 } - if m.GCEPersistentDisk != nil { - dAtA[i] = 0x1a + if m.EmptyDir != nil { + dAtA[i] = 0x12 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.GCEPersistentDisk.Size())) - n214, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.EmptyDir.Size())) + n214, err := m.EmptyDir.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n214 } - if m.AWSElasticBlockStore != nil { - dAtA[i] = 0x22 + if m.GCEPersistentDisk != nil { + dAtA[i] = 0x1a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.AWSElasticBlockStore.Size())) - n215, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.GCEPersistentDisk.Size())) + n215, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n215 } - if m.GitRepo != nil { - dAtA[i] = 0x2a + if m.AWSElasticBlockStore != nil { + dAtA[i] = 0x22 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.GitRepo.Size())) - n216, err := m.GitRepo.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.AWSElasticBlockStore.Size())) + n216, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n216 } - if m.Secret != nil { - dAtA[i] = 0x32 + if m.GitRepo != nil { + dAtA[i] = 0x2a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size())) - n217, err := m.Secret.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.GitRepo.Size())) + n217, err := m.GitRepo.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n217 } - if m.NFS != nil { - dAtA[i] = 0x3a + if m.Secret != nil { + dAtA[i] = 0x32 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.NFS.Size())) - n218, err := m.NFS.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size())) + n218, err := m.Secret.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n218 } - if m.ISCSI != nil { - dAtA[i] = 0x42 + if m.NFS != nil { + dAtA[i] = 0x3a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.ISCSI.Size())) - n219, err := m.ISCSI.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.NFS.Size())) + n219, err := m.NFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n219 } - if m.Glusterfs != nil { - dAtA[i] = 0x4a + if m.ISCSI != nil { + dAtA[i] = 0x42 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Glusterfs.Size())) - n220, err := m.Glusterfs.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.ISCSI.Size())) + n220, err := m.ISCSI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n220 } - if m.PersistentVolumeClaim != nil { - dAtA[i] = 0x52 + if m.Glusterfs != nil { + dAtA[i] = 0x4a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.PersistentVolumeClaim.Size())) - n221, err := m.PersistentVolumeClaim.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Glusterfs.Size())) + n221, err := m.Glusterfs.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n221 } - if m.RBD != nil { - dAtA[i] = 0x5a + if m.PersistentVolumeClaim != nil { + dAtA[i] = 0x52 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.RBD.Size())) - n222, err := m.RBD.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.PersistentVolumeClaim.Size())) + n222, err := m.PersistentVolumeClaim.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n222 } - if m.FlexVolume != nil { - dAtA[i] = 0x62 + if m.RBD != nil { + dAtA[i] = 0x5a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.FlexVolume.Size())) - n223, err := m.FlexVolume.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.RBD.Size())) + n223, err := m.RBD.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n223 } - if m.Cinder != nil { - dAtA[i] = 0x6a + if m.FlexVolume != nil { + dAtA[i] = 0x62 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Cinder.Size())) - n224, err := m.Cinder.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.FlexVolume.Size())) + n224, err := m.FlexVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n224 } - if m.CephFS != nil { - dAtA[i] = 0x72 + if m.Cinder != nil { + dAtA[i] = 0x6a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.CephFS.Size())) - n225, err := m.CephFS.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Cinder.Size())) + n225, err := m.Cinder.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n225 } - if m.Flocker != nil { - dAtA[i] = 0x7a + if m.CephFS != nil { + dAtA[i] = 0x72 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Flocker.Size())) - n226, err := m.Flocker.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.CephFS.Size())) + n226, err := m.CephFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n226 } + if m.Flocker != nil { + dAtA[i] = 0x7a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Flocker.Size())) + n227, err := m.Flocker.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n227 + } if m.DownwardAPI != nil { dAtA[i] = 0x82 i++ dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DownwardAPI.Size())) - n227, err := m.DownwardAPI.MarshalTo(dAtA[i:]) + n228, err := m.DownwardAPI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n227 + i += n228 } if m.FC != nil { dAtA[i] = 0x8a @@ -10496,11 +10591,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FC.Size())) - n228, err := m.FC.MarshalTo(dAtA[i:]) + n229, err := m.FC.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n228 + i += n229 } if m.AzureFile != nil { dAtA[i] = 0x92 @@ -10508,11 +10603,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureFile.Size())) - n229, err := m.AzureFile.MarshalTo(dAtA[i:]) + n230, err := m.AzureFile.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n229 + i += n230 } if m.ConfigMap != nil { dAtA[i] = 0x9a @@ -10520,11 +10615,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size())) - n230, err := m.ConfigMap.MarshalTo(dAtA[i:]) + n231, err := m.ConfigMap.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n230 + i += n231 } if m.VsphereVolume != nil { dAtA[i] = 0xa2 @@ -10532,11 +10627,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.VsphereVolume.Size())) - n231, err := m.VsphereVolume.MarshalTo(dAtA[i:]) + n232, err := m.VsphereVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n231 + i += n232 } if m.Quobyte != nil { dAtA[i] = 0xaa @@ -10544,11 +10639,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Quobyte.Size())) - n232, err := m.Quobyte.MarshalTo(dAtA[i:]) + n233, err := m.Quobyte.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n232 + i += n233 } if m.AzureDisk != nil { dAtA[i] = 0xb2 @@ -10556,11 +10651,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureDisk.Size())) - n233, err := m.AzureDisk.MarshalTo(dAtA[i:]) + n234, err := m.AzureDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n233 + i += n234 } if m.PhotonPersistentDisk != nil { dAtA[i] = 0xba @@ -10568,11 +10663,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PhotonPersistentDisk.Size())) - n234, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) + n235, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n234 + i += n235 } if m.PortworxVolume != nil { dAtA[i] = 0xc2 @@ -10580,11 +10675,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PortworxVolume.Size())) - n235, err := m.PortworxVolume.MarshalTo(dAtA[i:]) + n236, err := m.PortworxVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n235 + i += n236 } if m.ScaleIO != nil { dAtA[i] = 0xca @@ -10592,11 +10687,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ScaleIO.Size())) - n236, err := m.ScaleIO.MarshalTo(dAtA[i:]) + n237, err := m.ScaleIO.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n236 + i += n237 } if m.Projected != nil { dAtA[i] = 0xd2 @@ -10604,11 +10699,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Projected.Size())) - n237, err := m.Projected.MarshalTo(dAtA[i:]) + n238, err := m.Projected.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n237 + i += n238 } if m.StorageOS != nil { dAtA[i] = 0xda @@ -10616,11 +10711,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StorageOS.Size())) - n238, err := m.StorageOS.MarshalTo(dAtA[i:]) + n239, err := m.StorageOS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n238 + i += n239 } return i, nil } @@ -10680,11 +10775,11 @@ func (m *WeightedPodAffinityTerm) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PodAffinityTerm.Size())) - n239, err := m.PodAffinityTerm.MarshalTo(dAtA[i:]) + n240, err := m.PodAffinityTerm.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n239 + i += n240 return i, nil } @@ -13420,6 +13515,10 @@ func (m *ResourceQuotaSpec) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + if m.ScopeSelector != nil { + l = m.ScopeSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -13537,6 +13636,34 @@ func (m *ScaleIOVolumeSource) Size() (n int) { return n } +func (m *ScopeSelector) Size() (n int) { + var l int + _ = l + if len(m.MatchExpressions) > 0 { + for _, e := range m.MatchExpressions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ScopedResourceSelectorRequirement) Size() (n int) { + var l int + _ = l + l = len(m.ScopeName) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Operator) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Values) > 0 { + for _, s := range m.Values { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + func (m *Secret) Size() (n int) { var l int _ = l @@ -16296,6 +16423,7 @@ func (this *ResourceQuotaSpec) String() string { s := strings.Join([]string{`&ResourceQuotaSpec{`, `Hard:` + mapStringForHard + `,`, `Scopes:` + fmt.Sprintf("%v", this.Scopes) + `,`, + `ScopeSelector:` + strings.Replace(fmt.Sprintf("%v", this.ScopeSelector), "ScopeSelector", "ScopeSelector", 1) + `,`, `}`, }, "") return s @@ -16413,6 +16541,28 @@ func (this *ScaleIOVolumeSource) String() string { }, "") return s } +func (this *ScopeSelector) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ScopeSelector{`, + `MatchExpressions:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.MatchExpressions), "ScopedResourceSelectorRequirement", "ScopedResourceSelectorRequirement", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ScopedResourceSelectorRequirement) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ScopedResourceSelectorRequirement{`, + `ScopeName:` + fmt.Sprintf("%v", this.ScopeName) + `,`, + `Operator:` + fmt.Sprintf("%v", this.Operator) + `,`, + `Values:` + fmt.Sprintf("%v", this.Values) + `,`, + `}`, + }, "") + return s +} func (this *Secret) String() string { if this == nil { return "nil" @@ -42873,6 +43023,39 @@ func (m *ResourceQuotaSpec) Unmarshal(dAtA []byte) error { } m.Scopes = append(m.Scopes, ResourceQuotaScope(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ScopeSelector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ScopeSelector == nil { + m.ScopeSelector = &ScopeSelector{} + } + if err := m.ScopeSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -44296,6 +44479,224 @@ func (m *ScaleIOVolumeSource) Unmarshal(dAtA []byte) error { } return nil } +func (m *ScopeSelector) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ScopeSelector: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ScopeSelector: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MatchExpressions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MatchExpressions = append(m.MatchExpressions, ScopedResourceSelectorRequirement{}) + if err := m.MatchExpressions[len(m.MatchExpressions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ScopedResourceSelectorRequirement) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ScopedResourceSelectorRequirement: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ScopedResourceSelectorRequirement: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ScopeName", 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 > l { + return io.ErrUnexpectedEOF + } + m.ScopeName = ResourceQuotaScope(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Operator", 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 > l { + return io.ErrUnexpectedEOF + } + m.Operator = ScopeSelectorOperator(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Values", 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 > l { + return io.ErrUnexpectedEOF + } + m.Values = append(m.Values, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Secret) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -50201,788 +50602,794 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 12520 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x70, 0x24, 0xd7, - 0x75, 0x18, 0xac, 0x9e, 0x19, 0x00, 0x33, 0x07, 0xef, 0xbb, 0x0f, 0x62, 0x41, 0xee, 0xce, 0xb2, - 0x29, 0x2d, 0x97, 0x22, 0x09, 0x88, 0x4b, 0x52, 0xa4, 0x45, 0x89, 0x36, 0x80, 0x01, 0x76, 0xc1, - 0x5d, 0x60, 0x87, 0x77, 0xb0, 0x4b, 0x49, 0xa6, 0x64, 0x35, 0x66, 0x2e, 0x80, 0xe6, 0x36, 0xba, - 0x87, 0xdd, 0x3d, 0xd8, 0x05, 0xcb, 0xae, 0xfa, 0x3e, 0x3a, 0x71, 0xe2, 0x47, 0xa5, 0x54, 0xb1, - 0x2b, 0x0f, 0xdb, 0xe5, 0x54, 0x25, 0x4e, 0xd9, 0x8a, 0x93, 0x54, 0x1c, 0x3b, 0xb6, 0x23, 0x39, - 0x89, 0xe3, 0xe4, 0x87, 0xf3, 0x47, 0x71, 0xf2, 0x47, 0xae, 0x72, 0x05, 0xb1, 0x61, 0x27, 0x29, - 0xff, 0xc8, 0xa3, 0xe2, 0x54, 0xaa, 0x8c, 0xb8, 0xe2, 0xd4, 0x7d, 0xf6, 0xbd, 0x3d, 0xdd, 0x33, - 0x83, 0x25, 0x16, 0xa4, 0x55, 0xfa, 0x37, 0x73, 0xcf, 0xb9, 0xe7, 0xde, 0xbe, 0xcf, 0x73, 0xce, - 0x3d, 0x0f, 0x78, 0xed, 0xde, 0xab, 0xd1, 0x9c, 0x1b, 0xcc, 0xdf, 0xeb, 0x6c, 0x92, 0xd0, 0x27, - 0x31, 0x89, 0xe6, 0xf7, 0x88, 0xdf, 0x0a, 0xc2, 0x79, 0x01, 0x70, 0xda, 0xee, 0x7c, 0x33, 0x08, - 0xc9, 0xfc, 0xde, 0x0b, 0xf3, 0xdb, 0xc4, 0x27, 0xa1, 0x13, 0x93, 0xd6, 0x5c, 0x3b, 0x0c, 0xe2, - 0x00, 0x21, 0x8e, 0x33, 0xe7, 0xb4, 0xdd, 0x39, 0x8a, 0x33, 0xb7, 0xf7, 0xc2, 0xec, 0xf3, 0xdb, - 0x6e, 0xbc, 0xd3, 0xd9, 0x9c, 0x6b, 0x06, 0xbb, 0xf3, 0xdb, 0xc1, 0x76, 0x30, 0xcf, 0x50, 0x37, - 0x3b, 0x5b, 0xec, 0x1f, 0xfb, 0xc3, 0x7e, 0x71, 0x12, 0xb3, 0x6b, 0x49, 0x33, 0xe4, 0x41, 0x4c, - 0xfc, 0xc8, 0x0d, 0xfc, 0xe8, 0x79, 0xa7, 0xed, 0x46, 0x24, 0xdc, 0x23, 0xe1, 0x7c, 0xfb, 0xde, - 0x36, 0x85, 0x45, 0x26, 0xc2, 0xfc, 0xde, 0x0b, 0x9b, 0x24, 0x76, 0xba, 0x7a, 0x34, 0xfb, 0x52, - 0x42, 0x6e, 0xd7, 0x69, 0xee, 0xb8, 0x3e, 0x09, 0xf7, 0x25, 0x8d, 0xf9, 0x90, 0x44, 0x41, 0x27, - 0x6c, 0x92, 0x63, 0xd5, 0x8a, 0xe6, 0x77, 0x49, 0xec, 0x64, 0x7c, 0xfd, 0xec, 0x7c, 0x5e, 0xad, - 0xb0, 0xe3, 0xc7, 0xee, 0x6e, 0x77, 0x33, 0x9f, 0xee, 0x57, 0x21, 0x6a, 0xee, 0x90, 0x5d, 0xa7, - 0xab, 0xde, 0x8b, 0x79, 0xf5, 0x3a, 0xb1, 0xeb, 0xcd, 0xbb, 0x7e, 0x1c, 0xc5, 0x61, 0xba, 0x92, - 0xfd, 0x2d, 0x0b, 0x2e, 0x2f, 0xbc, 0xd5, 0x58, 0xf6, 0x9c, 0x28, 0x76, 0x9b, 0x8b, 0x5e, 0xd0, - 0xbc, 0xd7, 0x88, 0x83, 0x90, 0xdc, 0x0d, 0xbc, 0xce, 0x2e, 0x69, 0xb0, 0x81, 0x40, 0xcf, 0x41, - 0x79, 0x8f, 0xfd, 0x5f, 0xad, 0xcd, 0x58, 0x97, 0xad, 0xab, 0x95, 0xc5, 0xa9, 0xdf, 0x3a, 0xa8, - 0x7e, 0xec, 0xf0, 0xa0, 0x5a, 0xbe, 0x2b, 0xca, 0xb1, 0xc2, 0x40, 0x57, 0x60, 0x78, 0x2b, 0xda, - 0xd8, 0x6f, 0x93, 0x99, 0x02, 0xc3, 0x9d, 0x10, 0xb8, 0xc3, 0x2b, 0x0d, 0x5a, 0x8a, 0x05, 0x14, - 0xcd, 0x43, 0xa5, 0xed, 0x84, 0xb1, 0x1b, 0xbb, 0x81, 0x3f, 0x53, 0xbc, 0x6c, 0x5d, 0x1d, 0x5a, - 0x9c, 0x16, 0xa8, 0x95, 0xba, 0x04, 0xe0, 0x04, 0x87, 0x76, 0x23, 0x24, 0x4e, 0xeb, 0xb6, 0xef, - 0xed, 0xcf, 0x94, 0x2e, 0x5b, 0x57, 0xcb, 0x49, 0x37, 0xb0, 0x28, 0xc7, 0x0a, 0xc3, 0xfe, 0xc9, - 0x02, 0x94, 0x17, 0xb6, 0xb6, 0x5c, 0xdf, 0x8d, 0xf7, 0xd1, 0x5d, 0x18, 0xf3, 0x83, 0x16, 0x91, - 0xff, 0xd9, 0x57, 0x8c, 0x5e, 0xbb, 0x3c, 0xd7, 0xbd, 0x32, 0xe7, 0xd6, 0x35, 0xbc, 0xc5, 0xa9, - 0xc3, 0x83, 0xea, 0x98, 0x5e, 0x82, 0x0d, 0x3a, 0x08, 0xc3, 0x68, 0x3b, 0x68, 0x29, 0xb2, 0x05, - 0x46, 0xb6, 0x9a, 0x45, 0xb6, 0x9e, 0xa0, 0x2d, 0x4e, 0x1e, 0x1e, 0x54, 0x47, 0xb5, 0x02, 0xac, - 0x13, 0x41, 0x9b, 0x30, 0x49, 0xff, 0xfa, 0xb1, 0xab, 0xe8, 0x16, 0x19, 0xdd, 0xa7, 0xf2, 0xe8, - 0x6a, 0xa8, 0x8b, 0x67, 0x0e, 0x0f, 0xaa, 0x93, 0xa9, 0x42, 0x9c, 0x26, 0x68, 0xbf, 0x07, 0x13, - 0x0b, 0x71, 0xec, 0x34, 0x77, 0x48, 0x8b, 0xcf, 0x20, 0x7a, 0x09, 0x4a, 0xbe, 0xb3, 0x4b, 0xc4, - 0xfc, 0x5e, 0x16, 0x03, 0x5b, 0x5a, 0x77, 0x76, 0xc9, 0xd1, 0x41, 0x75, 0xea, 0x8e, 0xef, 0xbe, - 0xdb, 0x11, 0xab, 0x82, 0x96, 0x61, 0x86, 0x8d, 0xae, 0x01, 0xb4, 0xc8, 0x9e, 0xdb, 0x24, 0x75, - 0x27, 0xde, 0x11, 0xf3, 0x8d, 0x44, 0x5d, 0xa8, 0x29, 0x08, 0xd6, 0xb0, 0xec, 0x07, 0x50, 0x59, - 0xd8, 0x0b, 0xdc, 0x56, 0x3d, 0x68, 0x45, 0xe8, 0x1e, 0x4c, 0xb6, 0x43, 0xb2, 0x45, 0x42, 0x55, - 0x34, 0x63, 0x5d, 0x2e, 0x5e, 0x1d, 0xbd, 0x76, 0x35, 0xf3, 0x63, 0x4d, 0xd4, 0x65, 0x3f, 0x0e, - 0xf7, 0x17, 0x1f, 0x13, 0xed, 0x4d, 0xa6, 0xa0, 0x38, 0x4d, 0xd9, 0xfe, 0xd7, 0x05, 0x38, 0xb7, - 0xf0, 0x5e, 0x27, 0x24, 0x35, 0x37, 0xba, 0x97, 0x5e, 0xe1, 0x2d, 0x37, 0xba, 0xb7, 0x9e, 0x8c, - 0x80, 0x5a, 0x5a, 0x35, 0x51, 0x8e, 0x15, 0x06, 0x7a, 0x1e, 0x46, 0xe8, 0xef, 0x3b, 0x78, 0x55, - 0x7c, 0xf2, 0x19, 0x81, 0x3c, 0x5a, 0x73, 0x62, 0xa7, 0xc6, 0x41, 0x58, 0xe2, 0xa0, 0x35, 0x18, - 0x6d, 0xb2, 0x0d, 0xb9, 0xbd, 0x16, 0xb4, 0x08, 0x9b, 0xcc, 0xca, 0xe2, 0xb3, 0x14, 0x7d, 0x29, - 0x29, 0x3e, 0x3a, 0xa8, 0xce, 0xf0, 0xbe, 0x09, 0x12, 0x1a, 0x0c, 0xeb, 0xf5, 0x91, 0xad, 0xf6, - 0x57, 0x89, 0x51, 0x82, 0x8c, 0xbd, 0x75, 0x55, 0xdb, 0x2a, 0x43, 0x6c, 0xab, 0x8c, 0x65, 0x6f, - 0x13, 0xf4, 0x02, 0x94, 0xee, 0xb9, 0x7e, 0x6b, 0x66, 0x98, 0xd1, 0xba, 0x48, 0xe7, 0xfc, 0xa6, - 0xeb, 0xb7, 0x8e, 0x0e, 0xaa, 0xd3, 0x46, 0x77, 0x68, 0x21, 0x66, 0xa8, 0xf6, 0x1f, 0x5b, 0x50, - 0x65, 0xb0, 0x15, 0xd7, 0x23, 0x75, 0x12, 0x46, 0x6e, 0x14, 0x13, 0x3f, 0x36, 0x06, 0xf4, 0x1a, - 0x40, 0x44, 0x9a, 0x21, 0x89, 0xb5, 0x21, 0x55, 0x0b, 0xa3, 0xa1, 0x20, 0x58, 0xc3, 0xa2, 0x07, - 0x42, 0xb4, 0xe3, 0x84, 0x6c, 0x7d, 0x89, 0x81, 0x55, 0x07, 0x42, 0x43, 0x02, 0x70, 0x82, 0x63, - 0x1c, 0x08, 0xc5, 0x7e, 0x07, 0x02, 0xfa, 0x1c, 0x4c, 0x26, 0x8d, 0x45, 0x6d, 0xa7, 0x29, 0x07, - 0x90, 0x6d, 0x99, 0x86, 0x09, 0xc2, 0x69, 0x5c, 0xfb, 0xef, 0x59, 0x62, 0xf1, 0xd0, 0xaf, 0xfe, - 0x88, 0x7f, 0xab, 0xfd, 0x6b, 0x16, 0x8c, 0x2c, 0xba, 0x7e, 0xcb, 0xf5, 0xb7, 0xd1, 0x57, 0xa0, - 0x4c, 0xef, 0xa6, 0x96, 0x13, 0x3b, 0xe2, 0xdc, 0xfb, 0x94, 0xb6, 0xb7, 0xd4, 0x55, 0x31, 0xd7, - 0xbe, 0xb7, 0x4d, 0x0b, 0xa2, 0x39, 0x8a, 0x4d, 0x77, 0xdb, 0xed, 0xcd, 0x77, 0x48, 0x33, 0x5e, - 0x23, 0xb1, 0x93, 0x7c, 0x4e, 0x52, 0x86, 0x15, 0x55, 0x74, 0x13, 0x86, 0x63, 0x27, 0xdc, 0x26, - 0xb1, 0x38, 0x00, 0x33, 0x0f, 0x2a, 0x5e, 0x13, 0xd3, 0x1d, 0x49, 0xfc, 0x26, 0x49, 0xae, 0x85, - 0x0d, 0x56, 0x15, 0x0b, 0x12, 0xf6, 0x8f, 0x0c, 0xc3, 0x85, 0xa5, 0xc6, 0x6a, 0xce, 0xba, 0xba, - 0x02, 0xc3, 0xad, 0xd0, 0xdd, 0x23, 0xa1, 0x18, 0x67, 0x45, 0xa5, 0xc6, 0x4a, 0xb1, 0x80, 0xa2, - 0x57, 0x61, 0x8c, 0x5f, 0x48, 0x37, 0x1c, 0xbf, 0xe5, 0xc9, 0x21, 0x3e, 0x2b, 0xb0, 0xc7, 0xee, - 0x6a, 0x30, 0x6c, 0x60, 0x1e, 0x73, 0x51, 0x5d, 0x49, 0x6d, 0xc6, 0xbc, 0xcb, 0xee, 0x87, 0x2d, - 0x98, 0xe2, 0xcd, 0x2c, 0xc4, 0x71, 0xe8, 0x6e, 0x76, 0x62, 0x12, 0xcd, 0x0c, 0xb1, 0x93, 0x6e, - 0x29, 0x6b, 0xb4, 0x72, 0x47, 0x60, 0xee, 0x6e, 0x8a, 0x0a, 0x3f, 0x04, 0x67, 0x44, 0xbb, 0x53, - 0x69, 0x30, 0xee, 0x6a, 0x16, 0xfd, 0xa0, 0x05, 0xb3, 0xcd, 0xc0, 0x8f, 0xc3, 0xc0, 0xf3, 0x48, - 0x58, 0xef, 0x6c, 0x7a, 0x6e, 0xb4, 0xc3, 0xd7, 0x29, 0x26, 0x5b, 0xec, 0x24, 0xc8, 0x99, 0x43, - 0x85, 0x24, 0xe6, 0xf0, 0xd2, 0xe1, 0x41, 0x75, 0x76, 0x29, 0x97, 0x14, 0xee, 0xd1, 0x0c, 0xba, - 0x07, 0x88, 0x5e, 0xa5, 0x8d, 0xd8, 0xd9, 0x26, 0x49, 0xe3, 0x23, 0x83, 0x37, 0x7e, 0xfe, 0xf0, - 0xa0, 0x8a, 0xd6, 0xbb, 0x48, 0xe0, 0x0c, 0xb2, 0xe8, 0x5d, 0x38, 0x4b, 0x4b, 0xbb, 0xbe, 0xb5, - 0x3c, 0x78, 0x73, 0x33, 0x87, 0x07, 0xd5, 0xb3, 0xeb, 0x19, 0x44, 0x70, 0x26, 0xe9, 0xd9, 0x25, - 0x38, 0x97, 0x39, 0x55, 0x68, 0x0a, 0x8a, 0xf7, 0x08, 0x67, 0x41, 0x2a, 0x98, 0xfe, 0x44, 0x67, - 0x61, 0x68, 0xcf, 0xf1, 0x3a, 0x62, 0x95, 0x62, 0xfe, 0xe7, 0x33, 0x85, 0x57, 0x2d, 0xbb, 0x09, - 0x63, 0x4b, 0x4e, 0xdb, 0xd9, 0x74, 0x3d, 0x37, 0x76, 0x49, 0x84, 0x9e, 0x86, 0xa2, 0xd3, 0x6a, - 0xb1, 0x2b, 0xb2, 0xb2, 0x78, 0xee, 0xf0, 0xa0, 0x5a, 0x5c, 0x68, 0xd1, 0xb3, 0x1a, 0x14, 0xd6, - 0x3e, 0xa6, 0x18, 0xe8, 0x93, 0x50, 0x6a, 0x85, 0x41, 0x7b, 0xa6, 0xc0, 0x30, 0xe9, 0x50, 0x95, - 0x6a, 0x61, 0xd0, 0x4e, 0xa1, 0x32, 0x1c, 0xfb, 0x37, 0x0a, 0xf0, 0xc4, 0x12, 0x69, 0xef, 0xac, - 0x34, 0x72, 0x36, 0xdd, 0x55, 0x28, 0xef, 0x06, 0xbe, 0x1b, 0x07, 0x61, 0x24, 0x9a, 0x66, 0xb7, - 0xc9, 0x9a, 0x28, 0xc3, 0x0a, 0x8a, 0x2e, 0x43, 0xa9, 0x9d, 0x70, 0x02, 0x63, 0x92, 0x8b, 0x60, - 0x3c, 0x00, 0x83, 0x50, 0x8c, 0x4e, 0x44, 0x42, 0x71, 0x0b, 0x2a, 0x8c, 0x3b, 0x11, 0x09, 0x31, - 0x83, 0x24, 0xc7, 0x29, 0x3d, 0x68, 0xc5, 0xb6, 0x4a, 0x1d, 0xa7, 0x14, 0x82, 0x35, 0x2c, 0x54, - 0x87, 0x4a, 0xa4, 0x26, 0x75, 0x68, 0xf0, 0x49, 0x1d, 0x67, 0xe7, 0xad, 0x9a, 0xc9, 0x84, 0x88, - 0x71, 0x0c, 0x0c, 0xf7, 0x3d, 0x6f, 0xbf, 0x51, 0x00, 0xc4, 0x87, 0xf0, 0xcf, 0xd9, 0xc0, 0xdd, - 0xe9, 0x1e, 0xb8, 0x4c, 0xce, 0xeb, 0x56, 0xd0, 0x74, 0xbc, 0xf4, 0x11, 0x7e, 0x52, 0xa3, 0xf7, - 0xbf, 0x2c, 0x78, 0x62, 0xc9, 0xf5, 0x5b, 0x24, 0xcc, 0x59, 0x80, 0x8f, 0x46, 0x00, 0x39, 0xde, - 0x49, 0x6f, 0x2c, 0xb1, 0xd2, 0x09, 0x2c, 0x31, 0xfb, 0xbf, 0x5b, 0x80, 0xf8, 0x67, 0x7f, 0xe4, - 0x3e, 0xf6, 0x4e, 0xf7, 0xc7, 0x9e, 0xc0, 0xb2, 0xb0, 0x6f, 0xc1, 0xc4, 0x92, 0xe7, 0x12, 0x3f, - 0x5e, 0xad, 0x2f, 0x05, 0xfe, 0x96, 0xbb, 0x8d, 0x3e, 0x03, 0x13, 0x54, 0xa6, 0x0d, 0x3a, 0x71, - 0x83, 0x34, 0x03, 0x9f, 0xb1, 0xff, 0x54, 0x12, 0x44, 0x87, 0x07, 0xd5, 0x89, 0x0d, 0x03, 0x82, - 0x53, 0x98, 0xf6, 0xef, 0xd2, 0xf1, 0x0b, 0x76, 0xdb, 0x81, 0x4f, 0xfc, 0x78, 0x29, 0xf0, 0x5b, - 0x5c, 0x4c, 0xfc, 0x0c, 0x94, 0x62, 0x3a, 0x1e, 0x7c, 0xec, 0xae, 0xc8, 0x8d, 0x42, 0x47, 0xe1, - 0xe8, 0xa0, 0x7a, 0xbe, 0xbb, 0x06, 0x1b, 0x27, 0x56, 0x07, 0x7d, 0x17, 0x0c, 0x47, 0xb1, 0x13, - 0x77, 0x22, 0x31, 0x9a, 0x4f, 0xca, 0xd1, 0x6c, 0xb0, 0xd2, 0xa3, 0x83, 0xea, 0xa4, 0xaa, 0xc6, - 0x8b, 0xb0, 0xa8, 0x80, 0x9e, 0x81, 0x91, 0x5d, 0x12, 0x45, 0xce, 0xb6, 0xe4, 0xf0, 0x27, 0x45, - 0xdd, 0x91, 0x35, 0x5e, 0x8c, 0x25, 0x1c, 0x3d, 0x05, 0x43, 0x24, 0x0c, 0x83, 0x50, 0xec, 0xd1, - 0x71, 0x81, 0x38, 0xb4, 0x4c, 0x0b, 0x31, 0x87, 0xd9, 0xff, 0xd6, 0x82, 0x49, 0xd5, 0x57, 0xde, - 0xd6, 0x29, 0xb0, 0x72, 0x5f, 0x04, 0x68, 0xca, 0x0f, 0x8c, 0xd8, 0xed, 0x31, 0x7a, 0xed, 0x4a, - 0x26, 0x83, 0xd2, 0x35, 0x8c, 0x09, 0x65, 0x55, 0x14, 0x61, 0x8d, 0x9a, 0xfd, 0xcf, 0x2c, 0x38, - 0x93, 0xfa, 0xa2, 0x5b, 0x6e, 0x14, 0xa3, 0xb7, 0xbb, 0xbe, 0x6a, 0x6e, 0xb0, 0xaf, 0xa2, 0xb5, - 0xd9, 0x37, 0xa9, 0xa5, 0x2c, 0x4b, 0xb4, 0x2f, 0xba, 0x01, 0x43, 0x6e, 0x4c, 0x76, 0xe5, 0xc7, - 0x3c, 0xd5, 0xf3, 0x63, 0x78, 0xaf, 0x92, 0x19, 0x59, 0xa5, 0x35, 0x31, 0x27, 0x60, 0xff, 0x78, - 0x11, 0x2a, 0x7c, 0xd9, 0xae, 0x39, 0xed, 0x53, 0x98, 0x8b, 0x55, 0x28, 0x31, 0xea, 0xbc, 0xe3, - 0x4f, 0x67, 0x77, 0x5c, 0x74, 0x67, 0x8e, 0xca, 0x69, 0x9c, 0x15, 0x54, 0x57, 0x03, 0x2d, 0xc2, - 0x8c, 0x04, 0x72, 0x00, 0x36, 0x5d, 0xdf, 0x09, 0xf7, 0x69, 0xd9, 0x4c, 0x91, 0x11, 0x7c, 0xbe, - 0x37, 0xc1, 0x45, 0x85, 0xcf, 0xc9, 0xaa, 0xbe, 0x26, 0x00, 0xac, 0x11, 0x9d, 0x7d, 0x05, 0x2a, - 0x0a, 0xf9, 0x38, 0x3c, 0xce, 0xec, 0xe7, 0x60, 0x32, 0xd5, 0x56, 0xbf, 0xea, 0x63, 0x3a, 0x8b, - 0xf4, 0x75, 0x76, 0x0a, 0x88, 0x5e, 0x2f, 0xfb, 0x7b, 0xe2, 0x14, 0x7d, 0x0f, 0xce, 0x7a, 0x19, - 0x87, 0x93, 0x98, 0xaa, 0xc1, 0x0f, 0xb3, 0x27, 0xc4, 0x67, 0x9f, 0xcd, 0x82, 0xe2, 0xcc, 0x36, - 0xe8, 0xb5, 0x1f, 0xb4, 0xe9, 0x9a, 0x77, 0x3c, 0xd6, 0x5f, 0x21, 0x7d, 0xdf, 0x16, 0x65, 0x58, - 0x41, 0xe9, 0x11, 0x76, 0x56, 0x75, 0xfe, 0x26, 0xd9, 0x6f, 0x10, 0x8f, 0x34, 0xe3, 0x20, 0xfc, - 0x50, 0xbb, 0x7f, 0x91, 0x8f, 0x3e, 0x3f, 0x01, 0x47, 0x05, 0x81, 0xe2, 0x4d, 0xb2, 0xcf, 0xa7, - 0x42, 0xff, 0xba, 0x62, 0xcf, 0xaf, 0xfb, 0x45, 0x0b, 0xc6, 0xd5, 0xd7, 0x9d, 0xc2, 0x56, 0x5f, - 0x34, 0xb7, 0xfa, 0xc5, 0x9e, 0x0b, 0x3c, 0x67, 0x93, 0x7f, 0xa3, 0x00, 0x17, 0x14, 0x0e, 0x65, - 0xf7, 0xf9, 0x1f, 0xb1, 0xaa, 0xe6, 0xa1, 0xe2, 0x2b, 0xed, 0x81, 0x65, 0x8a, 0xed, 0x89, 0xee, - 0x20, 0xc1, 0xa1, 0x5c, 0x9b, 0x9f, 0x88, 0xf8, 0x63, 0xba, 0x5a, 0x4d, 0xa8, 0xd0, 0x16, 0xa1, - 0xd8, 0x71, 0x5b, 0xe2, 0xce, 0xf8, 0x94, 0x1c, 0xed, 0x3b, 0xab, 0xb5, 0xa3, 0x83, 0xea, 0x93, - 0x79, 0x2a, 0x5d, 0x7a, 0x59, 0x45, 0x73, 0x77, 0x56, 0x6b, 0x98, 0x56, 0x46, 0x0b, 0x30, 0x29, - 0xb5, 0xd6, 0x77, 0x29, 0x07, 0x15, 0xf8, 0xe2, 0x6a, 0x51, 0xba, 0x31, 0x6c, 0x82, 0x71, 0x1a, - 0x1f, 0xd5, 0x60, 0xea, 0x5e, 0x67, 0x93, 0x78, 0x24, 0xe6, 0x1f, 0x7c, 0x93, 0x70, 0xcd, 0x51, - 0x25, 0x11, 0x2d, 0x6f, 0xa6, 0xe0, 0xb8, 0xab, 0x86, 0xfd, 0x67, 0xec, 0x88, 0x17, 0xa3, 0x57, - 0x0f, 0x03, 0xba, 0xb0, 0x28, 0xf5, 0x0f, 0x73, 0x39, 0x0f, 0xb2, 0x2a, 0x6e, 0x92, 0xfd, 0x8d, - 0x80, 0x32, 0xdb, 0xd9, 0xab, 0xc2, 0x58, 0xf3, 0xa5, 0x9e, 0x6b, 0xfe, 0x97, 0x0b, 0x70, 0x4e, - 0x8d, 0x80, 0xc1, 0xd7, 0xfd, 0x79, 0x1f, 0x83, 0x17, 0x60, 0xb4, 0x45, 0xb6, 0x9c, 0x8e, 0x17, - 0x2b, 0x35, 0xe6, 0x10, 0x57, 0x65, 0xd7, 0x92, 0x62, 0xac, 0xe3, 0x1c, 0x63, 0xd8, 0x7e, 0x76, - 0x94, 0xdd, 0xad, 0xb1, 0x43, 0xd7, 0xb8, 0xda, 0x35, 0x56, 0xee, 0xae, 0x79, 0x0a, 0x86, 0xdc, - 0x5d, 0xca, 0x6b, 0x15, 0x4c, 0x16, 0x6a, 0x95, 0x16, 0x62, 0x0e, 0x43, 0x9f, 0x80, 0x91, 0x66, - 0xb0, 0xbb, 0xeb, 0xf8, 0x2d, 0x76, 0xe5, 0x55, 0x16, 0x47, 0x29, 0x3b, 0xb6, 0xc4, 0x8b, 0xb0, - 0x84, 0xa1, 0x27, 0xa0, 0xe4, 0x84, 0xdb, 0xd1, 0x4c, 0x89, 0xe1, 0x94, 0x69, 0x4b, 0x0b, 0xe1, - 0x76, 0x84, 0x59, 0x29, 0x95, 0xaa, 0xee, 0x07, 0xe1, 0x3d, 0xd7, 0xdf, 0xae, 0xb9, 0xa1, 0xd8, - 0x12, 0xea, 0x2e, 0x7c, 0x4b, 0x41, 0xb0, 0x86, 0x85, 0x56, 0x60, 0xa8, 0x1d, 0x84, 0x71, 0x34, - 0x33, 0xcc, 0x86, 0xfb, 0xc9, 0x9c, 0x83, 0x88, 0x7f, 0x6d, 0x3d, 0x08, 0xe3, 0xe4, 0x03, 0xe8, - 0xbf, 0x08, 0xf3, 0xea, 0xe8, 0xbb, 0xa0, 0x48, 0xfc, 0xbd, 0x99, 0x11, 0x46, 0x65, 0x36, 0x8b, - 0xca, 0xb2, 0xbf, 0x77, 0xd7, 0x09, 0x93, 0x53, 0x7a, 0xd9, 0xdf, 0xc3, 0xb4, 0x0e, 0xfa, 0x02, - 0x54, 0xe4, 0x16, 0x8f, 0x84, 0x9a, 0x23, 0x73, 0x89, 0xc9, 0x83, 0x01, 0x93, 0x77, 0x3b, 0x6e, - 0x48, 0x76, 0x89, 0x1f, 0x47, 0xc9, 0x99, 0x26, 0xa1, 0x11, 0x4e, 0xa8, 0xa1, 0x2f, 0x48, 0xdd, - 0xda, 0x5a, 0xd0, 0xf1, 0xe3, 0x68, 0xa6, 0xc2, 0xba, 0x97, 0xf9, 0xea, 0x71, 0x37, 0xc1, 0x4b, - 0x2b, 0xdf, 0x78, 0x65, 0x6c, 0x90, 0x42, 0x18, 0xc6, 0x3d, 0x77, 0x8f, 0xf8, 0x24, 0x8a, 0xea, - 0x61, 0xb0, 0x49, 0x66, 0x80, 0xf5, 0xfc, 0x42, 0xf6, 0x63, 0x40, 0xb0, 0x49, 0x16, 0xa7, 0x0f, - 0x0f, 0xaa, 0xe3, 0xb7, 0xf4, 0x3a, 0xd8, 0x24, 0x81, 0xee, 0xc0, 0x04, 0x95, 0x6b, 0xdc, 0x84, - 0xe8, 0x68, 0x3f, 0xa2, 0x4c, 0xfa, 0xc0, 0x46, 0x25, 0x9c, 0x22, 0x82, 0xde, 0x80, 0x8a, 0xe7, - 0x6e, 0x91, 0xe6, 0x7e, 0xd3, 0x23, 0x33, 0x63, 0x8c, 0x62, 0xe6, 0xb6, 0xba, 0x25, 0x91, 0xb8, - 0x5c, 0xa4, 0xfe, 0xe2, 0xa4, 0x3a, 0xba, 0x0b, 0xe7, 0x63, 0x12, 0xee, 0xba, 0xbe, 0x43, 0xb7, - 0x83, 0x90, 0x17, 0xd8, 0x93, 0xca, 0x38, 0x5b, 0x6f, 0x97, 0xc4, 0xd0, 0x9d, 0xdf, 0xc8, 0xc4, - 0xc2, 0x39, 0xb5, 0xd1, 0x6d, 0x98, 0x64, 0x3b, 0xa1, 0xde, 0xf1, 0xbc, 0x7a, 0xe0, 0xb9, 0xcd, - 0xfd, 0x99, 0x09, 0x46, 0xf0, 0x13, 0xf2, 0x5e, 0x58, 0x35, 0xc1, 0x47, 0x07, 0x55, 0x48, 0xfe, - 0xe1, 0x74, 0x6d, 0xb4, 0xc9, 0x74, 0xe8, 0x9d, 0xd0, 0x8d, 0xf7, 0xe9, 0xfa, 0x25, 0x0f, 0xe2, - 0x99, 0xc9, 0x9e, 0xa2, 0xb0, 0x8e, 0xaa, 0x14, 0xed, 0x7a, 0x21, 0x4e, 0x13, 0xa4, 0x5b, 0x3b, - 0x8a, 0x5b, 0xae, 0x3f, 0x33, 0xc5, 0x4e, 0x0c, 0xb5, 0x33, 0x1a, 0xb4, 0x10, 0x73, 0x18, 0xd3, - 0x9f, 0xd3, 0x1f, 0xb7, 0xe9, 0x09, 0x3a, 0xcd, 0x10, 0x13, 0xfd, 0xb9, 0x04, 0xe0, 0x04, 0x87, - 0x32, 0x35, 0x71, 0xbc, 0x3f, 0x83, 0x18, 0xaa, 0xda, 0x2e, 0x1b, 0x1b, 0x5f, 0xc0, 0xb4, 0x1c, - 0xdd, 0x82, 0x11, 0xe2, 0xef, 0xad, 0x84, 0xc1, 0xee, 0xcc, 0x99, 0xfc, 0x3d, 0xbb, 0xcc, 0x51, - 0xf8, 0x81, 0x9e, 0x08, 0x78, 0xa2, 0x18, 0x4b, 0x12, 0xe8, 0x01, 0xcc, 0x64, 0xcc, 0x08, 0x9f, - 0x80, 0xb3, 0x6c, 0x02, 0x3e, 0x2b, 0xea, 0xce, 0x6c, 0xe4, 0xe0, 0x1d, 0xf5, 0x80, 0xe1, 0x5c, - 0xea, 0xe8, 0x4b, 0x30, 0xce, 0x37, 0x14, 0x7f, 0x7c, 0x8b, 0x66, 0xce, 0xb1, 0xaf, 0xb9, 0x9c, - 0xbf, 0x39, 0x39, 0xe2, 0xe2, 0x39, 0xd1, 0xa1, 0x71, 0xbd, 0x34, 0xc2, 0x26, 0x35, 0x7b, 0x13, - 0x26, 0xd4, 0xb9, 0xc5, 0x96, 0x0e, 0xaa, 0xc2, 0x10, 0xe3, 0x76, 0x84, 0x7e, 0xab, 0x42, 0x67, - 0x8a, 0x71, 0x42, 0x98, 0x97, 0xb3, 0x99, 0x72, 0xdf, 0x23, 0x8b, 0xfb, 0x31, 0xe1, 0x52, 0x75, - 0x51, 0x9b, 0x29, 0x09, 0xc0, 0x09, 0x8e, 0xfd, 0x7f, 0x39, 0xd7, 0x98, 0x1c, 0x8e, 0x03, 0x5c, - 0x07, 0xcf, 0x41, 0x79, 0x27, 0x88, 0x62, 0x8a, 0xcd, 0xda, 0x18, 0x4a, 0xf8, 0xc4, 0x1b, 0xa2, - 0x1c, 0x2b, 0x0c, 0xf4, 0x1a, 0x8c, 0x37, 0xf5, 0x06, 0xc4, 0x5d, 0xa6, 0x86, 0xc0, 0x68, 0x1d, - 0x9b, 0xb8, 0xe8, 0x55, 0x28, 0xb3, 0xa7, 0xf3, 0x66, 0xe0, 0x09, 0x26, 0x4b, 0x5e, 0xc8, 0xe5, - 0xba, 0x28, 0x3f, 0xd2, 0x7e, 0x63, 0x85, 0x8d, 0xae, 0xc0, 0x30, 0xed, 0xc2, 0x6a, 0x5d, 0xdc, - 0x22, 0x4a, 0x55, 0x73, 0x83, 0x95, 0x62, 0x01, 0xb5, 0xff, 0x6a, 0x41, 0x1b, 0x65, 0x2a, 0x91, - 0x12, 0x54, 0x87, 0x91, 0xfb, 0x8e, 0x1b, 0xbb, 0xfe, 0xb6, 0x60, 0x17, 0x9e, 0xe9, 0x79, 0xa5, - 0xb0, 0x4a, 0x6f, 0xf1, 0x0a, 0xfc, 0xd2, 0x13, 0x7f, 0xb0, 0x24, 0x43, 0x29, 0x86, 0x1d, 0xdf, - 0xa7, 0x14, 0x0b, 0x83, 0x52, 0xc4, 0xbc, 0x02, 0xa7, 0x28, 0xfe, 0x60, 0x49, 0x06, 0xbd, 0x0d, - 0x20, 0x97, 0x25, 0x69, 0x89, 0x27, 0xeb, 0xe7, 0xfa, 0x13, 0xdd, 0x50, 0x75, 0x16, 0x27, 0xe8, - 0x95, 0x9a, 0xfc, 0xc7, 0x1a, 0x3d, 0x3b, 0x66, 0x6c, 0x55, 0x77, 0x67, 0xd0, 0xf7, 0xd2, 0x93, - 0xc0, 0x09, 0x63, 0xd2, 0x5a, 0x88, 0xc5, 0xe0, 0x7c, 0x72, 0x30, 0x99, 0x62, 0xc3, 0xdd, 0x25, - 0xfa, 0xa9, 0x21, 0x88, 0xe0, 0x84, 0x9e, 0xfd, 0xab, 0x45, 0x98, 0xc9, 0xeb, 0x2e, 0x5d, 0x74, - 0xe4, 0x81, 0x1b, 0x2f, 0x51, 0x6e, 0xc8, 0x32, 0x17, 0xdd, 0xb2, 0x28, 0xc7, 0x0a, 0x83, 0xce, - 0x7e, 0xe4, 0x6e, 0x4b, 0x91, 0x70, 0x28, 0x99, 0xfd, 0x06, 0x2b, 0xc5, 0x02, 0x4a, 0xf1, 0x42, - 0xe2, 0x44, 0xc2, 0x26, 0x42, 0x5b, 0x25, 0x98, 0x95, 0x62, 0x01, 0xd5, 0xf5, 0x4d, 0xa5, 0x3e, - 0xfa, 0x26, 0x63, 0x88, 0x86, 0x4e, 0x76, 0x88, 0xd0, 0x97, 0x01, 0xb6, 0x5c, 0xdf, 0x8d, 0x76, - 0x18, 0xf5, 0xe1, 0x63, 0x53, 0x57, 0xbc, 0xd4, 0x8a, 0xa2, 0x82, 0x35, 0x8a, 0xe8, 0x65, 0x18, - 0x55, 0x1b, 0x70, 0xb5, 0xc6, 0x1e, 0x88, 0xb4, 0x07, 0xf7, 0xe4, 0x34, 0xaa, 0x61, 0x1d, 0xcf, - 0x7e, 0x27, 0xbd, 0x5e, 0xc4, 0x0e, 0xd0, 0xc6, 0xd7, 0x1a, 0x74, 0x7c, 0x0b, 0xbd, 0xc7, 0xd7, - 0xfe, 0xcd, 0x22, 0x4c, 0x1a, 0x8d, 0x75, 0xa2, 0x01, 0xce, 0xac, 0xeb, 0xf4, 0x9e, 0x73, 0x62, - 0x22, 0xf6, 0x9f, 0xdd, 0x7f, 0xab, 0xe8, 0x77, 0x21, 0xdd, 0x01, 0xbc, 0x3e, 0xfa, 0x32, 0x54, - 0x3c, 0x27, 0x62, 0xba, 0x2b, 0x22, 0xf6, 0xdd, 0x20, 0xc4, 0x12, 0x39, 0xc2, 0x89, 0x62, 0xed, - 0xaa, 0xe1, 0xb4, 0x13, 0x92, 0xf4, 0x42, 0xa6, 0xbc, 0x8f, 0x34, 0xba, 0x51, 0x9d, 0xa0, 0x0c, - 0xd2, 0x3e, 0xe6, 0x30, 0xf4, 0x2a, 0x8c, 0x85, 0x84, 0xad, 0x8a, 0x25, 0xca, 0xca, 0xb1, 0x65, - 0x36, 0x94, 0xf0, 0x7c, 0x58, 0x83, 0x61, 0x03, 0x33, 0x61, 0xe5, 0x87, 0x7b, 0xb0, 0xf2, 0xcf, - 0xc0, 0x08, 0xfb, 0xa1, 0x56, 0x80, 0x9a, 0x8d, 0x55, 0x5e, 0x8c, 0x25, 0x3c, 0xbd, 0x60, 0xca, - 0x03, 0x2e, 0x98, 0x4f, 0xc2, 0x44, 0xcd, 0x21, 0xbb, 0x81, 0xbf, 0xec, 0xb7, 0xda, 0x81, 0xeb, - 0xc7, 0x68, 0x06, 0x4a, 0xec, 0x76, 0xe0, 0x7b, 0xbb, 0x44, 0x29, 0xe0, 0x12, 0x65, 0xcc, 0xed, - 0x6d, 0x38, 0x57, 0x0b, 0xee, 0xfb, 0xf7, 0x9d, 0xb0, 0xb5, 0x50, 0x5f, 0xd5, 0xe4, 0xdc, 0x75, - 0x29, 0x67, 0x71, 0x23, 0x96, 0xcc, 0x33, 0x55, 0xab, 0xc9, 0xef, 0xda, 0x15, 0xd7, 0x23, 0x39, - 0xda, 0x88, 0xbf, 0x5e, 0x30, 0x5a, 0x4a, 0xf0, 0xd5, 0x83, 0x91, 0x95, 0xfb, 0x60, 0xf4, 0x26, - 0x94, 0xb7, 0x5c, 0xe2, 0xb5, 0x30, 0xd9, 0x12, 0x4b, 0xec, 0xe9, 0xfc, 0x77, 0xf9, 0x15, 0x8a, - 0x29, 0xb5, 0x4f, 0x5c, 0x4a, 0x5b, 0x11, 0x95, 0xb1, 0x22, 0x83, 0xee, 0xc1, 0x94, 0x14, 0x03, - 0x24, 0x54, 0x2c, 0xb8, 0x67, 0x7a, 0xc9, 0x16, 0x26, 0xf1, 0xb3, 0x87, 0x07, 0xd5, 0x29, 0x9c, - 0x22, 0x83, 0xbb, 0x08, 0x53, 0xb1, 0x6c, 0x97, 0x1e, 0xad, 0x25, 0x36, 0xfc, 0x4c, 0x2c, 0x63, - 0x12, 0x26, 0x2b, 0xb5, 0x7f, 0xda, 0x82, 0xc7, 0xba, 0x46, 0x46, 0x48, 0xda, 0x27, 0x3c, 0x0b, - 0x69, 0xc9, 0xb7, 0xd0, 0x5f, 0xf2, 0xb5, 0xff, 0xbe, 0x05, 0x67, 0x97, 0x77, 0xdb, 0xf1, 0x7e, - 0xcd, 0x35, 0x5f, 0x77, 0x5e, 0x81, 0xe1, 0x5d, 0xd2, 0x72, 0x3b, 0xbb, 0x62, 0xe6, 0xaa, 0xf2, - 0xf8, 0x59, 0x63, 0xa5, 0x47, 0x07, 0xd5, 0xf1, 0x46, 0x1c, 0x84, 0xce, 0x36, 0xe1, 0x05, 0x58, - 0xa0, 0xb3, 0x43, 0xdc, 0x7d, 0x8f, 0xdc, 0x72, 0x77, 0x5d, 0x69, 0x67, 0xd1, 0x53, 0x77, 0x36, - 0x27, 0x07, 0x74, 0xee, 0xcd, 0x8e, 0xe3, 0xc7, 0x6e, 0xbc, 0x2f, 0x1e, 0x66, 0x24, 0x11, 0x9c, - 0xd0, 0xb3, 0xbf, 0x65, 0xc1, 0xa4, 0x5c, 0xf7, 0x0b, 0xad, 0x56, 0x48, 0xa2, 0x08, 0xcd, 0x42, - 0xc1, 0x6d, 0x8b, 0x5e, 0x82, 0xe8, 0x65, 0x61, 0xb5, 0x8e, 0x0b, 0x6e, 0x1b, 0xd5, 0xa1, 0xc2, - 0xcd, 0x35, 0x92, 0xc5, 0x35, 0x90, 0xd1, 0x07, 0xeb, 0xc1, 0x86, 0xac, 0x89, 0x13, 0x22, 0x92, - 0x83, 0x63, 0x67, 0x66, 0xd1, 0x7c, 0xf5, 0xba, 0x21, 0xca, 0xb1, 0xc2, 0x40, 0x57, 0xa1, 0xec, - 0x07, 0x2d, 0x6e, 0x3d, 0xc3, 0x6f, 0x3f, 0xb6, 0x64, 0xd7, 0x45, 0x19, 0x56, 0x50, 0xfb, 0xc7, - 0x2c, 0x18, 0x93, 0x5f, 0x36, 0x20, 0x33, 0x49, 0xb7, 0x56, 0xc2, 0x48, 0x26, 0x5b, 0x8b, 0x32, - 0x83, 0x0c, 0x62, 0xf0, 0x80, 0xc5, 0xe3, 0xf0, 0x80, 0xf6, 0x4f, 0x15, 0x60, 0x42, 0x76, 0xa7, - 0xd1, 0xd9, 0x8c, 0x48, 0x8c, 0x36, 0xa0, 0xe2, 0xf0, 0x21, 0x27, 0x72, 0xc5, 0x3e, 0x95, 0x2d, - 0x7c, 0x18, 0xf3, 0x93, 0x5c, 0xcb, 0x0b, 0xb2, 0x36, 0x4e, 0x08, 0x21, 0x0f, 0xa6, 0xfd, 0x20, - 0x66, 0x47, 0xb4, 0x82, 0xf7, 0x7a, 0x02, 0x49, 0x53, 0xbf, 0x20, 0xa8, 0x4f, 0xaf, 0xa7, 0xa9, - 0xe0, 0x6e, 0xc2, 0x68, 0x59, 0x2a, 0x3c, 0x8a, 0xf9, 0xe2, 0x86, 0x3e, 0x0b, 0xd9, 0xfa, 0x0e, - 0xfb, 0xd7, 0x2d, 0xa8, 0x48, 0xb4, 0xd3, 0x78, 0xed, 0x5a, 0x83, 0x91, 0x88, 0x4d, 0x82, 0x1c, - 0x1a, 0xbb, 0x57, 0xc7, 0xf9, 0x7c, 0x25, 0x37, 0x0f, 0xff, 0x1f, 0x61, 0x49, 0x83, 0xe9, 0xbb, - 0x55, 0xf7, 0x3f, 0x22, 0xfa, 0x6e, 0xd5, 0x9f, 0x9c, 0x1b, 0xe6, 0xbf, 0xb0, 0x3e, 0x6b, 0x62, - 0x2d, 0x65, 0x90, 0xda, 0x21, 0xd9, 0x72, 0x1f, 0xa4, 0x19, 0xa4, 0x3a, 0x2b, 0xc5, 0x02, 0x8a, - 0xde, 0x86, 0xb1, 0xa6, 0x54, 0x74, 0x26, 0xc7, 0xc0, 0x95, 0x9e, 0x4a, 0x77, 0xf5, 0x3e, 0xc3, - 0x2d, 0x6b, 0x97, 0xb4, 0xfa, 0xd8, 0xa0, 0x66, 0x3e, 0xb7, 0x17, 0xfb, 0x3d, 0xb7, 0x27, 0x74, - 0xf3, 0x1f, 0x9f, 0x7f, 0xc6, 0x82, 0x61, 0xae, 0x2e, 0x1b, 0x4c, 0xbf, 0xa8, 0x3d, 0x57, 0x25, - 0x63, 0x77, 0x97, 0x16, 0x8a, 0xe7, 0x27, 0xb4, 0x06, 0x15, 0xf6, 0x83, 0xa9, 0x0d, 0x8a, 0xf9, - 0x26, 0xc5, 0xbc, 0x55, 0xbd, 0x83, 0x77, 0x65, 0x35, 0x9c, 0x50, 0xb0, 0x7f, 0xa2, 0x48, 0x8f, - 0xaa, 0x04, 0xd5, 0xb8, 0xc1, 0xad, 0x47, 0x77, 0x83, 0x17, 0x1e, 0xd5, 0x0d, 0xbe, 0x0d, 0x93, - 0x4d, 0xed, 0x71, 0x2b, 0x99, 0xc9, 0xab, 0x3d, 0x17, 0x89, 0xf6, 0x0e, 0xc6, 0x55, 0x46, 0x4b, - 0x26, 0x11, 0x9c, 0xa6, 0x8a, 0xbe, 0x17, 0xc6, 0xf8, 0x3c, 0x8b, 0x56, 0xb8, 0xc5, 0xc2, 0x27, - 0xf2, 0xd7, 0x8b, 0xde, 0x04, 0x5b, 0x89, 0x0d, 0xad, 0x3a, 0x36, 0x88, 0xd9, 0xbf, 0x5a, 0x86, - 0xa1, 0xe5, 0x3d, 0xe2, 0xc7, 0xa7, 0x70, 0x20, 0x35, 0x61, 0xc2, 0xf5, 0xf7, 0x02, 0x6f, 0x8f, - 0xb4, 0x38, 0xfc, 0x38, 0x97, 0xeb, 0x79, 0x41, 0x7a, 0x62, 0xd5, 0x20, 0x81, 0x53, 0x24, 0x1f, - 0x85, 0x84, 0x79, 0x1d, 0x86, 0xf9, 0xdc, 0x0b, 0xf1, 0x32, 0x53, 0x19, 0xcc, 0x06, 0x51, 0xec, - 0x82, 0x44, 0xfa, 0xe5, 0xda, 0x67, 0x51, 0x1d, 0xbd, 0x03, 0x13, 0x5b, 0x6e, 0x18, 0xc5, 0x54, - 0x34, 0x8c, 0x62, 0x67, 0xb7, 0xfd, 0x10, 0x12, 0xa5, 0x1a, 0x87, 0x15, 0x83, 0x12, 0x4e, 0x51, - 0x46, 0xdb, 0x30, 0x4e, 0x85, 0x9c, 0xa4, 0xa9, 0x91, 0x63, 0x37, 0xa5, 0x54, 0x46, 0xb7, 0x74, - 0x42, 0xd8, 0xa4, 0x4b, 0x0f, 0x93, 0x26, 0x13, 0x8a, 0xca, 0x8c, 0xa3, 0x50, 0x87, 0x09, 0x97, - 0x86, 0x38, 0x8c, 0x9e, 0x49, 0xcc, 0x6c, 0xa5, 0x62, 0x9e, 0x49, 0x9a, 0x71, 0xca, 0x57, 0xa0, - 0x42, 0xe8, 0x10, 0x52, 0xc2, 0x42, 0x31, 0x3e, 0x3f, 0x58, 0x5f, 0xd7, 0xdc, 0x66, 0x18, 0x98, - 0xb2, 0xfc, 0xb2, 0xa4, 0x84, 0x13, 0xa2, 0x68, 0x09, 0x86, 0x23, 0x12, 0xba, 0x24, 0x12, 0x2a, - 0xf2, 0x1e, 0xd3, 0xc8, 0xd0, 0xb8, 0xed, 0x39, 0xff, 0x8d, 0x45, 0x55, 0xba, 0xbc, 0x1c, 0x26, - 0x0d, 0x31, 0xad, 0xb8, 0xb6, 0xbc, 0x16, 0x58, 0x29, 0x16, 0x50, 0xf4, 0x06, 0x8c, 0x84, 0xc4, - 0x63, 0xca, 0xa2, 0xf1, 0xc1, 0x17, 0x39, 0xd7, 0x3d, 0xf1, 0x7a, 0x58, 0x12, 0x40, 0x37, 0x01, - 0x85, 0x84, 0xf2, 0x10, 0xae, 0xbf, 0xad, 0x8c, 0x39, 0x84, 0xae, 0xfb, 0x71, 0xd1, 0xfe, 0x19, - 0x9c, 0x60, 0x48, 0xab, 0x54, 0x9c, 0x51, 0x0d, 0x5d, 0x87, 0x69, 0x55, 0xba, 0xea, 0x47, 0xb1, - 0xe3, 0x37, 0x09, 0x53, 0x73, 0x57, 0x12, 0xae, 0x08, 0xa7, 0x11, 0x70, 0x77, 0x1d, 0xfb, 0x6b, - 0x94, 0x9d, 0xa1, 0xa3, 0x75, 0x0a, 0xbc, 0xc0, 0xeb, 0x26, 0x2f, 0x70, 0x21, 0x77, 0xe6, 0x72, - 0xf8, 0x80, 0x43, 0x0b, 0x46, 0xb5, 0x99, 0x4d, 0xd6, 0xac, 0xd5, 0x63, 0xcd, 0x76, 0x60, 0x8a, - 0xae, 0xf4, 0xdb, 0x9b, 0xcc, 0x0d, 0xab, 0xc5, 0x16, 0x66, 0xe1, 0xe1, 0x16, 0xa6, 0x7a, 0x65, - 0xbe, 0x95, 0x22, 0x88, 0xbb, 0x9a, 0x40, 0xaf, 0x48, 0xcd, 0x49, 0xd1, 0x30, 0xd2, 0xe2, 0x5a, - 0x91, 0xa3, 0x83, 0xea, 0x94, 0xf6, 0x21, 0xba, 0xa6, 0xc4, 0xfe, 0x8a, 0xfc, 0x46, 0xf5, 0x9a, - 0xdf, 0x54, 0x8b, 0x25, 0xf5, 0x9a, 0xaf, 0x96, 0x03, 0x4e, 0x70, 0xe8, 0x1e, 0xa5, 0x22, 0x48, - 0xfa, 0x35, 0x9f, 0x0a, 0x28, 0x98, 0x41, 0xec, 0x17, 0x01, 0x96, 0x1f, 0x90, 0x26, 0x5f, 0xea, - 0xfa, 0x03, 0xa4, 0x95, 0xff, 0x00, 0x69, 0xff, 0x7b, 0x0b, 0x26, 0x56, 0x96, 0x0c, 0x31, 0x71, - 0x0e, 0x80, 0xcb, 0x46, 0x6f, 0xbd, 0xb5, 0x2e, 0x75, 0xeb, 0x5c, 0x3d, 0xaa, 0x4a, 0xb1, 0x86, - 0x81, 0x2e, 0x40, 0xd1, 0xeb, 0xf8, 0x42, 0x64, 0x19, 0x39, 0x3c, 0xa8, 0x16, 0x6f, 0x75, 0x7c, - 0x4c, 0xcb, 0x34, 0x0b, 0xc1, 0xe2, 0xc0, 0x16, 0x82, 0x7d, 0xdd, 0xab, 0x50, 0x15, 0x86, 0xee, - 0xdf, 0x77, 0x5b, 0xdc, 0x88, 0x5d, 0xe8, 0xfd, 0xdf, 0x7a, 0x6b, 0xb5, 0x16, 0x61, 0x5e, 0x6e, - 0x7f, 0xb5, 0x08, 0xb3, 0x2b, 0x1e, 0x79, 0xf0, 0x01, 0x0d, 0xf9, 0x07, 0xb5, 0x6f, 0x3c, 0x1e, - 0xbf, 0x78, 0x5c, 0x1b, 0xd6, 0xfe, 0xe3, 0xb1, 0x05, 0x23, 0xfc, 0x31, 0x5b, 0x9a, 0xf5, 0xbf, - 0x96, 0xd5, 0x7a, 0xfe, 0x80, 0xcc, 0xf1, 0x47, 0x71, 0x61, 0xce, 0xaf, 0x6e, 0x5a, 0x51, 0x8a, - 0x25, 0xf1, 0xd9, 0xcf, 0xc0, 0x98, 0x8e, 0x79, 0x2c, 0x6b, 0xf2, 0xff, 0xbf, 0x08, 0x53, 0xb4, - 0x07, 0x8f, 0x74, 0x22, 0xee, 0x74, 0x4f, 0xc4, 0x49, 0x5b, 0x14, 0xf7, 0x9f, 0x8d, 0xb7, 0xd3, - 0xb3, 0xf1, 0x42, 0xde, 0x6c, 0x9c, 0xf6, 0x1c, 0xfc, 0xa0, 0x05, 0x67, 0x56, 0xbc, 0xa0, 0x79, - 0x2f, 0x65, 0xf5, 0xfb, 0x32, 0x8c, 0xd2, 0x73, 0x3c, 0x32, 0xbc, 0x88, 0x0c, 0xbf, 0x32, 0x01, - 0xc2, 0x3a, 0x9e, 0x56, 0xed, 0xce, 0x9d, 0xd5, 0x5a, 0x96, 0x3b, 0x9a, 0x00, 0x61, 0x1d, 0xcf, - 0xfe, 0xa6, 0x05, 0x17, 0xaf, 0x2f, 0x2d, 0x27, 0x4b, 0xb1, 0xcb, 0x23, 0x8e, 0x4a, 0x81, 0x2d, - 0xad, 0x2b, 0x89, 0x14, 0x58, 0x63, 0xbd, 0x10, 0xd0, 0x8f, 0x8a, 0xb7, 0xe7, 0xcf, 0x5b, 0x70, - 0xe6, 0xba, 0x1b, 0xd3, 0x6b, 0x39, 0xed, 0x9b, 0x45, 0xef, 0xe5, 0xc8, 0x8d, 0x83, 0x70, 0x3f, - 0xed, 0x9b, 0x85, 0x15, 0x04, 0x6b, 0x58, 0xbc, 0xe5, 0x3d, 0x97, 0x99, 0x51, 0x15, 0x4c, 0x55, - 0x14, 0x16, 0xe5, 0x58, 0x61, 0xd0, 0x0f, 0x6b, 0xb9, 0x21, 0x13, 0x25, 0xf6, 0xc5, 0x09, 0xab, - 0x3e, 0xac, 0x26, 0x01, 0x38, 0xc1, 0xb1, 0x7f, 0xda, 0x82, 0x73, 0xd7, 0xbd, 0x4e, 0x14, 0x93, - 0x70, 0x2b, 0x32, 0x3a, 0xfb, 0x22, 0x54, 0x88, 0x14, 0xd7, 0x45, 0x5f, 0x15, 0x83, 0xa9, 0xe4, - 0x78, 0xee, 0x18, 0xa6, 0xf0, 0x06, 0xf0, 0x1c, 0x38, 0x9e, 0xeb, 0xd8, 0x2f, 0x15, 0x60, 0xfc, - 0xc6, 0xc6, 0x46, 0xfd, 0x3a, 0x89, 0xc5, 0x2d, 0xd6, 0x5f, 0xd5, 0x8c, 0x35, 0x8d, 0x59, 0x2f, - 0xa1, 0xa8, 0x13, 0xbb, 0xde, 0x1c, 0xf7, 0x44, 0x9e, 0x5b, 0xf5, 0xe3, 0xdb, 0x61, 0x23, 0x0e, - 0x5d, 0x7f, 0x3b, 0x53, 0xc7, 0x26, 0xef, 0xda, 0x62, 0xde, 0x5d, 0x8b, 0x5e, 0x84, 0x61, 0xe6, - 0x0a, 0x2d, 0xc5, 0x93, 0xc7, 0x95, 0x4c, 0xc1, 0x4a, 0x8f, 0x0e, 0xaa, 0x95, 0x3b, 0x78, 0x95, - 0xff, 0xc1, 0x02, 0x15, 0xdd, 0x81, 0xd1, 0x9d, 0x38, 0x6e, 0xdf, 0x20, 0x4e, 0x8b, 0x84, 0xf2, - 0x74, 0xb8, 0x94, 0x75, 0x3a, 0xd0, 0x41, 0xe0, 0x68, 0xc9, 0x86, 0x4a, 0xca, 0x22, 0xac, 0xd3, - 0xb1, 0x1b, 0x00, 0x09, 0xec, 0x84, 0xf4, 0x0b, 0xf6, 0x1f, 0x58, 0x30, 0xc2, 0xbd, 0xd2, 0x42, - 0xf4, 0x59, 0x28, 0x91, 0x07, 0xa4, 0x29, 0x38, 0xc7, 0xcc, 0x0e, 0x27, 0x8c, 0x07, 0xd7, 0x96, - 0xd3, 0xff, 0x98, 0xd5, 0x42, 0x37, 0x60, 0x84, 0xf6, 0xf6, 0xba, 0x72, 0xd1, 0x7b, 0x32, 0xef, - 0x8b, 0xd5, 0xb4, 0x73, 0x5e, 0x45, 0x14, 0x61, 0x59, 0x9d, 0x69, 0x7e, 0x9b, 0xed, 0x06, 0x3d, - 0xc0, 0xe2, 0x5e, 0xf7, 0xec, 0xc6, 0x52, 0x9d, 0x23, 0x09, 0x6a, 0x5c, 0xf3, 0x2b, 0x0b, 0x71, - 0x42, 0xc4, 0xde, 0x80, 0x0a, 0x9d, 0xd4, 0x05, 0xcf, 0x75, 0x7a, 0x2b, 0x9d, 0x9f, 0x85, 0x8a, - 0x54, 0x00, 0x47, 0xc2, 0xb1, 0x89, 0x51, 0x95, 0xfa, 0xe1, 0x08, 0x27, 0x70, 0x7b, 0x0b, 0xce, - 0xb2, 0x97, 0x7f, 0x27, 0xde, 0x31, 0xf6, 0x58, 0xff, 0xc5, 0xfc, 0x9c, 0x10, 0xc4, 0xf8, 0xcc, - 0xcc, 0x68, 0xbe, 0x03, 0x63, 0x92, 0x62, 0x22, 0x94, 0xd9, 0x7f, 0x54, 0x82, 0xc7, 0x57, 0x1b, - 0xf9, 0x0e, 0x8b, 0xaf, 0xc2, 0x18, 0x67, 0xd3, 0xe8, 0xd2, 0x76, 0x3c, 0xd1, 0xae, 0x7a, 0x17, - 0xdb, 0xd0, 0x60, 0xd8, 0xc0, 0x44, 0x17, 0xa1, 0xe8, 0xbe, 0xeb, 0xa7, 0xcd, 0x70, 0x57, 0xdf, - 0x5c, 0xc7, 0xb4, 0x9c, 0x82, 0x29, 0xc7, 0xc7, 0x8f, 0x52, 0x05, 0x56, 0x5c, 0xdf, 0xeb, 0x30, - 0xe1, 0x46, 0xcd, 0xc8, 0x5d, 0xf5, 0xe9, 0x39, 0x93, 0x38, 0xbb, 0x26, 0x4a, 0x02, 0xda, 0x69, - 0x05, 0xc5, 0x29, 0x6c, 0xed, 0x5c, 0x1f, 0x1a, 0x98, 0x6b, 0xec, 0xeb, 0xe9, 0x43, 0x19, 0xe2, - 0x36, 0xfb, 0xba, 0x88, 0x19, 0xb5, 0x09, 0x86, 0x98, 0x7f, 0x70, 0x84, 0x25, 0x8c, 0x4a, 0x60, - 0xcd, 0x1d, 0xa7, 0xbd, 0xd0, 0x89, 0x77, 0x6a, 0x6e, 0xd4, 0x0c, 0xf6, 0x48, 0xb8, 0xcf, 0x84, - 0xe7, 0x72, 0x22, 0x81, 0x29, 0xc0, 0xd2, 0x8d, 0x85, 0x3a, 0xc5, 0xc4, 0xdd, 0x75, 0x4c, 0xae, - 0x10, 0x4e, 0x82, 0x2b, 0x5c, 0x80, 0x49, 0xd9, 0x4c, 0x83, 0x44, 0xec, 0x8e, 0x18, 0x65, 0x1d, - 0x53, 0xa6, 0xb6, 0xa2, 0x58, 0x75, 0x2b, 0x8d, 0x8f, 0x5e, 0x81, 0x71, 0xd7, 0x77, 0x63, 0xd7, - 0x89, 0x83, 0x90, 0xdd, 0xb0, 0x5c, 0x4e, 0x66, 0x96, 0x6c, 0xab, 0x3a, 0x00, 0x9b, 0x78, 0xf6, - 0x1f, 0x96, 0x60, 0x9a, 0x4d, 0xdb, 0x77, 0x56, 0xd8, 0x47, 0x66, 0x85, 0xdd, 0xe9, 0x5e, 0x61, - 0x27, 0xc1, 0xee, 0x7e, 0x98, 0xcb, 0xec, 0x1d, 0xa8, 0x28, 0x5b, 0x60, 0xe9, 0x0c, 0x60, 0xe5, - 0x38, 0x03, 0xf4, 0xe7, 0x3e, 0xe4, 0x33, 0x6e, 0x31, 0xf3, 0x19, 0xf7, 0x6f, 0x5a, 0x90, 0x98, - 0x44, 0xa2, 0x1b, 0x50, 0x69, 0x07, 0xcc, 0xec, 0x20, 0x94, 0xb6, 0x3c, 0x8f, 0x67, 0x5e, 0x54, - 0xfc, 0x52, 0xe4, 0xe3, 0x57, 0x97, 0x35, 0x70, 0x52, 0x19, 0x2d, 0xc2, 0x48, 0x3b, 0x24, 0x8d, - 0x98, 0xb9, 0xc0, 0xf6, 0xa5, 0xc3, 0xd7, 0x08, 0xc7, 0xc7, 0xb2, 0xa2, 0xfd, 0xcb, 0x16, 0x00, - 0x7f, 0x29, 0x75, 0xfc, 0x6d, 0x72, 0x0a, 0xda, 0xdf, 0x1a, 0x94, 0xa2, 0x36, 0x69, 0xf6, 0x32, - 0x08, 0x49, 0xfa, 0xd3, 0x68, 0x93, 0x66, 0x32, 0xe0, 0xf4, 0x1f, 0x66, 0xb5, 0xed, 0xbf, 0x08, - 0x30, 0x91, 0xa0, 0xad, 0xc6, 0x64, 0x17, 0x3d, 0x6f, 0xb8, 0xc4, 0x5d, 0x48, 0xb9, 0xc4, 0x55, - 0x18, 0xb6, 0xa6, 0x68, 0x7c, 0x07, 0x8a, 0xbb, 0xce, 0x03, 0xa1, 0x49, 0x7a, 0xb6, 0x77, 0x37, - 0x28, 0xfd, 0xb9, 0x35, 0xe7, 0x01, 0x97, 0x99, 0x9e, 0x95, 0x0b, 0x64, 0xcd, 0x79, 0x70, 0xc4, - 0xcd, 0x3e, 0xd8, 0x21, 0x75, 0xcb, 0x8d, 0xe2, 0xf7, 0xff, 0x63, 0xf2, 0x9f, 0x2d, 0x3b, 0xda, - 0x08, 0x6b, 0xcb, 0xf5, 0xc5, 0xbb, 0xe1, 0x40, 0x6d, 0xb9, 0x7e, 0xba, 0x2d, 0xd7, 0x1f, 0xa0, - 0x2d, 0xd7, 0x47, 0xef, 0xc1, 0x88, 0x78, 0xa3, 0x67, 0xb6, 0xde, 0xa6, 0x96, 0x2a, 0xaf, 0x3d, - 0xf1, 0xc4, 0xcf, 0xdb, 0x9c, 0x97, 0x32, 0xa1, 0x28, 0xed, 0xdb, 0xae, 0x6c, 0x10, 0xfd, 0x35, - 0x0b, 0x26, 0xc4, 0x6f, 0x4c, 0xde, 0xed, 0x90, 0x28, 0x16, 0xbc, 0xe7, 0xa7, 0x07, 0xef, 0x83, - 0xa8, 0xc8, 0xbb, 0xf2, 0x69, 0x79, 0xcc, 0x9a, 0xc0, 0xbe, 0x3d, 0x4a, 0xf5, 0x02, 0xfd, 0x43, - 0x0b, 0xce, 0xee, 0x3a, 0x0f, 0x78, 0x8b, 0xbc, 0x0c, 0x3b, 0xb1, 0x1b, 0x08, 0xdb, 0xf5, 0xcf, - 0x0e, 0x36, 0xfd, 0x5d, 0xd5, 0x79, 0x27, 0xa5, 0x99, 0xeb, 0xd9, 0x2c, 0x94, 0xbe, 0x5d, 0xcd, - 0xec, 0xd7, 0xec, 0x16, 0x94, 0xe5, 0x7a, 0xcb, 0x90, 0xbc, 0x6b, 0x3a, 0x63, 0x7d, 0x6c, 0x13, - 0x09, 0xdd, 0x2f, 0x8d, 0xb6, 0x23, 0xd6, 0xda, 0x23, 0x6d, 0xe7, 0x1d, 0x18, 0xd3, 0xd7, 0xd8, - 0x23, 0x6d, 0xeb, 0x5d, 0x38, 0x93, 0xb1, 0x96, 0x1e, 0x69, 0x93, 0xf7, 0xe1, 0x42, 0xee, 0xfa, - 0x78, 0x94, 0x0d, 0xdb, 0xbf, 0x64, 0xe9, 0xe7, 0xe0, 0x29, 0xa8, 0xe0, 0x97, 0x4c, 0x15, 0xfc, - 0xa5, 0xde, 0x3b, 0x27, 0x47, 0x0f, 0xff, 0xb6, 0xde, 0x69, 0x7a, 0xaa, 0xa3, 0x37, 0x60, 0xd8, - 0xa3, 0x25, 0xd2, 0x38, 0xc4, 0xee, 0xbf, 0x23, 0x13, 0x5e, 0x8a, 0x95, 0x47, 0x58, 0x50, 0xb0, - 0x7f, 0xcd, 0x82, 0xd2, 0x29, 0x8c, 0x04, 0x36, 0x47, 0xe2, 0xf9, 0x5c, 0xd2, 0x22, 0xa4, 0xd9, - 0x1c, 0x76, 0xee, 0x2f, 0xcb, 0xb0, 0x6d, 0x39, 0x03, 0xf3, 0x7d, 0x70, 0xe6, 0x56, 0xe0, 0xb4, - 0x16, 0x1d, 0xcf, 0xf1, 0x9b, 0x24, 0x5c, 0xf5, 0xb7, 0xfb, 0x5a, 0x29, 0xe9, 0x36, 0x45, 0x85, - 0x7e, 0x36, 0x45, 0xf6, 0x0e, 0x20, 0xbd, 0x01, 0x61, 0xc7, 0x89, 0x61, 0xc4, 0xe5, 0x4d, 0x89, - 0xe1, 0x7f, 0x3a, 0x9b, 0xbb, 0xeb, 0xea, 0x99, 0x66, 0xa1, 0xc8, 0x0b, 0xb0, 0x24, 0x64, 0xbf, - 0x0a, 0x99, 0xbe, 0x5b, 0xfd, 0xd5, 0x06, 0xf6, 0xcb, 0x30, 0xcd, 0x6a, 0x1e, 0x4f, 0xa4, 0xb5, - 0x7f, 0xd8, 0x82, 0xc9, 0xf5, 0x54, 0x6c, 0x8a, 0x2b, 0xec, 0xad, 0x2f, 0x43, 0xef, 0xdb, 0x60, - 0xa5, 0x58, 0x40, 0x4f, 0x5c, 0xbf, 0xf4, 0x67, 0x16, 0x24, 0xae, 0x92, 0xa7, 0xc0, 0x54, 0x2d, - 0x19, 0x4c, 0x55, 0xa6, 0xde, 0x43, 0x75, 0x27, 0x8f, 0xa7, 0x42, 0x37, 0x55, 0x5c, 0x80, 0x1e, - 0x2a, 0x8f, 0x84, 0x0c, 0xf7, 0x22, 0x9f, 0x30, 0x83, 0x07, 0xc8, 0x48, 0x01, 0xcc, 0x4c, 0x48, - 0xe1, 0x7e, 0x44, 0xcc, 0x84, 0x54, 0x7f, 0x72, 0x76, 0x5f, 0x5d, 0xeb, 0x32, 0x3b, 0x95, 0xbe, - 0x9b, 0x99, 0x7d, 0x3b, 0x9e, 0xfb, 0x1e, 0x51, 0xc1, 0x4d, 0xaa, 0xc2, 0x8c, 0x5b, 0x94, 0x1e, - 0x1d, 0x54, 0xc7, 0xd5, 0x3f, 0x1e, 0x01, 0x2b, 0xa9, 0x62, 0xdf, 0x80, 0xc9, 0xd4, 0x80, 0xa1, - 0x97, 0x61, 0xa8, 0xbd, 0xe3, 0x44, 0x24, 0x65, 0x1a, 0x39, 0x54, 0xa7, 0x85, 0x47, 0x07, 0xd5, - 0x09, 0x55, 0x81, 0x95, 0x60, 0x8e, 0x6d, 0xff, 0x0f, 0x0b, 0x4a, 0xeb, 0x41, 0xeb, 0x34, 0x16, - 0xd3, 0xeb, 0xc6, 0x62, 0x7a, 0x22, 0x2f, 0x7e, 0x60, 0xee, 0x3a, 0x5a, 0x49, 0xad, 0xa3, 0x4b, - 0xb9, 0x14, 0x7a, 0x2f, 0xa1, 0x5d, 0x18, 0x65, 0x51, 0x09, 0x85, 0xa9, 0xe6, 0x8b, 0x06, 0x7f, - 0x5f, 0x4d, 0xf1, 0xf7, 0x93, 0x1a, 0xaa, 0xc6, 0xe5, 0x3f, 0x03, 0x23, 0xc2, 0x5c, 0x30, 0x6d, - 0xe0, 0x2e, 0x70, 0xb1, 0x84, 0xdb, 0x3f, 0x53, 0x04, 0x23, 0x0a, 0x22, 0xfa, 0x75, 0x0b, 0xe6, - 0x42, 0xee, 0x31, 0xd8, 0xaa, 0x75, 0x42, 0xd7, 0xdf, 0x6e, 0x34, 0x77, 0x48, 0xab, 0xe3, 0xb9, - 0xfe, 0xf6, 0xea, 0xb6, 0x1f, 0xa8, 0xe2, 0xe5, 0x07, 0xa4, 0xd9, 0x61, 0x3a, 0xff, 0x3e, 0x21, - 0x17, 0x95, 0x39, 0xce, 0xb5, 0xc3, 0x83, 0xea, 0x1c, 0x3e, 0x16, 0x6d, 0x7c, 0xcc, 0xbe, 0xa0, - 0x6f, 0x5a, 0x30, 0xcf, 0x83, 0x03, 0x0e, 0xde, 0xff, 0x1e, 0xd2, 0x50, 0x5d, 0x92, 0x4a, 0x88, - 0x6c, 0x90, 0x70, 0x77, 0xf1, 0x15, 0x31, 0xa0, 0xf3, 0xf5, 0xe3, 0xb5, 0x85, 0x8f, 0xdb, 0x39, - 0xfb, 0x5f, 0x16, 0x61, 0x5c, 0x38, 0xab, 0x8b, 0x28, 0x28, 0x2f, 0x1b, 0x4b, 0xe2, 0xc9, 0xd4, - 0x92, 0x98, 0x36, 0x90, 0x4f, 0x26, 0x00, 0x4a, 0x04, 0xd3, 0x9e, 0x13, 0xc5, 0x37, 0x88, 0x13, - 0xc6, 0x9b, 0xc4, 0xe1, 0x66, 0x2a, 0xc5, 0x63, 0x9b, 0xd4, 0x28, 0xf5, 0xcb, 0xad, 0x34, 0x31, - 0xdc, 0x4d, 0x1f, 0xed, 0x01, 0x62, 0xb6, 0x36, 0xa1, 0xe3, 0x47, 0xfc, 0x5b, 0x5c, 0xf1, 0x1e, - 0x70, 0xbc, 0x56, 0x67, 0x45, 0xab, 0xe8, 0x56, 0x17, 0x35, 0x9c, 0xd1, 0x82, 0x66, 0x43, 0x35, - 0x34, 0xa8, 0x0d, 0xd5, 0x70, 0x1f, 0x2f, 0x12, 0x1f, 0xa6, 0xba, 0xe2, 0x0d, 0x7c, 0x11, 0x2a, - 0xca, 0xd6, 0x4d, 0x1c, 0x3a, 0xbd, 0xc3, 0x76, 0xa4, 0x29, 0x70, 0x15, 0x49, 0x62, 0x67, 0x99, - 0x90, 0xb3, 0xff, 0x51, 0xc1, 0x68, 0x90, 0x4f, 0xe2, 0x3a, 0x94, 0x9d, 0x28, 0x72, 0xb7, 0x7d, - 0xd2, 0x12, 0x3b, 0xf6, 0xe3, 0x79, 0x3b, 0xd6, 0x68, 0x86, 0xd9, 0x1b, 0x2e, 0x88, 0x9a, 0x58, - 0xd1, 0x40, 0x37, 0xb8, 0x31, 0xd0, 0x9e, 0xe4, 0xe7, 0x07, 0xa3, 0x06, 0xd2, 0x5c, 0x68, 0x8f, - 0x60, 0x51, 0x1f, 0x7d, 0x89, 0x5b, 0x6b, 0xdd, 0xf4, 0x83, 0xfb, 0xfe, 0xf5, 0x20, 0x90, 0x1e, - 0x66, 0x83, 0x11, 0x9c, 0x96, 0x36, 0x5a, 0xaa, 0x3a, 0x36, 0xa9, 0x0d, 0x16, 0x93, 0xe7, 0xfb, - 0xe1, 0x0c, 0x25, 0x6d, 0xfa, 0x89, 0x44, 0x88, 0xc0, 0xa4, 0x88, 0x84, 0x20, 0xcb, 0xc4, 0xd8, - 0x65, 0xb2, 0xea, 0x66, 0xed, 0x44, 0xa1, 0x77, 0xd3, 0x24, 0x81, 0xd3, 0x34, 0xed, 0x9f, 0xb3, - 0x80, 0x59, 0xb8, 0x9f, 0x02, 0xcb, 0xf0, 0x39, 0x93, 0x65, 0x98, 0xc9, 0x1b, 0xe4, 0x1c, 0x6e, - 0xe1, 0x25, 0xbe, 0xb2, 0xea, 0x61, 0xf0, 0x60, 0x5f, 0xbc, 0x94, 0x0f, 0xc0, 0xa5, 0xfe, 0x1f, - 0x8b, 0x1f, 0x62, 0xca, 0xe9, 0x1c, 0xfd, 0x00, 0x94, 0x9b, 0x4e, 0xdb, 0x69, 0xf2, 0x90, 0xbd, - 0xb9, 0x1a, 0x1b, 0xa3, 0xd2, 0xdc, 0x92, 0xa8, 0xc1, 0x35, 0x10, 0x32, 0xa2, 0x46, 0x59, 0x16, - 0xf7, 0xd5, 0x3a, 0xa8, 0x26, 0x67, 0xef, 0xc1, 0xb8, 0x41, 0xec, 0x91, 0x8a, 0xab, 0x3f, 0xc0, - 0xaf, 0x58, 0x15, 0x01, 0x66, 0x17, 0xa6, 0x7d, 0xed, 0x3f, 0xbd, 0x50, 0xa4, 0x08, 0xf2, 0xf1, - 0x7e, 0x97, 0x28, 0xbb, 0x7d, 0x34, 0x0b, 0xfe, 0x14, 0x19, 0xdc, 0x4d, 0xd9, 0xfe, 0xdb, 0x16, - 0x3c, 0xa6, 0x23, 0x6a, 0xf1, 0x00, 0xfa, 0xe9, 0x80, 0x6b, 0x50, 0x0e, 0xda, 0x24, 0x74, 0xe2, - 0x20, 0x14, 0xb7, 0xc6, 0x55, 0x39, 0xe8, 0xb7, 0x45, 0xf9, 0x91, 0x88, 0x9d, 0x28, 0xa9, 0xcb, - 0x72, 0xac, 0x6a, 0x22, 0x1b, 0x86, 0xd9, 0x60, 0x44, 0x22, 0x56, 0x03, 0x3b, 0x03, 0xd8, 0x73, - 0x68, 0x84, 0x05, 0xc4, 0xfe, 0x23, 0x8b, 0x2f, 0x2c, 0xbd, 0xeb, 0xe8, 0x5d, 0x98, 0xda, 0x75, - 0xe2, 0xe6, 0xce, 0xf2, 0x83, 0x76, 0xc8, 0x55, 0xdf, 0x72, 0x9c, 0x9e, 0xed, 0x37, 0x4e, 0xda, - 0x47, 0x26, 0x06, 0x68, 0x6b, 0x29, 0x62, 0xb8, 0x8b, 0x3c, 0xda, 0x84, 0x51, 0x56, 0xc6, 0x2c, - 0x9d, 0xa3, 0x5e, 0xac, 0x41, 0x5e, 0x6b, 0xea, 0x45, 0x79, 0x2d, 0xa1, 0x83, 0x75, 0xa2, 0xf6, - 0xfb, 0x45, 0xbe, 0xdb, 0x19, 0xb7, 0xfd, 0x0c, 0x8c, 0xb4, 0x83, 0xd6, 0xd2, 0x6a, 0x0d, 0x8b, - 0x59, 0x50, 0xd7, 0x48, 0x9d, 0x17, 0x63, 0x09, 0x47, 0xaf, 0x01, 0x90, 0x07, 0x31, 0x09, 0x7d, - 0xc7, 0x53, 0x06, 0x21, 0xca, 0x04, 0xb2, 0x16, 0xac, 0x07, 0xf1, 0x9d, 0x88, 0x7c, 0xdf, 0xb2, - 0x42, 0xc1, 0x1a, 0x3a, 0xba, 0x06, 0xd0, 0x0e, 0x83, 0x3d, 0xb7, 0xc5, 0x5c, 0xe7, 0x8a, 0xa6, - 0xb9, 0x44, 0x5d, 0x41, 0xb0, 0x86, 0x85, 0x5e, 0x83, 0xf1, 0x8e, 0x1f, 0x71, 0x0e, 0xc5, 0xd9, - 0x14, 0x91, 0x07, 0xcb, 0x89, 0xe5, 0xc2, 0x1d, 0x1d, 0x88, 0x4d, 0x5c, 0xb4, 0x00, 0xc3, 0xb1, - 0xc3, 0xec, 0x1d, 0x86, 0xf2, 0xed, 0x16, 0x37, 0x28, 0x86, 0x1e, 0x30, 0x96, 0x56, 0xc0, 0xa2, - 0x22, 0xfa, 0xa2, 0xf4, 0x43, 0xe0, 0x67, 0xbd, 0x30, 0x18, 0x1e, 0xec, 0x5e, 0xd0, 0xbc, 0x10, - 0x84, 0x21, 0xb2, 0x41, 0xcb, 0xfe, 0x66, 0x05, 0x20, 0x61, 0xc7, 0xd1, 0x7b, 0x5d, 0xe7, 0xd1, - 0x73, 0xbd, 0x19, 0xf8, 0x93, 0x3b, 0x8c, 0xd0, 0x0f, 0x59, 0x30, 0xea, 0x78, 0x5e, 0xd0, 0x74, - 0x62, 0x36, 0xca, 0x85, 0xde, 0xe7, 0xa1, 0x68, 0x7f, 0x21, 0xa9, 0xc1, 0xbb, 0xf0, 0xa2, 0x5c, - 0x78, 0x1a, 0xa4, 0x6f, 0x2f, 0xf4, 0x86, 0xd1, 0xa7, 0xa4, 0x94, 0xc6, 0x97, 0xc7, 0x6c, 0x5a, - 0x4a, 0xab, 0xb0, 0xa3, 0x5f, 0x13, 0xd0, 0xd0, 0x1d, 0x23, 0xa8, 0x5c, 0x29, 0x3f, 0xbe, 0x82, - 0xc1, 0x95, 0xf6, 0x8b, 0x27, 0x87, 0xea, 0xba, 0xe3, 0xd4, 0x50, 0x7e, 0x10, 0x12, 0x4d, 0xfc, - 0xe9, 0xe3, 0x34, 0xf5, 0x0e, 0x4c, 0xb6, 0xcc, 0xbb, 0x5d, 0xac, 0xa6, 0xa7, 0xf3, 0xe8, 0xa6, - 0x58, 0x81, 0xe4, 0x36, 0x4f, 0x01, 0x70, 0x9a, 0x30, 0xaa, 0x73, 0x17, 0xb6, 0x55, 0x7f, 0x2b, - 0x10, 0x86, 0xe7, 0x76, 0xee, 0x5c, 0xee, 0x47, 0x31, 0xd9, 0xa5, 0x98, 0xc9, 0xa5, 0xbd, 0x2e, - 0xea, 0x62, 0x45, 0x05, 0xbd, 0x01, 0xc3, 0xcc, 0x07, 0x36, 0x9a, 0x29, 0xe7, 0x2b, 0x0a, 0xcd, - 0xf0, 0x0d, 0xc9, 0xa6, 0x62, 0x7f, 0x23, 0x2c, 0x28, 0xa0, 0x1b, 0x32, 0xc6, 0x4b, 0xb4, 0xea, - 0xdf, 0x89, 0x08, 0x8b, 0xf1, 0x52, 0x59, 0xfc, 0x78, 0x12, 0xbe, 0x85, 0x97, 0x67, 0x86, 0x86, - 0x37, 0x6a, 0x52, 0xe6, 0x48, 0xfc, 0x97, 0x11, 0xe7, 0x67, 0x20, 0xbf, 0x7b, 0x66, 0x54, 0xfa, - 0x64, 0x38, 0xef, 0x9a, 0x24, 0x70, 0x9a, 0x26, 0x65, 0x34, 0xf9, 0xce, 0x15, 0xa6, 0xeb, 0xfd, - 0xf6, 0x3f, 0x97, 0xaf, 0xd9, 0x25, 0xc3, 0x4b, 0xb0, 0xa8, 0x7f, 0xaa, 0xb7, 0xfe, 0xac, 0x0f, - 0x53, 0xe9, 0x2d, 0xfa, 0x48, 0xb9, 0x8c, 0x3f, 0x28, 0xc1, 0x84, 0xb9, 0xa4, 0xd0, 0x3c, 0x54, - 0x04, 0x11, 0x15, 0x70, 0x54, 0xed, 0x92, 0x35, 0x09, 0xc0, 0x09, 0x0e, 0x8b, 0x33, 0xcb, 0xaa, - 0x6b, 0x26, 0x87, 0x49, 0x9c, 0x59, 0x05, 0xc1, 0x1a, 0x16, 0x95, 0x97, 0x36, 0x83, 0x20, 0x56, - 0x97, 0x8a, 0x5a, 0x77, 0x8b, 0xac, 0x14, 0x0b, 0x28, 0xbd, 0x4c, 0xee, 0x91, 0xd0, 0x27, 0x9e, - 0x19, 0xc7, 0x4c, 0x5d, 0x26, 0x37, 0x75, 0x20, 0x36, 0x71, 0xe9, 0x2d, 0x19, 0x44, 0x6c, 0x21, - 0x0b, 0xa9, 0x2c, 0x31, 0xe1, 0x6c, 0x70, 0x6f, 0x72, 0x09, 0x47, 0x5f, 0x80, 0xc7, 0x94, 0xf3, - 0x37, 0xe6, 0x4a, 0x68, 0xd9, 0xe2, 0xb0, 0xa1, 0x44, 0x79, 0x6c, 0x29, 0x1b, 0x0d, 0xe7, 0xd5, - 0x47, 0xaf, 0xc3, 0x84, 0xe0, 0xdc, 0x25, 0xc5, 0x11, 0xd3, 0x2e, 0xe2, 0xa6, 0x01, 0xc5, 0x29, - 0x6c, 0x19, 0x89, 0x8d, 0x31, 0xcf, 0x92, 0x42, 0xb9, 0x3b, 0x12, 0x9b, 0x0e, 0xc7, 0x5d, 0x35, - 0xd0, 0x02, 0x4c, 0x72, 0xd6, 0xca, 0xf5, 0xb7, 0xf9, 0x9c, 0x08, 0xcf, 0x12, 0xb5, 0xa5, 0x6e, - 0x9b, 0x60, 0x9c, 0xc6, 0x47, 0xaf, 0xc2, 0x98, 0x13, 0x36, 0x77, 0xdc, 0x98, 0x34, 0xe3, 0x4e, - 0xc8, 0x5d, 0x4e, 0x34, 0xc3, 0x92, 0x05, 0x0d, 0x86, 0x0d, 0x4c, 0xfb, 0x3d, 0x38, 0x93, 0xe1, - 0x94, 0x46, 0x17, 0x8e, 0xd3, 0x76, 0xe5, 0x37, 0xa5, 0x8c, 0x31, 0x17, 0xea, 0xab, 0xf2, 0x6b, - 0x34, 0x2c, 0xba, 0x3a, 0x99, 0xf3, 0x9a, 0x96, 0x60, 0x42, 0xad, 0xce, 0x15, 0x09, 0xc0, 0x09, - 0x8e, 0xfd, 0x3f, 0x0b, 0x30, 0x99, 0xa1, 0x58, 0x67, 0x49, 0x0e, 0x52, 0xb2, 0x47, 0x92, 0xd3, - 0xc0, 0x0c, 0xec, 0x57, 0x38, 0x46, 0x60, 0xbf, 0x62, 0xbf, 0xc0, 0x7e, 0xa5, 0x0f, 0x12, 0xd8, - 0xcf, 0x1c, 0xb1, 0xa1, 0x81, 0x46, 0x2c, 0x23, 0x18, 0xe0, 0xf0, 0x31, 0x83, 0x01, 0x1a, 0x83, - 0x3e, 0x32, 0xc0, 0xa0, 0xff, 0x44, 0x01, 0xa6, 0xd2, 0x06, 0x70, 0xa7, 0xa0, 0x8e, 0x7d, 0xc3, - 0x50, 0xc7, 0x66, 0xa7, 0x0c, 0x49, 0x9b, 0xe5, 0xe5, 0xa9, 0x66, 0x71, 0x4a, 0x35, 0xfb, 0xc9, - 0x81, 0xa8, 0xf5, 0x56, 0xd3, 0xfe, 0x9d, 0x02, 0x9c, 0x4b, 0x57, 0x59, 0xf2, 0x1c, 0x77, 0xf7, - 0x14, 0xc6, 0xe6, 0xb6, 0x31, 0x36, 0xcf, 0x0f, 0xf2, 0x35, 0xac, 0x6b, 0xb9, 0x03, 0xf4, 0x56, - 0x6a, 0x80, 0xe6, 0x07, 0x27, 0xd9, 0x7b, 0x94, 0xbe, 0x55, 0x84, 0x4b, 0x99, 0xf5, 0x12, 0x6d, - 0xe6, 0x8a, 0xa1, 0xcd, 0xbc, 0x96, 0xd2, 0x66, 0xda, 0xbd, 0x6b, 0x9f, 0x8c, 0x7a, 0x53, 0x78, - 0x0b, 0xb2, 0xe0, 0x6f, 0x0f, 0xa9, 0xda, 0x34, 0xbc, 0x05, 0x15, 0x21, 0x6c, 0xd2, 0xfd, 0x76, - 0x52, 0x69, 0xfe, 0x1b, 0x0b, 0x2e, 0x64, 0xce, 0xcd, 0x29, 0xa8, 0xb0, 0xd6, 0x4d, 0x15, 0xd6, - 0x33, 0x03, 0xaf, 0xd6, 0x1c, 0x9d, 0xd6, 0x1f, 0x16, 0x73, 0xbe, 0x85, 0x09, 0xe8, 0xb7, 0x61, - 0xd4, 0x69, 0x36, 0x49, 0x14, 0xad, 0x05, 0x2d, 0x15, 0x0c, 0xed, 0x79, 0x26, 0x67, 0x25, 0xc5, - 0x47, 0x07, 0xd5, 0xd9, 0x34, 0x89, 0x04, 0x8c, 0x75, 0x0a, 0x66, 0xfc, 0xc6, 0xc2, 0x89, 0xc6, - 0x6f, 0xbc, 0x06, 0xb0, 0xa7, 0xb8, 0xf5, 0xb4, 0x90, 0xaf, 0xf1, 0xf1, 0x1a, 0x16, 0xfa, 0x12, - 0x94, 0x23, 0x71, 0x8d, 0x8b, 0xa5, 0xf8, 0xe2, 0x80, 0x73, 0xe5, 0x6c, 0x12, 0xcf, 0x74, 0x4b, - 0x57, 0xfa, 0x10, 0x45, 0x12, 0x7d, 0x0f, 0x4c, 0x45, 0x3c, 0xea, 0xc9, 0x92, 0xe7, 0x44, 0xcc, - 0xc7, 0x41, 0xac, 0x42, 0xe6, 0x6b, 0xde, 0x48, 0xc1, 0x70, 0x17, 0x36, 0x5a, 0x91, 0x1f, 0xc5, - 0x42, 0xb4, 0xf0, 0x85, 0x79, 0x25, 0xf9, 0x20, 0x91, 0x62, 0xe9, 0x6c, 0x7a, 0xf8, 0xd9, 0xc0, - 0x6b, 0x35, 0xed, 0x9f, 0x28, 0xc1, 0xe3, 0x3d, 0x0e, 0x31, 0xb4, 0x60, 0xbe, 0x51, 0x3e, 0x9b, - 0x96, 0x7e, 0x67, 0x33, 0x2b, 0x1b, 0xe2, 0x70, 0x6a, 0xad, 0x14, 0x3e, 0xf0, 0x5a, 0xf9, 0x51, - 0x4b, 0xd3, 0x4b, 0x70, 0x4b, 0xba, 0xcf, 0x1d, 0xf3, 0x70, 0x3e, 0x41, 0x45, 0xc5, 0x56, 0x86, - 0xb4, 0x7f, 0x6d, 0xe0, 0xee, 0x0c, 0x2c, 0xfe, 0x9f, 0xae, 0x76, 0xf6, 0x7d, 0x0b, 0x9e, 0xcc, - 0xec, 0xaf, 0x61, 0x53, 0x31, 0x0f, 0x95, 0x26, 0x2d, 0xd4, 0xfc, 0xa6, 0x12, 0x87, 0x52, 0x09, - 0xc0, 0x09, 0x8e, 0x61, 0x3a, 0x51, 0xe8, 0x6b, 0x3a, 0xf1, 0x2f, 0x2c, 0xe8, 0x5a, 0xc0, 0xa7, - 0x70, 0x92, 0xae, 0x9a, 0x27, 0xe9, 0xc7, 0x07, 0x99, 0xcb, 0x9c, 0x43, 0xf4, 0x3f, 0x4d, 0xc2, - 0xf9, 0x1c, 0x47, 0x89, 0x3d, 0x98, 0xde, 0x6e, 0x12, 0xd3, 0x23, 0x4d, 0x7c, 0x4c, 0xa6, 0xf3, - 0x5e, 0x4f, 0xf7, 0x35, 0x96, 0x1b, 0x67, 0xba, 0x0b, 0x05, 0x77, 0x37, 0x81, 0xde, 0xb7, 0xe0, - 0xac, 0x73, 0x3f, 0xea, 0xca, 0x80, 0x28, 0xd6, 0xcc, 0x4b, 0x99, 0x5a, 0x8a, 0x3e, 0x19, 0x13, - 0x79, 0xb2, 0xa0, 0x2c, 0x2c, 0x9c, 0xd9, 0x16, 0xc2, 0x22, 0x7e, 0x25, 0xe5, 0xb7, 0x7b, 0xf8, - 0x4c, 0x66, 0x79, 0xb4, 0xf0, 0x33, 0x55, 0x42, 0xb0, 0xa2, 0x83, 0xee, 0x42, 0x65, 0x5b, 0xba, - 0x99, 0x89, 0x33, 0x3b, 0xf3, 0x12, 0xcc, 0xf4, 0x45, 0xe3, 0xef, 0x86, 0x0a, 0x84, 0x13, 0x52, - 0xe8, 0x75, 0x28, 0xfa, 0x5b, 0x51, 0xaf, 0x2c, 0x3b, 0x29, 0x53, 0x23, 0xee, 0x8f, 0xbc, 0xbe, - 0xd2, 0xc0, 0xb4, 0x22, 0xba, 0x01, 0xc5, 0x70, 0xb3, 0x25, 0x14, 0x6b, 0x99, 0x7c, 0x29, 0x5e, - 0xac, 0x65, 0x2f, 0x12, 0x4e, 0x09, 0x2f, 0xd6, 0x30, 0x25, 0x81, 0xea, 0x30, 0xc4, 0x7c, 0x0a, - 0x84, 0xfe, 0x2c, 0x93, 0x21, 0xed, 0xe1, 0x9b, 0xc3, 0x9d, 0x96, 0x19, 0x02, 0xe6, 0x84, 0xd0, - 0x06, 0x0c, 0x37, 0x59, 0x46, 0x16, 0x11, 0x32, 0xf9, 0x53, 0x99, 0x2a, 0xb4, 0x1e, 0xa9, 0x6a, - 0x84, 0x46, 0x89, 0x61, 0x60, 0x41, 0x8b, 0x51, 0x25, 0xed, 0x9d, 0xad, 0x88, 0x89, 0xe0, 0x79, - 0x54, 0x7b, 0x64, 0x60, 0x12, 0x54, 0x19, 0x06, 0x16, 0xb4, 0xd0, 0x67, 0xa0, 0xb0, 0xd5, 0x14, - 0x2e, 0x07, 0x99, 0xba, 0x34, 0xd3, 0xa5, 0x7c, 0x71, 0xf8, 0xf0, 0xa0, 0x5a, 0x58, 0x59, 0xc2, - 0x85, 0xad, 0x26, 0x5a, 0x87, 0x91, 0x2d, 0xee, 0x84, 0x2a, 0xd4, 0x65, 0x4f, 0x67, 0xfb, 0xc7, - 0x76, 0xf9, 0xa9, 0x72, 0x53, 0x79, 0x01, 0xc0, 0x92, 0x08, 0x0b, 0x02, 0xa9, 0x9c, 0x69, 0x45, - 0x34, 0xe4, 0xb9, 0xe3, 0x39, 0x40, 0x73, 0xf7, 0xf6, 0xc4, 0x25, 0x17, 0x6b, 0x14, 0xd1, 0x57, - 0xa0, 0xe2, 0xc8, 0xdc, 0x7b, 0x22, 0x5a, 0xc4, 0x8b, 0x99, 0x1b, 0xb3, 0x77, 0x5a, 0x42, 0xbe, - 0xaa, 0x15, 0x12, 0x4e, 0x88, 0xa2, 0x7b, 0x30, 0xbe, 0x17, 0xb5, 0x77, 0x88, 0xdc, 0xc8, 0x2c, - 0x78, 0x44, 0xce, 0xc5, 0x75, 0x57, 0x20, 0xba, 0x61, 0xdc, 0x71, 0xbc, 0xae, 0xb3, 0x87, 0x3d, - 0x36, 0xdf, 0xd5, 0x89, 0x61, 0x93, 0x36, 0x1d, 0xfe, 0x77, 0x3b, 0xc1, 0xe6, 0x7e, 0x4c, 0x44, - 0xf8, 0xe4, 0xcc, 0xe1, 0x7f, 0x93, 0xa3, 0x74, 0x0f, 0xbf, 0x00, 0x60, 0x49, 0x84, 0x6e, 0x75, - 0x47, 0xe6, 0xb5, 0x64, 0x61, 0x93, 0x73, 0xb6, 0x7a, 0x66, 0xf2, 0x4b, 0x6d, 0x50, 0xd8, 0x19, - 0x99, 0x90, 0x62, 0x67, 0x63, 0x7b, 0x27, 0x88, 0x03, 0x3f, 0x75, 0x2e, 0x4f, 0xe7, 0x9f, 0x8d, - 0xf5, 0x0c, 0xfc, 0xee, 0xb3, 0x31, 0x0b, 0x0b, 0x67, 0xb6, 0x85, 0x5a, 0x30, 0xd1, 0x0e, 0xc2, - 0xf8, 0x7e, 0x10, 0xca, 0xf5, 0x85, 0x7a, 0x88, 0xfb, 0x06, 0xa6, 0x68, 0x91, 0x85, 0xf3, 0x36, - 0x21, 0x38, 0x45, 0x13, 0x7d, 0x1e, 0x46, 0xa2, 0xa6, 0xe3, 0x91, 0xd5, 0xdb, 0x33, 0x67, 0xf2, - 0x2f, 0x9d, 0x06, 0x47, 0xc9, 0x59, 0x5d, 0x6c, 0x72, 0x04, 0x0a, 0x96, 0xe4, 0xd0, 0x0a, 0x0c, - 0xb1, 0x98, 0xfc, 0x2c, 0xf2, 0x73, 0x4e, 0x54, 0xa2, 0x2e, 0xa3, 0x4e, 0x7e, 0x36, 0xb1, 0x62, - 0xcc, 0xab, 0xd3, 0x3d, 0x20, 0xb8, 0xde, 0x20, 0x9a, 0x39, 0x97, 0xbf, 0x07, 0x04, 0xb3, 0x7c, - 0xbb, 0xd1, 0x6b, 0x0f, 0x28, 0x24, 0x9c, 0x10, 0xa5, 0x27, 0x33, 0x3d, 0x4d, 0xcf, 0xf7, 0xb0, - 0x33, 0xc9, 0x3d, 0x4b, 0xd9, 0xc9, 0x4c, 0x4f, 0x52, 0x4a, 0xc2, 0xfe, 0xbd, 0x91, 0x6e, 0x4e, - 0x85, 0xc9, 0x49, 0x7f, 0xc1, 0xea, 0x7a, 0x42, 0xfb, 0xf4, 0xa0, 0x6a, 0x9b, 0x13, 0xe4, 0x51, - 0xdf, 0xb7, 0xe0, 0x7c, 0x3b, 0xf3, 0x43, 0xc4, 0xb5, 0x3f, 0x98, 0xf6, 0x87, 0x7f, 0xba, 0x8a, - 0xce, 0x9e, 0x0d, 0xc7, 0x39, 0x2d, 0xa5, 0xe5, 0x80, 0xe2, 0x07, 0x96, 0x03, 0xd6, 0xa0, 0xcc, - 0x58, 0xcb, 0x3e, 0x19, 0xca, 0xd2, 0x5e, 0x68, 0x8c, 0x81, 0x58, 0x12, 0x15, 0xb1, 0x22, 0x81, - 0x7e, 0xcc, 0x82, 0x8b, 0xe9, 0xae, 0x63, 0xc2, 0xc0, 0x22, 0x96, 0x39, 0x17, 0xd1, 0x56, 0xc4, - 0xf7, 0x5f, 0xac, 0xf7, 0x42, 0x3e, 0xea, 0x87, 0x80, 0x7b, 0x37, 0x86, 0x6a, 0x19, 0x32, 0xe2, - 0xb0, 0xa9, 0x17, 0x1f, 0x40, 0x4e, 0x7c, 0x09, 0xc6, 0x76, 0x83, 0x8e, 0x1f, 0x0b, 0xb3, 0x14, - 0xe1, 0x24, 0xc8, 0xde, 0x81, 0xd7, 0xb4, 0x72, 0x6c, 0x60, 0xa5, 0xa4, 0xcb, 0xf2, 0xc3, 0x4a, - 0x97, 0xe8, 0xed, 0x54, 0x1e, 0xea, 0x4a, 0x7e, 0xcc, 0x3c, 0x21, 0x88, 0x1f, 0x23, 0x1b, 0xf5, - 0xe9, 0x4a, 0x44, 0x5f, 0xb3, 0x32, 0x58, 0x79, 0x2e, 0x23, 0x7f, 0xd6, 0x94, 0x91, 0xaf, 0xa4, - 0x65, 0xe4, 0x2e, 0x9d, 0xa8, 0x21, 0x1e, 0x0f, 0x1e, 0x78, 0x79, 0xd0, 0x48, 0x66, 0xb6, 0x07, - 0x97, 0xfb, 0x5d, 0x4b, 0xcc, 0x3e, 0xa9, 0xa5, 0x5e, 0xc0, 0x12, 0xfb, 0xa4, 0xd6, 0x6a, 0x0d, - 0x33, 0xc8, 0xa0, 0xa1, 0x2e, 0xec, 0xff, 0x6a, 0x41, 0xb1, 0x1e, 0xb4, 0x4e, 0x41, 0xc7, 0xfb, - 0x39, 0x43, 0xc7, 0xfb, 0x78, 0x4e, 0x7e, 0xf0, 0x5c, 0x8d, 0xee, 0x72, 0x4a, 0xa3, 0x7b, 0x31, - 0x8f, 0x40, 0x6f, 0xfd, 0xed, 0xcf, 0x16, 0x41, 0xcf, 0x66, 0x8e, 0xfe, 0xd5, 0xc3, 0x18, 0x07, - 0x17, 0x7b, 0x25, 0x38, 0x17, 0x94, 0x99, 0x59, 0x93, 0xf4, 0x7b, 0xfb, 0x73, 0x66, 0x23, 0xfc, - 0x16, 0x71, 0xb7, 0x77, 0x62, 0xd2, 0x4a, 0x7f, 0xce, 0xe9, 0xd9, 0x08, 0xff, 0x67, 0x0b, 0x26, - 0x53, 0xad, 0x23, 0x0f, 0xc6, 0x3d, 0x5d, 0x41, 0x27, 0xd6, 0xe9, 0x43, 0xe9, 0xf6, 0x84, 0x8d, - 0xa5, 0x56, 0x84, 0x4d, 0xe2, 0x68, 0x0e, 0x40, 0x3d, 0xa0, 0x49, 0xbd, 0x17, 0xe3, 0xfa, 0xd5, - 0x0b, 0x5b, 0x84, 0x35, 0x0c, 0xf4, 0x32, 0x8c, 0xc6, 0x41, 0x3b, 0xf0, 0x82, 0xed, 0xfd, 0x9b, - 0x44, 0x06, 0x57, 0x51, 0x96, 0x53, 0x1b, 0x09, 0x08, 0xeb, 0x78, 0xf6, 0xcf, 0x17, 0x21, 0x9d, - 0x01, 0xff, 0x3b, 0x6b, 0xf2, 0xa3, 0xb9, 0x26, 0xbf, 0x65, 0xc1, 0x14, 0x6d, 0x9d, 0x59, 0x71, - 0xc8, 0xcb, 0x56, 0x25, 0x80, 0xb1, 0x7a, 0x24, 0x80, 0xb9, 0x42, 0xcf, 0xae, 0x56, 0xd0, 0x89, - 0x85, 0xde, 0x4c, 0x3b, 0x9c, 0x68, 0x29, 0x16, 0x50, 0x81, 0x47, 0xc2, 0x50, 0xb8, 0x26, 0xe9, - 0x78, 0x24, 0x0c, 0xb1, 0x80, 0xca, 0xfc, 0x30, 0xa5, 0x9c, 0xfc, 0x30, 0x2c, 0x54, 0x9c, 0x78, - 0xef, 0x17, 0x6c, 0x8f, 0x16, 0x2a, 0x4e, 0x1a, 0x02, 0x24, 0x38, 0xf6, 0x2f, 0x15, 0x61, 0xac, - 0x1e, 0xb4, 0x92, 0x27, 0xac, 0x97, 0x8c, 0x27, 0xac, 0xcb, 0xa9, 0x27, 0xac, 0x29, 0x1d, 0xf7, - 0x3b, 0x0f, 0x56, 0x1f, 0xd6, 0x83, 0xd5, 0x3f, 0xb7, 0xd8, 0xac, 0xd5, 0xd6, 0x1b, 0x22, 0x3f, - 0xed, 0x0b, 0x30, 0xca, 0x0e, 0x24, 0xe6, 0x0b, 0x27, 0xdf, 0x75, 0x58, 0xe8, 0xf7, 0xf5, 0xa4, - 0x18, 0xeb, 0x38, 0xe8, 0x2a, 0x94, 0x23, 0xe2, 0x84, 0xcd, 0x1d, 0x75, 0xc6, 0x89, 0x57, 0x0f, - 0x5e, 0x86, 0x15, 0x14, 0xbd, 0x99, 0x44, 0x29, 0x2b, 0xe6, 0x67, 0x5a, 0xd5, 0xfb, 0xc3, 0xb7, - 0x48, 0x7e, 0x68, 0x32, 0xfb, 0x2d, 0x40, 0xdd, 0xf8, 0x03, 0xc4, 0x23, 0xaa, 0x9a, 0xf1, 0x88, - 0x2a, 0x5d, 0xb1, 0x88, 0xfe, 0xd4, 0x82, 0x89, 0x7a, 0xd0, 0xa2, 0x5b, 0xf7, 0xdb, 0x69, 0x9f, - 0xea, 0x21, 0x1a, 0x87, 0x7b, 0x84, 0x68, 0xfc, 0xbb, 0x16, 0x8c, 0xd4, 0x83, 0xd6, 0x29, 0x68, - 0xdb, 0x3f, 0x6b, 0x6a, 0xdb, 0x1f, 0xcb, 0x59, 0x12, 0x39, 0x0a, 0xf6, 0x5f, 0x29, 0xc2, 0x38, - 0xed, 0x67, 0xb0, 0x2d, 0x67, 0xc9, 0x18, 0x11, 0x6b, 0x80, 0x11, 0xa1, 0x6c, 0x6e, 0xe0, 0x79, - 0xc1, 0xfd, 0xf4, 0x8c, 0xad, 0xb0, 0x52, 0x2c, 0xa0, 0xe8, 0x39, 0x28, 0xb7, 0x43, 0xb2, 0xe7, - 0x06, 0x82, 0x7f, 0xd4, 0xde, 0x2e, 0xea, 0xa2, 0x1c, 0x2b, 0x0c, 0x2a, 0x77, 0x45, 0xae, 0xdf, - 0x24, 0x32, 0xcd, 0x73, 0x89, 0x65, 0x82, 0xe2, 0xb1, 0x97, 0xb5, 0x72, 0x6c, 0x60, 0xa1, 0xb7, - 0xa0, 0xc2, 0xfe, 0xb3, 0x13, 0xe5, 0xf8, 0x99, 0x6b, 0x44, 0xc2, 0x03, 0x41, 0x00, 0x27, 0xb4, - 0xd0, 0x35, 0x80, 0x58, 0xc6, 0xe7, 0x8d, 0x44, 0x58, 0x19, 0xc5, 0x6b, 0xab, 0xc8, 0xbd, 0x11, - 0xd6, 0xb0, 0xd0, 0xb3, 0x50, 0x89, 0x1d, 0xd7, 0xbb, 0xe5, 0xfa, 0x24, 0x62, 0x2a, 0xe7, 0xa2, - 0xcc, 0x67, 0x20, 0x0a, 0x71, 0x02, 0xa7, 0xbc, 0x0e, 0xf3, 0xb9, 0xe6, 0x79, 0xaf, 0xca, 0x0c, - 0x9b, 0xf1, 0x3a, 0xb7, 0x54, 0x29, 0xd6, 0x30, 0xec, 0x57, 0xe1, 0x5c, 0x3d, 0x68, 0xd5, 0x83, - 0x30, 0x5e, 0x09, 0xc2, 0xfb, 0x4e, 0xd8, 0x92, 0xf3, 0x57, 0x95, 0xa1, 0xf5, 0xe9, 0xd9, 0x33, - 0xc4, 0x77, 0xa6, 0x11, 0x34, 0xff, 0x45, 0xc6, 0xed, 0x1c, 0xd3, 0xd7, 0xa2, 0xc9, 0xee, 0x5d, - 0x95, 0xe2, 0xee, 0xba, 0x13, 0x13, 0x74, 0x9b, 0xa5, 0xc5, 0x4a, 0xae, 0x20, 0x51, 0xfd, 0x19, - 0x2d, 0x2d, 0x56, 0x02, 0xcc, 0xbc, 0xb3, 0xcc, 0xfa, 0xf6, 0xff, 0x2e, 0xb0, 0xd3, 0x28, 0x95, - 0xf1, 0x0d, 0x7d, 0x19, 0x26, 0x22, 0x72, 0xcb, 0xf5, 0x3b, 0x0f, 0xa4, 0x10, 0xde, 0xc3, 0x5b, - 0xa6, 0xb1, 0xac, 0x63, 0x72, 0x55, 0x9e, 0x59, 0x86, 0x53, 0xd4, 0xe8, 0x3c, 0x85, 0x1d, 0x7f, - 0x21, 0xba, 0x13, 0x91, 0x50, 0x64, 0x1c, 0x63, 0xf3, 0x84, 0x65, 0x21, 0x4e, 0xe0, 0x74, 0x5d, - 0xb2, 0x3f, 0xeb, 0x81, 0x8f, 0x83, 0x20, 0x96, 0x2b, 0x99, 0xe5, 0xac, 0xd1, 0xca, 0xb1, 0x81, - 0x85, 0x56, 0x00, 0x45, 0x9d, 0x76, 0xdb, 0x63, 0xef, 0xed, 0x8e, 0x77, 0x3d, 0x0c, 0x3a, 0x6d, - 0xfe, 0xd6, 0x59, 0x5c, 0x3c, 0x4f, 0xaf, 0xb0, 0x46, 0x17, 0x14, 0x67, 0xd4, 0xa0, 0xa7, 0xcf, - 0x56, 0xc4, 0x7e, 0xb3, 0xd5, 0x5d, 0x14, 0xea, 0xf5, 0x06, 0x2b, 0xc2, 0x12, 0x46, 0x17, 0x13, - 0x6b, 0x9e, 0x63, 0x0e, 0x27, 0x8b, 0x09, 0xab, 0x52, 0xac, 0x61, 0xd8, 0x3f, 0xc0, 0x6e, 0x31, - 0x96, 0x58, 0x2a, 0xee, 0x84, 0x04, 0xed, 0xc2, 0x78, 0x9b, 0xcd, 0x95, 0x08, 0x7b, 0x2c, 0x06, - 0xfc, 0xa5, 0x01, 0xc5, 0xd1, 0xfb, 0xf4, 0x84, 0x50, 0xea, 0x22, 0xc6, 0xe7, 0xd7, 0x75, 0x72, - 0xd8, 0xa4, 0x6e, 0xff, 0xc8, 0x34, 0x3b, 0x2c, 0x1b, 0x5c, 0xc6, 0x1c, 0x11, 0xa6, 0xba, 0x82, - 0xa1, 0x9e, 0xcd, 0x57, 0x76, 0x24, 0xf7, 0x9a, 0x30, 0xf7, 0xc5, 0xb2, 0x2e, 0x7a, 0x93, 0x3d, - 0x2a, 0xf3, 0x13, 0xaa, 0x5f, 0x7e, 0x5f, 0x8e, 0x65, 0xbc, 0x1f, 0x8b, 0x8a, 0x58, 0x23, 0x82, - 0x6e, 0xc1, 0xb8, 0xc8, 0x43, 0x24, 0xb4, 0x59, 0x45, 0x43, 0x5b, 0x31, 0x8e, 0x75, 0xe0, 0x51, - 0xba, 0x00, 0x9b, 0x95, 0xd1, 0x36, 0x5c, 0xd4, 0x92, 0xf2, 0x5d, 0x0f, 0x1d, 0xf6, 0xd0, 0xe8, - 0xb2, 0xd5, 0xaf, 0x1d, 0x78, 0x4f, 0x1e, 0x1e, 0x54, 0x2f, 0x6e, 0xf4, 0x42, 0xc4, 0xbd, 0xe9, - 0xa0, 0xdb, 0x70, 0x8e, 0x7b, 0xc4, 0xd5, 0x88, 0xd3, 0xf2, 0x5c, 0x5f, 0x9d, 0xa8, 0x7c, 0x01, - 0x5d, 0x38, 0x3c, 0xa8, 0x9e, 0x5b, 0xc8, 0x42, 0xc0, 0xd9, 0xf5, 0xd0, 0x67, 0xa1, 0xd2, 0xf2, - 0x23, 0x31, 0x06, 0xc3, 0x46, 0xbe, 0xc9, 0x4a, 0x6d, 0xbd, 0xa1, 0xbe, 0x3f, 0xf9, 0x83, 0x93, - 0x0a, 0x68, 0x9b, 0x6b, 0xb4, 0x94, 0x00, 0x39, 0x92, 0x9f, 0x5b, 0x5c, 0x2c, 0x09, 0xc3, 0x27, - 0x86, 0xab, 0x72, 0x95, 0x4d, 0xa9, 0xe1, 0x2e, 0x63, 0x10, 0x46, 0x6f, 0x00, 0xa2, 0x1c, 0x96, - 0xdb, 0x24, 0x0b, 0x4d, 0x16, 0x7d, 0x9a, 0x29, 0x00, 0xcb, 0x86, 0x0f, 0x02, 0x6a, 0x74, 0x61, - 0xe0, 0x8c, 0x5a, 0xe8, 0x06, 0x3d, 0x81, 0xf4, 0x52, 0x61, 0x1b, 0x2b, 0xb9, 0xf2, 0x99, 0x1a, - 0x69, 0x87, 0xa4, 0xe9, 0xc4, 0xa4, 0x65, 0x52, 0xc4, 0xa9, 0x7a, 0xf4, 0x12, 0x54, 0x89, 0x68, - 0xc0, 0x0c, 0x31, 0xd1, 0x9d, 0x8c, 0x86, 0x0a, 0xb4, 0x3b, 0x41, 0x14, 0xaf, 0x93, 0xf8, 0x7e, - 0x10, 0xde, 0x13, 0x11, 0xbd, 0x92, 0xe0, 0x92, 0x09, 0x08, 0xeb, 0x78, 0x94, 0x81, 0x65, 0xaf, - 0xba, 0xab, 0x35, 0xf6, 0xb4, 0x56, 0x4e, 0xf6, 0xc9, 0x0d, 0x5e, 0x8c, 0x25, 0x5c, 0xa2, 0xae, - 0xd6, 0x97, 0xd8, 0x33, 0x59, 0x0a, 0x75, 0xb5, 0xbe, 0x84, 0x25, 0x1c, 0x91, 0xee, 0x5c, 0x9e, - 0x13, 0xf9, 0xea, 0xc8, 0xee, 0x73, 0x7c, 0xc0, 0x74, 0x9e, 0x3e, 0x4c, 0xa9, 0x2c, 0xa2, 0x3c, - 0xd4, 0x59, 0x34, 0x33, 0xc9, 0x16, 0xc9, 0xe0, 0x71, 0xd2, 0x94, 0x82, 0x77, 0x35, 0x45, 0x09, - 0x77, 0xd1, 0x36, 0x82, 0x7e, 0x4c, 0xf5, 0x4d, 0x24, 0x34, 0x0f, 0x95, 0xa8, 0xb3, 0xd9, 0x0a, - 0x76, 0x1d, 0xd7, 0x67, 0xaf, 0x5a, 0x1a, 0x77, 0xd4, 0x90, 0x00, 0x9c, 0xe0, 0xa0, 0x15, 0x28, - 0x3b, 0x52, 0x7b, 0x8b, 0xf2, 0xa3, 0x00, 0x28, 0x9d, 0x2d, 0x77, 0x8c, 0x95, 0xfa, 0x5a, 0x55, - 0x17, 0xbd, 0x06, 0xe3, 0xc2, 0x0f, 0x8a, 0xc7, 0x46, 0x60, 0xaf, 0x4e, 0x9a, 0xa1, 0x7b, 0x43, - 0x07, 0x62, 0x13, 0x17, 0x7d, 0x09, 0x26, 0x28, 0x95, 0xe4, 0x60, 0x9b, 0x39, 0x3b, 0xc8, 0x89, - 0xa8, 0x25, 0x88, 0xd0, 0x2b, 0xe3, 0x14, 0x31, 0xd4, 0x82, 0x27, 0x9c, 0x4e, 0x1c, 0x30, 0x0d, - 0xb8, 0xb9, 0xfe, 0x37, 0x82, 0x7b, 0xc4, 0x67, 0x8f, 0x4f, 0xe5, 0xc5, 0xcb, 0x87, 0x07, 0xd5, - 0x27, 0x16, 0x7a, 0xe0, 0xe1, 0x9e, 0x54, 0xd0, 0x1d, 0x18, 0x8d, 0x03, 0x8f, 0x99, 0x9c, 0x53, - 0x1e, 0xe0, 0x7c, 0x7e, 0xd0, 0x9c, 0x0d, 0x85, 0xa6, 0x6b, 0x7f, 0x54, 0x55, 0xac, 0xd3, 0x41, - 0x1b, 0x7c, 0x8f, 0xb1, 0x70, 0xa2, 0x24, 0x9a, 0x79, 0x2c, 0x7f, 0x60, 0x54, 0xd4, 0x51, 0x73, - 0x0b, 0x8a, 0x9a, 0x58, 0x27, 0x83, 0xae, 0xc3, 0x74, 0x3b, 0x74, 0x03, 0xb6, 0xb0, 0xd5, 0xeb, - 0xc3, 0x8c, 0x99, 0x13, 0xa0, 0x9e, 0x46, 0xc0, 0xdd, 0x75, 0xa8, 0x74, 0x28, 0x0b, 0x67, 0x2e, - 0xf0, 0x04, 0x53, 0x9c, 0x63, 0xe6, 0x65, 0x58, 0x41, 0xd1, 0x1a, 0x3b, 0x97, 0xb9, 0x1c, 0x37, - 0x33, 0x9b, 0x1f, 0x3d, 0x41, 0x97, 0xf7, 0x38, 0xa3, 0xa3, 0xfe, 0xe2, 0x84, 0x02, 0xbd, 0x37, - 0xa2, 0x1d, 0x27, 0x24, 0xf5, 0x30, 0x68, 0x12, 0xde, 0x19, 0x6e, 0xed, 0xfe, 0x38, 0x8f, 0x7a, - 0x48, 0xef, 0x8d, 0x46, 0x16, 0x02, 0xce, 0xae, 0x87, 0x5a, 0x5a, 0x5e, 0x65, 0xca, 0x3f, 0x46, - 0x33, 0x4f, 0xf4, 0xb0, 0x0f, 0x4a, 0x31, 0x9b, 0xc9, 0x5a, 0x34, 0x8a, 0x23, 0x9c, 0xa2, 0x39, - 0xfb, 0xdd, 0x30, 0xdd, 0x75, 0x5f, 0x1c, 0x2b, 0xe0, 0xf6, 0x9f, 0x0c, 0x41, 0x45, 0xe9, 0xb0, - 0xd1, 0xbc, 0xf9, 0x34, 0x71, 0x21, 0xfd, 0x34, 0x51, 0xa6, 0xac, 0xb4, 0xfe, 0x1a, 0xb1, 0x61, - 0x58, 0xb3, 0x15, 0xf2, 0xd3, 0x5b, 0xe9, 0xcc, 0x70, 0x5f, 0xd7, 0x35, 0x4d, 0x25, 0x51, 0x1c, - 0xf8, 0x8d, 0xa3, 0xd4, 0x53, 0xcb, 0x31, 0x60, 0x76, 0x59, 0x2a, 0xb5, 0xb7, 0x83, 0xd6, 0x6a, - 0x3d, 0x9d, 0x6e, 0xb1, 0x4e, 0x0b, 0x31, 0x87, 0x31, 0xb9, 0x8b, 0x32, 0x37, 0x4c, 0xee, 0x1a, - 0x79, 0x48, 0xb9, 0x4b, 0x12, 0xc0, 0x09, 0x2d, 0xe4, 0xc1, 0x74, 0xd3, 0xcc, 0x94, 0xa9, 0xdc, - 0xd5, 0x9e, 0xea, 0x9b, 0xb3, 0xb2, 0xa3, 0xa5, 0x25, 0x5b, 0x4a, 0x53, 0xc1, 0xdd, 0x84, 0xd1, - 0x6b, 0x50, 0x7e, 0x37, 0x88, 0xd8, 0xe6, 0x13, 0x37, 0xbc, 0x74, 0xeb, 0x29, 0xbf, 0x79, 0xbb, - 0xc1, 0xca, 0x8f, 0x0e, 0xaa, 0xa3, 0xf5, 0xa0, 0x25, 0xff, 0x62, 0x55, 0x01, 0x3d, 0x80, 0x73, - 0xc6, 0xb9, 0xa8, 0xba, 0x0b, 0x83, 0x77, 0xf7, 0xa2, 0x68, 0xee, 0xdc, 0x6a, 0x16, 0x25, 0x9c, - 0xdd, 0x00, 0x3d, 0x6c, 0xfc, 0x40, 0x64, 0x99, 0x95, 0x5c, 0x04, 0x63, 0x16, 0x2a, 0xba, 0x53, - 0x77, 0x0a, 0x01, 0x77, 0xd7, 0xb1, 0xbf, 0xce, 0x55, 0xfe, 0x42, 0x31, 0x48, 0xa2, 0x8e, 0x77, - 0x1a, 0x49, 0x8c, 0x96, 0x0d, 0x9d, 0xe5, 0x43, 0x3f, 0x2b, 0xfd, 0xa6, 0xc5, 0x9e, 0x95, 0x36, - 0xc8, 0x6e, 0xdb, 0xa3, 0xe2, 0xe9, 0xa3, 0xef, 0xf8, 0x9b, 0x50, 0x8e, 0x45, 0x6b, 0xbd, 0xf2, - 0x2e, 0x69, 0x9d, 0x62, 0x4f, 0x6b, 0x8a, 0xbf, 0x90, 0xa5, 0x58, 0x91, 0xb1, 0xff, 0x09, 0x9f, - 0x01, 0x09, 0x39, 0x05, 0xfd, 0x51, 0xcd, 0xd4, 0x1f, 0x55, 0xfb, 0x7c, 0x41, 0x8e, 0x1e, 0xe9, - 0x1f, 0x9b, 0xfd, 0x66, 0xa2, 0xdc, 0x47, 0xfd, 0x3d, 0xd3, 0xfe, 0x49, 0x0b, 0xce, 0x66, 0x19, - 0x00, 0x51, 0x9e, 0x90, 0x0b, 0x92, 0xea, 0x7d, 0x57, 0x8d, 0xe0, 0x5d, 0x51, 0x8e, 0x15, 0xc6, - 0xc0, 0x29, 0x0d, 0x8e, 0x17, 0xf7, 0xec, 0x36, 0x8c, 0xd7, 0x43, 0xa2, 0xdd, 0x01, 0xaf, 0x73, - 0xff, 0x30, 0xde, 0x9f, 0xe7, 0x8e, 0xed, 0x1b, 0x66, 0xff, 0x42, 0x01, 0xce, 0xf2, 0x07, 0x9a, - 0x85, 0xbd, 0xc0, 0x6d, 0xd5, 0x83, 0x96, 0x48, 0x47, 0xf1, 0x45, 0x18, 0x6b, 0x6b, 0xd2, 0x7f, - 0xaf, 0xc8, 0x4b, 0xba, 0x96, 0x20, 0x91, 0xc2, 0xf4, 0x52, 0x6c, 0xd0, 0x42, 0x2d, 0x18, 0x23, - 0x7b, 0x6e, 0x53, 0x69, 0xf9, 0x0b, 0xc7, 0xbe, 0x1b, 0x54, 0x2b, 0xcb, 0x1a, 0x1d, 0x6c, 0x50, - 0x7d, 0x04, 0x19, 0xca, 0xec, 0x9f, 0xb2, 0xe0, 0xb1, 0x9c, 0x38, 0x4d, 0xb4, 0xb9, 0xfb, 0xec, - 0x29, 0x4c, 0x24, 0x3b, 0x52, 0xcd, 0xf1, 0x07, 0x32, 0x2c, 0xa0, 0xe8, 0xf3, 0x00, 0xfc, 0x81, - 0x8b, 0x0a, 0x25, 0xfd, 0x02, 0xda, 0x18, 0xb1, 0x38, 0xb4, 0x18, 0x0a, 0xb2, 0x3e, 0xd6, 0x68, - 0xd9, 0x3f, 0x57, 0x84, 0x21, 0xf6, 0xa0, 0x82, 0x56, 0x60, 0x64, 0x87, 0x47, 0x25, 0x1e, 0x24, - 0x00, 0x72, 0x22, 0xdd, 0xf1, 0x02, 0x2c, 0x2b, 0xa3, 0x35, 0x38, 0xc3, 0xa3, 0x3a, 0x7b, 0x35, - 0xe2, 0x39, 0xfb, 0x52, 0x49, 0xc0, 0x13, 0x04, 0xa9, 0x78, 0x10, 0xab, 0xdd, 0x28, 0x38, 0xab, - 0x1e, 0x7a, 0x1d, 0x26, 0x62, 0x77, 0x97, 0x04, 0x9d, 0x58, 0x52, 0xe2, 0xf1, 0x9c, 0x15, 0x1b, - 0xb7, 0x61, 0x40, 0x71, 0x0a, 0x9b, 0x8a, 0x3b, 0xed, 0x2e, 0x75, 0x88, 0x96, 0x72, 0xdf, 0x54, - 0x81, 0x98, 0xb8, 0xcc, 0xf2, 0xa7, 0xc3, 0xec, 0x9c, 0x36, 0x76, 0x42, 0x12, 0xed, 0x04, 0x5e, - 0x4b, 0xe4, 0x97, 0x4e, 0x2c, 0x7f, 0x52, 0x70, 0xdc, 0x55, 0x83, 0x52, 0xd9, 0x72, 0x5c, 0xaf, - 0x13, 0x92, 0x84, 0xca, 0xb0, 0x49, 0x65, 0x25, 0x05, 0xc7, 0x5d, 0x35, 0xe8, 0x3a, 0x3a, 0x27, - 0x12, 0x3e, 0x4b, 0x2f, 0x75, 0x65, 0xce, 0x35, 0x22, 0xfd, 0x75, 0x7a, 0x84, 0x69, 0x11, 0x06, - 0x2f, 0x2a, 0x65, 0xb4, 0x96, 0x4e, 0x54, 0x78, 0xea, 0x48, 0x2a, 0x0f, 0x93, 0x76, 0xf8, 0xf7, - 0x2c, 0x38, 0x93, 0x61, 0x36, 0xca, 0x8f, 0xaa, 0x6d, 0x37, 0x8a, 0x55, 0x12, 0x14, 0xed, 0xa8, - 0xe2, 0xe5, 0x58, 0x61, 0xd0, 0xfd, 0xc0, 0x0f, 0xc3, 0xf4, 0x01, 0x28, 0xcc, 0xb2, 0x04, 0xf4, - 0x78, 0x07, 0x20, 0xba, 0x0c, 0xa5, 0x4e, 0x44, 0x64, 0x80, 0x25, 0x75, 0x7e, 0x33, 0x85, 0x2c, - 0x83, 0x50, 0xd6, 0x74, 0x5b, 0xe9, 0x42, 0x35, 0xd6, 0x94, 0x2b, 0x38, 0x39, 0xcc, 0xfe, 0x6a, - 0x11, 0x2e, 0xe4, 0x1a, 0x88, 0xd3, 0x2e, 0xed, 0x06, 0xbe, 0x1b, 0x07, 0xea, 0xb1, 0x8e, 0x87, - 0xf8, 0x20, 0xed, 0x9d, 0x35, 0x51, 0x8e, 0x15, 0x06, 0xba, 0x22, 0x53, 0x8f, 0xa7, 0xd3, 0xbc, - 0x2c, 0xd6, 0x8c, 0xec, 0xe3, 0x83, 0xa6, 0xd0, 0x7a, 0x0a, 0x4a, 0xed, 0x20, 0xf0, 0xd2, 0x87, - 0x11, 0xed, 0x6e, 0x10, 0x78, 0x98, 0x01, 0xd1, 0x27, 0xc4, 0x38, 0xa4, 0x5e, 0xa7, 0xb0, 0xd3, - 0x0a, 0x22, 0x6d, 0x30, 0x9e, 0x81, 0x91, 0x7b, 0x64, 0x3f, 0x74, 0xfd, 0xed, 0xf4, 0xab, 0xe5, - 0x4d, 0x5e, 0x8c, 0x25, 0xdc, 0xcc, 0x72, 0x30, 0x72, 0xd2, 0xb9, 0xaf, 0xca, 0x7d, 0xaf, 0xb6, - 0x1f, 0x2d, 0xc2, 0x24, 0x5e, 0xac, 0x7d, 0x67, 0x22, 0xee, 0x74, 0x4f, 0xc4, 0x49, 0xe7, 0xbe, - 0xea, 0x3f, 0x1b, 0xbf, 0x62, 0xc1, 0x24, 0x8b, 0x04, 0x2c, 0x02, 0x4b, 0xb8, 0x81, 0x7f, 0x0a, - 0xac, 0xdb, 0x53, 0x30, 0x14, 0xd2, 0x46, 0xd3, 0x09, 0x6d, 0x58, 0x4f, 0x30, 0x87, 0xa1, 0x27, - 0xa0, 0xc4, 0xba, 0x40, 0x27, 0x6f, 0x8c, 0xe7, 0x02, 0xa8, 0x39, 0xb1, 0x83, 0x59, 0x29, 0xf3, - 0x96, 0xc6, 0xa4, 0xed, 0xb9, 0xbc, 0xd3, 0xc9, 0x83, 0xc2, 0x47, 0xc3, 0x5b, 0x3a, 0xb3, 0x6b, - 0x1f, 0xcc, 0x5b, 0x3a, 0x9b, 0x64, 0x6f, 0xb1, 0xe8, 0xbf, 0x15, 0xe0, 0x52, 0x66, 0xbd, 0x81, - 0xbd, 0xa5, 0x7b, 0xd7, 0x3e, 0x19, 0xe3, 0x93, 0x6c, 0x9b, 0x90, 0xe2, 0x29, 0xda, 0x84, 0x94, - 0x06, 0xe5, 0x1c, 0x87, 0x06, 0x70, 0x62, 0xce, 0x1c, 0xb2, 0x8f, 0x88, 0x13, 0x73, 0x66, 0xdf, - 0x72, 0xc4, 0xba, 0x3f, 0x2b, 0xe4, 0x7c, 0x0b, 0x13, 0xf0, 0xae, 0xd2, 0x73, 0x86, 0x01, 0x23, - 0xc1, 0x09, 0x8f, 0xf1, 0x33, 0x86, 0x97, 0x61, 0x05, 0x45, 0xae, 0xe6, 0x0e, 0x5c, 0xc8, 0x4f, - 0x77, 0x98, 0xdb, 0xd4, 0x9c, 0xf9, 0xfe, 0xa3, 0x86, 0x20, 0xc3, 0x35, 0x78, 0x4d, 0x13, 0xca, - 0x8b, 0x83, 0x0b, 0xe5, 0x63, 0xd9, 0x02, 0x39, 0x5a, 0x80, 0xc9, 0x5d, 0xd7, 0x67, 0xe9, 0xeb, - 0x4d, 0x56, 0x54, 0x45, 0xc7, 0x58, 0x33, 0xc1, 0x38, 0x8d, 0x3f, 0xfb, 0x1a, 0x8c, 0x3f, 0xbc, - 0x3a, 0xf2, 0x5b, 0x45, 0x78, 0xbc, 0xc7, 0xb6, 0xe7, 0x67, 0xbd, 0x31, 0x07, 0xda, 0x59, 0xdf, - 0x35, 0x0f, 0x75, 0x38, 0xbb, 0xd5, 0xf1, 0xbc, 0x7d, 0x66, 0x76, 0x49, 0x5a, 0x12, 0x43, 0xf0, - 0x8a, 0x4f, 0xc8, 0xec, 0x0b, 0x2b, 0x19, 0x38, 0x38, 0xb3, 0x26, 0x7a, 0x03, 0x50, 0x20, 0x72, - 0xad, 0x5e, 0x27, 0xbe, 0xd0, 0xaa, 0xb3, 0x81, 0x2f, 0x26, 0x9b, 0xf1, 0x76, 0x17, 0x06, 0xce, - 0xa8, 0x45, 0x99, 0x7e, 0x7a, 0x2b, 0xed, 0xab, 0x6e, 0xa5, 0x98, 0x7e, 0xac, 0x03, 0xb1, 0x89, - 0x8b, 0xae, 0xc3, 0xb4, 0xb3, 0xe7, 0xb8, 0x3c, 0x6a, 0x9c, 0x24, 0xc0, 0xb9, 0x7e, 0xa5, 0x04, - 0x5b, 0x48, 0x23, 0xe0, 0xee, 0x3a, 0x29, 0x7f, 0xe4, 0xe1, 0x7c, 0x7f, 0xe4, 0xde, 0xe7, 0x62, - 0x3f, 0x9d, 0xae, 0xfd, 0x1f, 0x2c, 0x7a, 0x7d, 0x65, 0xe4, 0x4b, 0xa7, 0xe3, 0xa0, 0x74, 0x93, - 0x9a, 0x6b, 0xf0, 0x39, 0xcd, 0xb0, 0x22, 0x01, 0x62, 0x13, 0x97, 0x2f, 0x88, 0x28, 0xf1, 0x4d, - 0x31, 0x58, 0x77, 0xe1, 0xfb, 0xaf, 0x30, 0xd0, 0x17, 0x60, 0xa4, 0xe5, 0xee, 0xb9, 0x51, 0x10, - 0x8a, 0xcd, 0x72, 0x4c, 0x0b, 0xff, 0xe4, 0x1c, 0xac, 0x71, 0x32, 0x58, 0xd2, 0xb3, 0x7f, 0xb4, - 0x00, 0xe3, 0xb2, 0xc5, 0x37, 0x3b, 0x41, 0xec, 0x9c, 0xc2, 0xb5, 0x7c, 0xdd, 0xb8, 0x96, 0x3f, - 0xd1, 0x2b, 0x00, 0x02, 0xeb, 0x52, 0xee, 0x75, 0x7c, 0x3b, 0x75, 0x1d, 0x3f, 0xdd, 0x9f, 0x54, - 0xef, 0x6b, 0xf8, 0x9f, 0x5a, 0x30, 0x6d, 0xe0, 0x9f, 0xc2, 0x6d, 0xb0, 0x62, 0xde, 0x06, 0x4f, - 0xf6, 0xfd, 0x86, 0x9c, 0x5b, 0xe0, 0x6b, 0x85, 0x54, 0xdf, 0xd9, 0xe9, 0xff, 0x2e, 0x94, 0x76, - 0x9c, 0xb0, 0xd5, 0x2b, 0xd0, 0x6a, 0x57, 0xa5, 0xb9, 0x1b, 0x4e, 0xd8, 0xe2, 0x67, 0xf8, 0x73, - 0x2a, 0x43, 0xa3, 0x13, 0xb6, 0xfa, 0xba, 0x62, 0xb1, 0xa6, 0xd0, 0xab, 0x30, 0x1c, 0x35, 0x83, - 0xb6, 0x32, 0x94, 0xbc, 0xcc, 0xb3, 0x37, 0xd2, 0x92, 0xa3, 0x83, 0x2a, 0x32, 0x9b, 0xa3, 0xc5, - 0x58, 0xe0, 0xcf, 0x6e, 0x43, 0x45, 0x35, 0xfd, 0x48, 0xdd, 0x5c, 0xfe, 0x5d, 0x11, 0xce, 0x64, - 0xac, 0x0b, 0x14, 0x19, 0xa3, 0xf5, 0xc2, 0x80, 0xcb, 0xe9, 0x03, 0x8e, 0x57, 0xc4, 0x24, 0x96, - 0x96, 0x98, 0xff, 0x81, 0x1b, 0xbd, 0x13, 0x91, 0x74, 0xa3, 0xb4, 0xa8, 0x7f, 0xa3, 0xb4, 0xb1, - 0x53, 0x1b, 0x6a, 0xda, 0x90, 0xea, 0xe9, 0x23, 0x9d, 0xd3, 0x3f, 0x2e, 0xc2, 0xd9, 0xac, 0xb8, - 0x29, 0xe8, 0xfb, 0x53, 0xa9, 0x56, 0x5e, 0x1a, 0x34, 0xe2, 0x0a, 0xcf, 0xbf, 0x22, 0x12, 0x07, - 0xcf, 0x99, 0xc9, 0x57, 0xfa, 0x0e, 0xb3, 0x68, 0x93, 0xf9, 0x46, 0x86, 0x3c, 0x45, 0x8e, 0xdc, - 0xe2, 0x9f, 0x1e, 0xb8, 0x03, 0x22, 0xb7, 0x4e, 0x94, 0xf2, 0x8d, 0x94, 0xc5, 0xfd, 0x7d, 0x23, - 0x65, 0xcb, 0xb3, 0x2e, 0x8c, 0x6a, 0x5f, 0xf3, 0x48, 0x67, 0xfc, 0x1e, 0xbd, 0x51, 0xb4, 0x7e, - 0x3f, 0xd2, 0x59, 0xff, 0x29, 0x0b, 0x52, 0x96, 0x83, 0x4a, 0x25, 0x65, 0xe5, 0xaa, 0xa4, 0x2e, - 0x43, 0x29, 0x0c, 0x3c, 0x92, 0xce, 0x7e, 0x82, 0x03, 0x8f, 0x60, 0x06, 0xa1, 0x18, 0x71, 0xa2, - 0x90, 0x18, 0xd3, 0x85, 0x2d, 0x21, 0x46, 0x3d, 0x05, 0x43, 0x1e, 0xd9, 0x23, 0x5e, 0x3a, 0xb4, - 0xf8, 0x2d, 0x5a, 0x88, 0x39, 0xcc, 0xfe, 0x95, 0x12, 0x5c, 0xec, 0xe9, 0x5d, 0x4c, 0x45, 0x96, - 0x6d, 0x27, 0x26, 0xf7, 0x9d, 0xfd, 0x74, 0x0c, 0xe0, 0xeb, 0xbc, 0x18, 0x4b, 0x38, 0x33, 0xa6, - 0xe6, 0x31, 0xff, 0x52, 0x0a, 0x3c, 0x11, 0xea, 0x4f, 0x40, 0x1f, 0x41, 0xd2, 0xf4, 0x6b, 0x00, - 0x51, 0xe4, 0x2d, 0xfb, 0x94, 0x03, 0x6b, 0x09, 0x2b, 0xed, 0x24, 0x36, 0x64, 0xe3, 0x96, 0x80, - 0x60, 0x0d, 0x0b, 0xd5, 0x60, 0xaa, 0x1d, 0x06, 0x31, 0xd7, 0x87, 0xd6, 0xb8, 0x29, 0xce, 0x90, - 0xe9, 0xd8, 0x59, 0x4f, 0xc1, 0x71, 0x57, 0x0d, 0xf4, 0x32, 0x8c, 0x0a, 0x67, 0xcf, 0x7a, 0x10, - 0x78, 0x42, 0x55, 0xa3, 0x0c, 0x3b, 0x1a, 0x09, 0x08, 0xeb, 0x78, 0x5a, 0x35, 0xa6, 0x64, 0x1d, - 0xc9, 0xac, 0xc6, 0x15, 0xad, 0x1a, 0x5e, 0x2a, 0x86, 0x52, 0x79, 0xa0, 0x18, 0x4a, 0x89, 0xf2, - 0xaa, 0x32, 0xf0, 0xbb, 0x12, 0xf4, 0x55, 0xf7, 0xfc, 0x62, 0x09, 0xce, 0x88, 0x85, 0xf3, 0xa8, - 0x97, 0xcb, 0x23, 0x4a, 0xed, 0xfe, 0x9d, 0x35, 0x73, 0xda, 0x6b, 0xe6, 0xeb, 0x45, 0x18, 0xe6, - 0x53, 0x71, 0x0a, 0x3c, 0xfc, 0x8a, 0x50, 0xfa, 0xf5, 0x88, 0x1e, 0xc4, 0xfb, 0x32, 0x57, 0x73, - 0x62, 0x87, 0xdf, 0x5f, 0xea, 0x18, 0x4d, 0xd4, 0x83, 0x68, 0xce, 0x38, 0x68, 0x67, 0x53, 0x5a, - 0x2d, 0xe0, 0x34, 0xb4, 0x63, 0xf7, 0xcb, 0x00, 0x11, 0x4b, 0x2f, 0x4e, 0x69, 0x88, 0x38, 0x54, - 0x9f, 0xec, 0xd1, 0x7a, 0x43, 0x21, 0xf3, 0x3e, 0x24, 0x4b, 0x50, 0x01, 0xb0, 0x46, 0x71, 0xf6, - 0x15, 0xa8, 0x28, 0xe4, 0x7e, 0x2a, 0x80, 0x31, 0xfd, 0xd6, 0xfb, 0x1c, 0x4c, 0xa6, 0xda, 0x3a, - 0x96, 0x06, 0xe1, 0x57, 0x2d, 0x98, 0xe4, 0x5d, 0x5e, 0xf6, 0xf7, 0xc4, 0x66, 0x7f, 0x0f, 0xce, - 0x7a, 0x19, 0x9b, 0x4e, 0xcc, 0xe8, 0xe0, 0x9b, 0x54, 0x69, 0x0c, 0xb2, 0xa0, 0x38, 0xb3, 0x0d, - 0x74, 0x15, 0xca, 0xdc, 0xfb, 0xc8, 0xf1, 0x84, 0xc7, 0xc8, 0x18, 0x0f, 0xfd, 0xcf, 0xcb, 0xb0, - 0x82, 0xda, 0xbf, 0x63, 0xc1, 0x34, 0xef, 0xf9, 0x4d, 0xb2, 0xaf, 0xa4, 0xe3, 0x0f, 0xb3, 0xef, - 0x22, 0xb3, 0x41, 0x21, 0x27, 0xb3, 0x81, 0xfe, 0x69, 0xc5, 0x9e, 0x9f, 0xf6, 0x0b, 0x16, 0x88, - 0x15, 0x78, 0x0a, 0x72, 0xe0, 0x77, 0x9b, 0x72, 0xe0, 0x6c, 0xfe, 0xa2, 0xce, 0x11, 0x00, 0xff, - 0xd4, 0x82, 0x29, 0x8e, 0x90, 0x3c, 0x44, 0x7e, 0xa8, 0xf3, 0x30, 0x48, 0x8a, 0x32, 0x95, 0x93, - 0x38, 0xfb, 0xa3, 0x8c, 0xc9, 0x2a, 0xf5, 0x9c, 0xac, 0x96, 0xdc, 0x40, 0xc7, 0x48, 0xbd, 0x77, - 0xec, 0x08, 0xc1, 0xf6, 0x1f, 0x59, 0x80, 0x78, 0x33, 0xc6, 0xbd, 0x4c, 0x6f, 0x3b, 0x56, 0xaa, - 0x69, 0x82, 0x92, 0xa3, 0x46, 0x41, 0xb0, 0x86, 0x75, 0x22, 0xc3, 0x93, 0x7a, 0x4d, 0x2e, 0xf6, - 0x7f, 0x4d, 0x3e, 0xc6, 0x88, 0x7e, 0xbd, 0x04, 0x69, 0x4b, 0x70, 0x74, 0x17, 0xc6, 0x9a, 0x4e, - 0xdb, 0xd9, 0x74, 0x3d, 0x37, 0x76, 0x49, 0xd4, 0xcb, 0x0c, 0x65, 0x49, 0xc3, 0x13, 0xef, 0x84, - 0x5a, 0x09, 0x36, 0xe8, 0xa0, 0x39, 0x80, 0x76, 0xe8, 0xee, 0xb9, 0x1e, 0xd9, 0x66, 0xa2, 0x30, - 0xf3, 0x51, 0xe3, 0xb6, 0x15, 0xb2, 0x14, 0x6b, 0x18, 0x19, 0xee, 0x46, 0xc5, 0x47, 0xe7, 0x6e, - 0x54, 0x3a, 0xa6, 0xbb, 0xd1, 0xd0, 0x40, 0xee, 0x46, 0x18, 0xce, 0xcb, 0xbb, 0x9b, 0xfe, 0x5f, - 0x71, 0x3d, 0x22, 0x18, 0x36, 0xee, 0xb9, 0x36, 0x7b, 0x78, 0x50, 0x3d, 0x8f, 0x33, 0x31, 0x70, - 0x4e, 0x4d, 0xf4, 0x79, 0x98, 0x71, 0x3c, 0x2f, 0xb8, 0xaf, 0x46, 0x6d, 0x39, 0x6a, 0x3a, 0x1e, - 0x57, 0xf7, 0x8e, 0x30, 0xaa, 0x4f, 0x1c, 0x1e, 0x54, 0x67, 0x16, 0x72, 0x70, 0x70, 0x6e, 0xed, - 0x94, 0xb7, 0x52, 0xb9, 0xaf, 0xb7, 0xd2, 0x3d, 0x38, 0xd3, 0x20, 0xa1, 0xcb, 0x12, 0x03, 0xb6, - 0x92, 0x2d, 0xb9, 0x01, 0x95, 0x30, 0x75, 0x08, 0x0d, 0x14, 0xce, 0x46, 0x0b, 0x7e, 0x2a, 0x0f, - 0x9d, 0x84, 0x90, 0xfd, 0x27, 0x16, 0x8c, 0x08, 0x6b, 0xf4, 0x53, 0xe0, 0x7d, 0x16, 0x0c, 0xfd, - 0x65, 0x35, 0xfb, 0xa0, 0x66, 0x9d, 0xc9, 0xd5, 0x5c, 0xae, 0xa6, 0x34, 0x97, 0x4f, 0xf6, 0x22, - 0xd2, 0x5b, 0x67, 0xf9, 0x37, 0x8a, 0x30, 0x61, 0x5a, 0xe2, 0x9f, 0xc2, 0x10, 0xac, 0xc3, 0x48, - 0x24, 0xdc, 0x3e, 0x0a, 0xf9, 0x86, 0xb3, 0xe9, 0x49, 0x4c, 0xac, 0x62, 0x84, 0xa3, 0x87, 0x24, - 0x92, 0xe9, 0x4f, 0x52, 0x7c, 0x84, 0xfe, 0x24, 0xfd, 0x9c, 0x21, 0x4a, 0x27, 0xe1, 0x0c, 0x61, - 0x7f, 0x83, 0x5d, 0x16, 0x7a, 0xf9, 0x29, 0xf0, 0x11, 0xd7, 0xcd, 0x6b, 0xc5, 0xee, 0xb1, 0xb2, - 0x44, 0xa7, 0x72, 0xf8, 0x89, 0x5f, 0xb6, 0xe0, 0x62, 0xc6, 0x57, 0x69, 0xcc, 0xc5, 0x73, 0x50, - 0x76, 0x3a, 0x2d, 0x57, 0xed, 0x65, 0xed, 0x15, 0x63, 0x41, 0x94, 0x63, 0x85, 0x81, 0x96, 0x60, - 0x9a, 0x3c, 0x68, 0xbb, 0xfc, 0x19, 0x49, 0x37, 0x5d, 0x2b, 0xf2, 0xc0, 0x9e, 0xcb, 0x69, 0x20, - 0xee, 0xc6, 0x57, 0x4e, 0xb0, 0xc5, 0x5c, 0x27, 0xd8, 0x7f, 0x60, 0xc1, 0xa8, 0xe8, 0xf6, 0x29, - 0x8c, 0xf6, 0xf7, 0x98, 0xa3, 0xfd, 0x78, 0x8f, 0xd1, 0xce, 0x19, 0xe6, 0xbf, 0x55, 0x50, 0xfd, - 0xad, 0x07, 0x61, 0x3c, 0x00, 0xd3, 0xf2, 0x2a, 0x94, 0xa9, 0xd0, 0x1b, 0x34, 0x03, 0x4f, 0xf0, - 0x2c, 0x4f, 0x24, 0x3e, 0xda, 0xbc, 0xfc, 0x48, 0xfb, 0x8d, 0x15, 0x36, 0x1b, 0xbd, 0x20, 0x8c, - 0x05, 0x9f, 0x90, 0x8c, 0x5e, 0x10, 0xc6, 0x98, 0x41, 0x50, 0x0b, 0x20, 0x76, 0xc2, 0x6d, 0x12, - 0xd3, 0x32, 0x11, 0xee, 0x21, 0xff, 0xf0, 0xe8, 0xc4, 0xae, 0x37, 0xe7, 0xfa, 0x71, 0x14, 0x87, - 0x73, 0xab, 0x7e, 0x7c, 0x3b, 0xe4, 0x22, 0x90, 0xe6, 0x74, 0xad, 0x68, 0x61, 0x8d, 0xae, 0x74, - 0xb0, 0x63, 0x6d, 0x0c, 0x99, 0xef, 0xa1, 0xeb, 0xa2, 0x1c, 0x2b, 0x0c, 0xfb, 0x15, 0x76, 0x95, - 0xb0, 0x01, 0x3a, 0x9e, 0x3f, 0xf4, 0x37, 0xcb, 0x6a, 0x68, 0xd9, 0x63, 0x48, 0x4d, 0xf7, 0xba, - 0xee, 0x7d, 0x72, 0xd3, 0x86, 0x75, 0x37, 0x8a, 0xc4, 0x35, 0x1b, 0x7d, 0x6f, 0xd7, 0x33, 0xf9, - 0xf3, 0x7d, 0xae, 0x80, 0x63, 0x3c, 0x8c, 0xb3, 0x60, 0xc3, 0x2c, 0x28, 0xeb, 0x6a, 0x5d, 0x2c, - 0x72, 0x2d, 0xd8, 0xb0, 0x00, 0xe0, 0x04, 0x07, 0xcd, 0x0b, 0x01, 0xba, 0x64, 0xe4, 0x04, 0x93, - 0x02, 0xb4, 0xfc, 0x7c, 0x4d, 0x82, 0x7e, 0x01, 0x46, 0x55, 0x6e, 0xb0, 0x3a, 0x4f, 0xb1, 0x24, - 0x82, 0x5f, 0x2c, 0x27, 0xc5, 0x58, 0xc7, 0x41, 0x1b, 0x30, 0x19, 0xf1, 0x2c, 0x69, 0x2a, 0xc6, - 0x19, 0x57, 0x8f, 0x7c, 0x52, 0x3e, 0xaf, 0x37, 0x4c, 0xf0, 0x11, 0x2b, 0xe2, 0x47, 0x87, 0xf4, - 0x92, 0x4b, 0x93, 0x40, 0xaf, 0xc3, 0x84, 0xa7, 0x67, 0xd8, 0xae, 0x0b, 0xed, 0x89, 0xb2, 0x3e, - 0x35, 0xf2, 0x6f, 0xd7, 0x71, 0x0a, 0x9b, 0xf2, 0x3a, 0x7a, 0x89, 0x88, 0xcb, 0xe7, 0xf8, 0xdb, - 0x24, 0x12, 0x99, 0x8d, 0x18, 0xaf, 0x73, 0x2b, 0x07, 0x07, 0xe7, 0xd6, 0x46, 0xaf, 0xc2, 0x98, - 0xfc, 0x7c, 0xcd, 0x07, 0x34, 0xb1, 0x71, 0xd6, 0x60, 0xd8, 0xc0, 0x44, 0xf7, 0xe1, 0x9c, 0xfc, - 0xbf, 0x11, 0x3a, 0x5b, 0x5b, 0x6e, 0x53, 0xb8, 0xe0, 0x72, 0x47, 0x8f, 0x05, 0xe9, 0x39, 0xb2, - 0x9c, 0x85, 0x74, 0x74, 0x50, 0xbd, 0x2c, 0x46, 0x2d, 0x13, 0xce, 0x26, 0x31, 0x9b, 0x3e, 0x5a, - 0x83, 0x33, 0x3b, 0xc4, 0xf1, 0xe2, 0x9d, 0xa5, 0x1d, 0xd2, 0xbc, 0x27, 0x37, 0x11, 0xf3, 0x2c, - 0xd5, 0x2c, 0x83, 0x6f, 0x74, 0xa3, 0xe0, 0xac, 0x7a, 0xe8, 0x6d, 0x98, 0x69, 0x77, 0x36, 0x3d, - 0x37, 0xda, 0x59, 0x0f, 0x62, 0xf6, 0xa2, 0xaf, 0x52, 0x6b, 0x09, 0x17, 0x54, 0xe5, 0x55, 0x5b, - 0xcf, 0xc1, 0xc3, 0xb9, 0x14, 0xd0, 0x7b, 0x70, 0x2e, 0xb5, 0x18, 0x84, 0x43, 0xdc, 0x44, 0x7e, - 0x94, 0xd3, 0x46, 0x56, 0x05, 0xe1, 0xe0, 0x96, 0x05, 0xc2, 0xd9, 0x4d, 0x7c, 0x30, 0x3b, 0x8f, - 0x77, 0x69, 0x65, 0x8d, 0x29, 0x43, 0x5f, 0x81, 0x31, 0x7d, 0x15, 0x89, 0x0b, 0xe6, 0x4a, 0xbf, - 0x6c, 0xf2, 0x82, 0xa5, 0x53, 0x2b, 0x4a, 0x87, 0x61, 0x83, 0xa2, 0x4d, 0x20, 0xfb, 0xfb, 0xd0, - 0x2d, 0x28, 0x37, 0x3d, 0x97, 0xf8, 0xf1, 0x6a, 0xbd, 0x57, 0xa8, 0x85, 0x25, 0x81, 0x23, 0x06, - 0x4c, 0x84, 0x85, 0xe4, 0x65, 0x58, 0x51, 0xb0, 0x7f, 0xa3, 0x00, 0xd5, 0x3e, 0x31, 0x46, 0x53, - 0xaa, 0x4e, 0x6b, 0x20, 0x55, 0xe7, 0x82, 0x4c, 0x14, 0xb6, 0x9e, 0x12, 0xb3, 0x53, 0x49, 0xc0, - 0x12, 0x61, 0x3b, 0x8d, 0x3f, 0xb0, 0x79, 0xa8, 0xae, 0x2d, 0x2d, 0xf5, 0x35, 0x5c, 0x36, 0x5e, - 0x49, 0x86, 0x06, 0x17, 0x44, 0x72, 0x35, 0xde, 0xf6, 0x37, 0x0a, 0x70, 0x4e, 0x0d, 0xe1, 0xb7, - 0xef, 0xc0, 0xdd, 0xe9, 0x1e, 0xb8, 0x13, 0x78, 0x2f, 0xb0, 0x6f, 0xc3, 0x70, 0x63, 0x3f, 0x6a, - 0xc6, 0xde, 0x00, 0x0c, 0xd0, 0x53, 0x66, 0x5c, 0x23, 0x75, 0x4d, 0x1b, 0xb1, 0x8d, 0xfe, 0x92, - 0x05, 0x93, 0x1b, 0x4b, 0xf5, 0x46, 0xd0, 0xbc, 0x47, 0xe2, 0x05, 0xce, 0xb0, 0x62, 0xc1, 0xff, - 0x58, 0x0f, 0xc9, 0xd7, 0x64, 0x71, 0x4c, 0x97, 0xa1, 0xb4, 0x13, 0x44, 0x71, 0xfa, 0x31, 0xf1, - 0x46, 0x10, 0xc5, 0x98, 0x41, 0xec, 0xdf, 0xb5, 0x60, 0x88, 0xa5, 0xb7, 0xec, 0x97, 0x73, 0x75, - 0x90, 0xef, 0x42, 0x2f, 0xc3, 0x30, 0xd9, 0xda, 0x22, 0xcd, 0x58, 0xcc, 0xaa, 0xf4, 0x46, 0x1c, - 0x5e, 0x66, 0xa5, 0xf4, 0xd2, 0x67, 0x8d, 0xf1, 0xbf, 0x58, 0x20, 0xa3, 0xb7, 0xa0, 0x12, 0xbb, - 0xbb, 0x64, 0xa1, 0xd5, 0x12, 0xcf, 0x31, 0x0f, 0xe1, 0xfc, 0xb9, 0x21, 0x09, 0xe0, 0x84, 0x96, - 0xfd, 0xd5, 0x02, 0x40, 0xe2, 0xb7, 0xdd, 0xef, 0x13, 0x17, 0xbb, 0xd2, 0xca, 0x5e, 0xc9, 0x48, - 0x2b, 0x8b, 0x12, 0x82, 0x19, 0x49, 0x65, 0xd5, 0x30, 0x15, 0x07, 0x1a, 0xa6, 0xd2, 0x71, 0x86, - 0x69, 0x09, 0xa6, 0x13, 0xbf, 0x73, 0x33, 0x08, 0x07, 0x13, 0x52, 0x36, 0xd2, 0x40, 0xdc, 0x8d, - 0x6f, 0xff, 0x90, 0x05, 0xc2, 0xab, 0x62, 0x80, 0xc5, 0xfc, 0x45, 0x99, 0x94, 0xd1, 0x08, 0x55, - 0x7c, 0x39, 0xdf, 0xcd, 0x44, 0x04, 0x28, 0x56, 0x97, 0x87, 0x11, 0x96, 0xd8, 0xa0, 0x65, 0xb7, - 0x40, 0x40, 0x6b, 0x84, 0xe9, 0x46, 0xfa, 0xf7, 0xe6, 0x1a, 0x40, 0x8b, 0xe1, 0x6a, 0xa9, 0xd9, - 0xd4, 0x51, 0x55, 0x53, 0x10, 0xac, 0x61, 0xd9, 0x3f, 0x5e, 0x80, 0x51, 0x19, 0x1a, 0xb7, 0xe3, - 0x0f, 0x22, 0xc1, 0x1c, 0x2b, 0x43, 0x06, 0xcb, 0x65, 0x48, 0x09, 0xd7, 0x13, 0xc1, 0x2f, 0xc9, - 0x65, 0x28, 0x01, 0x38, 0xc1, 0x41, 0xcf, 0xc0, 0x48, 0xd4, 0xd9, 0x64, 0xe8, 0x29, 0x5f, 0x81, - 0x06, 0x2f, 0xc6, 0x12, 0x8e, 0x3e, 0x0f, 0x53, 0xbc, 0x5e, 0x18, 0xb4, 0x9d, 0x6d, 0xae, 0x28, - 0x1b, 0x52, 0xce, 0x7b, 0x53, 0x6b, 0x29, 0xd8, 0xd1, 0x41, 0xf5, 0x6c, 0xba, 0x8c, 0xa9, 0x58, - 0xbb, 0xa8, 0xd8, 0x5f, 0x01, 0xd4, 0x1d, 0xed, 0x17, 0xbd, 0xc1, 0xad, 0x41, 0xdc, 0x50, 0xa5, - 0x62, 0xbf, 0xdc, 0xcf, 0xd7, 0x4c, 0xda, 0xeb, 0xf2, 0x5a, 0x58, 0xd5, 0xb7, 0xff, 0x4a, 0x11, - 0xa6, 0xd2, 0x9e, 0x47, 0xe8, 0x06, 0x0c, 0xf3, 0x43, 0xb5, 0x57, 0xa6, 0xf7, 0xf4, 0x33, 0x01, - 0x4f, 0x45, 0x20, 0xce, 0x65, 0x51, 0x1f, 0xbd, 0x0d, 0xa3, 0xad, 0xe0, 0xbe, 0x7f, 0xdf, 0x09, - 0x5b, 0x0b, 0xf5, 0x55, 0xb1, 0x2e, 0x33, 0x79, 0xb3, 0x5a, 0x82, 0xa6, 0xfb, 0x40, 0x31, 0x35, - 0x74, 0x02, 0xc2, 0x3a, 0x39, 0xb4, 0xa1, 0x27, 0xc1, 0xef, 0x61, 0xbe, 0xa7, 0xb2, 0xdc, 0x6b, - 0x94, 0x73, 0xd3, 0xdf, 0xa3, 0xef, 0x87, 0x33, 0x51, 0x8e, 0x3a, 0x27, 0x2f, 0xf8, 0x7b, 0x2f, - 0x0d, 0xc7, 0xe2, 0x63, 0x94, 0x6b, 0xce, 0x52, 0xfc, 0x64, 0x35, 0x63, 0xbf, 0x7f, 0x06, 0x8c, - 0xdd, 0x68, 0x64, 0x00, 0xb1, 0x4e, 0x28, 0x03, 0x08, 0x86, 0x32, 0xd9, 0x6d, 0xc7, 0xfb, 0x35, - 0x37, 0xec, 0x95, 0x42, 0x6a, 0x59, 0xe0, 0x74, 0xd3, 0x94, 0x10, 0xac, 0xe8, 0x64, 0xa7, 0x69, - 0x29, 0x7e, 0x88, 0x69, 0x5a, 0x4a, 0xa7, 0x98, 0xa6, 0x65, 0x1d, 0x46, 0xb6, 0xdd, 0x18, 0x93, - 0x76, 0x20, 0xd8, 0x99, 0xcc, 0x75, 0x78, 0x9d, 0xa3, 0x74, 0xa7, 0x06, 0x10, 0x00, 0x2c, 0x89, - 0xa0, 0x37, 0xd4, 0x0e, 0x1c, 0xce, 0x97, 0x06, 0xba, 0xdf, 0x90, 0x32, 0xf7, 0xa0, 0x48, 0xcb, - 0x32, 0xf2, 0xb0, 0x69, 0x59, 0x56, 0x64, 0x32, 0x95, 0x72, 0xbe, 0xad, 0x2d, 0xcb, 0x95, 0xd2, - 0x27, 0x85, 0x8a, 0x91, 0x76, 0xa6, 0x72, 0x72, 0x69, 0x67, 0x7e, 0xc8, 0x82, 0x73, 0xed, 0xac, - 0x0c, 0x4c, 0x22, 0x05, 0xca, 0xcb, 0x03, 0xa7, 0x98, 0x32, 0x1a, 0x64, 0x62, 0x61, 0x26, 0x1a, - 0xce, 0x6e, 0x8e, 0x0e, 0x74, 0xb8, 0xd9, 0x12, 0x79, 0x53, 0x9e, 0xca, 0xc9, 0x5f, 0xd3, 0x23, - 0x6b, 0xcd, 0x46, 0x46, 0xae, 0x94, 0x8f, 0xe7, 0xe5, 0x4a, 0x19, 0x38, 0x43, 0xca, 0x1b, 0x2a, - 0x73, 0xcd, 0x78, 0xfe, 0x52, 0xe2, 0x79, 0x69, 0xfa, 0xe6, 0xab, 0x79, 0x43, 0xe5, 0xab, 0xe9, - 0x11, 0x10, 0x8a, 0x67, 0xa3, 0xe9, 0x9b, 0xa5, 0x46, 0xcb, 0x34, 0x33, 0x79, 0x32, 0x99, 0x66, - 0x8c, 0xab, 0x86, 0x27, 0x3b, 0x79, 0xb6, 0xcf, 0x55, 0x63, 0xd0, 0xed, 0x7d, 0xd9, 0xf0, 0xac, - 0x3a, 0xd3, 0x0f, 0x95, 0x55, 0xe7, 0xae, 0x9e, 0xa5, 0x06, 0xf5, 0x49, 0xc3, 0x42, 0x91, 0x06, - 0xcc, 0x4d, 0x73, 0x57, 0xbf, 0x00, 0xcf, 0xe4, 0xd3, 0x55, 0xf7, 0x5c, 0x37, 0xdd, 0xcc, 0x2b, - 0xb0, 0x2b, 0xe7, 0xcd, 0xd9, 0xd3, 0xc9, 0x79, 0x73, 0xee, 0xc4, 0x73, 0xde, 0x9c, 0x3f, 0x85, - 0x9c, 0x37, 0x8f, 0x7d, 0xa8, 0x39, 0x6f, 0x66, 0x1e, 0x41, 0xce, 0x9b, 0xf5, 0x24, 0xe7, 0xcd, - 0x85, 0xfc, 0x29, 0xc9, 0x30, 0x2e, 0xcc, 0xc9, 0x74, 0x73, 0x17, 0x2a, 0x6d, 0xe9, 0x1a, 0x2f, - 0x22, 0x56, 0x65, 0xa7, 0xdd, 0xcc, 0xf2, 0x9f, 0xe7, 0x53, 0xa2, 0x40, 0x38, 0x21, 0x45, 0xe9, - 0x26, 0x99, 0x6f, 0x1e, 0xef, 0xa1, 0xf8, 0xcb, 0x52, 0xa9, 0xe4, 0xe7, 0xbb, 0xb1, 0xff, 0x72, - 0x01, 0x2e, 0xf5, 0x5e, 0xd7, 0x89, 0x3e, 0xa6, 0x9e, 0xbc, 0x1f, 0xa4, 0xf4, 0x31, 0x5c, 0xc8, - 0x49, 0xb0, 0x06, 0x8e, 0x1f, 0x72, 0x1d, 0xa6, 0x95, 0x55, 0xa1, 0xe7, 0x36, 0xf7, 0xb5, 0x74, - 0x9c, 0xca, 0xc3, 0xa9, 0x91, 0x46, 0xc0, 0xdd, 0x75, 0xd0, 0x02, 0x4c, 0x1a, 0x85, 0xab, 0x35, - 0x21, 0xcc, 0x28, 0x05, 0x50, 0xc3, 0x04, 0xe3, 0x34, 0xbe, 0xfd, 0x35, 0x0b, 0x1e, 0xcb, 0x09, - 0x07, 0x3f, 0x70, 0x78, 0x8c, 0x2d, 0x98, 0x6c, 0x9b, 0x55, 0xfb, 0x44, 0xd1, 0x31, 0x82, 0xce, - 0xab, 0xbe, 0xa6, 0x00, 0x38, 0x4d, 0x74, 0xf1, 0xea, 0x6f, 0xfd, 0xfe, 0xa5, 0x8f, 0xfd, 0xf6, - 0xef, 0x5f, 0xfa, 0xd8, 0xef, 0xfc, 0xfe, 0xa5, 0x8f, 0xfd, 0x7f, 0x87, 0x97, 0xac, 0xdf, 0x3a, - 0xbc, 0x64, 0xfd, 0xf6, 0xe1, 0x25, 0xeb, 0x77, 0x0e, 0x2f, 0x59, 0xbf, 0x77, 0x78, 0xc9, 0xfa, - 0xea, 0x1f, 0x5c, 0xfa, 0xd8, 0x17, 0x0b, 0x7b, 0x2f, 0xfc, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xf3, 0x2c, 0x48, 0x69, 0xb7, 0xe2, 0x00, 0x00, + // 12615 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6b, 0x6c, 0x24, 0x47, + 0x7a, 0xd8, 0xf5, 0xcc, 0xf0, 0x31, 0x1f, 0xdf, 0xb5, 0x0f, 0x71, 0x29, 0xed, 0xce, 0xaa, 0x75, + 0xb7, 0x5a, 0x9d, 0x24, 0xf2, 0xb4, 0x92, 0x4e, 0xeb, 0xd3, 0x9d, 0x6c, 0x92, 0x43, 0xee, 0x52, + 0xbb, 0xe4, 0x8e, 0x6a, 0xb8, 0xbb, 0x77, 0xb2, 0xee, 0x7c, 0xcd, 0x99, 0x22, 0xd9, 0x62, 0xb3, + 0x7b, 0xd4, 0xdd, 0xc3, 0x5d, 0x2a, 0x36, 0x90, 0x9c, 0x63, 0x27, 0x7e, 0x20, 0x38, 0xc4, 0x46, + 0x1e, 0xb6, 0xe1, 0x00, 0x89, 0x03, 0xdb, 0x71, 0x12, 0xc4, 0xb1, 0x63, 0x3b, 0x77, 0x4e, 0xe2, + 0x38, 0xf9, 0xe1, 0xfc, 0xb9, 0x38, 0x01, 0x82, 0x33, 0x60, 0x84, 0xb1, 0x69, 0x27, 0x81, 0x7f, + 0xe4, 0x81, 0x38, 0x08, 0x60, 0xc6, 0x88, 0x83, 0x7a, 0x76, 0x55, 0x4f, 0xf7, 0xcc, 0x70, 0xc5, + 0xa5, 0x64, 0xe3, 0xfe, 0xcd, 0xd4, 0xf7, 0xd5, 0x57, 0xd5, 0xf5, 0xfc, 0xbe, 0xaf, 0xbe, 0x07, + 0xbc, 0xbe, 0x73, 0x3d, 0x9a, 0x75, 0x83, 0xb9, 0x9d, 0xf6, 0x06, 0x09, 0x7d, 0x12, 0x93, 0x68, + 0x6e, 0x8f, 0xf8, 0xcd, 0x20, 0x9c, 0x13, 0x00, 0xa7, 0xe5, 0xce, 0x35, 0x82, 0x90, 0xcc, 0xed, + 0xbd, 0x34, 0xb7, 0x45, 0x7c, 0x12, 0x3a, 0x31, 0x69, 0xce, 0xb6, 0xc2, 0x20, 0x0e, 0x10, 0xe2, + 0x38, 0xb3, 0x4e, 0xcb, 0x9d, 0xa5, 0x38, 0xb3, 0x7b, 0x2f, 0xcd, 0xbc, 0xb8, 0xe5, 0xc6, 0xdb, + 0xed, 0x8d, 0xd9, 0x46, 0xb0, 0x3b, 0xb7, 0x15, 0x6c, 0x05, 0x73, 0x0c, 0x75, 0xa3, 0xbd, 0xc9, + 0xfe, 0xb1, 0x3f, 0xec, 0x17, 0x27, 0x31, 0xb3, 0x9a, 0x34, 0x43, 0x1e, 0xc6, 0xc4, 0x8f, 0xdc, + 0xc0, 0x8f, 0x5e, 0x74, 0x5a, 0x6e, 0x44, 0xc2, 0x3d, 0x12, 0xce, 0xb5, 0x76, 0xb6, 0x28, 0x2c, + 0x32, 0x11, 0xe6, 0xf6, 0x5e, 0xda, 0x20, 0xb1, 0xd3, 0xd1, 0xa3, 0x99, 0x57, 0x12, 0x72, 0xbb, + 0x4e, 0x63, 0xdb, 0xf5, 0x49, 0xb8, 0x2f, 0x69, 0xcc, 0x85, 0x24, 0x0a, 0xda, 0x61, 0x83, 0x1c, + 0xab, 0x56, 0x34, 0xb7, 0x4b, 0x62, 0x27, 0xe3, 0xeb, 0x67, 0xe6, 0xf2, 0x6a, 0x85, 0x6d, 0x3f, + 0x76, 0x77, 0x3b, 0x9b, 0xf9, 0x74, 0xaf, 0x0a, 0x51, 0x63, 0x9b, 0xec, 0x3a, 0x1d, 0xf5, 0x5e, + 0xce, 0xab, 0xd7, 0x8e, 0x5d, 0x6f, 0xce, 0xf5, 0xe3, 0x28, 0x0e, 0xd3, 0x95, 0xec, 0x6f, 0x5a, + 0x70, 0x79, 0xfe, 0x7e, 0x7d, 0xc9, 0x73, 0xa2, 0xd8, 0x6d, 0x2c, 0x78, 0x41, 0x63, 0xa7, 0x1e, + 0x07, 0x21, 0xb9, 0x17, 0x78, 0xed, 0x5d, 0x52, 0x67, 0x03, 0x81, 0x5e, 0x80, 0xe1, 0x3d, 0xf6, + 0x7f, 0xa5, 0x3a, 0x6d, 0x5d, 0xb6, 0xae, 0x96, 0x17, 0x26, 0x7f, 0xe3, 0xa0, 0xf2, 0xb1, 0xc3, + 0x83, 0xca, 0xf0, 0x3d, 0x51, 0x8e, 0x15, 0x06, 0xba, 0x02, 0x83, 0x9b, 0xd1, 0xfa, 0x7e, 0x8b, + 0x4c, 0x17, 0x18, 0xee, 0xb8, 0xc0, 0x1d, 0x5c, 0xae, 0xd3, 0x52, 0x2c, 0xa0, 0x68, 0x0e, 0xca, + 0x2d, 0x27, 0x8c, 0xdd, 0xd8, 0x0d, 0xfc, 0xe9, 0xe2, 0x65, 0xeb, 0xea, 0xc0, 0xc2, 0x94, 0x40, + 0x2d, 0xd7, 0x24, 0x00, 0x27, 0x38, 0xb4, 0x1b, 0x21, 0x71, 0x9a, 0x77, 0x7c, 0x6f, 0x7f, 0xba, + 0x74, 0xd9, 0xba, 0x3a, 0x9c, 0x74, 0x03, 0x8b, 0x72, 0xac, 0x30, 0xec, 0x1f, 0x2b, 0xc0, 0xf0, + 0xfc, 0xe6, 0xa6, 0xeb, 0xbb, 0xf1, 0x3e, 0xba, 0x07, 0xa3, 0x7e, 0xd0, 0x24, 0xf2, 0x3f, 0xfb, + 0x8a, 0x91, 0x6b, 0x97, 0x67, 0x3b, 0x57, 0xe6, 0xec, 0x9a, 0x86, 0xb7, 0x30, 0x79, 0x78, 0x50, + 0x19, 0xd5, 0x4b, 0xb0, 0x41, 0x07, 0x61, 0x18, 0x69, 0x05, 0x4d, 0x45, 0xb6, 0xc0, 0xc8, 0x56, + 0xb2, 0xc8, 0xd6, 0x12, 0xb4, 0x85, 0x89, 0xc3, 0x83, 0xca, 0x88, 0x56, 0x80, 0x75, 0x22, 0x68, + 0x03, 0x26, 0xe8, 0x5f, 0x3f, 0x76, 0x15, 0xdd, 0x22, 0xa3, 0xfb, 0x4c, 0x1e, 0x5d, 0x0d, 0x75, + 0xe1, 0xcc, 0xe1, 0x41, 0x65, 0x22, 0x55, 0x88, 0xd3, 0x04, 0xed, 0xf7, 0x61, 0x7c, 0x3e, 0x8e, + 0x9d, 0xc6, 0x36, 0x69, 0xf2, 0x19, 0x44, 0xaf, 0x40, 0xc9, 0x77, 0x76, 0x89, 0x98, 0xdf, 0xcb, + 0x62, 0x60, 0x4b, 0x6b, 0xce, 0x2e, 0x39, 0x3a, 0xa8, 0x4c, 0xde, 0xf5, 0xdd, 0xf7, 0xda, 0x62, + 0x55, 0xd0, 0x32, 0xcc, 0xb0, 0xd1, 0x35, 0x80, 0x26, 0xd9, 0x73, 0x1b, 0xa4, 0xe6, 0xc4, 0xdb, + 0x62, 0xbe, 0x91, 0xa8, 0x0b, 0x55, 0x05, 0xc1, 0x1a, 0x96, 0xfd, 0x10, 0xca, 0xf3, 0x7b, 0x81, + 0xdb, 0xac, 0x05, 0xcd, 0x08, 0xed, 0xc0, 0x44, 0x2b, 0x24, 0x9b, 0x24, 0x54, 0x45, 0xd3, 0xd6, + 0xe5, 0xe2, 0xd5, 0x91, 0x6b, 0x57, 0x33, 0x3f, 0xd6, 0x44, 0x5d, 0xf2, 0xe3, 0x70, 0x7f, 0xe1, + 0x09, 0xd1, 0xde, 0x44, 0x0a, 0x8a, 0xd3, 0x94, 0xed, 0x7f, 0x5d, 0x80, 0x73, 0xf3, 0xef, 0xb7, + 0x43, 0x52, 0x75, 0xa3, 0x9d, 0xf4, 0x0a, 0x6f, 0xba, 0xd1, 0xce, 0x5a, 0x32, 0x02, 0x6a, 0x69, + 0x55, 0x45, 0x39, 0x56, 0x18, 0xe8, 0x45, 0x18, 0xa2, 0xbf, 0xef, 0xe2, 0x15, 0xf1, 0xc9, 0x67, + 0x04, 0xf2, 0x48, 0xd5, 0x89, 0x9d, 0x2a, 0x07, 0x61, 0x89, 0x83, 0x56, 0x61, 0xa4, 0xc1, 0x36, + 0xe4, 0xd6, 0x6a, 0xd0, 0x24, 0x6c, 0x32, 0xcb, 0x0b, 0xcf, 0x53, 0xf4, 0xc5, 0xa4, 0xf8, 0xe8, + 0xa0, 0x32, 0xcd, 0xfb, 0x26, 0x48, 0x68, 0x30, 0xac, 0xd7, 0x47, 0xb6, 0xda, 0x5f, 0x25, 0x46, + 0x09, 0x32, 0xf6, 0xd6, 0x55, 0x6d, 0xab, 0x0c, 0xb0, 0xad, 0x32, 0x9a, 0xbd, 0x4d, 0xd0, 0x4b, + 0x50, 0xda, 0x71, 0xfd, 0xe6, 0xf4, 0x20, 0xa3, 0x75, 0x91, 0xce, 0xf9, 0x2d, 0xd7, 0x6f, 0x1e, + 0x1d, 0x54, 0xa6, 0x8c, 0xee, 0xd0, 0x42, 0xcc, 0x50, 0xed, 0x3f, 0xb4, 0xa0, 0xc2, 0x60, 0xcb, + 0xae, 0x47, 0x6a, 0x24, 0x8c, 0xdc, 0x28, 0x26, 0x7e, 0x6c, 0x0c, 0xe8, 0x35, 0x80, 0x88, 0x34, + 0x42, 0x12, 0x6b, 0x43, 0xaa, 0x16, 0x46, 0x5d, 0x41, 0xb0, 0x86, 0x45, 0x0f, 0x84, 0x68, 0xdb, + 0x09, 0xd9, 0xfa, 0x12, 0x03, 0xab, 0x0e, 0x84, 0xba, 0x04, 0xe0, 0x04, 0xc7, 0x38, 0x10, 0x8a, + 0xbd, 0x0e, 0x04, 0xf4, 0x39, 0x98, 0x48, 0x1a, 0x8b, 0x5a, 0x4e, 0x43, 0x0e, 0x20, 0xdb, 0x32, + 0x75, 0x13, 0x84, 0xd3, 0xb8, 0xf6, 0xdf, 0xb3, 0xc4, 0xe2, 0xa1, 0x5f, 0xfd, 0x11, 0xff, 0x56, + 0xfb, 0x57, 0x2c, 0x18, 0x5a, 0x70, 0xfd, 0xa6, 0xeb, 0x6f, 0xa1, 0x2f, 0xc3, 0x30, 0xbd, 0x9b, + 0x9a, 0x4e, 0xec, 0x88, 0x73, 0xef, 0x53, 0xda, 0xde, 0x52, 0x57, 0xc5, 0x6c, 0x6b, 0x67, 0x8b, + 0x16, 0x44, 0xb3, 0x14, 0x9b, 0xee, 0xb6, 0x3b, 0x1b, 0xef, 0x92, 0x46, 0xbc, 0x4a, 0x62, 0x27, + 0xf9, 0x9c, 0xa4, 0x0c, 0x2b, 0xaa, 0xe8, 0x16, 0x0c, 0xc6, 0x4e, 0xb8, 0x45, 0x62, 0x71, 0x00, + 0x66, 0x1e, 0x54, 0xbc, 0x26, 0xa6, 0x3b, 0x92, 0xf8, 0x0d, 0x92, 0x5c, 0x0b, 0xeb, 0xac, 0x2a, + 0x16, 0x24, 0xec, 0x1f, 0x1c, 0x84, 0x0b, 0x8b, 0xf5, 0x95, 0x9c, 0x75, 0x75, 0x05, 0x06, 0x9b, + 0xa1, 0xbb, 0x47, 0x42, 0x31, 0xce, 0x8a, 0x4a, 0x95, 0x95, 0x62, 0x01, 0x45, 0xd7, 0x61, 0x94, + 0x5f, 0x48, 0x37, 0x1d, 0xbf, 0xe9, 0xc9, 0x21, 0x3e, 0x2b, 0xb0, 0x47, 0xef, 0x69, 0x30, 0x6c, + 0x60, 0x1e, 0x73, 0x51, 0x5d, 0x49, 0x6d, 0xc6, 0xbc, 0xcb, 0xee, 0x07, 0x2c, 0x98, 0xe4, 0xcd, + 0xcc, 0xc7, 0x71, 0xe8, 0x6e, 0xb4, 0x63, 0x12, 0x4d, 0x0f, 0xb0, 0x93, 0x6e, 0x31, 0x6b, 0xb4, + 0x72, 0x47, 0x60, 0xf6, 0x5e, 0x8a, 0x0a, 0x3f, 0x04, 0xa7, 0x45, 0xbb, 0x93, 0x69, 0x30, 0xee, + 0x68, 0x16, 0x7d, 0xaf, 0x05, 0x33, 0x8d, 0xc0, 0x8f, 0xc3, 0xc0, 0xf3, 0x48, 0x58, 0x6b, 0x6f, + 0x78, 0x6e, 0xb4, 0xcd, 0xd7, 0x29, 0x26, 0x9b, 0xec, 0x24, 0xc8, 0x99, 0x43, 0x85, 0x24, 0xe6, + 0xf0, 0xd2, 0xe1, 0x41, 0x65, 0x66, 0x31, 0x97, 0x14, 0xee, 0xd2, 0x0c, 0xda, 0x01, 0x44, 0xaf, + 0xd2, 0x7a, 0xec, 0x6c, 0x91, 0xa4, 0xf1, 0xa1, 0xfe, 0x1b, 0x3f, 0x7f, 0x78, 0x50, 0x41, 0x6b, + 0x1d, 0x24, 0x70, 0x06, 0x59, 0xf4, 0x1e, 0x9c, 0xa5, 0xa5, 0x1d, 0xdf, 0x3a, 0xdc, 0x7f, 0x73, + 0xd3, 0x87, 0x07, 0x95, 0xb3, 0x6b, 0x19, 0x44, 0x70, 0x26, 0xe9, 0x99, 0x45, 0x38, 0x97, 0x39, + 0x55, 0x68, 0x12, 0x8a, 0x3b, 0x84, 0xb3, 0x20, 0x65, 0x4c, 0x7f, 0xa2, 0xb3, 0x30, 0xb0, 0xe7, + 0x78, 0x6d, 0xb1, 0x4a, 0x31, 0xff, 0xf3, 0x99, 0xc2, 0x75, 0xcb, 0x6e, 0xc0, 0xe8, 0xa2, 0xd3, + 0x72, 0x36, 0x5c, 0xcf, 0x8d, 0x5d, 0x12, 0xa1, 0x67, 0xa1, 0xe8, 0x34, 0x9b, 0xec, 0x8a, 0x2c, + 0x2f, 0x9c, 0x3b, 0x3c, 0xa8, 0x14, 0xe7, 0x9b, 0xf4, 0xac, 0x06, 0x85, 0xb5, 0x8f, 0x29, 0x06, + 0xfa, 0x24, 0x94, 0x9a, 0x61, 0xd0, 0x9a, 0x2e, 0x30, 0x4c, 0x3a, 0x54, 0xa5, 0x6a, 0x18, 0xb4, + 0x52, 0xa8, 0x0c, 0xc7, 0xfe, 0xb5, 0x02, 0x3c, 0xb5, 0x48, 0x5a, 0xdb, 0xcb, 0xf5, 0x9c, 0x4d, + 0x77, 0x15, 0x86, 0x77, 0x03, 0xdf, 0x8d, 0x83, 0x30, 0x12, 0x4d, 0xb3, 0xdb, 0x64, 0x55, 0x94, + 0x61, 0x05, 0x45, 0x97, 0xa1, 0xd4, 0x4a, 0x38, 0x81, 0x51, 0xc9, 0x45, 0x30, 0x1e, 0x80, 0x41, + 0x28, 0x46, 0x3b, 0x22, 0xa1, 0xb8, 0x05, 0x15, 0xc6, 0xdd, 0x88, 0x84, 0x98, 0x41, 0x92, 0xe3, + 0x94, 0x1e, 0xb4, 0x62, 0x5b, 0xa5, 0x8e, 0x53, 0x0a, 0xc1, 0x1a, 0x16, 0xaa, 0x41, 0x39, 0x52, + 0x93, 0x3a, 0xd0, 0xff, 0xa4, 0x8e, 0xb1, 0xf3, 0x56, 0xcd, 0x64, 0x42, 0xc4, 0x38, 0x06, 0x06, + 0x7b, 0x9e, 0xb7, 0x5f, 0x2f, 0x00, 0xe2, 0x43, 0xf8, 0xa7, 0x6c, 0xe0, 0xee, 0x76, 0x0e, 0x5c, + 0x26, 0xe7, 0x75, 0x3b, 0x68, 0x38, 0x5e, 0xfa, 0x08, 0x3f, 0xa9, 0xd1, 0xfb, 0xdf, 0x16, 0x3c, + 0xb5, 0xe8, 0xfa, 0x4d, 0x12, 0xe6, 0x2c, 0xc0, 0xc7, 0x23, 0x80, 0x1c, 0xef, 0xa4, 0x37, 0x96, + 0x58, 0xe9, 0x04, 0x96, 0x98, 0xfd, 0x3f, 0x2c, 0x40, 0xfc, 0xb3, 0x3f, 0x72, 0x1f, 0x7b, 0xb7, + 0xf3, 0x63, 0x4f, 0x60, 0x59, 0xd8, 0xb7, 0x61, 0x7c, 0xd1, 0x73, 0x89, 0x1f, 0xaf, 0xd4, 0x16, + 0x03, 0x7f, 0xd3, 0xdd, 0x42, 0x9f, 0x81, 0x71, 0x2a, 0xd3, 0x06, 0xed, 0xb8, 0x4e, 0x1a, 0x81, + 0xcf, 0xd8, 0x7f, 0x2a, 0x09, 0xa2, 0xc3, 0x83, 0xca, 0xf8, 0xba, 0x01, 0xc1, 0x29, 0x4c, 0xfb, + 0xb7, 0xe9, 0xf8, 0x05, 0xbb, 0xad, 0xc0, 0x27, 0x7e, 0xbc, 0x18, 0xf8, 0x4d, 0x2e, 0x26, 0x7e, + 0x06, 0x4a, 0x31, 0x1d, 0x0f, 0x3e, 0x76, 0x57, 0xe4, 0x46, 0xa1, 0xa3, 0x70, 0x74, 0x50, 0x39, + 0xdf, 0x59, 0x83, 0x8d, 0x13, 0xab, 0x83, 0xbe, 0x0d, 0x06, 0xa3, 0xd8, 0x89, 0xdb, 0x91, 0x18, + 0xcd, 0xa7, 0xe5, 0x68, 0xd6, 0x59, 0xe9, 0xd1, 0x41, 0x65, 0x42, 0x55, 0xe3, 0x45, 0x58, 0x54, + 0x40, 0xcf, 0xc1, 0xd0, 0x2e, 0x89, 0x22, 0x67, 0x4b, 0x72, 0xf8, 0x13, 0xa2, 0xee, 0xd0, 0x2a, + 0x2f, 0xc6, 0x12, 0x8e, 0x9e, 0x81, 0x01, 0x12, 0x86, 0x41, 0x28, 0xf6, 0xe8, 0x98, 0x40, 0x1c, + 0x58, 0xa2, 0x85, 0x98, 0xc3, 0xec, 0x7f, 0x6b, 0xc1, 0x84, 0xea, 0x2b, 0x6f, 0xeb, 0x14, 0x58, + 0xb9, 0xb7, 0x01, 0x1a, 0xf2, 0x03, 0x23, 0x76, 0x7b, 0x8c, 0x5c, 0xbb, 0x92, 0xc9, 0xa0, 0x74, + 0x0c, 0x63, 0x42, 0x59, 0x15, 0x45, 0x58, 0xa3, 0x66, 0xff, 0x33, 0x0b, 0xce, 0xa4, 0xbe, 0xe8, + 0xb6, 0x1b, 0xc5, 0xe8, 0x9d, 0x8e, 0xaf, 0x9a, 0xed, 0xef, 0xab, 0x68, 0x6d, 0xf6, 0x4d, 0x6a, + 0x29, 0xcb, 0x12, 0xed, 0x8b, 0x6e, 0xc2, 0x80, 0x1b, 0x93, 0x5d, 0xf9, 0x31, 0xcf, 0x74, 0xfd, + 0x18, 0xde, 0xab, 0x64, 0x46, 0x56, 0x68, 0x4d, 0xcc, 0x09, 0xd8, 0x3f, 0x52, 0x84, 0x32, 0x5f, + 0xb6, 0xab, 0x4e, 0xeb, 0x14, 0xe6, 0x62, 0x05, 0x4a, 0x8c, 0x3a, 0xef, 0xf8, 0xb3, 0xd9, 0x1d, + 0x17, 0xdd, 0x99, 0xa5, 0x72, 0x1a, 0x67, 0x05, 0xd5, 0xd5, 0x40, 0x8b, 0x30, 0x23, 0x81, 0x1c, + 0x80, 0x0d, 0xd7, 0x77, 0xc2, 0x7d, 0x5a, 0x36, 0x5d, 0x64, 0x04, 0x5f, 0xec, 0x4e, 0x70, 0x41, + 0xe1, 0x73, 0xb2, 0xaa, 0xaf, 0x09, 0x00, 0x6b, 0x44, 0x67, 0x5e, 0x83, 0xb2, 0x42, 0x3e, 0x0e, + 0x8f, 0x33, 0xf3, 0x39, 0x98, 0x48, 0xb5, 0xd5, 0xab, 0xfa, 0xa8, 0xce, 0x22, 0x7d, 0x8d, 0x9d, + 0x02, 0xa2, 0xd7, 0x4b, 0xfe, 0x9e, 0x38, 0x45, 0xdf, 0x87, 0xb3, 0x5e, 0xc6, 0xe1, 0x24, 0xa6, + 0xaa, 0xff, 0xc3, 0xec, 0x29, 0xf1, 0xd9, 0x67, 0xb3, 0xa0, 0x38, 0xb3, 0x0d, 0x7a, 0xed, 0x07, + 0x2d, 0xba, 0xe6, 0x1d, 0x8f, 0xf5, 0x57, 0x48, 0xdf, 0x77, 0x44, 0x19, 0x56, 0x50, 0x7a, 0x84, + 0x9d, 0x55, 0x9d, 0xbf, 0x45, 0xf6, 0xeb, 0xc4, 0x23, 0x8d, 0x38, 0x08, 0x3f, 0xd4, 0xee, 0x5f, + 0xe4, 0xa3, 0xcf, 0x4f, 0xc0, 0x11, 0x41, 0xa0, 0x78, 0x8b, 0xec, 0xf3, 0xa9, 0xd0, 0xbf, 0xae, + 0xd8, 0xf5, 0xeb, 0x7e, 0xde, 0x82, 0x31, 0xf5, 0x75, 0xa7, 0xb0, 0xd5, 0x17, 0xcc, 0xad, 0x7e, + 0xb1, 0xeb, 0x02, 0xcf, 0xd9, 0xe4, 0x5f, 0x2f, 0xc0, 0x05, 0x85, 0x43, 0xd9, 0x7d, 0xfe, 0x47, + 0xac, 0xaa, 0x39, 0x28, 0xfb, 0x4a, 0x7b, 0x60, 0x99, 0x62, 0x7b, 0xa2, 0x3b, 0x48, 0x70, 0x28, + 0xd7, 0xe6, 0x27, 0x22, 0xfe, 0xa8, 0xae, 0x56, 0x13, 0x2a, 0xb4, 0x05, 0x28, 0xb6, 0xdd, 0xa6, + 0xb8, 0x33, 0x3e, 0x25, 0x47, 0xfb, 0xee, 0x4a, 0xf5, 0xe8, 0xa0, 0xf2, 0x74, 0x9e, 0x4a, 0x97, + 0x5e, 0x56, 0xd1, 0xec, 0xdd, 0x95, 0x2a, 0xa6, 0x95, 0xd1, 0x3c, 0x4c, 0x48, 0xad, 0xf5, 0x3d, + 0xca, 0x41, 0x05, 0xbe, 0xb8, 0x5a, 0x94, 0x6e, 0x0c, 0x9b, 0x60, 0x9c, 0xc6, 0x47, 0x55, 0x98, + 0xdc, 0x69, 0x6f, 0x10, 0x8f, 0xc4, 0xfc, 0x83, 0x6f, 0x11, 0xae, 0x39, 0x2a, 0x27, 0xa2, 0xe5, + 0xad, 0x14, 0x1c, 0x77, 0xd4, 0xb0, 0xff, 0x84, 0x1d, 0xf1, 0x62, 0xf4, 0x6a, 0x61, 0x40, 0x17, + 0x16, 0xa5, 0xfe, 0x61, 0x2e, 0xe7, 0x7e, 0x56, 0xc5, 0x2d, 0xb2, 0xbf, 0x1e, 0x50, 0x66, 0x3b, + 0x7b, 0x55, 0x18, 0x6b, 0xbe, 0xd4, 0x75, 0xcd, 0xff, 0x62, 0x01, 0xce, 0xa9, 0x11, 0x30, 0xf8, + 0xba, 0x3f, 0xed, 0x63, 0xf0, 0x12, 0x8c, 0x34, 0xc9, 0xa6, 0xd3, 0xf6, 0x62, 0xa5, 0xc6, 0x1c, + 0xe0, 0xaa, 0xec, 0x6a, 0x52, 0x8c, 0x75, 0x9c, 0x63, 0x0c, 0xdb, 0x4f, 0x8d, 0xb0, 0xbb, 0x35, + 0x76, 0xe8, 0x1a, 0x57, 0xbb, 0xc6, 0xca, 0xdd, 0x35, 0xcf, 0xc0, 0x80, 0xbb, 0x4b, 0x79, 0xad, + 0x82, 0xc9, 0x42, 0xad, 0xd0, 0x42, 0xcc, 0x61, 0xe8, 0x13, 0x30, 0xd4, 0x08, 0x76, 0x77, 0x1d, + 0xbf, 0xc9, 0xae, 0xbc, 0xf2, 0xc2, 0x08, 0x65, 0xc7, 0x16, 0x79, 0x11, 0x96, 0x30, 0xf4, 0x14, + 0x94, 0x9c, 0x70, 0x2b, 0x9a, 0x2e, 0x31, 0x9c, 0x61, 0xda, 0xd2, 0x7c, 0xb8, 0x15, 0x61, 0x56, + 0x4a, 0xa5, 0xaa, 0x07, 0x41, 0xb8, 0xe3, 0xfa, 0x5b, 0x55, 0x37, 0x14, 0x5b, 0x42, 0xdd, 0x85, + 0xf7, 0x15, 0x04, 0x6b, 0x58, 0x68, 0x19, 0x06, 0x5a, 0x41, 0x18, 0x47, 0xd3, 0x83, 0x6c, 0xb8, + 0x9f, 0xce, 0x39, 0x88, 0xf8, 0xd7, 0xd6, 0x82, 0x30, 0x4e, 0x3e, 0x80, 0xfe, 0x8b, 0x30, 0xaf, + 0x8e, 0xbe, 0x0d, 0x8a, 0xc4, 0xdf, 0x9b, 0x1e, 0x62, 0x54, 0x66, 0xb2, 0xa8, 0x2c, 0xf9, 0x7b, + 0xf7, 0x9c, 0x30, 0x39, 0xa5, 0x97, 0xfc, 0x3d, 0x4c, 0xeb, 0xa0, 0x2f, 0x40, 0x59, 0x6e, 0xf1, + 0x48, 0xa8, 0x39, 0x32, 0x97, 0x98, 0x3c, 0x18, 0x30, 0x79, 0xaf, 0xed, 0x86, 0x64, 0x97, 0xf8, + 0x71, 0x94, 0x9c, 0x69, 0x12, 0x1a, 0xe1, 0x84, 0x1a, 0xfa, 0x82, 0xd4, 0xad, 0xad, 0x06, 0x6d, + 0x3f, 0x8e, 0xa6, 0xcb, 0xac, 0x7b, 0x99, 0xaf, 0x1e, 0xf7, 0x12, 0xbc, 0xb4, 0xf2, 0x8d, 0x57, + 0xc6, 0x06, 0x29, 0x84, 0x61, 0xcc, 0x73, 0xf7, 0x88, 0x4f, 0xa2, 0xa8, 0x16, 0x06, 0x1b, 0x64, + 0x1a, 0x58, 0xcf, 0x2f, 0x64, 0x3f, 0x06, 0x04, 0x1b, 0x64, 0x61, 0xea, 0xf0, 0xa0, 0x32, 0x76, + 0x5b, 0xaf, 0x83, 0x4d, 0x12, 0xe8, 0x2e, 0x8c, 0x53, 0xb9, 0xc6, 0x4d, 0x88, 0x8e, 0xf4, 0x22, + 0xca, 0xa4, 0x0f, 0x6c, 0x54, 0xc2, 0x29, 0x22, 0xe8, 0x4d, 0x28, 0x7b, 0xee, 0x26, 0x69, 0xec, + 0x37, 0x3c, 0x32, 0x3d, 0xca, 0x28, 0x66, 0x6e, 0xab, 0xdb, 0x12, 0x89, 0xcb, 0x45, 0xea, 0x2f, + 0x4e, 0xaa, 0xa3, 0x7b, 0x70, 0x3e, 0x26, 0xe1, 0xae, 0xeb, 0x3b, 0x74, 0x3b, 0x08, 0x79, 0x81, + 0x3d, 0xa9, 0x8c, 0xb1, 0xf5, 0x76, 0x49, 0x0c, 0xdd, 0xf9, 0xf5, 0x4c, 0x2c, 0x9c, 0x53, 0x1b, + 0xdd, 0x81, 0x09, 0xb6, 0x13, 0x6a, 0x6d, 0xcf, 0xab, 0x05, 0x9e, 0xdb, 0xd8, 0x9f, 0x1e, 0x67, + 0x04, 0x3f, 0x21, 0xef, 0x85, 0x15, 0x13, 0x7c, 0x74, 0x50, 0x81, 0xe4, 0x1f, 0x4e, 0xd7, 0x46, + 0x1b, 0x4c, 0x87, 0xde, 0x0e, 0xdd, 0x78, 0x9f, 0xae, 0x5f, 0xf2, 0x30, 0x9e, 0x9e, 0xe8, 0x2a, + 0x0a, 0xeb, 0xa8, 0x4a, 0xd1, 0xae, 0x17, 0xe2, 0x34, 0x41, 0xba, 0xb5, 0xa3, 0xb8, 0xe9, 0xfa, + 0xd3, 0x93, 0xec, 0xc4, 0x50, 0x3b, 0xa3, 0x4e, 0x0b, 0x31, 0x87, 0x31, 0xfd, 0x39, 0xfd, 0x71, + 0x87, 0x9e, 0xa0, 0x53, 0x0c, 0x31, 0xd1, 0x9f, 0x4b, 0x00, 0x4e, 0x70, 0x28, 0x53, 0x13, 0xc7, + 0xfb, 0xd3, 0x88, 0xa1, 0xaa, 0xed, 0xb2, 0xbe, 0xfe, 0x05, 0x4c, 0xcb, 0xd1, 0x6d, 0x18, 0x22, + 0xfe, 0xde, 0x72, 0x18, 0xec, 0x4e, 0x9f, 0xc9, 0xdf, 0xb3, 0x4b, 0x1c, 0x85, 0x1f, 0xe8, 0x89, + 0x80, 0x27, 0x8a, 0xb1, 0x24, 0x81, 0x1e, 0xc2, 0x74, 0xc6, 0x8c, 0xf0, 0x09, 0x38, 0xcb, 0x26, + 0xe0, 0xb3, 0xa2, 0xee, 0xf4, 0x7a, 0x0e, 0xde, 0x51, 0x17, 0x18, 0xce, 0xa5, 0x8e, 0xbe, 0x08, + 0x63, 0x7c, 0x43, 0xf1, 0xc7, 0xb7, 0x68, 0xfa, 0x1c, 0xfb, 0x9a, 0xcb, 0xf9, 0x9b, 0x93, 0x23, + 0x2e, 0x9c, 0x13, 0x1d, 0x1a, 0xd3, 0x4b, 0x23, 0x6c, 0x52, 0xb3, 0x37, 0x60, 0x5c, 0x9d, 0x5b, + 0x6c, 0xe9, 0xa0, 0x0a, 0x0c, 0x30, 0x6e, 0x47, 0xe8, 0xb7, 0xca, 0x74, 0xa6, 0x18, 0x27, 0x84, + 0x79, 0x39, 0x9b, 0x29, 0xf7, 0x7d, 0xb2, 0xb0, 0x1f, 0x13, 0x2e, 0x55, 0x17, 0xb5, 0x99, 0x92, + 0x00, 0x9c, 0xe0, 0xd8, 0xff, 0x8f, 0x73, 0x8d, 0xc9, 0xe1, 0xd8, 0xc7, 0x75, 0xf0, 0x02, 0x0c, + 0x6f, 0x07, 0x51, 0x4c, 0xb1, 0x59, 0x1b, 0x03, 0x09, 0x9f, 0x78, 0x53, 0x94, 0x63, 0x85, 0x81, + 0x5e, 0x87, 0xb1, 0x86, 0xde, 0x80, 0xb8, 0xcb, 0xd4, 0x10, 0x18, 0xad, 0x63, 0x13, 0x17, 0x5d, + 0x87, 0x61, 0xf6, 0x74, 0xde, 0x08, 0x3c, 0xc1, 0x64, 0xc9, 0x0b, 0x79, 0xb8, 0x26, 0xca, 0x8f, + 0xb4, 0xdf, 0x58, 0x61, 0xa3, 0x2b, 0x30, 0x48, 0xbb, 0xb0, 0x52, 0x13, 0xb7, 0x88, 0x52, 0xd5, + 0xdc, 0x64, 0xa5, 0x58, 0x40, 0xed, 0xbf, 0x5a, 0xd0, 0x46, 0x99, 0x4a, 0xa4, 0x04, 0xd5, 0x60, + 0xe8, 0x81, 0xe3, 0xc6, 0xae, 0xbf, 0x25, 0xd8, 0x85, 0xe7, 0xba, 0x5e, 0x29, 0xac, 0xd2, 0x7d, + 0x5e, 0x81, 0x5f, 0x7a, 0xe2, 0x0f, 0x96, 0x64, 0x28, 0xc5, 0xb0, 0xed, 0xfb, 0x94, 0x62, 0xa1, + 0x5f, 0x8a, 0x98, 0x57, 0xe0, 0x14, 0xc5, 0x1f, 0x2c, 0xc9, 0xa0, 0x77, 0x00, 0xe4, 0xb2, 0x24, + 0x4d, 0xf1, 0x64, 0xfd, 0x42, 0x6f, 0xa2, 0xeb, 0xaa, 0xce, 0xc2, 0x38, 0xbd, 0x52, 0x93, 0xff, + 0x58, 0xa3, 0x67, 0xc7, 0x8c, 0xad, 0xea, 0xec, 0x0c, 0xfa, 0x4e, 0x7a, 0x12, 0x38, 0x61, 0x4c, + 0x9a, 0xf3, 0xb1, 0x18, 0x9c, 0x4f, 0xf6, 0x27, 0x53, 0xac, 0xbb, 0xbb, 0x44, 0x3f, 0x35, 0x04, + 0x11, 0x9c, 0xd0, 0xb3, 0x7f, 0xb9, 0x08, 0xd3, 0x79, 0xdd, 0xa5, 0x8b, 0x8e, 0x3c, 0x74, 0xe3, + 0x45, 0xca, 0x0d, 0x59, 0xe6, 0xa2, 0x5b, 0x12, 0xe5, 0x58, 0x61, 0xd0, 0xd9, 0x8f, 0xdc, 0x2d, + 0x29, 0x12, 0x0e, 0x24, 0xb3, 0x5f, 0x67, 0xa5, 0x58, 0x40, 0x29, 0x5e, 0x48, 0x9c, 0x48, 0xd8, + 0x44, 0x68, 0xab, 0x04, 0xb3, 0x52, 0x2c, 0xa0, 0xba, 0xbe, 0xa9, 0xd4, 0x43, 0xdf, 0x64, 0x0c, + 0xd1, 0xc0, 0xc9, 0x0e, 0x11, 0xfa, 0x12, 0xc0, 0xa6, 0xeb, 0xbb, 0xd1, 0x36, 0xa3, 0x3e, 0x78, + 0x6c, 0xea, 0x8a, 0x97, 0x5a, 0x56, 0x54, 0xb0, 0x46, 0x11, 0xbd, 0x0a, 0x23, 0x6a, 0x03, 0xae, + 0x54, 0xd9, 0x03, 0x91, 0xf6, 0xe0, 0x9e, 0x9c, 0x46, 0x55, 0xac, 0xe3, 0xd9, 0xef, 0xa6, 0xd7, + 0x8b, 0xd8, 0x01, 0xda, 0xf8, 0x5a, 0xfd, 0x8e, 0x6f, 0xa1, 0xfb, 0xf8, 0xda, 0xbf, 0x5e, 0x84, + 0x09, 0xa3, 0xb1, 0x76, 0xd4, 0xc7, 0x99, 0x75, 0x83, 0xde, 0x73, 0x4e, 0x4c, 0xc4, 0xfe, 0xb3, + 0x7b, 0x6f, 0x15, 0xfd, 0x2e, 0xa4, 0x3b, 0x80, 0xd7, 0x47, 0x5f, 0x82, 0xb2, 0xe7, 0x44, 0x4c, + 0x77, 0x45, 0xc4, 0xbe, 0xeb, 0x87, 0x58, 0x22, 0x47, 0x38, 0x51, 0xac, 0x5d, 0x35, 0x9c, 0x76, + 0x42, 0x92, 0x5e, 0xc8, 0x94, 0xf7, 0x91, 0x46, 0x37, 0xaa, 0x13, 0x94, 0x41, 0xda, 0xc7, 0x1c, + 0x86, 0xae, 0xc3, 0x68, 0x48, 0xd8, 0xaa, 0x58, 0xa4, 0xac, 0x1c, 0x5b, 0x66, 0x03, 0x09, 0xcf, + 0x87, 0x35, 0x18, 0x36, 0x30, 0x13, 0x56, 0x7e, 0xb0, 0x0b, 0x2b, 0xff, 0x1c, 0x0c, 0xb1, 0x1f, + 0x6a, 0x05, 0xa8, 0xd9, 0x58, 0xe1, 0xc5, 0x58, 0xc2, 0xd3, 0x0b, 0x66, 0xb8, 0xcf, 0x05, 0xf3, + 0x49, 0x18, 0xaf, 0x3a, 0x64, 0x37, 0xf0, 0x97, 0xfc, 0x66, 0x2b, 0x70, 0xfd, 0x18, 0x4d, 0x43, + 0x89, 0xdd, 0x0e, 0x7c, 0x6f, 0x97, 0x28, 0x05, 0x5c, 0xa2, 0x8c, 0xb9, 0xbd, 0x05, 0xe7, 0xaa, + 0xc1, 0x03, 0xff, 0x81, 0x13, 0x36, 0xe7, 0x6b, 0x2b, 0x9a, 0x9c, 0xbb, 0x26, 0xe5, 0x2c, 0x6e, + 0xc4, 0x92, 0x79, 0xa6, 0x6a, 0x35, 0xf9, 0x5d, 0xbb, 0xec, 0x7a, 0x24, 0x47, 0x1b, 0xf1, 0xd7, + 0x0b, 0x46, 0x4b, 0x09, 0xbe, 0x7a, 0x30, 0xb2, 0x72, 0x1f, 0x8c, 0xde, 0x82, 0xe1, 0x4d, 0x97, + 0x78, 0x4d, 0x4c, 0x36, 0xc5, 0x12, 0x7b, 0x36, 0xff, 0x5d, 0x7e, 0x99, 0x62, 0x4a, 0xed, 0x13, + 0x97, 0xd2, 0x96, 0x45, 0x65, 0xac, 0xc8, 0xa0, 0x1d, 0x98, 0x94, 0x62, 0x80, 0x84, 0x8a, 0x05, + 0xf7, 0x5c, 0x37, 0xd9, 0xc2, 0x24, 0x7e, 0xf6, 0xf0, 0xa0, 0x32, 0x89, 0x53, 0x64, 0x70, 0x07, + 0x61, 0x2a, 0x96, 0xed, 0xd2, 0xa3, 0xb5, 0xc4, 0x86, 0x9f, 0x89, 0x65, 0x4c, 0xc2, 0x64, 0xa5, + 0xf6, 0x4f, 0x58, 0xf0, 0x44, 0xc7, 0xc8, 0x08, 0x49, 0xfb, 0x84, 0x67, 0x21, 0x2d, 0xf9, 0x16, + 0x7a, 0x4b, 0xbe, 0xf6, 0xdf, 0xb7, 0xe0, 0xec, 0xd2, 0x6e, 0x2b, 0xde, 0xaf, 0xba, 0xe6, 0xeb, + 0xce, 0x6b, 0x30, 0xb8, 0x4b, 0x9a, 0x6e, 0x7b, 0x57, 0xcc, 0x5c, 0x45, 0x1e, 0x3f, 0xab, 0xac, + 0xf4, 0xe8, 0xa0, 0x32, 0x56, 0x8f, 0x83, 0xd0, 0xd9, 0x22, 0xbc, 0x00, 0x0b, 0x74, 0x76, 0x88, + 0xbb, 0xef, 0x93, 0xdb, 0xee, 0xae, 0x2b, 0xed, 0x2c, 0xba, 0xea, 0xce, 0x66, 0xe5, 0x80, 0xce, + 0xbe, 0xd5, 0x76, 0xfc, 0xd8, 0x8d, 0xf7, 0xc5, 0xc3, 0x8c, 0x24, 0x82, 0x13, 0x7a, 0xf6, 0x37, + 0x2d, 0x98, 0x90, 0xeb, 0x7e, 0xbe, 0xd9, 0x0c, 0x49, 0x14, 0xa1, 0x19, 0x28, 0xb8, 0x2d, 0xd1, + 0x4b, 0x10, 0xbd, 0x2c, 0xac, 0xd4, 0x70, 0xc1, 0x6d, 0xa1, 0x1a, 0x94, 0xb9, 0xb9, 0x46, 0xb2, + 0xb8, 0xfa, 0x32, 0xfa, 0x60, 0x3d, 0x58, 0x97, 0x35, 0x71, 0x42, 0x44, 0x72, 0x70, 0xec, 0xcc, + 0x2c, 0x9a, 0xaf, 0x5e, 0x37, 0x45, 0x39, 0x56, 0x18, 0xe8, 0x2a, 0x0c, 0xfb, 0x41, 0x93, 0x5b, + 0xcf, 0xf0, 0xdb, 0x8f, 0x2d, 0xd9, 0x35, 0x51, 0x86, 0x15, 0xd4, 0xfe, 0x61, 0x0b, 0x46, 0xe5, + 0x97, 0xf5, 0xc9, 0x4c, 0xd2, 0xad, 0x95, 0x30, 0x92, 0xc9, 0xd6, 0xa2, 0xcc, 0x20, 0x83, 0x18, + 0x3c, 0x60, 0xf1, 0x38, 0x3c, 0xa0, 0xfd, 0xe3, 0x05, 0x18, 0x97, 0xdd, 0xa9, 0xb7, 0x37, 0x22, + 0x12, 0xa3, 0x75, 0x28, 0x3b, 0x7c, 0xc8, 0x89, 0x5c, 0xb1, 0xcf, 0x64, 0x0b, 0x1f, 0xc6, 0xfc, + 0x24, 0xd7, 0xf2, 0xbc, 0xac, 0x8d, 0x13, 0x42, 0xc8, 0x83, 0x29, 0x3f, 0x88, 0xd9, 0x11, 0xad, + 0xe0, 0xdd, 0x9e, 0x40, 0xd2, 0xd4, 0x2f, 0x08, 0xea, 0x53, 0x6b, 0x69, 0x2a, 0xb8, 0x93, 0x30, + 0x5a, 0x92, 0x0a, 0x8f, 0x62, 0xbe, 0xb8, 0xa1, 0xcf, 0x42, 0xb6, 0xbe, 0xc3, 0xfe, 0x55, 0x0b, + 0xca, 0x12, 0xed, 0x34, 0x5e, 0xbb, 0x56, 0x61, 0x28, 0x62, 0x93, 0x20, 0x87, 0xc6, 0xee, 0xd6, + 0x71, 0x3e, 0x5f, 0xc9, 0xcd, 0xc3, 0xff, 0x47, 0x58, 0xd2, 0x60, 0xfa, 0x6e, 0xd5, 0xfd, 0x8f, + 0x88, 0xbe, 0x5b, 0xf5, 0x27, 0xe7, 0x86, 0xf9, 0xaf, 0xac, 0xcf, 0x9a, 0x58, 0x4b, 0x19, 0xa4, + 0x56, 0x48, 0x36, 0xdd, 0x87, 0x69, 0x06, 0xa9, 0xc6, 0x4a, 0xb1, 0x80, 0xa2, 0x77, 0x60, 0xb4, + 0x21, 0x15, 0x9d, 0xc9, 0x31, 0x70, 0xa5, 0xab, 0xd2, 0x5d, 0xbd, 0xcf, 0x70, 0xcb, 0xda, 0x45, + 0xad, 0x3e, 0x36, 0xa8, 0x99, 0xcf, 0xed, 0xc5, 0x5e, 0xcf, 0xed, 0x09, 0xdd, 0xfc, 0xc7, 0xe7, + 0x9f, 0xb4, 0x60, 0x90, 0xab, 0xcb, 0xfa, 0xd3, 0x2f, 0x6a, 0xcf, 0x55, 0xc9, 0xd8, 0xdd, 0xa3, + 0x85, 0xe2, 0xf9, 0x09, 0xad, 0x42, 0x99, 0xfd, 0x60, 0x6a, 0x83, 0x62, 0xbe, 0x49, 0x31, 0x6f, + 0x55, 0xef, 0xe0, 0x3d, 0x59, 0x0d, 0x27, 0x14, 0xec, 0x1f, 0x2d, 0xd2, 0xa3, 0x2a, 0x41, 0x35, + 0x6e, 0x70, 0xeb, 0xf1, 0xdd, 0xe0, 0x85, 0xc7, 0x75, 0x83, 0x6f, 0xc1, 0x44, 0x43, 0x7b, 0xdc, + 0x4a, 0x66, 0xf2, 0x6a, 0xd7, 0x45, 0xa2, 0xbd, 0x83, 0x71, 0x95, 0xd1, 0xa2, 0x49, 0x04, 0xa7, + 0xa9, 0xa2, 0xef, 0x84, 0x51, 0x3e, 0xcf, 0xa2, 0x15, 0x6e, 0xb1, 0xf0, 0x89, 0xfc, 0xf5, 0xa2, + 0x37, 0xc1, 0x56, 0x62, 0x5d, 0xab, 0x8e, 0x0d, 0x62, 0xf6, 0x2f, 0x0f, 0xc3, 0xc0, 0xd2, 0x1e, + 0xf1, 0xe3, 0x53, 0x38, 0x90, 0x1a, 0x30, 0xee, 0xfa, 0x7b, 0x81, 0xb7, 0x47, 0x9a, 0x1c, 0x7e, + 0x9c, 0xcb, 0xf5, 0xbc, 0x20, 0x3d, 0xbe, 0x62, 0x90, 0xc0, 0x29, 0x92, 0x8f, 0x43, 0xc2, 0xbc, + 0x01, 0x83, 0x7c, 0xee, 0x85, 0x78, 0x99, 0xa9, 0x0c, 0x66, 0x83, 0x28, 0x76, 0x41, 0x22, 0xfd, + 0x72, 0xed, 0xb3, 0xa8, 0x8e, 0xde, 0x85, 0xf1, 0x4d, 0x37, 0x8c, 0x62, 0x2a, 0x1a, 0x46, 0xb1, + 0xb3, 0xdb, 0x7a, 0x04, 0x89, 0x52, 0x8d, 0xc3, 0xb2, 0x41, 0x09, 0xa7, 0x28, 0xa3, 0x2d, 0x18, + 0xa3, 0x42, 0x4e, 0xd2, 0xd4, 0xd0, 0xb1, 0x9b, 0x52, 0x2a, 0xa3, 0xdb, 0x3a, 0x21, 0x6c, 0xd2, + 0xa5, 0x87, 0x49, 0x83, 0x09, 0x45, 0xc3, 0x8c, 0xa3, 0x50, 0x87, 0x09, 0x97, 0x86, 0x38, 0x8c, + 0x9e, 0x49, 0xcc, 0x6c, 0xa5, 0x6c, 0x9e, 0x49, 0x9a, 0x71, 0xca, 0x97, 0xa1, 0x4c, 0xe8, 0x10, + 0x52, 0xc2, 0x42, 0x31, 0x3e, 0xd7, 0x5f, 0x5f, 0x57, 0xdd, 0x46, 0x18, 0x98, 0xb2, 0xfc, 0x92, + 0xa4, 0x84, 0x13, 0xa2, 0x68, 0x11, 0x06, 0x23, 0x12, 0xba, 0x24, 0x12, 0x2a, 0xf2, 0x2e, 0xd3, + 0xc8, 0xd0, 0xb8, 0xed, 0x39, 0xff, 0x8d, 0x45, 0x55, 0xba, 0xbc, 0x1c, 0x26, 0x0d, 0x31, 0xad, + 0xb8, 0xb6, 0xbc, 0xe6, 0x59, 0x29, 0x16, 0x50, 0xf4, 0x26, 0x0c, 0x85, 0xc4, 0x63, 0xca, 0xa2, + 0xb1, 0xfe, 0x17, 0x39, 0xd7, 0x3d, 0xf1, 0x7a, 0x58, 0x12, 0x40, 0xb7, 0x00, 0x85, 0x84, 0xf2, + 0x10, 0xae, 0xbf, 0xa5, 0x8c, 0x39, 0x84, 0xae, 0xfb, 0x49, 0xd1, 0xfe, 0x19, 0x9c, 0x60, 0x48, + 0xab, 0x54, 0x9c, 0x51, 0x0d, 0xdd, 0x80, 0x29, 0x55, 0xba, 0xe2, 0x47, 0xb1, 0xe3, 0x37, 0x08, + 0x53, 0x73, 0x97, 0x13, 0xae, 0x08, 0xa7, 0x11, 0x70, 0x67, 0x1d, 0xfb, 0x67, 0x29, 0x3b, 0x43, + 0x47, 0xeb, 0x14, 0x78, 0x81, 0x37, 0x4c, 0x5e, 0xe0, 0x42, 0xee, 0xcc, 0xe5, 0xf0, 0x01, 0x87, + 0x16, 0x8c, 0x68, 0x33, 0x9b, 0xac, 0x59, 0xab, 0xcb, 0x9a, 0x6d, 0xc3, 0x24, 0x5d, 0xe9, 0x77, + 0x36, 0x98, 0x1b, 0x56, 0x93, 0x2d, 0xcc, 0xc2, 0xa3, 0x2d, 0x4c, 0xf5, 0xca, 0x7c, 0x3b, 0x45, + 0x10, 0x77, 0x34, 0x81, 0x5e, 0x93, 0x9a, 0x93, 0xa2, 0x61, 0xa4, 0xc5, 0xb5, 0x22, 0x47, 0x07, + 0x95, 0x49, 0xed, 0x43, 0x74, 0x4d, 0x89, 0xfd, 0x65, 0xf9, 0x8d, 0xea, 0x35, 0xbf, 0xa1, 0x16, + 0x4b, 0xea, 0x35, 0x5f, 0x2d, 0x07, 0x9c, 0xe0, 0xd0, 0x3d, 0x4a, 0x45, 0x90, 0xf4, 0x6b, 0x3e, + 0x15, 0x50, 0x30, 0x83, 0xd8, 0x2f, 0x03, 0x2c, 0x3d, 0x24, 0x0d, 0xbe, 0xd4, 0xf5, 0x07, 0x48, + 0x2b, 0xff, 0x01, 0xd2, 0xfe, 0xf7, 0x16, 0x8c, 0x2f, 0x2f, 0x1a, 0x62, 0xe2, 0x2c, 0x00, 0x97, + 0x8d, 0xee, 0xdf, 0x5f, 0x93, 0xba, 0x75, 0xae, 0x1e, 0x55, 0xa5, 0x58, 0xc3, 0x40, 0x17, 0xa0, + 0xe8, 0xb5, 0x7d, 0x21, 0xb2, 0x0c, 0x1d, 0x1e, 0x54, 0x8a, 0xb7, 0xdb, 0x3e, 0xa6, 0x65, 0x9a, + 0x85, 0x60, 0xb1, 0x6f, 0x0b, 0xc1, 0x9e, 0xee, 0x55, 0xa8, 0x02, 0x03, 0x0f, 0x1e, 0xb8, 0x4d, + 0x6e, 0xc4, 0x2e, 0xf4, 0xfe, 0xf7, 0xef, 0xaf, 0x54, 0x23, 0xcc, 0xcb, 0xed, 0xaf, 0x16, 0x61, + 0x66, 0xd9, 0x23, 0x0f, 0x3f, 0xa0, 0x21, 0x7f, 0xbf, 0xf6, 0x8d, 0xc7, 0xe3, 0x17, 0x8f, 0x6b, + 0xc3, 0xda, 0x7b, 0x3c, 0x36, 0x61, 0x88, 0x3f, 0x66, 0x4b, 0xb3, 0xfe, 0xd7, 0xb3, 0x5a, 0xcf, + 0x1f, 0x90, 0x59, 0xfe, 0x28, 0x2e, 0xcc, 0xf9, 0xd5, 0x4d, 0x2b, 0x4a, 0xb1, 0x24, 0x3e, 0xf3, + 0x19, 0x18, 0xd5, 0x31, 0x8f, 0x65, 0x4d, 0xfe, 0x17, 0x8a, 0x30, 0x49, 0x7b, 0xf0, 0x58, 0x27, + 0xe2, 0x6e, 0xe7, 0x44, 0x9c, 0xb4, 0x45, 0x71, 0xef, 0xd9, 0x78, 0x27, 0x3d, 0x1b, 0x2f, 0xe5, + 0xcd, 0xc6, 0x69, 0xcf, 0xc1, 0xf7, 0x5a, 0x70, 0x66, 0xd9, 0x0b, 0x1a, 0x3b, 0x29, 0xab, 0xdf, + 0x57, 0x61, 0x84, 0x9e, 0xe3, 0x91, 0xe1, 0x45, 0x64, 0xf8, 0x95, 0x09, 0x10, 0xd6, 0xf1, 0xb4, + 0x6a, 0x77, 0xef, 0xae, 0x54, 0xb3, 0xdc, 0xd1, 0x04, 0x08, 0xeb, 0x78, 0xf6, 0x37, 0x2c, 0xb8, + 0x78, 0x63, 0x71, 0x29, 0x59, 0x8a, 0x1d, 0x1e, 0x71, 0x54, 0x0a, 0x6c, 0x6a, 0x5d, 0x49, 0xa4, + 0xc0, 0x2a, 0xeb, 0x85, 0x80, 0x7e, 0x54, 0xbc, 0x3d, 0x7f, 0xc6, 0x82, 0x33, 0x37, 0xdc, 0x98, + 0x5e, 0xcb, 0x69, 0xdf, 0x2c, 0x7a, 0x2f, 0x47, 0x6e, 0x1c, 0x84, 0xfb, 0x69, 0xdf, 0x2c, 0xac, + 0x20, 0x58, 0xc3, 0xe2, 0x2d, 0xef, 0xb9, 0xcc, 0x8c, 0xaa, 0x60, 0xaa, 0xa2, 0xb0, 0x28, 0xc7, + 0x0a, 0x83, 0x7e, 0x58, 0xd3, 0x0d, 0x99, 0x28, 0xb1, 0x2f, 0x4e, 0x58, 0xf5, 0x61, 0x55, 0x09, + 0xc0, 0x09, 0x8e, 0xfd, 0x13, 0x16, 0x9c, 0xbb, 0xe1, 0xb5, 0xa3, 0x98, 0x84, 0x9b, 0x91, 0xd1, + 0xd9, 0x97, 0xa1, 0x4c, 0xa4, 0xb8, 0x2e, 0xfa, 0xaa, 0x18, 0x4c, 0x25, 0xc7, 0x73, 0xc7, 0x30, + 0x85, 0xd7, 0x87, 0xe7, 0xc0, 0xf1, 0x5c, 0xc7, 0x7e, 0xa1, 0x00, 0x63, 0x37, 0xd7, 0xd7, 0x6b, + 0x37, 0x48, 0x2c, 0x6e, 0xb1, 0xde, 0xaa, 0x66, 0xac, 0x69, 0xcc, 0xba, 0x09, 0x45, 0xed, 0xd8, + 0xf5, 0x66, 0xb9, 0x27, 0xf2, 0xec, 0x8a, 0x1f, 0xdf, 0x09, 0xeb, 0x71, 0xe8, 0xfa, 0x5b, 0x99, + 0x3a, 0x36, 0x79, 0xd7, 0x16, 0xf3, 0xee, 0x5a, 0xf4, 0x32, 0x0c, 0x32, 0x57, 0x68, 0x29, 0x9e, + 0x3c, 0xa9, 0x64, 0x0a, 0x56, 0x7a, 0x74, 0x50, 0x29, 0xdf, 0xc5, 0x2b, 0xfc, 0x0f, 0x16, 0xa8, + 0xe8, 0x2e, 0x8c, 0x6c, 0xc7, 0x71, 0xeb, 0x26, 0x71, 0x9a, 0x24, 0x94, 0xa7, 0xc3, 0xa5, 0xac, + 0xd3, 0x81, 0x0e, 0x02, 0x47, 0x4b, 0x36, 0x54, 0x52, 0x16, 0x61, 0x9d, 0x8e, 0x5d, 0x07, 0x48, + 0x60, 0x27, 0xa4, 0x5f, 0xb0, 0x7f, 0xcf, 0x82, 0x21, 0xee, 0x95, 0x16, 0xa2, 0xcf, 0x42, 0x89, + 0x3c, 0x24, 0x0d, 0xc1, 0x39, 0x66, 0x76, 0x38, 0x61, 0x3c, 0xb8, 0xb6, 0x9c, 0xfe, 0xc7, 0xac, + 0x16, 0xba, 0x09, 0x43, 0xb4, 0xb7, 0x37, 0x94, 0x8b, 0xde, 0xd3, 0x79, 0x5f, 0xac, 0xa6, 0x9d, + 0xf3, 0x2a, 0xa2, 0x08, 0xcb, 0xea, 0x4c, 0xf3, 0xdb, 0x68, 0xd5, 0xe9, 0x01, 0x16, 0x77, 0xbb, + 0x67, 0xd7, 0x17, 0x6b, 0x1c, 0x49, 0x50, 0xe3, 0x9a, 0x5f, 0x59, 0x88, 0x13, 0x22, 0xf6, 0x3a, + 0x94, 0xe9, 0xa4, 0xce, 0x7b, 0xae, 0xd3, 0x5d, 0xe9, 0xfc, 0x3c, 0x94, 0xa5, 0x02, 0x38, 0x12, + 0x8e, 0x4d, 0x8c, 0xaa, 0xd4, 0x0f, 0x47, 0x38, 0x81, 0xdb, 0x9b, 0x70, 0x96, 0xbd, 0xfc, 0x3b, + 0xf1, 0xb6, 0xb1, 0xc7, 0x7a, 0x2f, 0xe6, 0x17, 0x84, 0x20, 0xc6, 0x67, 0x66, 0x5a, 0xf3, 0x1d, + 0x18, 0x95, 0x14, 0x13, 0xa1, 0xcc, 0xfe, 0x83, 0x12, 0x3c, 0xb9, 0x52, 0xcf, 0x77, 0x58, 0xbc, + 0x0e, 0xa3, 0x9c, 0x4d, 0xa3, 0x4b, 0xdb, 0xf1, 0x44, 0xbb, 0xea, 0x5d, 0x6c, 0x5d, 0x83, 0x61, + 0x03, 0x13, 0x5d, 0x84, 0xa2, 0xfb, 0x9e, 0x9f, 0x36, 0xc3, 0x5d, 0x79, 0x6b, 0x0d, 0xd3, 0x72, + 0x0a, 0xa6, 0x1c, 0x1f, 0x3f, 0x4a, 0x15, 0x58, 0x71, 0x7d, 0x6f, 0xc0, 0xb8, 0x1b, 0x35, 0x22, + 0x77, 0xc5, 0xa7, 0xe7, 0x4c, 0xe2, 0xec, 0x9a, 0x28, 0x09, 0x68, 0xa7, 0x15, 0x14, 0xa7, 0xb0, + 0xb5, 0x73, 0x7d, 0xa0, 0x6f, 0xae, 0xb1, 0xa7, 0xa7, 0x0f, 0x65, 0x88, 0x5b, 0xec, 0xeb, 0x22, + 0x66, 0xd4, 0x26, 0x18, 0x62, 0xfe, 0xc1, 0x11, 0x96, 0x30, 0x2a, 0x81, 0x35, 0xb6, 0x9d, 0xd6, + 0x7c, 0x3b, 0xde, 0xae, 0xba, 0x51, 0x23, 0xd8, 0x23, 0xe1, 0x3e, 0x13, 0x9e, 0x87, 0x13, 0x09, + 0x4c, 0x01, 0x16, 0x6f, 0xce, 0xd7, 0x28, 0x26, 0xee, 0xac, 0x63, 0x72, 0x85, 0x70, 0x12, 0x5c, + 0xe1, 0x3c, 0x4c, 0xc8, 0x66, 0xea, 0x24, 0x62, 0x77, 0xc4, 0x08, 0xeb, 0x98, 0x32, 0xb5, 0x15, + 0xc5, 0xaa, 0x5b, 0x69, 0x7c, 0xf4, 0x1a, 0x8c, 0xb9, 0xbe, 0x1b, 0xbb, 0x4e, 0x1c, 0x84, 0xec, + 0x86, 0xe5, 0x72, 0x32, 0xb3, 0x64, 0x5b, 0xd1, 0x01, 0xd8, 0xc4, 0xb3, 0x7f, 0xbf, 0x04, 0x53, + 0x6c, 0xda, 0xbe, 0xb5, 0xc2, 0x3e, 0x32, 0x2b, 0xec, 0x6e, 0xe7, 0x0a, 0x3b, 0x09, 0x76, 0xf7, + 0xc3, 0x5c, 0x66, 0xef, 0x42, 0x59, 0xd9, 0x02, 0x4b, 0x67, 0x00, 0x2b, 0xc7, 0x19, 0xa0, 0x37, + 0xf7, 0x21, 0x9f, 0x71, 0x8b, 0x99, 0xcf, 0xb8, 0x7f, 0xd3, 0x82, 0xc4, 0x24, 0x12, 0xdd, 0x84, + 0x72, 0x2b, 0x60, 0x66, 0x07, 0xa1, 0xb4, 0xe5, 0x79, 0x32, 0xf3, 0xa2, 0xe2, 0x97, 0x22, 0x1f, + 0xbf, 0x9a, 0xac, 0x81, 0x93, 0xca, 0x68, 0x01, 0x86, 0x5a, 0x21, 0xa9, 0xc7, 0xcc, 0x05, 0xb6, + 0x27, 0x1d, 0xbe, 0x46, 0x38, 0x3e, 0x96, 0x15, 0xed, 0x5f, 0xb4, 0x00, 0xf8, 0x4b, 0xa9, 0xe3, + 0x6f, 0x91, 0x53, 0xd0, 0xfe, 0x56, 0xa1, 0x14, 0xb5, 0x48, 0xa3, 0x9b, 0x41, 0x48, 0xd2, 0x9f, + 0x7a, 0x8b, 0x34, 0x92, 0x01, 0xa7, 0xff, 0x30, 0xab, 0x6d, 0x7f, 0x1f, 0xc0, 0x78, 0x82, 0xb6, + 0x12, 0x93, 0x5d, 0xf4, 0xa2, 0xe1, 0x12, 0x77, 0x21, 0xe5, 0x12, 0x57, 0x66, 0xd8, 0x9a, 0xa2, + 0xf1, 0x5d, 0x28, 0xee, 0x3a, 0x0f, 0x85, 0x26, 0xe9, 0xf9, 0xee, 0xdd, 0xa0, 0xf4, 0x67, 0x57, + 0x9d, 0x87, 0x5c, 0x66, 0x7a, 0x5e, 0x2e, 0x90, 0x55, 0xe7, 0xe1, 0x11, 0x37, 0xfb, 0x60, 0x87, + 0xd4, 0x6d, 0x37, 0x8a, 0xbf, 0xf2, 0x9f, 0x92, 0xff, 0x6c, 0xd9, 0xd1, 0x46, 0x58, 0x5b, 0xae, + 0x2f, 0xde, 0x0d, 0xfb, 0x6a, 0xcb, 0xf5, 0xd3, 0x6d, 0xb9, 0x7e, 0x1f, 0x6d, 0xb9, 0x3e, 0x7a, + 0x1f, 0x86, 0xc4, 0x1b, 0x3d, 0xb3, 0xf5, 0x36, 0xb5, 0x54, 0x79, 0xed, 0x89, 0x27, 0x7e, 0xde, + 0xe6, 0x9c, 0x94, 0x09, 0x45, 0x69, 0xcf, 0x76, 0x65, 0x83, 0xe8, 0xaf, 0x59, 0x30, 0x2e, 0x7e, + 0x63, 0xf2, 0x5e, 0x9b, 0x44, 0xb1, 0xe0, 0x3d, 0x3f, 0xdd, 0x7f, 0x1f, 0x44, 0x45, 0xde, 0x95, + 0x4f, 0xcb, 0x63, 0xd6, 0x04, 0xf6, 0xec, 0x51, 0xaa, 0x17, 0xe8, 0x1f, 0x5a, 0x70, 0x76, 0xd7, + 0x79, 0xc8, 0x5b, 0xe4, 0x65, 0xd8, 0x89, 0xdd, 0x40, 0xd8, 0xae, 0x7f, 0xb6, 0xbf, 0xe9, 0xef, + 0xa8, 0xce, 0x3b, 0x29, 0xcd, 0x5c, 0xcf, 0x66, 0xa1, 0xf4, 0xec, 0x6a, 0x66, 0xbf, 0x66, 0x36, + 0x61, 0x58, 0xae, 0xb7, 0x0c, 0xc9, 0xbb, 0xaa, 0x33, 0xd6, 0xc7, 0x36, 0x91, 0xd0, 0xfd, 0xd2, + 0x68, 0x3b, 0x62, 0xad, 0x3d, 0xd6, 0x76, 0xde, 0x85, 0x51, 0x7d, 0x8d, 0x3d, 0xd6, 0xb6, 0xde, + 0x83, 0x33, 0x19, 0x6b, 0xe9, 0xb1, 0x36, 0xf9, 0x00, 0x2e, 0xe4, 0xae, 0x8f, 0xc7, 0xd9, 0xb0, + 0xfd, 0x0b, 0x96, 0x7e, 0x0e, 0x9e, 0x82, 0x0a, 0x7e, 0xd1, 0x54, 0xc1, 0x5f, 0xea, 0xbe, 0x73, + 0x72, 0xf4, 0xf0, 0xef, 0xe8, 0x9d, 0xa6, 0xa7, 0x3a, 0x7a, 0x13, 0x06, 0x3d, 0x5a, 0x22, 0x8d, + 0x43, 0xec, 0xde, 0x3b, 0x32, 0xe1, 0xa5, 0x58, 0x79, 0x84, 0x05, 0x05, 0xfb, 0x57, 0x2c, 0x28, + 0x9d, 0xc2, 0x48, 0x60, 0x73, 0x24, 0x5e, 0xcc, 0x25, 0x2d, 0x42, 0x9a, 0xcd, 0x62, 0xe7, 0xc1, + 0x92, 0x0c, 0xdb, 0x96, 0x33, 0x30, 0xdf, 0x05, 0x67, 0x6e, 0x07, 0x4e, 0x73, 0xc1, 0xf1, 0x1c, + 0xbf, 0x41, 0xc2, 0x15, 0x7f, 0xab, 0xa7, 0x95, 0x92, 0x6e, 0x53, 0x54, 0xe8, 0x65, 0x53, 0x64, + 0x6f, 0x03, 0xd2, 0x1b, 0x10, 0x76, 0x9c, 0x18, 0x86, 0x5c, 0xde, 0x94, 0x18, 0xfe, 0x67, 0xb3, + 0xb9, 0xbb, 0x8e, 0x9e, 0x69, 0x16, 0x8a, 0xbc, 0x00, 0x4b, 0x42, 0xf6, 0x75, 0xc8, 0xf4, 0xdd, + 0xea, 0xad, 0x36, 0xb0, 0x5f, 0x85, 0x29, 0x56, 0xf3, 0x78, 0x22, 0xad, 0xfd, 0x03, 0x16, 0x4c, + 0xac, 0xa5, 0x62, 0x53, 0x5c, 0x61, 0x6f, 0x7d, 0x19, 0x7a, 0xdf, 0x3a, 0x2b, 0xc5, 0x02, 0x7a, + 0xe2, 0xfa, 0xa5, 0x3f, 0xb1, 0x20, 0x71, 0x95, 0x3c, 0x05, 0xa6, 0x6a, 0xd1, 0x60, 0xaa, 0x32, + 0xf5, 0x1e, 0xaa, 0x3b, 0x79, 0x3c, 0x15, 0xba, 0xa5, 0xe2, 0x02, 0x74, 0x51, 0x79, 0x24, 0x64, + 0xb8, 0x17, 0xf9, 0xb8, 0x19, 0x3c, 0x40, 0x46, 0x0a, 0x60, 0x66, 0x42, 0x0a, 0xf7, 0x23, 0x62, + 0x26, 0xa4, 0xfa, 0x93, 0xb3, 0xfb, 0x6a, 0x5a, 0x97, 0xd9, 0xa9, 0xf4, 0xed, 0xcc, 0xec, 0xdb, + 0xf1, 0xdc, 0xf7, 0x89, 0x0a, 0x6e, 0x52, 0x11, 0x66, 0xdc, 0xa2, 0xf4, 0xe8, 0xa0, 0x32, 0xa6, + 0xfe, 0xf1, 0x08, 0x58, 0x49, 0x15, 0xfb, 0x26, 0x4c, 0xa4, 0x06, 0x0c, 0xbd, 0x0a, 0x03, 0xad, + 0x6d, 0x27, 0x22, 0x29, 0xd3, 0xc8, 0x81, 0x1a, 0x2d, 0x3c, 0x3a, 0xa8, 0x8c, 0xab, 0x0a, 0xac, + 0x04, 0x73, 0x6c, 0xfb, 0x7f, 0x5a, 0x50, 0x5a, 0x0b, 0x9a, 0xa7, 0xb1, 0x98, 0xde, 0x30, 0x16, + 0xd3, 0x53, 0x79, 0xf1, 0x03, 0x73, 0xd7, 0xd1, 0x72, 0x6a, 0x1d, 0x5d, 0xca, 0xa5, 0xd0, 0x7d, + 0x09, 0xed, 0xc2, 0x08, 0x8b, 0x4a, 0x28, 0x4c, 0x35, 0x5f, 0x36, 0xf8, 0xfb, 0x4a, 0x8a, 0xbf, + 0x9f, 0xd0, 0x50, 0x35, 0x2e, 0xff, 0x39, 0x18, 0x12, 0xe6, 0x82, 0x69, 0x03, 0x77, 0x81, 0x8b, + 0x25, 0xdc, 0xfe, 0xc9, 0x22, 0x18, 0x51, 0x10, 0xd1, 0xaf, 0x5a, 0x30, 0x1b, 0x72, 0x8f, 0xc1, + 0x66, 0xb5, 0x1d, 0xba, 0xfe, 0x56, 0xbd, 0xb1, 0x4d, 0x9a, 0x6d, 0xcf, 0xf5, 0xb7, 0x56, 0xb6, + 0xfc, 0x40, 0x15, 0x2f, 0x3d, 0x24, 0x8d, 0x36, 0xd3, 0xf9, 0xf7, 0x08, 0xb9, 0xa8, 0xcc, 0x71, + 0xae, 0x1d, 0x1e, 0x54, 0x66, 0xf1, 0xb1, 0x68, 0xe3, 0x63, 0xf6, 0x05, 0x7d, 0xc3, 0x82, 0x39, + 0x1e, 0x1c, 0xb0, 0xff, 0xfe, 0x77, 0x91, 0x86, 0x6a, 0x92, 0x54, 0x42, 0x64, 0x9d, 0x84, 0xbb, + 0x0b, 0xaf, 0x89, 0x01, 0x9d, 0xab, 0x1d, 0xaf, 0x2d, 0x7c, 0xdc, 0xce, 0xd9, 0xff, 0xb2, 0x08, + 0x63, 0xc2, 0x59, 0x5d, 0x44, 0x41, 0x79, 0xd5, 0x58, 0x12, 0x4f, 0xa7, 0x96, 0xc4, 0x94, 0x81, + 0x7c, 0x32, 0x01, 0x50, 0x22, 0x98, 0xf2, 0x9c, 0x28, 0xbe, 0x49, 0x9c, 0x30, 0xde, 0x20, 0x0e, + 0x37, 0x53, 0x29, 0x1e, 0xdb, 0xa4, 0x46, 0xa9, 0x5f, 0x6e, 0xa7, 0x89, 0xe1, 0x4e, 0xfa, 0x68, + 0x0f, 0x10, 0xb3, 0xb5, 0x09, 0x1d, 0x3f, 0xe2, 0xdf, 0xe2, 0x8a, 0xf7, 0x80, 0xe3, 0xb5, 0x3a, + 0x23, 0x5a, 0x45, 0xb7, 0x3b, 0xa8, 0xe1, 0x8c, 0x16, 0x34, 0x1b, 0xaa, 0x81, 0x7e, 0x6d, 0xa8, + 0x06, 0x7b, 0x78, 0x91, 0xf8, 0x30, 0xd9, 0x11, 0x6f, 0xe0, 0x6d, 0x28, 0x2b, 0x5b, 0x37, 0x71, + 0xe8, 0x74, 0x0f, 0xdb, 0x91, 0xa6, 0xc0, 0x55, 0x24, 0x89, 0x9d, 0x65, 0x42, 0xce, 0xfe, 0x47, + 0x05, 0xa3, 0x41, 0x3e, 0x89, 0x6b, 0x30, 0xec, 0x44, 0x91, 0xbb, 0xe5, 0x93, 0xa6, 0xd8, 0xb1, + 0x1f, 0xcf, 0xdb, 0xb1, 0x46, 0x33, 0xcc, 0xde, 0x70, 0x5e, 0xd4, 0xc4, 0x8a, 0x06, 0xba, 0xc9, + 0x8d, 0x81, 0xf6, 0x24, 0x3f, 0xdf, 0x1f, 0x35, 0x90, 0xe6, 0x42, 0x7b, 0x04, 0x8b, 0xfa, 0xe8, + 0x8b, 0xdc, 0x5a, 0xeb, 0x96, 0x1f, 0x3c, 0xf0, 0x6f, 0x04, 0x81, 0xf4, 0x30, 0xeb, 0x8f, 0xe0, + 0x94, 0xb4, 0xd1, 0x52, 0xd5, 0xb1, 0x49, 0xad, 0xbf, 0x98, 0x3c, 0xdf, 0x0d, 0x67, 0x28, 0x69, + 0xd3, 0x4f, 0x24, 0x42, 0x04, 0x26, 0x44, 0x24, 0x04, 0x59, 0x26, 0xc6, 0x2e, 0x93, 0x55, 0x37, + 0x6b, 0x27, 0x0a, 0xbd, 0x5b, 0x26, 0x09, 0x9c, 0xa6, 0x69, 0xff, 0xb4, 0x05, 0xcc, 0xc2, 0xfd, + 0x14, 0x58, 0x86, 0xcf, 0x99, 0x2c, 0xc3, 0x74, 0xde, 0x20, 0xe7, 0x70, 0x0b, 0xaf, 0xf0, 0x95, + 0x55, 0x0b, 0x83, 0x87, 0xfb, 0xe2, 0xa5, 0xbc, 0x0f, 0x2e, 0xf5, 0xff, 0x5a, 0xfc, 0x10, 0x53, + 0x4e, 0xe7, 0xe8, 0x7b, 0x60, 0xb8, 0xe1, 0xb4, 0x9c, 0x06, 0x0f, 0xd9, 0x9b, 0xab, 0xb1, 0x31, + 0x2a, 0xcd, 0x2e, 0x8a, 0x1a, 0x5c, 0x03, 0x21, 0x23, 0x6a, 0x0c, 0xcb, 0xe2, 0x9e, 0x5a, 0x07, + 0xd5, 0xe4, 0xcc, 0x0e, 0x8c, 0x19, 0xc4, 0x1e, 0xab, 0xb8, 0xfa, 0x3d, 0xfc, 0x8a, 0x55, 0x11, + 0x60, 0x76, 0x61, 0xca, 0xd7, 0xfe, 0xd3, 0x0b, 0x45, 0x8a, 0x20, 0x1f, 0xef, 0x75, 0x89, 0xb2, + 0xdb, 0x47, 0xb3, 0xe0, 0x4f, 0x91, 0xc1, 0x9d, 0x94, 0xed, 0xbf, 0x6d, 0xc1, 0x13, 0x3a, 0xa2, + 0x16, 0x0f, 0xa0, 0x97, 0x0e, 0xb8, 0x0a, 0xc3, 0x41, 0x8b, 0x84, 0x4e, 0x1c, 0x84, 0xe2, 0xd6, + 0xb8, 0x2a, 0x07, 0xfd, 0x8e, 0x28, 0x3f, 0x12, 0xb1, 0x13, 0x25, 0x75, 0x59, 0x8e, 0x55, 0x4d, + 0x64, 0xc3, 0x20, 0x1b, 0x8c, 0x48, 0xc4, 0x6a, 0x60, 0x67, 0x00, 0x7b, 0x0e, 0x8d, 0xb0, 0x80, + 0xd8, 0x7f, 0x60, 0xf1, 0x85, 0xa5, 0x77, 0x1d, 0xbd, 0x07, 0x93, 0xbb, 0x4e, 0xdc, 0xd8, 0x5e, + 0x7a, 0xd8, 0x0a, 0xb9, 0xea, 0x5b, 0x8e, 0xd3, 0xf3, 0xbd, 0xc6, 0x49, 0xfb, 0xc8, 0xc4, 0x00, + 0x6d, 0x35, 0x45, 0x0c, 0x77, 0x90, 0x47, 0x1b, 0x30, 0xc2, 0xca, 0x98, 0xa5, 0x73, 0xd4, 0x8d, + 0x35, 0xc8, 0x6b, 0x4d, 0xbd, 0x28, 0xaf, 0x26, 0x74, 0xb0, 0x4e, 0xd4, 0xfe, 0x4a, 0x91, 0xef, + 0x76, 0xc6, 0x6d, 0x3f, 0x07, 0x43, 0xad, 0xa0, 0xb9, 0xb8, 0x52, 0xc5, 0x62, 0x16, 0xd4, 0x35, + 0x52, 0xe3, 0xc5, 0x58, 0xc2, 0xd1, 0xeb, 0x00, 0xe4, 0x61, 0x4c, 0x42, 0xdf, 0xf1, 0x94, 0x41, + 0x88, 0x32, 0x81, 0xac, 0x06, 0x6b, 0x41, 0x7c, 0x37, 0x22, 0xdf, 0xb5, 0xa4, 0x50, 0xb0, 0x86, + 0x8e, 0xae, 0x01, 0xb4, 0xc2, 0x60, 0xcf, 0x6d, 0x32, 0xd7, 0xb9, 0xa2, 0x69, 0x2e, 0x51, 0x53, + 0x10, 0xac, 0x61, 0xa1, 0xd7, 0x61, 0xac, 0xed, 0x47, 0x9c, 0x43, 0x71, 0x36, 0x44, 0xe4, 0xc1, + 0xe1, 0xc4, 0x72, 0xe1, 0xae, 0x0e, 0xc4, 0x26, 0x2e, 0x9a, 0x87, 0xc1, 0xd8, 0x61, 0xf6, 0x0e, + 0x03, 0xf9, 0x76, 0x8b, 0xeb, 0x14, 0x43, 0x0f, 0x18, 0x4b, 0x2b, 0x60, 0x51, 0x11, 0xbd, 0x2d, + 0xfd, 0x10, 0xf8, 0x59, 0x2f, 0x0c, 0x86, 0xfb, 0xbb, 0x17, 0x34, 0x2f, 0x04, 0x61, 0x88, 0x6c, + 0xd0, 0xb2, 0xbf, 0x51, 0x06, 0x48, 0xd8, 0x71, 0xf4, 0x7e, 0xc7, 0x79, 0xf4, 0x42, 0x77, 0x06, + 0xfe, 0xe4, 0x0e, 0x23, 0xf4, 0xfd, 0x16, 0x8c, 0x38, 0x9e, 0x17, 0x34, 0x9c, 0x98, 0x8d, 0x72, + 0xa1, 0xfb, 0x79, 0x28, 0xda, 0x9f, 0x4f, 0x6a, 0xf0, 0x2e, 0xbc, 0x2c, 0x17, 0x9e, 0x06, 0xe9, + 0xd9, 0x0b, 0xbd, 0x61, 0xf4, 0x29, 0x29, 0xa5, 0xf1, 0xe5, 0x31, 0x93, 0x96, 0xd2, 0xca, 0xec, + 0xe8, 0xd7, 0x04, 0x34, 0x74, 0xd7, 0x08, 0x2a, 0x57, 0xca, 0x8f, 0xaf, 0x60, 0x70, 0xa5, 0xbd, + 0xe2, 0xc9, 0xa1, 0x9a, 0xee, 0x38, 0x35, 0x90, 0x1f, 0x84, 0x44, 0x13, 0x7f, 0x7a, 0x38, 0x4d, + 0xbd, 0x0b, 0x13, 0x4d, 0xf3, 0x6e, 0x17, 0xab, 0xe9, 0xd9, 0x3c, 0xba, 0x29, 0x56, 0x20, 0xb9, + 0xcd, 0x53, 0x00, 0x9c, 0x26, 0x8c, 0x6a, 0xdc, 0x85, 0x6d, 0xc5, 0xdf, 0x0c, 0x84, 0xe1, 0xb9, + 0x9d, 0x3b, 0x97, 0xfb, 0x51, 0x4c, 0x76, 0x29, 0x66, 0x72, 0x69, 0xaf, 0x89, 0xba, 0x58, 0x51, + 0x41, 0x6f, 0xc2, 0x20, 0xf3, 0x81, 0x8d, 0xa6, 0x87, 0xf3, 0x15, 0x85, 0x66, 0xf8, 0x86, 0x64, + 0x53, 0xb1, 0xbf, 0x11, 0x16, 0x14, 0xd0, 0x4d, 0x19, 0xe3, 0x25, 0x5a, 0xf1, 0xef, 0x46, 0x84, + 0xc5, 0x78, 0x29, 0x2f, 0x7c, 0x3c, 0x09, 0xdf, 0xc2, 0xcb, 0x33, 0x43, 0xc3, 0x1b, 0x35, 0x29, + 0x73, 0x24, 0xfe, 0xcb, 0x88, 0xf3, 0xd3, 0x90, 0xdf, 0x3d, 0x33, 0x2a, 0x7d, 0x32, 0x9c, 0xf7, + 0x4c, 0x12, 0x38, 0x4d, 0x93, 0x32, 0x9a, 0x7c, 0xe7, 0x0a, 0xd3, 0xf5, 0x5e, 0xfb, 0x9f, 0xcb, + 0xd7, 0xec, 0x92, 0xe1, 0x25, 0x58, 0xd4, 0x3f, 0xd5, 0x5b, 0x7f, 0xc6, 0x87, 0xc9, 0xf4, 0x16, + 0x7d, 0xac, 0x5c, 0xc6, 0xef, 0x95, 0x60, 0xdc, 0x5c, 0x52, 0x68, 0x0e, 0xca, 0x82, 0x88, 0x0a, + 0x38, 0xaa, 0x76, 0xc9, 0xaa, 0x04, 0xe0, 0x04, 0x87, 0xc5, 0x99, 0x65, 0xd5, 0x35, 0x93, 0xc3, + 0x24, 0xce, 0xac, 0x82, 0x60, 0x0d, 0x8b, 0xca, 0x4b, 0x1b, 0x41, 0x10, 0xab, 0x4b, 0x45, 0xad, + 0xbb, 0x05, 0x56, 0x8a, 0x05, 0x94, 0x5e, 0x26, 0x3b, 0x24, 0xf4, 0x89, 0x67, 0xc6, 0x31, 0x53, + 0x97, 0xc9, 0x2d, 0x1d, 0x88, 0x4d, 0x5c, 0x7a, 0x4b, 0x06, 0x11, 0x5b, 0xc8, 0x42, 0x2a, 0x4b, + 0x4c, 0x38, 0xeb, 0xdc, 0x9b, 0x5c, 0xc2, 0xd1, 0x17, 0xe0, 0x09, 0xe5, 0xfc, 0x8d, 0xb9, 0x12, + 0x5a, 0xb6, 0x38, 0x68, 0x28, 0x51, 0x9e, 0x58, 0xcc, 0x46, 0xc3, 0x79, 0xf5, 0xd1, 0x1b, 0x30, + 0x2e, 0x38, 0x77, 0x49, 0x71, 0xc8, 0xb4, 0x8b, 0xb8, 0x65, 0x40, 0x71, 0x0a, 0x5b, 0x46, 0x62, + 0x63, 0xcc, 0xb3, 0xa4, 0x30, 0xdc, 0x19, 0x89, 0x4d, 0x87, 0xe3, 0x8e, 0x1a, 0x68, 0x1e, 0x26, + 0x38, 0x6b, 0xe5, 0xfa, 0x5b, 0x7c, 0x4e, 0x84, 0x67, 0x89, 0xda, 0x52, 0x77, 0x4c, 0x30, 0x4e, + 0xe3, 0xa3, 0xeb, 0x30, 0xea, 0x84, 0x8d, 0x6d, 0x37, 0x26, 0x8d, 0xb8, 0x1d, 0x72, 0x97, 0x13, + 0xcd, 0xb0, 0x64, 0x5e, 0x83, 0x61, 0x03, 0xd3, 0x7e, 0x1f, 0xce, 0x64, 0x38, 0xa5, 0xd1, 0x85, + 0xe3, 0xb4, 0x5c, 0xf9, 0x4d, 0x29, 0x63, 0xcc, 0xf9, 0xda, 0x8a, 0xfc, 0x1a, 0x0d, 0x8b, 0xae, + 0x4e, 0xe6, 0xbc, 0xa6, 0x25, 0x98, 0x50, 0xab, 0x73, 0x59, 0x02, 0x70, 0x82, 0x63, 0xff, 0xaf, + 0x02, 0x4c, 0x64, 0x28, 0xd6, 0x59, 0x92, 0x83, 0x94, 0xec, 0x91, 0xe4, 0x34, 0x30, 0x03, 0xfb, + 0x15, 0x8e, 0x11, 0xd8, 0xaf, 0xd8, 0x2b, 0xb0, 0x5f, 0xe9, 0x83, 0x04, 0xf6, 0x33, 0x47, 0x6c, + 0xa0, 0xaf, 0x11, 0xcb, 0x08, 0x06, 0x38, 0x78, 0xcc, 0x60, 0x80, 0xc6, 0xa0, 0x0f, 0xf5, 0x31, + 0xe8, 0x3f, 0x5a, 0x80, 0xc9, 0xb4, 0x01, 0xdc, 0x29, 0xa8, 0x63, 0xdf, 0x34, 0xd4, 0xb1, 0xd9, + 0x29, 0x43, 0xd2, 0x66, 0x79, 0x79, 0xaa, 0x59, 0x9c, 0x52, 0xcd, 0x7e, 0xb2, 0x2f, 0x6a, 0xdd, + 0xd5, 0xb4, 0x7f, 0xa7, 0x00, 0xe7, 0xd2, 0x55, 0x16, 0x3d, 0xc7, 0xdd, 0x3d, 0x85, 0xb1, 0xb9, + 0x63, 0x8c, 0xcd, 0x8b, 0xfd, 0x7c, 0x0d, 0xeb, 0x5a, 0xee, 0x00, 0xdd, 0x4f, 0x0d, 0xd0, 0x5c, + 0xff, 0x24, 0xbb, 0x8f, 0xd2, 0x37, 0x8b, 0x70, 0x29, 0xb3, 0x5e, 0xa2, 0xcd, 0x5c, 0x36, 0xb4, + 0x99, 0xd7, 0x52, 0xda, 0x4c, 0xbb, 0x7b, 0xed, 0x93, 0x51, 0x6f, 0x0a, 0x6f, 0x41, 0x16, 0xfc, + 0xed, 0x11, 0x55, 0x9b, 0x86, 0xb7, 0xa0, 0x22, 0x84, 0x4d, 0xba, 0x7f, 0x96, 0x54, 0x9a, 0xff, + 0xc6, 0x82, 0x0b, 0x99, 0x73, 0x73, 0x0a, 0x2a, 0xac, 0x35, 0x53, 0x85, 0xf5, 0x5c, 0xdf, 0xab, + 0x35, 0x47, 0xa7, 0xf5, 0xfb, 0xc5, 0x9c, 0x6f, 0x61, 0x02, 0xfa, 0x1d, 0x18, 0x71, 0x1a, 0x0d, + 0x12, 0x45, 0xab, 0x41, 0x53, 0x05, 0x43, 0x7b, 0x91, 0xc9, 0x59, 0x49, 0xf1, 0xd1, 0x41, 0x65, + 0x26, 0x4d, 0x22, 0x01, 0x63, 0x9d, 0x82, 0x19, 0xbf, 0xb1, 0x70, 0xa2, 0xf1, 0x1b, 0xaf, 0x01, + 0xec, 0x29, 0x6e, 0x3d, 0x2d, 0xe4, 0x6b, 0x7c, 0xbc, 0x86, 0x85, 0xbe, 0x08, 0xc3, 0x91, 0xb8, + 0xc6, 0xc5, 0x52, 0x7c, 0xb9, 0xcf, 0xb9, 0x72, 0x36, 0x88, 0x67, 0xba, 0xa5, 0x2b, 0x7d, 0x88, + 0x22, 0x89, 0xbe, 0x03, 0x26, 0x23, 0x1e, 0xf5, 0x64, 0xd1, 0x73, 0x22, 0xe6, 0xe3, 0x20, 0x56, + 0x21, 0xf3, 0x35, 0xaf, 0xa7, 0x60, 0xb8, 0x03, 0x1b, 0x2d, 0xcb, 0x8f, 0x62, 0x21, 0x5a, 0xf8, + 0xc2, 0xbc, 0x92, 0x7c, 0x90, 0x48, 0xb1, 0x74, 0x36, 0x3d, 0xfc, 0x6c, 0xe0, 0xb5, 0x9a, 0xf6, + 0x8f, 0x96, 0xe0, 0xc9, 0x2e, 0x87, 0x18, 0x9a, 0x37, 0xdf, 0x28, 0x9f, 0x4f, 0x4b, 0xbf, 0x33, + 0x99, 0x95, 0x0d, 0x71, 0x38, 0xb5, 0x56, 0x0a, 0x1f, 0x78, 0xad, 0xfc, 0x90, 0xa5, 0xe9, 0x25, + 0xb8, 0x25, 0xdd, 0xe7, 0x8e, 0x79, 0x38, 0x9f, 0xa0, 0xa2, 0x62, 0x33, 0x43, 0xda, 0xbf, 0xd6, + 0x77, 0x77, 0xfa, 0x16, 0xff, 0x4f, 0x57, 0x3b, 0xfb, 0x15, 0x0b, 0x9e, 0xce, 0xec, 0xaf, 0x61, + 0x53, 0x31, 0x07, 0xe5, 0x06, 0x2d, 0xd4, 0xfc, 0xa6, 0x12, 0x87, 0x52, 0x09, 0xc0, 0x09, 0x8e, + 0x61, 0x3a, 0x51, 0xe8, 0x69, 0x3a, 0xf1, 0x2f, 0x2c, 0xe8, 0x58, 0xc0, 0xa7, 0x70, 0x92, 0xae, + 0x98, 0x27, 0xe9, 0xc7, 0xfb, 0x99, 0xcb, 0x9c, 0x43, 0xf4, 0x3f, 0x4f, 0xc0, 0xf9, 0x1c, 0x47, + 0x89, 0x3d, 0x98, 0xda, 0x6a, 0x10, 0xd3, 0x23, 0x4d, 0x7c, 0x4c, 0xa6, 0xf3, 0x5e, 0x57, 0xf7, + 0x35, 0x96, 0x1b, 0x67, 0xaa, 0x03, 0x05, 0x77, 0x36, 0x81, 0xbe, 0x62, 0xc1, 0x59, 0xe7, 0x41, + 0xd4, 0x91, 0x01, 0x51, 0xac, 0x99, 0x57, 0x32, 0xb5, 0x14, 0x3d, 0x32, 0x26, 0xf2, 0x64, 0x41, + 0x59, 0x58, 0x38, 0xb3, 0x2d, 0x84, 0x45, 0xfc, 0x4a, 0xca, 0x6f, 0x77, 0xf1, 0x99, 0xcc, 0xf2, + 0x68, 0xe1, 0x67, 0xaa, 0x84, 0x60, 0x45, 0x07, 0xdd, 0x83, 0xf2, 0x96, 0x74, 0x33, 0x13, 0x67, + 0x76, 0xe6, 0x25, 0x98, 0xe9, 0x8b, 0xc6, 0xdf, 0x0d, 0x15, 0x08, 0x27, 0xa4, 0xd0, 0x1b, 0x50, + 0xf4, 0x37, 0xa3, 0x6e, 0x59, 0x76, 0x52, 0xa6, 0x46, 0xdc, 0x1f, 0x79, 0x6d, 0xb9, 0x8e, 0x69, + 0x45, 0x74, 0x13, 0x8a, 0xe1, 0x46, 0x53, 0x28, 0xd6, 0x32, 0xf9, 0x52, 0xbc, 0x50, 0xcd, 0x5e, + 0x24, 0x9c, 0x12, 0x5e, 0xa8, 0x62, 0x4a, 0x02, 0xd5, 0x60, 0x80, 0xf9, 0x14, 0x08, 0xfd, 0x59, + 0x26, 0x43, 0xda, 0xc5, 0x37, 0x87, 0x3b, 0x2d, 0x33, 0x04, 0xcc, 0x09, 0xa1, 0x75, 0x18, 0x6c, + 0xb0, 0x8c, 0x2c, 0x22, 0x64, 0xf2, 0xa7, 0x32, 0x55, 0x68, 0x5d, 0x52, 0xd5, 0x08, 0x8d, 0x12, + 0xc3, 0xc0, 0x82, 0x16, 0xa3, 0x4a, 0x5a, 0xdb, 0x9b, 0x11, 0x13, 0xc1, 0xf3, 0xa8, 0x76, 0xc9, + 0xc0, 0x24, 0xa8, 0x32, 0x0c, 0x2c, 0x68, 0xa1, 0xcf, 0x40, 0x61, 0xb3, 0x21, 0x5c, 0x0e, 0x32, + 0x75, 0x69, 0xa6, 0x4b, 0xf9, 0xc2, 0xe0, 0xe1, 0x41, 0xa5, 0xb0, 0xbc, 0x88, 0x0b, 0x9b, 0x0d, + 0xb4, 0x06, 0x43, 0x9b, 0xdc, 0x09, 0x55, 0xa8, 0xcb, 0x9e, 0xcd, 0xf6, 0x8f, 0xed, 0xf0, 0x53, + 0xe5, 0xa6, 0xf2, 0x02, 0x80, 0x25, 0x11, 0x16, 0x04, 0x52, 0x39, 0xd3, 0x8a, 0x68, 0xc8, 0xb3, + 0xc7, 0x73, 0x80, 0xe6, 0xee, 0xed, 0x89, 0x4b, 0x2e, 0xd6, 0x28, 0xa2, 0x2f, 0x43, 0xd9, 0x91, + 0xb9, 0xf7, 0x44, 0xb4, 0x88, 0x97, 0x33, 0x37, 0x66, 0xf7, 0xb4, 0x84, 0x7c, 0x55, 0x2b, 0x24, + 0x9c, 0x10, 0x45, 0x3b, 0x30, 0xb6, 0x17, 0xb5, 0xb6, 0x89, 0xdc, 0xc8, 0x2c, 0x78, 0x44, 0xce, + 0xc5, 0x75, 0x4f, 0x20, 0xba, 0x61, 0xdc, 0x76, 0xbc, 0x8e, 0xb3, 0x87, 0x3d, 0x36, 0xdf, 0xd3, + 0x89, 0x61, 0x93, 0x36, 0x1d, 0xfe, 0xf7, 0xda, 0xc1, 0xc6, 0x7e, 0x4c, 0x44, 0xf8, 0xe4, 0xcc, + 0xe1, 0x7f, 0x8b, 0xa3, 0x74, 0x0e, 0xbf, 0x00, 0x60, 0x49, 0x84, 0x6e, 0x75, 0x47, 0xe6, 0xb5, + 0x64, 0x61, 0x93, 0x73, 0xb6, 0x7a, 0x66, 0xf2, 0x4b, 0x6d, 0x50, 0xd8, 0x19, 0x99, 0x90, 0x62, + 0x67, 0x63, 0x6b, 0x3b, 0x88, 0x03, 0x3f, 0x75, 0x2e, 0x4f, 0xe5, 0x9f, 0x8d, 0xb5, 0x0c, 0xfc, + 0xce, 0xb3, 0x31, 0x0b, 0x0b, 0x67, 0xb6, 0x85, 0x9a, 0x30, 0xde, 0x0a, 0xc2, 0xf8, 0x41, 0x10, + 0xca, 0xf5, 0x85, 0xba, 0x88, 0xfb, 0x06, 0xa6, 0x68, 0x91, 0x85, 0xf3, 0x36, 0x21, 0x38, 0x45, + 0x13, 0x7d, 0x1e, 0x86, 0xa2, 0x86, 0xe3, 0x91, 0x95, 0x3b, 0xd3, 0x67, 0xf2, 0x2f, 0x9d, 0x3a, + 0x47, 0xc9, 0x59, 0x5d, 0x6c, 0x72, 0x04, 0x0a, 0x96, 0xe4, 0xd0, 0x32, 0x0c, 0xb0, 0x98, 0xfc, + 0x2c, 0xf2, 0x73, 0x4e, 0x54, 0xa2, 0x0e, 0xa3, 0x4e, 0x7e, 0x36, 0xb1, 0x62, 0xcc, 0xab, 0xd3, + 0x3d, 0x20, 0xb8, 0xde, 0x20, 0x9a, 0x3e, 0x97, 0xbf, 0x07, 0x04, 0xb3, 0x7c, 0xa7, 0xde, 0x6d, + 0x0f, 0x28, 0x24, 0x9c, 0x10, 0xa5, 0x27, 0x33, 0x3d, 0x4d, 0xcf, 0x77, 0xb1, 0x33, 0xc9, 0x3d, + 0x4b, 0xd9, 0xc9, 0x4c, 0x4f, 0x52, 0x4a, 0xc2, 0xfe, 0x9d, 0xa1, 0x4e, 0x4e, 0x85, 0xc9, 0x49, + 0x7f, 0xd1, 0xea, 0x78, 0x42, 0xfb, 0x74, 0xbf, 0x6a, 0x9b, 0x13, 0xe4, 0x51, 0xbf, 0x62, 0xc1, + 0xf9, 0x56, 0xe6, 0x87, 0x88, 0x6b, 0xbf, 0x3f, 0xed, 0x0f, 0xff, 0x74, 0x15, 0x9d, 0x3d, 0x1b, + 0x8e, 0x73, 0x5a, 0x4a, 0xcb, 0x01, 0xc5, 0x0f, 0x2c, 0x07, 0xac, 0xc2, 0x30, 0x63, 0x2d, 0x7b, + 0x64, 0x28, 0x4b, 0x7b, 0xa1, 0x31, 0x06, 0x62, 0x51, 0x54, 0xc4, 0x8a, 0x04, 0xfa, 0x61, 0x0b, + 0x2e, 0xa6, 0xbb, 0x8e, 0x09, 0x03, 0x8b, 0x58, 0xe6, 0x5c, 0x44, 0x5b, 0x16, 0xdf, 0x7f, 0xb1, + 0xd6, 0x0d, 0xf9, 0xa8, 0x17, 0x02, 0xee, 0xde, 0x18, 0xaa, 0x66, 0xc8, 0x88, 0x83, 0xa6, 0x5e, + 0xbc, 0x0f, 0x39, 0xf1, 0x15, 0x18, 0xdd, 0x0d, 0xda, 0x7e, 0x2c, 0xcc, 0x52, 0x84, 0x93, 0x20, + 0x7b, 0x07, 0x5e, 0xd5, 0xca, 0xb1, 0x81, 0x95, 0x92, 0x2e, 0x87, 0x1f, 0x55, 0xba, 0x44, 0xef, + 0xa4, 0xf2, 0x50, 0x97, 0xf3, 0x63, 0xe6, 0x09, 0x41, 0xfc, 0x18, 0xd9, 0xa8, 0x4f, 0x57, 0x22, + 0xfa, 0x59, 0x2b, 0x83, 0x95, 0xe7, 0x32, 0xf2, 0x67, 0x4d, 0x19, 0xf9, 0x4a, 0x5a, 0x46, 0xee, + 0xd0, 0x89, 0x1a, 0xe2, 0x71, 0xff, 0x81, 0x97, 0xfb, 0x8d, 0x64, 0x66, 0x7b, 0x70, 0xb9, 0xd7, + 0xb5, 0xc4, 0xec, 0x93, 0x9a, 0xea, 0x05, 0x2c, 0xb1, 0x4f, 0x6a, 0xae, 0x54, 0x31, 0x83, 0xf4, + 0x1b, 0xea, 0xc2, 0xfe, 0x6f, 0x16, 0x14, 0x6b, 0x41, 0xf3, 0x14, 0x74, 0xbc, 0x9f, 0x33, 0x74, + 0xbc, 0x4f, 0xe6, 0xe4, 0x07, 0xcf, 0xd5, 0xe8, 0x2e, 0xa5, 0x34, 0xba, 0x17, 0xf3, 0x08, 0x74, + 0xd7, 0xdf, 0xfe, 0x54, 0x11, 0xf4, 0x6c, 0xe6, 0xe8, 0x5f, 0x3d, 0x8a, 0x71, 0x70, 0xb1, 0x5b, + 0x82, 0x73, 0x41, 0x99, 0x99, 0x35, 0x49, 0xbf, 0xb7, 0x3f, 0x65, 0x36, 0xc2, 0xf7, 0x89, 0xbb, + 0xb5, 0x1d, 0x93, 0x66, 0xfa, 0x73, 0x4e, 0xcf, 0x46, 0xf8, 0xbf, 0x58, 0x30, 0x91, 0x6a, 0x1d, + 0x79, 0x30, 0xe6, 0xe9, 0x0a, 0x3a, 0xb1, 0x4e, 0x1f, 0x49, 0xb7, 0x27, 0x6c, 0x2c, 0xb5, 0x22, + 0x6c, 0x12, 0x47, 0xb3, 0x00, 0xea, 0x01, 0x4d, 0xea, 0xbd, 0x18, 0xd7, 0xaf, 0x5e, 0xd8, 0x22, + 0xac, 0x61, 0xa0, 0x57, 0x61, 0x24, 0x0e, 0x5a, 0x81, 0x17, 0x6c, 0xed, 0xdf, 0x22, 0x32, 0xb8, + 0x8a, 0xb2, 0x9c, 0x5a, 0x4f, 0x40, 0x58, 0xc7, 0xb3, 0x7f, 0xa6, 0x08, 0xe9, 0x0c, 0xf8, 0xdf, + 0x5a, 0x93, 0x1f, 0xcd, 0x35, 0xf9, 0x4d, 0x0b, 0x26, 0x69, 0xeb, 0xcc, 0x8a, 0x43, 0x5e, 0xb6, + 0x2a, 0x01, 0x8c, 0xd5, 0x25, 0x01, 0xcc, 0x15, 0x7a, 0x76, 0x35, 0x83, 0x76, 0x2c, 0xf4, 0x66, + 0xda, 0xe1, 0x44, 0x4b, 0xb1, 0x80, 0x0a, 0x3c, 0x12, 0x86, 0xc2, 0x35, 0x49, 0xc7, 0x23, 0x61, + 0x88, 0x05, 0x54, 0xe6, 0x87, 0x29, 0xe5, 0xe4, 0x87, 0x61, 0xa1, 0xe2, 0xc4, 0x7b, 0xbf, 0x60, + 0x7b, 0xb4, 0x50, 0x71, 0xd2, 0x10, 0x20, 0xc1, 0xb1, 0x7f, 0xa1, 0x08, 0xa3, 0xb5, 0xa0, 0x99, + 0x3c, 0x61, 0xbd, 0x62, 0x3c, 0x61, 0x5d, 0x4e, 0x3d, 0x61, 0x4d, 0xea, 0xb8, 0xdf, 0x7a, 0xb0, + 0xfa, 0xb0, 0x1e, 0xac, 0xfe, 0xb9, 0xc5, 0x66, 0xad, 0xba, 0x56, 0x17, 0xf9, 0x69, 0x5f, 0x82, + 0x11, 0x76, 0x20, 0x31, 0x5f, 0x38, 0xf9, 0xae, 0xc3, 0x42, 0xbf, 0xaf, 0x25, 0xc5, 0x58, 0xc7, + 0x41, 0x57, 0x61, 0x38, 0x22, 0x4e, 0xd8, 0xd8, 0x56, 0x67, 0x9c, 0x78, 0xf5, 0xe0, 0x65, 0x58, + 0x41, 0xd1, 0x5b, 0x49, 0x94, 0xb2, 0x62, 0x7e, 0xa6, 0x55, 0xbd, 0x3f, 0x7c, 0x8b, 0xe4, 0x87, + 0x26, 0xb3, 0xef, 0x03, 0xea, 0xc4, 0xef, 0x23, 0x1e, 0x51, 0xc5, 0x8c, 0x47, 0x54, 0xee, 0x88, + 0x45, 0xf4, 0xc7, 0x16, 0x8c, 0xd7, 0x82, 0x26, 0xdd, 0xba, 0x7f, 0x96, 0xf6, 0xa9, 0x1e, 0xa2, + 0x71, 0xb0, 0x4b, 0x88, 0xc6, 0xbf, 0x6b, 0xc1, 0x50, 0x2d, 0x68, 0x9e, 0x82, 0xb6, 0xfd, 0xb3, + 0xa6, 0xb6, 0xfd, 0x89, 0x9c, 0x25, 0x91, 0xa3, 0x60, 0xff, 0xa5, 0x22, 0x8c, 0xd1, 0x7e, 0x06, + 0x5b, 0x72, 0x96, 0x8c, 0x11, 0xb1, 0xfa, 0x18, 0x11, 0xca, 0xe6, 0x06, 0x9e, 0x17, 0x3c, 0x48, + 0xcf, 0xd8, 0x32, 0x2b, 0xc5, 0x02, 0x8a, 0x5e, 0x80, 0xe1, 0x56, 0x48, 0xf6, 0xdc, 0x40, 0xf0, + 0x8f, 0xda, 0xdb, 0x45, 0x4d, 0x94, 0x63, 0x85, 0x41, 0xe5, 0xae, 0xc8, 0xf5, 0x1b, 0x44, 0xa6, + 0x79, 0x2e, 0xb1, 0x4c, 0x50, 0x3c, 0xf6, 0xb2, 0x56, 0x8e, 0x0d, 0x2c, 0x74, 0x1f, 0xca, 0xec, + 0x3f, 0x3b, 0x51, 0x8e, 0x9f, 0xb9, 0x46, 0x24, 0x3c, 0x10, 0x04, 0x70, 0x42, 0x0b, 0x5d, 0x03, + 0x88, 0x65, 0x7c, 0xde, 0x48, 0x84, 0x95, 0x51, 0xbc, 0xb6, 0x8a, 0xdc, 0x1b, 0x61, 0x0d, 0x0b, + 0x3d, 0x0f, 0xe5, 0xd8, 0x71, 0xbd, 0xdb, 0xae, 0x4f, 0x22, 0xa6, 0x72, 0x2e, 0xca, 0x7c, 0x06, + 0xa2, 0x10, 0x27, 0x70, 0xca, 0xeb, 0x30, 0x9f, 0x6b, 0x9e, 0xf7, 0x6a, 0x98, 0x61, 0x33, 0x5e, + 0xe7, 0xb6, 0x2a, 0xc5, 0x1a, 0x86, 0x7d, 0x1d, 0xce, 0xd5, 0x82, 0x66, 0x2d, 0x08, 0xe3, 0xe5, + 0x20, 0x7c, 0xe0, 0x84, 0x4d, 0x39, 0x7f, 0x15, 0x19, 0x5a, 0x9f, 0x9e, 0x3d, 0x03, 0x7c, 0x67, + 0x1a, 0x41, 0xf3, 0x5f, 0x66, 0xdc, 0xce, 0x31, 0x7d, 0x2d, 0x1a, 0xec, 0xde, 0x55, 0x29, 0xee, + 0x6e, 0x38, 0x31, 0x41, 0x77, 0x58, 0x5a, 0xac, 0xe4, 0x0a, 0x12, 0xd5, 0x9f, 0xd3, 0xd2, 0x62, + 0x25, 0xc0, 0xcc, 0x3b, 0xcb, 0xac, 0x6f, 0xff, 0x9f, 0x02, 0x3b, 0x8d, 0x52, 0x19, 0xdf, 0xd0, + 0x97, 0x60, 0x3c, 0x22, 0xb7, 0x5d, 0xbf, 0xfd, 0x50, 0x0a, 0xe1, 0x5d, 0xbc, 0x65, 0xea, 0x4b, + 0x3a, 0x26, 0x57, 0xe5, 0x99, 0x65, 0x38, 0x45, 0x8d, 0xce, 0x53, 0xd8, 0xf6, 0xe7, 0xa3, 0xbb, + 0x11, 0x09, 0x45, 0xc6, 0x31, 0x36, 0x4f, 0x58, 0x16, 0xe2, 0x04, 0x4e, 0xd7, 0x25, 0xfb, 0xb3, + 0x16, 0xf8, 0x38, 0x08, 0x62, 0xb9, 0x92, 0x59, 0xce, 0x1a, 0xad, 0x1c, 0x1b, 0x58, 0x68, 0x19, + 0x50, 0xd4, 0x6e, 0xb5, 0x3c, 0xf6, 0xde, 0xee, 0x78, 0x37, 0xc2, 0xa0, 0xdd, 0xe2, 0x6f, 0x9d, + 0xc5, 0x85, 0xf3, 0xf4, 0x0a, 0xab, 0x77, 0x40, 0x71, 0x46, 0x0d, 0x7a, 0xfa, 0x6c, 0x46, 0xec, + 0x37, 0x5b, 0xdd, 0x45, 0xa1, 0x5e, 0xaf, 0xb3, 0x22, 0x2c, 0x61, 0x74, 0x31, 0xb1, 0xe6, 0x39, + 0xe6, 0x60, 0xb2, 0x98, 0xb0, 0x2a, 0xc5, 0x1a, 0x86, 0xfd, 0x3d, 0xec, 0x16, 0x63, 0x89, 0xa5, + 0xe2, 0x76, 0x48, 0xd0, 0x2e, 0x8c, 0xb5, 0xd8, 0x5c, 0x89, 0xb0, 0xc7, 0x62, 0xc0, 0x5f, 0xe9, + 0x53, 0x1c, 0x7d, 0x40, 0x4f, 0x08, 0xa5, 0x2e, 0x62, 0x7c, 0x7e, 0x4d, 0x27, 0x87, 0x4d, 0xea, + 0xf6, 0x0f, 0x4e, 0xb1, 0xc3, 0xb2, 0xce, 0x65, 0xcc, 0x21, 0x61, 0xaa, 0x2b, 0x18, 0xea, 0x99, + 0x7c, 0x65, 0x47, 0x72, 0xaf, 0x09, 0x73, 0x5f, 0x2c, 0xeb, 0xa2, 0xb7, 0xd8, 0xa3, 0x32, 0x3f, + 0xa1, 0x7a, 0xe5, 0xf7, 0xe5, 0x58, 0xc6, 0xfb, 0xb1, 0xa8, 0x88, 0x35, 0x22, 0xe8, 0x36, 0x8c, + 0x89, 0x3c, 0x44, 0x42, 0x9b, 0x55, 0x34, 0xb4, 0x15, 0x63, 0x58, 0x07, 0x1e, 0xa5, 0x0b, 0xb0, + 0x59, 0x19, 0x6d, 0xc1, 0x45, 0x2d, 0x29, 0xdf, 0x8d, 0xd0, 0x61, 0x0f, 0x8d, 0x2e, 0x5b, 0xfd, + 0xda, 0x81, 0xf7, 0xf4, 0xe1, 0x41, 0xe5, 0xe2, 0x7a, 0x37, 0x44, 0xdc, 0x9d, 0x0e, 0xba, 0x03, + 0xe7, 0xb8, 0x47, 0x5c, 0x95, 0x38, 0x4d, 0xcf, 0xf5, 0xd5, 0x89, 0xca, 0x17, 0xd0, 0x85, 0xc3, + 0x83, 0xca, 0xb9, 0xf9, 0x2c, 0x04, 0x9c, 0x5d, 0x0f, 0x7d, 0x16, 0xca, 0x4d, 0x3f, 0x12, 0x63, + 0x30, 0x68, 0xe4, 0x9b, 0x2c, 0x57, 0xd7, 0xea, 0xea, 0xfb, 0x93, 0x3f, 0x38, 0xa9, 0x80, 0xb6, + 0xb8, 0x46, 0x4b, 0x09, 0x90, 0x43, 0xf9, 0xb9, 0xc5, 0xc5, 0x92, 0x30, 0x7c, 0x62, 0xb8, 0x2a, + 0x57, 0xd9, 0x94, 0x1a, 0xee, 0x32, 0x06, 0x61, 0xf4, 0x26, 0x20, 0xca, 0x61, 0xb9, 0x0d, 0x32, + 0xdf, 0x60, 0xd1, 0xa7, 0x99, 0x02, 0x70, 0xd8, 0xf0, 0x41, 0x40, 0xf5, 0x0e, 0x0c, 0x9c, 0x51, + 0x0b, 0xdd, 0xa4, 0x27, 0x90, 0x5e, 0x2a, 0x6c, 0x63, 0x25, 0x57, 0x3e, 0x5d, 0x25, 0xad, 0x90, + 0x34, 0x9c, 0x98, 0x34, 0x4d, 0x8a, 0x38, 0x55, 0x8f, 0x5e, 0x82, 0x2a, 0x11, 0x0d, 0x98, 0x21, + 0x26, 0x3a, 0x93, 0xd1, 0x50, 0x81, 0x76, 0x3b, 0x88, 0xe2, 0x35, 0x12, 0x3f, 0x08, 0xc2, 0x1d, + 0x11, 0xd1, 0x2b, 0x09, 0x2e, 0x99, 0x80, 0xb0, 0x8e, 0x47, 0x19, 0x58, 0xf6, 0xaa, 0xbb, 0x52, + 0x65, 0x4f, 0x6b, 0xc3, 0xc9, 0x3e, 0xb9, 0xc9, 0x8b, 0xb1, 0x84, 0x4b, 0xd4, 0x95, 0xda, 0x22, + 0x7b, 0x26, 0x4b, 0xa1, 0xae, 0xd4, 0x16, 0xb1, 0x84, 0x23, 0xd2, 0x99, 0xcb, 0x73, 0x3c, 0x5f, + 0x1d, 0xd9, 0x79, 0x8e, 0xf7, 0x99, 0xce, 0xd3, 0x87, 0x49, 0x95, 0x45, 0x94, 0x87, 0x3a, 0x8b, + 0xa6, 0x27, 0xd8, 0x22, 0xe9, 0x3f, 0x4e, 0x9a, 0x52, 0xf0, 0xae, 0xa4, 0x28, 0xe1, 0x0e, 0xda, + 0x46, 0xd0, 0x8f, 0xc9, 0x9e, 0x89, 0x84, 0xe6, 0xa0, 0x1c, 0xb5, 0x37, 0x9a, 0xc1, 0xae, 0xe3, + 0xfa, 0xec, 0x55, 0x4b, 0xe3, 0x8e, 0xea, 0x12, 0x80, 0x13, 0x1c, 0xb4, 0x0c, 0xc3, 0x8e, 0xd4, + 0xde, 0xa2, 0xfc, 0x28, 0x00, 0x4a, 0x67, 0xcb, 0x1d, 0x63, 0xa5, 0xbe, 0x56, 0xd5, 0x45, 0xaf, + 0xc3, 0x98, 0xf0, 0x83, 0xe2, 0xb1, 0x11, 0xd8, 0xab, 0x93, 0x66, 0xe8, 0x5e, 0xd7, 0x81, 0xd8, + 0xc4, 0x45, 0x5f, 0x84, 0x71, 0x4a, 0x25, 0x39, 0xd8, 0xa6, 0xcf, 0xf6, 0x73, 0x22, 0x6a, 0x09, + 0x22, 0xf4, 0xca, 0x38, 0x45, 0x0c, 0x35, 0xe1, 0x29, 0xa7, 0x1d, 0x07, 0x4c, 0x03, 0x6e, 0xae, + 0xff, 0xf5, 0x60, 0x87, 0xf8, 0xec, 0xf1, 0x69, 0x78, 0xe1, 0xf2, 0xe1, 0x41, 0xe5, 0xa9, 0xf9, + 0x2e, 0x78, 0xb8, 0x2b, 0x15, 0x74, 0x17, 0x46, 0xe2, 0xc0, 0x63, 0x26, 0xe7, 0x94, 0x07, 0x38, + 0x9f, 0x1f, 0x34, 0x67, 0x5d, 0xa1, 0xe9, 0xda, 0x1f, 0x55, 0x15, 0xeb, 0x74, 0xd0, 0x3a, 0xdf, + 0x63, 0x2c, 0x9c, 0x28, 0x89, 0xa6, 0x9f, 0xc8, 0x1f, 0x18, 0x15, 0x75, 0xd4, 0xdc, 0x82, 0xa2, + 0x26, 0xd6, 0xc9, 0xa0, 0x1b, 0x30, 0xd5, 0x0a, 0xdd, 0x80, 0x2d, 0x6c, 0xf5, 0xfa, 0x30, 0x6d, + 0xe6, 0x04, 0xa8, 0xa5, 0x11, 0x70, 0x67, 0x1d, 0x2a, 0x1d, 0xca, 0xc2, 0xe9, 0x0b, 0x3c, 0xc1, + 0x14, 0xe7, 0x98, 0x79, 0x19, 0x56, 0x50, 0xb4, 0xca, 0xce, 0x65, 0x2e, 0xc7, 0x4d, 0xcf, 0xe4, + 0x47, 0x4f, 0xd0, 0xe5, 0x3d, 0xce, 0xe8, 0xa8, 0xbf, 0x38, 0xa1, 0x40, 0xef, 0x8d, 0x68, 0xdb, + 0x09, 0x49, 0x2d, 0x0c, 0x1a, 0x84, 0x77, 0x86, 0x5b, 0xbb, 0x3f, 0xc9, 0xa3, 0x1e, 0xd2, 0x7b, + 0xa3, 0x9e, 0x85, 0x80, 0xb3, 0xeb, 0xa1, 0xa6, 0x96, 0x57, 0x99, 0xf2, 0x8f, 0xd1, 0xf4, 0x53, + 0x5d, 0xec, 0x83, 0x52, 0xcc, 0x66, 0xb2, 0x16, 0x8d, 0xe2, 0x08, 0xa7, 0x68, 0xce, 0x7c, 0x3b, + 0x4c, 0x75, 0xdc, 0x17, 0xc7, 0x0a, 0xb8, 0xfd, 0x47, 0x03, 0x50, 0x56, 0x3a, 0x6c, 0x34, 0x67, + 0x3e, 0x4d, 0x5c, 0x48, 0x3f, 0x4d, 0x0c, 0x53, 0x56, 0x5a, 0x7f, 0x8d, 0x58, 0x37, 0xac, 0xd9, + 0x0a, 0xf9, 0xe9, 0xad, 0x74, 0x66, 0xb8, 0xa7, 0xeb, 0x9a, 0xa6, 0x92, 0x28, 0xf6, 0xfd, 0xc6, + 0x51, 0xea, 0xaa, 0xe5, 0xe8, 0x33, 0xbb, 0x2c, 0x95, 0xda, 0x5b, 0x41, 0x73, 0xa5, 0x96, 0x4e, + 0xb7, 0x58, 0xa3, 0x85, 0x98, 0xc3, 0x98, 0xdc, 0x45, 0x99, 0x1b, 0x26, 0x77, 0x0d, 0x3d, 0xa2, + 0xdc, 0x25, 0x09, 0xe0, 0x84, 0x16, 0xf2, 0x60, 0xaa, 0x61, 0x66, 0xca, 0x54, 0xee, 0x6a, 0xcf, + 0xf4, 0xcc, 0x59, 0xd9, 0xd6, 0xd2, 0x92, 0x2d, 0xa6, 0xa9, 0xe0, 0x4e, 0xc2, 0xe8, 0x75, 0x18, + 0x7e, 0x2f, 0x88, 0xd8, 0xe6, 0x13, 0x37, 0xbc, 0x74, 0xeb, 0x19, 0x7e, 0xeb, 0x4e, 0x9d, 0x95, + 0x1f, 0x1d, 0x54, 0x46, 0x6a, 0x41, 0x53, 0xfe, 0xc5, 0xaa, 0x02, 0x7a, 0x08, 0xe7, 0x8c, 0x73, + 0x51, 0x75, 0x17, 0xfa, 0xef, 0xee, 0x45, 0xd1, 0xdc, 0xb9, 0x95, 0x2c, 0x4a, 0x38, 0xbb, 0x01, + 0x7a, 0xd8, 0xf8, 0x81, 0xc8, 0x32, 0x2b, 0xb9, 0x08, 0xc6, 0x2c, 0x94, 0x75, 0xa7, 0xee, 0x14, + 0x02, 0xee, 0xac, 0x63, 0x7f, 0x8d, 0xab, 0xfc, 0x85, 0x62, 0x90, 0x44, 0x6d, 0xef, 0x34, 0x92, + 0x18, 0x2d, 0x19, 0x3a, 0xcb, 0x47, 0x7e, 0x56, 0xfa, 0x75, 0x8b, 0x3d, 0x2b, 0xad, 0x93, 0xdd, + 0x96, 0x47, 0xc5, 0xd3, 0xc7, 0xdf, 0xf1, 0xb7, 0x60, 0x38, 0x16, 0xad, 0x75, 0xcb, 0xbb, 0xa4, + 0x75, 0x8a, 0x3d, 0xad, 0x29, 0xfe, 0x42, 0x96, 0x62, 0x45, 0xc6, 0xfe, 0x27, 0x7c, 0x06, 0x24, + 0xe4, 0x14, 0xf4, 0x47, 0x55, 0x53, 0x7f, 0x54, 0xe9, 0xf1, 0x05, 0x39, 0x7a, 0xa4, 0x7f, 0x6c, + 0xf6, 0x9b, 0x89, 0x72, 0x1f, 0xf5, 0xf7, 0x4c, 0xfb, 0xc7, 0x2c, 0x38, 0x9b, 0x65, 0x00, 0x44, + 0x79, 0x42, 0x2e, 0x48, 0xaa, 0xf7, 0x5d, 0x35, 0x82, 0xf7, 0x44, 0x39, 0x56, 0x18, 0x7d, 0xa7, + 0x34, 0x38, 0x5e, 0xdc, 0xb3, 0x3b, 0x30, 0x56, 0x0b, 0x89, 0x76, 0x07, 0xbc, 0xc1, 0xfd, 0xc3, + 0x78, 0x7f, 0x5e, 0x38, 0xb6, 0x6f, 0x98, 0xfd, 0x73, 0x05, 0x38, 0xcb, 0x1f, 0x68, 0xe6, 0xf7, + 0x02, 0xb7, 0x59, 0x0b, 0x9a, 0x22, 0x1d, 0xc5, 0xdb, 0x30, 0xda, 0xd2, 0xa4, 0xff, 0x6e, 0x91, + 0x97, 0x74, 0x2d, 0x41, 0x22, 0x85, 0xe9, 0xa5, 0xd8, 0xa0, 0x85, 0x9a, 0x30, 0x4a, 0xf6, 0xdc, + 0x86, 0xd2, 0xf2, 0x17, 0x8e, 0x7d, 0x37, 0xa8, 0x56, 0x96, 0x34, 0x3a, 0xd8, 0xa0, 0xfa, 0x18, + 0x32, 0x94, 0xd9, 0x3f, 0x6e, 0xc1, 0x13, 0x39, 0x71, 0x9a, 0x68, 0x73, 0x0f, 0xd8, 0x53, 0x98, + 0x48, 0x76, 0xa4, 0x9a, 0xe3, 0x0f, 0x64, 0x58, 0x40, 0xd1, 0xe7, 0x01, 0xf8, 0x03, 0x17, 0x15, + 0x4a, 0x7a, 0x05, 0xb4, 0x31, 0x62, 0x71, 0x68, 0x31, 0x14, 0x64, 0x7d, 0xac, 0xd1, 0xb2, 0x7f, + 0xba, 0x08, 0x03, 0xec, 0x41, 0x05, 0x2d, 0xc3, 0xd0, 0x36, 0x8f, 0x4a, 0xdc, 0x4f, 0x00, 0xe4, + 0x44, 0xba, 0xe3, 0x05, 0x58, 0x56, 0x46, 0xab, 0x70, 0x86, 0x47, 0x75, 0xf6, 0xaa, 0xc4, 0x73, + 0xf6, 0xa5, 0x92, 0x80, 0x27, 0x08, 0x52, 0xf1, 0x20, 0x56, 0x3a, 0x51, 0x70, 0x56, 0x3d, 0xf4, + 0x06, 0x8c, 0xc7, 0xee, 0x2e, 0x09, 0xda, 0xb1, 0xa4, 0xc4, 0xe3, 0x39, 0x2b, 0x36, 0x6e, 0xdd, + 0x80, 0xe2, 0x14, 0x36, 0x15, 0x77, 0x5a, 0x1d, 0xea, 0x10, 0x2d, 0xe5, 0xbe, 0xa9, 0x02, 0x31, + 0x71, 0x99, 0xe5, 0x4f, 0x9b, 0xd9, 0x39, 0xad, 0x6f, 0x87, 0x24, 0xda, 0x0e, 0xbc, 0xa6, 0xc8, + 0x2f, 0x9d, 0x58, 0xfe, 0xa4, 0xe0, 0xb8, 0xa3, 0x06, 0xa5, 0xb2, 0xe9, 0xb8, 0x5e, 0x3b, 0x24, + 0x09, 0x95, 0x41, 0x93, 0xca, 0x72, 0x0a, 0x8e, 0x3b, 0x6a, 0xd0, 0x75, 0x74, 0x4e, 0x24, 0x7c, + 0x96, 0x5e, 0xea, 0xca, 0x9c, 0x6b, 0x48, 0xfa, 0xeb, 0x74, 0x09, 0xd3, 0x22, 0x0c, 0x5e, 0x54, + 0xca, 0x68, 0x2d, 0x9d, 0xa8, 0xf0, 0xd4, 0x91, 0x54, 0x1e, 0x25, 0xed, 0xf0, 0xef, 0x58, 0x70, + 0x26, 0xc3, 0x6c, 0x94, 0x1f, 0x55, 0x5b, 0x6e, 0x14, 0xab, 0x24, 0x28, 0xda, 0x51, 0xc5, 0xcb, + 0xb1, 0xc2, 0xa0, 0xfb, 0x81, 0x1f, 0x86, 0xe9, 0x03, 0x50, 0x98, 0x65, 0x09, 0xe8, 0xf1, 0x0e, + 0x40, 0x74, 0x19, 0x4a, 0xed, 0x88, 0xc8, 0x00, 0x4b, 0xea, 0xfc, 0x66, 0x0a, 0x59, 0x06, 0xa1, + 0xac, 0xe9, 0x96, 0xd2, 0x85, 0x6a, 0xac, 0x29, 0x57, 0x70, 0x72, 0x98, 0xfd, 0xd5, 0x22, 0x5c, + 0xc8, 0x35, 0x10, 0xa7, 0x5d, 0xda, 0x0d, 0x7c, 0x37, 0x0e, 0xd4, 0x63, 0x1d, 0x0f, 0xf1, 0x41, + 0x5a, 0xdb, 0xab, 0xa2, 0x1c, 0x2b, 0x0c, 0x74, 0x45, 0xa6, 0x1e, 0x4f, 0xa7, 0x79, 0x59, 0xa8, + 0x1a, 0xd9, 0xc7, 0xfb, 0x4d, 0xa1, 0xf5, 0x0c, 0x94, 0x5a, 0x41, 0xe0, 0xa5, 0x0f, 0x23, 0xda, + 0xdd, 0x20, 0xf0, 0x30, 0x03, 0xa2, 0x4f, 0x88, 0x71, 0x48, 0xbd, 0x4e, 0x61, 0xa7, 0x19, 0x44, + 0xda, 0x60, 0x3c, 0x07, 0x43, 0x3b, 0x64, 0x3f, 0x74, 0xfd, 0xad, 0xf4, 0xab, 0xe5, 0x2d, 0x5e, + 0x8c, 0x25, 0xdc, 0xcc, 0x72, 0x30, 0x74, 0xd2, 0xb9, 0xaf, 0x86, 0x7b, 0x5e, 0x6d, 0x3f, 0x54, + 0x84, 0x09, 0xbc, 0x50, 0xfd, 0xd6, 0x44, 0xdc, 0xed, 0x9c, 0x88, 0x93, 0xce, 0x7d, 0xd5, 0x7b, + 0x36, 0x7e, 0xc9, 0x82, 0x09, 0x16, 0x09, 0x58, 0x04, 0x96, 0x70, 0x03, 0xff, 0x14, 0x58, 0xb7, + 0x67, 0x60, 0x20, 0xa4, 0x8d, 0xa6, 0x13, 0xda, 0xb0, 0x9e, 0x60, 0x0e, 0x43, 0x4f, 0x41, 0x89, + 0x75, 0x81, 0x4e, 0xde, 0x28, 0xcf, 0x05, 0x50, 0x75, 0x62, 0x07, 0xb3, 0x52, 0xe6, 0x2d, 0x8d, + 0x49, 0xcb, 0x73, 0x79, 0xa7, 0x93, 0x07, 0x85, 0x8f, 0x86, 0xb7, 0x74, 0x66, 0xd7, 0x3e, 0x98, + 0xb7, 0x74, 0x36, 0xc9, 0xee, 0x62, 0xd1, 0x7f, 0x2f, 0xc0, 0xa5, 0xcc, 0x7a, 0x7d, 0x7b, 0x4b, + 0x77, 0xaf, 0x7d, 0x32, 0xc6, 0x27, 0xd9, 0x36, 0x21, 0xc5, 0x53, 0xb4, 0x09, 0x29, 0xf5, 0xcb, + 0x39, 0x0e, 0xf4, 0xe1, 0xc4, 0x9c, 0x39, 0x64, 0x1f, 0x11, 0x27, 0xe6, 0xcc, 0xbe, 0xe5, 0x88, + 0x75, 0x7f, 0x52, 0xc8, 0xf9, 0x16, 0x26, 0xe0, 0x5d, 0xa5, 0xe7, 0x0c, 0x03, 0x46, 0x82, 0x13, + 0x1e, 0xe5, 0x67, 0x0c, 0x2f, 0xc3, 0x0a, 0x8a, 0x5c, 0xcd, 0x1d, 0xb8, 0x90, 0x9f, 0xee, 0x30, + 0xb7, 0xa9, 0x59, 0xf3, 0xfd, 0x47, 0x0d, 0x41, 0x86, 0x6b, 0xf0, 0xaa, 0x26, 0x94, 0x17, 0xfb, + 0x17, 0xca, 0x47, 0xb3, 0x05, 0x72, 0x34, 0x0f, 0x13, 0xbb, 0xae, 0xcf, 0xd2, 0xd7, 0x9b, 0xac, + 0xa8, 0x8a, 0x8e, 0xb1, 0x6a, 0x82, 0x71, 0x1a, 0x7f, 0xe6, 0x75, 0x18, 0x7b, 0x74, 0x75, 0xe4, + 0x37, 0x8b, 0xf0, 0x64, 0x97, 0x6d, 0xcf, 0xcf, 0x7a, 0x63, 0x0e, 0xb4, 0xb3, 0xbe, 0x63, 0x1e, + 0x6a, 0x70, 0x76, 0xb3, 0xed, 0x79, 0xfb, 0xcc, 0xec, 0x92, 0x34, 0x25, 0x86, 0xe0, 0x15, 0x9f, + 0x92, 0xd9, 0x17, 0x96, 0x33, 0x70, 0x70, 0x66, 0x4d, 0xf4, 0x26, 0xa0, 0x40, 0xe4, 0x5a, 0xbd, + 0x41, 0x7c, 0xa1, 0x55, 0x67, 0x03, 0x5f, 0x4c, 0x36, 0xe3, 0x9d, 0x0e, 0x0c, 0x9c, 0x51, 0x8b, + 0x32, 0xfd, 0xf4, 0x56, 0xda, 0x57, 0xdd, 0x4a, 0x31, 0xfd, 0x58, 0x07, 0x62, 0x13, 0x17, 0xdd, + 0x80, 0x29, 0x67, 0xcf, 0x71, 0x79, 0xd4, 0x38, 0x49, 0x80, 0x73, 0xfd, 0x4a, 0x09, 0x36, 0x9f, + 0x46, 0xc0, 0x9d, 0x75, 0x52, 0xfe, 0xc8, 0x83, 0xf9, 0xfe, 0xc8, 0xdd, 0xcf, 0xc5, 0x5e, 0x3a, + 0x5d, 0xfb, 0x3f, 0x5a, 0xf4, 0xfa, 0xca, 0xc8, 0x97, 0x4e, 0xc7, 0x41, 0xe9, 0x26, 0x35, 0xd7, + 0xe0, 0x73, 0x9a, 0x61, 0x45, 0x02, 0xc4, 0x26, 0x2e, 0x5f, 0x10, 0x51, 0xe2, 0x9b, 0x62, 0xb0, + 0xee, 0xc2, 0xf7, 0x5f, 0x61, 0xa0, 0x2f, 0xc0, 0x50, 0xd3, 0xdd, 0x73, 0xa3, 0x20, 0x14, 0x9b, + 0xe5, 0x98, 0x16, 0xfe, 0xc9, 0x39, 0x58, 0xe5, 0x64, 0xb0, 0xa4, 0x67, 0xff, 0x50, 0x01, 0xc6, + 0x64, 0x8b, 0x6f, 0xb5, 0x83, 0xd8, 0x39, 0x85, 0x6b, 0xf9, 0x86, 0x71, 0x2d, 0x7f, 0xa2, 0x5b, + 0x00, 0x04, 0xd6, 0xa5, 0xdc, 0xeb, 0xf8, 0x4e, 0xea, 0x3a, 0x7e, 0xb6, 0x37, 0xa9, 0xee, 0xd7, + 0xf0, 0x3f, 0xb5, 0x60, 0xca, 0xc0, 0x3f, 0x85, 0xdb, 0x60, 0xd9, 0xbc, 0x0d, 0x9e, 0xee, 0xf9, + 0x0d, 0x39, 0xb7, 0xc0, 0xf7, 0x15, 0x53, 0x7d, 0x67, 0xa7, 0xff, 0x7b, 0x50, 0xda, 0x76, 0xc2, + 0x66, 0xb7, 0x40, 0xab, 0x1d, 0x95, 0x66, 0x6f, 0x3a, 0x61, 0x93, 0x9f, 0xe1, 0x2f, 0xa8, 0x0c, + 0x8d, 0x4e, 0xd8, 0xec, 0xe9, 0x8a, 0xc5, 0x9a, 0x42, 0xd7, 0x61, 0x30, 0x6a, 0x04, 0x2d, 0x65, + 0x28, 0x79, 0x99, 0x67, 0x6f, 0xa4, 0x25, 0x47, 0x07, 0x15, 0x64, 0x36, 0x47, 0x8b, 0xb1, 0xc0, + 0x47, 0x6f, 0xc3, 0x18, 0xfb, 0xa5, 0xec, 0x0e, 0x8a, 0xf9, 0xe1, 0xfd, 0xeb, 0x3a, 0x22, 0x37, + 0x5f, 0x31, 0x8a, 0xb0, 0x49, 0x6a, 0x66, 0x0b, 0xca, 0xea, 0xb3, 0x1e, 0xab, 0x0b, 0xcd, 0xbf, + 0x2b, 0xc2, 0x99, 0x8c, 0x35, 0x87, 0x22, 0x63, 0x26, 0x5e, 0xea, 0x73, 0xa9, 0x7e, 0xc0, 0xb9, + 0x88, 0x98, 0x34, 0xd4, 0x14, 0x6b, 0xab, 0xef, 0x46, 0xef, 0x46, 0x24, 0xdd, 0x28, 0x2d, 0xea, + 0xdd, 0x28, 0x6d, 0xec, 0xd4, 0x86, 0x9a, 0x36, 0xa4, 0x7a, 0xfa, 0x58, 0xe7, 0xf4, 0x0f, 0x8b, + 0x70, 0x36, 0x2b, 0x26, 0x0b, 0xfa, 0xee, 0x54, 0x1a, 0x97, 0x57, 0xfa, 0x8d, 0xe6, 0xc2, 0x73, + 0xbb, 0x88, 0xa4, 0xc4, 0xb3, 0x66, 0x62, 0x97, 0x9e, 0xc3, 0x2c, 0xda, 0x64, 0x7e, 0x97, 0x21, + 0x4f, 0xbf, 0x23, 0x8f, 0x8f, 0x4f, 0xf7, 0xdd, 0x01, 0x91, 0xb7, 0x27, 0x4a, 0xf9, 0x5d, 0xca, + 0xe2, 0xde, 0x7e, 0x97, 0xb2, 0xe5, 0x19, 0x17, 0x46, 0xb4, 0xaf, 0x79, 0xac, 0x33, 0xbe, 0x43, + 0x6f, 0x2b, 0xad, 0xdf, 0x8f, 0x75, 0xd6, 0x7f, 0xdc, 0x82, 0x94, 0x55, 0xa2, 0x52, 0x77, 0x59, + 0xb9, 0xea, 0xae, 0xcb, 0x50, 0x0a, 0x03, 0x8f, 0xa4, 0x33, 0xab, 0xe0, 0xc0, 0x23, 0x98, 0x41, + 0x28, 0x46, 0x9c, 0x28, 0x3b, 0x46, 0x75, 0x41, 0x4e, 0x88, 0x68, 0xcf, 0xc0, 0x80, 0x47, 0xf6, + 0x88, 0x97, 0x0e, 0x5b, 0x7e, 0x9b, 0x16, 0x62, 0x0e, 0xb3, 0x7f, 0xa9, 0x04, 0x17, 0xbb, 0x7a, + 0x2e, 0x53, 0x71, 0x68, 0xcb, 0x89, 0xc9, 0x03, 0x67, 0x3f, 0x1d, 0x5f, 0xf8, 0x06, 0x2f, 0xc6, + 0x12, 0xce, 0x0c, 0xb5, 0x79, 0x3c, 0xc1, 0x94, 0x72, 0x50, 0x84, 0x11, 0x14, 0xd0, 0xc7, 0x90, + 0x90, 0xfd, 0x1a, 0x40, 0x14, 0x79, 0x4b, 0x3e, 0xe5, 0xee, 0x9a, 0xc2, 0x02, 0x3c, 0x89, 0x3b, + 0x59, 0xbf, 0x2d, 0x20, 0x58, 0xc3, 0x42, 0x55, 0x98, 0x6c, 0x85, 0x41, 0xcc, 0x75, 0xad, 0x55, + 0x6e, 0xe6, 0x33, 0x60, 0x3a, 0x8d, 0xd6, 0x52, 0x70, 0xdc, 0x51, 0x03, 0xbd, 0x0a, 0x23, 0xc2, + 0x91, 0xb4, 0x16, 0x04, 0x9e, 0x50, 0x03, 0x29, 0xa3, 0x91, 0x7a, 0x02, 0xc2, 0x3a, 0x9e, 0x56, + 0x8d, 0x29, 0x70, 0x87, 0x32, 0xab, 0x71, 0x25, 0xae, 0x86, 0x97, 0x8a, 0xcf, 0x34, 0xdc, 0x57, + 0x7c, 0xa6, 0x44, 0x31, 0x56, 0xee, 0xfb, 0xcd, 0x0a, 0x7a, 0xaa, 0x92, 0x7e, 0xbe, 0x04, 0x67, + 0xc4, 0xc2, 0x79, 0xdc, 0xcb, 0xe5, 0x31, 0xa5, 0x8d, 0xff, 0xd6, 0x9a, 0x39, 0xed, 0x35, 0xf3, + 0xc3, 0x16, 0x98, 0xec, 0x15, 0xfa, 0x73, 0xb9, 0x01, 0xda, 0x5f, 0xcd, 0x65, 0xd7, 0x9a, 0xf2, + 0x02, 0xf9, 0x80, 0xa1, 0xda, 0xed, 0xff, 0x60, 0xc1, 0xd3, 0x3d, 0x29, 0xa2, 0x25, 0x28, 0x33, + 0x1e, 0x50, 0x93, 0xce, 0x9e, 0x55, 0x66, 0x80, 0x12, 0x90, 0xc3, 0x92, 0x26, 0x35, 0xd1, 0x52, + 0x47, 0x24, 0xfc, 0xe7, 0x32, 0x22, 0xe1, 0x9f, 0x33, 0x86, 0xe7, 0x11, 0x43, 0xe1, 0x7f, 0xad, + 0x08, 0x83, 0x7c, 0xc5, 0x9f, 0x82, 0x18, 0xb6, 0x2c, 0xf4, 0xb6, 0x5d, 0x02, 0x40, 0xf1, 0xbe, + 0xcc, 0x56, 0x9d, 0xd8, 0xe1, 0x6c, 0x82, 0xba, 0xad, 0x12, 0x0d, 0x2f, 0x9a, 0x35, 0xee, 0xb3, + 0x99, 0x94, 0x62, 0x12, 0x38, 0x0d, 0xed, 0x76, 0xfb, 0x12, 0x40, 0xc4, 0x32, 0xc4, 0x53, 0x1a, + 0x22, 0x94, 0xd8, 0x27, 0xbb, 0xb4, 0x5e, 0x57, 0xc8, 0xbc, 0x0f, 0xc9, 0x4e, 0x57, 0x00, 0xac, + 0x51, 0x9c, 0x79, 0x0d, 0xca, 0x0a, 0xb9, 0x97, 0x16, 0x67, 0x54, 0x67, 0x2e, 0x3e, 0x07, 0x13, + 0xa9, 0xb6, 0x8e, 0xa5, 0x04, 0xfa, 0x65, 0x0b, 0x26, 0x78, 0x97, 0x97, 0xfc, 0x3d, 0x71, 0xa6, + 0xbe, 0x0f, 0x67, 0xbd, 0x8c, 0xb3, 0x4d, 0xcc, 0x68, 0xff, 0x67, 0xa1, 0x52, 0xfa, 0x64, 0x41, + 0x71, 0x66, 0x1b, 0xe8, 0x2a, 0x5d, 0xb7, 0xf4, 0xec, 0x72, 0x3c, 0xe1, 0xf4, 0x33, 0xca, 0xd7, + 0x2c, 0x2f, 0xc3, 0x0a, 0x6a, 0xff, 0x96, 0x05, 0x53, 0xbc, 0xe7, 0xb7, 0xc8, 0xbe, 0xda, 0xe1, + 0x1f, 0x66, 0xdf, 0x45, 0x72, 0x8a, 0x42, 0x4e, 0x72, 0x0a, 0xfd, 0xd3, 0x8a, 0x5d, 0x3f, 0xed, + 0xe7, 0x2c, 0x10, 0x2b, 0xf0, 0x14, 0x44, 0xf9, 0x6f, 0x37, 0x45, 0xf9, 0x99, 0xfc, 0x45, 0x9d, + 0x23, 0xc3, 0xff, 0xb1, 0x05, 0x93, 0x1c, 0x21, 0x79, 0x4b, 0xfe, 0x50, 0xe7, 0xa1, 0x9f, 0x2c, + 0x73, 0x2a, 0xad, 0x74, 0xf6, 0x47, 0x19, 0x93, 0x55, 0xea, 0x3a, 0x59, 0x4d, 0xb9, 0x81, 0x8e, + 0x91, 0x3d, 0xf1, 0xd8, 0x41, 0x9e, 0xed, 0x3f, 0xb0, 0x00, 0xf1, 0x66, 0x0c, 0xf6, 0x87, 0x32, + 0x15, 0xac, 0x54, 0xbb, 0x2e, 0x92, 0xa3, 0x46, 0x41, 0xb0, 0x86, 0x75, 0x22, 0xc3, 0x93, 0x32, + 0x08, 0x28, 0xf6, 0x36, 0x08, 0x38, 0xc6, 0x88, 0x7e, 0xad, 0x04, 0x69, 0x63, 0x7e, 0x74, 0x0f, + 0x46, 0x1b, 0x4e, 0xcb, 0xd9, 0x70, 0x3d, 0x37, 0x76, 0x49, 0xd4, 0xcd, 0x92, 0x68, 0x51, 0xc3, + 0x13, 0x4f, 0xbd, 0x5a, 0x09, 0x36, 0xe8, 0xa0, 0x59, 0x80, 0x56, 0xe8, 0xee, 0xb9, 0x1e, 0xd9, + 0x62, 0x1a, 0x07, 0xe6, 0x66, 0xc8, 0xcd, 0x63, 0x64, 0x29, 0xd6, 0x30, 0x32, 0x3c, 0xc6, 0x8a, + 0x8f, 0xcf, 0x63, 0xac, 0x74, 0x4c, 0x8f, 0xb1, 0x81, 0xbe, 0x3c, 0xc6, 0x30, 0x9c, 0x97, 0x2c, + 0x12, 0xfd, 0xbf, 0xec, 0x7a, 0x44, 0xf0, 0xc5, 0xdc, 0xf9, 0x70, 0xe6, 0xf0, 0xa0, 0x72, 0x1e, + 0x67, 0x62, 0xe0, 0x9c, 0x9a, 0xe8, 0xf3, 0x30, 0xed, 0x78, 0x5e, 0xf0, 0x40, 0x8d, 0xda, 0x52, + 0xd4, 0x70, 0x3c, 0xae, 0xb1, 0x1f, 0x62, 0x54, 0x9f, 0x3a, 0x3c, 0xa8, 0x4c, 0xcf, 0xe7, 0xe0, + 0xe0, 0xdc, 0xda, 0x29, 0x87, 0xb3, 0xe1, 0x9e, 0x0e, 0x67, 0x3b, 0x70, 0xa6, 0x4e, 0x42, 0x97, + 0xe5, 0x76, 0x6c, 0x26, 0x5b, 0x72, 0x1d, 0xca, 0x61, 0xea, 0x10, 0xea, 0x2b, 0x22, 0x91, 0x16, + 0xbf, 0x56, 0x1e, 0x3a, 0x09, 0x21, 0xfb, 0x8f, 0x2c, 0x18, 0x12, 0x0e, 0x05, 0xa7, 0xc0, 0xfb, + 0xcc, 0x1b, 0x2a, 0xe8, 0x4a, 0xf6, 0x41, 0xcd, 0x3a, 0x93, 0xab, 0x7c, 0x5e, 0x49, 0x29, 0x9f, + 0x9f, 0xee, 0x46, 0xa4, 0xbb, 0xda, 0xf9, 0x6f, 0x14, 0x61, 0xdc, 0x74, 0xa6, 0x38, 0x85, 0x21, + 0x58, 0x83, 0xa1, 0x48, 0x78, 0xee, 0x14, 0xf2, 0x6d, 0x9f, 0xd3, 0x93, 0x98, 0x18, 0x36, 0x09, + 0x5f, 0x1d, 0x49, 0x24, 0xd3, 0x25, 0xa8, 0xf8, 0x18, 0x5d, 0x82, 0x7a, 0xf9, 0xb3, 0x94, 0x4e, + 0xc2, 0x9f, 0xc5, 0xfe, 0x3a, 0xbb, 0x2c, 0xf4, 0xf2, 0x53, 0xe0, 0x23, 0x6e, 0x98, 0xd7, 0x8a, + 0xdd, 0x65, 0x65, 0x89, 0x4e, 0xe5, 0xf0, 0x13, 0xbf, 0x68, 0xc1, 0xc5, 0x8c, 0xaf, 0xd2, 0x98, + 0x8b, 0x17, 0x60, 0xd8, 0x69, 0x37, 0x5d, 0xb5, 0x97, 0xb5, 0x87, 0xa8, 0x79, 0x51, 0x8e, 0x15, + 0x06, 0x5a, 0x84, 0x29, 0xf2, 0xb0, 0xe5, 0xf2, 0x97, 0x40, 0xdd, 0xfa, 0xb0, 0xc8, 0x63, 0xb3, + 0x2e, 0xa5, 0x81, 0xb8, 0x13, 0x5f, 0xf9, 0x31, 0x17, 0x73, 0xfd, 0x98, 0xff, 0x81, 0x05, 0x23, + 0xa2, 0xdb, 0xa7, 0x30, 0xda, 0xdf, 0x61, 0x8e, 0xf6, 0x93, 0x5d, 0x46, 0x3b, 0x67, 0x98, 0xff, + 0x56, 0x41, 0xf5, 0xb7, 0x16, 0x84, 0x71, 0x1f, 0x4c, 0xcb, 0x75, 0x18, 0x6e, 0x85, 0x41, 0x1c, + 0x34, 0x02, 0x4f, 0xf0, 0x2c, 0x4f, 0x25, 0x6e, 0xf6, 0xbc, 0xfc, 0x48, 0xfb, 0x8d, 0x15, 0x36, + 0x1b, 0xbd, 0x20, 0x8c, 0x05, 0x9f, 0x90, 0x8c, 0x5e, 0x10, 0xc6, 0x98, 0x41, 0x50, 0x13, 0x20, + 0x76, 0xc2, 0x2d, 0x12, 0xd3, 0x32, 0x11, 0xb1, 0x23, 0xff, 0xf0, 0x68, 0xc7, 0xae, 0x37, 0xeb, + 0xfa, 0x71, 0x14, 0x87, 0xb3, 0x2b, 0x7e, 0x7c, 0x27, 0xe4, 0x22, 0x90, 0xe6, 0x37, 0xaf, 0x68, + 0x61, 0x8d, 0xae, 0xf4, 0x91, 0x64, 0x6d, 0x0c, 0x98, 0x4f, 0xda, 0x6b, 0xa2, 0x1c, 0x2b, 0x0c, + 0xfb, 0x35, 0x76, 0x95, 0xb0, 0x01, 0x3a, 0x9e, 0x4b, 0xfb, 0x37, 0x86, 0xd5, 0xd0, 0xb2, 0xf7, + 0xac, 0xaa, 0xee, 0x38, 0xdf, 0xfd, 0xe4, 0xa6, 0x0d, 0xeb, 0x9e, 0x30, 0x89, 0x77, 0x3d, 0xfa, + 0xce, 0x0e, 0x4b, 0x87, 0x17, 0x7b, 0x5c, 0x01, 0xc7, 0xb0, 0x6d, 0x60, 0xf1, 0xa2, 0x59, 0x5c, + 0xdd, 0x95, 0x9a, 0x58, 0xe4, 0x5a, 0xbc, 0x68, 0x01, 0xc0, 0x09, 0x0e, 0x9a, 0x13, 0x02, 0x74, + 0xc9, 0x48, 0xeb, 0x26, 0x05, 0x68, 0xf9, 0xf9, 0x9a, 0x04, 0xfd, 0x12, 0x8c, 0xa8, 0xf4, 0x6e, + 0x35, 0x9e, 0x25, 0x4b, 0xc4, 0x2f, 0x59, 0x4a, 0x8a, 0xb1, 0x8e, 0x83, 0xd6, 0x61, 0x22, 0xe2, + 0xda, 0x13, 0x15, 0xa6, 0x8e, 0x6b, 0xa1, 0x3e, 0x29, 0x2d, 0x24, 0xea, 0x26, 0xf8, 0x88, 0x15, + 0xf1, 0xa3, 0x43, 0x3a, 0x3a, 0xa6, 0x49, 0xa0, 0x37, 0x60, 0xdc, 0xd3, 0x93, 0xa4, 0xd7, 0x84, + 0x92, 0x4a, 0x19, 0x10, 0x1b, 0x29, 0xd4, 0x6b, 0x38, 0x85, 0x4d, 0x79, 0x1d, 0xbd, 0x44, 0x84, + 0x56, 0x74, 0xfc, 0x2d, 0x12, 0x89, 0xe4, 0x54, 0x8c, 0xd7, 0xb9, 0x9d, 0x83, 0x83, 0x73, 0x6b, + 0xa3, 0xeb, 0x30, 0x2a, 0x3f, 0x5f, 0x73, 0xe3, 0x4d, 0xcc, 0xd4, 0x35, 0x18, 0x36, 0x30, 0xd1, + 0x03, 0x38, 0x27, 0xff, 0xaf, 0x87, 0xce, 0xe6, 0xa6, 0xdb, 0x10, 0x5e, 0xd4, 0xdc, 0x57, 0x67, + 0x5e, 0x3a, 0xff, 0x2c, 0x65, 0x21, 0x1d, 0x1d, 0x54, 0x2e, 0x8b, 0x51, 0xcb, 0x84, 0xb3, 0x49, + 0xcc, 0xa6, 0x8f, 0x56, 0xe1, 0xcc, 0x36, 0x71, 0xbc, 0x78, 0x7b, 0x71, 0x9b, 0x34, 0x76, 0xe4, + 0x26, 0x62, 0xce, 0xc1, 0x9a, 0x71, 0xf7, 0xcd, 0x4e, 0x14, 0x9c, 0x55, 0x0f, 0xbd, 0x03, 0xd3, + 0xad, 0xf6, 0x86, 0xe7, 0x46, 0xdb, 0x6b, 0x41, 0xcc, 0x8c, 0x32, 0x54, 0x76, 0x34, 0xe1, 0x45, + 0xac, 0x1c, 0xa3, 0x6b, 0x39, 0x78, 0x38, 0x97, 0x02, 0x7a, 0x1f, 0xce, 0xa5, 0x16, 0x83, 0xf0, + 0x69, 0x1c, 0xcf, 0x0f, 0x54, 0x5b, 0xcf, 0xaa, 0x20, 0x7c, 0x14, 0xb3, 0x40, 0x38, 0xbb, 0x89, + 0x0f, 0x66, 0xaa, 0xf3, 0x1e, 0xad, 0xac, 0x31, 0x65, 0xe8, 0xcb, 0x30, 0xaa, 0xaf, 0x22, 0x71, + 0xc1, 0x5c, 0xc9, 0xe6, 0x59, 0xb4, 0xd5, 0xc6, 0x59, 0x3a, 0xb5, 0xa2, 0x74, 0x18, 0x36, 0x28, + 0xda, 0x04, 0xb2, 0xbf, 0x0f, 0xdd, 0x86, 0xe1, 0x86, 0xe7, 0x12, 0x3f, 0x5e, 0xa9, 0x75, 0x8b, + 0x96, 0xb1, 0x28, 0x70, 0xc4, 0x80, 0x89, 0xc8, 0x9e, 0xbc, 0x0c, 0x2b, 0x0a, 0xf6, 0xaf, 0x15, + 0xa0, 0xd2, 0x23, 0x4c, 0x6c, 0x4a, 0xa3, 0x6c, 0xf5, 0xa5, 0x51, 0x9e, 0x97, 0xb9, 0xde, 0xd6, + 0x52, 0x62, 0x76, 0x2a, 0x8f, 0x5b, 0x22, 0x6c, 0xa7, 0xf1, 0xfb, 0xb6, 0xf0, 0xd5, 0x95, 0xd2, + 0xa5, 0x9e, 0xb6, 0xe7, 0xc6, 0x63, 0xd4, 0x40, 0xff, 0x82, 0x48, 0xee, 0xc3, 0x82, 0xfd, 0xf5, + 0x02, 0x9c, 0x53, 0x43, 0xf8, 0x67, 0x77, 0xe0, 0xee, 0x76, 0x0e, 0xdc, 0x09, 0x3c, 0xcb, 0xd8, + 0x77, 0x60, 0xb0, 0xbe, 0x1f, 0x35, 0x62, 0xaf, 0x0f, 0x06, 0xe8, 0x19, 0x33, 0x34, 0x95, 0xba, + 0xa6, 0x8d, 0xf0, 0x54, 0x7f, 0xc9, 0x82, 0x89, 0xf5, 0xc5, 0x5a, 0x3d, 0x68, 0xec, 0x90, 0x78, + 0x9e, 0x33, 0xac, 0x58, 0xf0, 0x3f, 0xd6, 0x23, 0xf2, 0x35, 0x59, 0x1c, 0xd3, 0x65, 0x28, 0x6d, + 0x07, 0x51, 0x9c, 0x7e, 0xb3, 0xbd, 0x19, 0x44, 0x31, 0x66, 0x10, 0xfb, 0xb7, 0x2d, 0x18, 0x60, + 0x19, 0x4a, 0x7b, 0xa5, 0xcd, 0xed, 0xe7, 0xbb, 0xd0, 0xab, 0x30, 0x48, 0x36, 0x37, 0x49, 0x23, + 0x16, 0xb3, 0x2a, 0x1d, 0x4a, 0x07, 0x97, 0x58, 0x29, 0xbd, 0xf4, 0x59, 0x63, 0xfc, 0x2f, 0x16, + 0xc8, 0xe8, 0x3e, 0x94, 0x63, 0x77, 0x97, 0xcc, 0x37, 0x9b, 0xe2, 0xd5, 0xeb, 0x11, 0xfc, 0x77, + 0xd7, 0x25, 0x01, 0x9c, 0xd0, 0xb2, 0xbf, 0x5a, 0x00, 0x48, 0x5c, 0xef, 0x7b, 0x7d, 0xe2, 0x42, + 0xc7, 0x7b, 0xc8, 0x95, 0x8c, 0xf7, 0x10, 0x94, 0x10, 0xcc, 0x78, 0x0c, 0x51, 0xc3, 0x54, 0xec, + 0x6b, 0x98, 0x4a, 0xc7, 0x19, 0xa6, 0x45, 0x98, 0x4a, 0x42, 0x07, 0x98, 0x71, 0x54, 0x98, 0x90, + 0xb2, 0x9e, 0x06, 0xe2, 0x4e, 0x7c, 0xfb, 0xfb, 0x2d, 0x10, 0x8e, 0x31, 0x7d, 0x2c, 0xe6, 0xb7, + 0x65, 0x5e, 0x4d, 0x23, 0xda, 0xf4, 0xe5, 0x7c, 0x4f, 0x21, 0x11, 0x63, 0x5a, 0x5d, 0x1e, 0x46, + 0x64, 0x69, 0x83, 0x96, 0xdd, 0x04, 0x01, 0xad, 0x12, 0xa6, 0x1b, 0xe9, 0xdd, 0x9b, 0x6b, 0x00, + 0x4d, 0x86, 0xab, 0x65, 0xd7, 0x53, 0x47, 0x55, 0x55, 0x41, 0xb0, 0x86, 0x65, 0xff, 0x48, 0x01, + 0x46, 0x64, 0x74, 0xe3, 0xb6, 0xdf, 0x8f, 0x04, 0x73, 0xac, 0x24, 0x27, 0x2c, 0x1d, 0x25, 0x25, + 0x5c, 0x4b, 0x04, 0xbf, 0x24, 0x1d, 0xa5, 0x04, 0xe0, 0x04, 0x07, 0x3d, 0x07, 0x43, 0x51, 0x7b, + 0x83, 0xa1, 0xa7, 0xdc, 0x3d, 0xea, 0xbc, 0x18, 0x4b, 0x38, 0xfa, 0x3c, 0x4c, 0xf2, 0x7a, 0x61, + 0xd0, 0x72, 0xb6, 0xb8, 0xa2, 0x6c, 0x40, 0xf9, 0x5f, 0x4e, 0xae, 0xa6, 0x60, 0x47, 0x07, 0x95, + 0xb3, 0xe9, 0x32, 0xa6, 0x62, 0xed, 0xa0, 0x62, 0x7f, 0x19, 0x50, 0x67, 0xc0, 0x66, 0xf4, 0x26, + 0x37, 0xba, 0x71, 0x43, 0x95, 0x4d, 0xff, 0x72, 0x2f, 0x77, 0x41, 0x69, 0x72, 0xcd, 0x6b, 0x61, + 0x55, 0xdf, 0xfe, 0x2b, 0x45, 0x98, 0x4c, 0x3b, 0x8f, 0xa1, 0x9b, 0x30, 0xc8, 0x0f, 0xd5, 0x6e, + 0xc9, 0xfa, 0xd3, 0xcf, 0x04, 0xfc, 0x3d, 0x51, 0x9c, 0xcb, 0xa2, 0x3e, 0x7a, 0x07, 0x46, 0x9a, + 0xc1, 0x03, 0xff, 0x81, 0x13, 0x36, 0xe7, 0x6b, 0x2b, 0x62, 0x5d, 0x66, 0xf2, 0x66, 0xd5, 0x04, + 0x4d, 0x77, 0x63, 0x63, 0x6a, 0xe8, 0x04, 0x84, 0x75, 0x72, 0x68, 0x9d, 0x05, 0xa1, 0xdb, 0x74, + 0xb7, 0x56, 0x9d, 0x56, 0x37, 0x0b, 0xcc, 0x45, 0x89, 0xa4, 0x51, 0x1e, 0x13, 0x91, 0xea, 0x38, + 0x00, 0x27, 0x84, 0xd0, 0x77, 0xc3, 0x99, 0x28, 0x47, 0x9d, 0x93, 0x17, 0xbf, 0xbf, 0x9b, 0x86, + 0x63, 0xe1, 0x09, 0xca, 0x35, 0x67, 0x29, 0x7e, 0xb2, 0x9a, 0xb1, 0xbf, 0x72, 0x06, 0x8c, 0xdd, + 0x68, 0x24, 0x71, 0xb1, 0x4e, 0x28, 0x89, 0x0b, 0x86, 0x61, 0xb2, 0xdb, 0x8a, 0xf7, 0xab, 0x6e, + 0xd8, 0x2d, 0x0b, 0xd8, 0x92, 0xc0, 0xe9, 0xa4, 0x29, 0x21, 0x58, 0xd1, 0xc9, 0xce, 0xb4, 0x53, + 0xfc, 0x10, 0x33, 0xed, 0x94, 0x4e, 0x31, 0xd3, 0xce, 0x1a, 0x0c, 0x6d, 0xb9, 0x31, 0x26, 0xad, + 0x40, 0xb0, 0x33, 0x99, 0xeb, 0xf0, 0x06, 0x47, 0xe9, 0xcc, 0xee, 0x20, 0x00, 0x58, 0x12, 0x41, + 0x6f, 0xaa, 0x1d, 0x38, 0x98, 0x2f, 0x0d, 0x74, 0xbe, 0x21, 0x65, 0xee, 0x41, 0x91, 0x59, 0x67, + 0xe8, 0x51, 0x33, 0xeb, 0x2c, 0xcb, 0x7c, 0x38, 0xc3, 0xf9, 0xe6, 0xd2, 0x2c, 0xdd, 0x4d, 0x8f, + 0x2c, 0x38, 0x46, 0xe6, 0xa0, 0xf2, 0xc9, 0x65, 0x0e, 0xfa, 0x7e, 0x0b, 0xce, 0xb5, 0xb2, 0x92, + 0x68, 0x89, 0x2c, 0x36, 0xaf, 0xf6, 0x9d, 0x25, 0xcc, 0x68, 0x90, 0x89, 0x85, 0x99, 0x68, 0x38, + 0xbb, 0x39, 0x3a, 0xd0, 0xe1, 0x46, 0x53, 0xa4, 0xbe, 0x79, 0x26, 0x27, 0x05, 0x51, 0x97, 0xc4, + 0x43, 0xeb, 0x19, 0xe9, 0x6e, 0x3e, 0x9e, 0x97, 0xee, 0xa6, 0xef, 0x24, 0x37, 0x6f, 0xaa, 0xe4, + 0x43, 0x63, 0xf9, 0x4b, 0x89, 0xa7, 0x16, 0xea, 0x99, 0x72, 0xe8, 0x4d, 0x95, 0x72, 0xa8, 0x4b, + 0x4c, 0x2f, 0x9e, 0x50, 0xa8, 0x67, 0xa2, 0x21, 0x2d, 0x59, 0xd0, 0xc4, 0xc9, 0x24, 0x0b, 0x32, + 0xae, 0x1a, 0x9e, 0xaf, 0xe6, 0xf9, 0x1e, 0x57, 0x8d, 0x41, 0xb7, 0xfb, 0x65, 0xc3, 0x13, 0x23, + 0x4d, 0x3d, 0x52, 0x62, 0xa4, 0x7b, 0x7a, 0xa2, 0x21, 0xd4, 0x23, 0x93, 0x0e, 0x45, 0xea, 0x33, + 0xbd, 0xd0, 0x3d, 0xfd, 0x02, 0x3c, 0x93, 0x4f, 0x57, 0xdd, 0x73, 0x9d, 0x74, 0x33, 0xaf, 0xc0, + 0x8e, 0xb4, 0x45, 0x67, 0x4f, 0x27, 0x6d, 0xd1, 0xb9, 0x13, 0x4f, 0x5b, 0x74, 0xfe, 0x14, 0xd2, + 0x16, 0x3d, 0xf1, 0xa1, 0xa6, 0x2d, 0x9a, 0x7e, 0x0c, 0x69, 0x8b, 0xd6, 0x92, 0xb4, 0x45, 0x17, + 0xf2, 0xa7, 0x24, 0xc3, 0x86, 0x33, 0x27, 0x59, 0xd1, 0x3d, 0x28, 0xb7, 0x64, 0x74, 0x03, 0x11, + 0x74, 0x2c, 0x3b, 0x73, 0x6a, 0x56, 0x08, 0x04, 0x3e, 0x25, 0x0a, 0x84, 0x13, 0x52, 0x94, 0x6e, + 0x92, 0xbc, 0xe8, 0xc9, 0x2e, 0x8a, 0xbf, 0x2c, 0x95, 0x4a, 0x7e, 0xca, 0x22, 0xfb, 0x2f, 0x17, + 0xe0, 0x52, 0xf7, 0x75, 0x9d, 0xe8, 0x63, 0x6a, 0xc9, 0xfb, 0x41, 0x4a, 0x1f, 0xc3, 0x85, 0x9c, + 0x04, 0xab, 0xef, 0x10, 0x30, 0x37, 0x60, 0x4a, 0x19, 0x6f, 0x7a, 0x6e, 0x63, 0x5f, 0xcb, 0xa8, + 0xaa, 0x9c, 0xd4, 0xea, 0x69, 0x04, 0xdc, 0x59, 0x07, 0xcd, 0xc3, 0x84, 0x51, 0xb8, 0x52, 0x15, + 0xc2, 0x8c, 0x52, 0x00, 0xd5, 0x4d, 0x30, 0x4e, 0xe3, 0xdb, 0x3f, 0x6b, 0xc1, 0x13, 0x39, 0x11, + 0xfd, 0xfb, 0x8e, 0x70, 0xb2, 0x09, 0x13, 0x2d, 0xb3, 0x6a, 0x8f, 0x40, 0x48, 0x46, 0xde, 0x00, + 0xd5, 0xd7, 0x14, 0x00, 0xa7, 0x89, 0x2e, 0x5c, 0xfd, 0x8d, 0xdf, 0xbd, 0xf4, 0xb1, 0xdf, 0xfc, + 0xdd, 0x4b, 0x1f, 0xfb, 0xad, 0xdf, 0xbd, 0xf4, 0xb1, 0x3f, 0x7f, 0x78, 0xc9, 0xfa, 0x8d, 0xc3, + 0x4b, 0xd6, 0x6f, 0x1e, 0x5e, 0xb2, 0x7e, 0xeb, 0xf0, 0x92, 0xf5, 0x3b, 0x87, 0x97, 0xac, 0xaf, + 0xfe, 0xde, 0xa5, 0x8f, 0xbd, 0x5d, 0xd8, 0x7b, 0xe9, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x7a, + 0x9b, 0xf5, 0x19, 0x7a, 0xe4, 0x00, 0x00, } diff --git a/staging/src/k8s.io/api/core/v1/generated.proto b/staging/src/k8s.io/api/core/v1/generated.proto index 501a5d5d93..0998a433d1 100644 --- a/staging/src/k8s.io/api/core/v1/generated.proto +++ b/staging/src/k8s.io/api/core/v1/generated.proto @@ -3639,7 +3639,7 @@ message ResourceQuotaList { // ResourceQuotaSpec defines the desired hard limits to enforce for Quota. message ResourceQuotaSpec { - // Hard is the set of desired hard limits for each named resource. + // hard is the set of desired hard limits for each named resource. // More info: https://kubernetes.io/docs/concepts/policy/resource-quotas/ // +optional map hard = 1; @@ -3648,6 +3648,12 @@ message ResourceQuotaSpec { // If not specified, the quota matches all objects. // +optional repeated string scopes = 2; + + // scopeSelector is also a collection of filters like scopes that must match each object tracked by a quota + // but expressed using ScopeSelectorOperator in combination with possible values. + // For a resource to match, both scopes AND scopeSelector (if specified in spec), must be matched. + // +optional + optional ScopeSelector scopeSelector = 3; } // ResourceQuotaStatus defines the enforced hard limits and observed use. @@ -3784,6 +3790,32 @@ message ScaleIOVolumeSource { optional bool readOnly = 10; } +// A scope selector represents the AND of the selectors represented +// by the scoped-resource selector requirements. +message ScopeSelector { + // A list of scope selector requirements by scope of the resources. + // +optional + repeated ScopedResourceSelectorRequirement matchExpressions = 1; +} + +// A scoped-resource selector requirement is a selector that contains values, a scope name, and an operator +// that relates the scope name and values. +message ScopedResourceSelectorRequirement { + // The name of the scope that the selector applies to. + optional string scopeName = 1; + + // Represents a scope's relationship to a set of values. + // Valid operators are In, NotIn, Exists, DoesNotExist. + optional string operator = 2; + + // An array of string values. If the operator is In or NotIn, + // the values array must be non-empty. If the operator is Exists or DoesNotExist, + // the values array must be empty. + // This array is replaced during a strategic merge patch. + // +optional + repeated string values = 3; +} + // Secret holds secret data of a certain type. The total bytes of the values in // the Data field must be less than MaxSecretSize bytes. message Secret { diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go index 0f4cf90682..3c5e38e13f 100644 --- a/staging/src/k8s.io/api/core/v1/types.go +++ b/staging/src/k8s.io/api/core/v1/types.go @@ -4698,11 +4698,13 @@ const ( ResourceQuotaScopeBestEffort ResourceQuotaScope = "BestEffort" // Match all pod objects that do not have best effort quality of service ResourceQuotaScopeNotBestEffort ResourceQuotaScope = "NotBestEffort" + // Match all pod objects that have priority class mentioned + ResourceQuotaScopePriorityClass ResourceQuotaScope = "PriorityClass" ) // ResourceQuotaSpec defines the desired hard limits to enforce for Quota. type ResourceQuotaSpec struct { - // Hard is the set of desired hard limits for each named resource. + // hard is the set of desired hard limits for each named resource. // More info: https://kubernetes.io/docs/concepts/policy/resource-quotas/ // +optional Hard ResourceList `json:"hard,omitempty" protobuf:"bytes,1,rep,name=hard,casttype=ResourceList,castkey=ResourceName"` @@ -4710,8 +4712,48 @@ type ResourceQuotaSpec struct { // If not specified, the quota matches all objects. // +optional Scopes []ResourceQuotaScope `json:"scopes,omitempty" protobuf:"bytes,2,rep,name=scopes,casttype=ResourceQuotaScope"` + // scopeSelector is also a collection of filters like scopes that must match each object tracked by a quota + // but expressed using ScopeSelectorOperator in combination with possible values. + // For a resource to match, both scopes AND scopeSelector (if specified in spec), must be matched. + // +optional + ScopeSelector *ScopeSelector `json:"scopeSelector,omitempty" protobuf:"bytes,3,opt,name=scopeSelector"` } +// A scope selector represents the AND of the selectors represented +// by the scoped-resource selector requirements. +type ScopeSelector struct { + // A list of scope selector requirements by scope of the resources. + // +optional + MatchExpressions []ScopedResourceSelectorRequirement `json:"matchExpressions,omitempty" protobuf:"bytes,1,rep,name=matchExpressions"` +} + +// A scoped-resource selector requirement is a selector that contains values, a scope name, and an operator +// that relates the scope name and values. +type ScopedResourceSelectorRequirement struct { + // The name of the scope that the selector applies to. + ScopeName ResourceQuotaScope `json:"scopeName" protobuf:"bytes,1,opt,name=scopeName"` + // Represents a scope's relationship to a set of values. + // Valid operators are In, NotIn, Exists, DoesNotExist. + Operator ScopeSelectorOperator `json:"operator" protobuf:"bytes,2,opt,name=operator,casttype=ScopedResourceSelectorOperator"` + // An array of string values. If the operator is In or NotIn, + // the values array must be non-empty. If the operator is Exists or DoesNotExist, + // the values array must be empty. + // This array is replaced during a strategic merge patch. + // +optional + Values []string `json:"values,omitempty" protobuf:"bytes,3,rep,name=values"` +} + +// A scope selector operator is the set of operators that can be used in +// a scope selector requirement. +type ScopeSelectorOperator string + +const ( + ScopeSelectorOpIn ScopeSelectorOperator = "In" + ScopeSelectorOpNotIn ScopeSelectorOperator = "NotIn" + ScopeSelectorOpExists ScopeSelectorOperator = "Exists" + ScopeSelectorOpDoesNotExist ScopeSelectorOperator = "DoesNotExist" +) + // ResourceQuotaStatus defines the enforced hard limits and observed use. type ResourceQuotaStatus struct { // Hard is the set of enforced hard limits for each named resource. 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 a5b5f67a95..b9a684ccdc 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 @@ -1803,9 +1803,10 @@ func (ResourceQuotaList) SwaggerDoc() map[string]string { } var map_ResourceQuotaSpec = map[string]string{ - "": "ResourceQuotaSpec defines the desired hard limits to enforce for Quota.", - "hard": "Hard is the set of desired hard limits for each named resource. More info: https://kubernetes.io/docs/concepts/policy/resource-quotas/", - "scopes": "A collection of filters that must match each object tracked by a quota. If not specified, the quota matches all objects.", + "": "ResourceQuotaSpec defines the desired hard limits to enforce for Quota.", + "hard": "hard is the set of desired hard limits for each named resource. More info: https://kubernetes.io/docs/concepts/policy/resource-quotas/", + "scopes": "A collection of filters that must match each object tracked by a quota. If not specified, the quota matches all objects.", + "scopeSelector": "scopeSelector is also a collection of filters like scopes that must match each object tracked by a quota but expressed using ScopeSelectorOperator in combination with possible values. For a resource to match, both scopes AND scopeSelector (if specified in spec), must be matched.", } func (ResourceQuotaSpec) SwaggerDoc() map[string]string { @@ -1880,6 +1881,26 @@ func (ScaleIOVolumeSource) SwaggerDoc() map[string]string { return map_ScaleIOVolumeSource } +var map_ScopeSelector = map[string]string{ + "": "A scope selector represents the AND of the selectors represented by the scoped-resource selector requirements.", + "matchExpressions": "A list of scope selector requirements by scope of the resources.", +} + +func (ScopeSelector) SwaggerDoc() map[string]string { + return map_ScopeSelector +} + +var map_ScopedResourceSelectorRequirement = map[string]string{ + "": "A scoped-resource selector requirement is a selector that contains values, a scope name, and an operator that relates the scope name and values.", + "scopeName": "The name of the scope that the selector applies to.", + "operator": "Represents a scope's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist.", + "values": "An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.", +} + +func (ScopedResourceSelectorRequirement) SwaggerDoc() map[string]string { + return map_ScopedResourceSelectorRequirement +} + var map_Secret = map[string]string{ "": "Secret holds secret data of a certain type. The total bytes of the values in the Data field must be less than MaxSecretSize bytes.", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", 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 cb70a93191..b1be204f39 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 @@ -4635,6 +4635,15 @@ func (in *ResourceQuotaSpec) DeepCopyInto(out *ResourceQuotaSpec) { *out = make([]ResourceQuotaScope, len(*in)) copy(*out, *in) } + if in.ScopeSelector != nil { + in, out := &in.ScopeSelector, &out.ScopeSelector + if *in == nil { + *out = nil + } else { + *out = new(ScopeSelector) + (*in).DeepCopyInto(*out) + } + } return } @@ -4774,6 +4783,50 @@ func (in *ScaleIOVolumeSource) DeepCopy() *ScaleIOVolumeSource { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ScopeSelector) DeepCopyInto(out *ScopeSelector) { + *out = *in + if in.MatchExpressions != nil { + in, out := &in.MatchExpressions, &out.MatchExpressions + *out = make([]ScopedResourceSelectorRequirement, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ScopeSelector. +func (in *ScopeSelector) DeepCopy() *ScopeSelector { + if in == nil { + return nil + } + out := new(ScopeSelector) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ScopedResourceSelectorRequirement) DeepCopyInto(out *ScopedResourceSelectorRequirement) { + *out = *in + if in.Values != nil { + in, out := &in.Values, &out.Values + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ScopedResourceSelectorRequirement. +func (in *ScopedResourceSelectorRequirement) DeepCopy() *ScopedResourceSelectorRequirement { + if in == nil { + return nil + } + out := new(ScopedResourceSelectorRequirement) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Secret) DeepCopyInto(out *Secret) { *out = *in