From cdaeabfb46e987d3fa27522ef36f977cbbafcd31 Mon Sep 17 00:00:00 2001 From: m1093782566 Date: Fri, 14 Dec 2018 15:52:02 +0800 Subject: [PATCH 1/4] Add API for feature gate ServiceTopology --- api/api-rules/violation_exceptions.list | 1 + pkg/apis/core/types.go | 15 +++++++++++++++ pkg/features/kube_features.go | 7 +++++++ staging/src/k8s.io/api/core/v1/types.go | 16 ++++++++++++++++ 4 files changed, 39 insertions(+) diff --git a/api/api-rules/violation_exceptions.list b/api/api-rules/violation_exceptions.list index 10211214c1c..ff562d01652 100644 --- a/api/api-rules/violation_exceptions.list +++ b/api/api-rules/violation_exceptions.list @@ -214,6 +214,7 @@ API rule violation: list_type_missing,k8s.io/api/core/v1,ServiceAccountList,Item API rule violation: list_type_missing,k8s.io/api/core/v1,ServiceList,Items API rule violation: list_type_missing,k8s.io/api/core/v1,ServiceSpec,ExternalIPs API rule violation: list_type_missing,k8s.io/api/core/v1,ServiceSpec,LoadBalancerSourceRanges +API rule violation: list_type_missing,k8s.io/api/core/v1,ServiceSpec,TopologyKeys API rule violation: list_type_missing,k8s.io/api/core/v1,TopologySelectorLabelRequirement,Values API rule violation: list_type_missing,k8s.io/api/core/v1,TopologySelectorTerm,MatchLabelExpressions API rule violation: list_type_missing,k8s.io/api/events/v1beta1,EventList,Items diff --git a/pkg/apis/core/types.go b/pkg/apis/core/types.go index effdecc49f8..a453f0cabf8 100644 --- a/pkg/apis/core/types.go +++ b/pkg/apis/core/types.go @@ -3503,6 +3503,21 @@ type ServiceSpec struct { // cluster (e.g. IPv6 in IPv4 only cluster) is an error condition and will fail during clusterIP assignment. // +optional IPFamily *IPFamily + + // topologyKeys is a preference-order list of topology keys which + // implementations of services should use to preferentially sort endpoints + // when accessing this Service. Topology keys must be valid label keys and + // at most 16 keys may be specified. + // If any ready backends exist for index [0], they should always be chosen; + // only if no backends exist for index [0] should backends for index [1] be considered. + // If this field is specified and all entries have no backends that match + // the topology of the client, the service has no backends for that client + // and connections should fail. + // The special value "" may be used to mean "any node". This catch-all + // value, if used, only makes sense as the last value in the list. + // If this is not specified or empty, no topology constraints will be applied. + // +optional + TopologyKeys []string } // ServicePort represents the port on which the service is exposed diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index 42dc87927a7..741c491e17c 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -538,6 +538,12 @@ const ( // // Enable all logic related to the PodDisruptionBudget API object in policy PodDisruptionBudget featuregate.Feature = "PodDisruptionBudget" + + // owner: @m1093782566 + // alpha: v1.17 + // + // Enables topology aware service routing + ServiceTopology featuregate.Feature = "ServiceTopology" ) func init() { @@ -623,6 +629,7 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS StartupProbe: {Default: false, PreRelease: featuregate.Alpha}, AllowInsecureBackendProxy: {Default: true, PreRelease: featuregate.Beta}, PodDisruptionBudget: {Default: true, PreRelease: featuregate.Beta}, + ServiceTopology: {Default: false, PreRelease: featuregate.Alpha}, // inherited features from generic apiserver, relisted here to get a conflict if it is changed // unintentionally on either side: diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go index 893dfb34cf4..ee12e3aa231 100644 --- a/staging/src/k8s.io/api/core/v1/types.go +++ b/staging/src/k8s.io/api/core/v1/types.go @@ -3940,6 +3940,7 @@ type ServiceSpec struct { // of peer discovery. // +optional PublishNotReadyAddresses bool `json:"publishNotReadyAddresses,omitempty" protobuf:"varint,13,opt,name=publishNotReadyAddresses"` + // sessionAffinityConfig contains the configurations of session affinity. // +optional SessionAffinityConfig *SessionAffinityConfig `json:"sessionAffinityConfig,omitempty" protobuf:"bytes,14,opt,name=sessionAffinityConfig"` @@ -3953,6 +3954,21 @@ type ServiceSpec struct { // cluster (e.g. IPv6 in IPv4 only cluster) is an error condition and will fail during clusterIP assignment. // +optional IPFamily *IPFamily `json:"ipFamily,omitempty" protobuf:"bytes,15,opt,name=ipFamily,Configcasttype=IPFamily"` + + // topologyKeys is a preference-order list of topology keys which + // implementations of services should use to preferentially sort endpoints + // when accessing this Service. Topology keys must be valid label keys and + // at most 16 keys may be specified. + // If any ready backends exist for index [0], they should always be chosen; + // only if no backends exist for index [0] should backends for index [1] be considered. + // If this field is specified and all entries have no backends that match + // the topology of the client, the service has no backends for that client + // and connections should fail. + // The special value "" may be used to mean "any node". This catch-all + // value, if used, only makes sense as the last value in the list. + // If this is not specified or empty, no topology constraints will be applied. + // +optional + TopologyKeys []string `json:"topologyKeys,omitempty" protobuf:"bytes,15,opt,name=topologyKeys"` } // ServicePort contains information on service's port. From c9cf3f5b722569a5825cdd0d94d48b17cfd09d6d Mon Sep 17 00:00:00 2001 From: Roc Chan Date: Tue, 16 Jul 2019 17:22:43 +0800 Subject: [PATCH 2/4] Service Topology implementation * Implement Service Topology for ipvs and iptables proxier * Add test files * API validation --- cmd/kube-proxy/app/server.go | 17 + pkg/apis/core/types.go | 12 +- pkg/apis/core/validation/validation.go | 33 ++ pkg/apis/core/validation/validation_test.go | 62 +++ pkg/kubemark/hollow_proxy.go | 1 + pkg/proxy/config/config.go | 125 +++++ pkg/proxy/endpoints.go | 13 +- pkg/proxy/endpoints_test.go | 37 +- pkg/proxy/endpointslicecache.go | 2 +- pkg/proxy/endpointslicecache_test.go | 6 +- pkg/proxy/iptables/proxier.go | 61 ++- pkg/proxy/ipvs/meta_proxier.go | 4 + pkg/proxy/ipvs/proxier.go | 62 ++- pkg/proxy/ipvs/proxier_test.go | 3 +- pkg/proxy/service.go | 7 + pkg/proxy/topology.go | 80 +++ pkg/proxy/topology_test.go | 478 ++++++++++++++++++ pkg/proxy/types.go | 5 + pkg/proxy/userspace/proxier.go | 2 + pkg/proxy/winkernel/proxier.go | 2 + pkg/proxy/winuserspace/proxier.go | 2 + pkg/registry/core/service/strategy.go | 15 +- .../authorizer/rbac/bootstrappolicy/policy.go | 2 +- .../testdata/cluster-roles.yaml | 2 + staging/src/k8s.io/api/core/v1/types.go | 16 +- 25 files changed, 1006 insertions(+), 43 deletions(-) create mode 100644 pkg/proxy/topology.go create mode 100644 pkg/proxy/topology_test.go diff --git a/cmd/kube-proxy/app/server.go b/cmd/kube-proxy/app/server.go index 89e3ded7b1c..51131702a2c 100644 --- a/cmd/kube-proxy/app/server.go +++ b/cmd/kube-proxy/app/server.go @@ -35,6 +35,7 @@ import ( gerrors "github.com/pkg/errors" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/serializer" @@ -663,6 +664,7 @@ func (s *ProxyServer) Run() error { labelSelector := labels.NewSelector() labelSelector = labelSelector.Add(*noProxyName, *noHeadlessEndpoints) + // Make informers that filter out objects that want a non-default service proxy. informerFactory := informers.NewSharedInformerFactoryWithOptions(s.Client, s.ConfigSyncPeriod, informers.WithTweakListOptions(func(options *metav1.ListOptions) { options.LabelSelector = labelSelector.String() @@ -690,6 +692,21 @@ func (s *ProxyServer) Run() error { // functions must configure their shared informer event handlers first. informerFactory.Start(wait.NeverStop) + if utilfeature.DefaultFeatureGate.Enabled(features.ServiceTopology) { + // Make an informer that selects for our nodename. + currentNodeInformerFactory := informers.NewSharedInformerFactoryWithOptions(s.Client, s.ConfigSyncPeriod, + informers.WithTweakListOptions(func(options *metav1.ListOptions) { + options.FieldSelector = fields.OneTermEqualSelector("metadata.name", s.NodeRef.Name).String() + })) + nodeConfig := config.NewNodeConfig(currentNodeInformerFactory.Core().V1().Nodes(), s.ConfigSyncPeriod) + nodeConfig.RegisterEventHandler(s.Proxier) + go nodeConfig.Run(wait.NeverStop) + + // This has to start after the calls to NewNodeConfig because that must + // configure the shared informer event handler first. + currentNodeInformerFactory.Start(wait.NeverStop) + } + // Birth Cry after the birth is successful s.birthCry() diff --git a/pkg/apis/core/types.go b/pkg/apis/core/types.go index a453f0cabf8..8c9ed45114d 100644 --- a/pkg/apis/core/types.go +++ b/pkg/apis/core/types.go @@ -3391,6 +3391,8 @@ const ( IPv4Protocol IPFamily = "IPv4" // IPv6Protocol indicates that this IP is IPv6 protocol IPv6Protocol IPFamily = "IPv6" + // MaxServiceTopologyKeys is the largest number of topology keys allowed on a service + MaxServiceTopologyKeys = 16 ) // ServiceSpec describes the attributes that a user creates on a service @@ -3506,14 +3508,14 @@ type ServiceSpec struct { // topologyKeys is a preference-order list of topology keys which // implementations of services should use to preferentially sort endpoints - // when accessing this Service. Topology keys must be valid label keys and - // at most 16 keys may be specified. - // If any ready backends exist for index [0], they should always be chosen; - // only if no backends exist for index [0] should backends for index [1] be considered. + // when accessing this Service, it can not be used at the same time as + // externalTrafficPolicy=Local. + // Topology keys must be valid label keys and at most 16 keys may be specified. + // Endpoints are chosen based on the first topology key with available backends. // If this field is specified and all entries have no backends that match // the topology of the client, the service has no backends for that client // and connections should fail. - // The special value "" may be used to mean "any node". This catch-all + // The special value "*" may be used to mean "any topology". This catch-all // value, if used, only makes sense as the last value in the list. // If this is not specified or empty, no topology constraints will be applied. // +optional diff --git a/pkg/apis/core/validation/validation.go b/pkg/apis/core/validation/validation.go index da110341340..7cbe0aa4c27 100644 --- a/pkg/apis/core/validation/validation.go +++ b/pkg/apis/core/validation/validation.go @@ -4053,6 +4053,35 @@ func ValidateService(service *core.Service) field.ErrorList { ports[key] = true } + // Validate TopologyKeys + if len(service.Spec.TopologyKeys) > 0 { + topoPath := specPath.Child("topologyKeys") + // topologyKeys is mutually exclusive with 'externalTrafficPolicy=Local' + if service.Spec.ExternalTrafficPolicy == core.ServiceExternalTrafficPolicyTypeLocal { + allErrs = append(allErrs, field.Forbidden(topoPath, "may not be specified when `externalTrafficPolicy=Local`")) + } + if len(service.Spec.TopologyKeys) > core.MaxServiceTopologyKeys { + allErrs = append(allErrs, field.TooMany(topoPath, len(service.Spec.TopologyKeys), core.MaxServiceTopologyKeys)) + } + topoKeys := sets.NewString() + for i, key := range service.Spec.TopologyKeys { + keyPath := topoPath.Index(i) + if topoKeys.Has(key) { + allErrs = append(allErrs, field.Duplicate(keyPath, key)) + } + topoKeys.Insert(key) + // "Any" must be the last value specified + if key == v1.TopologyKeyAny && i != len(service.Spec.TopologyKeys)-1 { + allErrs = append(allErrs, field.Invalid(keyPath, key, `"*" must be the last value specified`)) + } + if key != v1.TopologyKeyAny { + for _, msg := range validation.IsQualifiedName(key) { + allErrs = append(allErrs, field.Invalid(keyPath, service.Spec.TopologyKeys, msg)) + } + } + } + } + // Validate SourceRange field and annotation _, ok := service.Annotations[core.AnnotationLoadBalancerSourceRangesKey] if len(service.Spec.LoadBalancerSourceRanges) > 0 || ok { @@ -4143,6 +4172,10 @@ func validateServiceExternalTrafficFieldsValue(service *core.Service) field.Erro allErrs = append(allErrs, field.Invalid(field.NewPath("spec").Child("externalTrafficPolicy"), service.Spec.ExternalTrafficPolicy, fmt.Sprintf("ExternalTrafficPolicy must be empty, %v or %v", core.ServiceExternalTrafficPolicyTypeCluster, core.ServiceExternalTrafficPolicyTypeLocal))) } + // 'externalTrafficPolicy=Local' is mutually exclusive with topologyKeys + if service.Spec.ExternalTrafficPolicy == core.ServiceExternalTrafficPolicyTypeLocal && len(service.Spec.TopologyKeys) > 0 { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec").Child("externalTrafficPolicy"), "externalTrafficPolicy must not be set to 'Local' when topologyKeys is specified")) + } if service.Spec.HealthCheckNodePort < 0 { allErrs = append(allErrs, field.Invalid(field.NewPath("spec").Child("healthCheckNodePort"), service.Spec.HealthCheckNodePort, "HealthCheckNodePort must be not less than 0")) diff --git a/pkg/apis/core/validation/validation_test.go b/pkg/apis/core/validation/validation_test.go index dd935f33800..2716436a8fd 100644 --- a/pkg/apis/core/validation/validation_test.go +++ b/pkg/apis/core/validation/validation_test.go @@ -18,6 +18,7 @@ package validation import ( "bytes" + "fmt" "math" "reflect" "strings" @@ -9380,6 +9381,7 @@ func TestValidatePodEphemeralContainersUpdate(t *testing.T) { func TestValidateService(t *testing.T) { defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.SCTPSupport, true)() + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ServiceTopology, true)() testCases := []struct { name string @@ -10058,6 +10060,66 @@ func TestValidateService(t *testing.T) { }, numErrs: 1, }, + { + name: "valid topology keys", + tweakSvc: func(s *core.Service) { + s.Spec.TopologyKeys = []string{ + "kubernetes.io/hostname", + "failure-domain.beta.kubernetes.io/zone", + "failure-domain.beta.kubernetes.io/region", + v1.TopologyKeyAny, + } + }, + numErrs: 0, + }, + { + name: "invalid topology key", + tweakSvc: func(s *core.Service) { + s.Spec.TopologyKeys = []string{"NoUppercaseOrSpecialCharsLike=Equals"} + }, + numErrs: 1, + }, + { + name: "too many topology keys", + tweakSvc: func(s *core.Service) { + for i := 0; i < core.MaxServiceTopologyKeys+1; i++ { + s.Spec.TopologyKeys = append(s.Spec.TopologyKeys, fmt.Sprintf("topologykey-%d", i)) + } + }, + numErrs: 1, + }, + { + name: `"Any" was not the last key`, + tweakSvc: func(s *core.Service) { + s.Spec.TopologyKeys = []string{ + "kubernetes.io/hostname", + v1.TopologyKeyAny, + "failure-domain.beta.kubernetes.io/zone", + } + }, + numErrs: 1, + }, + { + name: `duplicate topology key`, + tweakSvc: func(s *core.Service) { + s.Spec.TopologyKeys = []string{ + "kubernetes.io/hostname", + "kubernetes.io/hostname", + "failure-domain.beta.kubernetes.io/zone", + } + }, + numErrs: 1, + }, + { + name: `use topology keys with externalTrafficPolicy=Local`, + tweakSvc: func(s *core.Service) { + s.Spec.ExternalTrafficPolicy = "Local" + s.Spec.TopologyKeys = []string{ + "kubernetes.io/hostname", + } + }, + numErrs: 2, + }, } for _, tc := range testCases { diff --git a/pkg/kubemark/hollow_proxy.go b/pkg/kubemark/hollow_proxy.go index 102edba85a9..448a86bb9d5 100644 --- a/pkg/kubemark/hollow_proxy.go +++ b/pkg/kubemark/hollow_proxy.go @@ -45,6 +45,7 @@ type HollowProxy struct { type FakeProxier struct { proxyconfig.NoopEndpointSliceHandler + proxyconfig.NoopNodeHandler } func (*FakeProxier) Sync() {} diff --git a/pkg/proxy/config/config.go b/pkg/proxy/config/config.go index 3010821f85a..387ca05e971 100644 --- a/pkg/proxy/config/config.go +++ b/pkg/proxy/config/config.go @@ -369,3 +369,128 @@ func (c *ServiceConfig) handleDeleteService(obj interface{}) { c.eventHandlers[i].OnServiceDelete(service) } } + +// NodeHandler is an abstract interface of objects which receive +// notifications about node object changes. +type NodeHandler interface { + // OnNodeAdd is called whenever creation of new node object + // is observed. + OnNodeAdd(node *v1.Node) + // OnNodeUpdate is called whenever modification of an existing + // node object is observed. + OnNodeUpdate(oldNode, node *v1.Node) + // OnNodeDelete is called whever deletion of an existing node + // object is observed. + OnNodeDelete(node *v1.Node) + // OnNodeSynced is called once all the initial event handlers were + // called and the state is fully propagated to local cache. + OnNodeSynced() +} + +// NoopNodeHandler is a noop handler for proxiers that have not yet +// implemented a full NodeHandler. +type NoopNodeHandler struct{} + +// OnNodeAdd is a noop handler for Node creates. +func (*NoopNodeHandler) OnNodeAdd(node *v1.Node) {} + +// OnNodeUpdate is a noop handler for Node updates. +func (*NoopNodeHandler) OnNodeUpdate(oldNode, node *v1.Node) {} + +// OnNodeDelete is a noop handler for Node deletes. +func (*NoopNodeHandler) OnNodeDelete(node *v1.Node) {} + +// OnNodeSynced is a noop handler for Node syncs. +func (*NoopNodeHandler) OnNodeSynced() {} + +// NodeConfig tracks a set of node configurations. +// It accepts "set", "add" and "remove" operations of node via channels, and invokes registered handlers on change. +type NodeConfig struct { + listerSynced cache.InformerSynced + eventHandlers []NodeHandler +} + +// NewNodeConfig creates a new NodeConfig. +func NewNodeConfig(nodeInformer coreinformers.NodeInformer, resyncPeriod time.Duration) *NodeConfig { + result := &NodeConfig{ + listerSynced: nodeInformer.Informer().HasSynced, + } + + nodeInformer.Informer().AddEventHandlerWithResyncPeriod( + cache.ResourceEventHandlerFuncs{ + AddFunc: result.handleAddNode, + UpdateFunc: result.handleUpdateNode, + DeleteFunc: result.handleDeleteNode, + }, + resyncPeriod, + ) + + return result +} + +// RegisterEventHandler registers a handler which is called on every node change. +func (c *NodeConfig) RegisterEventHandler(handler NodeHandler) { + c.eventHandlers = append(c.eventHandlers, handler) +} + +// Run starts the goroutine responsible for calling registered handlers. +func (c *NodeConfig) Run(stopCh <-chan struct{}) { + klog.Info("Starting node config controller") + + if !cache.WaitForNamedCacheSync("node config", stopCh, c.listerSynced) { + return + } + + for i := range c.eventHandlers { + klog.V(3).Infof("Calling handler.OnNodeSynced()") + c.eventHandlers[i].OnNodeSynced() + } +} + +func (c *NodeConfig) handleAddNode(obj interface{}) { + node, ok := obj.(*v1.Node) + if !ok { + utilruntime.HandleError(fmt.Errorf("unexpected object type: %v", obj)) + return + } + for i := range c.eventHandlers { + klog.V(4).Infof("Calling handler.OnNodeAdd") + c.eventHandlers[i].OnNodeAdd(node) + } +} + +func (c *NodeConfig) handleUpdateNode(oldObj, newObj interface{}) { + oldNode, ok := oldObj.(*v1.Node) + if !ok { + utilruntime.HandleError(fmt.Errorf("unexpected object type: %v", oldObj)) + return + } + node, ok := newObj.(*v1.Node) + if !ok { + utilruntime.HandleError(fmt.Errorf("unexpected object type: %v", newObj)) + return + } + for i := range c.eventHandlers { + klog.V(5).Infof("Calling handler.OnNodeUpdate") + c.eventHandlers[i].OnNodeUpdate(oldNode, node) + } +} + +func (c *NodeConfig) handleDeleteNode(obj interface{}) { + node, ok := obj.(*v1.Node) + if !ok { + tombstone, ok := obj.(cache.DeletedFinalStateUnknown) + if !ok { + utilruntime.HandleError(fmt.Errorf("unexpected object type: %v", obj)) + return + } + if node, ok = tombstone.Obj.(*v1.Node); !ok { + utilruntime.HandleError(fmt.Errorf("unexpected object type: %v", obj)) + return + } + } + for i := range c.eventHandlers { + klog.V(4).Infof("Calling handler.OnNodeDelete") + c.eventHandlers[i].OnNodeDelete(node) + } +} diff --git a/pkg/proxy/endpoints.go b/pkg/proxy/endpoints.go index 52ae583f941..35c2fc58893 100644 --- a/pkg/proxy/endpoints.go +++ b/pkg/proxy/endpoints.go @@ -48,7 +48,8 @@ var supportedEndpointSliceAddressTypes = sets.NewString( type BaseEndpointInfo struct { Endpoint string // TODO: should be an endpointString type // IsLocal indicates whether the endpoint is running in same host as kube-proxy. - IsLocal bool + IsLocal bool + Topology map[string]string } var _ Endpoint = &BaseEndpointInfo{} @@ -63,6 +64,11 @@ func (info *BaseEndpointInfo) GetIsLocal() bool { return info.IsLocal } +// GetTopology returns the topology information of the endpoint. +func (info *BaseEndpointInfo) GetTopology() map[string]string { + return info.Topology +} + // IP returns just the IP part of the endpoint, it's a part of proxy.Endpoint interface. func (info *BaseEndpointInfo) IP() string { return utilproxy.IPPart(info.Endpoint) @@ -78,10 +84,11 @@ func (info *BaseEndpointInfo) Equal(other Endpoint) bool { return info.String() == other.String() && info.GetIsLocal() == other.GetIsLocal() } -func newBaseEndpointInfo(IP string, port int, isLocal bool) *BaseEndpointInfo { +func newBaseEndpointInfo(IP string, port int, isLocal bool, topology map[string]string) *BaseEndpointInfo { return &BaseEndpointInfo{ Endpoint: net.JoinHostPort(IP, strconv.Itoa(port)), IsLocal: isLocal, + Topology: topology, } } @@ -358,7 +365,7 @@ func (ect *EndpointChangeTracker) endpointsToEndpointsMap(endpoints *v1.Endpoint continue } isLocal := addr.NodeName != nil && *addr.NodeName == ect.hostname - baseEndpointInfo := newBaseEndpointInfo(addr.IP, int(port.Port), isLocal) + baseEndpointInfo := newBaseEndpointInfo(addr.IP, int(port.Port), isLocal, nil) if ect.makeEndpointInfo != nil { endpointsMap[svcPortName] = append(endpointsMap[svcPortName], ect.makeEndpointInfo(baseEndpointInfo)) } else { diff --git a/pkg/proxy/endpoints_test.go b/pkg/proxy/endpoints_test.go index 8919d92f335..d6abcc1ade9 100644 --- a/pkg/proxy/endpoints_test.go +++ b/pkg/proxy/endpoints_test.go @@ -400,7 +400,7 @@ func TestEndpointsToEndpointsMap(t *testing.T) { } else { for i := range newEndpoints[x] { ep := newEndpoints[x][i].(*BaseEndpointInfo) - if *ep != *(tc.expected[x][i]) { + if !(reflect.DeepEqual(*ep, *(tc.expected[x][i]))) { t.Errorf("[%s] expected new[%v][%d] to be %v, got %v", tc.desc, x, i, tc.expected[x][i], *ep) } } @@ -1699,21 +1699,21 @@ func TestCheckoutChanges(t *testing.T) { endpointChangeTracker: NewEndpointChangeTracker("", nil, nil, nil, false), expectedChanges: []*endpointsChange{{ previous: EndpointsMap{ - svcPortName0: []Endpoint{newTestEp("10.0.1.1:80"), newTestEp("10.0.1.2:80")}, - svcPortName1: []Endpoint{newTestEp("10.0.1.1:443"), newTestEp("10.0.1.2:443")}, + svcPortName0: []Endpoint{newTestEp("10.0.1.1:80", ""), newTestEp("10.0.1.2:80", "")}, + svcPortName1: []Endpoint{newTestEp("10.0.1.1:443", ""), newTestEp("10.0.1.2:443", "")}, }, current: EndpointsMap{ - svcPortName0: []Endpoint{newTestEp("10.0.1.1:80"), newTestEp("10.0.1.2:80")}, + svcPortName0: []Endpoint{newTestEp("10.0.1.1:80", ""), newTestEp("10.0.1.2:80", "")}, }, }}, items: map[types.NamespacedName]*endpointsChange{ {Namespace: "ns1", Name: "svc1"}: { previous: EndpointsMap{ - svcPortName0: []Endpoint{newTestEp("10.0.1.1:80"), newTestEp("10.0.1.2:80")}, - svcPortName1: []Endpoint{newTestEp("10.0.1.1:443"), newTestEp("10.0.1.2:443")}, + svcPortName0: []Endpoint{newTestEp("10.0.1.1:80", ""), newTestEp("10.0.1.2:80", "")}, + svcPortName1: []Endpoint{newTestEp("10.0.1.1:443", ""), newTestEp("10.0.1.2:443", "")}, }, current: EndpointsMap{ - svcPortName0: []Endpoint{newTestEp("10.0.1.1:80"), newTestEp("10.0.1.2:80")}, + svcPortName0: []Endpoint{newTestEp("10.0.1.1:80", ""), newTestEp("10.0.1.2:80", "")}, }, }, }, @@ -1724,7 +1724,7 @@ func TestCheckoutChanges(t *testing.T) { expectedChanges: []*endpointsChange{{ previous: EndpointsMap{}, current: EndpointsMap{ - svcPortName0: []Endpoint{newTestEp("10.0.1.1:80"), newTestEp("10.0.1.2:80")}, + svcPortName0: []Endpoint{newTestEp("10.0.1.1:80", "host1"), newTestEp("10.0.1.2:80", "host1")}, }, }}, useEndpointSlices: true, @@ -1737,11 +1737,11 @@ func TestCheckoutChanges(t *testing.T) { endpointChangeTracker: NewEndpointChangeTracker("", nil, nil, nil, true), expectedChanges: []*endpointsChange{{ previous: EndpointsMap{ - svcPortName0: []Endpoint{newTestEp("10.0.1.1:80"), newTestEp("10.0.1.2:80")}, - svcPortName1: []Endpoint{newTestEp("10.0.1.1:443"), newTestEp("10.0.1.2:443")}, + svcPortName0: []Endpoint{newTestEp("10.0.1.1:80", "host1"), newTestEp("10.0.1.2:80", "host1")}, + svcPortName1: []Endpoint{newTestEp("10.0.1.1:443", "host1"), newTestEp("10.0.1.2:443", "host1")}, }, current: EndpointsMap{ - svcPortName0: []Endpoint{newTestEp("10.0.1.1:80"), newTestEp("10.0.1.2:80")}, + svcPortName0: []Endpoint{newTestEp("10.0.1.1:80", "host1"), newTestEp("10.0.1.2:80", "host1")}, }, }}, useEndpointSlices: true, @@ -1796,6 +1796,9 @@ func compareEndpointsMapsStr(t *testing.T, newMap EndpointsMap, expected map[Ser if len(newMap) != len(expected) { t.Errorf("expected %d results, got %d: %v", len(expected), len(newMap), newMap) } + endpointEqual := func(a, b *BaseEndpointInfo) bool { + return a.Endpoint == b.Endpoint && a.IsLocal == b.IsLocal + } for x := range expected { if len(newMap[x]) != len(expected[x]) { t.Errorf("expected %d endpoints for %v, got %d", len(expected[x]), x, len(newMap[x])) @@ -1807,7 +1810,7 @@ func compareEndpointsMapsStr(t *testing.T, newMap EndpointsMap, expected map[Ser t.Errorf("Failed to cast endpointsInfo") continue } - if *newEp != *(expected[x][i]) { + if !endpointEqual(newEp, expected[x][i]) { t.Errorf("expected new[%v][%d] to be %v, got %v (IsLocal expected %v, got %v)", x, i, expected[x][i], newEp, expected[x][i].IsLocal, newEp.IsLocal) } } @@ -1815,8 +1818,14 @@ func compareEndpointsMapsStr(t *testing.T, newMap EndpointsMap, expected map[Ser } } -func newTestEp(ep string) *BaseEndpointInfo { - return &BaseEndpointInfo{Endpoint: ep} +func newTestEp(ep, host string) *BaseEndpointInfo { + endpointInfo := &BaseEndpointInfo{Endpoint: ep} + if host != "" { + endpointInfo.Topology = map[string]string{ + "kubernetes.io/hostname": host, + } + } + return endpointInfo } func initializeCache(endpointSliceCache *EndpointSliceCache, endpointSlices []*discovery.EndpointSlice) { diff --git a/pkg/proxy/endpointslicecache.go b/pkg/proxy/endpointslicecache.go index 85882bf5c35..e9c6165353b 100644 --- a/pkg/proxy/endpointslicecache.go +++ b/pkg/proxy/endpointslicecache.go @@ -254,7 +254,7 @@ func (cache *EndpointSliceCache) addEndpointsByIP(serviceNN types.NamespacedName } isLocal := cache.isLocal(endpoint.Topology[v1.LabelHostname]) - endpointInfo := newBaseEndpointInfo(endpoint.Addresses[0], portNum, isLocal) + endpointInfo := newBaseEndpointInfo(endpoint.Addresses[0], portNum, isLocal, endpoint.Topology) // This logic ensures we're deduping potential overlapping endpoints // isLocal should not vary between matching IPs, but if it does, we diff --git a/pkg/proxy/endpointslicecache_test.go b/pkg/proxy/endpointslicecache_test.go index 244348413e0..6651fa8daf0 100644 --- a/pkg/proxy/endpointslicecache_test.go +++ b/pkg/proxy/endpointslicecache_test.go @@ -176,9 +176,9 @@ func TestEndpointInfoByServicePort(t *testing.T) { }, expectedMap: spToEndpointMap{ makeServicePortName("ns1", "svc1", "port-0", v1.ProtocolTCP): { - "10.0.1.1": &BaseEndpointInfo{Endpoint: "10.0.1.1:80", IsLocal: false}, - "10.0.1.2": &BaseEndpointInfo{Endpoint: "10.0.1.2:80", IsLocal: true}, - "10.0.1.3": &BaseEndpointInfo{Endpoint: "10.0.1.3:80", IsLocal: false}, + "10.0.1.1": &BaseEndpointInfo{Endpoint: "10.0.1.1:80", IsLocal: false, Topology: map[string]string{"kubernetes.io/hostname": "host2"}}, + "10.0.1.2": &BaseEndpointInfo{Endpoint: "10.0.1.2:80", IsLocal: true, Topology: map[string]string{"kubernetes.io/hostname": "host1"}}, + "10.0.1.3": &BaseEndpointInfo{Endpoint: "10.0.1.3:80", IsLocal: false, Topology: map[string]string{"kubernetes.io/hostname": "host2"}}, }, }, }, diff --git a/pkg/proxy/iptables/proxier.go b/pkg/proxy/iptables/proxier.go index 9f17033e588..3f6c5f4b9d5 100644 --- a/pkg/proxy/iptables/proxier.go +++ b/pkg/proxy/iptables/proxier.go @@ -181,6 +181,7 @@ type Proxier struct { serviceMap proxy.ServiceMap endpointsMap proxy.EndpointsMap portsMap map[utilproxy.LocalPort]utilproxy.Closeable + nodeLabels map[string]string // endpointsSynced, endpointSlicesSynced, and servicesSynced are set to true // when corresponding objects are synced after startup. This is used to avoid // updating iptables with some partial data after kube-proxy restart. @@ -591,6 +592,47 @@ func (proxier *Proxier) OnEndpointSlicesSynced() { proxier.syncProxyRules() } +// OnNodeAdd is called whenever creation of new node object +// is observed. +func (proxier *Proxier) OnNodeAdd(node *v1.Node) { + if node.Name != proxier.hostname { + klog.Errorf("Received a watch event for a node %s that doesn't match the current node %v", node.Name, proxier.hostname) + return + } + proxier.mu.Lock() + proxier.nodeLabels = node.Labels + proxier.mu.Unlock() +} + +// OnNodeUpdate is called whenever modification of an existing +// node object is observed. +func (proxier *Proxier) OnNodeUpdate(oldNode, node *v1.Node) { + if node.Name != proxier.hostname { + klog.Errorf("Received a watch event for a node %s that doesn't match the current node %v", node.Name, proxier.hostname) + return + } + proxier.mu.Lock() + proxier.nodeLabels = node.Labels + proxier.mu.Unlock() +} + +// OnNodeDelete is called whever deletion of an existing node +// object is observed. +func (proxier *Proxier) OnNodeDelete(node *v1.Node) { + if node.Name != proxier.hostname { + klog.Errorf("Received a watch event for a node %s that doesn't match the current node %v", node.Name, proxier.hostname) + return + } + proxier.mu.Lock() + proxier.nodeLabels = nil + proxier.mu.Unlock() +} + +// OnNodeSynced is called once all the initial event handlers were +// called and the state is fully propagated to local cache. +func (proxier *Proxier) OnNodeSynced() { +} + // portProtoHash takes the ServicePortName and protocol for a service // returns the associated 16 character hash. This is computed by hashing (sha256) // then encoding to base32 and truncating to 16 chars. We do this because IPTables @@ -858,7 +900,20 @@ func (proxier *Proxier) syncProxyRules() { isIPv6 := utilnet.IsIPv6(svcInfo.ClusterIP()) protocol := strings.ToLower(string(svcInfo.Protocol())) svcNameString := svcInfo.serviceNameString - hasEndpoints := len(proxier.endpointsMap[svcName]) > 0 + + allEndpoints := proxier.endpointsMap[svcName] + + hasEndpoints := len(allEndpoints) > 0 + + // Service Topology will not be enabled in the following cases: + // 1. externalTrafficPolicy=Local (mutually exclusive with service topology). + // 2. ServiceTopology is not enabled. + // 3. EndpointSlice is not enabled (service topology depends on endpoint slice + // to get topology information). + if !svcInfo.OnlyNodeLocalEndpoints() && utilfeature.DefaultFeatureGate.Enabled(features.ServiceTopology) && utilfeature.DefaultFeatureGate.Enabled(features.EndpointSlice) { + allEndpoints = proxy.FilterTopologyEndpoint(proxier.nodeLabels, svcInfo.TopologyKeys(), allEndpoints) + hasEndpoints = len(allEndpoints) > 0 + } svcChain := svcInfo.servicePortChainName if hasEndpoints { @@ -1168,12 +1223,13 @@ func (proxier *Proxier) syncProxyRules() { endpoints = endpoints[:0] endpointChains = endpointChains[:0] var endpointChain utiliptables.Chain - for _, ep := range proxier.endpointsMap[svcName] { + for _, ep := range allEndpoints { epInfo, ok := ep.(*endpointsInfo) if !ok { klog.Errorf("Failed to cast endpointsInfo %q", ep.String()) continue } + endpoints = append(endpoints, epInfo) endpointChain = epInfo.endpointChain(svcNameString, protocol) endpointChains = append(endpointChains, endpointChain) @@ -1220,6 +1276,7 @@ func (proxier *Proxier) syncProxyRules() { // Error parsing this endpoint has been logged. Skip to next endpoint. continue } + // Balancing rules in the per-service chain. args = append(args[:0], "-A", string(svcChain)) proxier.appendServiceCommentLocked(args, svcNameString) diff --git a/pkg/proxy/ipvs/meta_proxier.go b/pkg/proxy/ipvs/meta_proxier.go index bef79df5984..062ac3feee5 100644 --- a/pkg/proxy/ipvs/meta_proxier.go +++ b/pkg/proxy/ipvs/meta_proxier.go @@ -22,6 +22,8 @@ import ( "k8s.io/api/core/v1" "k8s.io/klog" "k8s.io/kubernetes/pkg/proxy" + "k8s.io/kubernetes/pkg/proxy/config" + utilnet "k8s.io/utils/net" discovery "k8s.io/api/discovery/v1beta1" @@ -30,6 +32,8 @@ import ( type metaProxier struct { ipv4Proxier proxy.Provider ipv6Proxier proxy.Provider + // TODO(imroc): implement node handler for meta proxier. + config.NoopNodeHandler } // NewMetaProxier returns a dual-stack "meta-proxier". Proxier API diff --git a/pkg/proxy/ipvs/proxier.go b/pkg/proxy/ipvs/proxier.go index 7549c7e2665..8f71619b4b2 100644 --- a/pkg/proxy/ipvs/proxier.go +++ b/pkg/proxy/ipvs/proxier.go @@ -30,6 +30,10 @@ import ( "sync/atomic" "time" + "k8s.io/klog" + utilexec "k8s.io/utils/exec" + utilnet "k8s.io/utils/net" + v1 "k8s.io/api/core/v1" discovery "k8s.io/api/discovery/v1beta1" "k8s.io/apimachinery/pkg/types" @@ -38,7 +42,6 @@ import ( "k8s.io/apimachinery/pkg/util/wait" utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/client-go/tools/record" - "k8s.io/klog" "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/proxy" "k8s.io/kubernetes/pkg/proxy/healthcheck" @@ -50,8 +53,6 @@ import ( utiliptables "k8s.io/kubernetes/pkg/util/iptables" utilipvs "k8s.io/kubernetes/pkg/util/ipvs" utilsysctl "k8s.io/kubernetes/pkg/util/sysctl" - utilexec "k8s.io/utils/exec" - utilnet "k8s.io/utils/net" ) const ( @@ -200,6 +201,7 @@ type Proxier struct { serviceMap proxy.ServiceMap endpointsMap proxy.EndpointsMap portsMap map[utilproxy.LocalPort]utilproxy.Closeable + nodeLabels map[string]string // endpointsSynced, endpointSlicesSynced, and servicesSynced are set to true when // corresponding objects are synced after startup. This is used to avoid updating // ipvs rules with some partial data after kube-proxy restart. @@ -896,6 +898,47 @@ func (proxier *Proxier) OnEndpointSlicesSynced() { proxier.syncProxyRules() } +// OnNodeAdd is called whenever creation of new node object +// is observed. +func (proxier *Proxier) OnNodeAdd(node *v1.Node) { + if node.Name != proxier.hostname { + klog.Errorf("Received a watch event for a node %s that doesn't match the current node %v", node.Name, proxier.hostname) + return + } + proxier.mu.Lock() + proxier.nodeLabels = node.Labels + proxier.mu.Unlock() +} + +// OnNodeUpdate is called whenever modification of an existing +// node object is observed. +func (proxier *Proxier) OnNodeUpdate(oldNode, node *v1.Node) { + if node.Name != proxier.hostname { + klog.Errorf("Received a watch event for a node %s that doesn't match the current node %v", node.Name, proxier.hostname) + return + } + proxier.mu.Lock() + proxier.nodeLabels = node.Labels + proxier.mu.Unlock() +} + +// OnNodeDelete is called whever deletion of an existing node +// object is observed. +func (proxier *Proxier) OnNodeDelete(node *v1.Node) { + if node.Name != proxier.hostname { + klog.Errorf("Received a watch event for a node %s that doesn't match the current node %v", node.Name, proxier.hostname) + return + } + proxier.mu.Lock() + proxier.nodeLabels = nil + proxier.mu.Unlock() +} + +// OnNodeSynced is called once all the initial event handlers were +// called and the state is fully propagated to local cache. +func (proxier *Proxier) OnNodeSynced() { +} + // EntryInvalidErr indicates if an ipset entry is invalid or not const EntryInvalidErr = "error adding entry %s to ipset %s" @@ -1866,7 +1909,18 @@ func (proxier *Proxier) syncEndpoint(svcPortName proxy.ServicePortName, onlyNode curEndpoints.Insert(des.String()) } - for _, epInfo := range proxier.endpointsMap[svcPortName] { + endpoints := proxier.endpointsMap[svcPortName] + + // Service Topology will not be enabled in the following cases: + // 1. externalTrafficPolicy=Local (mutually exclusive with service topology). + // 2. ServiceTopology is not enabled. + // 3. EndpointSlice is not enabled (service topology depends on endpoint slice + // to get topology information). + if !onlyNodeLocalEndpoints && utilfeature.DefaultFeatureGate.Enabled(features.ServiceTopology) && utilfeature.DefaultFeatureGate.Enabled(features.EndpointSlice) { + endpoints = proxy.FilterTopologyEndpoint(proxier.nodeLabels, proxier.serviceMap[svcPortName].TopologyKeys(), endpoints) + } + + for _, epInfo := range endpoints { if onlyNodeLocalEndpoints && !epInfo.GetIsLocal() { continue } diff --git a/pkg/proxy/ipvs/proxier_test.go b/pkg/proxy/ipvs/proxier_test.go index 1332a464c3b..ab49b8f64b3 100644 --- a/pkg/proxy/ipvs/proxier_test.go +++ b/pkg/proxy/ipvs/proxier_test.go @@ -2951,7 +2951,7 @@ func compareEndpointsMaps(t *testing.T, tci int, newMap proxy.EndpointsMap, expe t.Errorf("Failed to cast proxy.BaseEndpointInfo") continue } - if *newEp != *(expected[x][i]) { + if !reflect.DeepEqual(*newEp, *(expected[x][i])) { t.Errorf("[%d] expected new[%v][%d] to be %v, got %v", tci, x, i, expected[x][i], newEp) } } @@ -3702,7 +3702,6 @@ func TestEndpointSliceE2E(t *testing.T) { // Add initial service serviceName := "svc1" namespaceName := "ns1" - fp.OnServiceAdd(&v1.Service{ ObjectMeta: metav1.ObjectMeta{Name: serviceName, Namespace: namespaceName}, Spec: v1.ServiceSpec{ diff --git a/pkg/proxy/service.go b/pkg/proxy/service.go index 707947634c5..5a18d2c7941 100644 --- a/pkg/proxy/service.go +++ b/pkg/proxy/service.go @@ -51,6 +51,7 @@ type BaseServiceInfo struct { loadBalancerSourceRanges []string healthCheckNodePort int onlyNodeLocalEndpoints bool + topologyKeys []string } var _ ServicePort = &BaseServiceInfo{} @@ -119,6 +120,11 @@ func (info *BaseServiceInfo) OnlyNodeLocalEndpoints() bool { return info.onlyNodeLocalEndpoints } +// TopologyKeys is part of ServicePort interface. +func (info *BaseServiceInfo) TopologyKeys() []string { + return info.topologyKeys +} + func (sct *ServiceChangeTracker) newBaseServiceInfo(port *v1.ServicePort, service *v1.Service) *BaseServiceInfo { onlyNodeLocalEndpoints := false if apiservice.RequestsOnlyLocalTraffic(service) { @@ -139,6 +145,7 @@ func (sct *ServiceChangeTracker) newBaseServiceInfo(port *v1.ServicePort, servic sessionAffinityType: service.Spec.SessionAffinity, stickyMaxAgeSeconds: stickyMaxAgeSeconds, onlyNodeLocalEndpoints: onlyNodeLocalEndpoints, + topologyKeys: service.Spec.TopologyKeys, } if sct.isIPv6Mode == nil { diff --git a/pkg/proxy/topology.go b/pkg/proxy/topology.go new file mode 100644 index 00000000000..fda3348e410 --- /dev/null +++ b/pkg/proxy/topology.go @@ -0,0 +1,80 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package proxy + +import ( + v1 "k8s.io/api/core/v1" +) + +// FilterTopologyEndpoint returns the appropriate endpoints based on the cluster +// topology. +// This uses the current node's labels, which contain topology information, and +// the required topologyKeys to find appropriate endpoints. If both the endpoint's +// topology and the current node have matching values for topologyKeys[0], the +// endpoint will be chosen. If no endpoints are chosen, toplogyKeys[1] will be +// considered, and so on. If either the node or the endpoint do not have values +// for a key, it is considered to not match. +// +// If topologyKeys is specified, but no endpoints are chosen for any key, the +// the service has no viable endpoints for clients on this node, and connections +// should fail. +// +// The special key "*" may be used as the last entry in topologyKeys to indicate +// "any endpoint" is acceptable. +// +// If topologyKeys is not specified or empty, no topology constraints will be +// applied and this will return all endpoints. +func FilterTopologyEndpoint(nodeLabels map[string]string, topologyKeys []string, endpoints []Endpoint) []Endpoint { + // Do not filter endpoints if service has no topology keys. + if len(topologyKeys) == 0 { + return endpoints + } + + filteredEndpoint := []Endpoint{} + + if len(nodeLabels) == 0 { + if topologyKeys[len(topologyKeys)-1] == v1.TopologyKeyAny { + // edge case: include all endpoints if topology key "Any" specified + // when we cannot determine current node's topology. + return endpoints + } + // edge case: do not include any endpoints if topology key "Any" is + // not specified when we cannot determine current node's topology. + return filteredEndpoint + } + + for _, key := range topologyKeys { + if key == v1.TopologyKeyAny { + return endpoints + } + topologyValue, found := nodeLabels[key] + if !found { + continue + } + + for _, ep := range endpoints { + topology := ep.GetTopology() + if value, found := topology[key]; found && value == topologyValue { + filteredEndpoint = append(filteredEndpoint, ep) + } + } + if len(filteredEndpoint) > 0 { + return filteredEndpoint + } + } + return filteredEndpoint +} diff --git a/pkg/proxy/topology_test.go b/pkg/proxy/topology_test.go new file mode 100644 index 00000000000..c874e0217c1 --- /dev/null +++ b/pkg/proxy/topology_test.go @@ -0,0 +1,478 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package proxy + +import ( + "reflect" + "testing" + + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/types" +) + +func TestFilterTopologyEndpoint(t *testing.T) { + type endpoint struct { + Endpoint string + NodeName types.NodeName + } + testCases := []struct { + Name string + nodeLabels map[types.NodeName]map[string]string + endpoints []endpoint + currentNodeName types.NodeName + topologyKeys []string + expected []endpoint + }{ + { + // Case[0]: no topology key and endpoints at all = 0 endpoints + Name: "no topology key and endpoints", + nodeLabels: map[types.NodeName]map[string]string{ + "testNode1": { + "kubernetes.io/hostname": "10.0.0.1", + "topology.kubernetes.io/zone": "90001", + "topology.kubernetes.io/region": "cd", + }}, + endpoints: []endpoint{}, + currentNodeName: "testNode1", + topologyKeys: nil, + expected: []endpoint{}, + }, + { + // Case[1]: no topology key, 2 nodes each with 2 endpoints = 4 + // endpoints + Name: "no topology key but have endpoints", + nodeLabels: map[types.NodeName]map[string]string{ + "testNode1": { + "kubernetes.io/hostname": "testNode1", + "topology.kubernetes.io/zone": "90001", + "topology.kubernetes.io/region": "cd", + }, + "testNode2": { + "kubernetes.io/hostname": "testNode2", + "topology.kubernetes.io/zone": "90001", + "topology.kubernetes.io/region": "cd", + }, + }, + endpoints: []endpoint{ + {Endpoint: "1.1.1.1:11", NodeName: "testNode1"}, + {Endpoint: "1.1.1.2:11", NodeName: "testNode1"}, + {Endpoint: "1.1.2.1:11", NodeName: "testNode2"}, + {Endpoint: "1.1.2.2:11", NodeName: "testNode2"}, + }, + currentNodeName: "testNode1", + topologyKeys: nil, + expected: []endpoint{ + {Endpoint: "1.1.1.1:11", NodeName: "testNode1"}, + {Endpoint: "1.1.1.2:11", NodeName: "testNode1"}, + {Endpoint: "1.1.2.1:11", NodeName: "testNode2"}, + {Endpoint: "1.1.2.2:11", NodeName: "testNode2"}, + }, + }, + { + // Case[2]: 1 topology key (hostname), 2 nodes each with 2 endpoints + // 1 match = 2 endpoints + Name: "one topology key with one node matched", + nodeLabels: map[types.NodeName]map[string]string{ + "testNode1": { + "kubernetes.io/hostname": "testNode1", + "topology.kubernetes.io/zone": "90001", + "topology.kubernetes.io/region": "cd", + }, + "testNode2": { + "kubernetes.io/hostname": "testNode2", + "topology.kubernetes.io/zone": "90001", + "topology.kubernetes.io/region": "cd", + }, + }, + endpoints: []endpoint{ + {Endpoint: "1.1.1.1:11", NodeName: "testNode1"}, + {Endpoint: "1.1.1.2:11", NodeName: "testNode1"}, + {Endpoint: "1.1.2.1:11", NodeName: "testNode2"}, + {Endpoint: "1.1.2.2:11", NodeName: "testNode2"}, + }, + currentNodeName: "testNode1", + topologyKeys: []string{"kubernetes.io/hostname"}, + expected: []endpoint{ + {Endpoint: "1.1.1.1:11", NodeName: "testNode1"}, + {Endpoint: "1.1.1.2:11", NodeName: "testNode1"}, + }, + }, + { + // Case[3]: 1 topology key (hostname), 2 nodes each with 2 endpoints + // no match = 0 endpoints + Name: "one topology key without node matched", + nodeLabels: map[types.NodeName]map[string]string{ + "testNode1": { + "kubernetes.io/hostname": "testNode1", + "topology.kubernetes.io/zone": "90001", + "topology.kubernetes.io/region": "cd", + }, + "testNode2": { + "kubernetes.io/hostname": "testNode2", + "topology.kubernetes.io/zone": "90001", + "topology.kubernetes.io/region": "cd", + }, + "testNode3": { + "kubernetes.io/hostname": "testNode3", + "topology.kubernetes.io/zone": "90001", + "topology.kubernetes.io/region": "cd", + }, + }, + endpoints: []endpoint{ + {Endpoint: "1.1.1.1:11", NodeName: "testNode1"}, + {Endpoint: "1.1.1.2:11", NodeName: "testNode1"}, + {Endpoint: "1.1.2.1:11", NodeName: "testNode2"}, + {Endpoint: "1.1.2.2:11", NodeName: "testNode2"}, + }, + currentNodeName: "testNode3", + topologyKeys: []string{"kubernetes.io/hostname"}, + expected: []endpoint{}, + }, + { + // Case[4]: 1 topology key (zone), 2 nodes in zone a, 2 nodes in + // zone b, each with 2 endpoints = 4 endpoints + Name: "one topology key with multiple nodes matched", + nodeLabels: map[types.NodeName]map[string]string{ + "testNode1": { + "kubernetes.io/hostname": "testNode1", + "topology.kubernetes.io/zone": "90001", + "topology.kubernetes.io/region": "cd", + }, + "testNode2": { + "kubernetes.io/hostname": "testNode2", + "topology.kubernetes.io/zone": "90001", + "topology.kubernetes.io/region": "cd", + }, + "testNode3": { + "kubernetes.io/hostname": "testNode3", + "topology.kubernetes.io/zone": "90002", + "topology.kubernetes.io/region": "cd", + }, + "testNode4": { + "kubernetes.io/hostname": "testNode4", + "topology.kubernetes.io/zone": "90002", + "topology.kubernetes.io/region": "cd", + }, + }, + endpoints: []endpoint{ + {Endpoint: "1.1.1.1:11", NodeName: "testNode1"}, + {Endpoint: "1.1.1.2:11", NodeName: "testNode1"}, + {Endpoint: "1.1.2.1:11", NodeName: "testNode2"}, + {Endpoint: "1.1.2.2:11", NodeName: "testNode2"}, + {Endpoint: "1.1.3.1:11", NodeName: "testNode3"}, + {Endpoint: "1.1.3.2:11", NodeName: "testNode3"}, + {Endpoint: "1.1.4.1:11", NodeName: "testNode4"}, + {Endpoint: "1.1.4.2:11", NodeName: "testNode4"}, + }, + currentNodeName: "testNode2", + topologyKeys: []string{"topology.kubernetes.io/zone"}, + expected: []endpoint{ + {Endpoint: "1.1.1.1:11", NodeName: "testNode1"}, + {Endpoint: "1.1.1.2:11", NodeName: "testNode1"}, + {Endpoint: "1.1.2.1:11", NodeName: "testNode2"}, + {Endpoint: "1.1.2.2:11", NodeName: "testNode2"}, + }, + }, + { + // Case[5]: 2 topology keys (hostname, zone), 2 nodes each with 2 + // endpoints, 1 hostname match = 2 endpoints (2nd key ignored) + Name: "early match in multiple topology keys", + nodeLabels: map[types.NodeName]map[string]string{ + "testNode1": { + "kubernetes.io/hostname": "testNode1", + "topology.kubernetes.io/zone": "90001", + "topology.kubernetes.io/region": "cd", + }, + "testNode2": { + "kubernetes.io/hostname": "testNode2", + "topology.kubernetes.io/zone": "90001", + "topology.kubernetes.io/region": "cd", + }, + "testNode3": { + "kubernetes.io/hostname": "testNode3", + "topology.kubernetes.io/zone": "90002", + "topology.kubernetes.io/region": "cd", + }, + "testNode4": { + "kubernetes.io/hostname": "testNode4", + "topology.kubernetes.io/zone": "90002", + "topology.kubernetes.io/region": "cd", + }, + }, + endpoints: []endpoint{ + {Endpoint: "1.1.1.1:11", NodeName: "testNode1"}, + {Endpoint: "1.1.1.2:11", NodeName: "testNode1"}, + {Endpoint: "1.1.2.1:11", NodeName: "testNode2"}, + {Endpoint: "1.1.2.2:11", NodeName: "testNode2"}, + {Endpoint: "1.1.3.1:11", NodeName: "testNode3"}, + {Endpoint: "1.1.3.2:11", NodeName: "testNode3"}, + {Endpoint: "1.1.4.1:11", NodeName: "testNode4"}, + {Endpoint: "1.1.4.2:11", NodeName: "testNode4"}, + }, + currentNodeName: "testNode2", + topologyKeys: []string{"kubernetes.io/hostname"}, + expected: []endpoint{ + {Endpoint: "1.1.2.1:11", NodeName: "testNode2"}, + {Endpoint: "1.1.2.2:11", NodeName: "testNode2"}, + }, + }, + { + // Case[6]: 2 topology keys (hostname, zone), 2 nodes in zone a, 2 + // nodes in zone b, each with 2 endpoints, no hostname match, 1 zone + // match = 4 endpoints + Name: "later match in multiple topology keys", + nodeLabels: map[types.NodeName]map[string]string{ + "testNode1": { + "kubernetes.io/hostname": "testNode1", + "topology.kubernetes.io/zone": "90001", + "topology.kubernetes.io/region": "cd", + }, + "testNode2": { + "kubernetes.io/hostname": "testNode2", + "topology.kubernetes.io/zone": "90001", + "topology.kubernetes.io/region": "cd", + }, + "testNode3": { + "kubernetes.io/hostname": "testNode3", + "topology.kubernetes.io/zone": "90002", + "topology.kubernetes.io/region": "cd", + }, + "testNode4": { + "kubernetes.io/hostname": "testNode4", + "topology.kubernetes.io/zone": "90002", + "topology.kubernetes.io/region": "cd", + }, + "testNode5": { + "kubernetes.io/hostname": "testNode5", + "topology.kubernetes.io/zone": "90002", + "topology.kubernetes.io/region": "cd", + }, + }, + endpoints: []endpoint{ + {Endpoint: "1.1.1.1:11", NodeName: "testNode1"}, + {Endpoint: "1.1.1.2:11", NodeName: "testNode1"}, + {Endpoint: "1.1.2.1:11", NodeName: "testNode2"}, + {Endpoint: "1.1.2.2:11", NodeName: "testNode2"}, + {Endpoint: "1.1.3.1:11", NodeName: "testNode3"}, + {Endpoint: "1.1.3.2:11", NodeName: "testNode3"}, + {Endpoint: "1.1.4.1:11", NodeName: "testNode4"}, + {Endpoint: "1.1.4.2:11", NodeName: "testNode4"}, + }, + currentNodeName: "testNode5", + topologyKeys: []string{"kubernetes.io/hostname", "topology.kubernetes.io/zone"}, + expected: []endpoint{ + {Endpoint: "1.1.3.1:11", NodeName: "testNode3"}, + {Endpoint: "1.1.3.2:11", NodeName: "testNode3"}, + {Endpoint: "1.1.4.1:11", NodeName: "testNode4"}, + {Endpoint: "1.1.4.2:11", NodeName: "testNode4"}, + }, + }, + { + // Case[7]: 2 topology keys (hostname, zone), 2 nodes in zone a, 2 + // nodes in zone b, each with 2 endpoints, no hostname match, no zone + // match = 0 endpoints + Name: "multiple topology keys without node matched", + nodeLabels: map[types.NodeName]map[string]string{ + "testNode1": { + "kubernetes.io/hostname": "testNode1", + "topology.kubernetes.io/zone": "90001", + "topology.kubernetes.io/region": "cd", + }, + "testNode2": { + "kubernetes.io/hostname": "testNode2", + "topology.kubernetes.io/zone": "90001", + "topology.kubernetes.io/region": "cd", + }, + "testNode3": { + "kubernetes.io/hostname": "testNode3", + "topology.kubernetes.io/zone": "90002", + "topology.kubernetes.io/region": "cd", + }, + "testNode4": { + "kubernetes.io/hostname": "testNode4", + "topology.kubernetes.io/zone": "90002", + "topology.kubernetes.io/region": "cd", + }, + "testNode5": { + "kubernetes.io/hostname": "testNode5", + "topology.kubernetes.io/zone": "90003", + "topology.kubernetes.io/region": "cd", + }, + }, + endpoints: []endpoint{ + {Endpoint: "1.1.1.1:11", NodeName: "testNode1"}, + {Endpoint: "1.1.1.2:11", NodeName: "testNode1"}, + {Endpoint: "1.1.2.1:11", NodeName: "testNode2"}, + {Endpoint: "1.1.2.2:11", NodeName: "testNode2"}, + {Endpoint: "1.1.3.1:11", NodeName: "testNode3"}, + {Endpoint: "1.1.3.2:11", NodeName: "testNode3"}, + {Endpoint: "1.1.4.1:11", NodeName: "testNode4"}, + {Endpoint: "1.1.4.2:11", NodeName: "testNode4"}, + }, + currentNodeName: "testNode5", + topologyKeys: []string{"kubernetes.io/hostname", "topology.kubernetes.io/zone"}, + expected: []endpoint{}, + }, + { + // Case[8]: 2 topology keys (hostname, "*"), 2 nodes each with 2 + // endpoints, 1 match hostname = 2 endpoints + Name: "multiple topology keys matched node when 'Any' key ignored", + nodeLabels: map[types.NodeName]map[string]string{ + "testNode1": { + "kubernetes.io/hostname": "testNode1", + "topology.kubernetes.io/zone": "90001", + "topology.kubernetes.io/region": "cd", + }, + "testNode2": { + "kubernetes.io/hostname": "testNode2", + "topology.kubernetes.io/zone": "90001", + "topology.kubernetes.io/region": "cd", + }, + }, + endpoints: []endpoint{ + {Endpoint: "1.1.1.1:11", NodeName: "testNode1"}, + {Endpoint: "1.1.1.2:11", NodeName: "testNode1"}, + {Endpoint: "1.1.2.1:11", NodeName: "testNode2"}, + {Endpoint: "1.1.2.2:11", NodeName: "testNode2"}, + }, + currentNodeName: "testNode1", + topologyKeys: []string{"kubernetes.io/hostname", v1.TopologyKeyAny}, + expected: []endpoint{ + {Endpoint: "1.1.1.1:11", NodeName: "testNode1"}, + {Endpoint: "1.1.1.2:11", NodeName: "testNode1"}, + }, + }, + { + // Case[9]: 2 topology keys (hostname, "*"), 2 nodes each with 2 + // endpoints, no hostname match, catch-all ("*") matched with 4 + // endpoints + Name: "two topology keys matched node with 'Any' key", + nodeLabels: map[types.NodeName]map[string]string{ + "testNode1": { + "kubernetes.io/hostname": "testNode1", + "topology.kubernetes.io/zone": "90001", + "topology.kubernetes.io/region": "cd", + }, + "testNode2": { + "kubernetes.io/hostname": "testNode2", + "topology.kubernetes.io/zone": "90001", + "topology.kubernetes.io/region": "cd", + }, + "testNode3": { + "kubernetes.io/hostname": "testNode3", + "topology.kubernetes.io/zone": "90001", + "topology.kubernetes.io/region": "cd", + }, + }, + endpoints: []endpoint{ + {Endpoint: "1.1.1.1:11", NodeName: "testNode1"}, + {Endpoint: "1.1.1.2:11", NodeName: "testNode1"}, + {Endpoint: "1.1.2.1:11", NodeName: "testNode2"}, + {Endpoint: "1.1.2.2:11", NodeName: "testNode2"}, + }, + currentNodeName: "testNode3", + topologyKeys: []string{"kubernetes.io/hostname", v1.TopologyKeyAny}, + expected: []endpoint{ + {Endpoint: "1.1.1.1:11", NodeName: "testNode1"}, + {Endpoint: "1.1.1.2:11", NodeName: "testNode1"}, + {Endpoint: "1.1.2.1:11", NodeName: "testNode2"}, + {Endpoint: "1.1.2.2:11", NodeName: "testNode2"}, + }, + }, + { + // Case[10]: 3 topology keys (hostname, zone, "*"), 2 nodes in zone a, + // 2 nodes in zone b, each with 2 endpoints, no hostname match, no + // zone, catch-all ("*") matched with 8 endpoints + Name: "multiple topology keys matched node with 'Any' key", + nodeLabels: map[types.NodeName]map[string]string{ + "testNode1": { + "kubernetes.io/hostname": "testNode1", + "topology.kubernetes.io/zone": "90001", + "topology.kubernetes.io/region": "cd", + }, + "testNode2": { + "kubernetes.io/hostname": "testNode2", + "topology.kubernetes.io/zone": "90001", + "topology.kubernetes.io/region": "cd", + }, + "testNode3": { + "kubernetes.io/hostname": "testNode3", + "topology.kubernetes.io/zone": "90002", + "topology.kubernetes.io/region": "cd", + }, + "testNode4": { + "kubernetes.io/hostname": "testNode4", + "topology.kubernetes.io/zone": "90002", + "topology.kubernetes.io/region": "cd", + }, + "testNode5": { + "kubernetes.io/hostname": "testNode5", + "topology.kubernetes.io/zone": "90003", + "topology.kubernetes.io/region": "cd", + }, + }, + endpoints: []endpoint{ + {Endpoint: "1.1.1.1:11", NodeName: "testNode1"}, + {Endpoint: "1.1.1.2:11", NodeName: "testNode1"}, + {Endpoint: "1.1.2.1:11", NodeName: "testNode2"}, + {Endpoint: "1.1.2.2:11", NodeName: "testNode2"}, + {Endpoint: "1.1.3.1:11", NodeName: "testNode3"}, + {Endpoint: "1.1.3.2:11", NodeName: "testNode3"}, + {Endpoint: "1.1.4.1:11", NodeName: "testNode4"}, + {Endpoint: "1.1.4.2:11", NodeName: "testNode4"}, + }, + currentNodeName: "testNode5", + topologyKeys: []string{"kubernetes.io/hostname", "topology.kubernetes.io/zone", v1.TopologyKeyAny}, + expected: []endpoint{ + {Endpoint: "1.1.1.1:11", NodeName: "testNode1"}, + {Endpoint: "1.1.1.2:11", NodeName: "testNode1"}, + {Endpoint: "1.1.2.1:11", NodeName: "testNode2"}, + {Endpoint: "1.1.2.2:11", NodeName: "testNode2"}, + {Endpoint: "1.1.3.1:11", NodeName: "testNode3"}, + {Endpoint: "1.1.3.2:11", NodeName: "testNode3"}, + {Endpoint: "1.1.4.1:11", NodeName: "testNode4"}, + {Endpoint: "1.1.4.2:11", NodeName: "testNode4"}, + }, + }, + } + endpointsToStringArray := func(endpoints []endpoint) []string { + result := make([]string, 0, len(endpoints)) + for _, ep := range endpoints { + result = append(result, ep.Endpoint) + } + return result + } + for _, tc := range testCases { + t.Run(tc.Name, func(t *testing.T) { + m := make(map[Endpoint]endpoint) + endpoints := []Endpoint{} + for _, ep := range tc.endpoints { + var e Endpoint = &BaseEndpointInfo{Endpoint: ep.Endpoint, Topology: tc.nodeLabels[ep.NodeName]} + m[e] = ep + endpoints = append(endpoints, e) + } + currentNodeLabels := tc.nodeLabels[tc.currentNodeName] + filteredEndpoint := []endpoint{} + for _, ep := range FilterTopologyEndpoint(currentNodeLabels, tc.topologyKeys, endpoints) { + filteredEndpoint = append(filteredEndpoint, m[ep]) + } + if !reflect.DeepEqual(filteredEndpoint, tc.expected) { + t.Errorf("expected %v, got %v", endpointsToStringArray(tc.expected), endpointsToStringArray(filteredEndpoint)) + } + }) + } +} diff --git a/pkg/proxy/types.go b/pkg/proxy/types.go index 7055446e075..fae2c549ce3 100644 --- a/pkg/proxy/types.go +++ b/pkg/proxy/types.go @@ -30,6 +30,7 @@ type Provider interface { config.EndpointsHandler config.EndpointSliceHandler config.ServiceHandler + config.NodeHandler // Sync immediately synchronizes the Provider's current state to proxy rules. Sync() @@ -77,6 +78,8 @@ type ServicePort interface { NodePort() int // GetOnlyNodeLocalEndpoints returns if a service has only node local endpoints OnlyNodeLocalEndpoints() bool + // TopologyKeys returns service TopologyKeys as a string array. + TopologyKeys() []string } // Endpoint in an interface which abstracts information about an endpoint. @@ -87,6 +90,8 @@ type Endpoint interface { String() string // GetIsLocal returns true if the endpoint is running in same host as kube-proxy, otherwise returns false. GetIsLocal() bool + // GetTopology returns the topology information of the endpoint. + GetTopology() map[string]string // IP returns IP part of the endpoint. IP() string // Port returns the Port part of the endpoint. diff --git a/pkg/proxy/userspace/proxier.go b/pkg/proxy/userspace/proxier.go index 9afa4c0adc7..7a34529d6ff 100644 --- a/pkg/proxy/userspace/proxier.go +++ b/pkg/proxy/userspace/proxier.go @@ -112,6 +112,8 @@ type asyncRunnerInterface interface { type Proxier struct { // EndpointSlice support has not been added for this proxier yet. config.NoopEndpointSliceHandler + // TODO(imroc): implement node handler for userspace proxier. + config.NoopNodeHandler loadBalancer LoadBalancer mu sync.Mutex // protects serviceMap diff --git a/pkg/proxy/winkernel/proxier.go b/pkg/proxy/winkernel/proxier.go index eb481a81e6b..b5a745acb89 100644 --- a/pkg/proxy/winkernel/proxier.go +++ b/pkg/proxy/winkernel/proxier.go @@ -444,6 +444,8 @@ func (em proxyEndpointsMap) unmerge(other proxyEndpointsMap, curServices proxySe type Proxier struct { // EndpointSlice support has not been added for this proxier yet. proxyconfig.NoopEndpointSliceHandler + // TODO(imroc): implement node handler for winkernel proxier. + proxyconfig.NoopNodeHandler // endpointsChanges and serviceChanges contains all changes to endpoints and // services that happened since policies were synced. For a single object, diff --git a/pkg/proxy/winuserspace/proxier.go b/pkg/proxy/winuserspace/proxier.go index 3e2dbd4036f..544a39986b9 100644 --- a/pkg/proxy/winuserspace/proxier.go +++ b/pkg/proxy/winuserspace/proxier.go @@ -83,6 +83,8 @@ func logTimeout(err error) bool { type Proxier struct { // EndpointSlice support has not been added for this proxier yet. config.NoopEndpointSliceHandler + // TODO(imroc): implement node handler for winuserspace proxier. + config.NoopNodeHandler loadBalancer LoadBalancer mu sync.Mutex // protects serviceMap diff --git a/pkg/registry/core/service/strategy.go b/pkg/registry/core/service/strategy.go index 7327a4da21b..cca5e12ddc4 100644 --- a/pkg/registry/core/service/strategy.go +++ b/pkg/registry/core/service/strategy.go @@ -23,11 +23,10 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/apiserver/pkg/storage/names" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/api/legacyscheme" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/core/validation" - - utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/features" ) @@ -121,6 +120,10 @@ func dropServiceDisabledFields(newSvc *api.Service, oldSvc *api.Service) { if !utilfeature.DefaultFeatureGate.Enabled(features.IPv6DualStack) && !serviceIPFamilyInUse(oldSvc) { newSvc.Spec.IPFamily = nil } + // Drop TopologyKeys if ServiceTopology is not enabled + if !utilfeature.DefaultFeatureGate.Enabled(features.ServiceTopology) && !topologyKeysInUse(oldSvc) { + newSvc.Spec.TopologyKeys = nil + } } // returns true if svc.Spec.ServiceIPFamily field is in use @@ -134,6 +137,14 @@ func serviceIPFamilyInUse(svc *api.Service) bool { return false } +// returns true if svc.Spec.TopologyKeys field is in use +func topologyKeysInUse(svc *api.Service) bool { + if svc == nil { + return false + } + return len(svc.Spec.TopologyKeys) > 0 +} + type serviceStatusStrategy struct { svcStrategy } diff --git a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/policy.go b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/policy.go index 10ba64be035..7e17f31dd5e 100644 --- a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/policy.go +++ b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/policy.go @@ -461,7 +461,7 @@ func ClusterRoles() []rbacv1.ClusterRole { // node-proxier role is used by kube-proxy. nodeProxierRules := []rbacv1.PolicyRule{ rbacv1helpers.NewRule("list", "watch").Groups(legacyGroup).Resources("services", "endpoints").RuleOrDie(), - rbacv1helpers.NewRule("get").Groups(legacyGroup).Resources("nodes").RuleOrDie(), + rbacv1helpers.NewRule("get", "list", "watch").Groups(legacyGroup).Resources("nodes").RuleOrDie(), eventsRule(), } diff --git a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/cluster-roles.yaml b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/cluster-roles.yaml index f2902321090..ad6468a53d2 100644 --- a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/cluster-roles.yaml +++ b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/cluster-roles.yaml @@ -1040,6 +1040,8 @@ items: - nodes verbs: - get + - list + - watch - apiGroups: - "" - events.k8s.io diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go index ee12e3aa231..86543eacc51 100644 --- a/staging/src/k8s.io/api/core/v1/types.go +++ b/staging/src/k8s.io/api/core/v1/types.go @@ -30,6 +30,8 @@ const ( NamespaceAll string = "" // NamespaceNodeLease is the namespace where we place node lease objects (used for node heartbeats) NamespaceNodeLease string = "kube-node-lease" + // TopologyKeyAny is the service topology key that matches any node + TopologyKeyAny string = "*" ) // Volume represents a named volume in a pod that may be accessed by any container in the pod. @@ -3826,6 +3828,8 @@ const ( IPv4Protocol IPFamily = "IPv4" // IPv6Protocol indicates that this IP is IPv6 protocol IPv6Protocol IPFamily = "IPv6" + // MaxServiceTopologyKeys is the largest number of topology keys allowed on a service + MaxServiceTopologyKeys = 16 ) // ServiceSpec describes the attributes that a user creates on a service. @@ -3957,18 +3961,18 @@ type ServiceSpec struct { // topologyKeys is a preference-order list of topology keys which // implementations of services should use to preferentially sort endpoints - // when accessing this Service. Topology keys must be valid label keys and - // at most 16 keys may be specified. - // If any ready backends exist for index [0], they should always be chosen; - // only if no backends exist for index [0] should backends for index [1] be considered. + // when accessing this Service, it can not be used at the same time as + // externalTrafficPolicy=Local. + // Topology keys must be valid label keys and at most 16 keys may be specified. + // Endpoints are chosen based on the first topology key with available backends. // If this field is specified and all entries have no backends that match // the topology of the client, the service has no backends for that client // and connections should fail. - // The special value "" may be used to mean "any node". This catch-all + // The special value "*" may be used to mean "any topology". This catch-all // value, if used, only makes sense as the last value in the list. // If this is not specified or empty, no topology constraints will be applied. // +optional - TopologyKeys []string `json:"topologyKeys,omitempty" protobuf:"bytes,15,opt,name=topologyKeys"` + TopologyKeys []string `json:"topologyKeys,omitempty" protobuf:"bytes,16,opt,name=topologyKeys"` } // ServicePort contains information on service's port. From 80c6524cd0af5068fe6be30815610c4ba4500e83 Mon Sep 17 00:00:00 2001 From: Roc Chan Date: Fri, 15 Nov 2019 09:53:27 +0800 Subject: [PATCH 3/4] kube-proxy: sync rules when current node labels change detected --- pkg/proxy/iptables/proxier.go | 16 ++++++++++++++-- pkg/proxy/ipvs/proxier.go | 16 ++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/pkg/proxy/iptables/proxier.go b/pkg/proxy/iptables/proxier.go index 3f6c5f4b9d5..69d5d4adfea 100644 --- a/pkg/proxy/iptables/proxier.go +++ b/pkg/proxy/iptables/proxier.go @@ -26,6 +26,7 @@ import ( "encoding/base32" "fmt" "net" + "reflect" "strconv" "strings" "sync" @@ -599,9 +600,14 @@ func (proxier *Proxier) OnNodeAdd(node *v1.Node) { klog.Errorf("Received a watch event for a node %s that doesn't match the current node %v", node.Name, proxier.hostname) return } + oldLabels := proxier.nodeLabels + newLabels := node.Labels proxier.mu.Lock() - proxier.nodeLabels = node.Labels + proxier.nodeLabels = newLabels proxier.mu.Unlock() + if !reflect.DeepEqual(oldLabels, newLabels) { + proxier.syncProxyRules() + } } // OnNodeUpdate is called whenever modification of an existing @@ -611,9 +617,14 @@ func (proxier *Proxier) OnNodeUpdate(oldNode, node *v1.Node) { klog.Errorf("Received a watch event for a node %s that doesn't match the current node %v", node.Name, proxier.hostname) return } + oldLabels := proxier.nodeLabels + newLabels := node.Labels proxier.mu.Lock() - proxier.nodeLabels = node.Labels + proxier.nodeLabels = newLabels proxier.mu.Unlock() + if !reflect.DeepEqual(oldLabels, newLabels) { + proxier.syncProxyRules() + } } // OnNodeDelete is called whever deletion of an existing node @@ -626,6 +637,7 @@ func (proxier *Proxier) OnNodeDelete(node *v1.Node) { proxier.mu.Lock() proxier.nodeLabels = nil proxier.mu.Unlock() + proxier.syncProxyRules() } // OnNodeSynced is called once all the initial event handlers were diff --git a/pkg/proxy/ipvs/proxier.go b/pkg/proxy/ipvs/proxier.go index 8f71619b4b2..2533817dda9 100644 --- a/pkg/proxy/ipvs/proxier.go +++ b/pkg/proxy/ipvs/proxier.go @@ -23,6 +23,7 @@ import ( "io/ioutil" "net" "os" + "reflect" "regexp" "strconv" "strings" @@ -905,9 +906,14 @@ func (proxier *Proxier) OnNodeAdd(node *v1.Node) { klog.Errorf("Received a watch event for a node %s that doesn't match the current node %v", node.Name, proxier.hostname) return } + oldLabels := proxier.nodeLabels + newLabels := node.Labels proxier.mu.Lock() - proxier.nodeLabels = node.Labels + proxier.nodeLabels = newLabels proxier.mu.Unlock() + if !reflect.DeepEqual(oldLabels, newLabels) { + proxier.syncProxyRules() + } } // OnNodeUpdate is called whenever modification of an existing @@ -917,9 +923,14 @@ func (proxier *Proxier) OnNodeUpdate(oldNode, node *v1.Node) { klog.Errorf("Received a watch event for a node %s that doesn't match the current node %v", node.Name, proxier.hostname) return } + oldLabels := proxier.nodeLabels + newLabels := node.Labels proxier.mu.Lock() - proxier.nodeLabels = node.Labels + proxier.nodeLabels = newLabels proxier.mu.Unlock() + if !reflect.DeepEqual(oldLabels, newLabels) { + proxier.syncProxyRules() + } } // OnNodeDelete is called whever deletion of an existing node @@ -932,6 +943,7 @@ func (proxier *Proxier) OnNodeDelete(node *v1.Node) { proxier.mu.Lock() proxier.nodeLabels = nil proxier.mu.Unlock() + proxier.syncProxyRules() } // OnNodeSynced is called once all the initial event handlers were From 31d623b4d74ceadfad101d36a4710d4406fcf144 Mon Sep 17 00:00:00 2001 From: Roc Chan Date: Wed, 6 Nov 2019 19:24:11 +0800 Subject: [PATCH 4/4] Autogenerated files --- api/openapi-spec/swagger.json | 7 + cmd/kube-proxy/app/BUILD | 1 + pkg/apis/core/v1/zz_generated.conversion.go | 2 + pkg/apis/core/zz_generated.deepcopy.go | 5 + pkg/proxy/BUILD | 2 + pkg/proxy/ipvs/BUILD | 1 + .../src/k8s.io/api/core/v1/generated.pb.go | 1755 +++++++++-------- .../src/k8s.io/api/core/v1/generated.proto | 15 + .../core/v1/types_swagger_doc_generated.go | 1 + .../api/core/v1/zz_generated.deepcopy.go | 5 + .../api/testdata/HEAD/core.v1.Service.json | 9 +- .../api/testdata/HEAD/core.v1.Service.pb | Bin 401 -> 406 bytes .../api/testdata/HEAD/core.v1.Service.yaml | 6 +- 13 files changed, 952 insertions(+), 857 deletions(-) diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index da3204c7cf9..bf45ae67b22 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -11499,6 +11499,13 @@ "$ref": "#/definitions/io.k8s.api.core.v1.SessionAffinityConfig", "description": "sessionAffinityConfig contains the configurations of session affinity." }, + "topologyKeys": { + "description": "topologyKeys is a preference-order list of topology keys which implementations of services should use to preferentially sort endpoints when accessing this Service, it can not be used at the same time as externalTrafficPolicy=Local. Topology keys must be valid label keys and at most 16 keys may be specified. Endpoints are chosen based on the first topology key with available backends. If this field is specified and all entries have no backends that match the topology of the client, the service has no backends for that client and connections should fail. The special value \"*\" may be used to mean \"any topology\". This catch-all value, if used, only makes sense as the last value in the list. If this is not specified or empty, no topology constraints will be applied.", + "items": { + "type": "string" + }, + "type": "array" + }, "type": { "description": "type determines how the Service is exposed. Defaults to ClusterIP. Valid options are ExternalName, ClusterIP, NodePort, and LoadBalancer. \"ExternalName\" maps to the specified externalName. \"ClusterIP\" allocates a cluster-internal IP address for load-balancing to endpoints. Endpoints are determined by the selector or if that is not specified, by manual construction of an Endpoints object. If clusterIP is \"None\", no virtual IP is allocated and the endpoints are published as a set of endpoints rather than a stable IP. \"NodePort\" builds on ClusterIP and allocates a port on every node which routes to the clusterIP. \"LoadBalancer\" builds on NodePort and creates an external load-balancer (if supported in the current cloud) which routes to the clusterIP. More info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types", "type": "string" diff --git a/cmd/kube-proxy/app/BUILD b/cmd/kube-proxy/app/BUILD index c0f798791bd..57cb1a319bb 100644 --- a/cmd/kube-proxy/app/BUILD +++ b/cmd/kube-proxy/app/BUILD @@ -45,6 +45,7 @@ go_library( "//pkg/util/sysctl:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", diff --git a/pkg/apis/core/v1/zz_generated.conversion.go b/pkg/apis/core/v1/zz_generated.conversion.go index ad9dd5794b4..17dabb3983a 100644 --- a/pkg/apis/core/v1/zz_generated.conversion.go +++ b/pkg/apis/core/v1/zz_generated.conversion.go @@ -7489,6 +7489,7 @@ func autoConvert_v1_ServiceSpec_To_core_ServiceSpec(in *v1.ServiceSpec, out *cor out.PublishNotReadyAddresses = in.PublishNotReadyAddresses out.SessionAffinityConfig = (*core.SessionAffinityConfig)(unsafe.Pointer(in.SessionAffinityConfig)) out.IPFamily = (*core.IPFamily)(unsafe.Pointer(in.IPFamily)) + out.TopologyKeys = *(*[]string)(unsafe.Pointer(&in.TopologyKeys)) return nil } @@ -7512,6 +7513,7 @@ func autoConvert_core_ServiceSpec_To_v1_ServiceSpec(in *core.ServiceSpec, out *v out.HealthCheckNodePort = in.HealthCheckNodePort out.PublishNotReadyAddresses = in.PublishNotReadyAddresses out.IPFamily = (*v1.IPFamily)(unsafe.Pointer(in.IPFamily)) + out.TopologyKeys = *(*[]string)(unsafe.Pointer(&in.TopologyKeys)) return nil } diff --git a/pkg/apis/core/zz_generated.deepcopy.go b/pkg/apis/core/zz_generated.deepcopy.go index f5954a13a84..534b8dc06fc 100644 --- a/pkg/apis/core/zz_generated.deepcopy.go +++ b/pkg/apis/core/zz_generated.deepcopy.go @@ -5171,6 +5171,11 @@ func (in *ServiceSpec) DeepCopyInto(out *ServiceSpec) { *out = new(IPFamily) **out = **in } + if in.TopologyKeys != nil { + in, out := &in.TopologyKeys, &out.TopologyKeys + *out = make([]string, len(*in)) + copy(*out, *in) + } return } diff --git a/pkg/proxy/BUILD b/pkg/proxy/BUILD index 0e2c5d1e541..0057cdf8fc1 100644 --- a/pkg/proxy/BUILD +++ b/pkg/proxy/BUILD @@ -13,6 +13,7 @@ go_library( "endpoints.go", "endpointslicecache.go", "service.go", + "topology.go", "types.go", ], importpath = "k8s.io/kubernetes/pkg/proxy", @@ -62,6 +63,7 @@ go_test( "endpoints_test.go", "endpointslicecache_test.go", "service_test.go", + "topology_test.go", ], embed = [":go_default_library"], deps = [ diff --git a/pkg/proxy/ipvs/BUILD b/pkg/proxy/ipvs/BUILD index 838c8c2bcf3..9a45bf55c4c 100644 --- a/pkg/proxy/ipvs/BUILD +++ b/pkg/proxy/ipvs/BUILD @@ -56,6 +56,7 @@ go_library( deps = [ "//pkg/features:go_default_library", "//pkg/proxy:go_default_library", + "//pkg/proxy/config:go_default_library", "//pkg/proxy/healthcheck:go_default_library", "//pkg/proxy/metrics:go_default_library", "//pkg/proxy/util:go_default_library", 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 b7291d28606..732385ce92a 100644 --- a/staging/src/k8s.io/api/core/v1/generated.pb.go +++ b/staging/src/k8s.io/api/core/v1/generated.pb.go @@ -6000,858 +6000,859 @@ func init() { } var fileDescriptor_83c10c24ec417dc9 = []byte{ - // 13601 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7b, 0x70, 0x24, 0x49, - 0x5a, 0x18, 0x7e, 0xd5, 0xad, 0x47, 0xf7, 0xa7, 0x77, 0xce, 0x63, 0x35, 0xda, 0x99, 0xd1, 0x6c, - 0xed, 0xdd, 0xec, 0xec, 0xed, 0xae, 0xe6, 0xf6, 0x75, 0xbb, 0xec, 0xee, 0x2d, 0x48, 0x6a, 0x69, - 0xa6, 0x77, 0x46, 0x9a, 0xde, 0x6c, 0xcd, 0xcc, 0xdd, 0xb2, 0x77, 0xbf, 0x2b, 0x75, 0xa5, 0xa4, - 0x5a, 0xb5, 0xaa, 0x7a, 0xab, 0xaa, 0xa5, 0xd1, 0xfe, 0x20, 0x8c, 0x8f, 0xe7, 0x19, 0x70, 0x5c, - 0xd8, 0x84, 0x1f, 0x40, 0x60, 0x07, 0xc6, 0x01, 0x18, 0xec, 0x30, 0x06, 0x03, 0xe6, 0xb0, 0x8d, - 0xc1, 0x76, 0x60, 0xff, 0x81, 0xb1, 0xc3, 0xf6, 0x11, 0x41, 0x58, 0x86, 0xc1, 0x61, 0xe2, 0xfe, - 0x30, 0x10, 0x06, 0xff, 0x61, 0x99, 0x30, 0x8e, 0x7c, 0x56, 0x66, 0x75, 0x55, 0x77, 0x6b, 0x56, - 0xa3, 0x5b, 0x2e, 0xf6, 0xbf, 0xee, 0xfc, 0xbe, 0xfc, 0x32, 0x2b, 0x9f, 0x5f, 0x7e, 0x4f, 0x78, - 0x75, 0xfb, 0xe5, 0x68, 0xce, 0x0b, 0xae, 0x6e, 0xb7, 0xd7, 0x49, 0xe8, 0x93, 0x98, 0x44, 0x57, - 0x77, 0x89, 0xef, 0x06, 0xe1, 0x55, 0x01, 0x70, 0x5a, 0xde, 0xd5, 0x46, 0x10, 0x92, 0xab, 0xbb, - 0xcf, 0x5e, 0xdd, 0x24, 0x3e, 0x09, 0x9d, 0x98, 0xb8, 0x73, 0xad, 0x30, 0x88, 0x03, 0x84, 0x38, - 0xce, 0x9c, 0xd3, 0xf2, 0xe6, 0x28, 0xce, 0xdc, 0xee, 0xb3, 0x33, 0xcf, 0x6c, 0x7a, 0xf1, 0x56, - 0x7b, 0x7d, 0xae, 0x11, 0xec, 0x5c, 0xdd, 0x0c, 0x36, 0x83, 0xab, 0x0c, 0x75, 0xbd, 0xbd, 0xc1, - 0xfe, 0xb1, 0x3f, 0xec, 0x17, 0x27, 0x31, 0xf3, 0x42, 0xd2, 0xcc, 0x8e, 0xd3, 0xd8, 0xf2, 0x7c, - 0x12, 0xee, 0x5f, 0x6d, 0x6d, 0x6f, 0xb2, 0x76, 0x43, 0x12, 0x05, 0xed, 0xb0, 0x41, 0xd2, 0x0d, - 0x77, 0xad, 0x15, 0x5d, 0xdd, 0x21, 0xb1, 0x93, 0xd1, 0xdd, 0x99, 0xab, 0x79, 0xb5, 0xc2, 0xb6, - 0x1f, 0x7b, 0x3b, 0x9d, 0xcd, 0x7c, 0xb2, 0x57, 0x85, 0xa8, 0xb1, 0x45, 0x76, 0x9c, 0x8e, 0x7a, - 0xcf, 0xe7, 0xd5, 0x6b, 0xc7, 0x5e, 0xf3, 0xaa, 0xe7, 0xc7, 0x51, 0x1c, 0xa6, 0x2b, 0xd9, 0x5f, - 0xb1, 0xe0, 0xd2, 0xfc, 0xdd, 0xfa, 0x52, 0xd3, 0x89, 0x62, 0xaf, 0xb1, 0xd0, 0x0c, 0x1a, 0xdb, - 0xf5, 0x38, 0x08, 0xc9, 0x9d, 0xa0, 0xd9, 0xde, 0x21, 0x75, 0x36, 0x10, 0xe8, 0x69, 0x28, 0xed, - 0xb2, 0xff, 0xd5, 0xca, 0xb4, 0x75, 0xc9, 0xba, 0x52, 0x5e, 0x98, 0xfc, 0xf5, 0x83, 0xd9, 0x8f, - 0xdc, 0x3f, 0x98, 0x2d, 0xdd, 0x11, 0xe5, 0x58, 0x61, 0xa0, 0xcb, 0x30, 0xb4, 0x11, 0xad, 0xed, - 0xb7, 0xc8, 0x74, 0x81, 0xe1, 0x8e, 0x0b, 0xdc, 0xa1, 0xe5, 0x3a, 0x2d, 0xc5, 0x02, 0x8a, 0xae, - 0x42, 0xb9, 0xe5, 0x84, 0xb1, 0x17, 0x7b, 0x81, 0x3f, 0x5d, 0xbc, 0x64, 0x5d, 0x19, 0x5c, 0x98, - 0x12, 0xa8, 0xe5, 0x9a, 0x04, 0xe0, 0x04, 0x87, 0x76, 0x23, 0x24, 0x8e, 0x7b, 0xcb, 0x6f, 0xee, - 0x4f, 0x0f, 0x5c, 0xb2, 0xae, 0x94, 0x92, 0x6e, 0x60, 0x51, 0x8e, 0x15, 0x86, 0xfd, 0x83, 0x05, - 0x28, 0xcd, 0x6f, 0x6c, 0x78, 0xbe, 0x17, 0xef, 0xa3, 0x3b, 0x30, 0xea, 0x07, 0x2e, 0x91, 0xff, - 0xd9, 0x57, 0x8c, 0x3c, 0x77, 0x69, 0xae, 0x73, 0x29, 0xcd, 0xad, 0x6a, 0x78, 0x0b, 0x93, 0xf7, - 0x0f, 0x66, 0x47, 0xf5, 0x12, 0x6c, 0xd0, 0x41, 0x18, 0x46, 0x5a, 0x81, 0xab, 0xc8, 0x16, 0x18, - 0xd9, 0xd9, 0x2c, 0xb2, 0xb5, 0x04, 0x6d, 0x61, 0xe2, 0xfe, 0xc1, 0xec, 0x88, 0x56, 0x80, 0x75, - 0x22, 0x68, 0x1d, 0x26, 0xe8, 0x5f, 0x3f, 0xf6, 0x14, 0xdd, 0x22, 0xa3, 0xfb, 0x78, 0x1e, 0x5d, - 0x0d, 0x75, 0xe1, 0xd4, 0xfd, 0x83, 0xd9, 0x89, 0x54, 0x21, 0x4e, 0x13, 0xb4, 0xdf, 0x83, 0xf1, - 0xf9, 0x38, 0x76, 0x1a, 0x5b, 0xc4, 0xe5, 0x33, 0x88, 0x5e, 0x80, 0x01, 0xdf, 0xd9, 0x21, 0x62, - 0x7e, 0x2f, 0x89, 0x81, 0x1d, 0x58, 0x75, 0x76, 0xc8, 0xe1, 0xc1, 0xec, 0xe4, 0x6d, 0xdf, 0x7b, - 0xb7, 0x2d, 0x56, 0x05, 0x2d, 0xc3, 0x0c, 0x1b, 0x3d, 0x07, 0xe0, 0x92, 0x5d, 0xaf, 0x41, 0x6a, - 0x4e, 0xbc, 0x25, 0xe6, 0x1b, 0x89, 0xba, 0x50, 0x51, 0x10, 0xac, 0x61, 0xd9, 0xf7, 0xa0, 0x3c, - 0xbf, 0x1b, 0x78, 0x6e, 0x2d, 0x70, 0x23, 0xb4, 0x0d, 0x13, 0xad, 0x90, 0x6c, 0x90, 0x50, 0x15, - 0x4d, 0x5b, 0x97, 0x8a, 0x57, 0x46, 0x9e, 0xbb, 0x92, 0xf9, 0xb1, 0x26, 0xea, 0x92, 0x1f, 0x87, - 0xfb, 0x0b, 0x8f, 0x88, 0xf6, 0x26, 0x52, 0x50, 0x9c, 0xa6, 0x6c, 0xff, 0xcb, 0x02, 0x9c, 0x99, - 0x7f, 0xaf, 0x1d, 0x92, 0x8a, 0x17, 0x6d, 0xa7, 0x57, 0xb8, 0xeb, 0x45, 0xdb, 0xab, 0xc9, 0x08, - 0xa8, 0xa5, 0x55, 0x11, 0xe5, 0x58, 0x61, 0xa0, 0x67, 0x60, 0x98, 0xfe, 0xbe, 0x8d, 0xab, 0xe2, - 0x93, 0x4f, 0x09, 0xe4, 0x91, 0x8a, 0x13, 0x3b, 0x15, 0x0e, 0xc2, 0x12, 0x07, 0xad, 0xc0, 0x48, - 0x83, 0x6d, 0xc8, 0xcd, 0x95, 0xc0, 0x25, 0x6c, 0x32, 0xcb, 0x0b, 0x4f, 0x51, 0xf4, 0xc5, 0xa4, - 0xf8, 0xf0, 0x60, 0x76, 0x9a, 0xf7, 0x4d, 0x90, 0xd0, 0x60, 0x58, 0xaf, 0x8f, 0x6c, 0xb5, 0xbf, - 0x06, 0x18, 0x25, 0xc8, 0xd8, 0x5b, 0x57, 0xb4, 0xad, 0x32, 0xc8, 0xb6, 0xca, 0x68, 0xf6, 0x36, - 0x41, 0xcf, 0xc2, 0xc0, 0xb6, 0xe7, 0xbb, 0xd3, 0x43, 0x8c, 0xd6, 0x05, 0x3a, 0xe7, 0x37, 0x3c, - 0xdf, 0x3d, 0x3c, 0x98, 0x9d, 0x32, 0xba, 0x43, 0x0b, 0x31, 0x43, 0xb5, 0xff, 0xd8, 0x82, 0x59, - 0x06, 0x5b, 0xf6, 0x9a, 0xa4, 0x46, 0xc2, 0xc8, 0x8b, 0x62, 0xe2, 0xc7, 0xc6, 0x80, 0x3e, 0x07, - 0x10, 0x91, 0x46, 0x48, 0x62, 0x6d, 0x48, 0xd5, 0xc2, 0xa8, 0x2b, 0x08, 0xd6, 0xb0, 0xe8, 0x81, - 0x10, 0x6d, 0x39, 0x21, 0x5b, 0x5f, 0x62, 0x60, 0xd5, 0x81, 0x50, 0x97, 0x00, 0x9c, 0xe0, 0x18, - 0x07, 0x42, 0xb1, 0xd7, 0x81, 0x80, 0x3e, 0x05, 0x13, 0x49, 0x63, 0x51, 0xcb, 0x69, 0xc8, 0x01, - 0x64, 0x5b, 0xa6, 0x6e, 0x82, 0x70, 0x1a, 0xd7, 0xfe, 0x7b, 0x96, 0x58, 0x3c, 0xf4, 0xab, 0x3f, - 0xe0, 0xdf, 0x6a, 0xff, 0xa2, 0x05, 0xc3, 0x0b, 0x9e, 0xef, 0x7a, 0xfe, 0x26, 0xfa, 0x3c, 0x94, - 0xe8, 0xdd, 0xe4, 0x3a, 0xb1, 0x23, 0xce, 0xbd, 0x4f, 0x68, 0x7b, 0x4b, 0x5d, 0x15, 0x73, 0xad, - 0xed, 0x4d, 0x5a, 0x10, 0xcd, 0x51, 0x6c, 0xba, 0xdb, 0x6e, 0xad, 0xbf, 0x43, 0x1a, 0xf1, 0x0a, - 0x89, 0x9d, 0xe4, 0x73, 0x92, 0x32, 0xac, 0xa8, 0xa2, 0x1b, 0x30, 0x14, 0x3b, 0xe1, 0x26, 0x89, - 0xc5, 0x01, 0x98, 0x79, 0x50, 0xf1, 0x9a, 0x98, 0xee, 0x48, 0xe2, 0x37, 0x48, 0x72, 0x2d, 0xac, - 0xb1, 0xaa, 0x58, 0x90, 0xb0, 0xbf, 0x7f, 0x18, 0xce, 0x2d, 0xd6, 0xab, 0x39, 0xeb, 0xea, 0x32, - 0x0c, 0xb9, 0xa1, 0xb7, 0x4b, 0x42, 0x31, 0xce, 0x8a, 0x4a, 0x85, 0x95, 0x62, 0x01, 0x45, 0x2f, - 0xc3, 0x28, 0xbf, 0x90, 0xae, 0x3b, 0xbe, 0xdb, 0x94, 0x43, 0x7c, 0x5a, 0x60, 0x8f, 0xde, 0xd1, - 0x60, 0xd8, 0xc0, 0x3c, 0xe2, 0xa2, 0xba, 0x9c, 0xda, 0x8c, 0x79, 0x97, 0xdd, 0x17, 0x2d, 0x98, - 0xe4, 0xcd, 0xcc, 0xc7, 0x71, 0xe8, 0xad, 0xb7, 0x63, 0x12, 0x4d, 0x0f, 0xb2, 0x93, 0x6e, 0x31, - 0x6b, 0xb4, 0x72, 0x47, 0x60, 0xee, 0x4e, 0x8a, 0x0a, 0x3f, 0x04, 0xa7, 0x45, 0xbb, 0x93, 0x69, - 0x30, 0xee, 0x68, 0x16, 0x7d, 0xbb, 0x05, 0x33, 0x8d, 0xc0, 0x8f, 0xc3, 0xa0, 0xd9, 0x24, 0x61, - 0xad, 0xbd, 0xde, 0xf4, 0xa2, 0x2d, 0xbe, 0x4e, 0x31, 0xd9, 0x60, 0x27, 0x41, 0xce, 0x1c, 0x2a, - 0x24, 0x31, 0x87, 0x17, 0xef, 0x1f, 0xcc, 0xce, 0x2c, 0xe6, 0x92, 0xc2, 0x5d, 0x9a, 0x41, 0xdb, - 0x80, 0xe8, 0x55, 0x5a, 0x8f, 0x9d, 0x4d, 0x92, 0x34, 0x3e, 0xdc, 0x7f, 0xe3, 0x67, 0xef, 0x1f, - 0xcc, 0xa2, 0xd5, 0x0e, 0x12, 0x38, 0x83, 0x2c, 0x7a, 0x17, 0x4e, 0xd3, 0xd2, 0x8e, 0x6f, 0x2d, - 0xf5, 0xdf, 0xdc, 0xf4, 0xfd, 0x83, 0xd9, 0xd3, 0xab, 0x19, 0x44, 0x70, 0x26, 0x69, 0xf4, 0x6d, - 0x16, 0x9c, 0x4b, 0x3e, 0x7f, 0xe9, 0x5e, 0xcb, 0xf1, 0xdd, 0xa4, 0xe1, 0x72, 0xff, 0x0d, 0xd3, - 0x33, 0xf9, 0xdc, 0x62, 0x1e, 0x25, 0x9c, 0xdf, 0xc8, 0xcc, 0x22, 0x9c, 0xc9, 0x5c, 0x2d, 0x68, - 0x12, 0x8a, 0xdb, 0x84, 0x73, 0x41, 0x65, 0x4c, 0x7f, 0xa2, 0xd3, 0x30, 0xb8, 0xeb, 0x34, 0xdb, - 0x62, 0xa3, 0x60, 0xfe, 0xe7, 0x95, 0xc2, 0xcb, 0x96, 0xfd, 0xaf, 0x8a, 0x30, 0xb1, 0x58, 0xaf, - 0x3e, 0xd0, 0x2e, 0xd4, 0xaf, 0xa1, 0x42, 0xd7, 0x6b, 0x28, 0xb9, 0xd4, 0x8a, 0xb9, 0x97, 0xda, - 0x5f, 0xc8, 0xd8, 0x42, 0x03, 0x6c, 0x0b, 0x7d, 0x43, 0xce, 0x16, 0x3a, 0xe6, 0x8d, 0xb3, 0x9b, - 0xb3, 0x8a, 0x06, 0xd9, 0x64, 0x66, 0x72, 0x2c, 0x37, 0x83, 0x86, 0xd3, 0x4c, 0x1f, 0x7d, 0x47, - 0x5c, 0x4a, 0xc7, 0x33, 0x8f, 0x0d, 0x18, 0x5d, 0x74, 0x5a, 0xce, 0xba, 0xd7, 0xf4, 0x62, 0x8f, - 0x44, 0xe8, 0x09, 0x28, 0x3a, 0xae, 0xcb, 0xb8, 0xad, 0xf2, 0xc2, 0x99, 0xfb, 0x07, 0xb3, 0xc5, - 0x79, 0x97, 0x5e, 0xfb, 0xa0, 0xb0, 0xf6, 0x31, 0xc5, 0x40, 0x1f, 0x87, 0x01, 0x37, 0x0c, 0x5a, - 0xd3, 0x05, 0x86, 0x49, 0x77, 0xdd, 0x40, 0x25, 0x0c, 0x5a, 0x29, 0x54, 0x86, 0x63, 0xff, 0x4a, - 0x01, 0xce, 0x2f, 0x92, 0xd6, 0xd6, 0x72, 0x3d, 0xe7, 0xfc, 0xbe, 0x02, 0xa5, 0x9d, 0xc0, 0xf7, - 0xe2, 0x20, 0x8c, 0x44, 0xd3, 0x6c, 0x45, 0xac, 0x88, 0x32, 0xac, 0xa0, 0xe8, 0x12, 0x0c, 0xb4, - 0x12, 0xa6, 0x72, 0x54, 0x32, 0xa4, 0x8c, 0x9d, 0x64, 0x10, 0x8a, 0xd1, 0x8e, 0x48, 0x28, 0x56, - 0x8c, 0xc2, 0xb8, 0x1d, 0x91, 0x10, 0x33, 0x48, 0x72, 0x33, 0xd3, 0x3b, 0x5b, 0x9c, 0xd0, 0xa9, - 0x9b, 0x99, 0x42, 0xb0, 0x86, 0x85, 0x6a, 0x50, 0x8e, 0x52, 0x33, 0xdb, 0xd7, 0x36, 0x1d, 0x63, - 0x57, 0xb7, 0x9a, 0xc9, 0x84, 0x88, 0x71, 0xa3, 0x0c, 0xf5, 0xbc, 0xba, 0xbf, 0x5c, 0x00, 0xc4, - 0x87, 0xf0, 0xcf, 0xd9, 0xc0, 0xdd, 0xee, 0x1c, 0xb8, 0xfe, 0xb7, 0xc4, 0x71, 0x8d, 0xde, 0x9f, - 0x58, 0x70, 0x7e, 0xd1, 0xf3, 0x5d, 0x12, 0xe6, 0x2c, 0xc0, 0x87, 0xf3, 0x96, 0x3d, 0x1a, 0xd3, - 0x60, 0x2c, 0xb1, 0x81, 0x63, 0x58, 0x62, 0xf6, 0x1f, 0x5a, 0x80, 0xf8, 0x67, 0x7f, 0xe0, 0x3e, - 0xf6, 0x76, 0xe7, 0xc7, 0x1e, 0xc3, 0xb2, 0xb0, 0x6f, 0xc2, 0xf8, 0x62, 0xd3, 0x23, 0x7e, 0x5c, - 0xad, 0x2d, 0x06, 0xfe, 0x86, 0xb7, 0x89, 0x5e, 0x81, 0xf1, 0xd8, 0xdb, 0x21, 0x41, 0x3b, 0xae, - 0x93, 0x46, 0xe0, 0xb3, 0x97, 0xa4, 0x75, 0x65, 0x70, 0x01, 0xdd, 0x3f, 0x98, 0x1d, 0x5f, 0x33, - 0x20, 0x38, 0x85, 0x69, 0xff, 0x36, 0x1d, 0xbf, 0x60, 0xa7, 0x15, 0xf8, 0xc4, 0x8f, 0x17, 0x03, - 0xdf, 0xe5, 0x12, 0x87, 0x57, 0x60, 0x20, 0xa6, 0xe3, 0xc1, 0xc7, 0xee, 0xb2, 0xdc, 0x28, 0x74, - 0x14, 0x0e, 0x0f, 0x66, 0xcf, 0x76, 0xd6, 0x60, 0xe3, 0xc4, 0xea, 0xa0, 0x6f, 0x80, 0xa1, 0x28, - 0x76, 0xe2, 0x76, 0x24, 0x46, 0xf3, 0x31, 0x39, 0x9a, 0x75, 0x56, 0x7a, 0x78, 0x30, 0x3b, 0xa1, - 0xaa, 0xf1, 0x22, 0x2c, 0x2a, 0xa0, 0x27, 0x61, 0x78, 0x87, 0x44, 0x91, 0xb3, 0x29, 0x6f, 0xc3, - 0x09, 0x51, 0x77, 0x78, 0x85, 0x17, 0x63, 0x09, 0x47, 0x8f, 0xc3, 0x20, 0x09, 0xc3, 0x20, 0x14, - 0x7b, 0x74, 0x4c, 0x20, 0x0e, 0x2e, 0xd1, 0x42, 0xcc, 0x61, 0xf6, 0xbf, 0xb3, 0x60, 0x42, 0xf5, - 0x95, 0xb7, 0x75, 0x02, 0xaf, 0x82, 0xb7, 0x00, 0x1a, 0xf2, 0x03, 0x23, 0x76, 0x7b, 0x8c, 0x3c, - 0x77, 0x39, 0xf3, 0xa2, 0xee, 0x18, 0xc6, 0x84, 0xb2, 0x2a, 0x8a, 0xb0, 0x46, 0xcd, 0xfe, 0xa7, - 0x16, 0x9c, 0x4a, 0x7d, 0xd1, 0x4d, 0x2f, 0x8a, 0xd1, 0xdb, 0x1d, 0x5f, 0x35, 0xd7, 0xdf, 0x57, - 0xd1, 0xda, 0xec, 0x9b, 0xd4, 0x52, 0x96, 0x25, 0xda, 0x17, 0x5d, 0x87, 0x41, 0x2f, 0x26, 0x3b, - 0xf2, 0x63, 0x1e, 0xef, 0xfa, 0x31, 0xbc, 0x57, 0xc9, 0x8c, 0x54, 0x69, 0x4d, 0xcc, 0x09, 0xd8, - 0x7f, 0xb5, 0x08, 0x65, 0xbe, 0x6c, 0x57, 0x9c, 0xd6, 0x09, 0xcc, 0x45, 0x15, 0x06, 0x18, 0x75, - 0xde, 0xf1, 0x27, 0xb2, 0x3b, 0x2e, 0xba, 0x33, 0x47, 0x9f, 0xfc, 0x9c, 0x39, 0x52, 0x57, 0x03, - 0x2d, 0xc2, 0x8c, 0x04, 0x72, 0x00, 0xd6, 0x3d, 0xdf, 0x09, 0xf7, 0x69, 0xd9, 0x74, 0x91, 0x11, - 0x7c, 0xa6, 0x3b, 0xc1, 0x05, 0x85, 0xcf, 0xc9, 0xaa, 0xbe, 0x26, 0x00, 0xac, 0x11, 0x9d, 0x79, - 0x09, 0xca, 0x0a, 0xf9, 0x28, 0x3c, 0xce, 0xcc, 0xa7, 0x60, 0x22, 0xd5, 0x56, 0xaf, 0xea, 0xa3, - 0x3a, 0x8b, 0xf4, 0x4b, 0xec, 0x14, 0x10, 0xbd, 0x5e, 0xf2, 0x77, 0xc5, 0x29, 0xfa, 0x1e, 0x9c, - 0x6e, 0x66, 0x1c, 0x4e, 0x62, 0xaa, 0xfa, 0x3f, 0xcc, 0xce, 0x8b, 0xcf, 0x3e, 0x9d, 0x05, 0xc5, - 0x99, 0x6d, 0xd0, 0x6b, 0x3f, 0x68, 0xd1, 0x35, 0xef, 0x34, 0x75, 0x0e, 0xfa, 0x96, 0x28, 0xc3, - 0x0a, 0x4a, 0x8f, 0xb0, 0xd3, 0xaa, 0xf3, 0x37, 0xc8, 0x7e, 0x9d, 0x34, 0x49, 0x23, 0x0e, 0xc2, - 0xaf, 0x69, 0xf7, 0x2f, 0xf0, 0xd1, 0xe7, 0x27, 0xe0, 0x88, 0x20, 0x50, 0xbc, 0x41, 0xf6, 0xf9, - 0x54, 0xe8, 0x5f, 0x57, 0xec, 0xfa, 0x75, 0x3f, 0x63, 0xc1, 0x98, 0xfa, 0xba, 0x13, 0xd8, 0xea, - 0x0b, 0xe6, 0x56, 0xbf, 0xd0, 0x75, 0x81, 0xe7, 0x6c, 0xf2, 0x2f, 0x17, 0xe0, 0x9c, 0xc2, 0xa1, - 0xec, 0x3e, 0xff, 0x23, 0x56, 0xd5, 0x55, 0x28, 0xfb, 0x4a, 0x10, 0x65, 0x99, 0x12, 0xa0, 0x44, - 0x0c, 0x95, 0xe0, 0x50, 0xae, 0xcd, 0x4f, 0xa4, 0x45, 0xa3, 0xba, 0x84, 0x56, 0x48, 0x63, 0x17, - 0xa0, 0xd8, 0xf6, 0x5c, 0x71, 0x67, 0x7c, 0x42, 0x8e, 0xf6, 0xed, 0x6a, 0xe5, 0xf0, 0x60, 0xf6, - 0xb1, 0x3c, 0xed, 0x00, 0xbd, 0xac, 0xa2, 0xb9, 0xdb, 0xd5, 0x0a, 0xa6, 0x95, 0xd1, 0x3c, 0x4c, - 0x48, 0x05, 0xc8, 0x1d, 0xca, 0x41, 0x05, 0xbe, 0xb8, 0x5a, 0x94, 0x98, 0x15, 0x9b, 0x60, 0x9c, - 0xc6, 0x47, 0x15, 0x98, 0xdc, 0x6e, 0xaf, 0x93, 0x26, 0x89, 0xf9, 0x07, 0xdf, 0x20, 0x5c, 0x08, - 0x59, 0x4e, 0x1e, 0x5b, 0x37, 0x52, 0x70, 0xdc, 0x51, 0xc3, 0xfe, 0x33, 0x76, 0xc4, 0x8b, 0xd1, - 0xab, 0x85, 0x01, 0x5d, 0x58, 0x94, 0xfa, 0xd7, 0x72, 0x39, 0xf7, 0xb3, 0x2a, 0x6e, 0x90, 0xfd, - 0xb5, 0x80, 0x32, 0xdb, 0xd9, 0xab, 0xc2, 0x58, 0xf3, 0x03, 0x5d, 0xd7, 0xfc, 0xcf, 0x15, 0xe0, - 0x8c, 0x1a, 0x01, 0x83, 0xaf, 0xfb, 0xf3, 0x3e, 0x06, 0xcf, 0xc2, 0x88, 0x4b, 0x36, 0x9c, 0x76, - 0x33, 0x56, 0x12, 0xf1, 0x41, 0xae, 0x15, 0xa9, 0x24, 0xc5, 0x58, 0xc7, 0x39, 0xc2, 0xb0, 0xfd, - 0xaf, 0x11, 0x76, 0xb7, 0xc6, 0x0e, 0x5d, 0xe3, 0x6a, 0xd7, 0x58, 0xb9, 0xbb, 0xe6, 0x71, 0x18, - 0xf4, 0x76, 0x28, 0xaf, 0x55, 0x30, 0x59, 0xa8, 0x2a, 0x2d, 0xc4, 0x1c, 0x86, 0x3e, 0x06, 0xc3, - 0x8d, 0x60, 0x67, 0xc7, 0xf1, 0x5d, 0x76, 0xe5, 0x95, 0x17, 0x46, 0x28, 0x3b, 0xb6, 0xc8, 0x8b, - 0xb0, 0x84, 0xa1, 0xf3, 0x30, 0xe0, 0x84, 0x9b, 0x5c, 0x2c, 0x51, 0x5e, 0x28, 0xd1, 0x96, 0xe6, - 0xc3, 0xcd, 0x08, 0xb3, 0x52, 0xfa, 0xaa, 0xda, 0x0b, 0xc2, 0x6d, 0xcf, 0xdf, 0xac, 0x78, 0xa1, - 0xd8, 0x12, 0xea, 0x2e, 0xbc, 0xab, 0x20, 0x58, 0xc3, 0x42, 0xcb, 0x30, 0xd8, 0x0a, 0xc2, 0x38, - 0x9a, 0x1e, 0x62, 0xc3, 0xfd, 0x58, 0xce, 0x41, 0xc4, 0xbf, 0xb6, 0x16, 0x84, 0x71, 0xf2, 0x01, - 0xf4, 0x5f, 0x84, 0x79, 0x75, 0x74, 0x13, 0x86, 0x89, 0xbf, 0xbb, 0x1c, 0x06, 0x3b, 0xd3, 0xa7, - 0xf2, 0x29, 0x2d, 0x71, 0x14, 0xbe, 0xcc, 0x12, 0xb6, 0x53, 0x14, 0x63, 0x49, 0x02, 0x7d, 0x03, - 0x14, 0x89, 0xbf, 0x3b, 0x3d, 0xcc, 0x28, 0xcd, 0xe4, 0x50, 0xba, 0xe3, 0x84, 0xc9, 0x99, 0xbf, - 0xe4, 0xef, 0x62, 0x5a, 0x07, 0x7d, 0x06, 0xca, 0xf2, 0xc0, 0x88, 0x84, 0xfc, 0x2d, 0x73, 0xc1, - 0xca, 0x63, 0x06, 0x93, 0x77, 0xdb, 0x5e, 0x48, 0x76, 0x88, 0x1f, 0x47, 0xc9, 0x09, 0x29, 0xa1, - 0x11, 0x4e, 0xa8, 0xa1, 0xcf, 0x48, 0xa1, 0xef, 0x4a, 0xd0, 0xf6, 0xe3, 0x68, 0xba, 0xcc, 0xba, - 0x97, 0xa9, 0x8e, 0xbb, 0x93, 0xe0, 0xa5, 0xa5, 0xc2, 0xbc, 0x32, 0x36, 0x48, 0xa1, 0xcf, 0xc2, - 0x18, 0xff, 0xcf, 0x95, 0x5a, 0xd1, 0xf4, 0x19, 0x46, 0xfb, 0x52, 0x3e, 0x6d, 0x8e, 0xb8, 0x70, - 0x46, 0x10, 0x1f, 0xd3, 0x4b, 0x23, 0x6c, 0x52, 0x43, 0x18, 0xc6, 0x9a, 0xde, 0x2e, 0xf1, 0x49, - 0x14, 0xd5, 0xc2, 0x60, 0x9d, 0x4c, 0x03, 0x1b, 0x98, 0x73, 0xd9, 0x4a, 0xb0, 0x60, 0x9d, 0x2c, - 0x4c, 0x51, 0x9a, 0x37, 0xf5, 0x3a, 0xd8, 0x24, 0x81, 0x6e, 0xc3, 0x38, 0x7d, 0x84, 0x79, 0x09, - 0xd1, 0x91, 0x5e, 0x44, 0xd9, 0x53, 0x09, 0x1b, 0x95, 0x70, 0x8a, 0x08, 0xba, 0x05, 0xa3, 0x51, - 0xec, 0x84, 0x71, 0xbb, 0xc5, 0x89, 0x9e, 0xed, 0x45, 0x94, 0xe9, 0x50, 0xeb, 0x5a, 0x15, 0x6c, - 0x10, 0x40, 0x6f, 0x40, 0xb9, 0xe9, 0x6d, 0x90, 0xc6, 0x7e, 0xa3, 0x49, 0xa6, 0x47, 0x19, 0xb5, - 0xcc, 0x43, 0xe5, 0xa6, 0x44, 0xe2, 0xaf, 0x42, 0xf5, 0x17, 0x27, 0xd5, 0xd1, 0x1d, 0x38, 0x1b, - 0x93, 0x70, 0xc7, 0xf3, 0x1d, 0x7a, 0x18, 0x88, 0xd7, 0x12, 0xd3, 0x4d, 0x8e, 0xb1, 0xdd, 0x76, - 0x51, 0xcc, 0xc6, 0xd9, 0xb5, 0x4c, 0x2c, 0x9c, 0x53, 0x1b, 0xdd, 0x83, 0xe9, 0x0c, 0x48, 0xd0, - 0xf4, 0x1a, 0xfb, 0xd3, 0xa7, 0x19, 0xe5, 0xd7, 0x04, 0xe5, 0xe9, 0xb5, 0x1c, 0xbc, 0xc3, 0x2e, - 0x30, 0x9c, 0x4b, 0x1d, 0xdd, 0x82, 0x09, 0x76, 0x02, 0xd5, 0xda, 0xcd, 0xa6, 0x68, 0x70, 0x9c, - 0x35, 0xf8, 0x31, 0x79, 0x1f, 0x57, 0x4d, 0xf0, 0xe1, 0xc1, 0x2c, 0x24, 0xff, 0x70, 0xba, 0x36, - 0x5a, 0x67, 0x6a, 0xb0, 0x76, 0xe8, 0xc5, 0xfb, 0xf4, 0xdc, 0x20, 0xf7, 0xe2, 0xe9, 0x89, 0xae, - 0x22, 0x08, 0x1d, 0x55, 0xe9, 0xca, 0xf4, 0x42, 0x9c, 0x26, 0x48, 0x8f, 0xd4, 0x28, 0x76, 0x3d, - 0x7f, 0x7a, 0x92, 0x9d, 0xd4, 0xea, 0x44, 0xaa, 0xd3, 0x42, 0xcc, 0x61, 0x4c, 0x05, 0x46, 0x7f, - 0xdc, 0xa2, 0x37, 0xd7, 0x14, 0x43, 0x4c, 0x54, 0x60, 0x12, 0x80, 0x13, 0x1c, 0xca, 0x4c, 0xc6, - 0xf1, 0xfe, 0x34, 0x62, 0xa8, 0xea, 0x60, 0x59, 0x5b, 0xfb, 0x0c, 0xa6, 0xe5, 0xf6, 0x3a, 0x8c, - 0xab, 0x83, 0x90, 0x8d, 0x09, 0x9a, 0x85, 0x41, 0xc6, 0x3e, 0x09, 0x81, 0x59, 0x99, 0x76, 0x81, - 0xb1, 0x56, 0x98, 0x97, 0xb3, 0x2e, 0x78, 0xef, 0x91, 0x85, 0xfd, 0x98, 0xf0, 0x67, 0x7a, 0x51, - 0xeb, 0x82, 0x04, 0xe0, 0x04, 0xc7, 0xfe, 0xbf, 0x9c, 0x0d, 0x4d, 0x4e, 0xdb, 0x3e, 0xee, 0x97, - 0xa7, 0xa1, 0xb4, 0x15, 0x44, 0x31, 0xc5, 0x66, 0x6d, 0x0c, 0x26, 0x8c, 0xe7, 0x75, 0x51, 0x8e, - 0x15, 0x06, 0x7a, 0x15, 0xc6, 0x1a, 0x7a, 0x03, 0xe2, 0x72, 0x54, 0xc7, 0x88, 0xd1, 0x3a, 0x36, - 0x71, 0xd1, 0xcb, 0x50, 0x62, 0x66, 0x1d, 0x8d, 0xa0, 0x29, 0xb8, 0x36, 0x79, 0xc3, 0x97, 0x6a, - 0xa2, 0xfc, 0x50, 0xfb, 0x8d, 0x15, 0x36, 0xba, 0x0c, 0x43, 0xb4, 0x0b, 0xd5, 0x9a, 0xb8, 0x96, - 0x94, 0xec, 0xe7, 0x3a, 0x2b, 0xc5, 0x02, 0x6a, 0xff, 0x95, 0x82, 0x36, 0xca, 0xf4, 0x89, 0x4b, - 0x50, 0x0d, 0x86, 0xf7, 0x1c, 0x2f, 0xf6, 0xfc, 0x4d, 0xc1, 0x7f, 0x3c, 0xd9, 0xf5, 0x8e, 0x62, - 0x95, 0xee, 0xf2, 0x0a, 0xfc, 0x16, 0x15, 0x7f, 0xb0, 0x24, 0x43, 0x29, 0x86, 0x6d, 0xdf, 0xa7, - 0x14, 0x0b, 0xfd, 0x52, 0xc4, 0xbc, 0x02, 0xa7, 0x28, 0xfe, 0x60, 0x49, 0x06, 0xbd, 0x0d, 0x20, - 0x77, 0x18, 0x71, 0x85, 0x39, 0xc5, 0xd3, 0xbd, 0x89, 0xae, 0xa9, 0x3a, 0x0b, 0xe3, 0xf4, 0x8e, - 0x4e, 0xfe, 0x63, 0x8d, 0x9e, 0x1d, 0x33, 0x3e, 0xad, 0xb3, 0x33, 0xe8, 0x9b, 0xe9, 0x12, 0x77, - 0xc2, 0x98, 0xb8, 0xf3, 0xb1, 0x18, 0x9c, 0x8f, 0xf7, 0xf7, 0x48, 0x59, 0xf3, 0x76, 0x88, 0xbe, - 0x1d, 0x04, 0x11, 0x9c, 0xd0, 0xb3, 0x7f, 0xa1, 0x08, 0xd3, 0x79, 0xdd, 0xa5, 0x8b, 0x8e, 0xdc, - 0xf3, 0xe2, 0x45, 0xca, 0x5e, 0x59, 0xe6, 0xa2, 0x5b, 0x12, 0xe5, 0x58, 0x61, 0xd0, 0xd9, 0x8f, - 0xbc, 0x4d, 0xf9, 0xc6, 0x1c, 0x4c, 0x66, 0xbf, 0xce, 0x4a, 0xb1, 0x80, 0x52, 0xbc, 0x90, 0x38, - 0x91, 0xb0, 0xd7, 0xd1, 0x56, 0x09, 0x66, 0xa5, 0x58, 0x40, 0x75, 0x01, 0xd6, 0x40, 0x0f, 0x01, - 0x96, 0x31, 0x44, 0x83, 0xc7, 0x3b, 0x44, 0xe8, 0x73, 0x00, 0x1b, 0x9e, 0xef, 0x45, 0x5b, 0x8c, - 0xfa, 0xd0, 0x91, 0xa9, 0x2b, 0xe6, 0x6c, 0x59, 0x51, 0xc1, 0x1a, 0x45, 0xf4, 0x22, 0x8c, 0xa8, - 0x0d, 0x58, 0xad, 0x30, 0xe5, 0xa5, 0x66, 0x0c, 0x92, 0x9c, 0x46, 0x15, 0xac, 0xe3, 0xd9, 0xef, - 0xa4, 0xd7, 0x8b, 0xd8, 0x01, 0xda, 0xf8, 0x5a, 0xfd, 0x8e, 0x6f, 0xa1, 0xfb, 0xf8, 0xda, 0x5f, - 0x2d, 0xc2, 0x84, 0xd1, 0x58, 0x3b, 0xea, 0xe3, 0xcc, 0xba, 0x46, 0x0f, 0x70, 0x27, 0x26, 0x62, - 0xff, 0xd9, 0xbd, 0xb7, 0x8a, 0x7e, 0xc8, 0xd3, 0x1d, 0xc0, 0xeb, 0xa3, 0xcf, 0x41, 0xb9, 0xe9, - 0x44, 0x4c, 0x18, 0x46, 0xc4, 0xbe, 0xeb, 0x87, 0x58, 0xf2, 0x30, 0x71, 0xa2, 0x58, 0xbb, 0x35, - 0x39, 0xed, 0x84, 0x24, 0xbd, 0x69, 0x28, 0x7f, 0x22, 0x0d, 0xc2, 0x54, 0x27, 0x28, 0x13, 0xb3, - 0x8f, 0x39, 0x0c, 0xbd, 0x0c, 0xa3, 0x21, 0x61, 0xab, 0x62, 0x91, 0x72, 0x73, 0x6c, 0x99, 0x0d, - 0x26, 0x6c, 0x1f, 0xd6, 0x60, 0xd8, 0xc0, 0x4c, 0xde, 0x06, 0x43, 0x5d, 0xde, 0x06, 0x4f, 0xc2, - 0x30, 0xfb, 0xa1, 0x56, 0x80, 0x9a, 0x8d, 0x2a, 0x2f, 0xc6, 0x12, 0x9e, 0x5e, 0x30, 0xa5, 0xfe, - 0x16, 0x0c, 0x7d, 0x7d, 0x88, 0x45, 0xcd, 0x14, 0xc7, 0x25, 0x7e, 0xca, 0x89, 0x25, 0x8f, 0x25, - 0xcc, 0xfe, 0x38, 0x8c, 0x57, 0x1c, 0xb2, 0x13, 0xf8, 0x4b, 0xbe, 0xdb, 0x0a, 0x3c, 0x3f, 0x46, - 0xd3, 0x30, 0xc0, 0x2e, 0x11, 0x7e, 0x04, 0x0c, 0xd0, 0x86, 0xf0, 0x00, 0x7d, 0x10, 0xd8, 0x9b, - 0x70, 0xa6, 0x12, 0xec, 0xf9, 0x7b, 0x4e, 0xe8, 0xce, 0xd7, 0xaa, 0xda, 0xfb, 0x7a, 0x55, 0xbe, - 0xef, 0xb8, 0x1d, 0x56, 0xe6, 0xd1, 0xab, 0xd5, 0xe4, 0x6c, 0xed, 0xb2, 0xd7, 0x24, 0x39, 0x52, - 0x90, 0xbf, 0x5e, 0x30, 0x5a, 0x4a, 0xf0, 0x95, 0xa2, 0xca, 0xca, 0x55, 0x54, 0xbd, 0x09, 0xa5, - 0x0d, 0x8f, 0x34, 0x5d, 0x4c, 0x36, 0xc4, 0x4a, 0x7c, 0x22, 0xdf, 0xb4, 0x64, 0x99, 0x62, 0x4a, - 0xa9, 0x17, 0x7f, 0x1d, 0x2e, 0x8b, 0xca, 0x58, 0x91, 0x41, 0xdb, 0x30, 0x29, 0x1f, 0x0c, 0x12, - 0x2a, 0xd6, 0xe5, 0x93, 0xdd, 0x5e, 0x21, 0x26, 0xf1, 0xd3, 0xf7, 0x0f, 0x66, 0x27, 0x71, 0x8a, - 0x0c, 0xee, 0x20, 0x4c, 0x9f, 0x83, 0x3b, 0xf4, 0x04, 0x1e, 0x60, 0xc3, 0xcf, 0x9e, 0x83, 0xec, - 0x65, 0xcb, 0x4a, 0xed, 0x1f, 0xb6, 0xe0, 0x91, 0x8e, 0x91, 0x11, 0x2f, 0xfc, 0x63, 0x9e, 0x85, - 0xf4, 0x8b, 0xbb, 0xd0, 0xfb, 0xc5, 0x6d, 0xff, 0xb4, 0x05, 0xa7, 0x97, 0x76, 0x5a, 0xf1, 0x7e, - 0xc5, 0x33, 0xb5, 0x4a, 0x2f, 0xc1, 0xd0, 0x0e, 0x71, 0xbd, 0xf6, 0x8e, 0x98, 0xb9, 0x59, 0x79, - 0x4a, 0xad, 0xb0, 0xd2, 0xc3, 0x83, 0xd9, 0xb1, 0x7a, 0x1c, 0x84, 0xce, 0x26, 0xe1, 0x05, 0x58, - 0xa0, 0xb3, 0xb3, 0xde, 0x7b, 0x8f, 0xdc, 0xf4, 0x76, 0x3c, 0x69, 0x2a, 0xd4, 0x55, 0x66, 0x37, - 0x27, 0x07, 0x74, 0xee, 0xcd, 0xb6, 0xe3, 0xc7, 0x5e, 0xbc, 0x2f, 0x14, 0x42, 0x92, 0x08, 0x4e, - 0xe8, 0xd9, 0x5f, 0xb1, 0x60, 0x42, 0xae, 0xfb, 0x79, 0xd7, 0x0d, 0x49, 0x14, 0xa1, 0x19, 0x28, - 0x78, 0x2d, 0xd1, 0x4b, 0x10, 0xbd, 0x2c, 0x54, 0x6b, 0xb8, 0xe0, 0xb5, 0x24, 0x5b, 0xc6, 0x0e, - 0xc2, 0xa2, 0xa9, 0x1b, 0xbb, 0x2e, 0xca, 0xb1, 0xc2, 0x40, 0x57, 0xa0, 0xe4, 0x07, 0x2e, 0x37, - 0xd7, 0xe2, 0x57, 0x1a, 0x5b, 0x60, 0xab, 0xa2, 0x0c, 0x2b, 0x28, 0xaa, 0x41, 0x99, 0x5b, 0x32, - 0x25, 0x8b, 0xb6, 0x2f, 0x7b, 0x28, 0xf6, 0x65, 0x6b, 0xb2, 0x26, 0x4e, 0x88, 0xd8, 0xdf, 0x67, - 0xc1, 0xa8, 0xfc, 0xb2, 0x3e, 0x79, 0x4e, 0xba, 0xb5, 0x12, 0x7e, 0x33, 0xd9, 0x5a, 0x94, 0x67, - 0x64, 0x10, 0x83, 0x55, 0x2c, 0x1e, 0x85, 0x55, 0xb4, 0x7f, 0xa8, 0x00, 0xe3, 0xb2, 0x3b, 0xf5, - 0xf6, 0x7a, 0x44, 0x62, 0xb4, 0x06, 0x65, 0x87, 0x0f, 0x39, 0x91, 0x2b, 0xf6, 0xf1, 0x6c, 0xa1, - 0x80, 0x31, 0x3f, 0xc9, 0xed, 0x3d, 0x2f, 0x6b, 0xe3, 0x84, 0x10, 0x6a, 0xc2, 0x94, 0x1f, 0xc4, - 0xec, 0x24, 0x57, 0xf0, 0x6e, 0xaa, 0x97, 0x34, 0xf5, 0x73, 0x82, 0xfa, 0xd4, 0x6a, 0x9a, 0x0a, - 0xee, 0x24, 0x8c, 0x96, 0xa4, 0xa0, 0xa5, 0x98, 0xff, 0xb2, 0xd7, 0x67, 0x21, 0x5b, 0xce, 0x62, - 0xff, 0xb2, 0x05, 0x65, 0x89, 0x76, 0x12, 0x5a, 0xb6, 0x15, 0x18, 0x8e, 0xd8, 0x24, 0xc8, 0xa1, - 0xb1, 0xbb, 0x75, 0x9c, 0xcf, 0x57, 0x72, 0x41, 0xf1, 0xff, 0x11, 0x96, 0x34, 0x98, 0x9c, 0x5d, - 0x75, 0xff, 0x03, 0x22, 0x67, 0x57, 0xfd, 0xc9, 0xb9, 0x61, 0x7e, 0x9f, 0xf5, 0x59, 0x13, 0x5c, - 0x51, 0x3e, 0xaa, 0x15, 0x92, 0x0d, 0xef, 0x5e, 0x9a, 0x8f, 0xaa, 0xb1, 0x52, 0x2c, 0xa0, 0xe8, - 0x6d, 0x18, 0x6d, 0x48, 0x01, 0x6b, 0xb2, 0x5d, 0x2f, 0x77, 0x15, 0xf6, 0x2b, 0xbd, 0x10, 0x17, - 0x6c, 0x2c, 0x6a, 0xf5, 0xb1, 0x41, 0xcd, 0x54, 0xf3, 0x17, 0x7b, 0xa9, 0xf9, 0x13, 0xba, 0xf9, - 0x4a, 0xef, 0x1f, 0xb1, 0x60, 0x88, 0x0b, 0xd6, 0xfa, 0x93, 0x6b, 0x6a, 0x6a, 0xb2, 0x64, 0xec, - 0xee, 0xd0, 0x42, 0xa1, 0xf6, 0x42, 0x2b, 0x50, 0x66, 0x3f, 0x98, 0x60, 0xb0, 0x98, 0x6f, 0x15, - 0xcf, 0x5b, 0xd5, 0x3b, 0x78, 0x47, 0x56, 0xc3, 0x09, 0x05, 0xfb, 0x07, 0x8a, 0xf4, 0xa8, 0x4a, - 0x50, 0x8d, 0x1b, 0xdc, 0x7a, 0x78, 0x37, 0x78, 0xe1, 0x61, 0xdd, 0xe0, 0x9b, 0x30, 0xd1, 0xd0, - 0x94, 0x6a, 0xc9, 0x4c, 0x5e, 0xe9, 0xba, 0x48, 0x34, 0xfd, 0x1b, 0x17, 0x99, 0x2c, 0x9a, 0x44, - 0x70, 0x9a, 0x2a, 0xfa, 0x66, 0x18, 0xe5, 0xf3, 0x2c, 0x5a, 0xe1, 0x96, 0x12, 0x1f, 0xcb, 0x5f, - 0x2f, 0x7a, 0x13, 0x5c, 0xc4, 0xa6, 0x55, 0xc7, 0x06, 0x31, 0xfb, 0x8f, 0x2c, 0x40, 0x4b, 0xad, - 0x2d, 0xb2, 0x43, 0x42, 0xa7, 0x99, 0xc8, 0xc6, 0xff, 0x92, 0x05, 0xd3, 0xa4, 0xa3, 0x78, 0x31, - 0xd8, 0xd9, 0x11, 0x2f, 0x90, 0x9c, 0x47, 0xf2, 0x52, 0x4e, 0x1d, 0xe5, 0x36, 0x30, 0x9d, 0x87, - 0x81, 0x73, 0xdb, 0x43, 0x2b, 0x70, 0x8a, 0x5f, 0x79, 0x0a, 0xa0, 0xd9, 0x46, 0x3f, 0x2a, 0x08, - 0x9f, 0x5a, 0xeb, 0x44, 0xc1, 0x59, 0xf5, 0xec, 0xef, 0x18, 0x85, 0xdc, 0x5e, 0x7c, 0xa8, 0x14, - 0xf8, 0x50, 0x29, 0xf0, 0xa1, 0x52, 0xe0, 0x43, 0xa5, 0xc0, 0x87, 0x4a, 0x81, 0xaf, 0x7b, 0xa5, - 0xc0, 0x1f, 0x58, 0x70, 0xaa, 0xf3, 0x1a, 0x38, 0x09, 0xc6, 0xbc, 0x0d, 0xa7, 0x3a, 0xef, 0xba, - 0xae, 0x76, 0x70, 0x9d, 0xfd, 0x4c, 0xee, 0xbd, 0x8c, 0x6f, 0xc0, 0x59, 0xf4, 0xed, 0x5f, 0x28, - 0xc1, 0xe0, 0xd2, 0x2e, 0xf1, 0xe3, 0x13, 0xf8, 0xc4, 0x06, 0x8c, 0x7b, 0xfe, 0x6e, 0xd0, 0xdc, - 0x25, 0x2e, 0x87, 0x1f, 0xe5, 0xbd, 0x7b, 0x56, 0x90, 0x1e, 0xaf, 0x1a, 0x24, 0x70, 0x8a, 0xe4, - 0xc3, 0x90, 0x39, 0x5f, 0x83, 0x21, 0x7e, 0x3b, 0x08, 0x81, 0x73, 0xe6, 0x65, 0xc0, 0x06, 0x51, - 0xdc, 0x79, 0x89, 0x3c, 0x9c, 0xdf, 0x3e, 0xa2, 0x3a, 0x7a, 0x07, 0xc6, 0x37, 0xbc, 0x30, 0x8a, - 0xd7, 0xbc, 0x1d, 0x12, 0xc5, 0xce, 0x4e, 0xeb, 0x01, 0x64, 0xcc, 0x6a, 0x1c, 0x96, 0x0d, 0x4a, - 0x38, 0x45, 0x19, 0x6d, 0xc2, 0x58, 0xd3, 0xd1, 0x9b, 0x1a, 0x3e, 0x72, 0x53, 0xea, 0xda, 0xb9, - 0xa9, 0x13, 0xc2, 0x26, 0x5d, 0xba, 0x4f, 0x1b, 0x4c, 0x4c, 0x5a, 0x62, 0xc2, 0x03, 0xb5, 0x4f, - 0xb9, 0x7c, 0x94, 0xc3, 0x28, 0x07, 0xc5, 0x2c, 0x63, 0xcb, 0x26, 0x07, 0xa5, 0xd9, 0xbf, 0x7e, - 0x1e, 0xca, 0x84, 0x0e, 0x21, 0x25, 0x2c, 0x6e, 0xae, 0xab, 0xfd, 0xf5, 0x75, 0xc5, 0x6b, 0x84, - 0x81, 0x29, 0xdd, 0x5f, 0x92, 0x94, 0x70, 0x42, 0x14, 0x2d, 0xc2, 0x50, 0x44, 0x42, 0x8f, 0x44, - 0xe2, 0x0e, 0xeb, 0x32, 0x8d, 0x0c, 0x8d, 0x3b, 0x95, 0xf0, 0xdf, 0x58, 0x54, 0xa5, 0xcb, 0xcb, - 0x61, 0x82, 0x4f, 0x76, 0xcb, 0x68, 0xcb, 0x6b, 0x9e, 0x95, 0x62, 0x01, 0x45, 0x6f, 0xc0, 0x70, - 0x48, 0x9a, 0x4c, 0x7d, 0x34, 0xd6, 0xff, 0x22, 0xe7, 0xda, 0x28, 0x5e, 0x0f, 0x4b, 0x02, 0xe8, - 0x06, 0xa0, 0x90, 0x50, 0x0e, 0xcc, 0xf3, 0x37, 0x95, 0xbd, 0xa8, 0x38, 0xc1, 0xd5, 0x8e, 0xc7, - 0x09, 0x86, 0xf4, 0xef, 0xc1, 0x19, 0xd5, 0xd0, 0x35, 0x98, 0x52, 0xa5, 0x55, 0x3f, 0x8a, 0x1d, - 0x7a, 0x72, 0x4e, 0x30, 0x5a, 0x4a, 0x00, 0x82, 0xd3, 0x08, 0xb8, 0xb3, 0x8e, 0xfd, 0x93, 0x16, - 0xf0, 0x71, 0x3e, 0x81, 0x67, 0xff, 0xeb, 0xe6, 0xb3, 0xff, 0x5c, 0xee, 0xcc, 0xe5, 0x3c, 0xf9, - 0xef, 0x5b, 0x30, 0xa2, 0xcd, 0x6c, 0xb2, 0x66, 0xad, 0x2e, 0x6b, 0xb6, 0x0d, 0x93, 0x74, 0xa5, - 0xdf, 0x5a, 0x8f, 0x48, 0xb8, 0x4b, 0x5c, 0xb6, 0x30, 0x0b, 0x0f, 0xb6, 0x30, 0x95, 0x21, 0xdb, - 0xcd, 0x14, 0x41, 0xdc, 0xd1, 0x04, 0x7a, 0x49, 0xea, 0x52, 0x8a, 0x86, 0x1d, 0x38, 0xd7, 0x93, - 0x1c, 0x1e, 0xcc, 0x4e, 0x6a, 0x1f, 0xa2, 0xeb, 0x4e, 0xec, 0xcf, 0xcb, 0x6f, 0x54, 0x06, 0x83, - 0x0d, 0xb5, 0x58, 0x52, 0x06, 0x83, 0x6a, 0x39, 0xe0, 0x04, 0x87, 0xee, 0xd1, 0xad, 0x20, 0x8a, - 0xd3, 0x06, 0x83, 0xd7, 0x83, 0x28, 0xc6, 0x0c, 0x62, 0x3f, 0x0f, 0xb0, 0x74, 0x8f, 0x34, 0xf8, - 0x52, 0xd7, 0x9f, 0x33, 0x56, 0xfe, 0x73, 0xc6, 0xfe, 0x0f, 0x16, 0x8c, 0x2f, 0x2f, 0x1a, 0x12, - 0xe1, 0x39, 0x00, 0xfe, 0x06, 0xbb, 0x7b, 0x77, 0x55, 0x6a, 0xdb, 0xb9, 0xc2, 0x54, 0x95, 0x62, - 0x0d, 0x03, 0x9d, 0x83, 0x62, 0xb3, 0xed, 0x0b, 0xe9, 0xe4, 0x30, 0xbd, 0xb0, 0x6f, 0xb6, 0x7d, - 0x4c, 0xcb, 0x34, 0x27, 0x84, 0x62, 0xdf, 0x4e, 0x08, 0x3d, 0x83, 0x01, 0xa0, 0x59, 0x18, 0xdc, - 0xdb, 0xf3, 0x5c, 0xee, 0x72, 0x29, 0x2c, 0x01, 0xee, 0xde, 0xad, 0x56, 0x22, 0xcc, 0xcb, 0xed, - 0x2f, 0x15, 0x61, 0x66, 0xb9, 0x49, 0xee, 0xbd, 0x4f, 0xb7, 0xd3, 0x7e, 0x5d, 0x28, 0x8e, 0x26, - 0x1a, 0x3a, 0xaa, 0x9b, 0x4c, 0xef, 0xf1, 0xd8, 0x80, 0x61, 0x6e, 0x2f, 0x27, 0x9d, 0x50, 0x5f, - 0xcd, 0x6a, 0x3d, 0x7f, 0x40, 0xe6, 0xb8, 0xdd, 0x9d, 0xf0, 0xa1, 0x53, 0x37, 0xad, 0x28, 0xc5, - 0x92, 0xf8, 0xcc, 0x2b, 0x30, 0xaa, 0x63, 0x1e, 0xc9, 0x61, 0xed, 0x2f, 0x16, 0x61, 0x92, 0xf6, - 0xe0, 0xa1, 0x4e, 0xc4, 0xed, 0xce, 0x89, 0x38, 0x6e, 0xa7, 0xa5, 0xde, 0xb3, 0xf1, 0x76, 0x7a, - 0x36, 0x9e, 0xcd, 0x9b, 0x8d, 0x93, 0x9e, 0x83, 0x6f, 0xb7, 0xe0, 0xd4, 0x72, 0x33, 0x68, 0x6c, - 0xa7, 0x1c, 0x8b, 0x5e, 0x84, 0x11, 0x7a, 0x8e, 0x47, 0x86, 0xcf, 0xbb, 0x11, 0x05, 0x41, 0x80, - 0xb0, 0x8e, 0xa7, 0x55, 0xbb, 0x7d, 0xbb, 0x5a, 0xc9, 0x0a, 0x9e, 0x20, 0x40, 0x58, 0xc7, 0xb3, - 0x7f, 0xc3, 0x82, 0x0b, 0xd7, 0x16, 0x97, 0x92, 0xa5, 0xd8, 0x11, 0xbf, 0xe1, 0x32, 0x0c, 0xb5, - 0x5c, 0xad, 0x2b, 0x89, 0xc0, 0xb7, 0xc2, 0x7a, 0x21, 0xa0, 0x1f, 0x94, 0xd8, 0x24, 0x3f, 0x61, - 0xc1, 0xa9, 0x6b, 0x5e, 0x4c, 0xaf, 0xe5, 0x74, 0x24, 0x01, 0x7a, 0x2f, 0x47, 0x5e, 0x1c, 0x84, - 0xfb, 0xe9, 0x48, 0x02, 0x58, 0x41, 0xb0, 0x86, 0xc5, 0x5b, 0xde, 0xf5, 0x98, 0xa5, 0x76, 0xc1, - 0xd4, 0x63, 0x61, 0x51, 0x8e, 0x15, 0x06, 0xfd, 0x30, 0xd7, 0x0b, 0x99, 0xd4, 0x70, 0x5f, 0x9c, - 0xb0, 0xea, 0xc3, 0x2a, 0x12, 0x80, 0x13, 0x1c, 0xfa, 0x80, 0x9a, 0xbd, 0xd6, 0x6c, 0x47, 0x31, - 0x09, 0x37, 0xa2, 0x9c, 0xd3, 0xf1, 0x79, 0x28, 0x13, 0x29, 0xa3, 0x17, 0xbd, 0x56, 0xac, 0xa6, - 0x12, 0xde, 0xf3, 0x80, 0x06, 0x0a, 0xaf, 0x0f, 0x37, 0xc5, 0xa3, 0xf9, 0x99, 0x2d, 0x03, 0x22, - 0x7a, 0x5b, 0x7a, 0x84, 0x07, 0xe6, 0x2a, 0xbe, 0xd4, 0x01, 0xc5, 0x19, 0x35, 0xec, 0x1f, 0xb6, - 0xe0, 0x8c, 0xfa, 0xe0, 0x0f, 0xdc, 0x67, 0xda, 0x3f, 0x5b, 0x80, 0xb1, 0xeb, 0x6b, 0x6b, 0xb5, - 0x6b, 0x24, 0x16, 0xd7, 0x76, 0x6f, 0x35, 0x3a, 0xd6, 0xb4, 0x81, 0xdd, 0x5e, 0x81, 0xed, 0xd8, - 0x6b, 0xce, 0xf1, 0x40, 0x41, 0x73, 0x55, 0x3f, 0xbe, 0x15, 0xd6, 0xe3, 0xd0, 0xf3, 0x37, 0x33, - 0xf5, 0x87, 0x92, 0xb9, 0x28, 0xe6, 0x31, 0x17, 0xe8, 0x79, 0x18, 0x62, 0x91, 0x8a, 0xe4, 0x24, - 0x3c, 0xaa, 0x1e, 0x51, 0xac, 0xf4, 0xf0, 0x60, 0xb6, 0x7c, 0x1b, 0x57, 0xf9, 0x1f, 0x2c, 0x50, - 0xd1, 0x6d, 0x18, 0xd9, 0x8a, 0xe3, 0xd6, 0x75, 0xe2, 0xb8, 0xf4, 0xb5, 0xcc, 0x8f, 0xc3, 0x8b, - 0x59, 0xc7, 0x21, 0x1d, 0x04, 0x8e, 0x96, 0x9c, 0x20, 0x49, 0x59, 0x84, 0x75, 0x3a, 0x76, 0x1d, - 0x20, 0x81, 0x1d, 0x93, 0xee, 0xc4, 0xfe, 0x3d, 0x0b, 0x86, 0x79, 0xd0, 0x88, 0x10, 0xbd, 0x06, - 0x03, 0xe4, 0x1e, 0x69, 0x08, 0x56, 0x39, 0xb3, 0xc3, 0x09, 0xa7, 0xc5, 0x65, 0xc0, 0xf4, 0x3f, - 0x66, 0xb5, 0xd0, 0x75, 0x18, 0xa6, 0xbd, 0xbd, 0xa6, 0x22, 0x68, 0x3c, 0x96, 0xf7, 0xc5, 0x6a, - 0xda, 0x39, 0x73, 0x26, 0x8a, 0xb0, 0xac, 0xce, 0xb4, 0xcf, 0x8d, 0x56, 0x9d, 0x9e, 0xd8, 0x71, - 0x37, 0xc6, 0x62, 0x6d, 0xb1, 0xc6, 0x91, 0x04, 0x35, 0xae, 0x7d, 0x96, 0x85, 0x38, 0x21, 0x62, - 0xaf, 0x41, 0x99, 0x4e, 0xea, 0x7c, 0xd3, 0x73, 0xba, 0x2b, 0xd4, 0x9f, 0x82, 0xb2, 0x54, 0x97, - 0x47, 0xc2, 0x59, 0x9c, 0x51, 0x95, 0xda, 0xf4, 0x08, 0x27, 0x70, 0x7b, 0x03, 0x4e, 0x33, 0xe3, - 0x47, 0x27, 0xde, 0x32, 0xf6, 0x58, 0xef, 0xc5, 0xfc, 0xb4, 0x78, 0x79, 0xf2, 0x99, 0x99, 0xd6, - 0xfc, 0x31, 0x47, 0x25, 0xc5, 0xe4, 0x15, 0x6a, 0x7f, 0x75, 0x00, 0x1e, 0xad, 0xd6, 0xf3, 0xe3, - 0x89, 0xbc, 0x0c, 0xa3, 0x9c, 0x2f, 0xa5, 0x4b, 0xdb, 0x69, 0x8a, 0x76, 0x95, 0xf0, 0x77, 0x4d, - 0x83, 0x61, 0x03, 0x13, 0x5d, 0x80, 0xa2, 0xf7, 0xae, 0x9f, 0x76, 0x6d, 0xaa, 0xbe, 0xb9, 0x8a, - 0x69, 0x39, 0x05, 0x53, 0x16, 0x97, 0xdf, 0x1d, 0x0a, 0xac, 0xd8, 0xdc, 0xd7, 0x61, 0xdc, 0x8b, - 0x1a, 0x91, 0x57, 0xf5, 0xe9, 0x39, 0xa3, 0x9d, 0x54, 0x4a, 0x2a, 0x42, 0x3b, 0xad, 0xa0, 0x38, - 0x85, 0xad, 0x5d, 0x64, 0x83, 0x7d, 0xb3, 0xc9, 0x3d, 0xbd, 0xa7, 0xe9, 0x0b, 0xa0, 0xc5, 0xbe, - 0x2e, 0x62, 0x52, 0x7c, 0xf1, 0x02, 0xe0, 0x1f, 0x1c, 0x61, 0x09, 0xa3, 0x4f, 0xce, 0xc6, 0x96, - 0xd3, 0x9a, 0x6f, 0xc7, 0x5b, 0x15, 0x2f, 0x6a, 0x04, 0xbb, 0x24, 0xdc, 0x67, 0xd2, 0x82, 0x52, - 0xf2, 0xe4, 0x54, 0x80, 0xc5, 0xeb, 0xf3, 0x35, 0x8a, 0x89, 0x3b, 0xeb, 0xa0, 0x79, 0x98, 0x90, - 0x85, 0x75, 0x12, 0xb1, 0x2b, 0x6c, 0x84, 0x91, 0x51, 0xce, 0x46, 0xa2, 0x58, 0x11, 0x49, 0xe3, - 0x9b, 0x9c, 0x34, 0x1c, 0x07, 0x27, 0xfd, 0x12, 0x8c, 0x79, 0xbe, 0x17, 0x7b, 0x4e, 0x1c, 0x70, - 0x15, 0x14, 0x17, 0x0c, 0x30, 0xd9, 0x7a, 0x55, 0x07, 0x60, 0x13, 0xcf, 0xfe, 0x6f, 0x03, 0x30, - 0xc5, 0xa6, 0xed, 0xc3, 0x15, 0xf6, 0xf5, 0xb4, 0xc2, 0x6e, 0x77, 0xae, 0xb0, 0xe3, 0x78, 0x22, - 0x3c, 0xf0, 0x32, 0x7b, 0x07, 0xca, 0xca, 0xbf, 0x4a, 0x3a, 0x58, 0x5a, 0x39, 0x0e, 0x96, 0xbd, - 0xb9, 0x0f, 0x69, 0xa2, 0x56, 0xcc, 0x34, 0x51, 0xfb, 0x9b, 0x16, 0x24, 0x3a, 0x15, 0x74, 0x1d, - 0xca, 0xad, 0x80, 0x59, 0x5e, 0x86, 0xd2, 0x9c, 0xf9, 0xd1, 0xcc, 0x8b, 0x8a, 0x5f, 0x8a, 0xfc, - 0xe3, 0x6b, 0xb2, 0x06, 0x4e, 0x2a, 0xa3, 0x05, 0x18, 0x6e, 0x85, 0xa4, 0x1e, 0xb3, 0xb0, 0x22, - 0x3d, 0xe9, 0xf0, 0x35, 0xc2, 0xf1, 0xb1, 0xac, 0x68, 0xff, 0x9c, 0x05, 0xc0, 0xad, 0xc0, 0x1c, - 0x7f, 0x93, 0x9c, 0x80, 0xb8, 0xbb, 0x02, 0x03, 0x51, 0x8b, 0x34, 0xba, 0xd9, 0xc4, 0x26, 0xfd, - 0xa9, 0xb7, 0x48, 0x23, 0x19, 0x70, 0xfa, 0x0f, 0xb3, 0xda, 0xf6, 0x77, 0x02, 0x8c, 0x27, 0x68, - 0xd5, 0x98, 0xec, 0xa0, 0x67, 0x8c, 0x30, 0x03, 0xe7, 0x52, 0x61, 0x06, 0xca, 0x0c, 0x5b, 0x93, - 0xac, 0xbe, 0x03, 0xc5, 0x1d, 0xe7, 0x9e, 0x10, 0x9d, 0x3d, 0xd5, 0xbd, 0x1b, 0x94, 0xfe, 0xdc, - 0x8a, 0x73, 0x8f, 0x3f, 0x12, 0x9f, 0x92, 0x0b, 0x64, 0xc5, 0xb9, 0x77, 0xc8, 0x2d, 0x5f, 0xd9, - 0x21, 0x75, 0xd3, 0x8b, 0xe2, 0x2f, 0xfc, 0xd7, 0xe4, 0x3f, 0x5b, 0x76, 0xb4, 0x11, 0xd6, 0x96, - 0xe7, 0x0b, 0x9b, 0xa8, 0xbe, 0xda, 0xf2, 0xfc, 0x74, 0x5b, 0x9e, 0xdf, 0x47, 0x5b, 0x9e, 0x8f, - 0xde, 0x83, 0x61, 0x61, 0x7f, 0x28, 0xc2, 0xfa, 0x5c, 0xed, 0xa3, 0x3d, 0x61, 0xbe, 0xc8, 0xdb, - 0xbc, 0x2a, 0x1f, 0xc1, 0xa2, 0xb4, 0x67, 0xbb, 0xb2, 0x41, 0xf4, 0xd7, 0x2c, 0x18, 0x17, 0xbf, - 0x31, 0x79, 0xb7, 0x4d, 0xa2, 0x58, 0xf0, 0x9e, 0x9f, 0xec, 0xbf, 0x0f, 0xa2, 0x22, 0xef, 0xca, - 0x27, 0xe5, 0x31, 0x6b, 0x02, 0x7b, 0xf6, 0x28, 0xd5, 0x0b, 0xf4, 0x0f, 0x2c, 0x38, 0xbd, 0xe3, - 0xdc, 0xe3, 0x2d, 0xf2, 0x32, 0xec, 0xc4, 0x5e, 0x20, 0x54, 0xff, 0xaf, 0xf5, 0x37, 0xfd, 0x1d, - 0xd5, 0x79, 0x27, 0xa5, 0x7e, 0xf2, 0x74, 0x16, 0x4a, 0xcf, 0xae, 0x66, 0xf6, 0x6b, 0x66, 0x03, - 0x4a, 0x72, 0xbd, 0x65, 0x88, 0x1a, 0x2a, 0x3a, 0x63, 0x7d, 0x64, 0xf3, 0x4f, 0xdd, 0xd7, 0x9f, - 0xb6, 0x23, 0xd6, 0xda, 0x43, 0x6d, 0xe7, 0x1d, 0x18, 0xd5, 0xd7, 0xd8, 0x43, 0x6d, 0xeb, 0x5d, - 0x38, 0x95, 0xb1, 0x96, 0x1e, 0x6a, 0x93, 0x7b, 0x70, 0x2e, 0x77, 0x7d, 0x3c, 0xcc, 0x86, 0xed, - 0x9f, 0xb5, 0xf4, 0x73, 0xf0, 0x04, 0x74, 0x0e, 0x8b, 0xa6, 0xce, 0xe1, 0x62, 0xf7, 0x9d, 0x93, - 0xa3, 0x78, 0x78, 0x5b, 0xef, 0x34, 0x3d, 0xd5, 0xd1, 0x1b, 0x30, 0xd4, 0xa4, 0x25, 0xd2, 0xf0, - 0xd5, 0xee, 0xbd, 0x23, 0x13, 0x5e, 0x8a, 0x95, 0x47, 0x58, 0x50, 0xb0, 0x7f, 0xd1, 0x82, 0x81, - 0x13, 0x18, 0x09, 0x6c, 0x8e, 0xc4, 0x33, 0xb9, 0xa4, 0x45, 0xc4, 0xe1, 0x39, 0xec, 0xec, 0x2d, - 0xdd, 0x8b, 0x89, 0x1f, 0xb1, 0xa7, 0x62, 0xe6, 0xc0, 0xfc, 0x7f, 0x70, 0xea, 0x66, 0xe0, 0xb8, - 0x0b, 0x4e, 0xd3, 0xf1, 0x1b, 0x24, 0xac, 0xfa, 0x9b, 0x47, 0xb2, 0xc0, 0x2e, 0xf4, 0xb2, 0xc0, - 0xb6, 0xb7, 0x00, 0xe9, 0x0d, 0x08, 0x57, 0x16, 0x0c, 0xc3, 0x1e, 0x6f, 0x4a, 0x0c, 0xff, 0x13, - 0xd9, 0xac, 0x59, 0x47, 0xcf, 0x34, 0x27, 0x0d, 0x5e, 0x80, 0x25, 0x21, 0xfb, 0x65, 0xc8, 0xf4, - 0x87, 0xef, 0x2d, 0x36, 0xb0, 0x3f, 0x03, 0x53, 0xac, 0xe6, 0x11, 0x9f, 0xb4, 0x76, 0x4a, 0x2a, - 0x99, 0x11, 0xfc, 0xce, 0xfe, 0xa2, 0x05, 0x13, 0xab, 0xa9, 0x98, 0x60, 0x97, 0x99, 0x02, 0x34, - 0x43, 0x18, 0x5e, 0x67, 0xa5, 0x58, 0x40, 0x8f, 0x5d, 0x06, 0xf5, 0x67, 0x16, 0x24, 0x21, 0x2a, - 0x4e, 0x80, 0xf1, 0x5a, 0x34, 0x18, 0xaf, 0x4c, 0xd9, 0x88, 0xea, 0x4e, 0x1e, 0xdf, 0x85, 0x6e, - 0xa8, 0x78, 0x4c, 0x5d, 0xc4, 0x22, 0x09, 0x19, 0x1e, 0xbd, 0x67, 0xdc, 0x0c, 0xda, 0x24, 0x23, - 0x34, 0xd9, 0xff, 0xb9, 0x00, 0x48, 0xe1, 0xf6, 0x1d, 0x2f, 0xaa, 0xb3, 0xc6, 0xf1, 0xc4, 0x8b, - 0xda, 0x05, 0xc4, 0x54, 0xf8, 0xa1, 0xe3, 0x47, 0x9c, 0xac, 0x27, 0xa4, 0x6e, 0x47, 0xb3, 0x0f, - 0x98, 0x11, 0x4d, 0xa2, 0x9b, 0x1d, 0xd4, 0x70, 0x46, 0x0b, 0x9a, 0x69, 0xc6, 0x60, 0xbf, 0xa6, - 0x19, 0x43, 0x3d, 0xdc, 0xd5, 0x7e, 0xc6, 0x82, 0x31, 0x35, 0x4c, 0x1f, 0x10, 0xfb, 0x73, 0xd5, - 0x9f, 0x9c, 0xa3, 0xaf, 0xa6, 0x75, 0x99, 0x5d, 0x09, 0xdf, 0xc8, 0xdc, 0x0e, 0x9d, 0xa6, 0xf7, - 0x1e, 0x51, 0xd1, 0xfa, 0x66, 0x85, 0x1b, 0xa1, 0x28, 0x3d, 0x3c, 0x98, 0x1d, 0x53, 0xff, 0x78, - 0x74, 0xe0, 0xa4, 0x8a, 0xfd, 0x63, 0x74, 0xb3, 0x9b, 0x4b, 0x11, 0xbd, 0x08, 0x83, 0xad, 0x2d, - 0x27, 0x22, 0x29, 0xa7, 0x9b, 0xc1, 0x1a, 0x2d, 0x3c, 0x3c, 0x98, 0x1d, 0x57, 0x15, 0x58, 0x09, - 0xe6, 0xd8, 0xfd, 0x47, 0xe1, 0xea, 0x5c, 0x9c, 0x3d, 0xa3, 0x70, 0xfd, 0x91, 0x05, 0x03, 0xab, - 0x81, 0x7b, 0x12, 0x47, 0xc0, 0xeb, 0xc6, 0x11, 0x70, 0x3e, 0x2f, 0x70, 0x7b, 0xee, 0xee, 0x5f, - 0x4e, 0xed, 0xfe, 0x8b, 0xb9, 0x14, 0xba, 0x6f, 0xfc, 0x1d, 0x18, 0x61, 0xe1, 0xe0, 0x85, 0x83, - 0xd1, 0xf3, 0xc6, 0x86, 0x9f, 0x4d, 0x6d, 0xf8, 0x09, 0x0d, 0x55, 0xdb, 0xe9, 0x4f, 0xc2, 0xb0, - 0x70, 0x72, 0x49, 0x7b, 0x6f, 0x0a, 0x5c, 0x2c, 0xe1, 0xf6, 0x8f, 0x14, 0xc1, 0x08, 0x3f, 0x8f, - 0x7e, 0xd9, 0x82, 0xb9, 0x90, 0x1b, 0xbf, 0xba, 0x95, 0x76, 0xe8, 0xf9, 0x9b, 0xf5, 0xc6, 0x16, - 0x71, 0xdb, 0x4d, 0xcf, 0xdf, 0xac, 0x6e, 0xfa, 0x81, 0x2a, 0x5e, 0xba, 0x47, 0x1a, 0x6d, 0xa6, - 0xbe, 0xea, 0x11, 0xeb, 0x5e, 0x19, 0x91, 0x3f, 0x77, 0xff, 0x60, 0x76, 0x0e, 0x1f, 0x89, 0x36, - 0x3e, 0x62, 0x5f, 0xd0, 0x6f, 0x58, 0x70, 0x95, 0x47, 0x65, 0xef, 0xbf, 0xff, 0x5d, 0xde, 0xb9, - 0x35, 0x49, 0x2a, 0x21, 0xb2, 0x46, 0xc2, 0x9d, 0x85, 0x97, 0xc4, 0x80, 0x5e, 0xad, 0x1d, 0xad, - 0x2d, 0x7c, 0xd4, 0xce, 0xd9, 0xff, 0xa2, 0x08, 0x63, 0x22, 0xb4, 0x93, 0xb8, 0x03, 0x5e, 0x34, - 0x96, 0xc4, 0x63, 0xa9, 0x25, 0x31, 0x65, 0x20, 0x1f, 0xcf, 0xf1, 0x1f, 0xc1, 0x14, 0x3d, 0x9c, - 0xaf, 0x13, 0x27, 0x8c, 0xd7, 0x89, 0xc3, 0x2d, 0xae, 0x8a, 0x47, 0x3e, 0xfd, 0x95, 0x60, 0xed, - 0x66, 0x9a, 0x18, 0xee, 0xa4, 0xff, 0xf5, 0x74, 0xe7, 0xf8, 0x30, 0xd9, 0x11, 0x9d, 0xeb, 0x2d, - 0x28, 0x2b, 0x0f, 0x0d, 0x71, 0xe8, 0x74, 0x0f, 0x72, 0x97, 0xa6, 0xc0, 0x85, 0x5f, 0x89, 0x77, - 0x50, 0x42, 0xce, 0xfe, 0x87, 0x05, 0xa3, 0x41, 0x3e, 0x89, 0xab, 0x50, 0x72, 0xa2, 0xc8, 0xdb, - 0xf4, 0x89, 0x2b, 0x76, 0xec, 0x47, 0xf3, 0x76, 0xac, 0xd1, 0x0c, 0xf3, 0x92, 0x99, 0x17, 0x35, - 0xb1, 0xa2, 0x81, 0xae, 0x73, 0xbb, 0xb6, 0x5d, 0xf9, 0x52, 0xeb, 0x8f, 0x1a, 0x48, 0xcb, 0xb7, - 0x5d, 0x82, 0x45, 0x7d, 0xf4, 0x59, 0x6e, 0x78, 0x78, 0xc3, 0x0f, 0xf6, 0xfc, 0x6b, 0x41, 0x20, - 0xc3, 0x27, 0xf4, 0x47, 0x70, 0x4a, 0x9a, 0x1b, 0xaa, 0xea, 0xd8, 0xa4, 0xd6, 0x5f, 0x04, 0xcb, - 0x6f, 0x81, 0x53, 0x94, 0xb4, 0xe9, 0xdd, 0x1c, 0x21, 0x02, 0x13, 0x22, 0x6e, 0x98, 0x2c, 0x13, - 0x63, 0x97, 0xf9, 0x08, 0x33, 0x6b, 0x27, 0x12, 0xe0, 0x1b, 0x26, 0x09, 0x9c, 0xa6, 0x69, 0xff, - 0xb8, 0x05, 0xcc, 0xd3, 0xf3, 0x04, 0xf8, 0x91, 0x4f, 0x99, 0xfc, 0xc8, 0x74, 0xde, 0x20, 0xe7, - 0xb0, 0x22, 0x2f, 0xf0, 0x95, 0x55, 0x0b, 0x83, 0x7b, 0xfb, 0xc2, 0xe8, 0xa3, 0xf7, 0xfb, 0xc3, - 0xfe, 0x3f, 0x16, 0x3f, 0xc4, 0x94, 0xff, 0x04, 0xfa, 0x56, 0x28, 0x35, 0x9c, 0x96, 0xd3, 0xe0, - 0xb9, 0x52, 0x72, 0x65, 0x71, 0x46, 0xa5, 0xb9, 0x45, 0x51, 0x83, 0xcb, 0x96, 0x64, 0xfc, 0xb9, - 0x92, 0x2c, 0xee, 0x29, 0x4f, 0x52, 0x4d, 0xce, 0x6c, 0xc3, 0x98, 0x41, 0xec, 0xa1, 0x0a, 0x22, - 0xbe, 0x95, 0x5f, 0xb1, 0x2a, 0x5e, 0xe2, 0x0e, 0x4c, 0xf9, 0xda, 0x7f, 0x7a, 0xa1, 0xc8, 0xc7, - 0xe5, 0x47, 0x7b, 0x5d, 0xa2, 0xec, 0xf6, 0xd1, 0xfc, 0x4e, 0x53, 0x64, 0x70, 0x27, 0x65, 0xfb, - 0x47, 0x2d, 0x78, 0x44, 0x47, 0xd4, 0x5c, 0x5b, 0x7a, 0x49, 0xf7, 0x2b, 0x50, 0x0a, 0x5a, 0x24, - 0x74, 0xe2, 0x20, 0x14, 0xb7, 0xc6, 0x15, 0x39, 0xe8, 0xb7, 0x44, 0xf9, 0xa1, 0x88, 0x34, 0x2e, - 0xa9, 0xcb, 0x72, 0xac, 0x6a, 0xd2, 0xd7, 0x27, 0x1b, 0x8c, 0x48, 0x38, 0x31, 0xb1, 0x33, 0x80, - 0x29, 0xba, 0x23, 0x2c, 0x20, 0xf6, 0x57, 0x2d, 0xbe, 0xb0, 0xf4, 0xae, 0xa3, 0x77, 0x61, 0x72, - 0xc7, 0x89, 0x1b, 0x5b, 0x4b, 0xf7, 0x5a, 0x21, 0xd7, 0x95, 0xc8, 0x71, 0x7a, 0xaa, 0xd7, 0x38, - 0x69, 0x1f, 0x99, 0xd8, 0x52, 0xae, 0xa4, 0x88, 0xe1, 0x0e, 0xf2, 0x68, 0x1d, 0x46, 0x58, 0x19, - 0xf3, 0xcf, 0x8b, 0xba, 0xb1, 0x06, 0x79, 0xad, 0x29, 0x5b, 0x81, 0x95, 0x84, 0x0e, 0xd6, 0x89, - 0xda, 0x3f, 0x55, 0xe4, 0xbb, 0x9d, 0xb1, 0xf2, 0x4f, 0xc2, 0x70, 0x2b, 0x70, 0x17, 0xab, 0x15, - 0x2c, 0x66, 0x41, 0x5d, 0x23, 0x35, 0x5e, 0x8c, 0x25, 0x1c, 0x5d, 0x81, 0x92, 0xf8, 0x29, 0x75, - 0x5b, 0xec, 0x6c, 0x16, 0x78, 0x11, 0x56, 0x50, 0xf4, 0x1c, 0x40, 0x2b, 0x0c, 0x76, 0x3d, 0x97, - 0x05, 0x81, 0x28, 0x9a, 0x66, 0x3e, 0x35, 0x05, 0xc1, 0x1a, 0x16, 0x7a, 0x15, 0xc6, 0xda, 0x7e, - 0xc4, 0xd9, 0x11, 0x67, 0x5d, 0x04, 0xe5, 0x2e, 0x25, 0x06, 0x28, 0xb7, 0x75, 0x20, 0x36, 0x71, - 0xd1, 0x3c, 0x0c, 0xc5, 0x0e, 0x33, 0x5b, 0x19, 0xcc, 0xb7, 0xb7, 0x5d, 0xa3, 0x18, 0x7a, 0x5a, - 0x0e, 0x5a, 0x01, 0x8b, 0x8a, 0xe8, 0x2d, 0xe9, 0x2a, 0xcb, 0x0f, 0x76, 0x61, 0xe8, 0xde, 0xdf, - 0x25, 0xa0, 0x39, 0xca, 0x0a, 0x03, 0x7a, 0x83, 0x16, 0x7a, 0x05, 0x80, 0xdc, 0x8b, 0x49, 0xe8, - 0x3b, 0x4d, 0x65, 0x15, 0xa6, 0xf8, 0x82, 0x4a, 0xb0, 0x1a, 0xc4, 0xb7, 0x23, 0xb2, 0xa4, 0x30, - 0xb0, 0x86, 0x6d, 0xff, 0x46, 0x19, 0x20, 0xe1, 0xdb, 0xd1, 0x7b, 0x1d, 0x07, 0xd7, 0xd3, 0xdd, - 0x39, 0xfd, 0xe3, 0x3b, 0xb5, 0xd0, 0x77, 0x59, 0x30, 0xe2, 0x34, 0x9b, 0x41, 0xc3, 0x89, 0xd9, - 0x0c, 0x15, 0xba, 0x1f, 0x9c, 0xa2, 0xfd, 0xf9, 0xa4, 0x06, 0xef, 0xc2, 0xf3, 0x72, 0x85, 0x6a, - 0x90, 0x9e, 0xbd, 0xd0, 0x1b, 0x46, 0x9f, 0x90, 0x4f, 0xc5, 0xa2, 0x31, 0x94, 0xea, 0xa9, 0x58, - 0x66, 0x77, 0x84, 0xfe, 0x4a, 0xbc, 0x6d, 0xbc, 0x12, 0x07, 0xf2, 0x7d, 0x01, 0x0d, 0xf6, 0xb5, - 0xd7, 0x03, 0x11, 0xd5, 0xf4, 0xb8, 0x00, 0x83, 0xf9, 0x8e, 0x77, 0xda, 0x3b, 0xa9, 0x47, 0x4c, - 0x80, 0x77, 0x60, 0xc2, 0x35, 0x99, 0x00, 0xb1, 0x12, 0x9f, 0xc8, 0xa3, 0x9b, 0xe2, 0x19, 0x92, - 0x6b, 0x3f, 0x05, 0xc0, 0x69, 0xc2, 0xa8, 0xc6, 0x63, 0x3e, 0x54, 0xfd, 0x8d, 0x40, 0x38, 0x5b, - 0xd8, 0xb9, 0x73, 0xb9, 0x1f, 0xc5, 0x64, 0x87, 0x62, 0x26, 0xb7, 0xfb, 0xaa, 0xa8, 0x8b, 0x15, - 0x15, 0xf4, 0x06, 0x0c, 0x31, 0xcf, 0xab, 0x68, 0xba, 0x94, 0x2f, 0x2b, 0x36, 0x83, 0x98, 0x25, - 0x1b, 0x92, 0xfd, 0x8d, 0xb0, 0xa0, 0x80, 0xae, 0x4b, 0xbf, 0xc6, 0xa8, 0xea, 0xdf, 0x8e, 0x08, - 0xf3, 0x6b, 0x2c, 0x2f, 0x7c, 0x34, 0x71, 0x59, 0xe4, 0xe5, 0x99, 0xc9, 0xbb, 0x8c, 0x9a, 0x94, - 0x8b, 0x12, 0xff, 0x65, 0x4e, 0xb0, 0x69, 0xc8, 0xef, 0x9e, 0x99, 0x37, 0x2c, 0x19, 0xce, 0x3b, - 0x26, 0x09, 0x9c, 0xa6, 0x49, 0x39, 0x52, 0xbe, 0xeb, 0x85, 0xbb, 0x46, 0xaf, 0xb3, 0x83, 0x3f, - 0xc4, 0xd9, 0x6d, 0xc4, 0x4b, 0xb0, 0xa8, 0x7f, 0xa2, 0xec, 0xc1, 0x8c, 0x0f, 0x93, 0xe9, 0x2d, - 0xfa, 0x50, 0xd9, 0x91, 0xdf, 0x1b, 0x80, 0x71, 0x73, 0x49, 0xa1, 0xab, 0x50, 0x16, 0x44, 0x54, - 0x1c, 0x7f, 0xb5, 0x4b, 0x56, 0x24, 0x00, 0x27, 0x38, 0x2c, 0x7d, 0x03, 0xab, 0xae, 0x99, 0xd9, - 0x26, 0xe9, 0x1b, 0x14, 0x04, 0x6b, 0x58, 0xf4, 0x61, 0xb5, 0x1e, 0x04, 0xb1, 0xba, 0x90, 0xd4, - 0xba, 0x5b, 0x60, 0xa5, 0x58, 0x40, 0xe9, 0x45, 0xb4, 0x4d, 0x42, 0x9f, 0x34, 0xcd, 0xf0, 0xc0, - 0xea, 0x22, 0xba, 0xa1, 0x03, 0xb1, 0x89, 0x4b, 0xaf, 0xd3, 0x20, 0x62, 0x0b, 0x59, 0x3c, 0xdf, - 0x12, 0xb3, 0xe5, 0x3a, 0x77, 0xad, 0x96, 0x70, 0xf4, 0x19, 0x78, 0x44, 0x85, 0x40, 0xc2, 0x5c, - 0x0f, 0x21, 0x5b, 0x1c, 0x32, 0xa4, 0x2d, 0x8f, 0x2c, 0x66, 0xa3, 0xe1, 0xbc, 0xfa, 0xe8, 0x75, - 0x18, 0x17, 0x2c, 0xbe, 0xa4, 0x38, 0x6c, 0x9a, 0xc6, 0xdc, 0x30, 0xa0, 0x38, 0x85, 0x2d, 0x03, - 0x1c, 0x33, 0x2e, 0x5b, 0x52, 0x28, 0x75, 0x06, 0x38, 0xd6, 0xe1, 0xb8, 0xa3, 0x06, 0x9a, 0x87, - 0x09, 0xce, 0x83, 0x79, 0xfe, 0x26, 0x9f, 0x13, 0xe1, 0x4d, 0xa5, 0xb6, 0xd4, 0x2d, 0x13, 0x8c, - 0xd3, 0xf8, 0xe8, 0x65, 0x18, 0x75, 0xc2, 0xc6, 0x96, 0x17, 0x93, 0x46, 0xdc, 0x0e, 0xb9, 0x9b, - 0x95, 0x66, 0x5b, 0x34, 0xaf, 0xc1, 0xb0, 0x81, 0x69, 0xbf, 0x07, 0xa7, 0x32, 0x62, 0x2e, 0xd0, - 0x85, 0xe3, 0xb4, 0x3c, 0xf9, 0x4d, 0x29, 0x03, 0xe4, 0xf9, 0x5a, 0x55, 0x7e, 0x8d, 0x86, 0x45, - 0x57, 0x27, 0x8b, 0xcd, 0xa0, 0xa5, 0x00, 0x54, 0xab, 0x73, 0x59, 0x02, 0x70, 0x82, 0x63, 0xff, - 0xcf, 0x02, 0x4c, 0x64, 0xe8, 0x56, 0x58, 0x1a, 0xba, 0xd4, 0x23, 0x25, 0xc9, 0x3a, 0x67, 0xc6, - 0xcb, 0x2e, 0x1c, 0x21, 0x5e, 0x76, 0xb1, 0x57, 0xbc, 0xec, 0x81, 0xf7, 0x13, 0x2f, 0xdb, 0x1c, - 0xb1, 0xc1, 0xbe, 0x46, 0x2c, 0x23, 0xc6, 0xf6, 0xd0, 0x11, 0x63, 0x6c, 0x1b, 0x83, 0x3e, 0xdc, - 0xc7, 0xa0, 0xff, 0x40, 0x01, 0x26, 0xd3, 0x36, 0x90, 0x27, 0x20, 0xb7, 0x7d, 0xc3, 0x90, 0xdb, - 0x66, 0x27, 0x75, 0x4c, 0x5b, 0x66, 0xe6, 0xc9, 0x70, 0x71, 0x4a, 0x86, 0xfb, 0xf1, 0xbe, 0xa8, - 0x75, 0x97, 0xe7, 0xfe, 0x9d, 0x02, 0x9c, 0x49, 0x57, 0x59, 0x6c, 0x3a, 0xde, 0xce, 0x09, 0x8c, - 0xcd, 0x2d, 0x63, 0x6c, 0x9e, 0xe9, 0xe7, 0x6b, 0x58, 0xd7, 0x72, 0x07, 0xe8, 0x6e, 0x6a, 0x80, - 0xae, 0xf6, 0x4f, 0xb2, 0xfb, 0x28, 0x7d, 0xa5, 0x08, 0x17, 0x33, 0xeb, 0x25, 0x62, 0xcf, 0x65, - 0x43, 0xec, 0xf9, 0x5c, 0x4a, 0xec, 0x69, 0x77, 0xaf, 0x7d, 0x3c, 0x72, 0x50, 0xe1, 0x21, 0xcb, - 0x02, 0x08, 0x3c, 0xa0, 0x0c, 0xd4, 0xf0, 0x90, 0x55, 0x84, 0xb0, 0x49, 0xf7, 0xeb, 0x49, 0xf6, - 0xf9, 0x6f, 0x2c, 0x38, 0x97, 0x39, 0x37, 0x27, 0x20, 0xeb, 0x5a, 0x35, 0x65, 0x5d, 0x4f, 0xf6, - 0xbd, 0x5a, 0x73, 0x84, 0x5f, 0xbf, 0x36, 0x90, 0xf3, 0x2d, 0xec, 0x25, 0x7f, 0x0b, 0x46, 0x9c, - 0x46, 0x83, 0x44, 0xd1, 0x4a, 0xe0, 0xaa, 0x90, 0xc0, 0xcf, 0xb0, 0x77, 0x56, 0x52, 0x7c, 0x78, - 0x30, 0x3b, 0x93, 0x26, 0x91, 0x80, 0xb1, 0x4e, 0x01, 0x7d, 0x16, 0x4a, 0x91, 0xb8, 0x37, 0xc5, - 0xdc, 0x3f, 0xdf, 0xe7, 0xe0, 0x38, 0xeb, 0xa4, 0x69, 0x86, 0x39, 0x52, 0x92, 0x0a, 0x45, 0xd2, - 0x0c, 0x89, 0x52, 0x38, 0xd6, 0x90, 0x28, 0xcf, 0x01, 0xec, 0xaa, 0xc7, 0x40, 0x5a, 0xfe, 0xa0, - 0x3d, 0x13, 0x34, 0x2c, 0xf4, 0x4d, 0x30, 0x19, 0xf1, 0xa0, 0x7e, 0x8b, 0x4d, 0x27, 0x62, 0x6e, - 0x2e, 0x62, 0x15, 0xb2, 0x50, 0x4a, 0xf5, 0x14, 0x0c, 0x77, 0x60, 0xa3, 0x65, 0xd9, 0x2a, 0x8b, - 0x40, 0xc8, 0x17, 0xe6, 0xe5, 0xa4, 0x45, 0x91, 0x04, 0xf7, 0x74, 0x7a, 0xf8, 0xd9, 0xc0, 0x6b, - 0x35, 0xd1, 0x67, 0x01, 0xe8, 0xf2, 0x11, 0x72, 0x88, 0xe1, 0xfc, 0xc3, 0x93, 0x9e, 0x2a, 0x6e, - 0xa6, 0x55, 0x2e, 0xf3, 0x4d, 0xad, 0x28, 0x22, 0x58, 0x23, 0x68, 0xff, 0xc0, 0x00, 0x3c, 0xda, - 0xe5, 0x8c, 0x44, 0xf3, 0xa6, 0x1e, 0xf6, 0xa9, 0xf4, 0xe3, 0x7a, 0x26, 0xb3, 0xb2, 0xf1, 0xda, - 0x4e, 0x2d, 0xc5, 0xc2, 0xfb, 0x5e, 0x8a, 0xdf, 0x6b, 0x69, 0x62, 0x0f, 0x6e, 0xab, 0xf9, 0xa9, - 0x23, 0x9e, 0xfd, 0xc7, 0x28, 0x07, 0xd9, 0xc8, 0x10, 0x26, 0x3c, 0xd7, 0x77, 0x77, 0xfa, 0x96, - 0x2e, 0x9c, 0xac, 0x94, 0xf8, 0x0b, 0x16, 0x3c, 0x96, 0xd9, 0x5f, 0xc3, 0x22, 0xe7, 0x2a, 0x94, - 0x1b, 0xb4, 0x50, 0x73, 0x45, 0x4c, 0x7c, 0xb4, 0x25, 0x00, 0x27, 0x38, 0x86, 0xe1, 0x4d, 0xa1, - 0xa7, 0xe1, 0xcd, 0x3f, 0xb7, 0xa0, 0x63, 0x7f, 0x9c, 0xc0, 0x41, 0x5d, 0x35, 0x0f, 0xea, 0x8f, - 0xf6, 0x33, 0x97, 0x39, 0x67, 0xf4, 0x1f, 0x4e, 0xc0, 0xd9, 0x1c, 0x57, 0x9c, 0x5d, 0x98, 0xda, - 0x6c, 0x10, 0xd3, 0xc9, 0x53, 0x7c, 0x4c, 0xa6, 0x3f, 0x6c, 0x57, 0x8f, 0x50, 0x96, 0xd1, 0x72, - 0xaa, 0x03, 0x05, 0x77, 0x36, 0x81, 0xbe, 0x60, 0xc1, 0x69, 0x67, 0x2f, 0xea, 0x48, 0x81, 0x2f, - 0xd6, 0xcc, 0x0b, 0x99, 0x42, 0x90, 0x1e, 0x29, 0xf3, 0x79, 0x8a, 0xcf, 0x2c, 0x2c, 0x9c, 0xd9, - 0x16, 0xc2, 0x22, 0x48, 0x3c, 0x65, 0xe7, 0xbb, 0xb8, 0x21, 0x67, 0xf9, 0x4c, 0xf1, 0x1b, 0x44, - 0x42, 0xb0, 0xa2, 0x83, 0x3e, 0x0f, 0xe5, 0x4d, 0xe9, 0xc8, 0x98, 0x71, 0x43, 0x25, 0x03, 0xd9, - 0xdd, 0xbd, 0x93, 0x6b, 0x32, 0x15, 0x12, 0x4e, 0x88, 0xa2, 0xd7, 0xa1, 0xe8, 0x6f, 0x44, 0xdd, - 0xb2, 0x64, 0xa6, 0x4c, 0xd6, 0xb8, 0xb3, 0xff, 0xea, 0x72, 0x1d, 0xd3, 0x8a, 0xe8, 0x3a, 0x14, - 0xc3, 0x75, 0x57, 0x48, 0xf0, 0x32, 0xcf, 0x70, 0xbc, 0x50, 0xc9, 0xe9, 0x15, 0xa3, 0x84, 0x17, - 0x2a, 0x98, 0x92, 0x40, 0x35, 0x18, 0x64, 0xfe, 0x2b, 0xe2, 0x3e, 0xc8, 0xe4, 0x7c, 0xbb, 0xf8, - 0x81, 0xf1, 0x88, 0x00, 0x0c, 0x01, 0x73, 0x42, 0x68, 0x0d, 0x86, 0x1a, 0x2c, 0xa3, 0xa2, 0x88, - 0x47, 0xf6, 0x89, 0x4c, 0x59, 0x5d, 0x97, 0x54, 0x93, 0x42, 0x74, 0xc5, 0x30, 0xb0, 0xa0, 0xc5, - 0xa8, 0x92, 0xd6, 0xd6, 0x46, 0x24, 0x32, 0x00, 0x67, 0x53, 0xed, 0x92, 0x41, 0x55, 0x50, 0x65, - 0x18, 0x58, 0xd0, 0x42, 0xaf, 0x40, 0x61, 0xa3, 0x21, 0x7c, 0x53, 0x32, 0x85, 0x76, 0x66, 0xbc, - 0x86, 0x85, 0xa1, 0xfb, 0x07, 0xb3, 0x85, 0xe5, 0x45, 0x5c, 0xd8, 0x68, 0xa0, 0x55, 0x18, 0xde, - 0xe0, 0x1e, 0xde, 0x42, 0x2e, 0xf7, 0x44, 0xb6, 0xf3, 0x79, 0x87, 0x13, 0x38, 0x77, 0xcb, 0x10, - 0x00, 0x2c, 0x89, 0xb0, 0x98, 0xeb, 0xca, 0x53, 0x5d, 0x84, 0xee, 0x9a, 0x3b, 0x5a, 0x74, 0x01, - 0x7e, 0x3f, 0x27, 0xfe, 0xee, 0x58, 0xa3, 0x48, 0x57, 0xb5, 0x23, 0xd3, 0xb0, 0x8b, 0x50, 0x2c, - 0x99, 0xab, 0xba, 0x47, 0x86, 0x7a, 0xbe, 0xaa, 0x15, 0x12, 0x4e, 0x88, 0xa2, 0x6d, 0x18, 0xdb, - 0x8d, 0x5a, 0x5b, 0x44, 0x6e, 0x69, 0x16, 0x99, 0x25, 0xe7, 0x0a, 0xbb, 0x23, 0x10, 0xbd, 0x30, - 0x6e, 0x3b, 0xcd, 0x8e, 0x53, 0x88, 0xa9, 0xbf, 0xef, 0xe8, 0xc4, 0xb0, 0x49, 0x9b, 0x0e, 0xff, - 0xbb, 0xed, 0x60, 0x7d, 0x3f, 0x26, 0x22, 0xe2, 0x56, 0xe6, 0xf0, 0xbf, 0xc9, 0x51, 0x3a, 0x87, - 0x5f, 0x00, 0xb0, 0x24, 0x82, 0xee, 0x88, 0xe1, 0x61, 0xa7, 0xe7, 0x64, 0x7e, 0x58, 0xcc, 0x79, - 0x89, 0x94, 0x33, 0x28, 0xec, 0xb4, 0x4c, 0x48, 0xb1, 0x53, 0xb2, 0xb5, 0x15, 0xc4, 0x81, 0x9f, - 0x3a, 0xa1, 0xa7, 0xf2, 0x4f, 0xc9, 0x5a, 0x06, 0x7e, 0xe7, 0x29, 0x99, 0x85, 0x85, 0x33, 0xdb, - 0x42, 0x2e, 0x8c, 0xb7, 0x82, 0x30, 0xde, 0x0b, 0x42, 0xb9, 0xbe, 0x50, 0x17, 0xb9, 0x82, 0x81, - 0x29, 0x5a, 0x64, 0xc1, 0xec, 0x4c, 0x08, 0x4e, 0xd1, 0x44, 0x9f, 0x86, 0xe1, 0xa8, 0xe1, 0x34, - 0x49, 0xf5, 0xd6, 0xf4, 0xa9, 0xfc, 0xeb, 0xa7, 0xce, 0x51, 0x72, 0x56, 0x17, 0x0f, 0xd0, 0xce, - 0x51, 0xb0, 0x24, 0x87, 0x96, 0x61, 0x90, 0xe5, 0xd4, 0x62, 0xe1, 0xe1, 0x72, 0xa2, 0x7b, 0x76, - 0x18, 0x10, 0xf3, 0xb3, 0x89, 0x15, 0x63, 0x5e, 0x9d, 0xee, 0x01, 0xc1, 0x5e, 0x07, 0xd1, 0xf4, - 0x99, 0xfc, 0x3d, 0x20, 0xb8, 0xf2, 0x5b, 0xf5, 0x6e, 0x7b, 0x40, 0x21, 0xe1, 0x84, 0x28, 0x3d, - 0x99, 0xe9, 0x69, 0x7a, 0xb6, 0x8b, 0xe5, 0x4b, 0xee, 0x59, 0xca, 0x4e, 0x66, 0x7a, 0x92, 0x52, - 0x12, 0xf6, 0xef, 0x0c, 0x77, 0xf2, 0x2c, 0xec, 0x41, 0xf6, 0x1d, 0x56, 0x87, 0xae, 0xee, 0x93, - 0xfd, 0xca, 0x87, 0x8e, 0x91, 0x5b, 0xfd, 0x82, 0x05, 0x67, 0x5b, 0x99, 0x1f, 0x22, 0x18, 0x80, - 0xfe, 0xc4, 0x4c, 0xfc, 0xd3, 0x55, 0x28, 0xc1, 0x6c, 0x38, 0xce, 0x69, 0x29, 0xfd, 0x22, 0x28, - 0xbe, 0xef, 0x17, 0xc1, 0x0a, 0x94, 0x18, 0x93, 0xd9, 0x23, 0xc3, 0x70, 0xfa, 0x61, 0xc4, 0x58, - 0x89, 0x45, 0x51, 0x11, 0x2b, 0x12, 0xe8, 0xfb, 0x2c, 0xb8, 0x90, 0xee, 0x3a, 0x26, 0x0c, 0x2c, - 0xe2, 0x0f, 0xf2, 0xb7, 0xe0, 0xb2, 0xf8, 0xfe, 0x0b, 0xb5, 0x6e, 0xc8, 0x87, 0xbd, 0x10, 0x70, - 0xf7, 0xc6, 0x50, 0x25, 0xe3, 0x31, 0x3a, 0x64, 0x0a, 0xe0, 0xfb, 0x78, 0x90, 0xbe, 0x00, 0xa3, - 0x3b, 0x41, 0xdb, 0x8f, 0x85, 0xa1, 0x8c, 0x50, 0xda, 0x33, 0x65, 0xf5, 0x8a, 0x56, 0x8e, 0x0d, - 0xac, 0xd4, 0x33, 0xb6, 0xf4, 0xc0, 0xcf, 0xd8, 0xb7, 0x61, 0xd4, 0xd7, 0x2c, 0x3b, 0x05, 0x3f, - 0x70, 0x39, 0x3f, 0x76, 0xa8, 0x6e, 0x07, 0xca, 0x7b, 0xa9, 0x97, 0x60, 0x83, 0xda, 0xc9, 0xbe, - 0x8d, 0x7e, 0xd2, 0xca, 0x60, 0xea, 0xf9, 0x6b, 0xf9, 0x35, 0xf3, 0xb5, 0x7c, 0x39, 0xfd, 0x5a, - 0xee, 0x10, 0xbe, 0x1a, 0x0f, 0xe5, 0xfe, 0xf3, 0x9c, 0xf4, 0x1b, 0x26, 0xd0, 0x6e, 0xc2, 0xa5, - 0x5e, 0xd7, 0x12, 0xb3, 0x98, 0x72, 0x95, 0xaa, 0x2d, 0xb1, 0x98, 0x72, 0xab, 0x15, 0xcc, 0x20, - 0xfd, 0xc6, 0x91, 0xb1, 0xff, 0x87, 0x05, 0xc5, 0x5a, 0xe0, 0x9e, 0x80, 0x30, 0xf9, 0x53, 0x86, - 0x30, 0xf9, 0xd1, 0xec, 0x0b, 0xd1, 0xcd, 0x15, 0x1d, 0x2f, 0xa5, 0x44, 0xc7, 0x17, 0xf2, 0x08, - 0x74, 0x17, 0x14, 0xff, 0x58, 0x11, 0x46, 0x6a, 0x81, 0xab, 0xcc, 0x95, 0x7f, 0xed, 0x41, 0xcc, - 0x95, 0x73, 0x03, 0xfc, 0x6b, 0x94, 0x99, 0xa1, 0x95, 0xf4, 0xb1, 0xfc, 0x73, 0x66, 0xb5, 0x7c, - 0x97, 0x78, 0x9b, 0x5b, 0x31, 0x71, 0xd3, 0x9f, 0x73, 0x72, 0x56, 0xcb, 0xff, 0xdd, 0x82, 0x89, - 0x54, 0xeb, 0xa8, 0x09, 0x63, 0x4d, 0x5d, 0x30, 0x29, 0xd6, 0xe9, 0x03, 0xc9, 0x34, 0x85, 0xd5, - 0xa7, 0x56, 0x84, 0x4d, 0xe2, 0x68, 0x0e, 0x40, 0x69, 0xea, 0xa4, 0x04, 0x8c, 0x71, 0xfd, 0x4a, - 0x95, 0x17, 0x61, 0x0d, 0x03, 0xbd, 0x08, 0x23, 0x71, 0xd0, 0x0a, 0x9a, 0xc1, 0xe6, 0xfe, 0x0d, - 0x22, 0x23, 0x17, 0x29, 0x5b, 0xae, 0xb5, 0x04, 0x84, 0x75, 0x3c, 0xfb, 0x27, 0x8a, 0xfc, 0x43, - 0xfd, 0xd8, 0xfb, 0x70, 0x4d, 0x7e, 0xb0, 0xd7, 0xe4, 0x57, 0x2c, 0x98, 0xa4, 0xad, 0x33, 0x73, - 0x11, 0x79, 0xd9, 0xaa, 0x98, 0xc1, 0x56, 0x97, 0x98, 0xc1, 0x97, 0xe9, 0xd9, 0xe5, 0x06, 0xed, - 0x58, 0x48, 0xd0, 0xb4, 0xc3, 0x89, 0x96, 0x62, 0x01, 0x15, 0x78, 0x24, 0x0c, 0x85, 0x8b, 0x9b, - 0x8e, 0x47, 0xc2, 0x10, 0x0b, 0xa8, 0x0c, 0x29, 0x3c, 0x90, 0x1d, 0x52, 0x98, 0xc7, 0x61, 0x14, - 0x86, 0x05, 0x82, 0xed, 0xd1, 0xe2, 0x30, 0x4a, 0x8b, 0x83, 0x04, 0xc7, 0xfe, 0xd9, 0x22, 0x8c, - 0xd6, 0x02, 0x37, 0xd1, 0x95, 0xbd, 0x60, 0xe8, 0xca, 0x2e, 0xa5, 0x74, 0x65, 0x93, 0x3a, 0xee, - 0x87, 0x9a, 0xb1, 0xaf, 0x95, 0x66, 0xec, 0x9f, 0x59, 0x6c, 0xd6, 0x2a, 0xab, 0x75, 0x6e, 0x7d, - 0x84, 0x9e, 0x85, 0x11, 0x76, 0x20, 0x31, 0x9f, 0x4a, 0xa9, 0x40, 0x62, 0x29, 0x94, 0x56, 0x93, - 0x62, 0xac, 0xe3, 0xa0, 0x2b, 0x50, 0x8a, 0x88, 0x13, 0x36, 0xb6, 0xd4, 0x19, 0x27, 0xb4, 0x3d, - 0xbc, 0x0c, 0x2b, 0x28, 0x7a, 0x33, 0x09, 0x01, 0x58, 0xcc, 0xf7, 0xd1, 0xd2, 0xfb, 0xc3, 0xb7, - 0x48, 0x7e, 0xdc, 0x3f, 0xfb, 0x2e, 0xa0, 0x4e, 0xfc, 0x3e, 0x62, 0x5f, 0xcd, 0x9a, 0xb1, 0xaf, - 0xca, 0x1d, 0x71, 0xaf, 0xfe, 0xd4, 0x82, 0xf1, 0x5a, 0xe0, 0xd2, 0xad, 0xfb, 0xf5, 0xb4, 0x4f, - 0xf5, 0xf8, 0xa7, 0x43, 0x5d, 0xe2, 0x9f, 0x3e, 0x0e, 0x83, 0xb5, 0xc0, 0xad, 0xd6, 0xba, 0xf9, - 0x36, 0xdb, 0x7f, 0xd7, 0x82, 0xe1, 0x5a, 0xe0, 0x9e, 0x80, 0x70, 0xfe, 0x35, 0x53, 0x38, 0xff, - 0x48, 0xce, 0xba, 0xc9, 0x91, 0xc7, 0xff, 0xed, 0x01, 0x18, 0xa3, 0xfd, 0x0c, 0x36, 0xe5, 0x54, - 0x1a, 0xc3, 0x66, 0xf5, 0x31, 0x6c, 0x94, 0x17, 0x0e, 0x9a, 0xcd, 0x60, 0x2f, 0x3d, 0xad, 0xcb, - 0xac, 0x14, 0x0b, 0x28, 0x7a, 0x1a, 0x4a, 0xad, 0x90, 0xec, 0x7a, 0x81, 0x60, 0x32, 0x35, 0x55, - 0x47, 0x4d, 0x94, 0x63, 0x85, 0x41, 0x1f, 0x67, 0x91, 0xe7, 0x37, 0x48, 0x9d, 0x34, 0x02, 0xdf, - 0xe5, 0xf2, 0xeb, 0xa2, 0x48, 0x1b, 0xa0, 0x95, 0x63, 0x03, 0x0b, 0xdd, 0x85, 0x32, 0xfb, 0xcf, - 0x8e, 0x9d, 0xa3, 0x67, 0x93, 0x14, 0xd9, 0xc5, 0x04, 0x01, 0x9c, 0xd0, 0x42, 0xcf, 0x01, 0xc4, - 0x32, 0x42, 0x76, 0x24, 0xe2, 0x1c, 0x29, 0x86, 0x5c, 0xc5, 0xce, 0x8e, 0xb0, 0x86, 0x85, 0x9e, - 0x82, 0x72, 0xec, 0x78, 0xcd, 0x9b, 0x9e, 0x4f, 0x22, 0x26, 0x97, 0x2e, 0xca, 0x24, 0x5f, 0xa2, - 0x10, 0x27, 0x70, 0xca, 0x10, 0xb1, 0x20, 0x00, 0x3c, 0x17, 0x6d, 0x89, 0x61, 0x33, 0x86, 0xe8, - 0xa6, 0x2a, 0xc5, 0x1a, 0x06, 0xda, 0x82, 0xf3, 0x9e, 0xcf, 0x42, 0xec, 0x93, 0xfa, 0xb6, 0xd7, - 0x5a, 0xbb, 0x59, 0xbf, 0x43, 0x42, 0x6f, 0x63, 0x7f, 0xc1, 0x69, 0x6c, 0x13, 0x5f, 0xe6, 0x09, - 0xfc, 0xa8, 0xe8, 0xe2, 0xf9, 0x6a, 0x17, 0x5c, 0xdc, 0x95, 0x92, 0xfd, 0x32, 0x9c, 0xa9, 0x05, - 0x6e, 0x2d, 0x08, 0xe3, 0xe5, 0x20, 0xdc, 0x73, 0x42, 0x57, 0xae, 0x94, 0x59, 0x99, 0x85, 0x84, - 0x1e, 0x85, 0x83, 0xfc, 0xa0, 0x30, 0x72, 0x61, 0x3d, 0xcf, 0x98, 0xaf, 0x23, 0x3a, 0xa3, 0x34, - 0x18, 0x1b, 0xa0, 0xf2, 0x4d, 0x5c, 0x73, 0x62, 0x82, 0x6e, 0xb1, 0xa4, 0xb8, 0xc9, 0x8d, 0x28, - 0xaa, 0x3f, 0xa9, 0x25, 0xc5, 0x4d, 0x80, 0x99, 0x57, 0xa8, 0x59, 0xdf, 0xfe, 0xe9, 0x01, 0x76, - 0x38, 0xa6, 0x72, 0x16, 0xa0, 0xcf, 0xc1, 0x78, 0x44, 0x6e, 0x7a, 0x7e, 0xfb, 0x9e, 0x94, 0x09, - 0x74, 0x71, 0x27, 0xaa, 0x2f, 0xe9, 0x98, 0x5c, 0xb2, 0x68, 0x96, 0xe1, 0x14, 0x35, 0xb4, 0x03, - 0xe3, 0x7b, 0x9e, 0xef, 0x06, 0x7b, 0x91, 0xa4, 0x5f, 0xca, 0x17, 0x30, 0xde, 0xe5, 0x98, 0xa9, - 0x3e, 0x1a, 0xcd, 0xdd, 0x35, 0x88, 0xe1, 0x14, 0x71, 0xba, 0x00, 0xc3, 0xb6, 0x3f, 0x1f, 0xdd, - 0x8e, 0x48, 0x28, 0xd2, 0x1b, 0xb3, 0x05, 0x88, 0x65, 0x21, 0x4e, 0xe0, 0x74, 0x01, 0xb2, 0x3f, - 0xd7, 0xc2, 0xa0, 0xcd, 0xe3, 0xd8, 0x8b, 0x05, 0x88, 0x55, 0x29, 0xd6, 0x30, 0xe8, 0x06, 0x65, - 0xff, 0x56, 0x03, 0x1f, 0x07, 0x41, 0x2c, 0xb7, 0x34, 0x4b, 0xa8, 0xa9, 0x95, 0x63, 0x03, 0x0b, - 0x2d, 0x03, 0x8a, 0xda, 0xad, 0x56, 0x93, 0xd9, 0x29, 0x38, 0x4d, 0x46, 0x8a, 0xeb, 0x88, 0x8b, - 0x3c, 0x4a, 0x67, 0xbd, 0x03, 0x8a, 0x33, 0x6a, 0xd0, 0xb3, 0x7a, 0x43, 0x74, 0x75, 0x90, 0x75, - 0x95, 0x2b, 0x23, 0xea, 0xbc, 0x9f, 0x12, 0x86, 0x96, 0x60, 0x38, 0xda, 0x8f, 0x1a, 0xb1, 0x08, - 0x37, 0x96, 0x93, 0x96, 0xa6, 0xce, 0x50, 0xb4, 0xac, 0x68, 0xbc, 0x0a, 0x96, 0x75, 0xed, 0x6f, - 0x65, 0xac, 0x00, 0x4b, 0x86, 0x1b, 0xb7, 0x43, 0x82, 0x76, 0x60, 0xac, 0xc5, 0x56, 0x98, 0x08, - 0xcc, 0x2e, 0x96, 0xc9, 0x0b, 0x7d, 0xbe, 0xe9, 0xf7, 0xe8, 0x09, 0xaa, 0x64, 0x6e, 0xec, 0xb1, - 0x54, 0xd3, 0xc9, 0x61, 0x93, 0xba, 0xfd, 0x95, 0xb3, 0xec, 0x32, 0xa9, 0xf3, 0x87, 0xfa, 0xb0, - 0x30, 0xac, 0x16, 0xaf, 0x92, 0x99, 0x7c, 0x89, 0x51, 0xf2, 0x45, 0xc2, 0x38, 0x1b, 0xcb, 0xba, - 0xe8, 0xb3, 0x30, 0x4e, 0x99, 0x7c, 0x2d, 0x31, 0xc5, 0xe9, 0x7c, 0x07, 0xf8, 0x24, 0x1f, 0x85, - 0x96, 0xb4, 0x41, 0xaf, 0x8c, 0x53, 0xc4, 0xd0, 0x9b, 0xcc, 0x04, 0xc0, 0xcc, 0x79, 0xd1, 0x83, - 0xb4, 0xae, 0xed, 0x97, 0x64, 0x35, 0x22, 0x79, 0xf9, 0x34, 0xec, 0x87, 0x9b, 0x4f, 0x03, 0xdd, - 0x84, 0x31, 0x91, 0x11, 0x56, 0x08, 0x3a, 0x8b, 0x86, 0x20, 0x6b, 0x0c, 0xeb, 0xc0, 0xc3, 0x74, - 0x01, 0x36, 0x2b, 0xa3, 0x4d, 0xb8, 0xa0, 0x25, 0x75, 0xb9, 0x16, 0x3a, 0x4c, 0x1b, 0xed, 0xb1, - 0x93, 0x48, 0xbb, 0xe6, 0x1e, 0xbb, 0x7f, 0x30, 0x7b, 0x61, 0xad, 0x1b, 0x22, 0xee, 0x4e, 0x07, - 0xdd, 0x82, 0x33, 0xdc, 0x7d, 0xb3, 0x42, 0x1c, 0xb7, 0xe9, 0xf9, 0xea, 0x1e, 0xe5, 0xbb, 0xe5, - 0xdc, 0xfd, 0x83, 0xd9, 0x33, 0xf3, 0x59, 0x08, 0x38, 0xbb, 0x1e, 0x7a, 0x0d, 0xca, 0xae, 0x1f, - 0x89, 0x31, 0x18, 0x32, 0xf2, 0xe6, 0x94, 0x2b, 0xab, 0x75, 0xf5, 0xfd, 0xc9, 0x1f, 0x9c, 0x54, - 0x40, 0x9b, 0x5c, 0xd8, 0xa9, 0x64, 0x0b, 0xc3, 0x1d, 0x81, 0x67, 0xd2, 0x52, 0x2a, 0xc3, 0x81, - 0x8b, 0x4b, 0xf9, 0x95, 0x5d, 0xb3, 0xe1, 0xdb, 0x65, 0x10, 0x46, 0x6f, 0x00, 0xa2, 0xcc, 0xb7, - 0xd7, 0x20, 0xf3, 0x0d, 0x16, 0xf5, 0x9f, 0xc9, 0x86, 0x4b, 0xa6, 0x4b, 0x51, 0xbd, 0x03, 0x03, - 0x67, 0xd4, 0x42, 0xd7, 0xe9, 0x6d, 0xa0, 0x97, 0x0a, 0xfb, 0x6c, 0x95, 0xe5, 0xac, 0x42, 0x5a, - 0x21, 0x69, 0x38, 0x31, 0x71, 0x4d, 0x8a, 0x38, 0x55, 0x0f, 0xb9, 0x70, 0xde, 0x69, 0xc7, 0x01, - 0x93, 0x23, 0x9b, 0xa8, 0x6b, 0xc1, 0x36, 0xf1, 0x99, 0x0a, 0xa7, 0xb4, 0x70, 0x89, 0x5e, 0xd4, - 0xf3, 0x5d, 0xf0, 0x70, 0x57, 0x2a, 0x94, 0xc1, 0x52, 0x39, 0x4a, 0xc1, 0x8c, 0xa7, 0x93, 0x91, - 0xa7, 0xf4, 0x45, 0x18, 0xd9, 0x0a, 0xa2, 0x78, 0x95, 0xc4, 0x7b, 0x41, 0xb8, 0x2d, 0xa2, 0x22, - 0x26, 0x91, 0x74, 0x13, 0x10, 0xd6, 0xf1, 0xe8, 0x0b, 0x8a, 0x19, 0x18, 0x54, 0x2b, 0x4c, 0xb7, - 0x5b, 0x4a, 0xce, 0x98, 0xeb, 0xbc, 0x18, 0x4b, 0xb8, 0x44, 0xad, 0xd6, 0x16, 0x99, 0x9e, 0x36, - 0x85, 0x5a, 0xad, 0x2d, 0x62, 0x09, 0xa7, 0xcb, 0x35, 0xda, 0x72, 0x42, 0x52, 0x0b, 0x83, 0x06, - 0x89, 0xb4, 0xf8, 0xcd, 0x8f, 0xf2, 0x98, 0x8f, 0x74, 0xb9, 0xd6, 0xb3, 0x10, 0x70, 0x76, 0x3d, - 0x44, 0x3a, 0x13, 0x1a, 0x8d, 0xe7, 0x0b, 0xd8, 0x3b, 0x59, 0x81, 0x3e, 0x73, 0x1a, 0xf9, 0x30, - 0xa9, 0x52, 0x29, 0xf1, 0x28, 0x8f, 0xd1, 0xf4, 0x04, 0x5b, 0xdb, 0xfd, 0x87, 0x88, 0x54, 0x2a, - 0x8b, 0x6a, 0x8a, 0x12, 0xee, 0xa0, 0x6d, 0x84, 0x4c, 0x9a, 0xec, 0x99, 0xb4, 0xf6, 0x2a, 0x94, - 0xa3, 0xf6, 0xba, 0x1b, 0xec, 0x38, 0x9e, 0xcf, 0xf4, 0xb4, 0x1a, 0x2b, 0x5f, 0x97, 0x00, 0x9c, - 0xe0, 0xa0, 0x65, 0x28, 0x39, 0x52, 0x1f, 0x81, 0xf2, 0x23, 0x6d, 0x28, 0x2d, 0x04, 0x77, 0x3e, - 0x97, 0x1a, 0x08, 0x55, 0x17, 0xbd, 0x0a, 0x63, 0xc2, 0xfd, 0x50, 0x64, 0xf1, 0x3b, 0x65, 0xfa, - 0x88, 0xd4, 0x75, 0x20, 0x36, 0x71, 0xd1, 0x6d, 0x18, 0x89, 0x83, 0x26, 0x73, 0x74, 0xa0, 0x1c, - 0xd2, 0xd9, 0xfc, 0x68, 0x5d, 0x6b, 0x0a, 0x4d, 0x17, 0x05, 0xaa, 0xaa, 0x58, 0xa7, 0x83, 0xd6, - 0xf8, 0x7a, 0x67, 0x71, 0x8c, 0x49, 0x34, 0xfd, 0x48, 0xfe, 0x9d, 0xa4, 0xc2, 0x1d, 0x9b, 0xdb, - 0x41, 0xd4, 0xc4, 0x3a, 0x19, 0x74, 0x0d, 0xa6, 0x5a, 0xa1, 0x17, 0xb0, 0x35, 0xa1, 0x54, 0x51, - 0xd3, 0x66, 0xf6, 0x95, 0x5a, 0x1a, 0x01, 0x77, 0xd6, 0x61, 0xde, 0xa3, 0xa2, 0x70, 0xfa, 0x1c, - 0xcf, 0xda, 0xcb, 0x5f, 0x46, 0xbc, 0x0c, 0x2b, 0x28, 0x5a, 0x61, 0x27, 0x31, 0x7f, 0xd4, 0x4f, - 0xcf, 0xe4, 0x07, 0xf7, 0xd0, 0x1f, 0xff, 0x9c, 0xef, 0x53, 0x7f, 0x71, 0x42, 0x01, 0xb9, 0x5a, - 0x46, 0x38, 0xca, 0x6c, 0x47, 0xd3, 0xe7, 0xbb, 0x58, 0x79, 0xa5, 0x38, 0xf3, 0x84, 0x21, 0x30, - 0x8a, 0x23, 0x9c, 0xa2, 0x89, 0xbe, 0x09, 0x26, 0x45, 0x30, 0xb1, 0x64, 0x98, 0x2e, 0x24, 0xe6, - 0xa3, 0x38, 0x05, 0xc3, 0x1d, 0xd8, 0x3c, 0xbe, 0xbb, 0xb3, 0xde, 0x24, 0xe2, 0xe8, 0xbb, 0xe9, - 0xf9, 0xdb, 0xd1, 0xf4, 0x45, 0x76, 0x3e, 0x88, 0xf8, 0xee, 0x69, 0x28, 0xce, 0xa8, 0x81, 0xd6, - 0x60, 0xb2, 0x15, 0x12, 0xb2, 0xc3, 0x78, 0x64, 0x71, 0x9f, 0xcd, 0x72, 0xe7, 0x69, 0xda, 0x93, - 0x5a, 0x0a, 0x76, 0x98, 0x51, 0x86, 0x3b, 0x28, 0xa0, 0x3d, 0x28, 0x05, 0xbb, 0x24, 0xdc, 0x22, - 0x8e, 0x3b, 0x7d, 0xa9, 0x8b, 0x39, 0xb3, 0xb8, 0xdc, 0x6e, 0x09, 0xdc, 0x94, 0xfa, 0x5a, 0x16, - 0xf7, 0x56, 0x5f, 0xcb, 0xc6, 0xd0, 0xf7, 0x5b, 0x70, 0x4e, 0x4a, 0xbc, 0xeb, 0x2d, 0x3a, 0xea, - 0x8b, 0x81, 0x1f, 0xc5, 0x21, 0x77, 0xf7, 0x7d, 0x2c, 0xdf, 0x05, 0x76, 0x2d, 0xa7, 0x92, 0x92, - 0x2b, 0x9e, 0xcb, 0xc3, 0x88, 0x70, 0x7e, 0x8b, 0x33, 0xdf, 0x08, 0x53, 0x1d, 0x37, 0xf7, 0x51, - 0x52, 0x4e, 0xcc, 0x6c, 0xc3, 0x98, 0x31, 0x3a, 0x0f, 0x55, 0x73, 0xf9, 0xaf, 0x87, 0xa1, 0xac, - 0xb4, 0x5a, 0xe8, 0xaa, 0xa9, 0xac, 0x3c, 0x97, 0x56, 0x56, 0x96, 0xe8, 0x6b, 0x56, 0xd7, 0x4f, - 0xae, 0x65, 0x04, 0x57, 0xca, 0xdb, 0x8b, 0xfd, 0x7b, 0xcd, 0x6a, 0x42, 0xca, 0x62, 0xdf, 0x5a, - 0xcf, 0x81, 0xae, 0x72, 0xcf, 0x6b, 0x30, 0xe5, 0x07, 0x8c, 0x5d, 0x24, 0xae, 0xe4, 0x05, 0xd8, - 0x95, 0x5f, 0xd6, 0xa3, 0x15, 0xa4, 0x10, 0x70, 0x67, 0x1d, 0xda, 0x20, 0xbf, 0xb3, 0xd3, 0x82, - 0x56, 0x7e, 0xa5, 0x63, 0x01, 0x45, 0x8f, 0xc3, 0x60, 0x2b, 0x70, 0xab, 0x35, 0xc1, 0x2a, 0x6a, - 0xe9, 0x47, 0xdd, 0x6a, 0x0d, 0x73, 0x18, 0x9a, 0x87, 0x21, 0xf6, 0x23, 0x9a, 0x1e, 0xcd, 0x77, - 0x4b, 0x67, 0x35, 0xb4, 0x84, 0x1e, 0xac, 0x02, 0x16, 0x15, 0x99, 0xc0, 0x87, 0xf2, 0xd7, 0x4c, - 0xe0, 0x33, 0xfc, 0x80, 0x02, 0x1f, 0x49, 0x00, 0x27, 0xb4, 0xd0, 0x3d, 0x38, 0x63, 0xbc, 0x69, - 0xf8, 0x12, 0x21, 0x91, 0x70, 0x8d, 0x7d, 0xbc, 0xeb, 0x63, 0x46, 0x68, 0x49, 0x2f, 0x88, 0x4e, - 0x9f, 0xa9, 0x66, 0x51, 0xc2, 0xd9, 0x0d, 0xa0, 0x26, 0x4c, 0x35, 0x3a, 0x5a, 0x2d, 0xf5, 0xdf, - 0xaa, 0x9a, 0xd0, 0xce, 0x16, 0x3b, 0x09, 0xa3, 0x57, 0xa1, 0xf4, 0x6e, 0x10, 0xb1, 0x63, 0x56, - 0xb0, 0xb7, 0xd2, 0xaf, 0xb2, 0xf4, 0xe6, 0xad, 0x3a, 0x2b, 0x3f, 0x3c, 0x98, 0x1d, 0xa9, 0x05, - 0xae, 0xfc, 0x8b, 0x55, 0x05, 0xf4, 0xdd, 0x16, 0xcc, 0x74, 0x3e, 0x9a, 0x54, 0xa7, 0xc7, 0xfa, - 0xef, 0xb4, 0x2d, 0x1a, 0x9d, 0x59, 0xca, 0x25, 0x87, 0xbb, 0x34, 0x65, 0xff, 0x12, 0xd7, 0x68, - 0x0a, 0xbd, 0x07, 0x89, 0xda, 0xcd, 0x93, 0x48, 0x80, 0xb8, 0x64, 0xa8, 0x64, 0x1e, 0x58, 0x6b, - 0xfe, 0xab, 0x16, 0xd3, 0x9a, 0xaf, 0x91, 0x9d, 0x56, 0xd3, 0x89, 0x4f, 0xc2, 0x2d, 0xef, 0x4d, - 0x28, 0xc5, 0xa2, 0xb5, 0x6e, 0x39, 0x1b, 0xb5, 0x4e, 0x31, 0xcb, 0x01, 0xc5, 0x6c, 0xca, 0x52, - 0xac, 0xc8, 0xd8, 0xff, 0x98, 0xcf, 0x80, 0x84, 0x9c, 0x80, 0xe4, 0xbb, 0x62, 0x4a, 0xbe, 0x67, - 0x7b, 0x7c, 0x41, 0x8e, 0x04, 0xfc, 0x1f, 0x99, 0xfd, 0x66, 0x42, 0x96, 0x0f, 0xba, 0xb9, 0x86, - 0xfd, 0x83, 0x16, 0x9c, 0xce, 0xb2, 0x6f, 0xa4, 0x0f, 0x04, 0x2e, 0xe2, 0x51, 0xe6, 0x2b, 0x6a, - 0x04, 0xef, 0x88, 0x72, 0xac, 0x30, 0xfa, 0x4e, 0x87, 0x74, 0xb4, 0xf0, 0xa0, 0xb7, 0x60, 0xac, - 0x16, 0x12, 0xed, 0x42, 0x7b, 0x9d, 0xfb, 0xd9, 0xf2, 0xfe, 0x3c, 0x7d, 0x64, 0x1f, 0x5b, 0xfb, - 0xa7, 0x0a, 0x70, 0x9a, 0xeb, 0x9f, 0xe7, 0x77, 0x03, 0xcf, 0xad, 0x05, 0xae, 0x48, 0x65, 0xf5, - 0x16, 0x8c, 0xb6, 0x34, 0xb9, 0x5c, 0xb7, 0x50, 0x77, 0xba, 0xfc, 0x2e, 0x91, 0x24, 0xe8, 0xa5, - 0xd8, 0xa0, 0x85, 0x5c, 0x18, 0x25, 0xbb, 0x5e, 0x43, 0x29, 0x31, 0x0b, 0x47, 0xbe, 0x5c, 0x54, - 0x2b, 0x4b, 0x1a, 0x1d, 0x6c, 0x50, 0x7d, 0x08, 0xd9, 0x4d, 0xed, 0x1f, 0xb2, 0xe0, 0x91, 0x9c, - 0xc0, 0x78, 0xb4, 0xb9, 0x3d, 0xa6, 0xe9, 0x17, 0x89, 0x12, 0x55, 0x73, 0x5c, 0xff, 0x8f, 0x05, - 0x14, 0x7d, 0x1a, 0x80, 0xeb, 0xef, 0xe9, 0x0b, 0xb5, 0x57, 0x04, 0x31, 0x23, 0xf8, 0x91, 0x16, - 0xc7, 0x46, 0xd6, 0xc7, 0x1a, 0x2d, 0xfb, 0xc7, 0x8b, 0x30, 0xc8, 0x53, 0x3c, 0x2f, 0xc3, 0xf0, - 0x16, 0x0f, 0xf0, 0xdf, 0x4f, 0x2e, 0x81, 0x44, 0x76, 0xc0, 0x0b, 0xb0, 0xac, 0x8c, 0x56, 0xe0, - 0x14, 0x4f, 0x90, 0xd0, 0xac, 0x90, 0xa6, 0xb3, 0x2f, 0x05, 0x5d, 0x3c, 0xb9, 0xa0, 0x12, 0xf8, - 0x55, 0x3b, 0x51, 0x70, 0x56, 0x3d, 0xf4, 0x3a, 0x8c, 0xd3, 0x87, 0x47, 0xd0, 0x8e, 0x25, 0x25, - 0x9e, 0x1a, 0x41, 0xbd, 0x74, 0xd6, 0x0c, 0x28, 0x4e, 0x61, 0xd3, 0xb7, 0x6f, 0xab, 0x43, 0xa4, - 0x37, 0x98, 0xbc, 0x7d, 0x4d, 0x31, 0x9e, 0x89, 0xcb, 0x0c, 0x1b, 0xdb, 0xcc, 0x8c, 0x73, 0x6d, - 0x2b, 0x24, 0xd1, 0x56, 0xd0, 0x74, 0x19, 0xa3, 0x35, 0xa8, 0x19, 0x36, 0xa6, 0xe0, 0xb8, 0xa3, - 0x06, 0xa5, 0xb2, 0xe1, 0x78, 0xcd, 0x76, 0x48, 0x12, 0x2a, 0x43, 0x26, 0x95, 0xe5, 0x14, 0x1c, - 0x77, 0xd4, 0xa0, 0xeb, 0xe8, 0x4c, 0x2d, 0x0c, 0xe8, 0xe1, 0x25, 0xa3, 0x7d, 0x28, 0x6b, 0xd5, - 0x61, 0xe9, 0x98, 0xd8, 0x25, 0x2e, 0x96, 0xb0, 0xe7, 0xe3, 0x14, 0x0c, 0x55, 0x75, 0x5d, 0xb8, - 0x24, 0x4a, 0x2a, 0xe8, 0x59, 0x18, 0x11, 0x61, 0xef, 0x99, 0x51, 0x25, 0x9f, 0x3a, 0xa6, 0x5a, - 0xaf, 0x24, 0xc5, 0x58, 0xc7, 0xb1, 0xbf, 0xa7, 0x00, 0xa7, 0x32, 0xac, 0xe2, 0xf9, 0x51, 0xb5, - 0xe9, 0x45, 0xb1, 0x4a, 0xa0, 0xa6, 0x1d, 0x55, 0xbc, 0x1c, 0x2b, 0x0c, 0xba, 0x1f, 0xf8, 0x61, - 0x98, 0x3e, 0x00, 0x85, 0xd5, 0xa9, 0x80, 0x1e, 0x31, 0x15, 0xd9, 0x25, 0x18, 0x68, 0x47, 0x44, - 0x46, 0xb4, 0x53, 0xe7, 0x37, 0xd3, 0xb8, 0x30, 0x08, 0x65, 0x8f, 0x37, 0x95, 0xf2, 0x42, 0x63, - 0x8f, 0xb9, 0xfa, 0x82, 0xc3, 0x68, 0xe7, 0x62, 0xe2, 0x3b, 0x7e, 0x2c, 0x98, 0xe8, 0x24, 0x34, - 0x13, 0x2b, 0xc5, 0x02, 0x6a, 0x7f, 0xa9, 0x08, 0xe7, 0x72, 0xfd, 0x64, 0x68, 0xd7, 0x77, 0x02, - 0xdf, 0x8b, 0x03, 0x65, 0xb3, 0xc0, 0xc3, 0x31, 0x91, 0xd6, 0xd6, 0x8a, 0x28, 0xc7, 0x0a, 0x03, - 0x5d, 0x86, 0x41, 0x26, 0x74, 0xea, 0x48, 0x25, 0xb7, 0x50, 0xe1, 0xf1, 0x39, 0x38, 0xb8, 0xef, - 0x34, 0x9d, 0x8f, 0xc3, 0x40, 0x2b, 0x08, 0x9a, 0xe9, 0x43, 0x8b, 0x76, 0x37, 0x08, 0x9a, 0x98, - 0x01, 0xd1, 0xc7, 0xc4, 0x78, 0xa5, 0x94, 0xf4, 0xd8, 0x71, 0x83, 0x48, 0x1b, 0xb4, 0x27, 0x61, - 0x78, 0x9b, 0xec, 0x87, 0x9e, 0xbf, 0x99, 0x36, 0xde, 0xb8, 0xc1, 0x8b, 0xb1, 0x84, 0x9b, 0x59, - 0x81, 0x86, 0x8f, 0x3b, 0xbf, 0x66, 0xa9, 0xe7, 0x15, 0xf8, 0xbd, 0x45, 0x98, 0xc0, 0x0b, 0x95, - 0x0f, 0x27, 0xe2, 0x76, 0xe7, 0x44, 0x1c, 0x77, 0x7e, 0xcd, 0xde, 0xb3, 0xf1, 0xf3, 0x16, 0x4c, - 0xb0, 0xe0, 0xfb, 0x22, 0x90, 0x8f, 0x17, 0xf8, 0x27, 0xc0, 0xe2, 0x3d, 0x0e, 0x83, 0x21, 0x6d, - 0x34, 0x9d, 0x43, 0x8e, 0xf5, 0x04, 0x73, 0x18, 0x3a, 0x0f, 0x03, 0xac, 0x0b, 0x74, 0xf2, 0x46, - 0x79, 0xfa, 0x9d, 0x8a, 0x13, 0x3b, 0x98, 0x95, 0xb2, 0xe8, 0x14, 0x98, 0xb4, 0x9a, 0x1e, 0xef, - 0x74, 0xa2, 0x12, 0xfc, 0x60, 0x44, 0xa7, 0xc8, 0xec, 0xda, 0xfb, 0x8b, 0x4e, 0x91, 0x4d, 0xb2, - 0xfb, 0xf3, 0xe9, 0x0f, 0x0a, 0x70, 0x31, 0xb3, 0x5e, 0xdf, 0xd1, 0x29, 0xba, 0xd7, 0x7e, 0x98, - 0x41, 0xda, 0x8b, 0x27, 0x68, 0x1a, 0x37, 0xd0, 0x2f, 0x87, 0x39, 0xd8, 0x47, 0xd0, 0x88, 0xcc, - 0x21, 0xfb, 0x80, 0x04, 0x8d, 0xc8, 0xec, 0x5b, 0xce, 0xf3, 0xef, 0xcf, 0x0a, 0x39, 0xdf, 0xc2, - 0x1e, 0x82, 0x57, 0xe8, 0x39, 0xc3, 0x80, 0x91, 0xe0, 0x98, 0x47, 0xf9, 0x19, 0xc3, 0xcb, 0xb0, - 0x82, 0xa2, 0x79, 0x98, 0xd8, 0xf1, 0x7c, 0x7a, 0xf8, 0xec, 0x9b, 0x8c, 0x9f, 0x8a, 0xe9, 0xb3, - 0x62, 0x82, 0x71, 0x1a, 0x1f, 0x79, 0x5a, 0x40, 0x89, 0x42, 0x7e, 0x56, 0xe6, 0xdc, 0xde, 0xce, - 0x99, 0xea, 0x52, 0x35, 0x8a, 0x19, 0xc1, 0x25, 0x56, 0xb4, 0xf7, 0x7f, 0xb1, 0xff, 0xf7, 0xff, - 0x68, 0xf6, 0xdb, 0x7f, 0xe6, 0x55, 0x18, 0x7b, 0x60, 0x81, 0xaf, 0xfd, 0x95, 0x22, 0x3c, 0xda, - 0x65, 0xdb, 0xf3, 0xb3, 0xde, 0x98, 0x03, 0xed, 0xac, 0xef, 0x98, 0x87, 0x1a, 0x9c, 0xde, 0x68, - 0x37, 0x9b, 0xfb, 0xcc, 0xfa, 0x9c, 0xb8, 0x12, 0x43, 0xf0, 0x94, 0xe7, 0x65, 0xc2, 0xa3, 0xe5, - 0x0c, 0x1c, 0x9c, 0x59, 0x93, 0x32, 0xf4, 0xf4, 0x26, 0xd9, 0x57, 0xa4, 0x52, 0x0c, 0x3d, 0xd6, - 0x81, 0xd8, 0xc4, 0x45, 0xd7, 0x60, 0xca, 0xd9, 0x75, 0x3c, 0x1e, 0x95, 0x53, 0x12, 0xe0, 0x1c, - 0xbd, 0x92, 0xd3, 0xcd, 0xa7, 0x11, 0x70, 0x67, 0x1d, 0xf4, 0x06, 0xa0, 0x40, 0x64, 0x95, 0xbf, - 0x46, 0x7c, 0xa1, 0xd5, 0x62, 0x73, 0x57, 0x4c, 0x8e, 0x84, 0x5b, 0x1d, 0x18, 0x38, 0xa3, 0x56, - 0x2a, 0x40, 0xc3, 0x50, 0x7e, 0x80, 0x86, 0xee, 0xe7, 0x62, 0xcf, 0xfc, 0x00, 0xff, 0xc5, 0xa2, - 0xd7, 0x17, 0x67, 0xf2, 0xcd, 0x38, 0x63, 0xaf, 0x32, 0x83, 0x2e, 0x2e, 0xc3, 0xd3, 0x62, 0x25, - 0x9c, 0xd1, 0x0c, 0xba, 0x12, 0x20, 0x36, 0x71, 0xf9, 0x82, 0x88, 0x12, 0x17, 0x3d, 0x83, 0xc5, - 0x17, 0xc1, 0x50, 0x14, 0x06, 0xfa, 0x0c, 0x0c, 0xbb, 0xde, 0xae, 0x17, 0x05, 0xa1, 0x58, 0xe9, - 0x47, 0x54, 0x17, 0x24, 0xe7, 0x60, 0x85, 0x93, 0xc1, 0x92, 0x9e, 0xfd, 0xbd, 0x05, 0x18, 0x93, - 0x2d, 0xbe, 0xd9, 0x0e, 0x62, 0xe7, 0x04, 0xae, 0xe5, 0x6b, 0xc6, 0xb5, 0xfc, 0xb1, 0x6e, 0x11, - 0x61, 0x58, 0x97, 0x72, 0xaf, 0xe3, 0x5b, 0xa9, 0xeb, 0xf8, 0x89, 0xde, 0xa4, 0xba, 0x5f, 0xc3, - 0xff, 0xc4, 0x82, 0x29, 0x03, 0xff, 0x04, 0x6e, 0x83, 0x65, 0xf3, 0x36, 0x78, 0xac, 0xe7, 0x37, - 0xe4, 0xdc, 0x02, 0xdf, 0x59, 0x4c, 0xf5, 0x9d, 0x9d, 0xfe, 0xef, 0xc2, 0xc0, 0x96, 0x13, 0xba, - 0xdd, 0x22, 0x60, 0x77, 0x54, 0x9a, 0xbb, 0xee, 0x84, 0x42, 0xad, 0xf7, 0xb4, 0x4a, 0x8a, 0xec, - 0x84, 0xbd, 0x55, 0x7a, 0xac, 0x29, 0xf4, 0x32, 0x0c, 0x45, 0x8d, 0xa0, 0xa5, 0xec, 0xc5, 0x2f, - 0xf1, 0x84, 0xc9, 0xb4, 0xe4, 0xf0, 0x60, 0x16, 0x99, 0xcd, 0xd1, 0x62, 0x2c, 0xf0, 0xd1, 0x5b, - 0x30, 0xc6, 0x7e, 0x29, 0x1b, 0x9b, 0x62, 0x7e, 0xb6, 0x9c, 0xba, 0x8e, 0xc8, 0x0d, 0xd0, 0x8c, - 0x22, 0x6c, 0x92, 0x9a, 0xd9, 0x84, 0xb2, 0xfa, 0xac, 0x87, 0xaa, 0x8f, 0xfb, 0xf7, 0x45, 0x38, - 0x95, 0xb1, 0xe6, 0x50, 0x64, 0xcc, 0xc4, 0xb3, 0x7d, 0x2e, 0xd5, 0xf7, 0x39, 0x17, 0x11, 0x7b, - 0x0d, 0xb9, 0x62, 0x6d, 0xf5, 0xdd, 0xe8, 0xed, 0x88, 0xa4, 0x1b, 0xa5, 0x45, 0xbd, 0x1b, 0xa5, - 0x8d, 0x9d, 0xd8, 0x50, 0xd3, 0x86, 0x54, 0x4f, 0x1f, 0xea, 0x9c, 0xfe, 0x71, 0x11, 0x4e, 0x67, - 0x05, 0xa9, 0x42, 0xdf, 0x92, 0xca, 0x9c, 0xf6, 0x42, 0xbf, 0xe1, 0xad, 0x78, 0x3a, 0x35, 0x2e, - 0x03, 0x5e, 0x98, 0x33, 0x73, 0xa9, 0xf5, 0x1c, 0x66, 0xd1, 0x26, 0x73, 0x3f, 0x0f, 0x79, 0xc6, - 0x3b, 0x79, 0x7c, 0x7c, 0xb2, 0xef, 0x0e, 0x88, 0x54, 0x79, 0x51, 0x4a, 0x7f, 0x2f, 0x8b, 0x7b, - 0xeb, 0xef, 0x65, 0xcb, 0x33, 0x1e, 0x8c, 0x68, 0x5f, 0xf3, 0x50, 0x67, 0x7c, 0x9b, 0xde, 0x56, - 0x5a, 0xbf, 0x1f, 0xea, 0xac, 0xff, 0x90, 0x05, 0x29, 0x6b, 0x68, 0x25, 0x16, 0xb3, 0x72, 0xc5, - 0x62, 0x97, 0x60, 0x20, 0x0c, 0x9a, 0x24, 0x9d, 0xa8, 0x0c, 0x07, 0x4d, 0x82, 0x19, 0x84, 0x62, - 0xc4, 0x89, 0xb0, 0x63, 0x54, 0x7f, 0xc8, 0x89, 0x27, 0xda, 0xe3, 0x30, 0xd8, 0x24, 0xbb, 0xa4, - 0x99, 0xce, 0x27, 0x71, 0x93, 0x16, 0x62, 0x0e, 0xb3, 0x7f, 0x7e, 0x00, 0x2e, 0x74, 0x0d, 0xe0, - 0x40, 0x9f, 0x43, 0x9b, 0x4e, 0x4c, 0xf6, 0x9c, 0xfd, 0x74, 0xe0, 0xf7, 0x6b, 0xbc, 0x18, 0x4b, - 0x38, 0xf3, 0x57, 0xe1, 0xf1, 0x5b, 0x53, 0x42, 0x44, 0x11, 0xb6, 0x55, 0x40, 0x4d, 0xa1, 0x54, - 0xf1, 0x38, 0x84, 0x52, 0xcf, 0x01, 0x44, 0x51, 0x93, 0x1b, 0xbe, 0xb8, 0xc2, 0x11, 0x26, 0x89, - 0xf3, 0x5b, 0xbf, 0x29, 0x20, 0x58, 0xc3, 0x42, 0x15, 0x98, 0x6c, 0x85, 0x41, 0xcc, 0x65, 0xb2, - 0x15, 0x6e, 0x1b, 0x36, 0x68, 0xfa, 0xce, 0xd7, 0x52, 0x70, 0xdc, 0x51, 0x03, 0xbd, 0x08, 0x23, - 0xc2, 0x9f, 0xbe, 0x16, 0x04, 0x4d, 0x21, 0x06, 0x52, 0xe6, 0x52, 0xf5, 0x04, 0x84, 0x75, 0x3c, - 0xad, 0x1a, 0x13, 0xf4, 0x0e, 0x67, 0x56, 0xe3, 0xc2, 0x5e, 0x0d, 0x2f, 0x15, 0xb0, 0xae, 0xd4, - 0x57, 0xc0, 0xba, 0x44, 0x30, 0x56, 0xee, 0x5b, 0xb7, 0x05, 0x3d, 0x45, 0x49, 0x3f, 0x33, 0x00, - 0xa7, 0xc4, 0xc2, 0x79, 0xd8, 0xcb, 0xe5, 0x76, 0xe7, 0x72, 0x39, 0x0e, 0xd1, 0xd9, 0x87, 0x6b, - 0xe6, 0xa4, 0xd7, 0xcc, 0xf7, 0x59, 0x60, 0xb2, 0x57, 0xe8, 0xff, 0xcf, 0xcd, 0x9c, 0xf1, 0x62, - 0x2e, 0xbb, 0xe6, 0xca, 0x0b, 0xe4, 0x7d, 0xe6, 0xd0, 0xb0, 0xff, 0x93, 0x05, 0x8f, 0xf5, 0xa4, - 0x88, 0x96, 0xa0, 0xcc, 0x78, 0x40, 0xed, 0x75, 0xf6, 0x84, 0xb2, 0x1d, 0x95, 0x80, 0x1c, 0x96, - 0x34, 0xa9, 0x89, 0x96, 0x3a, 0x52, 0x94, 0x3c, 0x99, 0x91, 0xa2, 0xe4, 0x8c, 0x31, 0x3c, 0x0f, - 0x98, 0xa3, 0xe4, 0x97, 0x8a, 0x30, 0xc4, 0x57, 0xfc, 0x09, 0x3c, 0xc3, 0x96, 0x85, 0xdc, 0xb6, - 0x4b, 0x44, 0x3c, 0xde, 0x97, 0xb9, 0x8a, 0x13, 0x3b, 0x9c, 0x4d, 0x50, 0xb7, 0x55, 0x22, 0xe1, - 0x45, 0x9f, 0x03, 0x88, 0xe2, 0xd0, 0xf3, 0x37, 0x69, 0x99, 0x88, 0x95, 0xf8, 0xf1, 0x2e, 0xd4, - 0xea, 0x0a, 0x99, 0xd3, 0x4c, 0x76, 0xae, 0x02, 0x60, 0x8d, 0x22, 0x9a, 0x33, 0xee, 0xcb, 0x99, - 0x94, 0xe0, 0x13, 0x38, 0xd5, 0xe4, 0xf6, 0x9c, 0x79, 0x09, 0xca, 0x8a, 0x78, 0x2f, 0x29, 0xce, - 0xa8, 0xce, 0x5c, 0x7c, 0x0a, 0x26, 0x52, 0x7d, 0x3b, 0x92, 0x10, 0xe8, 0x17, 0x2c, 0x98, 0xe0, - 0x9d, 0x59, 0xf2, 0x77, 0xc5, 0x99, 0xfa, 0x1e, 0x9c, 0x6e, 0x66, 0x9c, 0x6d, 0x62, 0x46, 0xfb, - 0x3f, 0x0b, 0x95, 0xd0, 0x27, 0x0b, 0x8a, 0x33, 0xdb, 0x40, 0x57, 0xe8, 0xba, 0xa5, 0x67, 0x97, - 0xd3, 0x14, 0x6e, 0x8d, 0xa3, 0x7c, 0xcd, 0xf2, 0x32, 0xac, 0xa0, 0xf6, 0x6f, 0x59, 0x30, 0xc5, - 0x7b, 0x7e, 0x83, 0xec, 0xab, 0x1d, 0xfe, 0xb5, 0xec, 0xbb, 0xc8, 0x1a, 0x54, 0xc8, 0xc9, 0x1a, - 0xa4, 0x7f, 0x5a, 0xb1, 0xeb, 0xa7, 0xfd, 0x94, 0x05, 0x62, 0x85, 0x9c, 0xc0, 0x53, 0xfe, 0x1b, - 0xcd, 0xa7, 0xfc, 0x4c, 0xfe, 0x26, 0xc8, 0x79, 0xc3, 0xff, 0xa9, 0x05, 0x93, 0x1c, 0x21, 0xd1, - 0x39, 0x7f, 0x4d, 0xe7, 0xa1, 0x9f, 0xdc, 0xa2, 0x37, 0xc8, 0xfe, 0x5a, 0x50, 0x73, 0xe2, 0xad, - 0xec, 0x8f, 0x32, 0x26, 0x6b, 0xa0, 0xeb, 0x64, 0xb9, 0x72, 0x03, 0x1d, 0x21, 0x61, 0xf1, 0x91, - 0x83, 0xea, 0xdb, 0x5f, 0xb5, 0x00, 0xf1, 0x66, 0x0c, 0xf6, 0x87, 0x32, 0x15, 0xac, 0x54, 0xbb, - 0x2e, 0x92, 0xa3, 0x49, 0x41, 0xb0, 0x86, 0x75, 0x2c, 0xc3, 0x93, 0x32, 0x1c, 0x28, 0xf6, 0x36, - 0x1c, 0x38, 0xc2, 0x88, 0xfe, 0xfe, 0x20, 0xa4, 0x3d, 0x40, 0xd0, 0x1d, 0x18, 0x6d, 0x38, 0x2d, - 0x67, 0xdd, 0x6b, 0x7a, 0xb1, 0x47, 0xa2, 0x6e, 0x16, 0x47, 0x8b, 0x1a, 0x9e, 0x50, 0xf5, 0x6a, - 0x25, 0xd8, 0xa0, 0x83, 0xe6, 0x00, 0x5a, 0xa1, 0xb7, 0xeb, 0x35, 0xc9, 0x26, 0x93, 0x38, 0x30, - 0x47, 0x6a, 0x6e, 0x46, 0x23, 0x4b, 0xb1, 0x86, 0x91, 0xe1, 0xa9, 0x5a, 0x7c, 0xc8, 0x9e, 0xaa, - 0x70, 0x62, 0x9e, 0xaa, 0x03, 0x47, 0xf2, 0x54, 0x2d, 0x1d, 0xd9, 0x53, 0x75, 0xb0, 0x2f, 0x4f, - 0x55, 0x0c, 0x67, 0x25, 0x07, 0x47, 0xff, 0x2f, 0x7b, 0x4d, 0x22, 0xd8, 0x76, 0xee, 0xfd, 0x3d, - 0x73, 0xff, 0x60, 0xf6, 0x2c, 0xce, 0xc4, 0xc0, 0x39, 0x35, 0xd1, 0xa7, 0x61, 0xda, 0x69, 0x36, - 0x83, 0x3d, 0x35, 0xa9, 0x4b, 0x51, 0xc3, 0x69, 0x72, 0x51, 0xfe, 0x30, 0xa3, 0x7a, 0xfe, 0xfe, - 0xc1, 0xec, 0xf4, 0x7c, 0x0e, 0x0e, 0xce, 0xad, 0x8d, 0x5e, 0x83, 0x72, 0x2b, 0x0c, 0x1a, 0x2b, - 0x9a, 0x9b, 0xda, 0x45, 0x3a, 0x80, 0x35, 0x59, 0x78, 0x78, 0x30, 0x3b, 0xa6, 0xfe, 0xb0, 0x0b, - 0x3f, 0xa9, 0x60, 0x6f, 0xc3, 0xa9, 0x3a, 0x09, 0x3d, 0x96, 0x7e, 0xd8, 0x4d, 0xce, 0x8f, 0x35, - 0x28, 0x87, 0xa9, 0x13, 0xb3, 0xaf, 0x28, 0x72, 0x5a, 0xf4, 0x71, 0x79, 0x42, 0x26, 0x84, 0xec, - 0xff, 0x6d, 0xc1, 0xb0, 0xf0, 0xc8, 0x38, 0x01, 0x46, 0x6d, 0xde, 0x90, 0x97, 0xcf, 0x66, 0xdf, - 0x2a, 0xac, 0x33, 0xb9, 0x92, 0xf2, 0x6a, 0x4a, 0x52, 0xfe, 0x58, 0x37, 0x22, 0xdd, 0x65, 0xe4, - 0x7f, 0xa3, 0x08, 0xe3, 0xa6, 0xeb, 0xde, 0x09, 0x0c, 0xc1, 0x2a, 0x0c, 0x47, 0xc2, 0x37, 0xad, - 0x90, 0x6f, 0x91, 0x9d, 0x9e, 0xc4, 0xc4, 0x5a, 0x4b, 0x78, 0xa3, 0x49, 0x22, 0x99, 0x4e, 0x6f, - 0xc5, 0x87, 0xe8, 0xf4, 0xd6, 0xcb, 0x7b, 0x72, 0xe0, 0x38, 0xbc, 0x27, 0xed, 0x2f, 0xb3, 0x9b, - 0x4d, 0x2f, 0x3f, 0x01, 0xa6, 0xe7, 0x9a, 0x79, 0x07, 0xda, 0x5d, 0x56, 0x96, 0xe8, 0x54, 0x0e, - 0xf3, 0xf3, 0x73, 0x16, 0x5c, 0xc8, 0xf8, 0x2a, 0x8d, 0x13, 0x7a, 0x1a, 0x4a, 0x4e, 0xdb, 0xf5, - 0xd4, 0x5e, 0xd6, 0xb4, 0x66, 0xf3, 0xa2, 0x1c, 0x2b, 0x0c, 0xb4, 0x08, 0x53, 0xe4, 0x5e, 0xcb, - 0xe3, 0x0a, 0x43, 0xdd, 0xa4, 0xb2, 0xc8, 0x23, 0x6b, 0x2f, 0xa5, 0x81, 0xb8, 0x13, 0x5f, 0x05, - 0x7b, 0x28, 0xe6, 0x06, 0x7b, 0xf8, 0xfb, 0x16, 0x8c, 0x28, 0xef, 0xac, 0x87, 0x3e, 0xda, 0xdf, - 0x64, 0x8e, 0xf6, 0xa3, 0x5d, 0x46, 0x3b, 0x67, 0x98, 0xff, 0x56, 0x41, 0xf5, 0xb7, 0x16, 0x84, - 0x71, 0x1f, 0x1c, 0xd6, 0xcb, 0x50, 0x6a, 0x85, 0x41, 0x1c, 0x34, 0x82, 0xa6, 0x60, 0xb0, 0xce, - 0x27, 0x51, 0x4f, 0x78, 0xf9, 0xa1, 0xf6, 0x1b, 0x2b, 0x6c, 0x36, 0x7a, 0x41, 0x18, 0x0b, 0xa6, - 0x26, 0x19, 0xbd, 0x20, 0x8c, 0x31, 0x83, 0x20, 0x17, 0x20, 0x76, 0xc2, 0x4d, 0x12, 0xd3, 0x32, - 0x11, 0x65, 0x29, 0xff, 0xf0, 0x68, 0xc7, 0x5e, 0x73, 0xce, 0xf3, 0xe3, 0x28, 0x0e, 0xe7, 0xaa, - 0x7e, 0x7c, 0x2b, 0xe4, 0xef, 0x35, 0x2d, 0x8c, 0x89, 0xa2, 0x85, 0x35, 0xba, 0xd2, 0xad, 0x98, - 0xb5, 0x31, 0x68, 0xea, 0xdf, 0x57, 0x45, 0x39, 0x56, 0x18, 0xf6, 0x4b, 0xec, 0x2a, 0x61, 0x03, - 0x74, 0xb4, 0xb8, 0x1f, 0xdf, 0x51, 0x56, 0x43, 0xcb, 0x94, 0x6f, 0x15, 0x3d, 0xba, 0x48, 0xf7, - 0x93, 0x9b, 0x36, 0xac, 0xbb, 0x18, 0x25, 0x21, 0x48, 0xd0, 0x37, 0x77, 0xd8, 0x54, 0x3c, 0xd3, - 0xe3, 0x0a, 0x38, 0x82, 0x15, 0x05, 0x8b, 0xf6, 0xcf, 0x62, 0xa1, 0x57, 0x6b, 0x62, 0x91, 0x6b, - 0xd1, 0xfe, 0x05, 0x00, 0x27, 0x38, 0xe8, 0xaa, 0x78, 0x8d, 0x73, 0xd1, 0xf4, 0xa3, 0xa9, 0xd7, - 0xb8, 0xfc, 0x7c, 0x4d, 0x98, 0xfd, 0x2c, 0x8c, 0xa8, 0x5c, 0x97, 0x35, 0x9e, 0x42, 0x51, 0xc4, - 0x9c, 0x5a, 0x4a, 0x8a, 0xb1, 0x8e, 0x83, 0xd6, 0x60, 0x22, 0xe2, 0xa2, 0x1e, 0x15, 0x5a, 0x94, - 0x8b, 0xcc, 0x3e, 0x2e, 0x0d, 0x51, 0xea, 0x26, 0xf8, 0x90, 0x15, 0xf1, 0xa3, 0x43, 0xba, 0xf2, - 0xa6, 0x49, 0xa0, 0xd7, 0x61, 0xbc, 0x19, 0x38, 0xee, 0x82, 0xd3, 0x74, 0xfc, 0x06, 0xfb, 0xde, - 0x92, 0x99, 0x32, 0xed, 0xa6, 0x01, 0xc5, 0x29, 0x6c, 0xca, 0xf9, 0xe8, 0x25, 0x22, 0x1c, 0xae, - 0xe3, 0x6f, 0x92, 0x48, 0x64, 0x2e, 0x64, 0x9c, 0xcf, 0xcd, 0x1c, 0x1c, 0x9c, 0x5b, 0x1b, 0xbd, - 0x0c, 0xa3, 0xf2, 0xf3, 0x35, 0xcf, 0xf7, 0xc4, 0xf6, 0x5e, 0x83, 0x61, 0x03, 0x13, 0xed, 0xc1, - 0x19, 0xf9, 0x7f, 0x2d, 0x74, 0x36, 0x36, 0xbc, 0x86, 0x70, 0x07, 0xe5, 0x8e, 0x71, 0xf3, 0xd2, - 0x7b, 0x6b, 0x29, 0x0b, 0xe9, 0xf0, 0x60, 0xf6, 0x92, 0x18, 0xb5, 0x4c, 0x38, 0x9b, 0xc4, 0x6c, - 0xfa, 0x68, 0x05, 0x4e, 0x6d, 0x11, 0xa7, 0x19, 0x6f, 0x2d, 0x6e, 0x91, 0xc6, 0xb6, 0xdc, 0x44, - 0xcc, 0x9f, 0x5e, 0xb3, 0x58, 0xbf, 0xde, 0x89, 0x82, 0xb3, 0xea, 0xa1, 0xb7, 0x61, 0xba, 0xd5, - 0x5e, 0x6f, 0x7a, 0xd1, 0xd6, 0x6a, 0x10, 0x33, 0x6b, 0x14, 0x95, 0x3a, 0x53, 0x38, 0xde, 0xab, - 0x88, 0x05, 0xb5, 0x1c, 0x3c, 0x9c, 0x4b, 0x01, 0xbd, 0x07, 0x67, 0x52, 0x8b, 0x41, 0xb8, 0x1e, - 0x8f, 0xe7, 0x07, 0x17, 0xaf, 0x67, 0x55, 0x10, 0x5e, 0xfc, 0x59, 0x20, 0x9c, 0xdd, 0x04, 0x7a, - 0x01, 0x4a, 0x5e, 0x6b, 0xd9, 0xd9, 0xf1, 0x9a, 0xfb, 0x2c, 0x3a, 0x7a, 0x99, 0x45, 0x0c, 0x2f, - 0x55, 0x6b, 0xbc, 0xec, 0x50, 0xfb, 0x8d, 0x15, 0xe6, 0xfb, 0xb3, 0x46, 0x7a, 0x97, 0x56, 0xd6, - 0x58, 0x39, 0xf4, 0x79, 0x18, 0xd5, 0xd7, 0x9e, 0xb8, 0x96, 0x2e, 0x67, 0x73, 0x3a, 0xda, 0x1a, - 0xe5, 0x8c, 0xa0, 0x5a, 0x87, 0x3a, 0x0c, 0x1b, 0x14, 0x6d, 0x02, 0xd9, 0xa3, 0x82, 0x6e, 0x42, - 0xa9, 0xd1, 0xf4, 0x88, 0x1f, 0x57, 0x6b, 0xdd, 0x02, 0x11, 0x2d, 0x0a, 0x1c, 0x31, 0xcc, 0x22, - 0x86, 0x33, 0x2f, 0xc3, 0x8a, 0x82, 0xfd, 0x2b, 0x05, 0x98, 0xed, 0x11, 0x10, 0x3c, 0x25, 0x34, - 0xb7, 0xfa, 0x12, 0x9a, 0xcf, 0xcb, 0xf4, 0xa1, 0xab, 0x29, 0x49, 0x42, 0x2a, 0x35, 0x68, 0x22, - 0x4f, 0x48, 0xe3, 0xf7, 0x6d, 0xc4, 0xac, 0xcb, 0xdd, 0x07, 0x7a, 0x9a, 0xe1, 0x1b, 0xfa, 0xb6, - 0xc1, 0xfe, 0x9f, 0x2f, 0xb9, 0xba, 0x13, 0xfb, 0xcb, 0x05, 0x38, 0xa3, 0x86, 0xf0, 0xeb, 0x77, - 0xe0, 0x6e, 0x77, 0x0e, 0xdc, 0x31, 0x68, 0x9e, 0xec, 0x5b, 0x30, 0xc4, 0x23, 0x2b, 0xf5, 0xc1, - 0x36, 0x3d, 0x6e, 0x06, 0x21, 0x54, 0x97, 0xbb, 0x11, 0x88, 0xf0, 0xbb, 0x2d, 0x98, 0x58, 0x5b, - 0xac, 0xd5, 0x83, 0xc6, 0x36, 0x89, 0xe7, 0x39, 0x9b, 0x8b, 0x05, 0xd7, 0x64, 0x3d, 0x20, 0x37, - 0x94, 0xc5, 0x67, 0x5d, 0x82, 0x81, 0xad, 0x20, 0x8a, 0xd3, 0x6a, 0xe9, 0xeb, 0x41, 0x14, 0x63, - 0x06, 0xb1, 0x7f, 0xdb, 0x82, 0x41, 0x96, 0x30, 0xbb, 0x57, 0xca, 0xf6, 0x7e, 0xbe, 0x0b, 0xbd, - 0x08, 0x43, 0x64, 0x63, 0x83, 0x34, 0x62, 0x31, 0xab, 0xd2, 0x8f, 0x78, 0x68, 0x89, 0x95, 0x52, - 0x56, 0x81, 0x35, 0xc6, 0xff, 0x62, 0x81, 0x8c, 0xee, 0x42, 0x39, 0xf6, 0x76, 0xc8, 0xbc, 0xeb, - 0x0a, 0xc5, 0xde, 0x03, 0xf8, 0x42, 0xaf, 0x49, 0x02, 0x38, 0xa1, 0x65, 0x7f, 0xa9, 0x00, 0x90, - 0xc4, 0xd5, 0xe8, 0xf5, 0x89, 0x0b, 0x1d, 0x2a, 0x9f, 0xcb, 0x19, 0x2a, 0x1f, 0x94, 0x10, 0xcc, - 0xd0, 0xf7, 0xa8, 0x61, 0x2a, 0xf6, 0x35, 0x4c, 0x03, 0x47, 0x19, 0xa6, 0x45, 0x98, 0x4a, 0xe2, - 0x82, 0x98, 0x61, 0x91, 0xd8, 0xd3, 0x66, 0x2d, 0x0d, 0xc4, 0x9d, 0xf8, 0x36, 0x81, 0x4b, 0x2a, - 0x3c, 0x82, 0xb8, 0x6b, 0x98, 0xdd, 0xe8, 0x11, 0xb2, 0xf7, 0x27, 0x3a, 0xad, 0x42, 0xae, 0x4e, - 0xeb, 0x47, 0x2d, 0x38, 0x9d, 0x6e, 0x87, 0x39, 0xf2, 0x7d, 0xd1, 0x82, 0x33, 0x4c, 0xb3, 0xc7, - 0x5a, 0xed, 0xd4, 0x23, 0xbe, 0xd0, 0x35, 0xe4, 0x43, 0x4e, 0x8f, 0x13, 0x87, 0xf5, 0x95, 0x2c, - 0xd2, 0x38, 0xbb, 0x45, 0xfb, 0x3f, 0x16, 0x60, 0x3a, 0x2f, 0x56, 0x04, 0x33, 0x2b, 0x77, 0xee, - 0xd5, 0xb7, 0xc9, 0x9e, 0x30, 0xde, 0x4d, 0xcc, 0xca, 0x79, 0x31, 0x96, 0xf0, 0x74, 0x8c, 0xe7, - 0x42, 0x7f, 0x31, 0x9e, 0xd1, 0x16, 0x4c, 0xed, 0x6d, 0x11, 0xff, 0xb6, 0x1f, 0x39, 0xb1, 0x17, - 0x6d, 0x78, 0x2c, 0xf7, 0x3a, 0x5f, 0x37, 0xaf, 0x48, 0x13, 0xdb, 0xbb, 0x69, 0x84, 0xc3, 0x83, - 0xd9, 0x0b, 0x46, 0x41, 0xd2, 0x65, 0x7e, 0x90, 0xe0, 0x4e, 0xa2, 0x9d, 0x21, 0xb2, 0x07, 0x1e, - 0x62, 0x88, 0x6c, 0xfb, 0x8b, 0x16, 0x9c, 0xcb, 0x4d, 0x61, 0x87, 0xae, 0x40, 0xc9, 0x69, 0x79, - 0x5c, 0x04, 0x2a, 0x8e, 0x51, 0xf6, 0x94, 0xaf, 0x55, 0xb9, 0x00, 0x54, 0x41, 0x55, 0x6a, 0xdd, - 0x42, 0x6e, 0x6a, 0xdd, 0x9e, 0x99, 0x72, 0xed, 0xef, 0xb2, 0x40, 0xb8, 0xc4, 0xf5, 0x71, 0x76, - 0xbf, 0x25, 0x33, 0x93, 0x1b, 0x69, 0x34, 0x2e, 0xe5, 0xfb, 0x08, 0x8a, 0xe4, 0x19, 0x8a, 0x57, - 0x32, 0x52, 0x66, 0x18, 0xb4, 0x6c, 0x17, 0x04, 0xb4, 0x42, 0x98, 0x00, 0xb1, 0x77, 0x6f, 0x9e, - 0x03, 0x70, 0x19, 0xae, 0x96, 0x9f, 0x58, 0xdd, 0xcc, 0x15, 0x05, 0xc1, 0x1a, 0x96, 0xfd, 0x6f, - 0x0b, 0x30, 0x22, 0xd3, 0x36, 0xb4, 0xfd, 0x7e, 0x9e, 0xf9, 0x47, 0xca, 0xe3, 0xc6, 0x12, 0x7a, - 0x53, 0xc2, 0xb5, 0x44, 0x3a, 0x92, 0x24, 0xf4, 0x96, 0x00, 0x9c, 0xe0, 0xd0, 0x5d, 0x14, 0xb5, - 0xd7, 0x19, 0x7a, 0xca, 0x81, 0xab, 0xce, 0x8b, 0xb1, 0x84, 0xa3, 0x4f, 0xc3, 0x24, 0xaf, 0x17, - 0x06, 0x2d, 0x67, 0x93, 0xcb, 0x96, 0x07, 0x95, 0xe7, 0xf5, 0xe4, 0x4a, 0x0a, 0x76, 0x78, 0x30, - 0x7b, 0x3a, 0x5d, 0xc6, 0x94, 0x26, 0x1d, 0x54, 0x98, 0x21, 0x06, 0x6f, 0x84, 0xee, 0xfe, 0x0e, - 0xfb, 0x8d, 0x04, 0x84, 0x75, 0x3c, 0xfb, 0xf3, 0x80, 0x3a, 0x13, 0x58, 0xa0, 0x37, 0xb8, 0xf5, - 0x9d, 0x17, 0x12, 0xb7, 0x9b, 0x12, 0x45, 0xf7, 0x2f, 0x96, 0xbe, 0x17, 0xbc, 0x16, 0x56, 0xf5, - 0xed, 0xbf, 0x5c, 0x84, 0xc9, 0xb4, 0xb7, 0x29, 0xba, 0x0e, 0x43, 0x9c, 0xf5, 0x10, 0xe4, 0xbb, - 0xe8, 0xe8, 0x35, 0x1f, 0x55, 0x76, 0x08, 0x0b, 0xee, 0x45, 0xd4, 0x47, 0x6f, 0xc3, 0x88, 0x1b, - 0xec, 0xf9, 0x7b, 0x4e, 0xe8, 0xce, 0xd7, 0xaa, 0x62, 0x39, 0x67, 0xbe, 0x7b, 0x2a, 0x09, 0x9a, - 0xee, 0xf7, 0xca, 0xf4, 0x51, 0x09, 0x08, 0xeb, 0xe4, 0xd0, 0x1a, 0x8b, 0xb7, 0xbb, 0xe1, 0x6d, - 0xae, 0x38, 0xad, 0x6e, 0xa6, 0xd8, 0x8b, 0x12, 0x49, 0xa3, 0x3c, 0x26, 0x82, 0xf2, 0x72, 0x00, - 0x4e, 0x08, 0xa1, 0x6f, 0x81, 0x53, 0x51, 0x8e, 0xa8, 0x34, 0x2f, 0x9f, 0x51, 0x37, 0xe9, 0xe1, - 0xc2, 0x23, 0xf4, 0x45, 0x9a, 0x25, 0x54, 0xcd, 0x6a, 0xc6, 0xfe, 0xd5, 0x53, 0x60, 0x6c, 0x62, - 0x23, 0xbd, 0x9d, 0x75, 0x4c, 0xe9, 0xed, 0x30, 0x94, 0xc8, 0x4e, 0x2b, 0xde, 0xaf, 0x78, 0x61, - 0xb7, 0xfc, 0xa8, 0x4b, 0x02, 0xa7, 0x93, 0xa6, 0x84, 0x60, 0x45, 0x27, 0x3b, 0x07, 0x61, 0xf1, - 0x6b, 0x98, 0x83, 0x70, 0xe0, 0x04, 0x73, 0x10, 0xae, 0xc2, 0xf0, 0xa6, 0x17, 0x63, 0xd2, 0x0a, - 0x04, 0xd3, 0x9f, 0xb9, 0x0e, 0xaf, 0x71, 0x94, 0xce, 0x6c, 0x57, 0x02, 0x80, 0x25, 0x11, 0xf4, - 0x86, 0xda, 0x81, 0x43, 0xf9, 0x6f, 0xe6, 0x4e, 0x65, 0x72, 0xe6, 0x1e, 0x14, 0x99, 0x06, 0x87, - 0x1f, 0x34, 0xd3, 0xe0, 0xb2, 0xcc, 0x0f, 0x58, 0xca, 0xf7, 0x9b, 0x60, 0xe9, 0xff, 0x7a, 0x64, - 0x05, 0xbc, 0xa3, 0xe7, 0x54, 0x2c, 0xe7, 0x9f, 0x04, 0x2a, 0x5d, 0x62, 0x9f, 0x99, 0x14, 0xbf, - 0xcb, 0x82, 0x33, 0xad, 0xac, 0xf4, 0xa2, 0x42, 0xef, 0xfa, 0x62, 0xdf, 0xf9, 0x53, 0x8d, 0x06, - 0x99, 0xc8, 0x25, 0x13, 0x0d, 0x67, 0x37, 0x47, 0x07, 0x3a, 0x5c, 0x77, 0x45, 0x2a, 0xc0, 0xc7, - 0x73, 0x52, 0x32, 0x76, 0x49, 0xc4, 0xb8, 0x96, 0x91, 0xfe, 0xef, 0xa3, 0x79, 0xe9, 0xff, 0xfa, - 0x4e, 0xfa, 0xf7, 0x86, 0x4a, 0xc6, 0x38, 0x96, 0xbf, 0x94, 0x78, 0xaa, 0xc5, 0x9e, 0x29, 0x18, - 0xdf, 0x50, 0x29, 0x18, 0xbb, 0x44, 0x84, 0xe4, 0x09, 0x16, 0x7b, 0x26, 0x5e, 0xd4, 0x92, 0x27, - 0x4e, 0x1c, 0x4f, 0xf2, 0x44, 0xe3, 0xaa, 0xe1, 0xf9, 0xfb, 0x9e, 0xea, 0x71, 0xd5, 0x18, 0x74, - 0xbb, 0x5f, 0x36, 0x3c, 0x51, 0xe4, 0xd4, 0x03, 0x25, 0x8a, 0xbc, 0xa3, 0x27, 0x5e, 0x44, 0x3d, - 0x32, 0x0b, 0x52, 0xa4, 0x3e, 0xd3, 0x2d, 0xde, 0xd1, 0x2f, 0xc0, 0x53, 0xf9, 0x74, 0xd5, 0x3d, - 0xd7, 0x49, 0x37, 0xf3, 0x0a, 0xec, 0x48, 0xe3, 0x78, 0xfa, 0x64, 0xd2, 0x38, 0x9e, 0x39, 0xf6, - 0x34, 0x8e, 0x67, 0x4f, 0x20, 0x8d, 0xe3, 0x23, 0x27, 0x98, 0xc6, 0xf1, 0x0e, 0x33, 0x56, 0xe0, - 0x81, 0x45, 0x44, 0x04, 0xcb, 0xec, 0x68, 0x89, 0x59, 0xd1, 0x47, 0xf8, 0xc7, 0x29, 0x10, 0x4e, - 0x48, 0x65, 0xa4, 0x87, 0x9c, 0x7e, 0x08, 0xe9, 0x21, 0x57, 0x93, 0xf4, 0x90, 0xe7, 0xf2, 0xa7, - 0x3a, 0xc3, 0x48, 0x3c, 0x27, 0x29, 0xe4, 0x1d, 0x3d, 0x99, 0xe3, 0xa3, 0x5d, 0x84, 0xea, 0x59, - 0x82, 0xc7, 0x2e, 0x29, 0x1c, 0x5f, 0xe7, 0x29, 0x1c, 0xcf, 0xe7, 0x9f, 0xe4, 0xe9, 0xeb, 0xce, - 0x4c, 0xdc, 0xf8, 0x3d, 0x05, 0xb8, 0xd8, 0x7d, 0x5f, 0x24, 0x52, 0xcf, 0x5a, 0xa2, 0xdb, 0x4b, - 0x49, 0x3d, 0xf9, 0xdb, 0x2a, 0xc1, 0xea, 0x3b, 0xe6, 0xd4, 0x35, 0x98, 0x52, 0x56, 0xe0, 0x4d, - 0xaf, 0xb1, 0xaf, 0xe5, 0xaa, 0x57, 0x9e, 0xb3, 0xf5, 0x34, 0x02, 0xee, 0xac, 0x83, 0xe6, 0x61, - 0xc2, 0x28, 0xac, 0x56, 0xc4, 0x1b, 0x4a, 0x89, 0x59, 0xeb, 0x26, 0x18, 0xa7, 0xf1, 0xed, 0x9f, - 0xb4, 0xe0, 0x91, 0x9c, 0x0c, 0x49, 0x7d, 0x87, 0x54, 0xda, 0x80, 0x89, 0x96, 0x59, 0xb5, 0x47, - 0xe4, 0x35, 0x23, 0x0f, 0x93, 0xea, 0x6b, 0x0a, 0x80, 0xd3, 0x44, 0xed, 0x3f, 0xb1, 0xe0, 0x42, - 0x57, 0x83, 0x2c, 0x84, 0xe1, 0xec, 0xe6, 0x4e, 0xe4, 0x2c, 0x86, 0xc4, 0x25, 0x7e, 0xec, 0x39, - 0xcd, 0x7a, 0x8b, 0x34, 0x34, 0xb9, 0x35, 0xb3, 0x6c, 0xba, 0xb6, 0x52, 0x9f, 0xef, 0xc4, 0xc0, - 0x39, 0x35, 0xd1, 0x32, 0xa0, 0x4e, 0x88, 0x98, 0x61, 0x16, 0x9d, 0xb5, 0x93, 0x1e, 0xce, 0xa8, - 0x81, 0x5e, 0x82, 0x31, 0x65, 0xe8, 0xa5, 0xcd, 0x38, 0x3b, 0x80, 0xb1, 0x0e, 0xc0, 0x26, 0xde, - 0xc2, 0x95, 0x5f, 0xff, 0xdd, 0x8b, 0x1f, 0xf9, 0xcd, 0xdf, 0xbd, 0xf8, 0x91, 0xdf, 0xfa, 0xdd, - 0x8b, 0x1f, 0xf9, 0xb6, 0xfb, 0x17, 0xad, 0x5f, 0xbf, 0x7f, 0xd1, 0xfa, 0xcd, 0xfb, 0x17, 0xad, - 0xdf, 0xba, 0x7f, 0xd1, 0xfa, 0x9d, 0xfb, 0x17, 0xad, 0x2f, 0xfd, 0xde, 0xc5, 0x8f, 0xbc, 0x55, - 0xd8, 0x7d, 0xf6, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xb2, 0x8d, 0x5d, 0x90, 0x7d, 0xfc, 0x00, - 0x00, + // 13620 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x70, 0x24, 0x59, + 0x5a, 0x18, 0xba, 0x59, 0xa5, 0x47, 0xd5, 0xa7, 0xf7, 0xe9, 0xc7, 0xa8, 0x35, 0xdd, 0xad, 0x9e, + 0x9c, 0xdd, 0x9e, 0x9e, 0x9d, 0x19, 0xf5, 0xce, 0x6b, 0x67, 0x98, 0x99, 0x1d, 0x90, 0x54, 0x52, + 0x77, 0x4d, 0xb7, 0xd4, 0x35, 0xa7, 0xd4, 0xdd, 0xbb, 0xc3, 0xec, 0xde, 0x4d, 0x55, 0x1e, 0x49, + 0x39, 0x2a, 0x65, 0xd6, 0x64, 0x66, 0x49, 0xad, 0xb9, 0x10, 0x97, 0xbb, 0x3c, 0xf7, 0x02, 0x37, + 0x36, 0x6c, 0xc2, 0x0f, 0x20, 0xb0, 0x03, 0xe3, 0x00, 0x0c, 0x76, 0x18, 0x83, 0x01, 0xef, 0x62, + 0x1b, 0x83, 0xed, 0xc0, 0xfe, 0x81, 0xb1, 0xc3, 0xf6, 0x12, 0x41, 0x58, 0x86, 0xc6, 0x61, 0x62, + 0x7f, 0x18, 0x08, 0x83, 0x7f, 0x58, 0x26, 0x8c, 0xe3, 0x3c, 0xf3, 0x9c, 0xac, 0xcc, 0xaa, 0x52, + 0x8f, 0x5a, 0x3b, 0x6c, 0xcc, 0xbf, 0xaa, 0xf3, 0x7d, 0xe7, 0x3b, 0x27, 0xcf, 0xf3, 0x3b, 0xdf, + 0x13, 0x5e, 0xdd, 0x7e, 0x39, 0x9a, 0xf3, 0x82, 0xab, 0xdb, 0xed, 0x75, 0x12, 0xfa, 0x24, 0x26, + 0xd1, 0xd5, 0x5d, 0xe2, 0xbb, 0x41, 0x78, 0x55, 0x00, 0x9c, 0x96, 0x77, 0xb5, 0x11, 0x84, 0xe4, + 0xea, 0xee, 0xb3, 0x57, 0x37, 0x89, 0x4f, 0x42, 0x27, 0x26, 0xee, 0x5c, 0x2b, 0x0c, 0xe2, 0x00, + 0x21, 0x8e, 0x33, 0xe7, 0xb4, 0xbc, 0x39, 0x8a, 0x33, 0xb7, 0xfb, 0xec, 0xcc, 0x33, 0x9b, 0x5e, + 0xbc, 0xd5, 0x5e, 0x9f, 0x6b, 0x04, 0x3b, 0x57, 0x37, 0x83, 0xcd, 0xe0, 0x2a, 0x43, 0x5d, 0x6f, + 0x6f, 0xb0, 0x7f, 0xec, 0x0f, 0xfb, 0xc5, 0x49, 0xcc, 0xbc, 0x90, 0x34, 0xb3, 0xe3, 0x34, 0xb6, + 0x3c, 0x9f, 0x84, 0xfb, 0x57, 0x5b, 0xdb, 0x9b, 0xac, 0xdd, 0x90, 0x44, 0x41, 0x3b, 0x6c, 0x90, + 0x74, 0xc3, 0x5d, 0x6b, 0x45, 0x57, 0x77, 0x48, 0xec, 0x64, 0x74, 0x77, 0xe6, 0x6a, 0x5e, 0xad, + 0xb0, 0xed, 0xc7, 0xde, 0x4e, 0x67, 0x33, 0x9f, 0xec, 0x55, 0x21, 0x6a, 0x6c, 0x91, 0x1d, 0xa7, + 0xa3, 0xde, 0xf3, 0x79, 0xf5, 0xda, 0xb1, 0xd7, 0xbc, 0xea, 0xf9, 0x71, 0x14, 0x87, 0xe9, 0x4a, + 0xf6, 0x57, 0x2d, 0xb8, 0x34, 0x7f, 0xb7, 0xbe, 0xd4, 0x74, 0xa2, 0xd8, 0x6b, 0x2c, 0x34, 0x83, + 0xc6, 0x76, 0x3d, 0x0e, 0x42, 0x72, 0x27, 0x68, 0xb6, 0x77, 0x48, 0x9d, 0x0d, 0x04, 0x7a, 0x1a, + 0x4a, 0xbb, 0xec, 0x7f, 0xb5, 0x32, 0x6d, 0x5d, 0xb2, 0xae, 0x94, 0x17, 0x26, 0x7f, 0xe3, 0x60, + 0xf6, 0x23, 0xf7, 0x0f, 0x66, 0x4b, 0x77, 0x44, 0x39, 0x56, 0x18, 0xe8, 0x32, 0x0c, 0x6d, 0x44, + 0x6b, 0xfb, 0x2d, 0x32, 0x5d, 0x60, 0xb8, 0xe3, 0x02, 0x77, 0x68, 0xb9, 0x4e, 0x4b, 0xb1, 0x80, + 0xa2, 0xab, 0x50, 0x6e, 0x39, 0x61, 0xec, 0xc5, 0x5e, 0xe0, 0x4f, 0x17, 0x2f, 0x59, 0x57, 0x06, + 0x17, 0xa6, 0x04, 0x6a, 0xb9, 0x26, 0x01, 0x38, 0xc1, 0xa1, 0xdd, 0x08, 0x89, 0xe3, 0xde, 0xf2, + 0x9b, 0xfb, 0xd3, 0x03, 0x97, 0xac, 0x2b, 0xa5, 0xa4, 0x1b, 0x58, 0x94, 0x63, 0x85, 0x61, 0xff, + 0x70, 0x01, 0x4a, 0xf3, 0x1b, 0x1b, 0x9e, 0xef, 0xc5, 0xfb, 0xe8, 0x0e, 0x8c, 0xfa, 0x81, 0x4b, + 0xe4, 0x7f, 0xf6, 0x15, 0x23, 0xcf, 0x5d, 0x9a, 0xeb, 0x5c, 0x4a, 0x73, 0xab, 0x1a, 0xde, 0xc2, + 0xe4, 0xfd, 0x83, 0xd9, 0x51, 0xbd, 0x04, 0x1b, 0x74, 0x10, 0x86, 0x91, 0x56, 0xe0, 0x2a, 0xb2, + 0x05, 0x46, 0x76, 0x36, 0x8b, 0x6c, 0x2d, 0x41, 0x5b, 0x98, 0xb8, 0x7f, 0x30, 0x3b, 0xa2, 0x15, + 0x60, 0x9d, 0x08, 0x5a, 0x87, 0x09, 0xfa, 0xd7, 0x8f, 0x3d, 0x45, 0xb7, 0xc8, 0xe8, 0x3e, 0x9e, + 0x47, 0x57, 0x43, 0x5d, 0x38, 0x75, 0xff, 0x60, 0x76, 0x22, 0x55, 0x88, 0xd3, 0x04, 0xed, 0xf7, + 0x60, 0x7c, 0x3e, 0x8e, 0x9d, 0xc6, 0x16, 0x71, 0xf9, 0x0c, 0xa2, 0x17, 0x60, 0xc0, 0x77, 0x76, + 0x88, 0x98, 0xdf, 0x4b, 0x62, 0x60, 0x07, 0x56, 0x9d, 0x1d, 0x72, 0x78, 0x30, 0x3b, 0x79, 0xdb, + 0xf7, 0xde, 0x6d, 0x8b, 0x55, 0x41, 0xcb, 0x30, 0xc3, 0x46, 0xcf, 0x01, 0xb8, 0x64, 0xd7, 0x6b, + 0x90, 0x9a, 0x13, 0x6f, 0x89, 0xf9, 0x46, 0xa2, 0x2e, 0x54, 0x14, 0x04, 0x6b, 0x58, 0xf6, 0x3d, + 0x28, 0xcf, 0xef, 0x06, 0x9e, 0x5b, 0x0b, 0xdc, 0x08, 0x6d, 0xc3, 0x44, 0x2b, 0x24, 0x1b, 0x24, + 0x54, 0x45, 0xd3, 0xd6, 0xa5, 0xe2, 0x95, 0x91, 0xe7, 0xae, 0x64, 0x7e, 0xac, 0x89, 0xba, 0xe4, + 0xc7, 0xe1, 0xfe, 0xc2, 0x23, 0xa2, 0xbd, 0x89, 0x14, 0x14, 0xa7, 0x29, 0xdb, 0xff, 0xbc, 0x00, + 0x67, 0xe6, 0xdf, 0x6b, 0x87, 0xa4, 0xe2, 0x45, 0xdb, 0xe9, 0x15, 0xee, 0x7a, 0xd1, 0xf6, 0x6a, + 0x32, 0x02, 0x6a, 0x69, 0x55, 0x44, 0x39, 0x56, 0x18, 0xe8, 0x19, 0x18, 0xa6, 0xbf, 0x6f, 0xe3, + 0xaa, 0xf8, 0xe4, 0x53, 0x02, 0x79, 0xa4, 0xe2, 0xc4, 0x4e, 0x85, 0x83, 0xb0, 0xc4, 0x41, 0x2b, + 0x30, 0xd2, 0x60, 0x1b, 0x72, 0x73, 0x25, 0x70, 0x09, 0x9b, 0xcc, 0xf2, 0xc2, 0x53, 0x14, 0x7d, + 0x31, 0x29, 0x3e, 0x3c, 0x98, 0x9d, 0xe6, 0x7d, 0x13, 0x24, 0x34, 0x18, 0xd6, 0xeb, 0x23, 0x5b, + 0xed, 0xaf, 0x01, 0x46, 0x09, 0x32, 0xf6, 0xd6, 0x15, 0x6d, 0xab, 0x0c, 0xb2, 0xad, 0x32, 0x9a, + 0xbd, 0x4d, 0xd0, 0xb3, 0x30, 0xb0, 0xed, 0xf9, 0xee, 0xf4, 0x10, 0xa3, 0x75, 0x81, 0xce, 0xf9, + 0x0d, 0xcf, 0x77, 0x0f, 0x0f, 0x66, 0xa7, 0x8c, 0xee, 0xd0, 0x42, 0xcc, 0x50, 0xed, 0x3f, 0xb1, + 0x60, 0x96, 0xc1, 0x96, 0xbd, 0x26, 0xa9, 0x91, 0x30, 0xf2, 0xa2, 0x98, 0xf8, 0xb1, 0x31, 0xa0, + 0xcf, 0x01, 0x44, 0xa4, 0x11, 0x92, 0x58, 0x1b, 0x52, 0xb5, 0x30, 0xea, 0x0a, 0x82, 0x35, 0x2c, + 0x7a, 0x20, 0x44, 0x5b, 0x4e, 0xc8, 0xd6, 0x97, 0x18, 0x58, 0x75, 0x20, 0xd4, 0x25, 0x00, 0x27, + 0x38, 0xc6, 0x81, 0x50, 0xec, 0x75, 0x20, 0xa0, 0x4f, 0xc1, 0x44, 0xd2, 0x58, 0xd4, 0x72, 0x1a, + 0x72, 0x00, 0xd9, 0x96, 0xa9, 0x9b, 0x20, 0x9c, 0xc6, 0xb5, 0xff, 0x8e, 0x25, 0x16, 0x0f, 0xfd, + 0xea, 0x0f, 0xf8, 0xb7, 0xda, 0xbf, 0x6c, 0xc1, 0xf0, 0x82, 0xe7, 0xbb, 0x9e, 0xbf, 0x89, 0x3e, + 0x0f, 0x25, 0x7a, 0x37, 0xb9, 0x4e, 0xec, 0x88, 0x73, 0xef, 0x13, 0xda, 0xde, 0x52, 0x57, 0xc5, + 0x5c, 0x6b, 0x7b, 0x93, 0x16, 0x44, 0x73, 0x14, 0x9b, 0xee, 0xb6, 0x5b, 0xeb, 0xef, 0x90, 0x46, + 0xbc, 0x42, 0x62, 0x27, 0xf9, 0x9c, 0xa4, 0x0c, 0x2b, 0xaa, 0xe8, 0x06, 0x0c, 0xc5, 0x4e, 0xb8, + 0x49, 0x62, 0x71, 0x00, 0x66, 0x1e, 0x54, 0xbc, 0x26, 0xa6, 0x3b, 0x92, 0xf8, 0x0d, 0x92, 0x5c, + 0x0b, 0x6b, 0xac, 0x2a, 0x16, 0x24, 0xec, 0x1f, 0x1c, 0x86, 0x73, 0x8b, 0xf5, 0x6a, 0xce, 0xba, + 0xba, 0x0c, 0x43, 0x6e, 0xe8, 0xed, 0x92, 0x50, 0x8c, 0xb3, 0xa2, 0x52, 0x61, 0xa5, 0x58, 0x40, + 0xd1, 0xcb, 0x30, 0xca, 0x2f, 0xa4, 0xeb, 0x8e, 0xef, 0x36, 0xe5, 0x10, 0x9f, 0x16, 0xd8, 0xa3, + 0x77, 0x34, 0x18, 0x36, 0x30, 0x8f, 0xb8, 0xa8, 0x2e, 0xa7, 0x36, 0x63, 0xde, 0x65, 0xf7, 0x45, + 0x0b, 0x26, 0x79, 0x33, 0xf3, 0x71, 0x1c, 0x7a, 0xeb, 0xed, 0x98, 0x44, 0xd3, 0x83, 0xec, 0xa4, + 0x5b, 0xcc, 0x1a, 0xad, 0xdc, 0x11, 0x98, 0xbb, 0x93, 0xa2, 0xc2, 0x0f, 0xc1, 0x69, 0xd1, 0xee, + 0x64, 0x1a, 0x8c, 0x3b, 0x9a, 0x45, 0xdf, 0x69, 0xc1, 0x4c, 0x23, 0xf0, 0xe3, 0x30, 0x68, 0x36, + 0x49, 0x58, 0x6b, 0xaf, 0x37, 0xbd, 0x68, 0x8b, 0xaf, 0x53, 0x4c, 0x36, 0xd8, 0x49, 0x90, 0x33, + 0x87, 0x0a, 0x49, 0xcc, 0xe1, 0xc5, 0xfb, 0x07, 0xb3, 0x33, 0x8b, 0xb9, 0xa4, 0x70, 0x97, 0x66, + 0xd0, 0x36, 0x20, 0x7a, 0x95, 0xd6, 0x63, 0x67, 0x93, 0x24, 0x8d, 0x0f, 0xf7, 0xdf, 0xf8, 0xd9, + 0xfb, 0x07, 0xb3, 0x68, 0xb5, 0x83, 0x04, 0xce, 0x20, 0x8b, 0xde, 0x85, 0xd3, 0xb4, 0xb4, 0xe3, + 0x5b, 0x4b, 0xfd, 0x37, 0x37, 0x7d, 0xff, 0x60, 0xf6, 0xf4, 0x6a, 0x06, 0x11, 0x9c, 0x49, 0x1a, + 0x7d, 0x87, 0x05, 0xe7, 0x92, 0xcf, 0x5f, 0xba, 0xd7, 0x72, 0x7c, 0x37, 0x69, 0xb8, 0xdc, 0x7f, + 0xc3, 0xf4, 0x4c, 0x3e, 0xb7, 0x98, 0x47, 0x09, 0xe7, 0x37, 0x32, 0xb3, 0x08, 0x67, 0x32, 0x57, + 0x0b, 0x9a, 0x84, 0xe2, 0x36, 0xe1, 0x5c, 0x50, 0x19, 0xd3, 0x9f, 0xe8, 0x34, 0x0c, 0xee, 0x3a, + 0xcd, 0xb6, 0xd8, 0x28, 0x98, 0xff, 0x79, 0xa5, 0xf0, 0xb2, 0x65, 0xff, 0x8b, 0x22, 0x4c, 0x2c, + 0xd6, 0xab, 0x0f, 0xb4, 0x0b, 0xf5, 0x6b, 0xa8, 0xd0, 0xf5, 0x1a, 0x4a, 0x2e, 0xb5, 0x62, 0xee, + 0xa5, 0xf6, 0xff, 0x64, 0x6c, 0xa1, 0x01, 0xb6, 0x85, 0xbe, 0x29, 0x67, 0x0b, 0x1d, 0xf3, 0xc6, + 0xd9, 0xcd, 0x59, 0x45, 0x83, 0x6c, 0x32, 0x33, 0x39, 0x96, 0x9b, 0x41, 0xc3, 0x69, 0xa6, 0x8f, + 0xbe, 0x23, 0x2e, 0xa5, 0xe3, 0x99, 0xc7, 0x06, 0x8c, 0x2e, 0x3a, 0x2d, 0x67, 0xdd, 0x6b, 0x7a, + 0xb1, 0x47, 0x22, 0xf4, 0x04, 0x14, 0x1d, 0xd7, 0x65, 0xdc, 0x56, 0x79, 0xe1, 0xcc, 0xfd, 0x83, + 0xd9, 0xe2, 0xbc, 0x4b, 0xaf, 0x7d, 0x50, 0x58, 0xfb, 0x98, 0x62, 0xa0, 0x8f, 0xc3, 0x80, 0x1b, + 0x06, 0xad, 0xe9, 0x02, 0xc3, 0xa4, 0xbb, 0x6e, 0xa0, 0x12, 0x06, 0xad, 0x14, 0x2a, 0xc3, 0xb1, + 0x7f, 0xb5, 0x00, 0xe7, 0x17, 0x49, 0x6b, 0x6b, 0xb9, 0x9e, 0x73, 0x7e, 0x5f, 0x81, 0xd2, 0x4e, + 0xe0, 0x7b, 0x71, 0x10, 0x46, 0xa2, 0x69, 0xb6, 0x22, 0x56, 0x44, 0x19, 0x56, 0x50, 0x74, 0x09, + 0x06, 0x5a, 0x09, 0x53, 0x39, 0x2a, 0x19, 0x52, 0xc6, 0x4e, 0x32, 0x08, 0xc5, 0x68, 0x47, 0x24, + 0x14, 0x2b, 0x46, 0x61, 0xdc, 0x8e, 0x48, 0x88, 0x19, 0x24, 0xb9, 0x99, 0xe9, 0x9d, 0x2d, 0x4e, + 0xe8, 0xd4, 0xcd, 0x4c, 0x21, 0x58, 0xc3, 0x42, 0x35, 0x28, 0x47, 0xa9, 0x99, 0xed, 0x6b, 0x9b, + 0x8e, 0xb1, 0xab, 0x5b, 0xcd, 0x64, 0x42, 0xc4, 0xb8, 0x51, 0x86, 0x7a, 0x5e, 0xdd, 0x5f, 0x29, + 0x00, 0xe2, 0x43, 0xf8, 0x17, 0x6c, 0xe0, 0x6e, 0x77, 0x0e, 0x5c, 0xff, 0x5b, 0xe2, 0xb8, 0x46, + 0xef, 0x4f, 0x2d, 0x38, 0xbf, 0xe8, 0xf9, 0x2e, 0x09, 0x73, 0x16, 0xe0, 0xc3, 0x79, 0xcb, 0x1e, + 0x8d, 0x69, 0x30, 0x96, 0xd8, 0xc0, 0x31, 0x2c, 0x31, 0xfb, 0x8f, 0x2c, 0x40, 0xfc, 0xb3, 0x3f, + 0x70, 0x1f, 0x7b, 0xbb, 0xf3, 0x63, 0x8f, 0x61, 0x59, 0xd8, 0x37, 0x61, 0x7c, 0xb1, 0xe9, 0x11, + 0x3f, 0xae, 0xd6, 0x16, 0x03, 0x7f, 0xc3, 0xdb, 0x44, 0xaf, 0xc0, 0x78, 0xec, 0xed, 0x90, 0xa0, + 0x1d, 0xd7, 0x49, 0x23, 0xf0, 0xd9, 0x4b, 0xd2, 0xba, 0x32, 0xb8, 0x80, 0xee, 0x1f, 0xcc, 0x8e, + 0xaf, 0x19, 0x10, 0x9c, 0xc2, 0xb4, 0x7f, 0x87, 0x8e, 0x5f, 0xb0, 0xd3, 0x0a, 0x7c, 0xe2, 0xc7, + 0x8b, 0x81, 0xef, 0x72, 0x89, 0xc3, 0x2b, 0x30, 0x10, 0xd3, 0xf1, 0xe0, 0x63, 0x77, 0x59, 0x6e, + 0x14, 0x3a, 0x0a, 0x87, 0x07, 0xb3, 0x67, 0x3b, 0x6b, 0xb0, 0x71, 0x62, 0x75, 0xd0, 0x37, 0xc1, + 0x50, 0x14, 0x3b, 0x71, 0x3b, 0x12, 0xa3, 0xf9, 0x98, 0x1c, 0xcd, 0x3a, 0x2b, 0x3d, 0x3c, 0x98, + 0x9d, 0x50, 0xd5, 0x78, 0x11, 0x16, 0x15, 0xd0, 0x93, 0x30, 0xbc, 0x43, 0xa2, 0xc8, 0xd9, 0x94, + 0xb7, 0xe1, 0x84, 0xa8, 0x3b, 0xbc, 0xc2, 0x8b, 0xb1, 0x84, 0xa3, 0xc7, 0x61, 0x90, 0x84, 0x61, + 0x10, 0x8a, 0x3d, 0x3a, 0x26, 0x10, 0x07, 0x97, 0x68, 0x21, 0xe6, 0x30, 0xfb, 0xdf, 0x58, 0x30, + 0xa1, 0xfa, 0xca, 0xdb, 0x3a, 0x81, 0x57, 0xc1, 0x5b, 0x00, 0x0d, 0xf9, 0x81, 0x11, 0xbb, 0x3d, + 0x46, 0x9e, 0xbb, 0x9c, 0x79, 0x51, 0x77, 0x0c, 0x63, 0x42, 0x59, 0x15, 0x45, 0x58, 0xa3, 0x66, + 0xff, 0x63, 0x0b, 0x4e, 0xa5, 0xbe, 0xe8, 0xa6, 0x17, 0xc5, 0xe8, 0xed, 0x8e, 0xaf, 0x9a, 0xeb, + 0xef, 0xab, 0x68, 0x6d, 0xf6, 0x4d, 0x6a, 0x29, 0xcb, 0x12, 0xed, 0x8b, 0xae, 0xc3, 0xa0, 0x17, + 0x93, 0x1d, 0xf9, 0x31, 0x8f, 0x77, 0xfd, 0x18, 0xde, 0xab, 0x64, 0x46, 0xaa, 0xb4, 0x26, 0xe6, + 0x04, 0xec, 0xbf, 0x5c, 0x84, 0x32, 0x5f, 0xb6, 0x2b, 0x4e, 0xeb, 0x04, 0xe6, 0xa2, 0x0a, 0x03, + 0x8c, 0x3a, 0xef, 0xf8, 0x13, 0xd9, 0x1d, 0x17, 0xdd, 0x99, 0xa3, 0x4f, 0x7e, 0xce, 0x1c, 0xa9, + 0xab, 0x81, 0x16, 0x61, 0x46, 0x02, 0x39, 0x00, 0xeb, 0x9e, 0xef, 0x84, 0xfb, 0xb4, 0x6c, 0xba, + 0xc8, 0x08, 0x3e, 0xd3, 0x9d, 0xe0, 0x82, 0xc2, 0xe7, 0x64, 0x55, 0x5f, 0x13, 0x00, 0xd6, 0x88, + 0xce, 0xbc, 0x04, 0x65, 0x85, 0x7c, 0x14, 0x1e, 0x67, 0xe6, 0x53, 0x30, 0x91, 0x6a, 0xab, 0x57, + 0xf5, 0x51, 0x9d, 0x45, 0xfa, 0x32, 0x3b, 0x05, 0x44, 0xaf, 0x97, 0xfc, 0x5d, 0x71, 0x8a, 0xbe, + 0x07, 0xa7, 0x9b, 0x19, 0x87, 0x93, 0x98, 0xaa, 0xfe, 0x0f, 0xb3, 0xf3, 0xe2, 0xb3, 0x4f, 0x67, + 0x41, 0x71, 0x66, 0x1b, 0xf4, 0xda, 0x0f, 0x5a, 0x74, 0xcd, 0x3b, 0x4d, 0x9d, 0x83, 0xbe, 0x25, + 0xca, 0xb0, 0x82, 0xd2, 0x23, 0xec, 0xb4, 0xea, 0xfc, 0x0d, 0xb2, 0x5f, 0x27, 0x4d, 0xd2, 0x88, + 0x83, 0xf0, 0xeb, 0xda, 0xfd, 0x0b, 0x7c, 0xf4, 0xf9, 0x09, 0x38, 0x22, 0x08, 0x14, 0x6f, 0x90, + 0x7d, 0x3e, 0x15, 0xfa, 0xd7, 0x15, 0xbb, 0x7e, 0xdd, 0xcf, 0x59, 0x30, 0xa6, 0xbe, 0xee, 0x04, + 0xb6, 0xfa, 0x82, 0xb9, 0xd5, 0x2f, 0x74, 0x5d, 0xe0, 0x39, 0x9b, 0xfc, 0x2b, 0x05, 0x38, 0xa7, + 0x70, 0x28, 0xbb, 0xcf, 0xff, 0x88, 0x55, 0x75, 0x15, 0xca, 0xbe, 0x12, 0x44, 0x59, 0xa6, 0x04, + 0x28, 0x11, 0x43, 0x25, 0x38, 0x94, 0x6b, 0xf3, 0x13, 0x69, 0xd1, 0xa8, 0x2e, 0xa1, 0x15, 0xd2, + 0xd8, 0x05, 0x28, 0xb6, 0x3d, 0x57, 0xdc, 0x19, 0x9f, 0x90, 0xa3, 0x7d, 0xbb, 0x5a, 0x39, 0x3c, + 0x98, 0x7d, 0x2c, 0x4f, 0x3b, 0x40, 0x2f, 0xab, 0x68, 0xee, 0x76, 0xb5, 0x82, 0x69, 0x65, 0x34, + 0x0f, 0x13, 0x52, 0x01, 0x72, 0x87, 0x72, 0x50, 0x81, 0x2f, 0xae, 0x16, 0x25, 0x66, 0xc5, 0x26, + 0x18, 0xa7, 0xf1, 0x51, 0x05, 0x26, 0xb7, 0xdb, 0xeb, 0xa4, 0x49, 0x62, 0xfe, 0xc1, 0x37, 0x08, + 0x17, 0x42, 0x96, 0x93, 0xc7, 0xd6, 0x8d, 0x14, 0x1c, 0x77, 0xd4, 0xb0, 0xff, 0x9c, 0x1d, 0xf1, + 0x62, 0xf4, 0x6a, 0x61, 0x40, 0x17, 0x16, 0xa5, 0xfe, 0xf5, 0x5c, 0xce, 0xfd, 0xac, 0x8a, 0x1b, + 0x64, 0x7f, 0x2d, 0xa0, 0xcc, 0x76, 0xf6, 0xaa, 0x30, 0xd6, 0xfc, 0x40, 0xd7, 0x35, 0xff, 0x0b, + 0x05, 0x38, 0xa3, 0x46, 0xc0, 0xe0, 0xeb, 0xfe, 0xa2, 0x8f, 0xc1, 0xb3, 0x30, 0xe2, 0x92, 0x0d, + 0xa7, 0xdd, 0x8c, 0x95, 0x44, 0x7c, 0x90, 0x6b, 0x45, 0x2a, 0x49, 0x31, 0xd6, 0x71, 0x8e, 0x30, + 0x6c, 0xff, 0x63, 0x84, 0xdd, 0xad, 0xb1, 0x43, 0xd7, 0xb8, 0xda, 0x35, 0x56, 0xee, 0xae, 0x79, + 0x1c, 0x06, 0xbd, 0x1d, 0xca, 0x6b, 0x15, 0x4c, 0x16, 0xaa, 0x4a, 0x0b, 0x31, 0x87, 0xa1, 0x8f, + 0xc1, 0x70, 0x23, 0xd8, 0xd9, 0x71, 0x7c, 0x97, 0x5d, 0x79, 0xe5, 0x85, 0x11, 0xca, 0x8e, 0x2d, + 0xf2, 0x22, 0x2c, 0x61, 0xe8, 0x3c, 0x0c, 0x38, 0xe1, 0x26, 0x17, 0x4b, 0x94, 0x17, 0x4a, 0xb4, + 0xa5, 0xf9, 0x70, 0x33, 0xc2, 0xac, 0x94, 0xbe, 0xaa, 0xf6, 0x82, 0x70, 0xdb, 0xf3, 0x37, 0x2b, + 0x5e, 0x28, 0xb6, 0x84, 0xba, 0x0b, 0xef, 0x2a, 0x08, 0xd6, 0xb0, 0xd0, 0x32, 0x0c, 0xb6, 0x82, + 0x30, 0x8e, 0xa6, 0x87, 0xd8, 0x70, 0x3f, 0x96, 0x73, 0x10, 0xf1, 0xaf, 0xad, 0x05, 0x61, 0x9c, + 0x7c, 0x00, 0xfd, 0x17, 0x61, 0x5e, 0x1d, 0xdd, 0x84, 0x61, 0xe2, 0xef, 0x2e, 0x87, 0xc1, 0xce, + 0xf4, 0xa9, 0x7c, 0x4a, 0x4b, 0x1c, 0x85, 0x2f, 0xb3, 0x84, 0xed, 0x14, 0xc5, 0x58, 0x92, 0x40, + 0xdf, 0x04, 0x45, 0xe2, 0xef, 0x4e, 0x0f, 0x33, 0x4a, 0x33, 0x39, 0x94, 0xee, 0x38, 0x61, 0x72, + 0xe6, 0x2f, 0xf9, 0xbb, 0x98, 0xd6, 0x41, 0x9f, 0x81, 0xb2, 0x3c, 0x30, 0x22, 0x21, 0x7f, 0xcb, + 0x5c, 0xb0, 0xf2, 0x98, 0xc1, 0xe4, 0xdd, 0xb6, 0x17, 0x92, 0x1d, 0xe2, 0xc7, 0x51, 0x72, 0x42, + 0x4a, 0x68, 0x84, 0x13, 0x6a, 0xe8, 0x33, 0x52, 0xe8, 0xbb, 0x12, 0xb4, 0xfd, 0x38, 0x9a, 0x2e, + 0xb3, 0xee, 0x65, 0xaa, 0xe3, 0xee, 0x24, 0x78, 0x69, 0xa9, 0x30, 0xaf, 0x8c, 0x0d, 0x52, 0xe8, + 0xb3, 0x30, 0xc6, 0xff, 0x73, 0xa5, 0x56, 0x34, 0x7d, 0x86, 0xd1, 0xbe, 0x94, 0x4f, 0x9b, 0x23, + 0x2e, 0x9c, 0x11, 0xc4, 0xc7, 0xf4, 0xd2, 0x08, 0x9b, 0xd4, 0x10, 0x86, 0xb1, 0xa6, 0xb7, 0x4b, + 0x7c, 0x12, 0x45, 0xb5, 0x30, 0x58, 0x27, 0xd3, 0xc0, 0x06, 0xe6, 0x5c, 0xb6, 0x12, 0x2c, 0x58, + 0x27, 0x0b, 0x53, 0x94, 0xe6, 0x4d, 0xbd, 0x0e, 0x36, 0x49, 0xa0, 0xdb, 0x30, 0x4e, 0x1f, 0x61, + 0x5e, 0x42, 0x74, 0xa4, 0x17, 0x51, 0xf6, 0x54, 0xc2, 0x46, 0x25, 0x9c, 0x22, 0x82, 0x6e, 0xc1, + 0x68, 0x14, 0x3b, 0x61, 0xdc, 0x6e, 0x71, 0xa2, 0x67, 0x7b, 0x11, 0x65, 0x3a, 0xd4, 0xba, 0x56, + 0x05, 0x1b, 0x04, 0xd0, 0x1b, 0x50, 0x6e, 0x7a, 0x1b, 0xa4, 0xb1, 0xdf, 0x68, 0x92, 0xe9, 0x51, + 0x46, 0x2d, 0xf3, 0x50, 0xb9, 0x29, 0x91, 0xf8, 0xab, 0x50, 0xfd, 0xc5, 0x49, 0x75, 0x74, 0x07, + 0xce, 0xc6, 0x24, 0xdc, 0xf1, 0x7c, 0x87, 0x1e, 0x06, 0xe2, 0xb5, 0xc4, 0x74, 0x93, 0x63, 0x6c, + 0xb7, 0x5d, 0x14, 0xb3, 0x71, 0x76, 0x2d, 0x13, 0x0b, 0xe7, 0xd4, 0x46, 0xf7, 0x60, 0x3a, 0x03, + 0x12, 0x34, 0xbd, 0xc6, 0xfe, 0xf4, 0x69, 0x46, 0xf9, 0x35, 0x41, 0x79, 0x7a, 0x2d, 0x07, 0xef, + 0xb0, 0x0b, 0x0c, 0xe7, 0x52, 0x47, 0xb7, 0x60, 0x82, 0x9d, 0x40, 0xb5, 0x76, 0xb3, 0x29, 0x1a, + 0x1c, 0x67, 0x0d, 0x7e, 0x4c, 0xde, 0xc7, 0x55, 0x13, 0x7c, 0x78, 0x30, 0x0b, 0xc9, 0x3f, 0x9c, + 0xae, 0x8d, 0xd6, 0x99, 0x1a, 0xac, 0x1d, 0x7a, 0xf1, 0x3e, 0x3d, 0x37, 0xc8, 0xbd, 0x78, 0x7a, + 0xa2, 0xab, 0x08, 0x42, 0x47, 0x55, 0xba, 0x32, 0xbd, 0x10, 0xa7, 0x09, 0xd2, 0x23, 0x35, 0x8a, + 0x5d, 0xcf, 0x9f, 0x9e, 0x64, 0x27, 0xb5, 0x3a, 0x91, 0xea, 0xb4, 0x10, 0x73, 0x18, 0x53, 0x81, + 0xd1, 0x1f, 0xb7, 0xe8, 0xcd, 0x35, 0xc5, 0x10, 0x13, 0x15, 0x98, 0x04, 0xe0, 0x04, 0x87, 0x32, + 0x93, 0x71, 0xbc, 0x3f, 0x8d, 0x18, 0xaa, 0x3a, 0x58, 0xd6, 0xd6, 0x3e, 0x83, 0x69, 0xb9, 0xbd, + 0x0e, 0xe3, 0xea, 0x20, 0x64, 0x63, 0x82, 0x66, 0x61, 0x90, 0xb1, 0x4f, 0x42, 0x60, 0x56, 0xa6, + 0x5d, 0x60, 0xac, 0x15, 0xe6, 0xe5, 0xac, 0x0b, 0xde, 0x7b, 0x64, 0x61, 0x3f, 0x26, 0xfc, 0x99, + 0x5e, 0xd4, 0xba, 0x20, 0x01, 0x38, 0xc1, 0xb1, 0xff, 0x37, 0x67, 0x43, 0x93, 0xd3, 0xb6, 0x8f, + 0xfb, 0xe5, 0x69, 0x28, 0x6d, 0x05, 0x51, 0x4c, 0xb1, 0x59, 0x1b, 0x83, 0x09, 0xe3, 0x79, 0x5d, + 0x94, 0x63, 0x85, 0x81, 0x5e, 0x85, 0xb1, 0x86, 0xde, 0x80, 0xb8, 0x1c, 0xd5, 0x31, 0x62, 0xb4, + 0x8e, 0x4d, 0x5c, 0xf4, 0x32, 0x94, 0x98, 0x59, 0x47, 0x23, 0x68, 0x0a, 0xae, 0x4d, 0xde, 0xf0, + 0xa5, 0x9a, 0x28, 0x3f, 0xd4, 0x7e, 0x63, 0x85, 0x8d, 0x2e, 0xc3, 0x10, 0xed, 0x42, 0xb5, 0x26, + 0xae, 0x25, 0x25, 0xfb, 0xb9, 0xce, 0x4a, 0xb1, 0x80, 0xda, 0x7f, 0xa9, 0xa0, 0x8d, 0x32, 0x7d, + 0xe2, 0x12, 0x54, 0x83, 0xe1, 0x3d, 0xc7, 0x8b, 0x3d, 0x7f, 0x53, 0xf0, 0x1f, 0x4f, 0x76, 0xbd, + 0xa3, 0x58, 0xa5, 0xbb, 0xbc, 0x02, 0xbf, 0x45, 0xc5, 0x1f, 0x2c, 0xc9, 0x50, 0x8a, 0x61, 0xdb, + 0xf7, 0x29, 0xc5, 0x42, 0xbf, 0x14, 0x31, 0xaf, 0xc0, 0x29, 0x8a, 0x3f, 0x58, 0x92, 0x41, 0x6f, + 0x03, 0xc8, 0x1d, 0x46, 0x5c, 0x61, 0x4e, 0xf1, 0x74, 0x6f, 0xa2, 0x6b, 0xaa, 0xce, 0xc2, 0x38, + 0xbd, 0xa3, 0x93, 0xff, 0x58, 0xa3, 0x67, 0xc7, 0x8c, 0x4f, 0xeb, 0xec, 0x0c, 0xfa, 0x56, 0xba, + 0xc4, 0x9d, 0x30, 0x26, 0xee, 0x7c, 0x2c, 0x06, 0xe7, 0xe3, 0xfd, 0x3d, 0x52, 0xd6, 0xbc, 0x1d, + 0xa2, 0x6f, 0x07, 0x41, 0x04, 0x27, 0xf4, 0xec, 0x5f, 0x2a, 0xc2, 0x74, 0x5e, 0x77, 0xe9, 0xa2, + 0x23, 0xf7, 0xbc, 0x78, 0x91, 0xb2, 0x57, 0x96, 0xb9, 0xe8, 0x96, 0x44, 0x39, 0x56, 0x18, 0x74, + 0xf6, 0x23, 0x6f, 0x53, 0xbe, 0x31, 0x07, 0x93, 0xd9, 0xaf, 0xb3, 0x52, 0x2c, 0xa0, 0x14, 0x2f, + 0x24, 0x4e, 0x24, 0xec, 0x75, 0xb4, 0x55, 0x82, 0x59, 0x29, 0x16, 0x50, 0x5d, 0x80, 0x35, 0xd0, + 0x43, 0x80, 0x65, 0x0c, 0xd1, 0xe0, 0xf1, 0x0e, 0x11, 0xfa, 0x1c, 0xc0, 0x86, 0xe7, 0x7b, 0xd1, + 0x16, 0xa3, 0x3e, 0x74, 0x64, 0xea, 0x8a, 0x39, 0x5b, 0x56, 0x54, 0xb0, 0x46, 0x11, 0xbd, 0x08, + 0x23, 0x6a, 0x03, 0x56, 0x2b, 0x4c, 0x79, 0xa9, 0x19, 0x83, 0x24, 0xa7, 0x51, 0x05, 0xeb, 0x78, + 0xf6, 0x3b, 0xe9, 0xf5, 0x22, 0x76, 0x80, 0x36, 0xbe, 0x56, 0xbf, 0xe3, 0x5b, 0xe8, 0x3e, 0xbe, + 0xf6, 0xd7, 0x8a, 0x30, 0x61, 0x34, 0xd6, 0x8e, 0xfa, 0x38, 0xb3, 0xae, 0xd1, 0x03, 0xdc, 0x89, + 0x89, 0xd8, 0x7f, 0x76, 0xef, 0xad, 0xa2, 0x1f, 0xf2, 0x74, 0x07, 0xf0, 0xfa, 0xe8, 0x73, 0x50, + 0x6e, 0x3a, 0x11, 0x13, 0x86, 0x11, 0xb1, 0xef, 0xfa, 0x21, 0x96, 0x3c, 0x4c, 0x9c, 0x28, 0xd6, + 0x6e, 0x4d, 0x4e, 0x3b, 0x21, 0x49, 0x6f, 0x1a, 0xca, 0x9f, 0x48, 0x83, 0x30, 0xd5, 0x09, 0xca, + 0xc4, 0xec, 0x63, 0x0e, 0x43, 0x2f, 0xc3, 0x68, 0x48, 0xd8, 0xaa, 0x58, 0xa4, 0xdc, 0x1c, 0x5b, + 0x66, 0x83, 0x09, 0xdb, 0x87, 0x35, 0x18, 0x36, 0x30, 0x93, 0xb7, 0xc1, 0x50, 0x97, 0xb7, 0xc1, + 0x93, 0x30, 0xcc, 0x7e, 0xa8, 0x15, 0xa0, 0x66, 0xa3, 0xca, 0x8b, 0xb1, 0x84, 0xa7, 0x17, 0x4c, + 0xa9, 0xbf, 0x05, 0x43, 0x5f, 0x1f, 0x62, 0x51, 0x33, 0xc5, 0x71, 0x89, 0x9f, 0x72, 0x62, 0xc9, + 0x63, 0x09, 0xb3, 0x3f, 0x0e, 0xe3, 0x15, 0x87, 0xec, 0x04, 0xfe, 0x92, 0xef, 0xb6, 0x02, 0xcf, + 0x8f, 0xd1, 0x34, 0x0c, 0xb0, 0x4b, 0x84, 0x1f, 0x01, 0x03, 0xb4, 0x21, 0x3c, 0x40, 0x1f, 0x04, + 0xf6, 0x26, 0x9c, 0xa9, 0x04, 0x7b, 0xfe, 0x9e, 0x13, 0xba, 0xf3, 0xb5, 0xaa, 0xf6, 0xbe, 0x5e, + 0x95, 0xef, 0x3b, 0x6e, 0x87, 0x95, 0x79, 0xf4, 0x6a, 0x35, 0x39, 0x5b, 0xbb, 0xec, 0x35, 0x49, + 0x8e, 0x14, 0xe4, 0xaf, 0x16, 0x8c, 0x96, 0x12, 0x7c, 0xa5, 0xa8, 0xb2, 0x72, 0x15, 0x55, 0x6f, + 0x42, 0x69, 0xc3, 0x23, 0x4d, 0x17, 0x93, 0x0d, 0xb1, 0x12, 0x9f, 0xc8, 0x37, 0x2d, 0x59, 0xa6, + 0x98, 0x52, 0xea, 0xc5, 0x5f, 0x87, 0xcb, 0xa2, 0x32, 0x56, 0x64, 0xd0, 0x36, 0x4c, 0xca, 0x07, + 0x83, 0x84, 0x8a, 0x75, 0xf9, 0x64, 0xb7, 0x57, 0x88, 0x49, 0xfc, 0xf4, 0xfd, 0x83, 0xd9, 0x49, + 0x9c, 0x22, 0x83, 0x3b, 0x08, 0xd3, 0xe7, 0xe0, 0x0e, 0x3d, 0x81, 0x07, 0xd8, 0xf0, 0xb3, 0xe7, + 0x20, 0x7b, 0xd9, 0xb2, 0x52, 0xfb, 0x47, 0x2d, 0x78, 0xa4, 0x63, 0x64, 0xc4, 0x0b, 0xff, 0x98, + 0x67, 0x21, 0xfd, 0xe2, 0x2e, 0xf4, 0x7e, 0x71, 0xdb, 0x3f, 0x6b, 0xc1, 0xe9, 0xa5, 0x9d, 0x56, + 0xbc, 0x5f, 0xf1, 0x4c, 0xad, 0xd2, 0x4b, 0x30, 0xb4, 0x43, 0x5c, 0xaf, 0xbd, 0x23, 0x66, 0x6e, + 0x56, 0x9e, 0x52, 0x2b, 0xac, 0xf4, 0xf0, 0x60, 0x76, 0xac, 0x1e, 0x07, 0xa1, 0xb3, 0x49, 0x78, + 0x01, 0x16, 0xe8, 0xec, 0xac, 0xf7, 0xde, 0x23, 0x37, 0xbd, 0x1d, 0x4f, 0x9a, 0x0a, 0x75, 0x95, + 0xd9, 0xcd, 0xc9, 0x01, 0x9d, 0x7b, 0xb3, 0xed, 0xf8, 0xb1, 0x17, 0xef, 0x0b, 0x85, 0x90, 0x24, + 0x82, 0x13, 0x7a, 0xf6, 0x57, 0x2d, 0x98, 0x90, 0xeb, 0x7e, 0xde, 0x75, 0x43, 0x12, 0x45, 0x68, + 0x06, 0x0a, 0x5e, 0x4b, 0xf4, 0x12, 0x44, 0x2f, 0x0b, 0xd5, 0x1a, 0x2e, 0x78, 0x2d, 0xc9, 0x96, + 0xb1, 0x83, 0xb0, 0x68, 0xea, 0xc6, 0xae, 0x8b, 0x72, 0xac, 0x30, 0xd0, 0x15, 0x28, 0xf9, 0x81, + 0xcb, 0xcd, 0xb5, 0xf8, 0x95, 0xc6, 0x16, 0xd8, 0xaa, 0x28, 0xc3, 0x0a, 0x8a, 0x6a, 0x50, 0xe6, + 0x96, 0x4c, 0xc9, 0xa2, 0xed, 0xcb, 0x1e, 0x8a, 0x7d, 0xd9, 0x9a, 0xac, 0x89, 0x13, 0x22, 0xf6, + 0x0f, 0x58, 0x30, 0x2a, 0xbf, 0xac, 0x4f, 0x9e, 0x93, 0x6e, 0xad, 0x84, 0xdf, 0x4c, 0xb6, 0x16, + 0xe5, 0x19, 0x19, 0xc4, 0x60, 0x15, 0x8b, 0x47, 0x61, 0x15, 0xed, 0x1f, 0x29, 0xc0, 0xb8, 0xec, + 0x4e, 0xbd, 0xbd, 0x1e, 0x91, 0x18, 0xad, 0x41, 0xd9, 0xe1, 0x43, 0x4e, 0xe4, 0x8a, 0x7d, 0x3c, + 0x5b, 0x28, 0x60, 0xcc, 0x4f, 0x72, 0x7b, 0xcf, 0xcb, 0xda, 0x38, 0x21, 0x84, 0x9a, 0x30, 0xe5, + 0x07, 0x31, 0x3b, 0xc9, 0x15, 0xbc, 0x9b, 0xea, 0x25, 0x4d, 0xfd, 0x9c, 0xa0, 0x3e, 0xb5, 0x9a, + 0xa6, 0x82, 0x3b, 0x09, 0xa3, 0x25, 0x29, 0x68, 0x29, 0xe6, 0xbf, 0xec, 0xf5, 0x59, 0xc8, 0x96, + 0xb3, 0xd8, 0xbf, 0x62, 0x41, 0x59, 0xa2, 0x9d, 0x84, 0x96, 0x6d, 0x05, 0x86, 0x23, 0x36, 0x09, + 0x72, 0x68, 0xec, 0x6e, 0x1d, 0xe7, 0xf3, 0x95, 0x5c, 0x50, 0xfc, 0x7f, 0x84, 0x25, 0x0d, 0x26, + 0x67, 0x57, 0xdd, 0xff, 0x80, 0xc8, 0xd9, 0x55, 0x7f, 0x72, 0x6e, 0x98, 0x3f, 0x60, 0x7d, 0xd6, + 0x04, 0x57, 0x94, 0x8f, 0x6a, 0x85, 0x64, 0xc3, 0xbb, 0x97, 0xe6, 0xa3, 0x6a, 0xac, 0x14, 0x0b, + 0x28, 0x7a, 0x1b, 0x46, 0x1b, 0x52, 0xc0, 0x9a, 0x6c, 0xd7, 0xcb, 0x5d, 0x85, 0xfd, 0x4a, 0x2f, + 0xc4, 0x05, 0x1b, 0x8b, 0x5a, 0x7d, 0x6c, 0x50, 0x33, 0xd5, 0xfc, 0xc5, 0x5e, 0x6a, 0xfe, 0x84, + 0x6e, 0xbe, 0xd2, 0xfb, 0xc7, 0x2c, 0x18, 0xe2, 0x82, 0xb5, 0xfe, 0xe4, 0x9a, 0x9a, 0x9a, 0x2c, + 0x19, 0xbb, 0x3b, 0xb4, 0x50, 0xa8, 0xbd, 0xd0, 0x0a, 0x94, 0xd9, 0x0f, 0x26, 0x18, 0x2c, 0xe6, + 0x5b, 0xc5, 0xf3, 0x56, 0xf5, 0x0e, 0xde, 0x91, 0xd5, 0x70, 0x42, 0xc1, 0xfe, 0xa1, 0x22, 0x3d, + 0xaa, 0x12, 0x54, 0xe3, 0x06, 0xb7, 0x1e, 0xde, 0x0d, 0x5e, 0x78, 0x58, 0x37, 0xf8, 0x26, 0x4c, + 0x34, 0x34, 0xa5, 0x5a, 0x32, 0x93, 0x57, 0xba, 0x2e, 0x12, 0x4d, 0xff, 0xc6, 0x45, 0x26, 0x8b, + 0x26, 0x11, 0x9c, 0xa6, 0x8a, 0xbe, 0x15, 0x46, 0xf9, 0x3c, 0x8b, 0x56, 0xb8, 0xa5, 0xc4, 0xc7, + 0xf2, 0xd7, 0x8b, 0xde, 0x04, 0x17, 0xb1, 0x69, 0xd5, 0xb1, 0x41, 0xcc, 0xfe, 0x63, 0x0b, 0xd0, + 0x52, 0x6b, 0x8b, 0xec, 0x90, 0xd0, 0x69, 0x26, 0xb2, 0xf1, 0xff, 0xcf, 0x82, 0x69, 0xd2, 0x51, + 0xbc, 0x18, 0xec, 0xec, 0x88, 0x17, 0x48, 0xce, 0x23, 0x79, 0x29, 0xa7, 0x8e, 0x72, 0x1b, 0x98, + 0xce, 0xc3, 0xc0, 0xb9, 0xed, 0xa1, 0x15, 0x38, 0xc5, 0xaf, 0x3c, 0x05, 0xd0, 0x6c, 0xa3, 0x1f, + 0x15, 0x84, 0x4f, 0xad, 0x75, 0xa2, 0xe0, 0xac, 0x7a, 0xf6, 0x77, 0x8d, 0x42, 0x6e, 0x2f, 0x3e, + 0x54, 0x0a, 0x7c, 0xa8, 0x14, 0xf8, 0x50, 0x29, 0xf0, 0xa1, 0x52, 0xe0, 0x43, 0xa5, 0xc0, 0x37, + 0xbc, 0x52, 0xe0, 0x0f, 0x2d, 0x38, 0xd5, 0x79, 0x0d, 0x9c, 0x04, 0x63, 0xde, 0x86, 0x53, 0x9d, + 0x77, 0x5d, 0x57, 0x3b, 0xb8, 0xce, 0x7e, 0x26, 0xf7, 0x5e, 0xc6, 0x37, 0xe0, 0x2c, 0xfa, 0xf6, + 0x2f, 0x95, 0x60, 0x70, 0x69, 0x97, 0xf8, 0xf1, 0x09, 0x7c, 0x62, 0x03, 0xc6, 0x3d, 0x7f, 0x37, + 0x68, 0xee, 0x12, 0x97, 0xc3, 0x8f, 0xf2, 0xde, 0x3d, 0x2b, 0x48, 0x8f, 0x57, 0x0d, 0x12, 0x38, + 0x45, 0xf2, 0x61, 0xc8, 0x9c, 0xaf, 0xc1, 0x10, 0xbf, 0x1d, 0x84, 0xc0, 0x39, 0xf3, 0x32, 0x60, + 0x83, 0x28, 0xee, 0xbc, 0x44, 0x1e, 0xce, 0x6f, 0x1f, 0x51, 0x1d, 0xbd, 0x03, 0xe3, 0x1b, 0x5e, + 0x18, 0xc5, 0x6b, 0xde, 0x0e, 0x89, 0x62, 0x67, 0xa7, 0xf5, 0x00, 0x32, 0x66, 0x35, 0x0e, 0xcb, + 0x06, 0x25, 0x9c, 0xa2, 0x8c, 0x36, 0x61, 0xac, 0xe9, 0xe8, 0x4d, 0x0d, 0x1f, 0xb9, 0x29, 0x75, + 0xed, 0xdc, 0xd4, 0x09, 0x61, 0x93, 0x2e, 0xdd, 0xa7, 0x0d, 0x26, 0x26, 0x2d, 0x31, 0xe1, 0x81, + 0xda, 0xa7, 0x5c, 0x3e, 0xca, 0x61, 0x94, 0x83, 0x62, 0x96, 0xb1, 0x65, 0x93, 0x83, 0xd2, 0xec, + 0x5f, 0x3f, 0x0f, 0x65, 0x42, 0x87, 0x90, 0x12, 0x16, 0x37, 0xd7, 0xd5, 0xfe, 0xfa, 0xba, 0xe2, + 0x35, 0xc2, 0xc0, 0x94, 0xee, 0x2f, 0x49, 0x4a, 0x38, 0x21, 0x8a, 0x16, 0x61, 0x28, 0x22, 0xa1, + 0x47, 0x22, 0x71, 0x87, 0x75, 0x99, 0x46, 0x86, 0xc6, 0x9d, 0x4a, 0xf8, 0x6f, 0x2c, 0xaa, 0xd2, + 0xe5, 0xe5, 0x30, 0xc1, 0x27, 0xbb, 0x65, 0xb4, 0xe5, 0x35, 0xcf, 0x4a, 0xb1, 0x80, 0xa2, 0x37, + 0x60, 0x38, 0x24, 0x4d, 0xa6, 0x3e, 0x1a, 0xeb, 0x7f, 0x91, 0x73, 0x6d, 0x14, 0xaf, 0x87, 0x25, + 0x01, 0x74, 0x03, 0x50, 0x48, 0x28, 0x07, 0xe6, 0xf9, 0x9b, 0xca, 0x5e, 0x54, 0x9c, 0xe0, 0x6a, + 0xc7, 0xe3, 0x04, 0x43, 0xfa, 0xf7, 0xe0, 0x8c, 0x6a, 0xe8, 0x1a, 0x4c, 0xa9, 0xd2, 0xaa, 0x1f, + 0xc5, 0x0e, 0x3d, 0x39, 0x27, 0x18, 0x2d, 0x25, 0x00, 0xc1, 0x69, 0x04, 0xdc, 0x59, 0xc7, 0xfe, + 0x69, 0x0b, 0xf8, 0x38, 0x9f, 0xc0, 0xb3, 0xff, 0x75, 0xf3, 0xd9, 0x7f, 0x2e, 0x77, 0xe6, 0x72, + 0x9e, 0xfc, 0xf7, 0x2d, 0x18, 0xd1, 0x66, 0x36, 0x59, 0xb3, 0x56, 0x97, 0x35, 0xdb, 0x86, 0x49, + 0xba, 0xd2, 0x6f, 0xad, 0x47, 0x24, 0xdc, 0x25, 0x2e, 0x5b, 0x98, 0x85, 0x07, 0x5b, 0x98, 0xca, + 0x90, 0xed, 0x66, 0x8a, 0x20, 0xee, 0x68, 0x02, 0xbd, 0x24, 0x75, 0x29, 0x45, 0xc3, 0x0e, 0x9c, + 0xeb, 0x49, 0x0e, 0x0f, 0x66, 0x27, 0xb5, 0x0f, 0xd1, 0x75, 0x27, 0xf6, 0xe7, 0xe5, 0x37, 0x2a, + 0x83, 0xc1, 0x86, 0x5a, 0x2c, 0x29, 0x83, 0x41, 0xb5, 0x1c, 0x70, 0x82, 0x43, 0xf7, 0xe8, 0x56, + 0x10, 0xc5, 0x69, 0x83, 0xc1, 0xeb, 0x41, 0x14, 0x63, 0x06, 0xb1, 0x9f, 0x07, 0x58, 0xba, 0x47, + 0x1a, 0x7c, 0xa9, 0xeb, 0xcf, 0x19, 0x2b, 0xff, 0x39, 0x63, 0xff, 0x3b, 0x0b, 0xc6, 0x97, 0x17, + 0x0d, 0x89, 0xf0, 0x1c, 0x00, 0x7f, 0x83, 0xdd, 0xbd, 0xbb, 0x2a, 0xb5, 0xed, 0x5c, 0x61, 0xaa, + 0x4a, 0xb1, 0x86, 0x81, 0xce, 0x41, 0xb1, 0xd9, 0xf6, 0x85, 0x74, 0x72, 0x98, 0x5e, 0xd8, 0x37, + 0xdb, 0x3e, 0xa6, 0x65, 0x9a, 0x13, 0x42, 0xb1, 0x6f, 0x27, 0x84, 0x9e, 0xc1, 0x00, 0xd0, 0x2c, + 0x0c, 0xee, 0xed, 0x79, 0x2e, 0x77, 0xb9, 0x14, 0x96, 0x00, 0x77, 0xef, 0x56, 0x2b, 0x11, 0xe6, + 0xe5, 0xf6, 0x97, 0x8a, 0x30, 0xb3, 0xdc, 0x24, 0xf7, 0xde, 0xa7, 0xdb, 0x69, 0xbf, 0x2e, 0x14, + 0x47, 0x13, 0x0d, 0x1d, 0xd5, 0x4d, 0xa6, 0xf7, 0x78, 0x6c, 0xc0, 0x30, 0xb7, 0x97, 0x93, 0x4e, + 0xa8, 0xaf, 0x66, 0xb5, 0x9e, 0x3f, 0x20, 0x73, 0xdc, 0xee, 0x4e, 0xf8, 0xd0, 0xa9, 0x9b, 0x56, + 0x94, 0x62, 0x49, 0x7c, 0xe6, 0x15, 0x18, 0xd5, 0x31, 0x8f, 0xe4, 0xb0, 0xf6, 0xff, 0x16, 0x61, + 0x92, 0xf6, 0xe0, 0xa1, 0x4e, 0xc4, 0xed, 0xce, 0x89, 0x38, 0x6e, 0xa7, 0xa5, 0xde, 0xb3, 0xf1, + 0x76, 0x7a, 0x36, 0x9e, 0xcd, 0x9b, 0x8d, 0x93, 0x9e, 0x83, 0xef, 0xb4, 0xe0, 0xd4, 0x72, 0x33, + 0x68, 0x6c, 0xa7, 0x1c, 0x8b, 0x5e, 0x84, 0x11, 0x7a, 0x8e, 0x47, 0x86, 0xcf, 0xbb, 0x11, 0x05, + 0x41, 0x80, 0xb0, 0x8e, 0xa7, 0x55, 0xbb, 0x7d, 0xbb, 0x5a, 0xc9, 0x0a, 0x9e, 0x20, 0x40, 0x58, + 0xc7, 0xb3, 0x7f, 0xd3, 0x82, 0x0b, 0xd7, 0x16, 0x97, 0x92, 0xa5, 0xd8, 0x11, 0xbf, 0xe1, 0x32, + 0x0c, 0xb5, 0x5c, 0xad, 0x2b, 0x89, 0xc0, 0xb7, 0xc2, 0x7a, 0x21, 0xa0, 0x1f, 0x94, 0xd8, 0x24, + 0x3f, 0x65, 0xc1, 0xa9, 0x6b, 0x5e, 0x4c, 0xaf, 0xe5, 0x74, 0x24, 0x01, 0x7a, 0x2f, 0x47, 0x5e, + 0x1c, 0x84, 0xfb, 0xe9, 0x48, 0x02, 0x58, 0x41, 0xb0, 0x86, 0xc5, 0x5b, 0xde, 0xf5, 0x98, 0xa5, + 0x76, 0xc1, 0xd4, 0x63, 0x61, 0x51, 0x8e, 0x15, 0x06, 0xfd, 0x30, 0xd7, 0x0b, 0x99, 0xd4, 0x70, + 0x5f, 0x9c, 0xb0, 0xea, 0xc3, 0x2a, 0x12, 0x80, 0x13, 0x1c, 0xfa, 0x80, 0x9a, 0xbd, 0xd6, 0x6c, + 0x47, 0x31, 0x09, 0x37, 0xa2, 0x9c, 0xd3, 0xf1, 0x79, 0x28, 0x13, 0x29, 0xa3, 0x17, 0xbd, 0x56, + 0xac, 0xa6, 0x12, 0xde, 0xf3, 0x80, 0x06, 0x0a, 0xaf, 0x0f, 0x37, 0xc5, 0xa3, 0xf9, 0x99, 0x2d, + 0x03, 0x22, 0x7a, 0x5b, 0x7a, 0x84, 0x07, 0xe6, 0x2a, 0xbe, 0xd4, 0x01, 0xc5, 0x19, 0x35, 0xec, + 0x1f, 0xb5, 0xe0, 0x8c, 0xfa, 0xe0, 0x0f, 0xdc, 0x67, 0xda, 0x3f, 0x5f, 0x80, 0xb1, 0xeb, 0x6b, + 0x6b, 0xb5, 0x6b, 0x24, 0x16, 0xd7, 0x76, 0x6f, 0x35, 0x3a, 0xd6, 0xb4, 0x81, 0xdd, 0x5e, 0x81, + 0xed, 0xd8, 0x6b, 0xce, 0xf1, 0x40, 0x41, 0x73, 0x55, 0x3f, 0xbe, 0x15, 0xd6, 0xe3, 0xd0, 0xf3, + 0x37, 0x33, 0xf5, 0x87, 0x92, 0xb9, 0x28, 0xe6, 0x31, 0x17, 0xe8, 0x79, 0x18, 0x62, 0x91, 0x8a, + 0xe4, 0x24, 0x3c, 0xaa, 0x1e, 0x51, 0xac, 0xf4, 0xf0, 0x60, 0xb6, 0x7c, 0x1b, 0x57, 0xf9, 0x1f, + 0x2c, 0x50, 0xd1, 0x6d, 0x18, 0xd9, 0x8a, 0xe3, 0xd6, 0x75, 0xe2, 0xb8, 0xf4, 0xb5, 0xcc, 0x8f, + 0xc3, 0x8b, 0x59, 0xc7, 0x21, 0x1d, 0x04, 0x8e, 0x96, 0x9c, 0x20, 0x49, 0x59, 0x84, 0x75, 0x3a, + 0x76, 0x1d, 0x20, 0x81, 0x1d, 0x93, 0xee, 0xc4, 0xfe, 0x7d, 0x0b, 0x86, 0x79, 0xd0, 0x88, 0x10, + 0xbd, 0x06, 0x03, 0xe4, 0x1e, 0x69, 0x08, 0x56, 0x39, 0xb3, 0xc3, 0x09, 0xa7, 0xc5, 0x65, 0xc0, + 0xf4, 0x3f, 0x66, 0xb5, 0xd0, 0x75, 0x18, 0xa6, 0xbd, 0xbd, 0xa6, 0x22, 0x68, 0x3c, 0x96, 0xf7, + 0xc5, 0x6a, 0xda, 0x39, 0x73, 0x26, 0x8a, 0xb0, 0xac, 0xce, 0xb4, 0xcf, 0x8d, 0x56, 0x9d, 0x9e, + 0xd8, 0x71, 0x37, 0xc6, 0x62, 0x6d, 0xb1, 0xc6, 0x91, 0x04, 0x35, 0xae, 0x7d, 0x96, 0x85, 0x38, + 0x21, 0x62, 0xaf, 0x41, 0x99, 0x4e, 0xea, 0x7c, 0xd3, 0x73, 0xba, 0x2b, 0xd4, 0x9f, 0x82, 0xb2, + 0x54, 0x97, 0x47, 0xc2, 0x59, 0x9c, 0x51, 0x95, 0xda, 0xf4, 0x08, 0x27, 0x70, 0x7b, 0x03, 0x4e, + 0x33, 0xe3, 0x47, 0x27, 0xde, 0x32, 0xf6, 0x58, 0xef, 0xc5, 0xfc, 0xb4, 0x78, 0x79, 0xf2, 0x99, + 0x99, 0xd6, 0xfc, 0x31, 0x47, 0x25, 0xc5, 0xe4, 0x15, 0x6a, 0x7f, 0x6d, 0x00, 0x1e, 0xad, 0xd6, + 0xf3, 0xe3, 0x89, 0xbc, 0x0c, 0xa3, 0x9c, 0x2f, 0xa5, 0x4b, 0xdb, 0x69, 0x8a, 0x76, 0x95, 0xf0, + 0x77, 0x4d, 0x83, 0x61, 0x03, 0x13, 0x5d, 0x80, 0xa2, 0xf7, 0xae, 0x9f, 0x76, 0x6d, 0xaa, 0xbe, + 0xb9, 0x8a, 0x69, 0x39, 0x05, 0x53, 0x16, 0x97, 0xdf, 0x1d, 0x0a, 0xac, 0xd8, 0xdc, 0xd7, 0x61, + 0xdc, 0x8b, 0x1a, 0x91, 0x57, 0xf5, 0xe9, 0x39, 0xa3, 0x9d, 0x54, 0x4a, 0x2a, 0x42, 0x3b, 0xad, + 0xa0, 0x38, 0x85, 0xad, 0x5d, 0x64, 0x83, 0x7d, 0xb3, 0xc9, 0x3d, 0xbd, 0xa7, 0xe9, 0x0b, 0xa0, + 0xc5, 0xbe, 0x2e, 0x62, 0x52, 0x7c, 0xf1, 0x02, 0xe0, 0x1f, 0x1c, 0x61, 0x09, 0xa3, 0x4f, 0xce, + 0xc6, 0x96, 0xd3, 0x9a, 0x6f, 0xc7, 0x5b, 0x15, 0x2f, 0x6a, 0x04, 0xbb, 0x24, 0xdc, 0x67, 0xd2, + 0x82, 0x52, 0xf2, 0xe4, 0x54, 0x80, 0xc5, 0xeb, 0xf3, 0x35, 0x8a, 0x89, 0x3b, 0xeb, 0xa0, 0x79, + 0x98, 0x90, 0x85, 0x75, 0x12, 0xb1, 0x2b, 0x6c, 0x84, 0x91, 0x51, 0xce, 0x46, 0xa2, 0x58, 0x11, + 0x49, 0xe3, 0x9b, 0x9c, 0x34, 0x1c, 0x07, 0x27, 0xfd, 0x12, 0x8c, 0x79, 0xbe, 0x17, 0x7b, 0x4e, + 0x1c, 0x70, 0x15, 0x14, 0x17, 0x0c, 0x30, 0xd9, 0x7a, 0x55, 0x07, 0x60, 0x13, 0xcf, 0xfe, 0x2f, + 0x03, 0x30, 0xc5, 0xa6, 0xed, 0xc3, 0x15, 0xf6, 0x8d, 0xb4, 0xc2, 0x6e, 0x77, 0xae, 0xb0, 0xe3, + 0x78, 0x22, 0x3c, 0xf0, 0x32, 0x7b, 0x07, 0xca, 0xca, 0xbf, 0x4a, 0x3a, 0x58, 0x5a, 0x39, 0x0e, + 0x96, 0xbd, 0xb9, 0x0f, 0x69, 0xa2, 0x56, 0xcc, 0x34, 0x51, 0xfb, 0xeb, 0x16, 0x24, 0x3a, 0x15, + 0x74, 0x1d, 0xca, 0xad, 0x80, 0x59, 0x5e, 0x86, 0xd2, 0x9c, 0xf9, 0xd1, 0xcc, 0x8b, 0x8a, 0x5f, + 0x8a, 0xfc, 0xe3, 0x6b, 0xb2, 0x06, 0x4e, 0x2a, 0xa3, 0x05, 0x18, 0x6e, 0x85, 0xa4, 0x1e, 0xb3, + 0xb0, 0x22, 0x3d, 0xe9, 0xf0, 0x35, 0xc2, 0xf1, 0xb1, 0xac, 0x68, 0xff, 0x82, 0x05, 0xc0, 0xad, + 0xc0, 0x1c, 0x7f, 0x93, 0x9c, 0x80, 0xb8, 0xbb, 0x02, 0x03, 0x51, 0x8b, 0x34, 0xba, 0xd9, 0xc4, + 0x26, 0xfd, 0xa9, 0xb7, 0x48, 0x23, 0x19, 0x70, 0xfa, 0x0f, 0xb3, 0xda, 0xf6, 0x77, 0x03, 0x8c, + 0x27, 0x68, 0xd5, 0x98, 0xec, 0xa0, 0x67, 0x8c, 0x30, 0x03, 0xe7, 0x52, 0x61, 0x06, 0xca, 0x0c, + 0x5b, 0x93, 0xac, 0xbe, 0x03, 0xc5, 0x1d, 0xe7, 0x9e, 0x10, 0x9d, 0x3d, 0xd5, 0xbd, 0x1b, 0x94, + 0xfe, 0xdc, 0x8a, 0x73, 0x8f, 0x3f, 0x12, 0x9f, 0x92, 0x0b, 0x64, 0xc5, 0xb9, 0x77, 0xc8, 0x2d, + 0x5f, 0xd9, 0x21, 0x75, 0xd3, 0x8b, 0xe2, 0x2f, 0xfc, 0xe7, 0xe4, 0x3f, 0x5b, 0x76, 0xb4, 0x11, + 0xd6, 0x96, 0xe7, 0x0b, 0x9b, 0xa8, 0xbe, 0xda, 0xf2, 0xfc, 0x74, 0x5b, 0x9e, 0xdf, 0x47, 0x5b, + 0x9e, 0x8f, 0xde, 0x83, 0x61, 0x61, 0x7f, 0x28, 0xc2, 0xfa, 0x5c, 0xed, 0xa3, 0x3d, 0x61, 0xbe, + 0xc8, 0xdb, 0xbc, 0x2a, 0x1f, 0xc1, 0xa2, 0xb4, 0x67, 0xbb, 0xb2, 0x41, 0xf4, 0x57, 0x2c, 0x18, + 0x17, 0xbf, 0x31, 0x79, 0xb7, 0x4d, 0xa2, 0x58, 0xf0, 0x9e, 0x9f, 0xec, 0xbf, 0x0f, 0xa2, 0x22, + 0xef, 0xca, 0x27, 0xe5, 0x31, 0x6b, 0x02, 0x7b, 0xf6, 0x28, 0xd5, 0x0b, 0xf4, 0xf7, 0x2c, 0x38, + 0xbd, 0xe3, 0xdc, 0xe3, 0x2d, 0xf2, 0x32, 0xec, 0xc4, 0x5e, 0x20, 0x54, 0xff, 0xaf, 0xf5, 0x37, + 0xfd, 0x1d, 0xd5, 0x79, 0x27, 0xa5, 0x7e, 0xf2, 0x74, 0x16, 0x4a, 0xcf, 0xae, 0x66, 0xf6, 0x6b, + 0x66, 0x03, 0x4a, 0x72, 0xbd, 0x65, 0x88, 0x1a, 0x2a, 0x3a, 0x63, 0x7d, 0x64, 0xf3, 0x4f, 0xdd, + 0xd7, 0x9f, 0xb6, 0x23, 0xd6, 0xda, 0x43, 0x6d, 0xe7, 0x1d, 0x18, 0xd5, 0xd7, 0xd8, 0x43, 0x6d, + 0xeb, 0x5d, 0x38, 0x95, 0xb1, 0x96, 0x1e, 0x6a, 0x93, 0x7b, 0x70, 0x2e, 0x77, 0x7d, 0x3c, 0xcc, + 0x86, 0xed, 0x9f, 0xb7, 0xf4, 0x73, 0xf0, 0x04, 0x74, 0x0e, 0x8b, 0xa6, 0xce, 0xe1, 0x62, 0xf7, + 0x9d, 0x93, 0xa3, 0x78, 0x78, 0x5b, 0xef, 0x34, 0x3d, 0xd5, 0xd1, 0x1b, 0x30, 0xd4, 0xa4, 0x25, + 0xd2, 0xf0, 0xd5, 0xee, 0xbd, 0x23, 0x13, 0x5e, 0x8a, 0x95, 0x47, 0x58, 0x50, 0xb0, 0x7f, 0xd9, + 0x82, 0x81, 0x13, 0x18, 0x09, 0x6c, 0x8e, 0xc4, 0x33, 0xb9, 0xa4, 0x45, 0xc4, 0xe1, 0x39, 0xec, + 0xec, 0x2d, 0xdd, 0x8b, 0x89, 0x1f, 0xb1, 0xa7, 0x62, 0xe6, 0xc0, 0xfc, 0x5f, 0x70, 0xea, 0x66, + 0xe0, 0xb8, 0x0b, 0x4e, 0xd3, 0xf1, 0x1b, 0x24, 0xac, 0xfa, 0x9b, 0x47, 0xb2, 0xc0, 0x2e, 0xf4, + 0xb2, 0xc0, 0xb6, 0xb7, 0x00, 0xe9, 0x0d, 0x08, 0x57, 0x16, 0x0c, 0xc3, 0x1e, 0x6f, 0x4a, 0x0c, + 0xff, 0x13, 0xd9, 0xac, 0x59, 0x47, 0xcf, 0x34, 0x27, 0x0d, 0x5e, 0x80, 0x25, 0x21, 0xfb, 0x65, + 0xc8, 0xf4, 0x87, 0xef, 0x2d, 0x36, 0xb0, 0x3f, 0x03, 0x53, 0xac, 0xe6, 0x11, 0x9f, 0xb4, 0x76, + 0x4a, 0x2a, 0x99, 0x11, 0xfc, 0xce, 0xfe, 0xa2, 0x05, 0x13, 0xab, 0xa9, 0x98, 0x60, 0x97, 0x99, + 0x02, 0x34, 0x43, 0x18, 0x5e, 0x67, 0xa5, 0x58, 0x40, 0x8f, 0x5d, 0x06, 0xf5, 0xe7, 0x16, 0x24, + 0x21, 0x2a, 0x4e, 0x80, 0xf1, 0x5a, 0x34, 0x18, 0xaf, 0x4c, 0xd9, 0x88, 0xea, 0x4e, 0x1e, 0xdf, + 0x85, 0x6e, 0xa8, 0x78, 0x4c, 0x5d, 0xc4, 0x22, 0x09, 0x19, 0x1e, 0xbd, 0x67, 0xdc, 0x0c, 0xda, + 0x24, 0x23, 0x34, 0xd9, 0xff, 0xb1, 0x00, 0x48, 0xe1, 0xf6, 0x1d, 0x2f, 0xaa, 0xb3, 0xc6, 0xf1, + 0xc4, 0x8b, 0xda, 0x05, 0xc4, 0x54, 0xf8, 0xa1, 0xe3, 0x47, 0x9c, 0xac, 0x27, 0xa4, 0x6e, 0x47, + 0xb3, 0x0f, 0x98, 0x11, 0x4d, 0xa2, 0x9b, 0x1d, 0xd4, 0x70, 0x46, 0x0b, 0x9a, 0x69, 0xc6, 0x60, + 0xbf, 0xa6, 0x19, 0x43, 0x3d, 0xdc, 0xd5, 0x7e, 0xce, 0x82, 0x31, 0x35, 0x4c, 0x1f, 0x10, 0xfb, + 0x73, 0xd5, 0x9f, 0x9c, 0xa3, 0xaf, 0xa6, 0x75, 0x99, 0x5d, 0x09, 0xdf, 0xcc, 0xdc, 0x0e, 0x9d, + 0xa6, 0xf7, 0x1e, 0x51, 0xd1, 0xfa, 0x66, 0x85, 0x1b, 0xa1, 0x28, 0x3d, 0x3c, 0x98, 0x1d, 0x53, + 0xff, 0x78, 0x74, 0xe0, 0xa4, 0x8a, 0xfd, 0x13, 0x74, 0xb3, 0x9b, 0x4b, 0x11, 0xbd, 0x08, 0x83, + 0xad, 0x2d, 0x27, 0x22, 0x29, 0xa7, 0x9b, 0xc1, 0x1a, 0x2d, 0x3c, 0x3c, 0x98, 0x1d, 0x57, 0x15, + 0x58, 0x09, 0xe6, 0xd8, 0xfd, 0x47, 0xe1, 0xea, 0x5c, 0x9c, 0x3d, 0xa3, 0x70, 0xfd, 0xb1, 0x05, + 0x03, 0xab, 0x81, 0x7b, 0x12, 0x47, 0xc0, 0xeb, 0xc6, 0x11, 0x70, 0x3e, 0x2f, 0x70, 0x7b, 0xee, + 0xee, 0x5f, 0x4e, 0xed, 0xfe, 0x8b, 0xb9, 0x14, 0xba, 0x6f, 0xfc, 0x1d, 0x18, 0x61, 0xe1, 0xe0, + 0x85, 0x83, 0xd1, 0xf3, 0xc6, 0x86, 0x9f, 0x4d, 0x6d, 0xf8, 0x09, 0x0d, 0x55, 0xdb, 0xe9, 0x4f, + 0xc2, 0xb0, 0x70, 0x72, 0x49, 0x7b, 0x6f, 0x0a, 0x5c, 0x2c, 0xe1, 0xf6, 0x8f, 0x15, 0xc1, 0x08, + 0x3f, 0x8f, 0x7e, 0xc5, 0x82, 0xb9, 0x90, 0x1b, 0xbf, 0xba, 0x95, 0x76, 0xe8, 0xf9, 0x9b, 0xf5, + 0xc6, 0x16, 0x71, 0xdb, 0x4d, 0xcf, 0xdf, 0xac, 0x6e, 0xfa, 0x81, 0x2a, 0x5e, 0xba, 0x47, 0x1a, + 0x6d, 0xa6, 0xbe, 0xea, 0x11, 0xeb, 0x5e, 0x19, 0x91, 0x3f, 0x77, 0xff, 0x60, 0x76, 0x0e, 0x1f, + 0x89, 0x36, 0x3e, 0x62, 0x5f, 0xd0, 0x6f, 0x5a, 0x70, 0x95, 0x47, 0x65, 0xef, 0xbf, 0xff, 0x5d, + 0xde, 0xb9, 0x35, 0x49, 0x2a, 0x21, 0xb2, 0x46, 0xc2, 0x9d, 0x85, 0x97, 0xc4, 0x80, 0x5e, 0xad, + 0x1d, 0xad, 0x2d, 0x7c, 0xd4, 0xce, 0xd9, 0xff, 0xac, 0x08, 0x63, 0x22, 0xb4, 0x93, 0xb8, 0x03, + 0x5e, 0x34, 0x96, 0xc4, 0x63, 0xa9, 0x25, 0x31, 0x65, 0x20, 0x1f, 0xcf, 0xf1, 0x1f, 0xc1, 0x14, + 0x3d, 0x9c, 0xaf, 0x13, 0x27, 0x8c, 0xd7, 0x89, 0xc3, 0x2d, 0xae, 0x8a, 0x47, 0x3e, 0xfd, 0x95, + 0x60, 0xed, 0x66, 0x9a, 0x18, 0xee, 0xa4, 0xff, 0x8d, 0x74, 0xe7, 0xf8, 0x30, 0xd9, 0x11, 0x9d, + 0xeb, 0x2d, 0x28, 0x2b, 0x0f, 0x0d, 0x71, 0xe8, 0x74, 0x0f, 0x72, 0x97, 0xa6, 0xc0, 0x85, 0x5f, + 0x89, 0x77, 0x50, 0x42, 0xce, 0xfe, 0xfb, 0x05, 0xa3, 0x41, 0x3e, 0x89, 0xab, 0x50, 0x72, 0xa2, + 0xc8, 0xdb, 0xf4, 0x89, 0x2b, 0x76, 0xec, 0x47, 0xf3, 0x76, 0xac, 0xd1, 0x0c, 0xf3, 0x92, 0x99, + 0x17, 0x35, 0xb1, 0xa2, 0x81, 0xae, 0x73, 0xbb, 0xb6, 0x5d, 0xf9, 0x52, 0xeb, 0x8f, 0x1a, 0x48, + 0xcb, 0xb7, 0x5d, 0x82, 0x45, 0x7d, 0xf4, 0x59, 0x6e, 0x78, 0x78, 0xc3, 0x0f, 0xf6, 0xfc, 0x6b, + 0x41, 0x20, 0xc3, 0x27, 0xf4, 0x47, 0x70, 0x4a, 0x9a, 0x1b, 0xaa, 0xea, 0xd8, 0xa4, 0xd6, 0x5f, + 0x04, 0xcb, 0x6f, 0x83, 0x53, 0x94, 0xb4, 0xe9, 0xdd, 0x1c, 0x21, 0x02, 0x13, 0x22, 0x6e, 0x98, + 0x2c, 0x13, 0x63, 0x97, 0xf9, 0x08, 0x33, 0x6b, 0x27, 0x12, 0xe0, 0x1b, 0x26, 0x09, 0x9c, 0xa6, + 0x69, 0xff, 0xa4, 0x05, 0xcc, 0xd3, 0xf3, 0x04, 0xf8, 0x91, 0x4f, 0x99, 0xfc, 0xc8, 0x74, 0xde, + 0x20, 0xe7, 0xb0, 0x22, 0x2f, 0xf0, 0x95, 0x55, 0x0b, 0x83, 0x7b, 0xfb, 0xc2, 0xe8, 0xa3, 0xf7, + 0xfb, 0xc3, 0xfe, 0x5f, 0x16, 0x3f, 0xc4, 0x94, 0xff, 0x04, 0xfa, 0x76, 0x28, 0x35, 0x9c, 0x96, + 0xd3, 0xe0, 0xb9, 0x52, 0x72, 0x65, 0x71, 0x46, 0xa5, 0xb9, 0x45, 0x51, 0x83, 0xcb, 0x96, 0x64, + 0xfc, 0xb9, 0x92, 0x2c, 0xee, 0x29, 0x4f, 0x52, 0x4d, 0xce, 0x6c, 0xc3, 0x98, 0x41, 0xec, 0xa1, + 0x0a, 0x22, 0xbe, 0x9d, 0x5f, 0xb1, 0x2a, 0x5e, 0xe2, 0x0e, 0x4c, 0xf9, 0xda, 0x7f, 0x7a, 0xa1, + 0xc8, 0xc7, 0xe5, 0x47, 0x7b, 0x5d, 0xa2, 0xec, 0xf6, 0xd1, 0xfc, 0x4e, 0x53, 0x64, 0x70, 0x27, + 0x65, 0xfb, 0xc7, 0x2d, 0x78, 0x44, 0x47, 0xd4, 0x5c, 0x5b, 0x7a, 0x49, 0xf7, 0x2b, 0x50, 0x0a, + 0x5a, 0x24, 0x74, 0xe2, 0x20, 0x14, 0xb7, 0xc6, 0x15, 0x39, 0xe8, 0xb7, 0x44, 0xf9, 0xa1, 0x88, + 0x34, 0x2e, 0xa9, 0xcb, 0x72, 0xac, 0x6a, 0xd2, 0xd7, 0x27, 0x1b, 0x8c, 0x48, 0x38, 0x31, 0xb1, + 0x33, 0x80, 0x29, 0xba, 0x23, 0x2c, 0x20, 0xf6, 0xd7, 0x2c, 0xbe, 0xb0, 0xf4, 0xae, 0xa3, 0x77, + 0x61, 0x72, 0xc7, 0x89, 0x1b, 0x5b, 0x4b, 0xf7, 0x5a, 0x21, 0xd7, 0x95, 0xc8, 0x71, 0x7a, 0xaa, + 0xd7, 0x38, 0x69, 0x1f, 0x99, 0xd8, 0x52, 0xae, 0xa4, 0x88, 0xe1, 0x0e, 0xf2, 0x68, 0x1d, 0x46, + 0x58, 0x19, 0xf3, 0xcf, 0x8b, 0xba, 0xb1, 0x06, 0x79, 0xad, 0x29, 0x5b, 0x81, 0x95, 0x84, 0x0e, + 0xd6, 0x89, 0xda, 0x3f, 0x53, 0xe4, 0xbb, 0x9d, 0xb1, 0xf2, 0x4f, 0xc2, 0x70, 0x2b, 0x70, 0x17, + 0xab, 0x15, 0x2c, 0x66, 0x41, 0x5d, 0x23, 0x35, 0x5e, 0x8c, 0x25, 0x1c, 0x5d, 0x81, 0x92, 0xf8, + 0x29, 0x75, 0x5b, 0xec, 0x6c, 0x16, 0x78, 0x11, 0x56, 0x50, 0xf4, 0x1c, 0x40, 0x2b, 0x0c, 0x76, + 0x3d, 0x97, 0x05, 0x81, 0x28, 0x9a, 0x66, 0x3e, 0x35, 0x05, 0xc1, 0x1a, 0x16, 0x7a, 0x15, 0xc6, + 0xda, 0x7e, 0xc4, 0xd9, 0x11, 0x67, 0x5d, 0x04, 0xe5, 0x2e, 0x25, 0x06, 0x28, 0xb7, 0x75, 0x20, + 0x36, 0x71, 0xd1, 0x3c, 0x0c, 0xc5, 0x0e, 0x33, 0x5b, 0x19, 0xcc, 0xb7, 0xb7, 0x5d, 0xa3, 0x18, + 0x7a, 0x5a, 0x0e, 0x5a, 0x01, 0x8b, 0x8a, 0xe8, 0x2d, 0xe9, 0x2a, 0xcb, 0x0f, 0x76, 0x61, 0xe8, + 0xde, 0xdf, 0x25, 0xa0, 0x39, 0xca, 0x0a, 0x03, 0x7a, 0x83, 0x16, 0x7a, 0x05, 0x80, 0xdc, 0x8b, + 0x49, 0xe8, 0x3b, 0x4d, 0x65, 0x15, 0xa6, 0xf8, 0x82, 0x4a, 0xb0, 0x1a, 0xc4, 0xb7, 0x23, 0xb2, + 0xa4, 0x30, 0xb0, 0x86, 0x6d, 0xff, 0x66, 0x19, 0x20, 0xe1, 0xdb, 0xd1, 0x7b, 0x1d, 0x07, 0xd7, + 0xd3, 0xdd, 0x39, 0xfd, 0xe3, 0x3b, 0xb5, 0xd0, 0xf7, 0x58, 0x30, 0xe2, 0x34, 0x9b, 0x41, 0xc3, + 0x89, 0xd9, 0x0c, 0x15, 0xba, 0x1f, 0x9c, 0xa2, 0xfd, 0xf9, 0xa4, 0x06, 0xef, 0xc2, 0xf3, 0x72, + 0x85, 0x6a, 0x90, 0x9e, 0xbd, 0xd0, 0x1b, 0x46, 0x9f, 0x90, 0x4f, 0xc5, 0xa2, 0x31, 0x94, 0xea, + 0xa9, 0x58, 0x66, 0x77, 0x84, 0xfe, 0x4a, 0xbc, 0x6d, 0xbc, 0x12, 0x07, 0xf2, 0x7d, 0x01, 0x0d, + 0xf6, 0xb5, 0xd7, 0x03, 0x11, 0xd5, 0xf4, 0xb8, 0x00, 0x83, 0xf9, 0x8e, 0x77, 0xda, 0x3b, 0xa9, + 0x47, 0x4c, 0x80, 0x77, 0x60, 0xc2, 0x35, 0x99, 0x00, 0xb1, 0x12, 0x9f, 0xc8, 0xa3, 0x9b, 0xe2, + 0x19, 0x92, 0x6b, 0x3f, 0x05, 0xc0, 0x69, 0xc2, 0xa8, 0xc6, 0x63, 0x3e, 0x54, 0xfd, 0x8d, 0x40, + 0x38, 0x5b, 0xd8, 0xb9, 0x73, 0xb9, 0x1f, 0xc5, 0x64, 0x87, 0x62, 0x26, 0xb7, 0xfb, 0xaa, 0xa8, + 0x8b, 0x15, 0x15, 0xf4, 0x06, 0x0c, 0x31, 0xcf, 0xab, 0x68, 0xba, 0x94, 0x2f, 0x2b, 0x36, 0x83, + 0x98, 0x25, 0x1b, 0x92, 0xfd, 0x8d, 0xb0, 0xa0, 0x80, 0xae, 0x4b, 0xbf, 0xc6, 0xa8, 0xea, 0xdf, + 0x8e, 0x08, 0xf3, 0x6b, 0x2c, 0x2f, 0x7c, 0x34, 0x71, 0x59, 0xe4, 0xe5, 0x99, 0xc9, 0xbb, 0x8c, + 0x9a, 0x94, 0x8b, 0x12, 0xff, 0x65, 0x4e, 0xb0, 0x69, 0xc8, 0xef, 0x9e, 0x99, 0x37, 0x2c, 0x19, + 0xce, 0x3b, 0x26, 0x09, 0x9c, 0xa6, 0x49, 0x39, 0x52, 0xbe, 0xeb, 0x85, 0xbb, 0x46, 0xaf, 0xb3, + 0x83, 0x3f, 0xc4, 0xd9, 0x6d, 0xc4, 0x4b, 0xb0, 0xa8, 0x7f, 0xa2, 0xec, 0xc1, 0x8c, 0x0f, 0x93, + 0xe9, 0x2d, 0xfa, 0x50, 0xd9, 0x91, 0xdf, 0x1f, 0x80, 0x71, 0x73, 0x49, 0xa1, 0xab, 0x50, 0x16, + 0x44, 0x54, 0x1c, 0x7f, 0xb5, 0x4b, 0x56, 0x24, 0x00, 0x27, 0x38, 0x2c, 0x7d, 0x03, 0xab, 0xae, + 0x99, 0xd9, 0x26, 0xe9, 0x1b, 0x14, 0x04, 0x6b, 0x58, 0xf4, 0x61, 0xb5, 0x1e, 0x04, 0xb1, 0xba, + 0x90, 0xd4, 0xba, 0x5b, 0x60, 0xa5, 0x58, 0x40, 0xe9, 0x45, 0xb4, 0x4d, 0x42, 0x9f, 0x34, 0xcd, + 0xf0, 0xc0, 0xea, 0x22, 0xba, 0xa1, 0x03, 0xb1, 0x89, 0x4b, 0xaf, 0xd3, 0x20, 0x62, 0x0b, 0x59, + 0x3c, 0xdf, 0x12, 0xb3, 0xe5, 0x3a, 0x77, 0xad, 0x96, 0x70, 0xf4, 0x19, 0x78, 0x44, 0x85, 0x40, + 0xc2, 0x5c, 0x0f, 0x21, 0x5b, 0x1c, 0x32, 0xa4, 0x2d, 0x8f, 0x2c, 0x66, 0xa3, 0xe1, 0xbc, 0xfa, + 0xe8, 0x75, 0x18, 0x17, 0x2c, 0xbe, 0xa4, 0x38, 0x6c, 0x9a, 0xc6, 0xdc, 0x30, 0xa0, 0x38, 0x85, + 0x2d, 0x03, 0x1c, 0x33, 0x2e, 0x5b, 0x52, 0x28, 0x75, 0x06, 0x38, 0xd6, 0xe1, 0xb8, 0xa3, 0x06, + 0x9a, 0x87, 0x09, 0xce, 0x83, 0x79, 0xfe, 0x26, 0x9f, 0x13, 0xe1, 0x4d, 0xa5, 0xb6, 0xd4, 0x2d, + 0x13, 0x8c, 0xd3, 0xf8, 0xe8, 0x65, 0x18, 0x75, 0xc2, 0xc6, 0x96, 0x17, 0x93, 0x46, 0xdc, 0x0e, + 0xb9, 0x9b, 0x95, 0x66, 0x5b, 0x34, 0xaf, 0xc1, 0xb0, 0x81, 0x69, 0xbf, 0x07, 0xa7, 0x32, 0x62, + 0x2e, 0xd0, 0x85, 0xe3, 0xb4, 0x3c, 0xf9, 0x4d, 0x29, 0x03, 0xe4, 0xf9, 0x5a, 0x55, 0x7e, 0x8d, + 0x86, 0x45, 0x57, 0x27, 0x8b, 0xcd, 0xa0, 0xa5, 0x00, 0x54, 0xab, 0x73, 0x59, 0x02, 0x70, 0x82, + 0x63, 0xff, 0xf7, 0x02, 0x4c, 0x64, 0xe8, 0x56, 0x58, 0x1a, 0xba, 0xd4, 0x23, 0x25, 0xc9, 0x3a, + 0x67, 0xc6, 0xcb, 0x2e, 0x1c, 0x21, 0x5e, 0x76, 0xb1, 0x57, 0xbc, 0xec, 0x81, 0xf7, 0x13, 0x2f, + 0xdb, 0x1c, 0xb1, 0xc1, 0xbe, 0x46, 0x2c, 0x23, 0xc6, 0xf6, 0xd0, 0x11, 0x63, 0x6c, 0x1b, 0x83, + 0x3e, 0xdc, 0xc7, 0xa0, 0xff, 0x50, 0x01, 0x26, 0xd3, 0x36, 0x90, 0x27, 0x20, 0xb7, 0x7d, 0xc3, + 0x90, 0xdb, 0x66, 0x27, 0x75, 0x4c, 0x5b, 0x66, 0xe6, 0xc9, 0x70, 0x71, 0x4a, 0x86, 0xfb, 0xf1, + 0xbe, 0xa8, 0x75, 0x97, 0xe7, 0xfe, 0xad, 0x02, 0x9c, 0x49, 0x57, 0x59, 0x6c, 0x3a, 0xde, 0xce, + 0x09, 0x8c, 0xcd, 0x2d, 0x63, 0x6c, 0x9e, 0xe9, 0xe7, 0x6b, 0x58, 0xd7, 0x72, 0x07, 0xe8, 0x6e, + 0x6a, 0x80, 0xae, 0xf6, 0x4f, 0xb2, 0xfb, 0x28, 0x7d, 0xb5, 0x08, 0x17, 0x33, 0xeb, 0x25, 0x62, + 0xcf, 0x65, 0x43, 0xec, 0xf9, 0x5c, 0x4a, 0xec, 0x69, 0x77, 0xaf, 0x7d, 0x3c, 0x72, 0x50, 0xe1, + 0x21, 0xcb, 0x02, 0x08, 0x3c, 0xa0, 0x0c, 0xd4, 0xf0, 0x90, 0x55, 0x84, 0xb0, 0x49, 0xf7, 0x1b, + 0x49, 0xf6, 0xf9, 0xaf, 0x2c, 0x38, 0x97, 0x39, 0x37, 0x27, 0x20, 0xeb, 0x5a, 0x35, 0x65, 0x5d, + 0x4f, 0xf6, 0xbd, 0x5a, 0x73, 0x84, 0x5f, 0xbf, 0x3e, 0x90, 0xf3, 0x2d, 0xec, 0x25, 0x7f, 0x0b, + 0x46, 0x9c, 0x46, 0x83, 0x44, 0xd1, 0x4a, 0xe0, 0xaa, 0x90, 0xc0, 0xcf, 0xb0, 0x77, 0x56, 0x52, + 0x7c, 0x78, 0x30, 0x3b, 0x93, 0x26, 0x91, 0x80, 0xb1, 0x4e, 0x01, 0x7d, 0x16, 0x4a, 0x91, 0xb8, + 0x37, 0xc5, 0xdc, 0x3f, 0xdf, 0xe7, 0xe0, 0x38, 0xeb, 0xa4, 0x69, 0x86, 0x39, 0x52, 0x92, 0x0a, + 0x45, 0xd2, 0x0c, 0x89, 0x52, 0x38, 0xd6, 0x90, 0x28, 0xcf, 0x01, 0xec, 0xaa, 0xc7, 0x40, 0x5a, + 0xfe, 0xa0, 0x3d, 0x13, 0x34, 0x2c, 0xf4, 0x2d, 0x30, 0x19, 0xf1, 0xa0, 0x7e, 0x8b, 0x4d, 0x27, + 0x62, 0x6e, 0x2e, 0x62, 0x15, 0xb2, 0x50, 0x4a, 0xf5, 0x14, 0x0c, 0x77, 0x60, 0xa3, 0x65, 0xd9, + 0x2a, 0x8b, 0x40, 0xc8, 0x17, 0xe6, 0xe5, 0xa4, 0x45, 0x91, 0x04, 0xf7, 0x74, 0x7a, 0xf8, 0xd9, + 0xc0, 0x6b, 0x35, 0xd1, 0x67, 0x01, 0xe8, 0xf2, 0x11, 0x72, 0x88, 0xe1, 0xfc, 0xc3, 0x93, 0x9e, + 0x2a, 0x6e, 0xa6, 0x55, 0x2e, 0xf3, 0x4d, 0xad, 0x28, 0x22, 0x58, 0x23, 0x68, 0xff, 0xd0, 0x00, + 0x3c, 0xda, 0xe5, 0x8c, 0x44, 0xf3, 0xa6, 0x1e, 0xf6, 0xa9, 0xf4, 0xe3, 0x7a, 0x26, 0xb3, 0xb2, + 0xf1, 0xda, 0x4e, 0x2d, 0xc5, 0xc2, 0xfb, 0x5e, 0x8a, 0xdf, 0x6f, 0x69, 0x62, 0x0f, 0x6e, 0xab, + 0xf9, 0xa9, 0x23, 0x9e, 0xfd, 0xc7, 0x28, 0x07, 0xd9, 0xc8, 0x10, 0x26, 0x3c, 0xd7, 0x77, 0x77, + 0xfa, 0x96, 0x2e, 0x9c, 0xac, 0x94, 0xf8, 0x0b, 0x16, 0x3c, 0x96, 0xd9, 0x5f, 0xc3, 0x22, 0xe7, + 0x2a, 0x94, 0x1b, 0xb4, 0x50, 0x73, 0x45, 0x4c, 0x7c, 0xb4, 0x25, 0x00, 0x27, 0x38, 0x86, 0xe1, + 0x4d, 0xa1, 0xa7, 0xe1, 0xcd, 0x3f, 0xb5, 0xa0, 0x63, 0x7f, 0x9c, 0xc0, 0x41, 0x5d, 0x35, 0x0f, + 0xea, 0x8f, 0xf6, 0x33, 0x97, 0x39, 0x67, 0xf4, 0x1f, 0x4d, 0xc0, 0xd9, 0x1c, 0x57, 0x9c, 0x5d, + 0x98, 0xda, 0x6c, 0x10, 0xd3, 0xc9, 0x53, 0x7c, 0x4c, 0xa6, 0x3f, 0x6c, 0x57, 0x8f, 0x50, 0x96, + 0xd1, 0x72, 0xaa, 0x03, 0x05, 0x77, 0x36, 0x81, 0xbe, 0x60, 0xc1, 0x69, 0x67, 0x2f, 0xea, 0x48, + 0x81, 0x2f, 0xd6, 0xcc, 0x0b, 0x99, 0x42, 0x90, 0x1e, 0x29, 0xf3, 0x79, 0x8a, 0xcf, 0x2c, 0x2c, + 0x9c, 0xd9, 0x16, 0xc2, 0x22, 0x48, 0x3c, 0x65, 0xe7, 0xbb, 0xb8, 0x21, 0x67, 0xf9, 0x4c, 0xf1, + 0x1b, 0x44, 0x42, 0xb0, 0xa2, 0x83, 0x3e, 0x0f, 0xe5, 0x4d, 0xe9, 0xc8, 0x98, 0x71, 0x43, 0x25, + 0x03, 0xd9, 0xdd, 0xbd, 0x93, 0x6b, 0x32, 0x15, 0x12, 0x4e, 0x88, 0xa2, 0xd7, 0xa1, 0xe8, 0x6f, + 0x44, 0xdd, 0xb2, 0x64, 0xa6, 0x4c, 0xd6, 0xb8, 0xb3, 0xff, 0xea, 0x72, 0x1d, 0xd3, 0x8a, 0xe8, + 0x3a, 0x14, 0xc3, 0x75, 0x57, 0x48, 0xf0, 0x32, 0xcf, 0x70, 0xbc, 0x50, 0xc9, 0xe9, 0x15, 0xa3, + 0x84, 0x17, 0x2a, 0x98, 0x92, 0x40, 0x35, 0x18, 0x64, 0xfe, 0x2b, 0xe2, 0x3e, 0xc8, 0xe4, 0x7c, + 0xbb, 0xf8, 0x81, 0xf1, 0x88, 0x00, 0x0c, 0x01, 0x73, 0x42, 0x68, 0x0d, 0x86, 0x1a, 0x2c, 0xa3, + 0xa2, 0x88, 0x47, 0xf6, 0x89, 0x4c, 0x59, 0x5d, 0x97, 0x54, 0x93, 0x42, 0x74, 0xc5, 0x30, 0xb0, + 0xa0, 0xc5, 0xa8, 0x92, 0xd6, 0xd6, 0x46, 0x24, 0x32, 0x00, 0x67, 0x53, 0xed, 0x92, 0x41, 0x55, + 0x50, 0x65, 0x18, 0x58, 0xd0, 0x42, 0xaf, 0x40, 0x61, 0xa3, 0x21, 0x7c, 0x53, 0x32, 0x85, 0x76, + 0x66, 0xbc, 0x86, 0x85, 0xa1, 0xfb, 0x07, 0xb3, 0x85, 0xe5, 0x45, 0x5c, 0xd8, 0x68, 0xa0, 0x55, + 0x18, 0xde, 0xe0, 0x1e, 0xde, 0x42, 0x2e, 0xf7, 0x44, 0xb6, 0xf3, 0x79, 0x87, 0x13, 0x38, 0x77, + 0xcb, 0x10, 0x00, 0x2c, 0x89, 0xb0, 0x98, 0xeb, 0xca, 0x53, 0x5d, 0x84, 0xee, 0x9a, 0x3b, 0x5a, + 0x74, 0x01, 0x7e, 0x3f, 0x27, 0xfe, 0xee, 0x58, 0xa3, 0x48, 0x57, 0xb5, 0x23, 0xd3, 0xb0, 0x8b, + 0x50, 0x2c, 0x99, 0xab, 0xba, 0x47, 0x86, 0x7a, 0xbe, 0xaa, 0x15, 0x12, 0x4e, 0x88, 0xa2, 0x6d, + 0x18, 0xdb, 0x8d, 0x5a, 0x5b, 0x44, 0x6e, 0x69, 0x16, 0x99, 0x25, 0xe7, 0x0a, 0xbb, 0x23, 0x10, + 0xbd, 0x30, 0x6e, 0x3b, 0xcd, 0x8e, 0x53, 0x88, 0xa9, 0xbf, 0xef, 0xe8, 0xc4, 0xb0, 0x49, 0x9b, + 0x0e, 0xff, 0xbb, 0xed, 0x60, 0x7d, 0x3f, 0x26, 0x22, 0xe2, 0x56, 0xe6, 0xf0, 0xbf, 0xc9, 0x51, + 0x3a, 0x87, 0x5f, 0x00, 0xb0, 0x24, 0x82, 0xee, 0x88, 0xe1, 0x61, 0xa7, 0xe7, 0x64, 0x7e, 0x58, + 0xcc, 0x79, 0x89, 0x94, 0x33, 0x28, 0xec, 0xb4, 0x4c, 0x48, 0xb1, 0x53, 0xb2, 0xb5, 0x15, 0xc4, + 0x81, 0x9f, 0x3a, 0xa1, 0xa7, 0xf2, 0x4f, 0xc9, 0x5a, 0x06, 0x7e, 0xe7, 0x29, 0x99, 0x85, 0x85, + 0x33, 0xdb, 0x42, 0x2e, 0x8c, 0xb7, 0x82, 0x30, 0xde, 0x0b, 0x42, 0xb9, 0xbe, 0x50, 0x17, 0xb9, + 0x82, 0x81, 0x29, 0x5a, 0x64, 0xc1, 0xec, 0x4c, 0x08, 0x4e, 0xd1, 0x44, 0x9f, 0x86, 0xe1, 0xa8, + 0xe1, 0x34, 0x49, 0xf5, 0xd6, 0xf4, 0xa9, 0xfc, 0xeb, 0xa7, 0xce, 0x51, 0x72, 0x56, 0x17, 0x0f, + 0xd0, 0xce, 0x51, 0xb0, 0x24, 0x87, 0x96, 0x61, 0x90, 0xe5, 0xd4, 0x62, 0xe1, 0xe1, 0x72, 0xa2, + 0x7b, 0x76, 0x18, 0x10, 0xf3, 0xb3, 0x89, 0x15, 0x63, 0x5e, 0x9d, 0xee, 0x01, 0xc1, 0x5e, 0x07, + 0xd1, 0xf4, 0x99, 0xfc, 0x3d, 0x20, 0xb8, 0xf2, 0x5b, 0xf5, 0x6e, 0x7b, 0x40, 0x21, 0xe1, 0x84, + 0x28, 0x3d, 0x99, 0xe9, 0x69, 0x7a, 0xb6, 0x8b, 0xe5, 0x4b, 0xee, 0x59, 0xca, 0x4e, 0x66, 0x7a, + 0x92, 0x52, 0x12, 0xf6, 0xef, 0x0e, 0x77, 0xf2, 0x2c, 0xec, 0x41, 0xf6, 0x5d, 0x56, 0x87, 0xae, + 0xee, 0x93, 0xfd, 0xca, 0x87, 0x8e, 0x91, 0x5b, 0xfd, 0x82, 0x05, 0x67, 0x5b, 0x99, 0x1f, 0x22, + 0x18, 0x80, 0xfe, 0xc4, 0x4c, 0xfc, 0xd3, 0x55, 0x28, 0xc1, 0x6c, 0x38, 0xce, 0x69, 0x29, 0xfd, + 0x22, 0x28, 0xbe, 0xef, 0x17, 0xc1, 0x0a, 0x94, 0x18, 0x93, 0xd9, 0x23, 0xc3, 0x70, 0xfa, 0x61, + 0xc4, 0x58, 0x89, 0x45, 0x51, 0x11, 0x2b, 0x12, 0xe8, 0x07, 0x2c, 0xb8, 0x90, 0xee, 0x3a, 0x26, + 0x0c, 0x2c, 0xe2, 0x0f, 0xf2, 0xb7, 0xe0, 0xb2, 0xf8, 0xfe, 0x0b, 0xb5, 0x6e, 0xc8, 0x87, 0xbd, + 0x10, 0x70, 0xf7, 0xc6, 0x50, 0x25, 0xe3, 0x31, 0x3a, 0x64, 0x0a, 0xe0, 0xfb, 0x78, 0x90, 0xbe, + 0x00, 0xa3, 0x3b, 0x41, 0xdb, 0x8f, 0x85, 0xa1, 0x8c, 0x50, 0xda, 0x33, 0x65, 0xf5, 0x8a, 0x56, + 0x8e, 0x0d, 0xac, 0xd4, 0x33, 0xb6, 0xf4, 0xc0, 0xcf, 0xd8, 0xb7, 0x61, 0xd4, 0xd7, 0x2c, 0x3b, + 0x05, 0x3f, 0x70, 0x39, 0x3f, 0x76, 0xa8, 0x6e, 0x07, 0xca, 0x7b, 0xa9, 0x97, 0x60, 0x83, 0xda, + 0xc9, 0xbe, 0x8d, 0x7e, 0xda, 0xca, 0x60, 0xea, 0xf9, 0x6b, 0xf9, 0x35, 0xf3, 0xb5, 0x7c, 0x39, + 0xfd, 0x5a, 0xee, 0x10, 0xbe, 0x1a, 0x0f, 0xe5, 0xfe, 0xf3, 0x9c, 0xf4, 0x1b, 0x26, 0xd0, 0x6e, + 0xc2, 0xa5, 0x5e, 0xd7, 0x12, 0xb3, 0x98, 0x72, 0x95, 0xaa, 0x2d, 0xb1, 0x98, 0x72, 0xab, 0x15, + 0xcc, 0x20, 0xfd, 0xc6, 0x91, 0xb1, 0xff, 0x9b, 0x05, 0xc5, 0x5a, 0xe0, 0x9e, 0x80, 0x30, 0xf9, + 0x53, 0x86, 0x30, 0xf9, 0xd1, 0xec, 0x0b, 0xd1, 0xcd, 0x15, 0x1d, 0x2f, 0xa5, 0x44, 0xc7, 0x17, + 0xf2, 0x08, 0x74, 0x17, 0x14, 0xff, 0x44, 0x11, 0x46, 0x6a, 0x81, 0xab, 0xcc, 0x95, 0x7f, 0xfd, + 0x41, 0xcc, 0x95, 0x73, 0x03, 0xfc, 0x6b, 0x94, 0x99, 0xa1, 0x95, 0xf4, 0xb1, 0xfc, 0x0b, 0x66, + 0xb5, 0x7c, 0x97, 0x78, 0x9b, 0x5b, 0x31, 0x71, 0xd3, 0x9f, 0x73, 0x72, 0x56, 0xcb, 0xff, 0xd5, + 0x82, 0x89, 0x54, 0xeb, 0xa8, 0x09, 0x63, 0x4d, 0x5d, 0x30, 0x29, 0xd6, 0xe9, 0x03, 0xc9, 0x34, + 0x85, 0xd5, 0xa7, 0x56, 0x84, 0x4d, 0xe2, 0x68, 0x0e, 0x40, 0x69, 0xea, 0xa4, 0x04, 0x8c, 0x71, + 0xfd, 0x4a, 0x95, 0x17, 0x61, 0x0d, 0x03, 0xbd, 0x08, 0x23, 0x71, 0xd0, 0x0a, 0x9a, 0xc1, 0xe6, + 0xfe, 0x0d, 0x22, 0x23, 0x17, 0x29, 0x5b, 0xae, 0xb5, 0x04, 0x84, 0x75, 0x3c, 0xfb, 0xa7, 0x8a, + 0xfc, 0x43, 0xfd, 0xd8, 0xfb, 0x70, 0x4d, 0x7e, 0xb0, 0xd7, 0xe4, 0x57, 0x2d, 0x98, 0xa4, 0xad, + 0x33, 0x73, 0x11, 0x79, 0xd9, 0xaa, 0x98, 0xc1, 0x56, 0x97, 0x98, 0xc1, 0x97, 0xe9, 0xd9, 0xe5, + 0x06, 0xed, 0x58, 0x48, 0xd0, 0xb4, 0xc3, 0x89, 0x96, 0x62, 0x01, 0x15, 0x78, 0x24, 0x0c, 0x85, + 0x8b, 0x9b, 0x8e, 0x47, 0xc2, 0x10, 0x0b, 0xa8, 0x0c, 0x29, 0x3c, 0x90, 0x1d, 0x52, 0x98, 0xc7, + 0x61, 0x14, 0x86, 0x05, 0x82, 0xed, 0xd1, 0xe2, 0x30, 0x4a, 0x8b, 0x83, 0x04, 0xc7, 0xfe, 0xf9, + 0x22, 0x8c, 0xd6, 0x02, 0x37, 0xd1, 0x95, 0xbd, 0x60, 0xe8, 0xca, 0x2e, 0xa5, 0x74, 0x65, 0x93, + 0x3a, 0xee, 0x87, 0x9a, 0xb1, 0xaf, 0x97, 0x66, 0xec, 0x9f, 0x58, 0x6c, 0xd6, 0x2a, 0xab, 0x75, + 0x6e, 0x7d, 0x84, 0x9e, 0x85, 0x11, 0x76, 0x20, 0x31, 0x9f, 0x4a, 0xa9, 0x40, 0x62, 0x29, 0x94, + 0x56, 0x93, 0x62, 0xac, 0xe3, 0xa0, 0x2b, 0x50, 0x8a, 0x88, 0x13, 0x36, 0xb6, 0xd4, 0x19, 0x27, + 0xb4, 0x3d, 0xbc, 0x0c, 0x2b, 0x28, 0x7a, 0x33, 0x09, 0x01, 0x58, 0xcc, 0xf7, 0xd1, 0xd2, 0xfb, + 0xc3, 0xb7, 0x48, 0x7e, 0xdc, 0x3f, 0xfb, 0x2e, 0xa0, 0x4e, 0xfc, 0x3e, 0x62, 0x5f, 0xcd, 0x9a, + 0xb1, 0xaf, 0xca, 0x1d, 0x71, 0xaf, 0xfe, 0xcc, 0x82, 0xf1, 0x5a, 0xe0, 0xd2, 0xad, 0xfb, 0x8d, + 0xb4, 0x4f, 0xf5, 0xf8, 0xa7, 0x43, 0x5d, 0xe2, 0x9f, 0x3e, 0x0e, 0x83, 0xb5, 0xc0, 0xad, 0xd6, + 0xba, 0xf9, 0x36, 0xdb, 0x7f, 0xdb, 0x82, 0xe1, 0x5a, 0xe0, 0x9e, 0x80, 0x70, 0xfe, 0x35, 0x53, + 0x38, 0xff, 0x48, 0xce, 0xba, 0xc9, 0x91, 0xc7, 0xff, 0xcd, 0x01, 0x18, 0xa3, 0xfd, 0x0c, 0x36, + 0xe5, 0x54, 0x1a, 0xc3, 0x66, 0xf5, 0x31, 0x6c, 0x94, 0x17, 0x0e, 0x9a, 0xcd, 0x60, 0x2f, 0x3d, + 0xad, 0xcb, 0xac, 0x14, 0x0b, 0x28, 0x7a, 0x1a, 0x4a, 0xad, 0x90, 0xec, 0x7a, 0x81, 0x60, 0x32, + 0x35, 0x55, 0x47, 0x4d, 0x94, 0x63, 0x85, 0x41, 0x1f, 0x67, 0x91, 0xe7, 0x37, 0x48, 0x9d, 0x34, + 0x02, 0xdf, 0xe5, 0xf2, 0xeb, 0xa2, 0x48, 0x1b, 0xa0, 0x95, 0x63, 0x03, 0x0b, 0xdd, 0x85, 0x32, + 0xfb, 0xcf, 0x8e, 0x9d, 0xa3, 0x67, 0x93, 0x14, 0xd9, 0xc5, 0x04, 0x01, 0x9c, 0xd0, 0x42, 0xcf, + 0x01, 0xc4, 0x32, 0x42, 0x76, 0x24, 0xe2, 0x1c, 0x29, 0x86, 0x5c, 0xc5, 0xce, 0x8e, 0xb0, 0x86, + 0x85, 0x9e, 0x82, 0x72, 0xec, 0x78, 0xcd, 0x9b, 0x9e, 0x4f, 0x22, 0x26, 0x97, 0x2e, 0xca, 0x24, + 0x5f, 0xa2, 0x10, 0x27, 0x70, 0xca, 0x10, 0xb1, 0x20, 0x00, 0x3c, 0x17, 0x6d, 0x89, 0x61, 0x33, + 0x86, 0xe8, 0xa6, 0x2a, 0xc5, 0x1a, 0x06, 0xda, 0x82, 0xf3, 0x9e, 0xcf, 0x42, 0xec, 0x93, 0xfa, + 0xb6, 0xd7, 0x5a, 0xbb, 0x59, 0xbf, 0x43, 0x42, 0x6f, 0x63, 0x7f, 0xc1, 0x69, 0x6c, 0x13, 0x5f, + 0xe6, 0x09, 0xfc, 0xa8, 0xe8, 0xe2, 0xf9, 0x6a, 0x17, 0x5c, 0xdc, 0x95, 0x92, 0xfd, 0x32, 0x9c, + 0xa9, 0x05, 0x6e, 0x2d, 0x08, 0xe3, 0xe5, 0x20, 0xdc, 0x73, 0x42, 0x57, 0xae, 0x94, 0x59, 0x99, + 0x85, 0x84, 0x1e, 0x85, 0x83, 0xfc, 0xa0, 0x30, 0x72, 0x61, 0x3d, 0xcf, 0x98, 0xaf, 0x23, 0x3a, + 0xa3, 0x34, 0x18, 0x1b, 0xa0, 0xf2, 0x4d, 0x5c, 0x73, 0x62, 0x82, 0x6e, 0xb1, 0xa4, 0xb8, 0xc9, + 0x8d, 0x28, 0xaa, 0x3f, 0xa9, 0x25, 0xc5, 0x4d, 0x80, 0x99, 0x57, 0xa8, 0x59, 0xdf, 0xfe, 0xd9, + 0x01, 0x76, 0x38, 0xa6, 0x72, 0x16, 0xa0, 0xcf, 0xc1, 0x78, 0x44, 0x6e, 0x7a, 0x7e, 0xfb, 0x9e, + 0x94, 0x09, 0x74, 0x71, 0x27, 0xaa, 0x2f, 0xe9, 0x98, 0x5c, 0xb2, 0x68, 0x96, 0xe1, 0x14, 0x35, + 0xb4, 0x03, 0xe3, 0x7b, 0x9e, 0xef, 0x06, 0x7b, 0x91, 0xa4, 0x5f, 0xca, 0x17, 0x30, 0xde, 0xe5, + 0x98, 0xa9, 0x3e, 0x1a, 0xcd, 0xdd, 0x35, 0x88, 0xe1, 0x14, 0x71, 0xba, 0x00, 0xc3, 0xb6, 0x3f, + 0x1f, 0xdd, 0x8e, 0x48, 0x28, 0xd2, 0x1b, 0xb3, 0x05, 0x88, 0x65, 0x21, 0x4e, 0xe0, 0x74, 0x01, + 0xb2, 0x3f, 0xd7, 0xc2, 0xa0, 0xcd, 0xe3, 0xd8, 0x8b, 0x05, 0x88, 0x55, 0x29, 0xd6, 0x30, 0xe8, + 0x06, 0x65, 0xff, 0x56, 0x03, 0x1f, 0x07, 0x41, 0x2c, 0xb7, 0x34, 0x4b, 0xa8, 0xa9, 0x95, 0x63, + 0x03, 0x0b, 0x2d, 0x03, 0x8a, 0xda, 0xad, 0x56, 0x93, 0xd9, 0x29, 0x38, 0x4d, 0x46, 0x8a, 0xeb, + 0x88, 0x8b, 0x3c, 0x4a, 0x67, 0xbd, 0x03, 0x8a, 0x33, 0x6a, 0xd0, 0xb3, 0x7a, 0x43, 0x74, 0x75, + 0x90, 0x75, 0x95, 0x2b, 0x23, 0xea, 0xbc, 0x9f, 0x12, 0x86, 0x96, 0x60, 0x38, 0xda, 0x8f, 0x1a, + 0xb1, 0x08, 0x37, 0x96, 0x93, 0x96, 0xa6, 0xce, 0x50, 0xb4, 0xac, 0x68, 0xbc, 0x0a, 0x96, 0x75, + 0xed, 0x6f, 0x67, 0xac, 0x00, 0x4b, 0x86, 0x1b, 0xb7, 0x43, 0x82, 0x76, 0x60, 0xac, 0xc5, 0x56, + 0x98, 0x08, 0xcc, 0x2e, 0x96, 0xc9, 0x0b, 0x7d, 0xbe, 0xe9, 0xf7, 0xe8, 0x09, 0xaa, 0x64, 0x6e, + 0xec, 0xb1, 0x54, 0xd3, 0xc9, 0x61, 0x93, 0xba, 0xfd, 0xd5, 0xb3, 0xec, 0x32, 0xa9, 0xf3, 0x87, + 0xfa, 0xb0, 0x30, 0xac, 0x16, 0xaf, 0x92, 0x99, 0x7c, 0x89, 0x51, 0xf2, 0x45, 0xc2, 0x38, 0x1b, + 0xcb, 0xba, 0xe8, 0xb3, 0x30, 0x4e, 0x99, 0x7c, 0x2d, 0x31, 0xc5, 0xe9, 0x7c, 0x07, 0xf8, 0x24, + 0x1f, 0x85, 0x96, 0xb4, 0x41, 0xaf, 0x8c, 0x53, 0xc4, 0xd0, 0x9b, 0xcc, 0x04, 0xc0, 0xcc, 0x79, + 0xd1, 0x83, 0xb4, 0xae, 0xed, 0x97, 0x64, 0x35, 0x22, 0x79, 0xf9, 0x34, 0xec, 0x87, 0x9b, 0x4f, + 0x03, 0xdd, 0x84, 0x31, 0x91, 0x11, 0x56, 0x08, 0x3a, 0x8b, 0x86, 0x20, 0x6b, 0x0c, 0xeb, 0xc0, + 0xc3, 0x74, 0x01, 0x36, 0x2b, 0xa3, 0x4d, 0xb8, 0xa0, 0x25, 0x75, 0xb9, 0x16, 0x3a, 0x4c, 0x1b, + 0xed, 0xb1, 0x93, 0x48, 0xbb, 0xe6, 0x1e, 0xbb, 0x7f, 0x30, 0x7b, 0x61, 0xad, 0x1b, 0x22, 0xee, + 0x4e, 0x07, 0xdd, 0x82, 0x33, 0xdc, 0x7d, 0xb3, 0x42, 0x1c, 0xb7, 0xe9, 0xf9, 0xea, 0x1e, 0xe5, + 0xbb, 0xe5, 0xdc, 0xfd, 0x83, 0xd9, 0x33, 0xf3, 0x59, 0x08, 0x38, 0xbb, 0x1e, 0x7a, 0x0d, 0xca, + 0xae, 0x1f, 0x89, 0x31, 0x18, 0x32, 0xf2, 0xe6, 0x94, 0x2b, 0xab, 0x75, 0xf5, 0xfd, 0xc9, 0x1f, + 0x9c, 0x54, 0x40, 0x9b, 0x5c, 0xd8, 0xa9, 0x64, 0x0b, 0xc3, 0x1d, 0x81, 0x67, 0xd2, 0x52, 0x2a, + 0xc3, 0x81, 0x8b, 0x4b, 0xf9, 0x95, 0x5d, 0xb3, 0xe1, 0xdb, 0x65, 0x10, 0x46, 0x6f, 0x00, 0xa2, + 0xcc, 0xb7, 0xd7, 0x20, 0xf3, 0x0d, 0x16, 0xf5, 0x9f, 0xc9, 0x86, 0x4b, 0xa6, 0x4b, 0x51, 0xbd, + 0x03, 0x03, 0x67, 0xd4, 0x42, 0xd7, 0xe9, 0x6d, 0xa0, 0x97, 0x0a, 0xfb, 0x6c, 0x95, 0xe5, 0xac, + 0x42, 0x5a, 0x21, 0x69, 0x38, 0x31, 0x71, 0x4d, 0x8a, 0x38, 0x55, 0x0f, 0xb9, 0x70, 0xde, 0x69, + 0xc7, 0x01, 0x93, 0x23, 0x9b, 0xa8, 0x6b, 0xc1, 0x36, 0xf1, 0x99, 0x0a, 0xa7, 0xb4, 0x70, 0x89, + 0x5e, 0xd4, 0xf3, 0x5d, 0xf0, 0x70, 0x57, 0x2a, 0x94, 0xc1, 0x52, 0x39, 0x4a, 0xc1, 0x8c, 0xa7, + 0x93, 0x91, 0xa7, 0xf4, 0x45, 0x18, 0xd9, 0x0a, 0xa2, 0x78, 0x95, 0xc4, 0x7b, 0x41, 0xb8, 0x2d, + 0xa2, 0x22, 0x26, 0x91, 0x74, 0x13, 0x10, 0xd6, 0xf1, 0xe8, 0x0b, 0x8a, 0x19, 0x18, 0x54, 0x2b, + 0x4c, 0xb7, 0x5b, 0x4a, 0xce, 0x98, 0xeb, 0xbc, 0x18, 0x4b, 0xb8, 0x44, 0xad, 0xd6, 0x16, 0x99, + 0x9e, 0x36, 0x85, 0x5a, 0xad, 0x2d, 0x62, 0x09, 0xa7, 0xcb, 0x35, 0xda, 0x72, 0x42, 0x52, 0x0b, + 0x83, 0x06, 0x89, 0xb4, 0xf8, 0xcd, 0x8f, 0xf2, 0x98, 0x8f, 0x74, 0xb9, 0xd6, 0xb3, 0x10, 0x70, + 0x76, 0x3d, 0x44, 0x3a, 0x13, 0x1a, 0x8d, 0xe7, 0x0b, 0xd8, 0x3b, 0x59, 0x81, 0x3e, 0x73, 0x1a, + 0xf9, 0x30, 0xa9, 0x52, 0x29, 0xf1, 0x28, 0x8f, 0xd1, 0xf4, 0x04, 0x5b, 0xdb, 0xfd, 0x87, 0x88, + 0x54, 0x2a, 0x8b, 0x6a, 0x8a, 0x12, 0xee, 0xa0, 0x6d, 0x84, 0x4c, 0x9a, 0xec, 0x99, 0xb4, 0xf6, + 0x2a, 0x94, 0xa3, 0xf6, 0xba, 0x1b, 0xec, 0x38, 0x9e, 0xcf, 0xf4, 0xb4, 0x1a, 0x2b, 0x5f, 0x97, + 0x00, 0x9c, 0xe0, 0xa0, 0x65, 0x28, 0x39, 0x52, 0x1f, 0x81, 0xf2, 0x23, 0x6d, 0x28, 0x2d, 0x04, + 0x77, 0x3e, 0x97, 0x1a, 0x08, 0x55, 0x17, 0xbd, 0x0a, 0x63, 0xc2, 0xfd, 0x50, 0x64, 0xf1, 0x3b, + 0x65, 0xfa, 0x88, 0xd4, 0x75, 0x20, 0x36, 0x71, 0xd1, 0x6d, 0x18, 0x89, 0x83, 0x26, 0x73, 0x74, + 0xa0, 0x1c, 0xd2, 0xd9, 0xfc, 0x68, 0x5d, 0x6b, 0x0a, 0x4d, 0x17, 0x05, 0xaa, 0xaa, 0x58, 0xa7, + 0x83, 0xd6, 0xf8, 0x7a, 0x67, 0x71, 0x8c, 0x49, 0x34, 0xfd, 0x48, 0xfe, 0x9d, 0xa4, 0xc2, 0x1d, + 0x9b, 0xdb, 0x41, 0xd4, 0xc4, 0x3a, 0x19, 0x74, 0x0d, 0xa6, 0x5a, 0xa1, 0x17, 0xb0, 0x35, 0xa1, + 0x54, 0x51, 0xd3, 0x66, 0xf6, 0x95, 0x5a, 0x1a, 0x01, 0x77, 0xd6, 0x61, 0xde, 0xa3, 0xa2, 0x70, + 0xfa, 0x1c, 0xcf, 0xda, 0xcb, 0x5f, 0x46, 0xbc, 0x0c, 0x2b, 0x28, 0x5a, 0x61, 0x27, 0x31, 0x7f, + 0xd4, 0x4f, 0xcf, 0xe4, 0x07, 0xf7, 0xd0, 0x1f, 0xff, 0x9c, 0xef, 0x53, 0x7f, 0x71, 0x42, 0x01, + 0xb9, 0x5a, 0x46, 0x38, 0xca, 0x6c, 0x47, 0xd3, 0xe7, 0xbb, 0x58, 0x79, 0xa5, 0x38, 0xf3, 0x84, + 0x21, 0x30, 0x8a, 0x23, 0x9c, 0xa2, 0x89, 0xbe, 0x05, 0x26, 0x45, 0x30, 0xb1, 0x64, 0x98, 0x2e, + 0x24, 0xe6, 0xa3, 0x38, 0x05, 0xc3, 0x1d, 0xd8, 0x3c, 0xbe, 0xbb, 0xb3, 0xde, 0x24, 0xe2, 0xe8, + 0xbb, 0xe9, 0xf9, 0xdb, 0xd1, 0xf4, 0x45, 0x76, 0x3e, 0x88, 0xf8, 0xee, 0x69, 0x28, 0xce, 0xa8, + 0x81, 0xd6, 0x60, 0xb2, 0x15, 0x12, 0xb2, 0xc3, 0x78, 0x64, 0x71, 0x9f, 0xcd, 0x72, 0xe7, 0x69, + 0xda, 0x93, 0x5a, 0x0a, 0x76, 0x98, 0x51, 0x86, 0x3b, 0x28, 0xa0, 0x3d, 0x28, 0x05, 0xbb, 0x24, + 0xdc, 0x22, 0x8e, 0x3b, 0x7d, 0xa9, 0x8b, 0x39, 0xb3, 0xb8, 0xdc, 0x6e, 0x09, 0xdc, 0x94, 0xfa, + 0x5a, 0x16, 0xf7, 0x56, 0x5f, 0xcb, 0xc6, 0xd0, 0x0f, 0x5a, 0x70, 0x4e, 0x4a, 0xbc, 0xeb, 0x2d, + 0x3a, 0xea, 0x8b, 0x81, 0x1f, 0xc5, 0x21, 0x77, 0xf7, 0x7d, 0x2c, 0xdf, 0x05, 0x76, 0x2d, 0xa7, + 0x92, 0x92, 0x2b, 0x9e, 0xcb, 0xc3, 0x88, 0x70, 0x7e, 0x8b, 0x33, 0xdf, 0x0c, 0x53, 0x1d, 0x37, + 0xf7, 0x51, 0x52, 0x4e, 0xcc, 0x6c, 0xc3, 0x98, 0x31, 0x3a, 0x0f, 0x55, 0x73, 0xf9, 0x2f, 0x87, + 0xa1, 0xac, 0xb4, 0x5a, 0xe8, 0xaa, 0xa9, 0xac, 0x3c, 0x97, 0x56, 0x56, 0x96, 0xe8, 0x6b, 0x56, + 0xd7, 0x4f, 0xae, 0x65, 0x04, 0x57, 0xca, 0xdb, 0x8b, 0xfd, 0x7b, 0xcd, 0x6a, 0x42, 0xca, 0x62, + 0xdf, 0x5a, 0xcf, 0x81, 0xae, 0x72, 0xcf, 0x6b, 0x30, 0xe5, 0x07, 0x8c, 0x5d, 0x24, 0xae, 0xe4, + 0x05, 0xd8, 0x95, 0x5f, 0xd6, 0xa3, 0x15, 0xa4, 0x10, 0x70, 0x67, 0x1d, 0xda, 0x20, 0xbf, 0xb3, + 0xd3, 0x82, 0x56, 0x7e, 0xa5, 0x63, 0x01, 0x45, 0x8f, 0xc3, 0x60, 0x2b, 0x70, 0xab, 0x35, 0xc1, + 0x2a, 0x6a, 0xe9, 0x47, 0xdd, 0x6a, 0x0d, 0x73, 0x18, 0x9a, 0x87, 0x21, 0xf6, 0x23, 0x9a, 0x1e, + 0xcd, 0x77, 0x4b, 0x67, 0x35, 0xb4, 0x84, 0x1e, 0xac, 0x02, 0x16, 0x15, 0x99, 0xc0, 0x87, 0xf2, + 0xd7, 0x4c, 0xe0, 0x33, 0xfc, 0x80, 0x02, 0x1f, 0x49, 0x00, 0x27, 0xb4, 0xd0, 0x3d, 0x38, 0x63, + 0xbc, 0x69, 0xf8, 0x12, 0x21, 0x91, 0x70, 0x8d, 0x7d, 0xbc, 0xeb, 0x63, 0x46, 0x68, 0x49, 0x2f, + 0x88, 0x4e, 0x9f, 0xa9, 0x66, 0x51, 0xc2, 0xd9, 0x0d, 0xa0, 0x26, 0x4c, 0x35, 0x3a, 0x5a, 0x2d, + 0xf5, 0xdf, 0xaa, 0x9a, 0xd0, 0xce, 0x16, 0x3b, 0x09, 0xa3, 0x57, 0xa1, 0xf4, 0x6e, 0x10, 0xb1, + 0x63, 0x56, 0xb0, 0xb7, 0xd2, 0xaf, 0xb2, 0xf4, 0xe6, 0xad, 0x3a, 0x2b, 0x3f, 0x3c, 0x98, 0x1d, + 0xa9, 0x05, 0xae, 0xfc, 0x8b, 0x55, 0x05, 0xf4, 0xbd, 0x16, 0xcc, 0x74, 0x3e, 0x9a, 0x54, 0xa7, + 0xc7, 0xfa, 0xef, 0xb4, 0x2d, 0x1a, 0x9d, 0x59, 0xca, 0x25, 0x87, 0xbb, 0x34, 0x65, 0x7f, 0x99, + 0x6b, 0x34, 0x85, 0xde, 0x83, 0x44, 0xed, 0xe6, 0x49, 0x24, 0x40, 0x5c, 0x32, 0x54, 0x32, 0x0f, + 0xac, 0x35, 0xff, 0x35, 0x8b, 0x69, 0xcd, 0xd7, 0xc8, 0x4e, 0xab, 0xe9, 0xc4, 0x27, 0xe1, 0x96, + 0xf7, 0x26, 0x94, 0x62, 0xd1, 0x5a, 0xb7, 0x9c, 0x8d, 0x5a, 0xa7, 0x98, 0xe5, 0x80, 0x62, 0x36, + 0x65, 0x29, 0x56, 0x64, 0xec, 0x7f, 0xc8, 0x67, 0x40, 0x42, 0x4e, 0x40, 0xf2, 0x5d, 0x31, 0x25, + 0xdf, 0xb3, 0x3d, 0xbe, 0x20, 0x47, 0x02, 0xfe, 0x0f, 0xcc, 0x7e, 0x33, 0x21, 0xcb, 0x07, 0xdd, + 0x5c, 0xc3, 0xfe, 0x61, 0x0b, 0x4e, 0x67, 0xd9, 0x37, 0xd2, 0x07, 0x02, 0x17, 0xf1, 0x28, 0xf3, + 0x15, 0x35, 0x82, 0x77, 0x44, 0x39, 0x56, 0x18, 0x7d, 0xa7, 0x43, 0x3a, 0x5a, 0x78, 0xd0, 0x5b, + 0x30, 0x56, 0x0b, 0x89, 0x76, 0xa1, 0xbd, 0xce, 0xfd, 0x6c, 0x79, 0x7f, 0x9e, 0x3e, 0xb2, 0x8f, + 0xad, 0xfd, 0x33, 0x05, 0x38, 0xcd, 0xf5, 0xcf, 0xf3, 0xbb, 0x81, 0xe7, 0xd6, 0x02, 0x57, 0xa4, + 0xb2, 0x7a, 0x0b, 0x46, 0x5b, 0x9a, 0x5c, 0xae, 0x5b, 0xa8, 0x3b, 0x5d, 0x7e, 0x97, 0x48, 0x12, + 0xf4, 0x52, 0x6c, 0xd0, 0x42, 0x2e, 0x8c, 0x92, 0x5d, 0xaf, 0xa1, 0x94, 0x98, 0x85, 0x23, 0x5f, + 0x2e, 0xaa, 0x95, 0x25, 0x8d, 0x0e, 0x36, 0xa8, 0x3e, 0x84, 0xec, 0xa6, 0xf6, 0x8f, 0x58, 0xf0, + 0x48, 0x4e, 0x60, 0x3c, 0xda, 0xdc, 0x1e, 0xd3, 0xf4, 0x8b, 0x44, 0x89, 0xaa, 0x39, 0xae, 0xff, + 0xc7, 0x02, 0x8a, 0x3e, 0x0d, 0xc0, 0xf5, 0xf7, 0xf4, 0x85, 0xda, 0x2b, 0x82, 0x98, 0x11, 0xfc, + 0x48, 0x8b, 0x63, 0x23, 0xeb, 0x63, 0x8d, 0x96, 0xfd, 0x93, 0x45, 0x18, 0xe4, 0x29, 0x9e, 0x97, + 0x61, 0x78, 0x8b, 0x07, 0xf8, 0xef, 0x27, 0x97, 0x40, 0x22, 0x3b, 0xe0, 0x05, 0x58, 0x56, 0x46, + 0x2b, 0x70, 0x8a, 0x27, 0x48, 0x68, 0x56, 0x48, 0xd3, 0xd9, 0x97, 0x82, 0x2e, 0x9e, 0x5c, 0x50, + 0x09, 0xfc, 0xaa, 0x9d, 0x28, 0x38, 0xab, 0x1e, 0x7a, 0x1d, 0xc6, 0xe9, 0xc3, 0x23, 0x68, 0xc7, + 0x92, 0x12, 0x4f, 0x8d, 0xa0, 0x5e, 0x3a, 0x6b, 0x06, 0x14, 0xa7, 0xb0, 0xe9, 0xdb, 0xb7, 0xd5, + 0x21, 0xd2, 0x1b, 0x4c, 0xde, 0xbe, 0xa6, 0x18, 0xcf, 0xc4, 0x65, 0x86, 0x8d, 0x6d, 0x66, 0xc6, + 0xb9, 0xb6, 0x15, 0x92, 0x68, 0x2b, 0x68, 0xba, 0x8c, 0xd1, 0x1a, 0xd4, 0x0c, 0x1b, 0x53, 0x70, + 0xdc, 0x51, 0x83, 0x52, 0xd9, 0x70, 0xbc, 0x66, 0x3b, 0x24, 0x09, 0x95, 0x21, 0x93, 0xca, 0x72, + 0x0a, 0x8e, 0x3b, 0x6a, 0xd0, 0x75, 0x74, 0xa6, 0x16, 0x06, 0xf4, 0xf0, 0x92, 0xd1, 0x3e, 0x94, + 0xb5, 0xea, 0xb0, 0x74, 0x4c, 0xec, 0x12, 0x17, 0x4b, 0xd8, 0xf3, 0x71, 0x0a, 0x86, 0xaa, 0xba, + 0x2e, 0x5c, 0x12, 0x25, 0x15, 0xf4, 0x2c, 0x8c, 0x88, 0xb0, 0xf7, 0xcc, 0xa8, 0x92, 0x4f, 0x1d, + 0x53, 0xad, 0x57, 0x92, 0x62, 0xac, 0xe3, 0xd8, 0xdf, 0x57, 0x80, 0x53, 0x19, 0x56, 0xf1, 0xfc, + 0xa8, 0xda, 0xf4, 0xa2, 0x58, 0x25, 0x50, 0xd3, 0x8e, 0x2a, 0x5e, 0x8e, 0x15, 0x06, 0xdd, 0x0f, + 0xfc, 0x30, 0x4c, 0x1f, 0x80, 0xc2, 0xea, 0x54, 0x40, 0x8f, 0x98, 0x8a, 0xec, 0x12, 0x0c, 0xb4, + 0x23, 0x22, 0x23, 0xda, 0xa9, 0xf3, 0x9b, 0x69, 0x5c, 0x18, 0x84, 0xb2, 0xc7, 0x9b, 0x4a, 0x79, + 0xa1, 0xb1, 0xc7, 0x5c, 0x7d, 0xc1, 0x61, 0xb4, 0x73, 0x31, 0xf1, 0x1d, 0x3f, 0x16, 0x4c, 0x74, + 0x12, 0x9a, 0x89, 0x95, 0x62, 0x01, 0xb5, 0xbf, 0x54, 0x84, 0x73, 0xb9, 0x7e, 0x32, 0xb4, 0xeb, + 0x3b, 0x81, 0xef, 0xc5, 0x81, 0xb2, 0x59, 0xe0, 0xe1, 0x98, 0x48, 0x6b, 0x6b, 0x45, 0x94, 0x63, + 0x85, 0x81, 0x2e, 0xc3, 0x20, 0x13, 0x3a, 0x75, 0xa4, 0x92, 0x5b, 0xa8, 0xf0, 0xf8, 0x1c, 0x1c, + 0xdc, 0x77, 0x9a, 0xce, 0xc7, 0x61, 0xa0, 0x15, 0x04, 0xcd, 0xf4, 0xa1, 0x45, 0xbb, 0x1b, 0x04, + 0x4d, 0xcc, 0x80, 0xe8, 0x63, 0x62, 0xbc, 0x52, 0x4a, 0x7a, 0xec, 0xb8, 0x41, 0xa4, 0x0d, 0xda, + 0x93, 0x30, 0xbc, 0x4d, 0xf6, 0x43, 0xcf, 0xdf, 0x4c, 0x1b, 0x6f, 0xdc, 0xe0, 0xc5, 0x58, 0xc2, + 0xcd, 0xac, 0x40, 0xc3, 0xc7, 0x9d, 0x5f, 0xb3, 0xd4, 0xf3, 0x0a, 0xfc, 0xfe, 0x22, 0x4c, 0xe0, + 0x85, 0xca, 0x87, 0x13, 0x71, 0xbb, 0x73, 0x22, 0x8e, 0x3b, 0xbf, 0x66, 0xef, 0xd9, 0xf8, 0x45, + 0x0b, 0x26, 0x58, 0xf0, 0x7d, 0x11, 0xc8, 0xc7, 0x0b, 0xfc, 0x13, 0x60, 0xf1, 0x1e, 0x87, 0xc1, + 0x90, 0x36, 0x9a, 0xce, 0x21, 0xc7, 0x7a, 0x82, 0x39, 0x0c, 0x9d, 0x87, 0x01, 0xd6, 0x05, 0x3a, + 0x79, 0xa3, 0x3c, 0xfd, 0x4e, 0xc5, 0x89, 0x1d, 0xcc, 0x4a, 0x59, 0x74, 0x0a, 0x4c, 0x5a, 0x4d, + 0x8f, 0x77, 0x3a, 0x51, 0x09, 0x7e, 0x30, 0xa2, 0x53, 0x64, 0x76, 0xed, 0xfd, 0x45, 0xa7, 0xc8, + 0x26, 0xd9, 0xfd, 0xf9, 0xf4, 0x87, 0x05, 0xb8, 0x98, 0x59, 0xaf, 0xef, 0xe8, 0x14, 0xdd, 0x6b, + 0x3f, 0xcc, 0x20, 0xed, 0xc5, 0x13, 0x34, 0x8d, 0x1b, 0xe8, 0x97, 0xc3, 0x1c, 0xec, 0x23, 0x68, + 0x44, 0xe6, 0x90, 0x7d, 0x40, 0x82, 0x46, 0x64, 0xf6, 0x2d, 0xe7, 0xf9, 0xf7, 0xe7, 0x85, 0x9c, + 0x6f, 0x61, 0x0f, 0xc1, 0x2b, 0xf4, 0x9c, 0x61, 0xc0, 0x48, 0x70, 0xcc, 0xa3, 0xfc, 0x8c, 0xe1, + 0x65, 0x58, 0x41, 0xd1, 0x3c, 0x4c, 0xec, 0x78, 0x3e, 0x3d, 0x7c, 0xf6, 0x4d, 0xc6, 0x4f, 0xc5, + 0xf4, 0x59, 0x31, 0xc1, 0x38, 0x8d, 0x8f, 0x3c, 0x2d, 0xa0, 0x44, 0x21, 0x3f, 0x2b, 0x73, 0x6e, + 0x6f, 0xe7, 0x4c, 0x75, 0xa9, 0x1a, 0xc5, 0x8c, 0xe0, 0x12, 0x2b, 0xda, 0xfb, 0xbf, 0xd8, 0xff, + 0xfb, 0x7f, 0x34, 0xfb, 0xed, 0x3f, 0xf3, 0x2a, 0x8c, 0x3d, 0xb0, 0xc0, 0xd7, 0xfe, 0x6a, 0x11, + 0x1e, 0xed, 0xb2, 0xed, 0xf9, 0x59, 0x6f, 0xcc, 0x81, 0x76, 0xd6, 0x77, 0xcc, 0x43, 0x0d, 0x4e, + 0x6f, 0xb4, 0x9b, 0xcd, 0x7d, 0x66, 0x7d, 0x4e, 0x5c, 0x89, 0x21, 0x78, 0xca, 0xf3, 0x32, 0xe1, + 0xd1, 0x72, 0x06, 0x0e, 0xce, 0xac, 0x49, 0x19, 0x7a, 0x7a, 0x93, 0xec, 0x2b, 0x52, 0x29, 0x86, + 0x1e, 0xeb, 0x40, 0x6c, 0xe2, 0xa2, 0x6b, 0x30, 0xe5, 0xec, 0x3a, 0x1e, 0x8f, 0xca, 0x29, 0x09, + 0x70, 0x8e, 0x5e, 0xc9, 0xe9, 0xe6, 0xd3, 0x08, 0xb8, 0xb3, 0x0e, 0x7a, 0x03, 0x50, 0x20, 0xb2, + 0xca, 0x5f, 0x23, 0xbe, 0xd0, 0x6a, 0xb1, 0xb9, 0x2b, 0x26, 0x47, 0xc2, 0xad, 0x0e, 0x0c, 0x9c, + 0x51, 0x2b, 0x15, 0xa0, 0x61, 0x28, 0x3f, 0x40, 0x43, 0xf7, 0x73, 0xb1, 0x67, 0x7e, 0x80, 0xff, + 0x64, 0xd1, 0xeb, 0x8b, 0x33, 0xf9, 0x66, 0x9c, 0xb1, 0x57, 0x99, 0x41, 0x17, 0x97, 0xe1, 0x69, + 0xb1, 0x12, 0xce, 0x68, 0x06, 0x5d, 0x09, 0x10, 0x9b, 0xb8, 0x7c, 0x41, 0x44, 0x89, 0x8b, 0x9e, + 0xc1, 0xe2, 0x8b, 0x60, 0x28, 0x0a, 0x03, 0x7d, 0x06, 0x86, 0x5d, 0x6f, 0xd7, 0x8b, 0x82, 0x50, + 0xac, 0xf4, 0x23, 0xaa, 0x0b, 0x92, 0x73, 0xb0, 0xc2, 0xc9, 0x60, 0x49, 0xcf, 0xfe, 0xfe, 0x02, + 0x8c, 0xc9, 0x16, 0xdf, 0x6c, 0x07, 0xb1, 0x73, 0x02, 0xd7, 0xf2, 0x35, 0xe3, 0x5a, 0xfe, 0x58, + 0xb7, 0x88, 0x30, 0xac, 0x4b, 0xb9, 0xd7, 0xf1, 0xad, 0xd4, 0x75, 0xfc, 0x44, 0x6f, 0x52, 0xdd, + 0xaf, 0xe1, 0x7f, 0x64, 0xc1, 0x94, 0x81, 0x7f, 0x02, 0xb7, 0xc1, 0xb2, 0x79, 0x1b, 0x3c, 0xd6, + 0xf3, 0x1b, 0x72, 0x6e, 0x81, 0xef, 0x2e, 0xa6, 0xfa, 0xce, 0x4e, 0xff, 0x77, 0x61, 0x60, 0xcb, + 0x09, 0xdd, 0x6e, 0x11, 0xb0, 0x3b, 0x2a, 0xcd, 0x5d, 0x77, 0x42, 0xa1, 0xd6, 0x7b, 0x5a, 0x25, + 0x45, 0x76, 0xc2, 0xde, 0x2a, 0x3d, 0xd6, 0x14, 0x7a, 0x19, 0x86, 0xa2, 0x46, 0xd0, 0x52, 0xf6, + 0xe2, 0x97, 0x78, 0xc2, 0x64, 0x5a, 0x72, 0x78, 0x30, 0x8b, 0xcc, 0xe6, 0x68, 0x31, 0x16, 0xf8, + 0xe8, 0x2d, 0x18, 0x63, 0xbf, 0x94, 0x8d, 0x4d, 0x31, 0x3f, 0x5b, 0x4e, 0x5d, 0x47, 0xe4, 0x06, + 0x68, 0x46, 0x11, 0x36, 0x49, 0xcd, 0x6c, 0x42, 0x59, 0x7d, 0xd6, 0x43, 0xd5, 0xc7, 0xfd, 0xdb, + 0x22, 0x9c, 0xca, 0x58, 0x73, 0x28, 0x32, 0x66, 0xe2, 0xd9, 0x3e, 0x97, 0xea, 0xfb, 0x9c, 0x8b, + 0x88, 0xbd, 0x86, 0x5c, 0xb1, 0xb6, 0xfa, 0x6e, 0xf4, 0x76, 0x44, 0xd2, 0x8d, 0xd2, 0xa2, 0xde, + 0x8d, 0xd2, 0xc6, 0x4e, 0x6c, 0xa8, 0x69, 0x43, 0xaa, 0xa7, 0x0f, 0x75, 0x4e, 0xff, 0xa4, 0x08, + 0xa7, 0xb3, 0x82, 0x54, 0xa1, 0x6f, 0x4b, 0x65, 0x4e, 0x7b, 0xa1, 0xdf, 0xf0, 0x56, 0x3c, 0x9d, + 0x1a, 0x97, 0x01, 0x2f, 0xcc, 0x99, 0xb9, 0xd4, 0x7a, 0x0e, 0xb3, 0x68, 0x93, 0xb9, 0x9f, 0x87, + 0x3c, 0xe3, 0x9d, 0x3c, 0x3e, 0x3e, 0xd9, 0x77, 0x07, 0x44, 0xaa, 0xbc, 0x28, 0xa5, 0xbf, 0x97, + 0xc5, 0xbd, 0xf5, 0xf7, 0xb2, 0xe5, 0x19, 0x0f, 0x46, 0xb4, 0xaf, 0x79, 0xa8, 0x33, 0xbe, 0x4d, + 0x6f, 0x2b, 0xad, 0xdf, 0x0f, 0x75, 0xd6, 0x7f, 0xc4, 0x82, 0x94, 0x35, 0xb4, 0x12, 0x8b, 0x59, + 0xb9, 0x62, 0xb1, 0x4b, 0x30, 0x10, 0x06, 0x4d, 0x92, 0x4e, 0x54, 0x86, 0x83, 0x26, 0xc1, 0x0c, + 0x42, 0x31, 0xe2, 0x44, 0xd8, 0x31, 0xaa, 0x3f, 0xe4, 0xc4, 0x13, 0xed, 0x71, 0x18, 0x6c, 0x92, + 0x5d, 0xd2, 0x4c, 0xe7, 0x93, 0xb8, 0x49, 0x0b, 0x31, 0x87, 0xd9, 0xbf, 0x38, 0x00, 0x17, 0xba, + 0x06, 0x70, 0xa0, 0xcf, 0xa1, 0x4d, 0x27, 0x26, 0x7b, 0xce, 0x7e, 0x3a, 0xf0, 0xfb, 0x35, 0x5e, + 0x8c, 0x25, 0x9c, 0xf9, 0xab, 0xf0, 0xf8, 0xad, 0x29, 0x21, 0xa2, 0x08, 0xdb, 0x2a, 0xa0, 0xa6, + 0x50, 0xaa, 0x78, 0x1c, 0x42, 0xa9, 0xe7, 0x00, 0xa2, 0xa8, 0xc9, 0x0d, 0x5f, 0x5c, 0xe1, 0x08, + 0x93, 0xc4, 0xf9, 0xad, 0xdf, 0x14, 0x10, 0xac, 0x61, 0xa1, 0x0a, 0x4c, 0xb6, 0xc2, 0x20, 0xe6, + 0x32, 0xd9, 0x0a, 0xb7, 0x0d, 0x1b, 0x34, 0x7d, 0xe7, 0x6b, 0x29, 0x38, 0xee, 0xa8, 0x81, 0x5e, + 0x84, 0x11, 0xe1, 0x4f, 0x5f, 0x0b, 0x82, 0xa6, 0x10, 0x03, 0x29, 0x73, 0xa9, 0x7a, 0x02, 0xc2, + 0x3a, 0x9e, 0x56, 0x8d, 0x09, 0x7a, 0x87, 0x33, 0xab, 0x71, 0x61, 0xaf, 0x86, 0x97, 0x0a, 0x58, + 0x57, 0xea, 0x2b, 0x60, 0x5d, 0x22, 0x18, 0x2b, 0xf7, 0xad, 0xdb, 0x82, 0x9e, 0xa2, 0xa4, 0x9f, + 0x1b, 0x80, 0x53, 0x62, 0xe1, 0x3c, 0xec, 0xe5, 0x72, 0xbb, 0x73, 0xb9, 0x1c, 0x87, 0xe8, 0xec, + 0xc3, 0x35, 0x73, 0xd2, 0x6b, 0xe6, 0x07, 0x2c, 0x30, 0xd9, 0x2b, 0xf4, 0x7f, 0xe7, 0x66, 0xce, + 0x78, 0x31, 0x97, 0x5d, 0x73, 0xe5, 0x05, 0xf2, 0x3e, 0x73, 0x68, 0xd8, 0xff, 0xc1, 0x82, 0xc7, + 0x7a, 0x52, 0x44, 0x4b, 0x50, 0x66, 0x3c, 0xa0, 0xf6, 0x3a, 0x7b, 0x42, 0xd9, 0x8e, 0x4a, 0x40, + 0x0e, 0x4b, 0x9a, 0xd4, 0x44, 0x4b, 0x1d, 0x29, 0x4a, 0x9e, 0xcc, 0x48, 0x51, 0x72, 0xc6, 0x18, + 0x9e, 0x07, 0xcc, 0x51, 0xf2, 0xe5, 0x22, 0x0c, 0xf1, 0x15, 0x7f, 0x02, 0xcf, 0xb0, 0x65, 0x21, + 0xb7, 0xed, 0x12, 0x11, 0x8f, 0xf7, 0x65, 0xae, 0xe2, 0xc4, 0x0e, 0x67, 0x13, 0xd4, 0x6d, 0x95, + 0x48, 0x78, 0xd1, 0xe7, 0x00, 0xa2, 0x38, 0xf4, 0xfc, 0x4d, 0x5a, 0x26, 0x62, 0x25, 0x7e, 0xbc, + 0x0b, 0xb5, 0xba, 0x42, 0xe6, 0x34, 0x93, 0x9d, 0xab, 0x00, 0x58, 0xa3, 0x88, 0xe6, 0x8c, 0xfb, + 0x72, 0x26, 0x25, 0xf8, 0x04, 0x4e, 0x35, 0xb9, 0x3d, 0x67, 0x5e, 0x82, 0xb2, 0x22, 0xde, 0x4b, + 0x8a, 0x33, 0xaa, 0x33, 0x17, 0x9f, 0x82, 0x89, 0x54, 0xdf, 0x8e, 0x24, 0x04, 0xfa, 0x25, 0x0b, + 0x26, 0x78, 0x67, 0x96, 0xfc, 0x5d, 0x71, 0xa6, 0xbe, 0x07, 0xa7, 0x9b, 0x19, 0x67, 0x9b, 0x98, + 0xd1, 0xfe, 0xcf, 0x42, 0x25, 0xf4, 0xc9, 0x82, 0xe2, 0xcc, 0x36, 0xd0, 0x15, 0xba, 0x6e, 0xe9, + 0xd9, 0xe5, 0x34, 0x85, 0x5b, 0xe3, 0x28, 0x5f, 0xb3, 0xbc, 0x0c, 0x2b, 0xa8, 0xfd, 0xdb, 0x16, + 0x4c, 0xf1, 0x9e, 0xdf, 0x20, 0xfb, 0x6a, 0x87, 0x7f, 0x3d, 0xfb, 0x2e, 0xb2, 0x06, 0x15, 0x72, + 0xb2, 0x06, 0xe9, 0x9f, 0x56, 0xec, 0xfa, 0x69, 0x3f, 0x63, 0x81, 0x58, 0x21, 0x27, 0xf0, 0x94, + 0xff, 0x66, 0xf3, 0x29, 0x3f, 0x93, 0xbf, 0x09, 0x72, 0xde, 0xf0, 0x7f, 0x66, 0xc1, 0x24, 0x47, + 0x48, 0x74, 0xce, 0x5f, 0xd7, 0x79, 0xe8, 0x27, 0xb7, 0xe8, 0x0d, 0xb2, 0xbf, 0x16, 0xd4, 0x9c, + 0x78, 0x2b, 0xfb, 0xa3, 0x8c, 0xc9, 0x1a, 0xe8, 0x3a, 0x59, 0xae, 0xdc, 0x40, 0x47, 0x48, 0x58, + 0x7c, 0xe4, 0xa0, 0xfa, 0xf6, 0xd7, 0x2c, 0x40, 0xbc, 0x19, 0x83, 0xfd, 0xa1, 0x4c, 0x05, 0x2b, + 0xd5, 0xae, 0x8b, 0xe4, 0x68, 0x52, 0x10, 0xac, 0x61, 0x1d, 0xcb, 0xf0, 0xa4, 0x0c, 0x07, 0x8a, + 0xbd, 0x0d, 0x07, 0x8e, 0x30, 0xa2, 0x7f, 0x30, 0x08, 0x69, 0x0f, 0x10, 0x74, 0x07, 0x46, 0x1b, + 0x4e, 0xcb, 0x59, 0xf7, 0x9a, 0x5e, 0xec, 0x91, 0xa8, 0x9b, 0xc5, 0xd1, 0xa2, 0x86, 0x27, 0x54, + 0xbd, 0x5a, 0x09, 0x36, 0xe8, 0xa0, 0x39, 0x80, 0x56, 0xe8, 0xed, 0x7a, 0x4d, 0xb2, 0xc9, 0x24, + 0x0e, 0xcc, 0x91, 0x9a, 0x9b, 0xd1, 0xc8, 0x52, 0xac, 0x61, 0x64, 0x78, 0xaa, 0x16, 0x1f, 0xb2, + 0xa7, 0x2a, 0x9c, 0x98, 0xa7, 0xea, 0xc0, 0x91, 0x3c, 0x55, 0x4b, 0x47, 0xf6, 0x54, 0x1d, 0xec, + 0xcb, 0x53, 0x15, 0xc3, 0x59, 0xc9, 0xc1, 0xd1, 0xff, 0xcb, 0x5e, 0x93, 0x08, 0xb6, 0x9d, 0x7b, + 0x7f, 0xcf, 0xdc, 0x3f, 0x98, 0x3d, 0x8b, 0x33, 0x31, 0x70, 0x4e, 0x4d, 0xf4, 0x69, 0x98, 0x76, + 0x9a, 0xcd, 0x60, 0x4f, 0x4d, 0xea, 0x52, 0xd4, 0x70, 0x9a, 0x5c, 0x94, 0x3f, 0xcc, 0xa8, 0x9e, + 0xbf, 0x7f, 0x30, 0x3b, 0x3d, 0x9f, 0x83, 0x83, 0x73, 0x6b, 0xa3, 0xd7, 0xa0, 0xdc, 0x0a, 0x83, + 0xc6, 0x8a, 0xe6, 0xa6, 0x76, 0x91, 0x0e, 0x60, 0x4d, 0x16, 0x1e, 0x1e, 0xcc, 0x8e, 0xa9, 0x3f, + 0xec, 0xc2, 0x4f, 0x2a, 0xd8, 0xdb, 0x70, 0xaa, 0x4e, 0x42, 0x8f, 0xa5, 0x1f, 0x76, 0x93, 0xf3, + 0x63, 0x0d, 0xca, 0x61, 0xea, 0xc4, 0xec, 0x2b, 0x8a, 0x9c, 0x16, 0x7d, 0x5c, 0x9e, 0x90, 0x09, + 0x21, 0xfb, 0x7f, 0x5a, 0x30, 0x2c, 0x3c, 0x32, 0x4e, 0x80, 0x51, 0x9b, 0x37, 0xe4, 0xe5, 0xb3, + 0xd9, 0xb7, 0x0a, 0xeb, 0x4c, 0xae, 0xa4, 0xbc, 0x9a, 0x92, 0x94, 0x3f, 0xd6, 0x8d, 0x48, 0x77, + 0x19, 0xf9, 0x5f, 0x2b, 0xc2, 0xb8, 0xe9, 0xba, 0x77, 0x02, 0x43, 0xb0, 0x0a, 0xc3, 0x91, 0xf0, + 0x4d, 0x2b, 0xe4, 0x5b, 0x64, 0xa7, 0x27, 0x31, 0xb1, 0xd6, 0x12, 0xde, 0x68, 0x92, 0x48, 0xa6, + 0xd3, 0x5b, 0xf1, 0x21, 0x3a, 0xbd, 0xf5, 0xf2, 0x9e, 0x1c, 0x38, 0x0e, 0xef, 0x49, 0xfb, 0x2b, + 0xec, 0x66, 0xd3, 0xcb, 0x4f, 0x80, 0xe9, 0xb9, 0x66, 0xde, 0x81, 0x76, 0x97, 0x95, 0x25, 0x3a, + 0x95, 0xc3, 0xfc, 0xfc, 0x82, 0x05, 0x17, 0x32, 0xbe, 0x4a, 0xe3, 0x84, 0x9e, 0x86, 0x92, 0xd3, + 0x76, 0x3d, 0xb5, 0x97, 0x35, 0xad, 0xd9, 0xbc, 0x28, 0xc7, 0x0a, 0x03, 0x2d, 0xc2, 0x14, 0xb9, + 0xd7, 0xf2, 0xb8, 0xc2, 0x50, 0x37, 0xa9, 0x2c, 0xf2, 0xc8, 0xda, 0x4b, 0x69, 0x20, 0xee, 0xc4, + 0x57, 0xc1, 0x1e, 0x8a, 0xb9, 0xc1, 0x1e, 0xfe, 0xae, 0x05, 0x23, 0xca, 0x3b, 0xeb, 0xa1, 0x8f, + 0xf6, 0xb7, 0x98, 0xa3, 0xfd, 0x68, 0x97, 0xd1, 0xce, 0x19, 0xe6, 0xbf, 0x51, 0x50, 0xfd, 0xad, + 0x05, 0x61, 0xdc, 0x07, 0x87, 0xf5, 0x32, 0x94, 0x5a, 0x61, 0x10, 0x07, 0x8d, 0xa0, 0x29, 0x18, + 0xac, 0xf3, 0x49, 0xd4, 0x13, 0x5e, 0x7e, 0xa8, 0xfd, 0xc6, 0x0a, 0x9b, 0x8d, 0x5e, 0x10, 0xc6, + 0x82, 0xa9, 0x49, 0x46, 0x2f, 0x08, 0x63, 0xcc, 0x20, 0xc8, 0x05, 0x88, 0x9d, 0x70, 0x93, 0xc4, + 0xb4, 0x4c, 0x44, 0x59, 0xca, 0x3f, 0x3c, 0xda, 0xb1, 0xd7, 0x9c, 0xf3, 0xfc, 0x38, 0x8a, 0xc3, + 0xb9, 0xaa, 0x1f, 0xdf, 0x0a, 0xf9, 0x7b, 0x4d, 0x0b, 0x63, 0xa2, 0x68, 0x61, 0x8d, 0xae, 0x74, + 0x2b, 0x66, 0x6d, 0x0c, 0x9a, 0xfa, 0xf7, 0x55, 0x51, 0x8e, 0x15, 0x86, 0xfd, 0x12, 0xbb, 0x4a, + 0xd8, 0x00, 0x1d, 0x2d, 0xee, 0xc7, 0x97, 0xcb, 0x6a, 0x68, 0x99, 0xf2, 0xad, 0xa2, 0x47, 0x17, + 0xe9, 0x7e, 0x72, 0xd3, 0x86, 0x75, 0x17, 0xa3, 0x24, 0x04, 0x09, 0xfa, 0xd6, 0x0e, 0x9b, 0x8a, + 0x67, 0x7a, 0x5c, 0x01, 0x47, 0xb0, 0xa2, 0x60, 0xd1, 0xfe, 0x59, 0x2c, 0xf4, 0x6a, 0x4d, 0x2c, + 0x72, 0x2d, 0xda, 0xbf, 0x00, 0xe0, 0x04, 0x07, 0x5d, 0x15, 0xaf, 0x71, 0x2e, 0x9a, 0x7e, 0x34, + 0xf5, 0x1a, 0x97, 0x9f, 0xaf, 0x09, 0xb3, 0x9f, 0x85, 0x11, 0x95, 0xeb, 0xb2, 0xc6, 0x53, 0x28, + 0x8a, 0x98, 0x53, 0x4b, 0x49, 0x31, 0xd6, 0x71, 0xd0, 0x1a, 0x4c, 0x44, 0x5c, 0xd4, 0xa3, 0x42, + 0x8b, 0x72, 0x91, 0xd9, 0xc7, 0xa5, 0x21, 0x4a, 0xdd, 0x04, 0x1f, 0xb2, 0x22, 0x7e, 0x74, 0x48, + 0x57, 0xde, 0x34, 0x09, 0xf4, 0x3a, 0x8c, 0x37, 0x03, 0xc7, 0x5d, 0x70, 0x9a, 0x8e, 0xdf, 0x60, + 0xdf, 0x5b, 0x32, 0x53, 0xa6, 0xdd, 0x34, 0xa0, 0x38, 0x85, 0x4d, 0x39, 0x1f, 0xbd, 0x44, 0x84, + 0xc3, 0x75, 0xfc, 0x4d, 0x12, 0x89, 0xcc, 0x85, 0x8c, 0xf3, 0xb9, 0x99, 0x83, 0x83, 0x73, 0x6b, + 0xa3, 0x97, 0x61, 0x54, 0x7e, 0xbe, 0xe6, 0xf9, 0x9e, 0xd8, 0xde, 0x6b, 0x30, 0x6c, 0x60, 0xa2, + 0x3d, 0x38, 0x23, 0xff, 0xaf, 0x85, 0xce, 0xc6, 0x86, 0xd7, 0x10, 0xee, 0xa0, 0xdc, 0x31, 0x6e, + 0x5e, 0x7a, 0x6f, 0x2d, 0x65, 0x21, 0x1d, 0x1e, 0xcc, 0x5e, 0x12, 0xa3, 0x96, 0x09, 0x67, 0x93, + 0x98, 0x4d, 0x1f, 0xad, 0xc0, 0xa9, 0x2d, 0xe2, 0x34, 0xe3, 0xad, 0xc5, 0x2d, 0xd2, 0xd8, 0x96, + 0x9b, 0x88, 0xf9, 0xd3, 0x6b, 0x16, 0xeb, 0xd7, 0x3b, 0x51, 0x70, 0x56, 0x3d, 0xf4, 0x36, 0x4c, + 0xb7, 0xda, 0xeb, 0x4d, 0x2f, 0xda, 0x5a, 0x0d, 0x62, 0x66, 0x8d, 0xa2, 0x52, 0x67, 0x0a, 0xc7, + 0x7b, 0x15, 0xb1, 0xa0, 0x96, 0x83, 0x87, 0x73, 0x29, 0xa0, 0xf7, 0xe0, 0x4c, 0x6a, 0x31, 0x08, + 0xd7, 0xe3, 0xf1, 0xfc, 0xe0, 0xe2, 0xf5, 0xac, 0x0a, 0xc2, 0x8b, 0x3f, 0x0b, 0x84, 0xb3, 0x9b, + 0x40, 0x2f, 0x40, 0xc9, 0x6b, 0x2d, 0x3b, 0x3b, 0x5e, 0x73, 0x9f, 0x45, 0x47, 0x2f, 0xb3, 0x88, + 0xe1, 0xa5, 0x6a, 0x8d, 0x97, 0x1d, 0x6a, 0xbf, 0xb1, 0xc2, 0xa4, 0xfc, 0xbe, 0x16, 0x03, 0x32, + 0x9a, 0x9e, 0x4c, 0x8c, 0x6d, 0xb5, 0x40, 0x91, 0x11, 0x36, 0xb0, 0xde, 0x9f, 0x0d, 0xd3, 0xbb, + 0xb4, 0xb2, 0xc6, 0x00, 0xa2, 0xcf, 0xc3, 0xa8, 0xbe, 0x62, 0xc5, 0x65, 0x76, 0x39, 0x9b, 0x3f, + 0xd2, 0x56, 0x36, 0x67, 0x1f, 0xd5, 0xea, 0xd5, 0x61, 0xd8, 0xa0, 0x68, 0x13, 0xc8, 0x1e, 0x4b, + 0x74, 0x13, 0x4a, 0x8d, 0xa6, 0x47, 0xfc, 0xb8, 0x5a, 0xeb, 0x16, 0xbe, 0x68, 0x51, 0xe0, 0x88, + 0xc9, 0x11, 0x91, 0x9f, 0x79, 0x19, 0x56, 0x14, 0xec, 0x5f, 0x2d, 0xc0, 0x6c, 0x8f, 0x30, 0xe2, + 0x29, 0x51, 0xbb, 0xd5, 0x97, 0xa8, 0x7d, 0x5e, 0x26, 0x1d, 0x5d, 0x4d, 0xc9, 0x1f, 0x52, 0x09, + 0x45, 0x13, 0x29, 0x44, 0x1a, 0xbf, 0x6f, 0xd3, 0x67, 0x5d, 0x5a, 0x3f, 0xd0, 0xd3, 0x78, 0xdf, + 0xd0, 0xd2, 0x0d, 0xf6, 0xff, 0xe8, 0xc9, 0xd5, 0xb8, 0xd8, 0x5f, 0x29, 0xc0, 0x19, 0x35, 0x84, + 0xdf, 0xb8, 0x03, 0x77, 0xbb, 0x73, 0xe0, 0x8e, 0x41, 0x5f, 0x65, 0xdf, 0x82, 0x21, 0x1e, 0x8f, + 0xa9, 0x0f, 0x66, 0xeb, 0x71, 0x33, 0x74, 0xa1, 0x62, 0x09, 0x8c, 0xf0, 0x85, 0xdf, 0x6b, 0xc1, + 0xc4, 0xda, 0x62, 0xad, 0x1e, 0x34, 0xb6, 0x49, 0x3c, 0xcf, 0x99, 0x63, 0x2c, 0x78, 0x2d, 0xeb, + 0x01, 0x79, 0xa8, 0x2c, 0xee, 0xec, 0x12, 0x0c, 0x6c, 0x05, 0x51, 0x9c, 0x56, 0x66, 0x5f, 0x0f, + 0xa2, 0x18, 0x33, 0x88, 0xfd, 0x3b, 0x16, 0x0c, 0xb2, 0x34, 0xdb, 0xbd, 0x12, 0xbd, 0xf7, 0xf3, + 0x5d, 0xe8, 0x45, 0x18, 0x22, 0x1b, 0x1b, 0xa4, 0x11, 0x8b, 0x59, 0x95, 0xde, 0xc7, 0x43, 0x4b, + 0xac, 0x94, 0x32, 0x18, 0xac, 0x31, 0xfe, 0x17, 0x0b, 0x64, 0x74, 0x17, 0xca, 0xb1, 0xb7, 0x43, + 0xe6, 0x5d, 0x57, 0xa8, 0x03, 0x1f, 0xc0, 0x83, 0x7a, 0x4d, 0x12, 0xc0, 0x09, 0x2d, 0xfb, 0x4b, + 0x05, 0x80, 0x24, 0x1a, 0x47, 0xaf, 0x4f, 0x5c, 0xe8, 0x50, 0x14, 0x5d, 0xce, 0x50, 0x14, 0xa1, + 0x84, 0x60, 0x86, 0x96, 0x48, 0x0d, 0x53, 0xb1, 0xaf, 0x61, 0x1a, 0x38, 0xca, 0x30, 0x2d, 0xc2, + 0x54, 0x12, 0x4d, 0xc4, 0x0c, 0xa6, 0xc4, 0x1e, 0x44, 0x6b, 0x69, 0x20, 0xee, 0xc4, 0xb7, 0x09, + 0x5c, 0x52, 0x41, 0x15, 0xc4, 0x5d, 0xc3, 0xac, 0x4d, 0x8f, 0x90, 0xf3, 0x3f, 0xd1, 0x84, 0x15, + 0x72, 0x35, 0x61, 0x3f, 0x6e, 0xc1, 0xe9, 0x74, 0x3b, 0xcc, 0xfd, 0xef, 0x8b, 0x16, 0x9c, 0x61, + 0xfa, 0x40, 0xd6, 0x6a, 0xa7, 0xf6, 0xf1, 0x85, 0xae, 0x81, 0x22, 0x72, 0x7a, 0x9c, 0xb8, 0xb9, + 0xaf, 0x64, 0x91, 0xc6, 0xd9, 0x2d, 0xda, 0xff, 0xbe, 0x00, 0xd3, 0x79, 0x11, 0x26, 0x98, 0x31, + 0xba, 0x73, 0xaf, 0xbe, 0x4d, 0xf6, 0x84, 0xc9, 0x6f, 0x62, 0x8c, 0xce, 0x8b, 0xb1, 0x84, 0xa7, + 0x23, 0x43, 0x17, 0xfa, 0x8b, 0x0c, 0x8d, 0xb6, 0x60, 0x6a, 0x6f, 0x8b, 0xf8, 0xb7, 0xfd, 0xc8, + 0x89, 0xbd, 0x68, 0xc3, 0x63, 0x19, 0xdb, 0xf9, 0xba, 0x79, 0x45, 0x1a, 0xe6, 0xde, 0x4d, 0x23, + 0x1c, 0x1e, 0xcc, 0x5e, 0x30, 0x0a, 0x92, 0x2e, 0xf3, 0x83, 0x04, 0x77, 0x12, 0xed, 0x0c, 0xac, + 0x3d, 0xf0, 0x10, 0x03, 0x6b, 0xdb, 0x5f, 0xb4, 0xe0, 0x5c, 0x6e, 0xe2, 0x3b, 0x74, 0x05, 0x4a, + 0x4e, 0xcb, 0xe3, 0x82, 0x53, 0x71, 0x8c, 0x32, 0x01, 0x40, 0xad, 0xca, 0xc5, 0xa6, 0x0a, 0xaa, + 0x12, 0xf2, 0x16, 0x72, 0x13, 0xf2, 0xf6, 0xcc, 0xaf, 0x6b, 0x7f, 0x8f, 0x05, 0xc2, 0x91, 0xae, + 0x8f, 0xb3, 0xfb, 0x2d, 0x99, 0xcf, 0xdc, 0x48, 0xbe, 0x71, 0x29, 0xdf, 0xb3, 0x50, 0xa4, 0xdc, + 0x50, 0xbc, 0x92, 0x91, 0x68, 0xc3, 0xa0, 0x65, 0xbb, 0x20, 0xa0, 0x15, 0xc2, 0xc4, 0x8e, 0xbd, + 0x7b, 0xf3, 0x1c, 0x80, 0xcb, 0x70, 0xb5, 0xac, 0xc6, 0xea, 0x66, 0xae, 0x28, 0x08, 0xd6, 0xb0, + 0xec, 0x7f, 0x5d, 0x80, 0x11, 0x99, 0xec, 0xa1, 0xed, 0xf7, 0x23, 0x1c, 0x38, 0x52, 0xf6, 0x37, + 0x96, 0x06, 0x9c, 0x12, 0xae, 0x25, 0x32, 0x95, 0x24, 0x0d, 0xb8, 0x04, 0xe0, 0x04, 0x87, 0xee, + 0xa2, 0xa8, 0xbd, 0xce, 0xd0, 0x53, 0x6e, 0x5f, 0x75, 0x5e, 0x8c, 0x25, 0x1c, 0x7d, 0x1a, 0x26, + 0x79, 0xbd, 0x30, 0x68, 0x39, 0x9b, 0x5c, 0x22, 0x3d, 0xa8, 0xfc, 0xb5, 0x27, 0x57, 0x52, 0xb0, + 0xc3, 0x83, 0xd9, 0xd3, 0xe9, 0x32, 0xa6, 0x6a, 0xe9, 0xa0, 0xc2, 0xcc, 0x37, 0x78, 0x23, 0x74, + 0xf7, 0x77, 0x58, 0x7d, 0x24, 0x20, 0xac, 0xe3, 0xd9, 0x9f, 0x07, 0xd4, 0x99, 0xf6, 0x02, 0xbd, + 0xc1, 0x6d, 0xf6, 0xbc, 0x90, 0xb8, 0xdd, 0x54, 0x2f, 0xba, 0x57, 0xb2, 0xf4, 0xd8, 0xe0, 0xb5, + 0xb0, 0xaa, 0x6f, 0xff, 0xff, 0x45, 0x98, 0x4c, 0xfb, 0xa8, 0xa2, 0xeb, 0x30, 0xc4, 0x59, 0x0f, + 0x41, 0xbe, 0x8b, 0x66, 0x5f, 0xf3, 0x6c, 0x65, 0x87, 0xb0, 0xe0, 0x5e, 0x44, 0x7d, 0xf4, 0x36, + 0x8c, 0xb8, 0xc1, 0x9e, 0xbf, 0xe7, 0x84, 0xee, 0x7c, 0xad, 0x2a, 0x96, 0x73, 0xe6, 0x6b, 0xa9, + 0x92, 0xa0, 0xe9, 0xde, 0xb2, 0x4c, 0x8b, 0x95, 0x80, 0xb0, 0x4e, 0x0e, 0xad, 0xb1, 0x28, 0xbd, + 0x1b, 0xde, 0xe6, 0x8a, 0xd3, 0xea, 0x66, 0xc0, 0xbd, 0x28, 0x91, 0x34, 0xca, 0x63, 0x22, 0x94, + 0x2f, 0x07, 0xe0, 0x84, 0x10, 0xfa, 0x36, 0x38, 0x15, 0xe5, 0x08, 0x58, 0xf3, 0xb2, 0x20, 0x75, + 0x93, 0x39, 0x2e, 0x3c, 0x42, 0xdf, 0xb1, 0x59, 0xa2, 0xd8, 0xac, 0x66, 0xec, 0x5f, 0x3b, 0x05, + 0xc6, 0x26, 0x36, 0x92, 0xe2, 0x59, 0xc7, 0x94, 0x14, 0x0f, 0x43, 0x89, 0xec, 0xb4, 0xe2, 0xfd, + 0x8a, 0x17, 0x76, 0xcb, 0xaa, 0xba, 0x24, 0x70, 0x3a, 0x69, 0x4a, 0x08, 0x56, 0x74, 0xb2, 0x33, + 0x17, 0x16, 0xbf, 0x8e, 0x99, 0x0b, 0x07, 0x4e, 0x30, 0x73, 0xe1, 0x2a, 0x0c, 0x6f, 0x7a, 0x31, + 0x26, 0xad, 0x40, 0x30, 0xfd, 0x99, 0xeb, 0xf0, 0x1a, 0x47, 0xe9, 0xcc, 0x91, 0x25, 0x00, 0x58, + 0x12, 0x41, 0x6f, 0xa8, 0x1d, 0x38, 0x94, 0xff, 0x66, 0xee, 0x54, 0x41, 0x67, 0xee, 0x41, 0x91, + 0x9f, 0x70, 0xf8, 0x41, 0xf3, 0x13, 0x2e, 0xcb, 0xac, 0x82, 0xa5, 0x7c, 0x6f, 0x0b, 0x96, 0x34, + 0xb0, 0x47, 0x2e, 0xc1, 0x3b, 0x7a, 0x26, 0xc6, 0x72, 0xfe, 0x49, 0xa0, 0x92, 0x2c, 0xf6, 0x99, + 0x7f, 0xf1, 0x7b, 0x2c, 0x38, 0xd3, 0xca, 0x4a, 0x4a, 0x2a, 0xb4, 0xb5, 0x2f, 0xf6, 0x9d, 0x75, + 0xd5, 0x68, 0x90, 0x09, 0x6a, 0x32, 0xd1, 0x70, 0x76, 0x73, 0x74, 0xa0, 0xc3, 0x75, 0x57, 0x24, + 0x10, 0x7c, 0x3c, 0x27, 0x91, 0x63, 0x97, 0xf4, 0x8d, 0x6b, 0x19, 0x49, 0x03, 0x3f, 0x9a, 0x97, + 0x34, 0xb0, 0xef, 0x54, 0x81, 0x6f, 0xa8, 0x14, 0x8e, 0x63, 0xf9, 0x4b, 0x89, 0x27, 0x68, 0xec, + 0x99, 0xb8, 0xf1, 0x0d, 0x95, 0xb8, 0xb1, 0x4b, 0x1c, 0x49, 0x9e, 0x96, 0xb1, 0x67, 0xba, 0x46, + 0x2d, 0xe5, 0xe2, 0xc4, 0xf1, 0xa4, 0x5c, 0x34, 0xae, 0x1a, 0x9e, 0xf5, 0xef, 0xa9, 0x1e, 0x57, + 0x8d, 0x41, 0xb7, 0xfb, 0x65, 0xc3, 0xd3, 0x4b, 0x4e, 0x3d, 0x50, 0x7a, 0xc9, 0x3b, 0x7a, 0xba, + 0x46, 0xd4, 0x23, 0x1f, 0x21, 0x45, 0xea, 0x33, 0x49, 0xe3, 0x1d, 0xfd, 0x02, 0x3c, 0x95, 0x4f, + 0x57, 0xdd, 0x73, 0x9d, 0x74, 0x33, 0xaf, 0xc0, 0x8e, 0xe4, 0x8f, 0xa7, 0x4f, 0x26, 0xf9, 0xe3, + 0x99, 0x63, 0x4f, 0xfe, 0x78, 0xf6, 0x04, 0x92, 0x3f, 0x3e, 0x72, 0x82, 0xc9, 0x1f, 0xef, 0x30, + 0x13, 0x07, 0x1e, 0x8e, 0x44, 0xc4, 0xbd, 0xcc, 0x8e, 0xb1, 0x98, 0x15, 0xb3, 0x84, 0x7f, 0x9c, + 0x02, 0xe1, 0x84, 0x54, 0x46, 0x52, 0xc9, 0xe9, 0x87, 0x90, 0x54, 0x72, 0x35, 0x49, 0x2a, 0x79, + 0x2e, 0x7f, 0xaa, 0x33, 0x4c, 0xcb, 0x73, 0x52, 0x49, 0xde, 0xd1, 0x53, 0x40, 0x3e, 0xda, 0x45, + 0x14, 0x9f, 0x25, 0x78, 0xec, 0x92, 0xf8, 0xf1, 0x75, 0x9e, 0xf8, 0xf1, 0x7c, 0xfe, 0x49, 0x9e, + 0xbe, 0xee, 0xcc, 0x74, 0x8f, 0xdf, 0x57, 0x80, 0x8b, 0xdd, 0xf7, 0x45, 0x22, 0xf5, 0xac, 0x25, + 0x1a, 0xc1, 0x94, 0xd4, 0x93, 0xbf, 0xad, 0x12, 0xac, 0xbe, 0x23, 0x55, 0x5d, 0x83, 0x29, 0x65, + 0x3b, 0xde, 0xf4, 0x1a, 0xfb, 0x5a, 0x86, 0x7b, 0xe5, 0x6f, 0x5b, 0x4f, 0x23, 0xe0, 0xce, 0x3a, + 0x68, 0x1e, 0x26, 0x8c, 0xc2, 0x6a, 0x45, 0xbc, 0xa1, 0x94, 0x98, 0xb5, 0x6e, 0x82, 0x71, 0x1a, + 0xdf, 0xfe, 0x69, 0x0b, 0x1e, 0xc9, 0xc9, 0xab, 0xd4, 0x77, 0x20, 0xa6, 0x0d, 0x98, 0x68, 0x99, + 0x55, 0x7b, 0xc4, 0x6b, 0x33, 0xb2, 0x37, 0xa9, 0xbe, 0xa6, 0x00, 0x38, 0x4d, 0xd4, 0xfe, 0x53, + 0x0b, 0x2e, 0x74, 0x35, 0xe3, 0x42, 0x18, 0xce, 0x6e, 0xee, 0x44, 0xce, 0x62, 0x48, 0x5c, 0xe2, + 0xc7, 0x9e, 0xd3, 0xac, 0xb7, 0x48, 0x43, 0x93, 0x5b, 0x33, 0x7b, 0xa8, 0x6b, 0x2b, 0xf5, 0xf9, + 0x4e, 0x0c, 0x9c, 0x53, 0x13, 0x2d, 0x03, 0xea, 0x84, 0x88, 0x19, 0x66, 0x31, 0x5d, 0x3b, 0xe9, + 0xe1, 0x8c, 0x1a, 0xe8, 0x25, 0x18, 0x53, 0xe6, 0x61, 0xda, 0x8c, 0xb3, 0x03, 0x18, 0xeb, 0x00, + 0x6c, 0xe2, 0x2d, 0x5c, 0xf9, 0x8d, 0xdf, 0xbb, 0xf8, 0x91, 0xdf, 0xfa, 0xbd, 0x8b, 0x1f, 0xf9, + 0xed, 0xdf, 0xbb, 0xf8, 0x91, 0xef, 0xb8, 0x7f, 0xd1, 0xfa, 0x8d, 0xfb, 0x17, 0xad, 0xdf, 0xba, + 0x7f, 0xd1, 0xfa, 0xed, 0xfb, 0x17, 0xad, 0xdf, 0xbd, 0x7f, 0xd1, 0xfa, 0xd2, 0xef, 0x5f, 0xfc, + 0xc8, 0x5b, 0x85, 0xdd, 0x67, 0xff, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x5e, 0x40, 0x10, 0x5c, + 0xb3, 0xfc, 0x00, 0x00, } func (m *AWSElasticBlockStoreVolumeSource) Marshal() (dAtA []byte, err error) { @@ -17651,6 +17652,17 @@ func (m *ServiceSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.TopologyKeys) > 0 { + for iNdEx := len(m.TopologyKeys) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TopologyKeys[iNdEx]) + copy(dAtA[i:], m.TopologyKeys[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.TopologyKeys[iNdEx]))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x82 + } + } if m.IPFamily != nil { i -= len(*m.IPFamily) copy(dAtA[i:], *m.IPFamily) @@ -23017,6 +23029,12 @@ func (m *ServiceSpec) Size() (n int) { l = len(*m.IPFamily) n += 1 + l + sovGenerated(uint64(l)) } + if len(m.TopologyKeys) > 0 { + for _, s := range m.TopologyKeys { + l = len(s) + n += 2 + l + sovGenerated(uint64(l)) + } + } return n } @@ -26538,6 +26556,7 @@ func (this *ServiceSpec) String() string { `PublishNotReadyAddresses:` + fmt.Sprintf("%v", this.PublishNotReadyAddresses) + `,`, `SessionAffinityConfig:` + strings.Replace(this.SessionAffinityConfig.String(), "SessionAffinityConfig", "SessionAffinityConfig", 1) + `,`, `IPFamily:` + valueToStringGenerated(this.IPFamily) + `,`, + `TopologyKeys:` + fmt.Sprintf("%v", this.TopologyKeys) + `,`, `}`, }, "") return s @@ -62247,6 +62266,38 @@ func (m *ServiceSpec) Unmarshal(dAtA []byte) error { s := IPFamily(dAtA[iNdEx:postIndex]) m.IPFamily = &s iNdEx = postIndex + case 16: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TopologyKeys", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TopologyKeys = append(m.TopologyKeys, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/staging/src/k8s.io/api/core/v1/generated.proto b/staging/src/k8s.io/api/core/v1/generated.proto index b61e5d7bea5..9d2cf387cc9 100644 --- a/staging/src/k8s.io/api/core/v1/generated.proto +++ b/staging/src/k8s.io/api/core/v1/generated.proto @@ -4741,6 +4741,21 @@ message ServiceSpec { // cluster (e.g. IPv6 in IPv4 only cluster) is an error condition and will fail during clusterIP assignment. // +optional optional string ipFamily = 15; + + // topologyKeys is a preference-order list of topology keys which + // implementations of services should use to preferentially sort endpoints + // when accessing this Service, it can not be used at the same time as + // externalTrafficPolicy=Local. + // Topology keys must be valid label keys and at most 16 keys may be specified. + // Endpoints are chosen based on the first topology key with available backends. + // If this field is specified and all entries have no backends that match + // the topology of the client, the service has no backends for that client + // and connections should fail. + // The special value "*" may be used to mean "any topology". This catch-all + // value, if used, only makes sense as the last value in the list. + // If this is not specified or empty, no topology constraints will be applied. + // +optional + repeated string topologyKeys = 16; } // ServiceStatus represents the current status of a service. 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 993bc40b5ea..9b72bd307a2 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 @@ -2204,6 +2204,7 @@ var map_ServiceSpec = map[string]string{ "publishNotReadyAddresses": "publishNotReadyAddresses, when set to true, indicates that DNS implementations must publish the notReadyAddresses of subsets for the Endpoints associated with the Service. The default value is false. The primary use case for setting this field is to use a StatefulSet's Headless Service to propagate SRV records for its Pods without respect to their readiness for purpose of peer discovery.", "sessionAffinityConfig": "sessionAffinityConfig contains the configurations of session affinity.", "ipFamily": "ipFamily specifies whether this Service has a preference for a particular IP family (e.g. IPv4 vs. IPv6). If a specific IP family is requested, the clusterIP field will be allocated from that family, if it is available in the cluster. If no IP family is requested, the cluster's primary IP family will be used. Other IP fields (loadBalancerIP, loadBalancerSourceRanges, externalIPs) and controllers which allocate external load-balancers should use the same IP family. Endpoints for this Service will be of this family. This field is immutable after creation. Assigning a ServiceIPFamily not available in the cluster (e.g. IPv6 in IPv4 only cluster) is an error condition and will fail during clusterIP assignment.", + "topologyKeys": "topologyKeys is a preference-order list of topology keys which implementations of services should use to preferentially sort endpoints when accessing this Service, it can not be used at the same time as externalTrafficPolicy=Local. Topology keys must be valid label keys and at most 16 keys may be specified. Endpoints are chosen based on the first topology key with available backends. If this field is specified and all entries have no backends that match the topology of the client, the service has no backends for that client and connections should fail. The special value \"*\" may be used to mean \"any topology\". This catch-all value, if used, only makes sense as the last value in the list. If this is not specified or empty, no topology constraints will be applied.", } func (ServiceSpec) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go index fd47019c034..ac4855abc41 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 @@ -5186,6 +5186,11 @@ func (in *ServiceSpec) DeepCopyInto(out *ServiceSpec) { *out = new(IPFamily) **out = **in } + if in.TopologyKeys != nil { + in, out := &in.TopologyKeys, &out.TopologyKeys + *out = make([]string, len(*in)) + copy(*out, *in) + } return } diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Service.json b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Service.json index 28daaafba50..2fb564e232d 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Service.json +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Service.json @@ -72,14 +72,17 @@ "timeoutSeconds": -1973740160 } }, - "ipFamily": "³-Ǐ忄*齧獚敆ȎțêɘIJ斬" + "ipFamily": "³-Ǐ忄*齧獚敆ȎțêɘIJ斬", + "topologyKeys": [ + "28" + ] }, "status": { "loadBalancer": { "ingress": [ { - "ip": "28", - "hostname": "29" + "ip": "29", + "hostname": "30" } ] } diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Service.pb b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Service.pb index 24f1972253c023edd3cc76ade0f7d984ead6ae18..215b89f2edb7f878fd01dce5d775919f691bbb9e 100644 GIT binary patch delta 40 wcmbQpJdJsR2;-lLqU#vg|ZvX%Q delta 35 rcmbQnJdt^V2;=vOqU#uUO+2z&NQ#Gxi;IJc$;d*8$;eWQL5TqX!;uJh diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Service.yaml b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Service.yaml index 02b6d48da6a..f338d767ae3 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Service.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Service.yaml @@ -53,9 +53,11 @@ spec: sessionAffinityConfig: clientIP: timeoutSeconds: -1973740160 + topologyKeys: + - "28" type: .蘯6ċV夸 status: loadBalancer: ingress: - - hostname: "29" - ip: "28" + - hostname: "30" + ip: "29"