From 0eb5431cb7227751f19030a0418d2ab94e700a46 Mon Sep 17 00:00:00 2001 From: Kubernetes Publisher Date: Sat, 21 Jan 2017 15:19:42 +0000 Subject: [PATCH] published by bot (https://github.com/kubernetes/contrib/tree/master/mungegithub) copied from https://github.com/kubernetes/kubernetes.git, branch master, last commit is 8d5227bb2e05e01031ace81fa6611a13f598278e --- Godeps/Godeps.json | 74 +- discovery/discovery_client.go | 20 +- discovery/discovery_client_test.go | 22 +- discovery/fake/discovery.go | 4 +- discovery/helper_blackbox_test.go | 6 +- discovery/restmapper_test.go | 4 +- dynamic/client.go | 18 +- dynamic/client_pool.go | 6 +- dynamic/client_test.go | 6 +- kubernetes/typed/core/v1/event_expansion.go | 2 +- .../core/v1/fake/fake_event_expansion.go | 2 +- .../typed/core/v1/fake/fake_pod_expansion.go | 6 +- .../core/v1/fake/fake_service_expansion.go | 4 +- kubernetes/typed/core/v1/pod_expansion.go | 6 +- kubernetes/typed/core/v1/service_expansion.go | 6 +- kubernetes/typed/policy/v1alpha1/fake/doc.go | 20 - .../v1alpha1/fake/fake_poddisruptionbudget.go | 128 -- .../v1alpha1/fake/fake_policy_client.go | 38 - .../policy/v1alpha1/poddisruptionbudget.go | 168 --- .../typed/policy/v1alpha1/policy_client.go | 98 -- pkg/api/conversion.go | 2 +- pkg/api/defaults.go | 2 +- pkg/api/helpers.go | 2 +- pkg/api/types.go | 6 +- pkg/api/v1/defaults.go | 3 + pkg/api/v1/generated.pb.go | 1314 +++++++++-------- pkg/api/v1/generated.proto | 5 + pkg/api/v1/helpers.go | 2 +- pkg/api/v1/types.generated.go | 432 +++--- pkg/api/v1/types.go | 4 + pkg/api/v1/types_swagger_doc_generated.go | 1 + pkg/api/v1/zz_generated.conversion.go | 2 + pkg/api/validation/path/name.go | 68 - pkg/api/zz_generated.deepcopy.go | 2 +- pkg/apis/apps/v1beta1/types.generated.go | 2 +- pkg/apis/batch/v1/types.generated.go | 2 +- pkg/apis/batch/v2alpha1/types.generated.go | 4 +- .../extensions/v1beta1/types.generated.go | 6 +- pkg/apis/kubeadm/types.go | 1 + pkg/apis/kubeadm/v1alpha1/defaults.go | 9 +- pkg/apis/kubeadm/v1alpha1/types.go | 1 + pkg/apis/policy/v1alpha1/doc.go | 20 - pkg/apis/policy/v1alpha1/register.go | 56 - pkg/apis/policy/v1alpha1/types.go | 93 -- pkg/util/cert/cert.go | 12 +- .../doc.go => pkg/util/cert/csr_test.go | 32 +- pkg/util/cert/testdata/dontUseThisKey.pem | 6 + pkg/util/cert/triple/triple.go | 116 ++ pkg/util/clock/clock_test.go | 184 +++ pkg/util/flowcontrol/backoff_test.go | 195 +++ pkg/util/flowcontrol/throttle_test.go | 177 +++ pkg/util/integer/integer_test.go | 244 +++ pkg/util/jsonpath/doc.go | 2 +- pkg/util/jsonpath/jsonpath_test.go | 282 ++++ pkg/util/jsonpath/parser_test.go | 136 ++ pkg/util/strategicpatch/patch.go | 52 +- pkg/util/testing/fake_handler_test.go | 180 +++ plugin/pkg/client/auth/gcp/gcp.go | 12 +- plugin/pkg/client/auth/oidc/oidc.go | 14 +- plugin/pkg/client/auth/oidc/oidc_test.go | 2 +- rest/fake/fake.go | 22 +- rest/request.go | 64 +- rest/request_test.go | 27 + testing/actions.go | 2 +- testing/fake.go | 8 +- testing/fixture.go | 4 +- tools/auth/clientauth.go | 6 +- tools/cache/listwatch.go | 6 +- tools/clientcmd/client_config.go | 52 +- tools/clientcmd/client_config_test.go | 8 +- tools/clientcmd/config.go | 4 +- tools/clientcmd/loader.go | 8 +- tools/clientcmd/merged_client_builder.go | 4 +- tools/clientcmd/merged_client_builder_test.go | 10 +- tools/record/event.go | 4 +- tools/record/event_test.go | 4 +- tools/record/events_cache.go | 2 +- .../k8s.io/apimachinery/pkg}/fields/doc.go | 0 .../k8s.io/apimachinery/pkg}/fields/fields.go | 0 .../apimachinery/pkg}/fields/requirements.go | 0 .../apimachinery/pkg}/fields/selector.go | 0 .../k8s.io/apimachinery/pkg/openapi/doc.go | 5 +- 82 files changed, 2821 insertions(+), 1742 deletions(-) delete mode 100644 kubernetes/typed/policy/v1alpha1/fake/doc.go delete mode 100644 kubernetes/typed/policy/v1alpha1/fake/fake_poddisruptionbudget.go delete mode 100644 kubernetes/typed/policy/v1alpha1/fake/fake_policy_client.go delete mode 100644 kubernetes/typed/policy/v1alpha1/poddisruptionbudget.go delete mode 100644 kubernetes/typed/policy/v1alpha1/policy_client.go delete mode 100644 pkg/api/validation/path/name.go delete mode 100644 pkg/apis/policy/v1alpha1/doc.go delete mode 100644 pkg/apis/policy/v1alpha1/register.go delete mode 100644 pkg/apis/policy/v1alpha1/types.go rename kubernetes/typed/policy/v1alpha1/doc.go => pkg/util/cert/csr_test.go (52%) create mode 100644 pkg/util/cert/testdata/dontUseThisKey.pem create mode 100644 pkg/util/cert/triple/triple.go create mode 100644 pkg/util/clock/clock_test.go create mode 100644 pkg/util/flowcontrol/backoff_test.go create mode 100644 pkg/util/flowcontrol/throttle_test.go create mode 100644 pkg/util/integer/integer_test.go create mode 100644 pkg/util/jsonpath/jsonpath_test.go create mode 100644 pkg/util/jsonpath/parser_test.go create mode 100644 pkg/util/testing/fake_handler_test.go rename {pkg => vendor/k8s.io/apimachinery/pkg}/fields/doc.go (100%) rename {pkg => vendor/k8s.io/apimachinery/pkg}/fields/fields.go (100%) rename {pkg => vendor/k8s.io/apimachinery/pkg}/fields/requirements.go (100%) rename {pkg => vendor/k8s.io/apimachinery/pkg}/fields/selector.go (100%) rename kubernetes/typed/policy/v1alpha1/generated_expansion.go => vendor/k8s.io/apimachinery/pkg/openapi/doc.go (83%) diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index ca7ac927..fb261897 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -324,143 +324,147 @@ }, { "ImportPath": "k8s.io/apimachinery/pkg/api/errors", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/meta", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/apimachinery", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/apimachinery/registered", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/fields", + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/labels", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/openapi", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/selection", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/types", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/diff", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/errors", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/framer", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/json", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/net", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/rand", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/runtime", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/sets", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation/field", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/wait", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/yaml", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/version", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/pkg/watch", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect", - "Rev": "fd5da6b9d070d172e9677941ced569deabdd05ea" + "Rev": "a6364387e6d54a910a0810543a14b6867eafaa99" } ] } diff --git a/discovery/discovery_client.go b/discovery/discovery_client.go index 8031ce21..25fa2cfa 100644 --- a/discovery/discovery_client.go +++ b/discovery/discovery_client.go @@ -33,7 +33,7 @@ import ( "k8s.io/apimachinery/pkg/version" "k8s.io/client-go/pkg/api" "k8s.io/client-go/pkg/api/v1" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" ) // defaultRetries is the number of times a resource discovery is repeated if an api group disappears on the fly (e.g. ThirdPartyResources). @@ -42,7 +42,7 @@ const defaultRetries = 2 // DiscoveryInterface holds the methods that discover server-supported API groups, // versions and resources. type DiscoveryInterface interface { - RESTClient() rest.Interface + RESTClient() restclient.Interface ServerGroupsInterface ServerResourcesInterface ServerVersionInterface @@ -94,7 +94,7 @@ type SwaggerSchemaInterface interface { // DiscoveryClient implements the functions that discover server-supported API groups, // versions and resources. type DiscoveryClient struct { - restClient rest.Interface + restClient restclient.Interface LegacyPrefix string } @@ -380,31 +380,31 @@ func withRetries(maxRetries int, f func(failEarly bool) ([]*metav1.APIResourceLi return result, err } -func setDiscoveryDefaults(config *rest.Config) error { +func setDiscoveryDefaults(config *restclient.Config) error { config.APIPath = "" config.GroupVersion = nil codec := runtime.NoopEncoder{Decoder: api.Codecs.UniversalDecoder()} config.NegotiatedSerializer = serializer.NegotiatedSerializerWrapper(runtime.SerializerInfo{Serializer: codec}) if len(config.UserAgent) == 0 { - config.UserAgent = rest.DefaultKubernetesUserAgent() + config.UserAgent = restclient.DefaultKubernetesUserAgent() } return nil } // NewDiscoveryClientForConfig creates a new DiscoveryClient for the given config. This client // can be used to discover supported resources in the API server. -func NewDiscoveryClientForConfig(c *rest.Config) (*DiscoveryClient, error) { +func NewDiscoveryClientForConfig(c *restclient.Config) (*DiscoveryClient, error) { config := *c if err := setDiscoveryDefaults(&config); err != nil { return nil, err } - client, err := rest.UnversionedRESTClientFor(&config) + client, err := restclient.UnversionedRESTClientFor(&config) return &DiscoveryClient{restClient: client, LegacyPrefix: "/api"}, err } // NewDiscoveryClientForConfig creates a new DiscoveryClient for the given config. If // there is an error, it panics. -func NewDiscoveryClientForConfigOrDie(c *rest.Config) *DiscoveryClient { +func NewDiscoveryClientForConfigOrDie(c *restclient.Config) *DiscoveryClient { client, err := NewDiscoveryClientForConfig(c) if err != nil { panic(err) @@ -414,7 +414,7 @@ func NewDiscoveryClientForConfigOrDie(c *rest.Config) *DiscoveryClient { } // New creates a new DiscoveryClient for the given RESTClient. -func NewDiscoveryClient(c rest.Interface) *DiscoveryClient { +func NewDiscoveryClient(c restclient.Interface) *DiscoveryClient { return &DiscoveryClient{restClient: c, LegacyPrefix: "/api"} } @@ -429,7 +429,7 @@ func stringDoesntExistIn(str string, slice []string) bool { // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. -func (c *DiscoveryClient) RESTClient() rest.Interface { +func (c *DiscoveryClient) RESTClient() restclient.Interface { if c == nil { return nil } diff --git a/discovery/discovery_client_test.go b/discovery/discovery_client_test.go index e1350615..6f5a2ecf 100644 --- a/discovery/discovery_client_test.go +++ b/discovery/discovery_client_test.go @@ -30,7 +30,7 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/version" "k8s.io/client-go/pkg/api/v1" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" ) func TestGetServerVersion(t *testing.T) { @@ -50,7 +50,7 @@ func TestGetServerVersion(t *testing.T) { w.Write(output) })) defer server.Close() - client := NewDiscoveryClientForConfigOrDie(&rest.Config{Host: server.URL}) + client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) got, err := client.ServerVersion() if err != nil { @@ -85,7 +85,7 @@ func TestGetServerGroupsWithV1Server(t *testing.T) { w.Write(output) })) defer server.Close() - client := NewDiscoveryClientForConfigOrDie(&rest.Config{Host: server.URL}) + client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) // ServerGroups should not return an error even if server returns error at /api and /apis apiGroupList, err := client.ServerGroups() if err != nil { @@ -103,7 +103,7 @@ func TestGetServerGroupsWithBrokenServer(t *testing.T) { w.WriteHeader(statusCode) })) defer server.Close() - client := NewDiscoveryClientForConfigOrDie(&rest.Config{Host: server.URL}) + client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) // ServerGroups should not return an error even if server returns Not Found or Forbidden error at all end points apiGroupList, err := client.ServerGroups() if err != nil { @@ -140,7 +140,7 @@ func TestGetServerResourcesWithV1Server(t *testing.T) { w.Write(output) })) defer server.Close() - client := NewDiscoveryClientForConfigOrDie(&rest.Config{Host: server.URL}) + client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) // ServerResources should not return an error even if server returns error at /api/v1. serverResources, err := client.ServerResources() if err != nil { @@ -232,7 +232,7 @@ func TestGetServerResources(t *testing.T) { w.Write(output) })) defer server.Close() - client := NewDiscoveryClientForConfigOrDie(&rest.Config{Host: server.URL}) + client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) for _, test := range tests { got, err := client.ServerResourcesForGroupVersion(test.request) if test.expectErr { @@ -295,7 +295,7 @@ func TestGetSwaggerSchema(t *testing.T) { } defer server.Close() - client := NewDiscoveryClientForConfigOrDie(&rest.Config{Host: server.URL}) + client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) got, err := client.SwaggerSchema(v1.SchemeGroupVersion) if err != nil { t.Fatalf("unexpected encoding error: %v", err) @@ -314,7 +314,7 @@ func TestGetSwaggerSchemaFail(t *testing.T) { } defer server.Close() - client := NewDiscoveryClientForConfigOrDie(&rest.Config{Host: server.URL}) + client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) got, err := client.SwaggerSchema(schema.GroupVersion{Group: "api.group", Version: "v4"}) if got != nil { t.Fatalf("unexpected response: %v", got) @@ -427,7 +427,7 @@ func TestServerPreferredResources(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(test.response)) defer server.Close() - client := NewDiscoveryClientForConfigOrDie(&rest.Config{Host: server.URL}) + client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) resources, err := client.ServerPreferredResources() if test.expectErr != nil { if err == nil { @@ -540,7 +540,7 @@ func TestServerPreferredResourcesRetries(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(response(tc.responseErrors))) defer server.Close() - client := NewDiscoveryClientForConfigOrDie(&rest.Config{Host: server.URL}) + client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) resources, err := client.ServerPreferredResources() if !tc.expectedError(err) { t.Errorf("case %d: unexpected error: %v", i, err) @@ -711,7 +711,7 @@ func TestServerPreferredNamespacedResources(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(test.response)) defer server.Close() - client := NewDiscoveryClientForConfigOrDie(&rest.Config{Host: server.URL}) + client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) resources, err := client.ServerPreferredNamespacedResources() if err != nil { t.Errorf("[%d] unexpected error: %v", i, err) diff --git a/discovery/fake/discovery.go b/discovery/fake/discovery.go index 534fa23e..8fbed28d 100644 --- a/discovery/fake/discovery.go +++ b/discovery/fake/discovery.go @@ -26,7 +26,7 @@ import ( "k8s.io/apimachinery/pkg/version" "k8s.io/client-go/pkg/api/v1" kubeversion "k8s.io/client-go/pkg/version" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" "k8s.io/client-go/testing" ) @@ -92,6 +92,6 @@ func (c *FakeDiscovery) SwaggerSchema(version schema.GroupVersion) (*swagger.Api return &swagger.ApiDeclaration{}, nil } -func (c *FakeDiscovery) RESTClient() rest.Interface { +func (c *FakeDiscovery) RESTClient() restclient.Interface { return nil } diff --git a/discovery/helper_blackbox_test.go b/discovery/helper_blackbox_test.go index 1253732b..8731658a 100644 --- a/discovery/helper_blackbox_test.go +++ b/discovery/helper_blackbox_test.go @@ -34,7 +34,7 @@ import ( "k8s.io/client-go/discovery" "k8s.io/client-go/pkg/api" "k8s.io/client-go/pkg/api/testapi" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" "k8s.io/client-go/rest/fake" ) @@ -139,8 +139,8 @@ func TestNegotiateVersion(t *testing.T) { return &http.Response{StatusCode: test.statusCode, Header: header, Body: objBody(&uapi.APIVersions{Versions: test.serverVersions})}, nil }), } - c := discovery.NewDiscoveryClientForConfigOrDie(&rest.Config{}) - c.RESTClient().(*rest.RESTClient).Client = fakeClient.Client + c := discovery.NewDiscoveryClientForConfigOrDie(&restclient.Config{}) + c.RESTClient().(*restclient.RESTClient).Client = fakeClient.Client response, err := discovery.NegotiateVersion(c, test.requiredVersion, test.clientVersions) if err == nil && test.expectErr != nil { t.Errorf("expected error, got nil for [%s].", test.name) diff --git a/discovery/restmapper_test.go b/discovery/restmapper_test.go index deb619e1..3961ab6f 100644 --- a/discovery/restmapper_test.go +++ b/discovery/restmapper_test.go @@ -25,7 +25,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/version" "k8s.io/client-go/pkg/api" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" "k8s.io/client-go/rest/fake" "github.com/emicklei/go-restful/swagger" @@ -246,7 +246,7 @@ func (c *fakeCachedDiscoveryInterface) Invalidate() { c.enabledA = true } -func (c *fakeCachedDiscoveryInterface) RESTClient() rest.Interface { +func (c *fakeCachedDiscoveryInterface) RESTClient() restclient.Interface { return &fake.RESTClient{} } diff --git a/dynamic/client.go b/dynamic/client.go index bf3929ed..75771dfa 100644 --- a/dynamic/client.go +++ b/dynamic/client.go @@ -37,19 +37,19 @@ import ( "k8s.io/client-go/pkg/api" "k8s.io/client-go/pkg/api/v1" "k8s.io/client-go/pkg/util/flowcontrol" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" ) // Client is a Kubernetes client that allows you to access metadata // and manipulate metadata of a Kubernetes API group. type Client struct { - cl *rest.RESTClient + cl *restclient.RESTClient parameterCodec runtime.ParameterCodec } // NewClient returns a new client based on the passed in config. The // codec is ignored, as the dynamic client uses it's own codec. -func NewClient(conf *rest.Config) (*Client, error) { +func NewClient(conf *restclient.Config) (*Client, error) { // avoid changing the original config confCopy := *conf conf = &confCopy @@ -66,10 +66,10 @@ func NewClient(conf *rest.Config) (*Client, error) { } if len(conf.UserAgent) == 0 { - conf.UserAgent = rest.DefaultKubernetesUserAgent() + conf.UserAgent = restclient.DefaultKubernetesUserAgent() } - cl, err := rest.RESTClientFor(conf) + cl, err := restclient.RESTClientFor(conf) if err != nil { return nil, err } @@ -105,7 +105,7 @@ func (c *Client) ParameterCodec(parameterCodec runtime.ParameterCodec) *Client { // ResourceClient is an API interface to a specific resource under a // dynamic client. type ResourceClient struct { - cl *rest.RESTClient + cl *restclient.RESTClient resource *metav1.APIResource ns string parameterCodec runtime.ParameterCodec @@ -242,8 +242,8 @@ func (dynamicCodec) Encode(obj runtime.Object, w io.Writer) error { return unstructured.UnstructuredJSONScheme.Encode(obj, w) } -// ContentConfig returns a rest.ContentConfig for dynamic types. -func ContentConfig() rest.ContentConfig { +// ContentConfig returns a restclient.ContentConfig for dynamic types. +func ContentConfig() restclient.ContentConfig { var jsonInfo runtime.SerializerInfo // TODO: api.Codecs here should become "pkg/apis/server/scheme" which is the minimal core you need // to talk to a kubernetes server @@ -256,7 +256,7 @@ func ContentConfig() rest.ContentConfig { jsonInfo.Serializer = dynamicCodec{} jsonInfo.PrettySerializer = nil - return rest.ContentConfig{ + return restclient.ContentConfig{ AcceptContentTypes: runtime.ContentTypeJSON, ContentType: runtime.ContentTypeJSON, NegotiatedSerializer: serializer.NegotiatedSerializerWrapper(jsonInfo), diff --git a/dynamic/client_pool.go b/dynamic/client_pool.go index a5ff7f04..205d8a0d 100644 --- a/dynamic/client_pool.go +++ b/dynamic/client_pool.go @@ -21,7 +21,7 @@ import ( "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" ) // ClientPool manages a pool of dynamic clients. @@ -50,7 +50,7 @@ func LegacyAPIPathResolverFunc(kind schema.GroupVersionKind) string { // is asked to retrieve. This type is thread safe. type clientPoolImpl struct { lock sync.RWMutex - config *rest.Config + config *restclient.Config clients map[schema.GroupVersion]*Client apiPathResolverFunc APIPathResolverFunc mapper meta.RESTMapper @@ -59,7 +59,7 @@ type clientPoolImpl struct { // NewClientPool returns a ClientPool from the specified config. It reuses clients for the the same // group version. It is expected this type may be wrapped by specific logic that special cases certain // resources or groups. -func NewClientPool(config *rest.Config, mapper meta.RESTMapper, apiPathResolverFunc APIPathResolverFunc) ClientPool { +func NewClientPool(config *restclient.Config, mapper meta.RESTMapper, apiPathResolverFunc APIPathResolverFunc) ClientPool { confCopy := *config return &clientPoolImpl{ diff --git a/dynamic/client_test.go b/dynamic/client_test.go index 3499e43e..418aecba 100644 --- a/dynamic/client_test.go +++ b/dynamic/client_test.go @@ -33,7 +33,7 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/watch" "k8s.io/client-go/pkg/api/v1" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" restclientwatch "k8s.io/client-go/rest/watch" ) @@ -61,9 +61,9 @@ func getObject(version, kind, name string) *unstructured.Unstructured { func getClientServer(gv *schema.GroupVersion, h func(http.ResponseWriter, *http.Request)) (*Client, *httptest.Server, error) { srv := httptest.NewServer(http.HandlerFunc(h)) - cl, err := NewClient(&rest.Config{ + cl, err := NewClient(&restclient.Config{ Host: srv.URL, - ContentConfig: rest.ContentConfig{GroupVersion: gv}, + ContentConfig: restclient.ContentConfig{GroupVersion: gv}, }) if err != nil { srv.Close() diff --git a/kubernetes/typed/core/v1/event_expansion.go b/kubernetes/typed/core/v1/event_expansion.go index 15930844..bad8b4bd 100644 --- a/kubernetes/typed/core/v1/event_expansion.go +++ b/kubernetes/typed/core/v1/event_expansion.go @@ -19,11 +19,11 @@ package v1 import ( "fmt" + "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/pkg/api" "k8s.io/client-go/pkg/api/v1" - "k8s.io/client-go/pkg/fields" ) // The EventExpansion interface allows manually adding extra methods to the EventInterface. diff --git a/kubernetes/typed/core/v1/fake/fake_event_expansion.go b/kubernetes/typed/core/v1/fake/fake_event_expansion.go index 7ed87d53..f66bb862 100644 --- a/kubernetes/typed/core/v1/fake/fake_event_expansion.go +++ b/kubernetes/typed/core/v1/fake/fake_event_expansion.go @@ -17,10 +17,10 @@ limitations under the License. package fake import ( + "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/pkg/api" "k8s.io/client-go/pkg/api/v1" - "k8s.io/client-go/pkg/fields" "k8s.io/client-go/testing" ) diff --git a/kubernetes/typed/core/v1/fake/fake_pod_expansion.go b/kubernetes/typed/core/v1/fake/fake_pod_expansion.go index 4fe2a05b..c54c1658 100644 --- a/kubernetes/typed/core/v1/fake/fake_pod_expansion.go +++ b/kubernetes/typed/core/v1/fake/fake_pod_expansion.go @@ -19,7 +19,7 @@ package fake import ( "k8s.io/client-go/pkg/api/v1" policy "k8s.io/client-go/pkg/apis/policy/v1beta1" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" "k8s.io/client-go/testing" ) @@ -34,7 +34,7 @@ func (c *FakePods) Bind(binding *v1.Binding) error { return err } -func (c *FakePods) GetLogs(name string, opts *v1.PodLogOptions) *rest.Request { +func (c *FakePods) GetLogs(name string, opts *v1.PodLogOptions) *restclient.Request { action := testing.GenericActionImpl{} action.Verb = "get" action.Namespace = c.ns @@ -43,7 +43,7 @@ func (c *FakePods) GetLogs(name string, opts *v1.PodLogOptions) *rest.Request { action.Value = opts _, _ = c.Fake.Invokes(action, &v1.Pod{}) - return &rest.Request{} + return &restclient.Request{} } func (c *FakePods) Evict(eviction *policy.Eviction) error { diff --git a/kubernetes/typed/core/v1/fake/fake_service_expansion.go b/kubernetes/typed/core/v1/fake/fake_service_expansion.go index f3128b8f..59fa8e51 100644 --- a/kubernetes/typed/core/v1/fake/fake_service_expansion.go +++ b/kubernetes/typed/core/v1/fake/fake_service_expansion.go @@ -17,10 +17,10 @@ limitations under the License. package fake import ( - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" "k8s.io/client-go/testing" ) -func (c *FakeServices) ProxyGet(scheme, name, port, path string, params map[string]string) rest.ResponseWrapper { +func (c *FakeServices) ProxyGet(scheme, name, port, path string, params map[string]string) restclient.ResponseWrapper { return c.Fake.InvokesProxy(testing.NewProxyGetAction(servicesResource, c.ns, scheme, name, port, path, params)) } diff --git a/kubernetes/typed/core/v1/pod_expansion.go b/kubernetes/typed/core/v1/pod_expansion.go index c54ba6a7..82f3b7fb 100644 --- a/kubernetes/typed/core/v1/pod_expansion.go +++ b/kubernetes/typed/core/v1/pod_expansion.go @@ -20,14 +20,14 @@ import ( "k8s.io/client-go/pkg/api" "k8s.io/client-go/pkg/api/v1" policy "k8s.io/client-go/pkg/apis/policy/v1beta1" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" ) // The PodExpansion interface allows manually adding extra methods to the PodInterface. type PodExpansion interface { Bind(binding *v1.Binding) error Evict(eviction *policy.Eviction) error - GetLogs(name string, opts *v1.PodLogOptions) *rest.Request + GetLogs(name string, opts *v1.PodLogOptions) *restclient.Request } // Bind applies the provided binding to the named pod in the current namespace (binding.Namespace is ignored). @@ -40,6 +40,6 @@ func (c *pods) Evict(eviction *policy.Eviction) error { } // Get constructs a request for getting the logs for a pod -func (c *pods) GetLogs(name string, opts *v1.PodLogOptions) *rest.Request { +func (c *pods) GetLogs(name string, opts *v1.PodLogOptions) *restclient.Request { return c.client.Get().Namespace(c.ns).Name(name).Resource("pods").SubResource("log").VersionedParams(opts, api.ParameterCodec) } diff --git a/kubernetes/typed/core/v1/service_expansion.go b/kubernetes/typed/core/v1/service_expansion.go index 07b212bb..d2bb531d 100644 --- a/kubernetes/typed/core/v1/service_expansion.go +++ b/kubernetes/typed/core/v1/service_expansion.go @@ -18,16 +18,16 @@ package v1 import ( "k8s.io/apimachinery/pkg/util/net" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" ) // The ServiceExpansion interface allows manually adding extra methods to the ServiceInterface. type ServiceExpansion interface { - ProxyGet(scheme, name, port, path string, params map[string]string) rest.ResponseWrapper + ProxyGet(scheme, name, port, path string, params map[string]string) restclient.ResponseWrapper } // ProxyGet returns a response of the service by calling it through the proxy. -func (c *services) ProxyGet(scheme, name, port, path string, params map[string]string) rest.ResponseWrapper { +func (c *services) ProxyGet(scheme, name, port, path string, params map[string]string) restclient.ResponseWrapper { request := c.client.Get(). Prefix("proxy"). Namespace(c.ns). diff --git a/kubernetes/typed/policy/v1alpha1/fake/doc.go b/kubernetes/typed/policy/v1alpha1/fake/doc.go deleted file mode 100644 index b320cb63..00000000 --- a/kubernetes/typed/policy/v1alpha1/fake/doc.go +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright 2016 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. -*/ - -// This package is generated by client-gen with arguments: --clientset-name=release_1_5 --input=[api/v1,apps/v1beta1,authentication/v1beta1,authorization/v1beta1,autoscaling/v1,batch/v1,batch/v2alpha1,certificates/v1alpha1,extensions/v1beta1,policy/v1alpha1,rbac/v1alpha1,storage/v1beta1] - -// Package fake has the automatically generated clients. -package fake diff --git a/kubernetes/typed/policy/v1alpha1/fake/fake_poddisruptionbudget.go b/kubernetes/typed/policy/v1alpha1/fake/fake_poddisruptionbudget.go deleted file mode 100644 index e10dc904..00000000 --- a/kubernetes/typed/policy/v1alpha1/fake/fake_poddisruptionbudget.go +++ /dev/null @@ -1,128 +0,0 @@ -/* -Copyright 2016 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 fake - -import ( - labels "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - v1 "k8s.io/client-go/pkg/api/v1" - v1alpha1 "k8s.io/client-go/pkg/apis/policy/v1alpha1" - testing "k8s.io/client-go/testing" -) - -// FakePodDisruptionBudgets implements PodDisruptionBudgetInterface -type FakePodDisruptionBudgets struct { - Fake *FakePolicyV1alpha1 - ns string -} - -var poddisruptionbudgetsResource = schema.GroupVersionResource{Group: "policy", Version: "v1alpha1", Resource: "poddisruptionbudgets"} - -func (c *FakePodDisruptionBudgets) Create(podDisruptionBudget *v1alpha1.PodDisruptionBudget) (result *v1alpha1.PodDisruptionBudget, err error) { - obj, err := c.Fake. - Invokes(testing.NewCreateAction(poddisruptionbudgetsResource, c.ns, podDisruptionBudget), &v1alpha1.PodDisruptionBudget{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.PodDisruptionBudget), err -} - -func (c *FakePodDisruptionBudgets) Update(podDisruptionBudget *v1alpha1.PodDisruptionBudget) (result *v1alpha1.PodDisruptionBudget, err error) { - obj, err := c.Fake. - Invokes(testing.NewUpdateAction(poddisruptionbudgetsResource, c.ns, podDisruptionBudget), &v1alpha1.PodDisruptionBudget{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.PodDisruptionBudget), err -} - -func (c *FakePodDisruptionBudgets) UpdateStatus(podDisruptionBudget *v1alpha1.PodDisruptionBudget) (*v1alpha1.PodDisruptionBudget, error) { - obj, err := c.Fake. - Invokes(testing.NewUpdateSubresourceAction(poddisruptionbudgetsResource, "status", c.ns, podDisruptionBudget), &v1alpha1.PodDisruptionBudget{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.PodDisruptionBudget), err -} - -func (c *FakePodDisruptionBudgets) Delete(name string, options *v1.DeleteOptions) error { - _, err := c.Fake. - Invokes(testing.NewDeleteAction(poddisruptionbudgetsResource, c.ns, name), &v1alpha1.PodDisruptionBudget{}) - - return err -} - -func (c *FakePodDisruptionBudgets) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - action := testing.NewDeleteCollectionAction(poddisruptionbudgetsResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &v1alpha1.PodDisruptionBudgetList{}) - return err -} - -func (c *FakePodDisruptionBudgets) Get(name string) (result *v1alpha1.PodDisruptionBudget, err error) { - obj, err := c.Fake. - Invokes(testing.NewGetAction(poddisruptionbudgetsResource, c.ns, name), &v1alpha1.PodDisruptionBudget{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.PodDisruptionBudget), err -} - -func (c *FakePodDisruptionBudgets) List(opts v1.ListOptions) (result *v1alpha1.PodDisruptionBudgetList, err error) { - obj, err := c.Fake. - Invokes(testing.NewListAction(poddisruptionbudgetsResource, c.ns, opts), &v1alpha1.PodDisruptionBudgetList{}) - - if obj == nil { - return nil, err - } - - label, _, _ := testing.ExtractFromListOptions(opts) - if label == nil { - label = labels.Everything() - } - list := &v1alpha1.PodDisruptionBudgetList{} - for _, item := range obj.(*v1alpha1.PodDisruptionBudgetList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested podDisruptionBudgets. -func (c *FakePodDisruptionBudgets) Watch(opts v1.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(testing.NewWatchAction(poddisruptionbudgetsResource, c.ns, opts)) - -} - -// Patch applies the patch and returns the patched podDisruptionBudget. -func (c *FakePodDisruptionBudgets) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.PodDisruptionBudget, err error) { - obj, err := c.Fake. - Invokes(testing.NewPatchSubresourceAction(poddisruptionbudgetsResource, c.ns, name, data, subresources...), &v1alpha1.PodDisruptionBudget{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.PodDisruptionBudget), err -} diff --git a/kubernetes/typed/policy/v1alpha1/fake/fake_policy_client.go b/kubernetes/typed/policy/v1alpha1/fake/fake_policy_client.go deleted file mode 100644 index 8b233265..00000000 --- a/kubernetes/typed/policy/v1alpha1/fake/fake_policy_client.go +++ /dev/null @@ -1,38 +0,0 @@ -/* -Copyright 2016 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 fake - -import ( - v1alpha1 "k8s.io/client-go/kubernetes/typed/policy/v1alpha1" - rest "k8s.io/client-go/rest" - testing "k8s.io/client-go/testing" -) - -type FakePolicyV1alpha1 struct { - *testing.Fake -} - -func (c *FakePolicyV1alpha1) PodDisruptionBudgets(namespace string) v1alpha1.PodDisruptionBudgetInterface { - return &FakePodDisruptionBudgets{c, namespace} -} - -// RESTClient returns a RESTClient that is used to communicate -// with API server by this client implementation. -func (c *FakePolicyV1alpha1) RESTClient() rest.Interface { - var ret *rest.RESTClient - return ret -} diff --git a/kubernetes/typed/policy/v1alpha1/poddisruptionbudget.go b/kubernetes/typed/policy/v1alpha1/poddisruptionbudget.go deleted file mode 100644 index f29ae41a..00000000 --- a/kubernetes/typed/policy/v1alpha1/poddisruptionbudget.go +++ /dev/null @@ -1,168 +0,0 @@ -/* -Copyright 2016 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 v1alpha1 - -import ( - "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - api "k8s.io/client-go/pkg/api" - v1 "k8s.io/client-go/pkg/api/v1" - v1alpha1 "k8s.io/client-go/pkg/apis/policy/v1alpha1" - rest "k8s.io/client-go/rest" -) - -// PodDisruptionBudgetsGetter has a method to return a PodDisruptionBudgetInterface. -// A group's client should implement this interface. -type PodDisruptionBudgetsGetter interface { - PodDisruptionBudgets(namespace string) PodDisruptionBudgetInterface -} - -// PodDisruptionBudgetInterface has methods to work with PodDisruptionBudget resources. -type PodDisruptionBudgetInterface interface { - Create(*v1alpha1.PodDisruptionBudget) (*v1alpha1.PodDisruptionBudget, error) - Update(*v1alpha1.PodDisruptionBudget) (*v1alpha1.PodDisruptionBudget, error) - UpdateStatus(*v1alpha1.PodDisruptionBudget) (*v1alpha1.PodDisruptionBudget, error) - Delete(name string, options *v1.DeleteOptions) error - DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error - Get(name string) (*v1alpha1.PodDisruptionBudget, error) - List(opts v1.ListOptions) (*v1alpha1.PodDisruptionBudgetList, error) - Watch(opts v1.ListOptions) (watch.Interface, error) - Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.PodDisruptionBudget, err error) - PodDisruptionBudgetExpansion -} - -// podDisruptionBudgets implements PodDisruptionBudgetInterface -type podDisruptionBudgets struct { - client rest.Interface - ns string -} - -// newPodDisruptionBudgets returns a PodDisruptionBudgets -func newPodDisruptionBudgets(c *PolicyV1alpha1Client, namespace string) *podDisruptionBudgets { - return &podDisruptionBudgets{ - client: c.RESTClient(), - ns: namespace, - } -} - -// Create takes the representation of a podDisruptionBudget and creates it. Returns the server's representation of the podDisruptionBudget, and an error, if there is any. -func (c *podDisruptionBudgets) Create(podDisruptionBudget *v1alpha1.PodDisruptionBudget) (result *v1alpha1.PodDisruptionBudget, err error) { - result = &v1alpha1.PodDisruptionBudget{} - err = c.client.Post(). - Namespace(c.ns). - Resource("poddisruptionbudgets"). - Body(podDisruptionBudget). - Do(). - Into(result) - return -} - -// Update takes the representation of a podDisruptionBudget and updates it. Returns the server's representation of the podDisruptionBudget, and an error, if there is any. -func (c *podDisruptionBudgets) Update(podDisruptionBudget *v1alpha1.PodDisruptionBudget) (result *v1alpha1.PodDisruptionBudget, err error) { - result = &v1alpha1.PodDisruptionBudget{} - err = c.client.Put(). - Namespace(c.ns). - Resource("poddisruptionbudgets"). - Name(podDisruptionBudget.Name). - Body(podDisruptionBudget). - Do(). - Into(result) - return -} - -func (c *podDisruptionBudgets) UpdateStatus(podDisruptionBudget *v1alpha1.PodDisruptionBudget) (result *v1alpha1.PodDisruptionBudget, err error) { - result = &v1alpha1.PodDisruptionBudget{} - err = c.client.Put(). - Namespace(c.ns). - Resource("poddisruptionbudgets"). - Name(podDisruptionBudget.Name). - SubResource("status"). - Body(podDisruptionBudget). - Do(). - Into(result) - return -} - -// Delete takes name of the podDisruptionBudget and deletes it. Returns an error if one occurs. -func (c *podDisruptionBudgets) Delete(name string, options *v1.DeleteOptions) error { - return c.client.Delete(). - Namespace(c.ns). - Resource("poddisruptionbudgets"). - Name(name). - Body(options). - Do(). - Error() -} - -// DeleteCollection deletes a collection of objects. -func (c *podDisruptionBudgets) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - return c.client.Delete(). - Namespace(c.ns). - Resource("poddisruptionbudgets"). - VersionedParams(&listOptions, api.ParameterCodec). - Body(options). - Do(). - Error() -} - -// Get takes name of the podDisruptionBudget, and returns the corresponding podDisruptionBudget object, and an error if there is any. -func (c *podDisruptionBudgets) Get(name string) (result *v1alpha1.PodDisruptionBudget, err error) { - result = &v1alpha1.PodDisruptionBudget{} - err = c.client.Get(). - Namespace(c.ns). - Resource("poddisruptionbudgets"). - Name(name). - Do(). - Into(result) - return -} - -// List takes label and field selectors, and returns the list of PodDisruptionBudgets that match those selectors. -func (c *podDisruptionBudgets) List(opts v1.ListOptions) (result *v1alpha1.PodDisruptionBudgetList, err error) { - result = &v1alpha1.PodDisruptionBudgetList{} - err = c.client.Get(). - Namespace(c.ns). - Resource("poddisruptionbudgets"). - VersionedParams(&opts, api.ParameterCodec). - Do(). - Into(result) - return -} - -// Watch returns a watch.Interface that watches the requested podDisruptionBudgets. -func (c *podDisruptionBudgets) Watch(opts v1.ListOptions) (watch.Interface, error) { - return c.client.Get(). - Prefix("watch"). - Namespace(c.ns). - Resource("poddisruptionbudgets"). - VersionedParams(&opts, api.ParameterCodec). - Watch() -} - -// Patch applies the patch and returns the patched podDisruptionBudget. -func (c *podDisruptionBudgets) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.PodDisruptionBudget, err error) { - result = &v1alpha1.PodDisruptionBudget{} - err = c.client.Patch(pt). - Namespace(c.ns). - Resource("poddisruptionbudgets"). - SubResource(subresources...). - Name(name). - Body(data). - Do(). - Into(result) - return -} diff --git a/kubernetes/typed/policy/v1alpha1/policy_client.go b/kubernetes/typed/policy/v1alpha1/policy_client.go deleted file mode 100644 index 353a8e6f..00000000 --- a/kubernetes/typed/policy/v1alpha1/policy_client.go +++ /dev/null @@ -1,98 +0,0 @@ -/* -Copyright 2016 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 v1alpha1 - -import ( - fmt "fmt" - - "k8s.io/apimachinery/pkg/runtime/schema" - serializer "k8s.io/apimachinery/pkg/runtime/serializer" - api "k8s.io/client-go/pkg/api" - rest "k8s.io/client-go/rest" -) - -type PolicyV1alpha1Interface interface { - RESTClient() rest.Interface - PodDisruptionBudgetsGetter -} - -// PolicyV1alpha1Client is used to interact with features provided by the k8s.io/kubernetes/pkg/apimachinery/registered.Group group. -type PolicyV1alpha1Client struct { - restClient rest.Interface -} - -func (c *PolicyV1alpha1Client) PodDisruptionBudgets(namespace string) PodDisruptionBudgetInterface { - return newPodDisruptionBudgets(c, namespace) -} - -// NewForConfig creates a new PolicyV1alpha1Client for the given config. -func NewForConfig(c *rest.Config) (*PolicyV1alpha1Client, error) { - config := *c - if err := setConfigDefaults(&config); err != nil { - return nil, err - } - client, err := rest.RESTClientFor(&config) - if err != nil { - return nil, err - } - return &PolicyV1alpha1Client{client}, nil -} - -// NewForConfigOrDie creates a new PolicyV1alpha1Client for the given config and -// panics if there is an error in the config. -func NewForConfigOrDie(c *rest.Config) *PolicyV1alpha1Client { - client, err := NewForConfig(c) - if err != nil { - panic(err) - } - return client -} - -// New creates a new PolicyV1alpha1Client for the given RESTClient. -func New(c rest.Interface) *PolicyV1alpha1Client { - return &PolicyV1alpha1Client{c} -} - -func setConfigDefaults(config *rest.Config) error { - gv, err := schema.ParseGroupVersion("policy/v1alpha1") - if err != nil { - return err - } - // if policy/v1alpha1 is not enabled, return an error - if !api.Registry.IsEnabledVersion(gv) { - return fmt.Errorf("policy/v1alpha1 is not enabled") - } - config.APIPath = "/apis" - if config.UserAgent == "" { - config.UserAgent = rest.DefaultKubernetesUserAgent() - } - copyGroupVersion := gv - config.GroupVersion = ©GroupVersion - - config.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: api.Codecs} - - return nil -} - -// RESTClient returns a RESTClient that is used to communicate -// with API server by this client implementation. -func (c *PolicyV1alpha1Client) RESTClient() rest.Interface { - if c == nil { - return nil - } - return c.restClient -} diff --git a/pkg/api/conversion.go b/pkg/api/conversion.go index c8234cee..7808b9f4 100644 --- a/pkg/api/conversion.go +++ b/pkg/api/conversion.go @@ -21,11 +21,11 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/conversion" + "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/client-go/pkg/api/resource" - "k8s.io/client-go/pkg/fields" "k8s.io/client-go/pkg/util/intstr" utillabels "k8s.io/client-go/pkg/util/labels" ) diff --git a/pkg/api/defaults.go b/pkg/api/defaults.go index 57ffd7bf..baa49a8d 100644 --- a/pkg/api/defaults.go +++ b/pkg/api/defaults.go @@ -17,9 +17,9 @@ limitations under the License. package api import ( + "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/pkg/fields" ) func addDefaultingFuncs(scheme *runtime.Scheme) error { diff --git a/pkg/api/helpers.go b/pkg/api/helpers.go index ac897d69..522e4db6 100644 --- a/pkg/api/helpers.go +++ b/pkg/api/helpers.go @@ -27,13 +27,13 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/conversion" + "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/selection" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/client-go/pkg/api/resource" - "k8s.io/client-go/pkg/fields" ) // Conversion error conveniently packages up errors in conversions. diff --git a/pkg/api/types.go b/pkg/api/types.go index f815d469..15f99e22 100644 --- a/pkg/api/types.go +++ b/pkg/api/types.go @@ -18,11 +18,11 @@ package api import ( 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/types" "k8s.io/client-go/pkg/api/resource" - "k8s.io/client-go/pkg/fields" "k8s.io/client-go/pkg/util/intstr" ) @@ -1856,6 +1856,10 @@ type PodSpec struct { // If specified, the pod's scheduling constraints // +optional Affinity *Affinity + // If specified, the pod will be dispatched by specified scheduler. + // If not specified, the pod will be dispatched by default scheduler. + // +optional + SchedulerName string } // Sysctl defines a kernel parameter to be set diff --git a/pkg/api/v1/defaults.go b/pkg/api/v1/defaults.go index 764f84d9..6ea86ce8 100644 --- a/pkg/api/v1/defaults.go +++ b/pkg/api/v1/defaults.go @@ -174,6 +174,9 @@ func SetDefaults_PodSpec(obj *PodSpec) { period := int64(DefaultTerminationGracePeriodSeconds) obj.TerminationGracePeriodSeconds = &period } + if obj.SchedulerName == "" { + obj.SchedulerName = DefaultSchedulerName + } } func SetDefaults_Probe(obj *Probe) { if obj.TimeoutSeconds == 0 { diff --git a/pkg/api/v1/generated.pb.go b/pkg/api/v1/generated.pb.go index 45745c10..f2c14e8e 100644 --- a/pkg/api/v1/generated.pb.go +++ b/pkg/api/v1/generated.pb.go @@ -6112,6 +6112,12 @@ func (m *PodSpec) MarshalTo(data []byte) (int, error) { } i += n122 } + data[i] = 0x9a + i++ + data[i] = 0x1 + i++ + i = encodeVarintGenerated(data, i, uint64(len(m.SchedulerName))) + i += copy(data[i:], m.SchedulerName) return i, nil } @@ -10213,6 +10219,8 @@ func (m *PodSpec) Size() (n int) { l = m.Affinity.Size() n += 2 + l + sovGenerated(uint64(l)) } + l = len(m.SchedulerName) + n += 2 + l + sovGenerated(uint64(l)) return n } @@ -12577,6 +12585,7 @@ func (this *PodSpec) String() string { `Hostname:` + fmt.Sprintf("%v", this.Hostname) + `,`, `Subdomain:` + fmt.Sprintf("%v", this.Subdomain) + `,`, `Affinity:` + strings.Replace(fmt.Sprintf("%v", this.Affinity), "Affinity", "Affinity", 1) + `,`, + `SchedulerName:` + fmt.Sprintf("%v", this.SchedulerName) + `,`, `}`, }, "") return s @@ -31407,6 +31416,35 @@ func (m *PodSpec) Unmarshal(data []byte) error { return err } iNdEx = postIndex + case 19: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SchedulerName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SchedulerName = string(data[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(data[iNdEx:]) @@ -39586,641 +39624,643 @@ var ( ) var fileDescriptorGenerated = []byte{ - // 10174 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xec, 0xbd, 0x7d, 0x70, 0x24, 0xc7, - 0x75, 0x18, 0xae, 0xd9, 0xc5, 0xd7, 0x3e, 0x7c, 0x5e, 0xdf, 0x07, 0x41, 0x88, 0x3c, 0x1c, 0x87, - 0x22, 0x75, 0x24, 0x8f, 0x80, 0xee, 0x48, 0x8a, 0x27, 0x51, 0x3f, 0x4a, 0x00, 0x16, 0xb8, 0x83, - 0xee, 0x6b, 0xd9, 0x8b, 0xbb, 0xa3, 0x24, 0xfe, 0x24, 0x0e, 0x76, 0x1a, 0xc0, 0xe8, 0x06, 0x33, - 0xcb, 0x99, 0x59, 0xdc, 0x41, 0x8a, 0xaa, 0x6c, 0x99, 0x65, 0x57, 0x2a, 0x4a, 0xa2, 0x94, 0x4b, - 0x55, 0xa9, 0x38, 0x89, 0x9d, 0x54, 0x39, 0xa5, 0xc4, 0x95, 0x0f, 0x45, 0xb1, 0x25, 0x97, 0x95, - 0xa4, 0x92, 0xd8, 0x8a, 0x9c, 0x0f, 0x97, 0x52, 0xae, 0x8a, 0x1d, 0xbb, 0x0a, 0x31, 0xe1, 0x54, - 0xfe, 0xcc, 0x1f, 0xc9, 0x7f, 0x97, 0x54, 0x92, 0xea, 0xcf, 0xe9, 0x9e, 0x9d, 0xc5, 0xcc, 0x82, - 0x07, 0x88, 0x72, 0xe5, 0xbf, 0xdd, 0xf7, 0x5e, 0xbf, 0xfe, 0x98, 0xee, 0xd7, 0xef, 0xbd, 0x7e, - 0xfd, 0x1a, 0x2e, 0xdc, 0xbb, 0x1c, 0xcf, 0x79, 0xe1, 0xfc, 0xbd, 0xce, 0x3a, 0x89, 0x02, 0x92, - 0x90, 0x78, 0xbe, 0x7d, 0x6f, 0x73, 0xde, 0x69, 0x7b, 0xf3, 0x3b, 0x17, 0xe7, 0x37, 0x49, 0x40, - 0x22, 0x27, 0x21, 0xee, 0x5c, 0x3b, 0x0a, 0x93, 0x10, 0x3d, 0xc1, 0xa9, 0xe7, 0x52, 0xea, 0xb9, - 0xf6, 0xbd, 0xcd, 0x39, 0xa7, 0xed, 0xcd, 0xed, 0x5c, 0x9c, 0x79, 0x71, 0xd3, 0x4b, 0xb6, 0x3a, - 0xeb, 0x73, 0xad, 0x70, 0x7b, 0x7e, 0x33, 0xdc, 0x0c, 0xe7, 0x59, 0xa1, 0xf5, 0xce, 0x06, 0xfb, - 0xc7, 0xfe, 0xb0, 0x5f, 0x9c, 0xd9, 0xcc, 0xcb, 0xa2, 0x6a, 0xa7, 0xed, 0x6d, 0x3b, 0xad, 0x2d, - 0x2f, 0x20, 0xd1, 0xae, 0xac, 0x3c, 0x9e, 0xdf, 0x26, 0x89, 0x93, 0xd3, 0x84, 0x99, 0xf9, 0x5e, - 0xa5, 0xa2, 0x4e, 0x90, 0x78, 0xdb, 0xa4, 0xab, 0xc0, 0xc7, 0x8b, 0x0a, 0xc4, 0xad, 0x2d, 0xb2, - 0xed, 0x74, 0x95, 0xbb, 0xd4, 0x7b, 0x64, 0x22, 0x12, 0x87, 0x9d, 0xa8, 0xd5, 0x5d, 0xd7, 0xc5, - 0xfc, 0x32, 0x9d, 0xc4, 0xf3, 0xe7, 0xbd, 0x20, 0x89, 0x93, 0x28, 0x5b, 0xc4, 0xfe, 0x03, 0x0b, - 0xce, 0x2d, 0xdc, 0x6d, 0x2e, 0xfb, 0x4e, 0x9c, 0x78, 0xad, 0x45, 0x3f, 0x6c, 0xdd, 0x6b, 0x26, - 0x61, 0x44, 0xee, 0x84, 0x7e, 0x67, 0x9b, 0x34, 0x59, 0x3d, 0xe8, 0x02, 0x8c, 0xec, 0xb0, 0xff, - 0xab, 0xf5, 0x69, 0xeb, 0x9c, 0x75, 0xbe, 0xb6, 0x38, 0xf5, 0xa3, 0xbd, 0xd9, 0x0f, 0xed, 0xef, - 0xcd, 0x8e, 0xdc, 0x11, 0x70, 0xac, 0x28, 0xd0, 0xb3, 0x30, 0xb4, 0x11, 0xaf, 0xed, 0xb6, 0xc9, - 0x74, 0x85, 0xd1, 0x4e, 0x08, 0xda, 0xa1, 0x95, 0x26, 0x85, 0x62, 0x81, 0x45, 0xf3, 0x50, 0x6b, - 0x3b, 0x51, 0xe2, 0x25, 0x5e, 0x18, 0x4c, 0x57, 0xcf, 0x59, 0xe7, 0x07, 0x17, 0x4f, 0x08, 0xd2, - 0x5a, 0x43, 0x22, 0x70, 0x4a, 0x43, 0x9b, 0x11, 0x11, 0xc7, 0xbd, 0x15, 0xf8, 0xbb, 0xd3, 0x03, - 0xe7, 0xac, 0xf3, 0x23, 0x69, 0x33, 0xb0, 0x80, 0x63, 0x45, 0x61, 0x7f, 0xbf, 0x02, 0x23, 0x0b, - 0x1b, 0x1b, 0x5e, 0xe0, 0x25, 0xbb, 0xe8, 0x6d, 0x18, 0x0b, 0x42, 0x97, 0xc8, 0xff, 0xac, 0x17, - 0xa3, 0x97, 0x9e, 0x9f, 0x3b, 0x68, 0x42, 0xcd, 0xdd, 0xd4, 0x4a, 0x2c, 0x4e, 0xed, 0xef, 0xcd, - 0x8e, 0xe9, 0x10, 0x6c, 0x70, 0x44, 0x6f, 0xc1, 0x68, 0x3b, 0x74, 0x55, 0x05, 0x15, 0x56, 0xc1, - 0x73, 0x07, 0x57, 0xd0, 0x48, 0x0b, 0x2c, 0x4e, 0xee, 0xef, 0xcd, 0x8e, 0x6a, 0x00, 0xac, 0xb3, - 0x43, 0x3e, 0x4c, 0xd2, 0xbf, 0x41, 0xe2, 0xa9, 0x1a, 0xaa, 0xac, 0x86, 0x17, 0x8b, 0x6b, 0xd0, - 0x0a, 0x2d, 0x9e, 0xdc, 0xdf, 0x9b, 0x9d, 0xcc, 0x00, 0x71, 0x96, 0xb5, 0xfd, 0x15, 0x98, 0x58, - 0x48, 0x12, 0xa7, 0xb5, 0x45, 0x5c, 0xfe, 0x7d, 0xd1, 0xcb, 0x30, 0x10, 0x38, 0xdb, 0x44, 0x7c, - 0xfd, 0x73, 0x62, 0xd8, 0x07, 0x6e, 0x3a, 0xdb, 0xe4, 0xe1, 0xde, 0xec, 0xd4, 0xed, 0xc0, 0x7b, - 0xa7, 0x23, 0xe6, 0x0c, 0x85, 0x61, 0x46, 0x8d, 0x2e, 0x01, 0xb8, 0x64, 0xc7, 0x6b, 0x91, 0x86, - 0x93, 0x6c, 0x89, 0xd9, 0x80, 0x44, 0x59, 0xa8, 0x2b, 0x0c, 0xd6, 0xa8, 0xec, 0xaf, 0x5b, 0x50, - 0x5b, 0xd8, 0x09, 0x3d, 0xb7, 0x11, 0xba, 0x31, 0xea, 0xc0, 0x64, 0x3b, 0x22, 0x1b, 0x24, 0x52, - 0xa0, 0x69, 0xeb, 0x5c, 0xf5, 0xfc, 0xe8, 0xa5, 0x4b, 0x05, 0xfd, 0x36, 0x0b, 0x2d, 0x07, 0x49, - 0xb4, 0xbb, 0xf8, 0x98, 0xa8, 0x7a, 0x32, 0x83, 0xc5, 0xd9, 0x3a, 0xec, 0xbf, 0x52, 0x81, 0xd3, - 0x0b, 0x5f, 0xe9, 0x44, 0xa4, 0xee, 0xc5, 0xf7, 0xb2, 0x4b, 0xc1, 0xf5, 0xe2, 0x7b, 0x37, 0xd3, - 0xc1, 0x50, 0x73, 0xb0, 0x2e, 0xe0, 0x58, 0x51, 0xa0, 0x17, 0x61, 0x98, 0xfe, 0xbe, 0x8d, 0x57, - 0x45, 0xef, 0x4f, 0x0a, 0xe2, 0xd1, 0xba, 0x93, 0x38, 0x75, 0x8e, 0xc2, 0x92, 0x06, 0xdd, 0x80, - 0xd1, 0x16, 0x93, 0x11, 0x9b, 0x37, 0x42, 0x97, 0xb0, 0x2f, 0x5c, 0x5b, 0x7c, 0x81, 0x92, 0x2f, - 0xa5, 0xe0, 0x87, 0x7b, 0xb3, 0xd3, 0xbc, 0x6d, 0x82, 0x85, 0x86, 0xc3, 0x7a, 0x79, 0x64, 0xab, - 0x85, 0x38, 0xc0, 0x38, 0x41, 0xce, 0x22, 0x3c, 0xaf, 0xad, 0xa9, 0x41, 0xb6, 0xa6, 0xc6, 0x7a, - 0xac, 0xa7, 0xbf, 0x67, 0x89, 0x31, 0x59, 0xf1, 0x7c, 0x53, 0x3c, 0x5c, 0x02, 0x88, 0x49, 0x2b, - 0x22, 0x89, 0x36, 0x2a, 0xea, 0x33, 0x37, 0x15, 0x06, 0x6b, 0x54, 0x74, 0xf1, 0xc7, 0x5b, 0x4e, - 0xc4, 0x66, 0x8b, 0x18, 0x1b, 0xb5, 0xf8, 0x9b, 0x12, 0x81, 0x53, 0x1a, 0x63, 0xf1, 0x57, 0x0b, - 0x17, 0xff, 0xbf, 0xb4, 0x60, 0x78, 0xd1, 0x0b, 0x5c, 0x2f, 0xd8, 0x44, 0x6f, 0xc3, 0x08, 0x95, - 0xe6, 0xae, 0x93, 0x38, 0x62, 0xdd, 0x7f, 0x4c, 0x4e, 0x1e, 0x5d, 0x28, 0xcb, 0xe9, 0x13, 0xcf, - 0x51, 0x6a, 0x3a, 0x89, 0x6e, 0xad, 0x7f, 0x99, 0xb4, 0x92, 0x1b, 0x24, 0x71, 0xd2, 0xee, 0xa4, - 0x30, 0xac, 0xb8, 0xa2, 0xdb, 0x30, 0x94, 0x38, 0xd1, 0x26, 0x49, 0xc4, 0xb2, 0x2f, 0x58, 0x94, - 0x9c, 0x07, 0xa6, 0x53, 0x8e, 0x04, 0x2d, 0x92, 0x0a, 0xc8, 0x35, 0xc6, 0x04, 0x0b, 0x66, 0x76, - 0x0b, 0xc6, 0x96, 0x9c, 0xb6, 0xb3, 0xee, 0xf9, 0x5e, 0xe2, 0x91, 0x18, 0x7d, 0x14, 0xaa, 0x8e, - 0xeb, 0xb2, 0x05, 0x50, 0x5b, 0x3c, 0xbd, 0xbf, 0x37, 0x5b, 0x5d, 0x70, 0xdd, 0x87, 0x7b, 0xb3, - 0xa0, 0xa8, 0x76, 0x31, 0xa5, 0x40, 0xcf, 0xc3, 0x80, 0x1b, 0x85, 0xed, 0xe9, 0x0a, 0xa3, 0x3c, - 0x43, 0x57, 0x6a, 0x3d, 0x0a, 0xdb, 0x19, 0x52, 0x46, 0x63, 0xff, 0x4e, 0x05, 0xd0, 0x12, 0x69, - 0x6f, 0xad, 0x34, 0x8d, 0x6f, 0x7a, 0x1e, 0x46, 0xb6, 0xc3, 0xc0, 0x4b, 0xc2, 0x28, 0x16, 0x15, - 0xb2, 0x79, 0x71, 0x43, 0xc0, 0xb0, 0xc2, 0xa2, 0x73, 0x30, 0xd0, 0x4e, 0x97, 0xf7, 0x98, 0x14, - 0x0d, 0x6c, 0x61, 0x33, 0x0c, 0xa5, 0xe8, 0xc4, 0x24, 0x12, 0xf3, 0x59, 0x51, 0xdc, 0x8e, 0x49, - 0x84, 0x19, 0x26, 0x9d, 0x41, 0x74, 0x6e, 0x89, 0xd9, 0x9a, 0x99, 0x41, 0x14, 0x83, 0x35, 0x2a, - 0xf4, 0x25, 0xa8, 0xf1, 0x7f, 0x98, 0x6c, 0xb0, 0xa9, 0x5b, 0x28, 0x14, 0xae, 0x87, 0x2d, 0xc7, - 0xcf, 0x0e, 0xfe, 0x38, 0x9b, 0x71, 0x92, 0x11, 0x4e, 0x79, 0x1a, 0x33, 0x6e, 0xa8, 0x70, 0xc6, - 0xfd, 0x55, 0x0b, 0xd0, 0x92, 0x17, 0xb8, 0x24, 0x3a, 0x86, 0xad, 0xb3, 0xbf, 0xc5, 0xf0, 0xc7, - 0xb4, 0x69, 0xe1, 0x76, 0x3b, 0x0c, 0x48, 0x90, 0x2c, 0x85, 0x81, 0xcb, 0xb7, 0xd3, 0x4f, 0xc2, - 0x40, 0x42, 0xab, 0xe2, 0xcd, 0x7a, 0x56, 0x7e, 0x16, 0x5a, 0xc1, 0xc3, 0xbd, 0xd9, 0x33, 0xdd, - 0x25, 0x58, 0x13, 0x58, 0x19, 0xf4, 0x09, 0x18, 0x8a, 0x13, 0x27, 0xe9, 0xc4, 0xa2, 0xa1, 0x4f, - 0xc9, 0x86, 0x36, 0x19, 0xf4, 0xe1, 0xde, 0xec, 0xa4, 0x2a, 0xc6, 0x41, 0x58, 0x14, 0x40, 0xcf, - 0xc1, 0xf0, 0x36, 0x89, 0x63, 0x67, 0x53, 0x0a, 0xb8, 0x49, 0x51, 0x76, 0xf8, 0x06, 0x07, 0x63, - 0x89, 0x47, 0x4f, 0xc3, 0x20, 0x89, 0xa2, 0x30, 0x12, 0x33, 0x62, 0x5c, 0x10, 0x0e, 0x2e, 0x53, - 0x20, 0xe6, 0x38, 0xfb, 0x3f, 0x59, 0x30, 0xa9, 0xda, 0xca, 0xeb, 0x3a, 0x86, 0x25, 0xef, 0x02, - 0xb4, 0x64, 0x07, 0x63, 0xb6, 0xd0, 0xb4, 0x3a, 0xf2, 0xa7, 0x5f, 0xf7, 0x80, 0xa6, 0x75, 0x28, - 0x50, 0x8c, 0x35, 0xbe, 0xf6, 0xbf, 0xb6, 0xe0, 0x64, 0xa6, 0x6f, 0xd7, 0xbd, 0x38, 0x41, 0x6f, - 0x75, 0xf5, 0x6f, 0xae, 0x5c, 0xff, 0x68, 0x69, 0xd6, 0x3b, 0x35, 0x5f, 0x24, 0x44, 0xeb, 0x1b, - 0x86, 0x41, 0x2f, 0x21, 0xdb, 0xb2, 0x5b, 0x2f, 0x96, 0xec, 0x16, 0x6f, 0x5f, 0xfa, 0x95, 0x56, - 0x29, 0x0f, 0xcc, 0x59, 0xd9, 0xff, 0xd3, 0x82, 0xda, 0x52, 0x18, 0x6c, 0x78, 0x9b, 0x37, 0x9c, - 0xf6, 0x31, 0x7c, 0x9f, 0x26, 0x0c, 0x30, 0xee, 0xbc, 0x0b, 0x17, 0x8b, 0xba, 0x20, 0x1a, 0x36, - 0x47, 0xf7, 0x54, 0xae, 0x2c, 0x28, 0x31, 0x45, 0x41, 0x98, 0x31, 0x9b, 0x79, 0x15, 0x6a, 0x8a, - 0x00, 0x4d, 0x41, 0xf5, 0x1e, 0xe1, 0x9a, 0x64, 0x0d, 0xd3, 0x9f, 0xe8, 0x14, 0x0c, 0xee, 0x38, - 0x7e, 0x47, 0x2c, 0x5e, 0xcc, 0xff, 0x7c, 0xb2, 0x72, 0xd9, 0xb2, 0x7f, 0x89, 0xad, 0x40, 0x51, - 0xc9, 0x72, 0xb0, 0x23, 0x84, 0xc3, 0xbb, 0x16, 0x9c, 0xf2, 0x73, 0x84, 0x92, 0x18, 0x93, 0xc3, - 0x88, 0xb3, 0x27, 0x44, 0xb3, 0x4f, 0xe5, 0x61, 0x71, 0x6e, 0x6d, 0xf6, 0x0f, 0x2c, 0x38, 0xa5, - 0x5a, 0x77, 0x8d, 0xec, 0x36, 0x89, 0x4f, 0x5a, 0x49, 0x18, 0x7d, 0x40, 0xda, 0x87, 0x9e, 0xe4, - 0x23, 0xcd, 0x25, 0xcd, 0xa8, 0x60, 0x50, 0xbd, 0x46, 0x76, 0xd9, 0xb0, 0xdb, 0xbf, 0x65, 0xc1, - 0xb8, 0x6a, 0xfe, 0x31, 0x2c, 0x8f, 0xeb, 0xe6, 0xf2, 0xf8, 0x68, 0xc9, 0xb9, 0xd5, 0x63, 0x61, - 0xfc, 0x72, 0x05, 0x4e, 0x2b, 0x1a, 0x63, 0xeb, 0xf8, 0x80, 0x8c, 0x7e, 0x7f, 0xdd, 0xbd, 0x46, - 0x76, 0xd7, 0x42, 0xba, 0xf7, 0xe7, 0x77, 0x17, 0x5d, 0x84, 0x51, 0x97, 0x6c, 0x38, 0x1d, 0x3f, - 0x51, 0x2a, 0xee, 0x20, 0xb7, 0x7d, 0xea, 0x29, 0x18, 0xeb, 0x34, 0xf6, 0xaf, 0x02, 0x13, 0x1d, - 0x89, 0x43, 0x3f, 0x1a, 0x55, 0x26, 0x34, 0x4b, 0x64, 0x4c, 0xb7, 0x44, 0x84, 0xd5, 0xf1, 0x34, - 0x0c, 0x7a, 0xdb, 0x74, 0x7b, 0xa9, 0x98, 0xbb, 0xc6, 0x2a, 0x05, 0x62, 0x8e, 0x43, 0xcf, 0xc0, - 0x70, 0x2b, 0xdc, 0xde, 0x76, 0x02, 0x77, 0xba, 0xca, 0xd4, 0x9b, 0x51, 0xba, 0x03, 0x2d, 0x71, - 0x10, 0x96, 0x38, 0xf4, 0x04, 0x0c, 0x38, 0xd1, 0x66, 0x3c, 0x3d, 0xc0, 0x68, 0x46, 0x68, 0x4d, - 0x0b, 0xd1, 0x66, 0x8c, 0x19, 0x94, 0xaa, 0x2d, 0xf7, 0xc3, 0xe8, 0x9e, 0x17, 0x6c, 0xd6, 0xbd, - 0x88, 0xe9, 0x20, 0x9a, 0xda, 0x72, 0x57, 0x61, 0xb0, 0x46, 0x85, 0x1a, 0x30, 0xd8, 0x0e, 0xa3, - 0x24, 0x9e, 0x1e, 0x62, 0xc3, 0xf9, 0x42, 0xe1, 0xec, 0xe1, 0xfd, 0x6e, 0x84, 0x51, 0x92, 0x76, - 0x85, 0xfe, 0x8b, 0x31, 0x67, 0x84, 0x96, 0xa0, 0x4a, 0x82, 0x9d, 0xe9, 0x61, 0xc6, 0xef, 0x23, - 0x07, 0xf3, 0x5b, 0x0e, 0x76, 0xee, 0x38, 0x51, 0xba, 0x88, 0x96, 0x83, 0x1d, 0x4c, 0x4b, 0xa3, - 0x16, 0xd4, 0xa4, 0x5b, 0x21, 0x9e, 0x1e, 0x29, 0x33, 0xc1, 0xb0, 0x20, 0xc7, 0xe4, 0x9d, 0x8e, - 0x17, 0x91, 0x6d, 0x12, 0x24, 0x71, 0xaa, 0xc3, 0x4b, 0x6c, 0x8c, 0x53, 0xbe, 0xa8, 0x05, 0x63, - 0x5c, 0xd5, 0xb9, 0x11, 0x76, 0x82, 0x24, 0x9e, 0xae, 0xb1, 0x26, 0x17, 0x18, 0xc9, 0x77, 0xd2, - 0x12, 0x8b, 0xa7, 0x04, 0xfb, 0x31, 0x0d, 0x18, 0x63, 0x83, 0x29, 0x7a, 0x0b, 0xc6, 0x7d, 0x6f, - 0x87, 0x04, 0x24, 0x8e, 0x1b, 0x51, 0xb8, 0x4e, 0xa6, 0x81, 0xf5, 0xe6, 0xe9, 0x22, 0x83, 0x31, - 0x5c, 0x27, 0x8b, 0x27, 0xf6, 0xf7, 0x66, 0xc7, 0xaf, 0xeb, 0xa5, 0xb1, 0xc9, 0x0c, 0x7d, 0x09, - 0x26, 0xa8, 0x5e, 0xe5, 0xa5, 0xec, 0x47, 0xcb, 0xb3, 0x47, 0xfb, 0x7b, 0xb3, 0x13, 0xd8, 0x28, - 0x8e, 0x33, 0xec, 0xd0, 0x1a, 0xd4, 0x7c, 0x6f, 0x83, 0xb4, 0x76, 0x5b, 0x3e, 0x99, 0x1e, 0x63, - 0xbc, 0x0b, 0x96, 0xdc, 0x75, 0x49, 0xce, 0x75, 0x59, 0xf5, 0x17, 0xa7, 0x8c, 0xd0, 0x1d, 0x38, - 0x93, 0x90, 0x68, 0xdb, 0x0b, 0x1c, 0xaa, 0x58, 0x08, 0x45, 0x8b, 0x59, 0xe5, 0xe3, 0x6c, 0xd6, - 0x9e, 0x15, 0x03, 0x7b, 0x66, 0x2d, 0x97, 0x0a, 0xf7, 0x28, 0x8d, 0x6e, 0xc1, 0x24, 0x5b, 0x4f, - 0x8d, 0x8e, 0xef, 0x37, 0x42, 0xdf, 0x6b, 0xed, 0x4e, 0x4f, 0x30, 0x86, 0xcf, 0x48, 0x5b, 0x7b, - 0xd5, 0x44, 0x53, 0x1b, 0x24, 0xfd, 0x87, 0xb3, 0xa5, 0x91, 0x0f, 0x93, 0x31, 0x69, 0x75, 0x22, - 0x2f, 0xd9, 0xa5, 0x73, 0x9f, 0x3c, 0x48, 0xa6, 0x27, 0xcb, 0xd8, 0x54, 0x4d, 0xb3, 0x10, 0x77, - 0x74, 0x64, 0x80, 0x38, 0xcb, 0x9a, 0x8a, 0x8a, 0x38, 0x71, 0xbd, 0x60, 0x7a, 0x8a, 0x29, 0xd1, - 0x6a, 0x7d, 0x35, 0x29, 0x10, 0x73, 0x1c, 0x33, 0x55, 0xe9, 0x8f, 0x5b, 0x54, 0xf6, 0x9e, 0x60, - 0x84, 0xa9, 0xa9, 0x2a, 0x11, 0x38, 0xa5, 0xa1, 0xfb, 0x55, 0x92, 0xec, 0x4e, 0x23, 0x46, 0xaa, - 0x96, 0xda, 0xda, 0xda, 0xe7, 0x30, 0x85, 0xa3, 0x3b, 0x30, 0x4c, 0x82, 0x9d, 0x95, 0x28, 0xdc, - 0x9e, 0x3e, 0x59, 0x46, 0x06, 0x2c, 0x73, 0x62, 0xbe, 0x2b, 0xa4, 0xda, 0xb2, 0x00, 0x63, 0xc9, - 0xcc, 0x5e, 0x87, 0x09, 0x25, 0x2e, 0xd8, 0xa8, 0xa3, 0x59, 0x18, 0xa4, 0x12, 0x51, 0x5a, 0x70, - 0x35, 0xda, 0x35, 0x2a, 0x28, 0x63, 0xcc, 0xe1, 0xac, 0x6b, 0xde, 0x57, 0xc8, 0xe2, 0x6e, 0x42, - 0xb8, 0x26, 0x5f, 0xd5, 0xba, 0x26, 0x11, 0x38, 0xa5, 0xb1, 0xff, 0x37, 0xdf, 0x6b, 0x53, 0x99, - 0x54, 0x42, 0x1e, 0x5f, 0x80, 0x91, 0xad, 0x30, 0x4e, 0x28, 0x35, 0xab, 0x63, 0x30, 0xdd, 0x5d, - 0xaf, 0x0a, 0x38, 0x56, 0x14, 0xe8, 0x35, 0x18, 0x6f, 0xe9, 0x15, 0x88, 0x2d, 0xe2, 0xb4, 0x28, - 0x62, 0xd6, 0x8e, 0x4d, 0x5a, 0x74, 0x19, 0x46, 0x98, 0x5b, 0xb3, 0x15, 0xfa, 0xc2, 0x66, 0x90, - 0x3b, 0xde, 0x48, 0x43, 0xc0, 0x1f, 0x6a, 0xbf, 0xb1, 0xa2, 0xa6, 0x96, 0x17, 0x6d, 0xc2, 0x6a, - 0x43, 0x88, 0x71, 0x65, 0x79, 0x5d, 0x65, 0x50, 0x2c, 0xb0, 0xf6, 0x3f, 0xaa, 0x68, 0xa3, 0x4c, - 0x35, 0x5e, 0x82, 0x3e, 0x0f, 0xc3, 0xf7, 0x1d, 0x2f, 0xf1, 0x82, 0x4d, 0xb1, 0x33, 0xbf, 0x54, - 0x52, 0xa6, 0xb3, 0xe2, 0x77, 0x79, 0x51, 0xbe, 0xff, 0x88, 0x3f, 0x58, 0x32, 0xa4, 0xbc, 0xa3, - 0x4e, 0x10, 0x50, 0xde, 0x95, 0xfe, 0x79, 0x63, 0x5e, 0x94, 0xf3, 0x16, 0x7f, 0xb0, 0x64, 0x88, - 0x36, 0x00, 0xe4, 0xaa, 0x26, 0xae, 0x70, 0x27, 0x7e, 0xbc, 0x1f, 0xf6, 0x6b, 0xaa, 0xf4, 0xe2, - 0x04, 0xdd, 0xf1, 0xd2, 0xff, 0x58, 0xe3, 0x6c, 0x27, 0x4c, 0xc1, 0xe9, 0x6e, 0x16, 0xfa, 0x02, - 0x5d, 0x58, 0x4e, 0x94, 0x10, 0x77, 0x21, 0xc9, 0x7a, 0x64, 0x0f, 0xd6, 0xd3, 0xd6, 0xbc, 0x6d, - 0xa2, 0x2f, 0x42, 0xc1, 0x04, 0xa7, 0xfc, 0xec, 0xef, 0x55, 0x61, 0xba, 0x57, 0x73, 0xe9, 0x94, - 0x24, 0x0f, 0xbc, 0x64, 0x89, 0xaa, 0x20, 0x96, 0x39, 0x25, 0x97, 0x05, 0x1c, 0x2b, 0x0a, 0x3a, - 0x37, 0x62, 0x6f, 0x33, 0x70, 0x7c, 0x31, 0x7d, 0xd5, 0xdc, 0x68, 0x32, 0x28, 0x16, 0x58, 0x4a, - 0x17, 0x11, 0x27, 0x16, 0xde, 0x6c, 0x6d, 0x0e, 0x61, 0x06, 0xc5, 0x02, 0xab, 0x5b, 0xc0, 0x03, - 0x05, 0x16, 0xb0, 0x31, 0x44, 0x83, 0x8f, 0x76, 0x88, 0xd0, 0x17, 0x01, 0x36, 0xbc, 0xc0, 0x8b, - 0xb7, 0x18, 0xf7, 0xa1, 0xbe, 0xb9, 0x2b, 0x55, 0x67, 0x45, 0x71, 0xc1, 0x1a, 0x47, 0xf4, 0x0a, - 0x8c, 0xaa, 0xe5, 0xb9, 0x5a, 0x9f, 0x1e, 0x36, 0x3d, 0xa0, 0xa9, 0xac, 0xaa, 0x63, 0x9d, 0xce, - 0xfe, 0x72, 0x76, 0xbe, 0x88, 0x55, 0xa1, 0x8d, 0xaf, 0x55, 0x76, 0x7c, 0x2b, 0x07, 0x8f, 0xaf, - 0xfd, 0x1f, 0xab, 0x30, 0x69, 0x54, 0xd6, 0x89, 0x4b, 0x48, 0xb4, 0x37, 0xe8, 0xb6, 0xe1, 0x24, - 0x44, 0xac, 0xc9, 0x0b, 0xfd, 0x2c, 0x1a, 0x7d, 0x93, 0xa1, 0x6b, 0x81, 0x73, 0x42, 0x5b, 0x50, - 0xf3, 0x9d, 0x98, 0xd9, 0xd0, 0x44, 0xac, 0xc5, 0xfe, 0xd8, 0xa6, 0xaa, 0xbd, 0x13, 0x27, 0xda, - 0x2e, 0xce, 0x6b, 0x49, 0x99, 0xd3, 0x3d, 0x8f, 0xaa, 0x1c, 0xf2, 0x08, 0x45, 0x35, 0x87, 0xea, - 0x25, 0xbb, 0x98, 0xe3, 0xd0, 0x65, 0x18, 0x8b, 0x08, 0x9b, 0x29, 0x4b, 0x54, 0xab, 0x62, 0x53, - 0x6f, 0x30, 0x55, 0xbf, 0xb0, 0x86, 0xc3, 0x06, 0x65, 0xaa, 0x7d, 0x0f, 0x1d, 0xa0, 0x7d, 0x3f, - 0x07, 0xc3, 0xec, 0x87, 0x9a, 0x15, 0xea, 0x0b, 0xad, 0x72, 0x30, 0x96, 0xf8, 0xec, 0x24, 0x1a, - 0x29, 0x39, 0x89, 0x9e, 0x87, 0x89, 0xba, 0x43, 0xb6, 0xc3, 0x60, 0x39, 0x70, 0xdb, 0xa1, 0x17, - 0x24, 0x68, 0x1a, 0x06, 0xd8, 0x7e, 0xc2, 0xd7, 0xfb, 0x00, 0xe5, 0x80, 0x07, 0xa8, 0x06, 0x6d, - 0xff, 0x1f, 0x0b, 0xc6, 0xeb, 0xc4, 0x27, 0x09, 0xb9, 0xd5, 0x66, 0x7e, 0x17, 0xb4, 0x02, 0x68, - 0x33, 0x72, 0x5a, 0xa4, 0x41, 0x22, 0x2f, 0x74, 0x9b, 0xa4, 0x15, 0x06, 0xec, 0xe4, 0x81, 0x6e, - 0x90, 0x67, 0xf6, 0xf7, 0x66, 0xd1, 0x95, 0x2e, 0x2c, 0xce, 0x29, 0x81, 0x5c, 0x18, 0x6f, 0x47, - 0xc4, 0x70, 0x14, 0x59, 0xc5, 0x1b, 0x7e, 0x43, 0x2f, 0xc2, 0x75, 0x52, 0x03, 0x84, 0x4d, 0xa6, - 0xe8, 0x33, 0x30, 0x15, 0x46, 0xed, 0x2d, 0x27, 0xa8, 0x93, 0x36, 0x09, 0x5c, 0xaa, 0x88, 0x0b, - 0xaf, 0xe0, 0xa9, 0xfd, 0xbd, 0xd9, 0xa9, 0x5b, 0x19, 0x1c, 0xee, 0xa2, 0xb6, 0x7f, 0xad, 0x02, - 0xa7, 0xeb, 0xe1, 0xfd, 0xe0, 0xbe, 0x13, 0xb9, 0x0b, 0x8d, 0x55, 0xae, 0x5d, 0x33, 0x2f, 0xab, - 0xf4, 0xee, 0x5a, 0x3d, 0xbd, 0xbb, 0x5f, 0x80, 0x91, 0x0d, 0x8f, 0xf8, 0x2e, 0x26, 0x1b, 0xa2, - 0x7b, 0x17, 0xcb, 0xb8, 0xbf, 0x57, 0x68, 0x19, 0xe9, 0x69, 0xe0, 0xce, 0xe5, 0x15, 0xc1, 0x06, - 0x2b, 0x86, 0xa8, 0x03, 0x53, 0xd2, 0x7c, 0x90, 0x58, 0xb1, 0x3a, 0x5e, 0x2a, 0x67, 0x9d, 0x98, - 0xd5, 0xb0, 0xf1, 0xc0, 0x19, 0x86, 0xb8, 0xab, 0x0a, 0x6a, 0xf6, 0x6d, 0xd3, 0xbd, 0x61, 0x80, - 0xcd, 0x15, 0x66, 0xf6, 0x31, 0xbb, 0x94, 0x41, 0xed, 0xbf, 0x63, 0xc1, 0x63, 0x5d, 0xa3, 0x25, - 0x8c, 0xf6, 0x37, 0xa5, 0xb5, 0xcc, 0x8f, 0xa9, 0x0a, 0x5a, 0x99, 0x3b, 0xe6, 0xe5, 0x2c, 0xe7, - 0x4a, 0x09, 0xcb, 0xf9, 0x16, 0x9c, 0x5a, 0xde, 0x6e, 0x27, 0xbb, 0x75, 0xcf, 0x74, 0x4a, 0xbf, - 0x0a, 0x43, 0xdb, 0xc4, 0xf5, 0x3a, 0xdb, 0xe2, 0xb3, 0xce, 0x4a, 0x41, 0x7a, 0x83, 0x41, 0x1f, - 0xee, 0xcd, 0x8e, 0x37, 0x93, 0x30, 0x72, 0x36, 0x09, 0x07, 0x60, 0x41, 0x6e, 0xbf, 0x67, 0xc1, - 0xa4, 0x5c, 0x50, 0x0b, 0xae, 0x1b, 0x91, 0x38, 0x46, 0x33, 0x50, 0xf1, 0xda, 0x82, 0x11, 0x08, - 0x46, 0x95, 0xd5, 0x06, 0xae, 0x78, 0x6d, 0xf4, 0x79, 0xa8, 0xf1, 0xb3, 0x8c, 0x74, 0x72, 0xf4, - 0x79, 0x36, 0xc2, 0x4c, 0x9a, 0x35, 0xc9, 0x03, 0xa7, 0xec, 0xa4, 0x5a, 0xc9, 0x44, 0x75, 0xd5, - 0xf4, 0xac, 0x5f, 0x15, 0x70, 0xac, 0x28, 0xd0, 0x79, 0x18, 0x09, 0x42, 0x97, 0x1f, 0x37, 0xf1, - 0x4d, 0x97, 0x4d, 0xb9, 0x9b, 0x02, 0x86, 0x15, 0xd6, 0xfe, 0x86, 0x05, 0x63, 0xb2, 0x8f, 0x25, - 0x35, 0x5c, 0xba, 0x48, 0x52, 0xed, 0x36, 0x5d, 0x24, 0x54, 0x43, 0x65, 0x18, 0x43, 0x31, 0xad, - 0xf6, 0xa3, 0x98, 0xda, 0xbf, 0x59, 0x81, 0x09, 0xd9, 0x9c, 0x66, 0x67, 0x3d, 0x26, 0x74, 0xdf, - 0xae, 0x39, 0x7c, 0xf0, 0x89, 0x9c, 0x67, 0x2f, 0x16, 0x99, 0x10, 0xc6, 0x37, 0x4b, 0xf5, 0x82, - 0x05, 0xc9, 0x07, 0xa7, 0x2c, 0xd1, 0x0e, 0x9c, 0x08, 0xc2, 0x84, 0xed, 0x07, 0x0a, 0x5f, 0xce, - 0x17, 0x9c, 0xad, 0xe7, 0x71, 0x51, 0xcf, 0x89, 0x9b, 0x59, 0x7e, 0xb8, 0xbb, 0x0a, 0x74, 0x4b, - 0xba, 0x46, 0xaa, 0xac, 0xae, 0xe7, 0xcb, 0xd5, 0xd5, 0xdb, 0x33, 0x62, 0xff, 0xd0, 0x82, 0x9a, - 0x24, 0x3b, 0x8e, 0x43, 0x81, 0xbb, 0x30, 0x1c, 0xb3, 0x4f, 0x24, 0x87, 0xeb, 0x42, 0xb9, 0x2e, - 0xf0, 0xef, 0x9a, 0x6e, 0x82, 0xfc, 0x7f, 0x8c, 0x25, 0x37, 0xe6, 0xe2, 0x54, 0x1d, 0xf9, 0xc0, - 0xb9, 0x38, 0x55, 0xcb, 0x7a, 0xb9, 0x38, 0x59, 0xeb, 0x35, 0x23, 0x96, 0x6a, 0x72, 0xed, 0x88, - 0x6c, 0x78, 0x0f, 0xb2, 0x9a, 0x5c, 0x83, 0x41, 0xb1, 0xc0, 0xa2, 0x0d, 0x18, 0x6b, 0x49, 0xdf, - 0x68, 0x2a, 0x42, 0x3e, 0x56, 0xd2, 0xe3, 0xaa, 0x1c, 0xed, 0x3c, 0x78, 0x63, 0x49, 0xe3, 0x84, - 0x0d, 0xbe, 0xf6, 0xb7, 0x2d, 0x18, 0xe2, 0xae, 0xb1, 0x72, 0xfe, 0x45, 0xcd, 0xcd, 0x9f, 0xf6, - 0xf9, 0x0e, 0x05, 0x0a, 0xaf, 0x3f, 0xba, 0x0b, 0x35, 0xf6, 0x83, 0x99, 0xf9, 0xd5, 0x32, 0xd1, - 0x26, 0xbc, 0x7e, 0xd1, 0x60, 0x26, 0xf6, 0xee, 0x48, 0x06, 0x38, 0xe5, 0x65, 0xff, 0xa0, 0x4a, - 0xc5, 0x53, 0x4a, 0x6a, 0xec, 0xbf, 0xd6, 0x71, 0xec, 0xbf, 0x95, 0xa3, 0xdf, 0x7f, 0xdf, 0x81, - 0xc9, 0x96, 0x76, 0x20, 0x91, 0xee, 0xfa, 0x97, 0x4a, 0x7e, 0x7a, 0xed, 0x14, 0x83, 0xbb, 0x82, - 0x96, 0x4c, 0x76, 0x38, 0xcb, 0x1f, 0x11, 0x18, 0xe3, 0x47, 0xbf, 0xa2, 0xbe, 0x01, 0x56, 0xdf, - 0x7c, 0xa1, 0xd7, 0x89, 0x97, 0x50, 0x95, 0xb1, 0x99, 0xd6, 0xd4, 0x18, 0x61, 0x83, 0xad, 0xfd, - 0xd7, 0x06, 0x61, 0x70, 0x79, 0x87, 0x04, 0xc9, 0x31, 0x88, 0xa3, 0x6d, 0x98, 0xf0, 0x82, 0x9d, - 0xd0, 0xdf, 0x21, 0x2e, 0xc7, 0x1f, 0x6e, 0x0b, 0x3e, 0x23, 0x2a, 0x99, 0x58, 0x35, 0x98, 0xe1, - 0x0c, 0xf3, 0xa3, 0x30, 0x7f, 0xdf, 0x80, 0x21, 0x3e, 0x33, 0x84, 0xed, 0x5b, 0xe0, 0x2a, 0x66, - 0x03, 0x2b, 0x56, 0x50, 0x6a, 0xa4, 0x73, 0x2f, 0xb5, 0x60, 0x84, 0xbe, 0x0c, 0x13, 0x1b, 0x5e, - 0x14, 0x27, 0xd4, 0x82, 0x8d, 0x13, 0x67, 0xbb, 0x7d, 0x08, 0xc3, 0x57, 0x8d, 0xc8, 0x8a, 0xc1, - 0x09, 0x67, 0x38, 0xa3, 0x4d, 0x18, 0xa7, 0x76, 0x57, 0x5a, 0xd5, 0x70, 0xdf, 0x55, 0x29, 0xbf, - 0xd7, 0x75, 0x9d, 0x11, 0x36, 0xf9, 0x52, 0x91, 0xd4, 0x62, 0x76, 0xda, 0x08, 0xd3, 0x40, 0x94, - 0x48, 0xe2, 0x06, 0x1a, 0xc7, 0x51, 0xc9, 0xc6, 0xce, 0xfb, 0x6b, 0xa6, 0x64, 0x4b, 0x4f, 0xf5, - 0xed, 0xef, 0xd2, 0xfd, 0x92, 0x8e, 0xe1, 0x31, 0x6c, 0x31, 0x57, 0xcd, 0x2d, 0xe6, 0xe9, 0x12, - 0x5f, 0xb6, 0xc7, 0xf6, 0xf2, 0x36, 0x8c, 0x6a, 0x1f, 0x1e, 0xcd, 0x43, 0xad, 0x25, 0x8f, 0xa4, - 0x85, 0x14, 0x57, 0xea, 0x8e, 0x3a, 0xab, 0xc6, 0x29, 0x0d, 0x1d, 0x17, 0xaa, 0x26, 0x66, 0x03, - 0x58, 0xa8, 0x12, 0x89, 0x19, 0xc6, 0x7e, 0x09, 0x60, 0xf9, 0x01, 0x69, 0x2d, 0xb4, 0x58, 0xdc, - 0x84, 0x76, 0x74, 0x64, 0xf5, 0x3e, 0x3a, 0xb2, 0xbf, 0x63, 0xc1, 0xc4, 0xca, 0x92, 0xa1, 0x77, - 0xcf, 0x01, 0x70, 0xfd, 0xf5, 0xee, 0xdd, 0x9b, 0xd2, 0x29, 0xcb, 0x3d, 0x67, 0x0a, 0x8a, 0x35, - 0x0a, 0xf4, 0x38, 0x54, 0xfd, 0x4e, 0x20, 0xd4, 0xca, 0xe1, 0xfd, 0xbd, 0xd9, 0xea, 0xf5, 0x4e, - 0x80, 0x29, 0x4c, 0x8b, 0x14, 0xa9, 0x96, 0x8e, 0x14, 0x29, 0x8e, 0x99, 0xfc, 0x56, 0x15, 0xa6, - 0x56, 0x7c, 0xf2, 0xc0, 0x68, 0xf5, 0xb3, 0x30, 0xe4, 0x46, 0xde, 0x0e, 0x89, 0xb2, 0x9b, 0x75, - 0x9d, 0x41, 0xb1, 0xc0, 0x96, 0x0e, 0x5e, 0x31, 0x02, 0x77, 0xaa, 0x47, 0x1c, 0xb8, 0x53, 0xd8, - 0x67, 0xb4, 0x01, 0xc3, 0x21, 0x37, 0xfb, 0xa7, 0x07, 0xd9, 0x54, 0x7c, 0xed, 0xe0, 0xc6, 0x64, - 0xc7, 0x67, 0x4e, 0x38, 0x0d, 0x78, 0xd8, 0x80, 0x92, 0x65, 0x02, 0x8a, 0x25, 0xf3, 0x99, 0x4f, - 0xc2, 0x98, 0x4e, 0xd9, 0x57, 0xfc, 0xc0, 0xcf, 0x59, 0x70, 0x72, 0xc5, 0x0f, 0x5b, 0xf7, 0x32, - 0xd1, 0x45, 0xaf, 0xc0, 0x28, 0x5d, 0x4c, 0xb1, 0x11, 0x7a, 0x67, 0xc4, 0x18, 0x0a, 0x14, 0xd6, - 0xe9, 0xb4, 0x62, 0xb7, 0x6f, 0xaf, 0xd6, 0xf3, 0x42, 0x13, 0x05, 0x0a, 0xeb, 0x74, 0xf6, 0xef, - 0x59, 0xf0, 0xe4, 0x95, 0xa5, 0xe5, 0x06, 0x89, 0x62, 0x2f, 0x4e, 0x48, 0x90, 0x74, 0x45, 0x47, - 0x52, 0xbd, 0xce, 0xd5, 0x9a, 0x92, 0xea, 0x75, 0x75, 0xd6, 0x0a, 0x81, 0xfd, 0xa0, 0x84, 0x08, - 0x7f, 0xdb, 0x82, 0x93, 0x57, 0xbc, 0x04, 0x93, 0x76, 0x98, 0x0d, 0x68, 0x8c, 0x48, 0x3b, 0x8c, - 0xbd, 0x24, 0x8c, 0x76, 0xb3, 0x01, 0x8d, 0x58, 0x61, 0xb0, 0x46, 0xc5, 0x6b, 0xde, 0xf1, 0x62, - 0xda, 0xd2, 0x8a, 0x69, 0x8e, 0x62, 0x01, 0xc7, 0x8a, 0x82, 0x76, 0xcc, 0xf5, 0x22, 0xa6, 0x32, - 0xec, 0x8a, 0x15, 0xac, 0x3a, 0x56, 0x97, 0x08, 0x9c, 0xd2, 0xd8, 0x7f, 0xdd, 0x82, 0xd3, 0x57, - 0xfc, 0x4e, 0x9c, 0x90, 0x68, 0x23, 0x36, 0x1a, 0xfb, 0x12, 0xd4, 0x88, 0x54, 0xc0, 0x45, 0x5b, - 0xd5, 0xa6, 0xa1, 0x34, 0x73, 0x1e, 0x4d, 0xa9, 0xe8, 0x4a, 0x04, 0xed, 0xf5, 0x17, 0x62, 0xf6, - 0x5b, 0x15, 0x18, 0xbf, 0xba, 0xb6, 0xd6, 0xb8, 0x42, 0x12, 0x21, 0x25, 0x8b, 0x1d, 0x47, 0x0d, - 0xcd, 0x6a, 0xd6, 0xf6, 0x96, 0xcc, 0xaa, 0xeb, 0x24, 0x9e, 0x3f, 0xc7, 0x83, 0xd7, 0xe7, 0x56, - 0x83, 0xe4, 0x56, 0xd4, 0x4c, 0x22, 0x2f, 0xd8, 0xcc, 0xb5, 0xb2, 0xa5, 0x24, 0xaf, 0xf6, 0x92, - 0xe4, 0xe8, 0x25, 0x18, 0x62, 0xf1, 0xf6, 0x52, 0xf5, 0xf8, 0xb0, 0xd2, 0x12, 0x18, 0xf4, 0xe1, - 0xde, 0x6c, 0xed, 0x36, 0x5e, 0xe5, 0x7f, 0xb0, 0x20, 0x45, 0x5f, 0x82, 0xd1, 0xad, 0x24, 0x69, - 0x5f, 0x25, 0x8e, 0x4b, 0x22, 0x29, 0x25, 0xce, 0x1f, 0x2c, 0x25, 0xe8, 0x60, 0xf0, 0x02, 0xe9, - 0xc2, 0x4a, 0x61, 0x31, 0xd6, 0x39, 0xda, 0x4d, 0x80, 0x14, 0xf7, 0x88, 0x2c, 0x10, 0xfb, 0x67, - 0x2b, 0x30, 0x7c, 0xd5, 0x09, 0x5c, 0x9f, 0x44, 0x68, 0x05, 0x06, 0xc8, 0x03, 0xd2, 0x12, 0xdb, - 0x78, 0x41, 0xd3, 0xd3, 0xad, 0x8e, 0x7b, 0xbe, 0xe8, 0x7f, 0xcc, 0xca, 0x23, 0x0c, 0xc3, 0xb4, - 0xdd, 0x57, 0x54, 0xa4, 0xeb, 0x0b, 0xc5, 0xa3, 0xa0, 0xa6, 0x04, 0xdf, 0x27, 0x05, 0x08, 0x4b, - 0x46, 0xcc, 0x47, 0xd4, 0x6a, 0x37, 0xa9, 0x70, 0x4b, 0xca, 0x05, 0xb5, 0xaf, 0x2d, 0x35, 0x38, - 0xb9, 0xe0, 0xcb, 0x7d, 0x44, 0x12, 0x88, 0x53, 0x76, 0xf6, 0x65, 0x38, 0xc5, 0x8e, 0x18, 0x9d, - 0x64, 0xcb, 0x58, 0x33, 0x85, 0x93, 0xd3, 0xfe, 0x5b, 0x15, 0x38, 0xb1, 0xda, 0x5c, 0x6a, 0x9a, - 0xde, 0xbd, 0xcb, 0x30, 0xc6, 0xb7, 0x67, 0x3a, 0xe9, 0x1c, 0x5f, 0x94, 0x57, 0x6e, 0xf1, 0x35, - 0x0d, 0x87, 0x0d, 0x4a, 0xf4, 0x24, 0x54, 0xbd, 0x77, 0x82, 0x6c, 0x0c, 0xd3, 0xea, 0x1b, 0x37, - 0x31, 0x85, 0x53, 0x34, 0xdd, 0xe9, 0xb9, 0x88, 0x53, 0x68, 0xb5, 0xdb, 0xbf, 0x0e, 0x13, 0x5e, - 0xdc, 0x8a, 0xbd, 0xd5, 0x80, 0xae, 0x7f, 0xa7, 0x25, 0xa7, 0x6f, 0xaa, 0x9a, 0xd3, 0xa6, 0x2a, - 0x2c, 0xce, 0x50, 0x6b, 0xf2, 0x76, 0xb0, 0xb4, 0xb6, 0x50, 0x1c, 0xf2, 0xfa, 0x65, 0xa8, 0xa9, - 0x70, 0x1f, 0x19, 0xa4, 0x65, 0xe5, 0x07, 0x69, 0x95, 0x10, 0x38, 0xd2, 0xe7, 0x5a, 0xcd, 0xf5, - 0xb9, 0xfe, 0x7d, 0x0b, 0xd2, 0xc8, 0x06, 0x84, 0xa1, 0xd6, 0x0e, 0xd9, 0x81, 0x46, 0x24, 0x4f, - 0x0e, 0x9f, 0x29, 0x98, 0x89, 0x7c, 0x25, 0xf0, 0xb9, 0xd2, 0x90, 0x65, 0x71, 0xca, 0x06, 0x5d, - 0x87, 0xe1, 0x76, 0x44, 0x9a, 0x09, 0x8b, 0x9b, 0xee, 0x83, 0x23, 0x9b, 0xd5, 0x0d, 0x5e, 0x12, - 0x4b, 0x16, 0xf6, 0x3f, 0xb3, 0x00, 0xae, 0x7b, 0xdb, 0x5e, 0x82, 0x9d, 0x60, 0x93, 0x1c, 0x83, - 0xb1, 0x77, 0x13, 0x06, 0xe2, 0x36, 0x69, 0x95, 0x3b, 0x92, 0x4a, 0x5b, 0xd6, 0x6c, 0x93, 0x56, - 0xfa, 0x39, 0xe8, 0x3f, 0xcc, 0xf8, 0xd8, 0xff, 0x00, 0x60, 0x22, 0x25, 0xa3, 0x0a, 0x37, 0x7a, - 0xd1, 0x08, 0x18, 0x7e, 0x3c, 0x13, 0x30, 0x5c, 0x63, 0xd4, 0x5a, 0x8c, 0x70, 0x02, 0xd5, 0x6d, - 0xe7, 0x81, 0xd0, 0xef, 0x5f, 0x29, 0xdb, 0x20, 0x5a, 0xd3, 0xdc, 0x0d, 0xe7, 0x01, 0x57, 0xa7, - 0x5e, 0x90, 0x13, 0xe9, 0x86, 0xf3, 0xe0, 0x21, 0x3f, 0x78, 0x62, 0x2b, 0x91, 0x1a, 0x14, 0x5f, - 0xff, 0xcf, 0xe9, 0x7f, 0x26, 0x1c, 0x69, 0x75, 0xac, 0x56, 0x2f, 0x10, 0x2e, 0xc4, 0x3e, 0x6b, - 0xf5, 0x82, 0x6c, 0xad, 0x5e, 0x50, 0xa2, 0x56, 0x2f, 0x40, 0xef, 0x5a, 0x30, 0x2c, 0x3c, 0xef, - 0x2c, 0x56, 0x6c, 0xf4, 0xd2, 0x27, 0xfa, 0xaa, 0x5a, 0xb8, 0xf0, 0x79, 0xf5, 0xf3, 0x52, 0x87, - 0x14, 0xd0, 0xc2, 0x26, 0xc8, 0xaa, 0xd1, 0xaf, 0x58, 0x30, 0x21, 0x7e, 0x63, 0xf2, 0x4e, 0x87, - 0xc4, 0x89, 0xd8, 0xad, 0x3e, 0x73, 0x98, 0xd6, 0x08, 0x16, 0xbc, 0x51, 0x1f, 0x97, 0xa2, 0xc6, - 0x44, 0x16, 0xb6, 0x2d, 0xd3, 0x1e, 0xf4, 0x7d, 0x0b, 0x4e, 0x6d, 0x3b, 0x0f, 0x78, 0x8d, 0x1c, - 0x86, 0x9d, 0xc4, 0x0b, 0x45, 0x3c, 0xdc, 0x4a, 0xbf, 0xf3, 0xa4, 0x8b, 0x11, 0x6f, 0xee, 0xa7, - 0xe4, 0x71, 0x68, 0x1e, 0x49, 0x61, 0xa3, 0x73, 0x5b, 0x38, 0xe3, 0xc2, 0x88, 0x9c, 0x98, 0x39, - 0xda, 0xfb, 0xa2, 0xbe, 0x29, 0x1f, 0xbc, 0x02, 0xa5, 0xbf, 0x6b, 0xee, 0x8d, 0x8e, 0x13, 0x24, - 0x5e, 0xb2, 0xab, 0xe9, 0xfa, 0xac, 0x16, 0x31, 0x11, 0x8f, 0xb0, 0x96, 0x2d, 0x18, 0xd3, 0xe7, - 0xdc, 0x11, 0xd6, 0x14, 0xc2, 0xc9, 0x9c, 0xf9, 0x74, 0x84, 0x15, 0x76, 0xe0, 0xf1, 0x9e, 0xf3, - 0xe2, 0xe8, 0xaa, 0xb5, 0xff, 0xa9, 0xa5, 0x0b, 0xcc, 0x63, 0xf0, 0xa0, 0xdc, 0x30, 0x3d, 0x28, - 0xe7, 0xcb, 0xae, 0x9c, 0x1e, 0x6e, 0x94, 0x0d, 0xbd, 0xf9, 0x74, 0x23, 0x40, 0x6b, 0x30, 0xe4, - 0x53, 0x88, 0x3c, 0x64, 0xba, 0xd0, 0xcf, 0xda, 0x4c, 0x75, 0x0c, 0x06, 0x8f, 0xb1, 0xe0, 0x65, - 0x7f, 0xdf, 0x82, 0x81, 0x9f, 0xe0, 0x25, 0x86, 0x2e, 0xd6, 0xe2, 0x1e, 0xee, 0x1c, 0x76, 0xee, - 0x2f, 0x3f, 0x48, 0x48, 0x10, 0x33, 0x95, 0x32, 0x77, 0x88, 0x7e, 0xad, 0x02, 0xa3, 0xb4, 0x2a, - 0x19, 0x26, 0xf0, 0x1a, 0x8c, 0xfb, 0xce, 0x3a, 0xf1, 0xa5, 0xf7, 0x37, 0x6b, 0x7e, 0x5d, 0xd7, - 0x91, 0xd8, 0xa4, 0xa5, 0x85, 0x37, 0x74, 0xe7, 0xb8, 0x50, 0x8d, 0x54, 0x61, 0xc3, 0x73, 0x8e, - 0x4d, 0x5a, 0x6a, 0x01, 0xdc, 0x77, 0x92, 0xd6, 0x96, 0x30, 0xcd, 0x54, 0x73, 0xef, 0x52, 0x20, - 0xe6, 0x38, 0xb4, 0x00, 0x93, 0x72, 0xc6, 0xde, 0xa1, 0x36, 0x7b, 0x18, 0x08, 0xb5, 0x51, 0x5d, - 0x84, 0xc4, 0x26, 0x1a, 0x67, 0xe9, 0xd1, 0x27, 0x61, 0x82, 0x0e, 0x4e, 0xd8, 0x49, 0x64, 0x10, - 0xc4, 0x20, 0x0b, 0x82, 0x60, 0x91, 0xac, 0x6b, 0x06, 0x06, 0x67, 0x28, 0xed, 0x2f, 0xc1, 0xc9, - 0xeb, 0xa1, 0xe3, 0x2e, 0x3a, 0xbe, 0x13, 0xb4, 0x48, 0xb4, 0x1a, 0x6c, 0x16, 0x9e, 0x17, 0xeb, - 0x67, 0xba, 0x95, 0xa2, 0x33, 0x5d, 0x3b, 0x02, 0xa4, 0x57, 0x20, 0xc2, 0x77, 0xde, 0x82, 0x61, - 0x8f, 0x57, 0x25, 0xa6, 0xed, 0xc5, 0x22, 0xe7, 0x52, 0x57, 0x1b, 0xb5, 0x70, 0x14, 0x0e, 0xc0, - 0x92, 0x25, 0xb5, 0x28, 0xf2, 0xbc, 0x51, 0xc5, 0x46, 0x9b, 0xfd, 0xe7, 0x2d, 0x98, 0xbc, 0x99, - 0xb9, 0x65, 0xf7, 0x2c, 0x0c, 0xc5, 0x24, 0xca, 0x71, 0xad, 0x35, 0x19, 0x14, 0x0b, 0xec, 0x23, - 0x37, 0xd7, 0x7f, 0xb1, 0x02, 0x35, 0x16, 0x08, 0xda, 0xa6, 0xd6, 0xc1, 0xd1, 0x2b, 0xa7, 0x37, - 0x0c, 0xe5, 0xb4, 0xc0, 0x68, 0x54, 0x0d, 0xeb, 0xa5, 0x9b, 0xa2, 0xdb, 0xea, 0xf6, 0x59, 0x29, - 0x7b, 0x31, 0x65, 0xc8, 0x6f, 0x28, 0x4d, 0x98, 0x97, 0xd5, 0xe4, 0xcd, 0x34, 0x76, 0xca, 0xaa, - 0x68, 0x3f, 0x70, 0xa7, 0xac, 0xaa, 0x65, 0x3d, 0x84, 0x53, 0x43, 0x6b, 0x3c, 0x13, 0xdf, 0x9f, - 0x66, 0xe1, 0x7d, 0x8e, 0xef, 0x7d, 0x85, 0xa8, 0x4b, 0x9c, 0xb3, 0x22, 0x5c, 0x4f, 0x40, 0x1f, - 0x32, 0x39, 0x23, 0xfe, 0xf1, 0x3b, 0xba, 0x69, 0x11, 0xfb, 0x2a, 0x4c, 0x66, 0x86, 0x0e, 0xbd, - 0x02, 0x83, 0xed, 0x2d, 0x27, 0x26, 0x99, 0xc0, 0x91, 0xc1, 0x06, 0x05, 0x3e, 0xdc, 0x9b, 0x9d, - 0x50, 0x05, 0x18, 0x04, 0x73, 0x6a, 0xfb, 0xdd, 0x0a, 0x0c, 0xdc, 0x0c, 0xdd, 0xe3, 0x98, 0x6a, - 0x57, 0x8d, 0xa9, 0xf6, 0x6c, 0xf1, 0x0d, 0xff, 0x9e, 0xb3, 0xac, 0x91, 0x99, 0x65, 0xe7, 0x4b, - 0xf0, 0x3a, 0x78, 0x82, 0x6d, 0xc3, 0x28, 0xcb, 0x20, 0x20, 0x22, 0x67, 0x5e, 0x32, 0xec, 0xa9, - 0xd9, 0x8c, 0x3d, 0x35, 0xa9, 0x91, 0x6a, 0x56, 0xd5, 0x73, 0x30, 0x2c, 0x22, 0x35, 0xb2, 0xc1, - 0x8d, 0x82, 0x16, 0x4b, 0xbc, 0xfd, 0x8f, 0xab, 0x60, 0x64, 0x2c, 0x40, 0x3f, 0xb4, 0x60, 0x2e, - 0xe2, 0xd7, 0x35, 0xdc, 0x7a, 0x27, 0xf2, 0x82, 0xcd, 0x66, 0x6b, 0x8b, 0xb8, 0x1d, 0xdf, 0x0b, - 0x36, 0x57, 0x37, 0x83, 0x50, 0x81, 0x97, 0x1f, 0x90, 0x56, 0x87, 0x39, 0x5d, 0x4b, 0x27, 0x4a, - 0x50, 0x27, 0xa0, 0x97, 0xf6, 0xf7, 0x66, 0xe7, 0x70, 0x5f, 0xb5, 0xe0, 0x3e, 0x5b, 0x85, 0xfe, - 0xd0, 0x82, 0x79, 0x7e, 0x67, 0xbf, 0x7c, 0x4f, 0x4a, 0xd9, 0xa1, 0x0d, 0xc9, 0x34, 0x65, 0xb7, - 0x46, 0xa2, 0xed, 0xc5, 0x57, 0xc5, 0x20, 0xcf, 0x37, 0xfa, 0xab, 0x15, 0xf7, 0xdb, 0x4c, 0xfb, - 0x5f, 0x54, 0x61, 0x9c, 0x8e, 0x67, 0x7a, 0x4f, 0xf7, 0x15, 0x63, 0x9a, 0x3c, 0x95, 0x99, 0x26, - 0x27, 0x0c, 0xe2, 0x47, 0x73, 0x45, 0x37, 0x86, 0x13, 0xbe, 0x13, 0x27, 0x57, 0x89, 0x13, 0x25, - 0xeb, 0xc4, 0x61, 0x07, 0x8d, 0xd9, 0x20, 0x86, 0x12, 0x67, 0x97, 0x2a, 0xfa, 0xe7, 0x7a, 0x96, - 0x19, 0xee, 0xe6, 0x8f, 0x76, 0x00, 0xb1, 0x43, 0xcd, 0xc8, 0x09, 0x62, 0xde, 0x17, 0x4f, 0xb8, - 0x69, 0xfb, 0xab, 0x75, 0x46, 0xd4, 0x8a, 0xae, 0x77, 0x71, 0xc3, 0x39, 0x35, 0x68, 0xc7, 0xd6, - 0x83, 0x65, 0x8f, 0xad, 0x87, 0x0a, 0xa2, 0x8a, 0x7f, 0xde, 0x82, 0x93, 0xf4, 0xb3, 0x98, 0x11, - 0xa8, 0x31, 0x0a, 0x61, 0x92, 0x4e, 0x3b, 0x9f, 0x24, 0x12, 0x26, 0xd6, 0x57, 0x81, 0x66, 0x6d, - 0xf2, 0x49, 0xd5, 0xb7, 0x6b, 0x26, 0x33, 0x9c, 0xe5, 0x6e, 0x7f, 0xc7, 0x02, 0x16, 0xe2, 0x76, - 0x0c, 0x9b, 0xd9, 0x15, 0x73, 0x33, 0xb3, 0x8b, 0x25, 0x46, 0x8f, 0x7d, 0xec, 0x65, 0x98, 0xa2, - 0xd8, 0x46, 0x14, 0x3e, 0xd8, 0x95, 0x8a, 0x76, 0xb1, 0xbf, 0xf6, 0xdd, 0x0a, 0x5f, 0x36, 0xea, - 0xde, 0x19, 0xfa, 0x05, 0x0b, 0x46, 0x5a, 0x4e, 0xdb, 0x69, 0xf1, 0x7c, 0x2f, 0x25, 0x7c, 0x32, - 0x46, 0xf9, 0xb9, 0x25, 0x51, 0x96, 0xfb, 0x13, 0x3e, 0x26, 0xbb, 0x2e, 0xc1, 0x85, 0x3e, 0x04, - 0x55, 0xf9, 0x8c, 0x07, 0xe3, 0x06, 0xb3, 0x23, 0x34, 0x42, 0x7f, 0xc1, 0xe2, 0x22, 0x5f, 0x19, - 0x0a, 0xf7, 0xe1, 0x44, 0xa0, 0xfd, 0xa7, 0xc2, 0x4c, 0xea, 0xc5, 0x73, 0xe5, 0x85, 0x3a, 0x93, - 0x81, 0x5a, 0x30, 0x5f, 0x86, 0x21, 0xee, 0xae, 0xc3, 0xfe, 0xdb, 0x16, 0x3c, 0xa6, 0x13, 0x6a, - 0xd7, 0x04, 0x8b, 0x7c, 0xc5, 0x75, 0x18, 0x09, 0xdb, 0x24, 0x72, 0x52, 0xa3, 0xe8, 0xbc, 0x1c, - 0xfd, 0x5b, 0x02, 0xfe, 0x70, 0x6f, 0xf6, 0x94, 0xce, 0x5d, 0xc2, 0xb1, 0x2a, 0x89, 0x6c, 0x18, - 0x62, 0xe3, 0x12, 0x8b, 0x0b, 0x9e, 0x2c, 0xfb, 0x09, 0x3b, 0x21, 0x89, 0xb1, 0xc0, 0xd8, 0x7f, - 0xd9, 0xe2, 0x93, 0x4d, 0x6f, 0x3a, 0xfa, 0x2a, 0x4c, 0x6d, 0x53, 0xfb, 0x69, 0xf9, 0x41, 0x9b, - 0x6e, 0xa3, 0xec, 0x64, 0xd8, 0x2a, 0xb3, 0x79, 0xf4, 0xe8, 0xee, 0xe2, 0xb4, 0x68, 0xfd, 0xd4, - 0x8d, 0x0c, 0x5b, 0xdc, 0x55, 0x91, 0xfd, 0x47, 0x62, 0xc5, 0x32, 0x0d, 0xee, 0x39, 0x18, 0x6e, - 0x87, 0xee, 0xd2, 0x6a, 0x1d, 0x8b, 0xb1, 0x52, 0x22, 0xa7, 0xc1, 0xc1, 0x58, 0xe2, 0xd1, 0x25, - 0x00, 0xf2, 0x20, 0x21, 0x51, 0xe0, 0xf8, 0xea, 0x44, 0x57, 0x29, 0x4a, 0xcb, 0x0a, 0x83, 0x35, - 0x2a, 0x5a, 0xa6, 0x1d, 0x85, 0x3b, 0x9e, 0xcb, 0x22, 0xeb, 0xab, 0x66, 0x99, 0x86, 0xc2, 0x60, - 0x8d, 0x8a, 0x5a, 0xad, 0x9d, 0x20, 0xe6, 0x9b, 0x98, 0xb3, 0x2e, 0x92, 0x75, 0x8c, 0xa4, 0x56, - 0xeb, 0x6d, 0x1d, 0x89, 0x4d, 0x5a, 0xfb, 0x3f, 0xd4, 0x00, 0x52, 0x35, 0x09, 0xbd, 0xdb, 0xbd, - 0x42, 0x3f, 0x5e, 0x56, 0xc7, 0x7a, 0x74, 0xcb, 0x13, 0x7d, 0xd3, 0x82, 0x51, 0xc7, 0xf7, 0xc3, - 0x96, 0x93, 0xb0, 0x1e, 0x55, 0xca, 0xca, 0x0a, 0xd1, 0x92, 0x85, 0xb4, 0x2c, 0x6f, 0xcc, 0x4b, - 0xf2, 0xc0, 0x4f, 0xc3, 0x14, 0xb6, 0x47, 0x6f, 0x02, 0xfa, 0x98, 0x54, 0xb3, 0xf9, 0x47, 0x99, - 0xc9, 0xaa, 0xd9, 0x35, 0x26, 0x21, 0x35, 0x0d, 0x1b, 0x7d, 0xc9, 0xc8, 0x47, 0x31, 0x50, 0xe6, - 0x5e, 0xa1, 0xa1, 0x38, 0x14, 0xa5, 0xa2, 0x40, 0x9f, 0xd7, 0x83, 0x8e, 0x07, 0xcb, 0x5c, 0xdc, - 0xd5, 0xf4, 0xd7, 0x82, 0x80, 0xe3, 0x04, 0x26, 0x5d, 0x73, 0xab, 0x14, 0x41, 0x59, 0x17, 0x8b, - 0x6b, 0xc8, 0xec, 0xb1, 0xe9, 0xe6, 0x98, 0x41, 0xe0, 0x6c, 0x15, 0xe8, 0xf3, 0x3c, 0x24, 0x7c, - 0x35, 0xd8, 0x08, 0x45, 0x60, 0xd6, 0x85, 0x12, 0xdf, 0x7c, 0x37, 0x4e, 0xc8, 0x36, 0x2d, 0x93, - 0xee, 0x86, 0x37, 0x05, 0x17, 0xac, 0xf8, 0xa1, 0x35, 0x18, 0x62, 0x17, 0x58, 0xe2, 0xe9, 0x91, - 0x32, 0xae, 0x33, 0xf3, 0xde, 0x66, 0xaa, 0x82, 0xb0, 0xbf, 0x31, 0x16, 0xbc, 0xd0, 0x55, 0x79, - 0x7f, 0x3a, 0x5e, 0x0d, 0x6e, 0xc7, 0x84, 0xdd, 0x9f, 0xae, 0x2d, 0x7e, 0x24, 0xbd, 0x10, 0xcd, - 0xe1, 0xb9, 0x19, 0xb9, 0x8c, 0x92, 0x54, 0x13, 0x11, 0xff, 0x65, 0xa2, 0xaf, 0x69, 0x28, 0xd3, - 0x50, 0x33, 0x2d, 0x58, 0x3a, 0xd8, 0x77, 0x4c, 0x66, 0x38, 0xcb, 0xfd, 0x18, 0xf7, 0xc0, 0x19, - 0x1f, 0xa6, 0xb2, 0x4b, 0xf2, 0x08, 0x77, 0xdc, 0x3f, 0x1d, 0x80, 0x09, 0x73, 0x62, 0xa0, 0x79, - 0xa8, 0x09, 0x6d, 0x4a, 0x25, 0xfd, 0x51, 0xf3, 0xff, 0x86, 0x44, 0xe0, 0x94, 0x86, 0xa5, 0x3f, - 0x62, 0xc5, 0xb5, 0x70, 0x9c, 0x34, 0xfd, 0x91, 0xc2, 0x60, 0x8d, 0x8a, 0xaa, 0xad, 0xeb, 0x61, - 0x98, 0x28, 0xc1, 0xad, 0xe6, 0xcc, 0x22, 0x83, 0x62, 0x81, 0xa5, 0x02, 0xfb, 0x1e, 0xed, 0x90, - 0x6f, 0xba, 0x00, 0x95, 0xc0, 0xbe, 0xa6, 0x23, 0xb1, 0x49, 0x4b, 0x37, 0xa0, 0x30, 0x66, 0x93, - 0x50, 0x28, 0xc7, 0x69, 0x78, 0x53, 0x93, 0x5f, 0xe8, 0x92, 0x78, 0xf4, 0x39, 0x78, 0x4c, 0xdd, - 0xbf, 0xc2, 0xdc, 0xa5, 0x2a, 0x6b, 0x1c, 0x32, 0xec, 0xdb, 0xc7, 0x96, 0xf2, 0xc9, 0x70, 0xaf, - 0xf2, 0xe8, 0x75, 0x98, 0x10, 0x8a, 0xad, 0xe4, 0x38, 0x6c, 0x9e, 0x7e, 0x5f, 0x33, 0xb0, 0x38, - 0x43, 0x8d, 0xea, 0x30, 0x45, 0x21, 0x4c, 0xa3, 0x94, 0x1c, 0xf8, 0x3d, 0x32, 0xb5, 0x33, 0x5f, - 0xcb, 0xe0, 0x71, 0x57, 0x09, 0xb4, 0x00, 0x93, 0x5c, 0xb7, 0xa0, 0x56, 0x1c, 0xfb, 0x0e, 0x22, - 0x92, 0x52, 0x2d, 0x82, 0x5b, 0x26, 0x1a, 0x67, 0xe9, 0xd1, 0x65, 0x18, 0x73, 0xa2, 0xd6, 0x96, - 0x97, 0x90, 0x56, 0xd2, 0x89, 0x78, 0x66, 0x02, 0x2d, 0x7c, 0x60, 0x41, 0xc3, 0x61, 0x83, 0xd2, - 0xfe, 0x0a, 0x9c, 0xcc, 0x09, 0xdb, 0xa6, 0x13, 0xc7, 0x69, 0x7b, 0xb2, 0x4f, 0x99, 0x40, 0xa5, - 0x85, 0xc6, 0xaa, 0xec, 0x8d, 0x46, 0x45, 0x67, 0x27, 0xf3, 0x25, 0x6b, 0x39, 0xf9, 0xd4, 0xec, - 0x5c, 0x91, 0x08, 0x9c, 0xd2, 0xd8, 0xff, 0xa3, 0x06, 0x9a, 0xab, 0xa5, 0x44, 0x78, 0xca, 0x65, - 0x18, 0x93, 0x69, 0x26, 0xb5, 0xf4, 0x6e, 0xaa, 0x9b, 0x57, 0x34, 0x1c, 0x36, 0x28, 0x69, 0xdb, - 0x02, 0xe9, 0x40, 0xca, 0x86, 0x45, 0x29, 0xcf, 0x12, 0x4e, 0x69, 0xd0, 0x05, 0x18, 0x89, 0x89, - 0xbf, 0x71, 0xdd, 0x0b, 0xee, 0x89, 0x89, 0xad, 0xa4, 0x72, 0x53, 0xc0, 0xb1, 0xa2, 0x40, 0x8b, - 0x50, 0xed, 0x78, 0xae, 0x98, 0xca, 0x52, 0x65, 0xa8, 0xde, 0x5e, 0xad, 0x3f, 0xdc, 0x9b, 0x7d, - 0xaa, 0x57, 0x9e, 0x4e, 0x6a, 0x4c, 0xc7, 0x73, 0x74, 0xf9, 0xd1, 0xc2, 0x79, 0x4e, 0xf5, 0xa1, - 0x3e, 0x9d, 0xea, 0x97, 0x00, 0x44, 0xaf, 0xe5, 0x5c, 0xae, 0xa6, 0x5f, 0xed, 0x8a, 0xc2, 0x60, - 0x8d, 0x8a, 0x9a, 0xe4, 0xad, 0x88, 0x38, 0xd2, 0x6a, 0xe5, 0xe1, 0xc4, 0x23, 0x87, 0x37, 0xc9, - 0x97, 0xb2, 0xcc, 0x70, 0x37, 0x7f, 0x14, 0xc2, 0x09, 0x97, 0x2e, 0x24, 0xa3, 0xd2, 0x5a, 0xff, - 0x31, 0xcc, 0xb4, 0xc2, 0x7a, 0x96, 0x11, 0xee, 0xe6, 0x8d, 0xbe, 0x08, 0x33, 0x12, 0xd8, 0x7d, - 0xc3, 0x92, 0x2d, 0x97, 0xea, 0xe2, 0xd9, 0xfd, 0xbd, 0xd9, 0x99, 0x7a, 0x4f, 0x2a, 0x7c, 0x00, - 0x07, 0xf4, 0x16, 0x0c, 0xb1, 0x43, 0x98, 0x78, 0x7a, 0x94, 0xed, 0x76, 0x2f, 0x97, 0x89, 0x84, - 0xa7, 0xb3, 0x7e, 0x8e, 0x1d, 0xe5, 0x88, 0x18, 0xcf, 0xf4, 0x64, 0x8b, 0x01, 0xb1, 0xe0, 0x89, - 0xda, 0x30, 0xea, 0x04, 0x41, 0x98, 0x38, 0x5c, 0x09, 0x1b, 0x2b, 0xa3, 0x47, 0x6a, 0x55, 0x2c, - 0xa4, 0x65, 0x79, 0x3d, 0x2a, 0x70, 0x4c, 0xc3, 0x60, 0xbd, 0x0a, 0x74, 0x1f, 0x26, 0xc3, 0xfb, - 0x54, 0x60, 0xca, 0x73, 0x88, 0x78, 0x7a, 0xdc, 0xec, 0x58, 0x81, 0x57, 0xd5, 0x28, 0xac, 0x49, - 0x32, 0x93, 0x29, 0xce, 0xd6, 0x82, 0xe6, 0x0c, 0xdf, 0xf2, 0x44, 0x1a, 0xc9, 0x9c, 0xfa, 0x96, - 0x75, 0x57, 0x32, 0xbb, 0xc5, 0xcb, 0xa3, 0x17, 0x99, 0x44, 0x98, 0xcc, 0xdc, 0xe2, 0x4d, 0x51, - 0x58, 0xa7, 0x9b, 0xf9, 0x04, 0x8c, 0x6a, 0x03, 0xdf, 0x4f, 0xc8, 0xec, 0xcc, 0xeb, 0x30, 0x95, - 0x1d, 0xd0, 0xbe, 0x42, 0x6e, 0xff, 0x7b, 0x05, 0x26, 0x73, 0x0e, 0x79, 0xee, 0x79, 0x2c, 0xec, - 0xdb, 0x10, 0x7d, 0xd7, 0xbc, 0xc0, 0xc5, 0x0c, 0x63, 0x0a, 0xb0, 0x4a, 0x09, 0x01, 0x26, 0xa5, - 0x69, 0xb5, 0xa7, 0x34, 0x15, 0x42, 0x6b, 0xe0, 0xfd, 0x08, 0x2d, 0x73, 0x9f, 0x18, 0x2c, 0xb5, - 0x4f, 0x3c, 0x02, 0x41, 0x67, 0x6c, 0x35, 0xc3, 0x25, 0xb6, 0x9a, 0x6f, 0x57, 0x60, 0x2a, 0x0d, - 0x2f, 0x16, 0xb9, 0x67, 0x8f, 0xfe, 0xcc, 0x60, 0xcd, 0x38, 0x33, 0x28, 0x4a, 0x2d, 0x9b, 0x69, - 0x5f, 0xcf, 0xf3, 0x83, 0xb7, 0x32, 0xe7, 0x07, 0x2f, 0xf7, 0xc9, 0xf7, 0xe0, 0xb3, 0x84, 0xef, - 0x55, 0xe0, 0x74, 0xb6, 0xc8, 0x92, 0xef, 0x78, 0xdb, 0xc7, 0x30, 0x5e, 0x9f, 0x33, 0xc6, 0xeb, - 0xd5, 0xfe, 0xfa, 0xc5, 0x1a, 0xd9, 0x73, 0xd0, 0x9c, 0xcc, 0xa0, 0x7d, 0xe2, 0x30, 0xcc, 0x0f, - 0x1e, 0xb9, 0xdf, 0xb7, 0xe0, 0xf1, 0xdc, 0x72, 0xc7, 0xe0, 0x25, 0x7d, 0xd3, 0xf4, 0x92, 0xbe, - 0x74, 0x88, 0xde, 0xf5, 0x70, 0x9b, 0xfe, 0x97, 0x4a, 0x8f, 0x5e, 0x31, 0x4f, 0xd2, 0x2d, 0x18, - 0x75, 0x5a, 0x2d, 0x12, 0xc7, 0x37, 0x42, 0x57, 0xe5, 0x03, 0x7a, 0x91, 0xed, 0x2d, 0x29, 0xf8, - 0xe1, 0xde, 0xec, 0x4c, 0x96, 0x45, 0x8a, 0xc6, 0x3a, 0x07, 0x33, 0x5f, 0x58, 0xe5, 0x88, 0xf2, - 0x85, 0x5d, 0x02, 0xd8, 0x51, 0x16, 0x6c, 0xd6, 0x41, 0xa5, 0xd9, 0xb6, 0x1a, 0x15, 0xfa, 0xff, - 0x99, 0x46, 0xc8, 0x23, 0x2a, 0x06, 0xcc, 0x9b, 0x8a, 0x05, 0xdf, 0x4f, 0x8f, 0xce, 0xe0, 0x17, - 0x22, 0x95, 0x33, 0x4f, 0xb1, 0xb4, 0xff, 0x49, 0x15, 0x3e, 0x7c, 0xc0, 0xa4, 0x43, 0x0b, 0xe6, - 0x01, 0xe9, 0x0b, 0x59, 0xcf, 0xcd, 0x4c, 0x6e, 0x61, 0xc3, 0x95, 0x93, 0xf9, 0x56, 0x95, 0xf7, - 0xfd, 0xad, 0xbe, 0xa5, 0xfb, 0xd9, 0x78, 0x60, 0xe4, 0x95, 0x43, 0x2f, 0xab, 0x9f, 0x4e, 0xbf, - 0xf8, 0xd7, 0x2d, 0x78, 0x2a, 0xb7, 0x53, 0x46, 0x38, 0xc6, 0x3c, 0xd4, 0x5a, 0x14, 0xa8, 0xdd, - 0x60, 0x49, 0xaf, 0x8e, 0x49, 0x04, 0x4e, 0x69, 0x8c, 0xa8, 0x8b, 0x4a, 0x61, 0xd4, 0xc5, 0xef, - 0x5a, 0x70, 0x2a, 0xdb, 0x88, 0x63, 0x90, 0x39, 0x4d, 0x53, 0xe6, 0xcc, 0xf5, 0xf7, 0xe9, 0x7b, - 0x88, 0x9b, 0x5f, 0x19, 0x87, 0x33, 0x5d, 0x3b, 0x16, 0x1f, 0xc5, 0x9f, 0xb1, 0xe0, 0xc4, 0x26, - 0xd3, 0xbc, 0xb5, 0x6b, 0x42, 0xa2, 0x5f, 0x05, 0x77, 0xab, 0x0e, 0xbc, 0x5d, 0xc4, 0xed, 0x88, - 0x2e, 0x12, 0xdc, 0x5d, 0x19, 0xfa, 0x86, 0x05, 0xa7, 0x9c, 0xfb, 0x71, 0xd7, 0xab, 0x06, 0x62, - 0x1a, 0xbd, 0x5e, 0xe0, 0xe4, 0x2a, 0x78, 0x0f, 0x61, 0x71, 0x7a, 0x7f, 0x6f, 0xf6, 0x54, 0x1e, - 0x15, 0xce, 0xad, 0x95, 0x7e, 0xdf, 0x2d, 0x71, 0x0d, 0xa1, 0xdc, 0x85, 0xb7, 0xbc, 0x4b, 0x0b, - 0x5c, 0x24, 0x49, 0x0c, 0x56, 0x1c, 0xd1, 0xdb, 0x50, 0xdb, 0x94, 0x37, 0x83, 0xb2, 0x22, 0xaf, - 0xc7, 0x30, 0xe7, 0x5d, 0x24, 0xe2, 0xa1, 0xf1, 0x0a, 0x85, 0x53, 0xa6, 0xe8, 0x2a, 0x54, 0x83, - 0x8d, 0x58, 0xdc, 0xc1, 0x2d, 0x0a, 0xb6, 0x31, 0x43, 0x9c, 0xf8, 0xb5, 0xc5, 0x9b, 0x2b, 0x4d, - 0x4c, 0x59, 0x50, 0x4e, 0xd1, 0xba, 0x2b, 0xbc, 0xbb, 0x05, 0x9c, 0xf0, 0x62, 0xbd, 0x9b, 0x13, - 0x5e, 0xac, 0x63, 0xca, 0x02, 0x35, 0x60, 0x90, 0x5d, 0x72, 0x10, 0xae, 0xdb, 0x82, 0x8b, 0xda, - 0x5d, 0x57, 0x39, 0x78, 0x32, 0x3c, 0x06, 0xc6, 0x9c, 0x11, 0x5a, 0x83, 0xa1, 0x16, 0x4b, 0xe0, - 0x2d, 0xec, 0xea, 0xa2, 0x34, 0x03, 0x5d, 0xc9, 0xbe, 0xf9, 0x11, 0x13, 0x87, 0x63, 0xc1, 0x8b, - 0x71, 0x25, 0xed, 0xad, 0x8d, 0x58, 0x18, 0xce, 0x45, 0x5c, 0xbb, 0x52, 0xb1, 0x0b, 0xae, 0x0c, - 0x8e, 0x05, 0x2f, 0x54, 0x87, 0xca, 0x46, 0x4b, 0x64, 0xb6, 0x2c, 0x70, 0xd9, 0x9a, 0x77, 0x50, - 0x17, 0x87, 0xf6, 0xf7, 0x66, 0x2b, 0x2b, 0x4b, 0xb8, 0xb2, 0xd1, 0x42, 0x6f, 0xc2, 0xf0, 0x06, - 0xbf, 0x55, 0x28, 0xb2, 0x58, 0x5e, 0x2c, 0xba, 0xfa, 0xd8, 0x75, 0x05, 0x91, 0x5f, 0x7f, 0x10, - 0x08, 0x2c, 0xd9, 0xb1, 0xd4, 0x62, 0xea, 0x9e, 0xa4, 0x48, 0x63, 0x39, 0xd7, 0xdf, 0xbd, 0x4a, - 0x61, 0x4f, 0x2a, 0x28, 0xd6, 0x38, 0xd2, 0x39, 0xef, 0xc8, 0xb7, 0x08, 0x58, 0x0a, 0xcb, 0xc2, - 0x39, 0x9f, 0xfb, 0x74, 0x01, 0x9f, 0xf3, 0x0a, 0x85, 0x53, 0xa6, 0xa8, 0x03, 0xe3, 0x3b, 0x71, - 0x7b, 0x8b, 0xc8, 0xa5, 0xcf, 0xf2, 0x5a, 0x8e, 0x5e, 0xfa, 0x54, 0x41, 0xb2, 0x52, 0x51, 0xc4, - 0x8b, 0x92, 0x8e, 0xe3, 0x77, 0x49, 0x30, 0x96, 0xcb, 0xe9, 0x8e, 0xce, 0x16, 0x9b, 0xb5, 0xd0, - 0x4f, 0xf2, 0x4e, 0x27, 0x5c, 0xdf, 0x4d, 0x88, 0xc8, 0x7b, 0x59, 0xf0, 0x49, 0xde, 0xe0, 0xc4, - 0xdd, 0x9f, 0x44, 0x20, 0xb0, 0x64, 0xa7, 0x86, 0x8c, 0x49, 0xe3, 0xa9, 0xd2, 0x43, 0xd6, 0xd5, - 0x87, 0x74, 0xc8, 0x98, 0xf4, 0x4d, 0x99, 0x32, 0xa9, 0xdb, 0xde, 0x0a, 0x93, 0x30, 0xc8, 0xc8, - 0xfe, 0x13, 0x65, 0xa4, 0x6e, 0x23, 0xa7, 0x64, 0xb7, 0xd4, 0xcd, 0xa3, 0xc2, 0xb9, 0xb5, 0xda, - 0x7f, 0x34, 0xd8, 0xbd, 0xdd, 0x32, 0x65, 0xf8, 0x2f, 0x75, 0x9f, 0x3b, 0x7e, 0xa6, 0x7f, 0x9b, - 0xef, 0x11, 0x9e, 0x40, 0x7e, 0xc3, 0x82, 0x33, 0xed, 0xdc, 0xcd, 0x54, 0x6c, 0x58, 0xfd, 0x9a, - 0x8e, 0x7c, 0xc0, 0x54, 0x52, 0xd7, 0x7c, 0x3c, 0xee, 0x51, 0x67, 0x56, 0x01, 0xad, 0xbe, 0x6f, - 0x05, 0xf4, 0x2e, 0x8c, 0x30, 0x9d, 0x29, 0xcd, 0xab, 0xd1, 0x67, 0x0a, 0x0a, 0xb6, 0xf5, 0x2d, - 0x09, 0x16, 0x58, 0x31, 0xa3, 0x03, 0xf7, 0x64, 0xb6, 0x13, 0x98, 0x30, 0xb4, 0xc8, 0x46, 0xcb, - 0x7d, 0x1d, 0x2b, 0x62, 0x24, 0x9e, 0x6c, 0x1c, 0x44, 0xfc, 0xb0, 0x88, 0x00, 0x1f, 0x5c, 0xd9, - 0x71, 0x2a, 0xb4, 0x7f, 0xd7, 0xca, 0xd1, 0xbf, 0xb8, 0x09, 0xf2, 0x29, 0xd3, 0x04, 0x79, 0x36, - 0x6b, 0x82, 0x74, 0xb9, 0x0d, 0x0c, 0xeb, 0xa3, 0x7c, 0xf2, 0xc4, 0xb2, 0x09, 0x3f, 0x6c, 0x1f, - 0xce, 0x15, 0x2d, 0x6e, 0x16, 0xe1, 0xe3, 0xaa, 0xe3, 0xb2, 0x34, 0xc2, 0xc7, 0x5d, 0xad, 0x63, - 0x86, 0x29, 0x7b, 0x67, 0xdc, 0xfe, 0xd9, 0x0a, 0x54, 0x1b, 0xa1, 0x7b, 0x0c, 0x6e, 0x90, 0x2b, - 0x86, 0x1b, 0xe4, 0x99, 0xc2, 0x97, 0x98, 0x7a, 0x3a, 0x3d, 0x6e, 0x65, 0x9c, 0x1e, 0x1f, 0x2d, - 0x66, 0x75, 0xb0, 0x8b, 0xe3, 0xfb, 0x55, 0xd0, 0xdf, 0x92, 0x42, 0xff, 0xfe, 0x30, 0x81, 0x9f, - 0xd5, 0x72, 0xcf, 0x4b, 0x89, 0x3a, 0x58, 0x88, 0x90, 0xbc, 0x24, 0xf6, 0x53, 0x1b, 0xff, 0x79, - 0x97, 0x78, 0x9b, 0x5b, 0x09, 0x71, 0xb3, 0x1d, 0x3b, 0xbe, 0xf8, 0xcf, 0xff, 0x6a, 0xc1, 0x64, - 0xa6, 0x76, 0xe4, 0xe7, 0xdd, 0x33, 0x39, 0xa4, 0x63, 0xe3, 0x44, 0xe1, 0xc5, 0x94, 0x39, 0x00, - 0xe5, 0x9f, 0x96, 0xee, 0x07, 0xa6, 0x8b, 0x29, 0x07, 0x76, 0x8c, 0x35, 0x0a, 0xf4, 0x0a, 0x8c, - 0x26, 0x61, 0x3b, 0xf4, 0xc3, 0xcd, 0xdd, 0x6b, 0x44, 0x66, 0x33, 0x50, 0xbe, 0xfd, 0xb5, 0x14, - 0x85, 0x75, 0x3a, 0xfb, 0x07, 0x55, 0xc8, 0xbe, 0x44, 0xf6, 0xff, 0xe6, 0xe9, 0x4f, 0xcf, 0x3c, - 0xfd, 0x03, 0x0b, 0xa6, 0x68, 0xed, 0x2c, 0xc0, 0x43, 0xc6, 0x69, 0xaa, 0x7c, 0xea, 0xd6, 0x01, - 0xf9, 0xd4, 0x9f, 0xa5, 0xd2, 0xce, 0x0d, 0x3b, 0x89, 0x70, 0x99, 0x68, 0x42, 0x8c, 0x42, 0xb1, - 0xc0, 0x0a, 0x3a, 0x12, 0x45, 0xe2, 0x42, 0x8b, 0x4e, 0x47, 0xa2, 0x08, 0x0b, 0xac, 0x4c, 0xb7, - 0x3e, 0xd0, 0x23, 0xdd, 0x3a, 0xcb, 0x07, 0x24, 0x02, 0x0b, 0x84, 0x3a, 0xa0, 0xe5, 0x03, 0x92, - 0x11, 0x07, 0x29, 0x8d, 0xfd, 0xdd, 0x2a, 0x8c, 0x35, 0x42, 0x37, 0x0d, 0xc0, 0x7e, 0xd9, 0x08, - 0xc0, 0x3e, 0x97, 0x09, 0xc0, 0x9e, 0xd2, 0x69, 0x1f, 0x4d, 0xfc, 0xb5, 0xc8, 0x1b, 0xc5, 0x1e, - 0x04, 0x38, 0x64, 0xec, 0xb5, 0x91, 0x37, 0x4a, 0x31, 0xc2, 0x26, 0xdf, 0x3f, 0x4b, 0x31, 0xd7, - 0xff, 0xcb, 0x82, 0x89, 0x46, 0xe8, 0xd2, 0x09, 0xfa, 0x67, 0x69, 0x36, 0xea, 0xd9, 0xa6, 0x86, - 0x0e, 0xc8, 0x36, 0xf5, 0x0f, 0x2d, 0x18, 0x6e, 0x84, 0xee, 0x31, 0xb8, 0x13, 0x57, 0x4c, 0x77, - 0xe2, 0x53, 0x85, 0x92, 0xb7, 0x87, 0x07, 0xf1, 0x37, 0xaa, 0x30, 0x4e, 0x5b, 0x1c, 0x6e, 0xca, - 0xef, 0x65, 0x8c, 0x8d, 0x55, 0x62, 0x6c, 0xa8, 0x4a, 0x18, 0xfa, 0x7e, 0x78, 0x3f, 0xfb, 0xed, - 0x56, 0x18, 0x14, 0x0b, 0x2c, 0xba, 0x00, 0x23, 0xed, 0x88, 0xec, 0x78, 0x61, 0x27, 0xce, 0x5e, - 0x8e, 0x6b, 0x08, 0x38, 0x56, 0x14, 0xe8, 0x65, 0x18, 0x8b, 0xbd, 0xa0, 0x45, 0x64, 0xd8, 0xc1, - 0x00, 0x0b, 0x3b, 0xe0, 0x89, 0xfd, 0x34, 0x38, 0x36, 0xa8, 0xd0, 0x5d, 0xa8, 0xb1, 0xff, 0x6c, - 0x05, 0xf5, 0x9f, 0xa9, 0x9d, 0x67, 0xb3, 0x92, 0x0c, 0x70, 0xca, 0x0b, 0x5d, 0x02, 0x48, 0x64, - 0x80, 0x44, 0x2c, 0xb2, 0x72, 0x28, 0xbd, 0x54, 0x85, 0x4e, 0xc4, 0x58, 0xa3, 0x42, 0x2f, 0x40, - 0x2d, 0x71, 0x3c, 0xff, 0xba, 0x17, 0x90, 0x58, 0x04, 0x98, 0x88, 0x44, 0xba, 0x02, 0x88, 0x53, - 0x3c, 0xdd, 0xef, 0xd9, 0xd5, 0x5c, 0xfe, 0x0a, 0xc4, 0x08, 0xa3, 0x66, 0xfb, 0xfd, 0x75, 0x05, - 0xc5, 0x1a, 0x85, 0xfd, 0x12, 0xdb, 0xb7, 0xfb, 0x8c, 0xcf, 0xff, 0x71, 0x05, 0x50, 0x83, 0x05, - 0x62, 0x18, 0x0f, 0x70, 0x6c, 0xc1, 0x44, 0x4c, 0xae, 0x7b, 0x41, 0xe7, 0x81, 0x60, 0x55, 0xee, - 0x42, 0x44, 0x73, 0x59, 0x2f, 0xc3, 0x6f, 0xa3, 0x9a, 0x30, 0x9c, 0xe1, 0x4b, 0x87, 0x24, 0xea, - 0x04, 0x0b, 0xf1, 0xed, 0x98, 0x44, 0xe2, 0xa9, 0x0b, 0x36, 0x24, 0x58, 0x02, 0x71, 0x8a, 0xa7, - 0x53, 0x80, 0xfd, 0xb9, 0x19, 0x06, 0x38, 0x0c, 0x13, 0x39, 0x69, 0x58, 0xea, 0x73, 0x0d, 0x8e, - 0x0d, 0x2a, 0xb4, 0x02, 0x28, 0xee, 0xb4, 0xdb, 0x3e, 0x3b, 0xdb, 0x72, 0xfc, 0x2b, 0x51, 0xd8, - 0x69, 0xf3, 0x58, 0x5c, 0x91, 0x35, 0xbc, 0xd9, 0x85, 0xc5, 0x39, 0x25, 0xe8, 0x92, 0xdf, 0x88, - 0xd9, 0x6f, 0x71, 0xdb, 0x96, 0xfb, 0xd8, 0x9a, 0x0c, 0x84, 0x25, 0xce, 0xfe, 0x1a, 0xdb, 0xa6, - 0xd8, 0x1b, 0x04, 0x49, 0x27, 0x22, 0x68, 0x1b, 0xc6, 0xdb, 0x6c, 0x2b, 0x4a, 0xa2, 0xd0, 0xf7, - 0x89, 0xd4, 0x12, 0x0f, 0x17, 0x0a, 0xc2, 0xb3, 0x8e, 0xeb, 0xec, 0xb0, 0xc9, 0xdd, 0xfe, 0x9b, - 0xa3, 0x4c, 0xe2, 0x88, 0xe3, 0xc5, 0x61, 0x11, 0xf0, 0x29, 0xf4, 0xb1, 0x8f, 0x94, 0x79, 0xd3, - 0x27, 0x95, 0xe6, 0x22, 0x7c, 0x14, 0x4b, 0x2e, 0xe8, 0x0b, 0x2c, 0x9c, 0x99, 0x2f, 0xf3, 0xf2, - 0x0f, 0x6d, 0x71, 0x7a, 0x23, 0x94, 0x59, 0xb0, 0xc0, 0x1a, 0x3b, 0x74, 0x1d, 0xc6, 0x45, 0xca, - 0x7a, 0xe1, 0x24, 0xa8, 0x1a, 0x86, 0xf2, 0x38, 0xd6, 0x91, 0x0f, 0xb3, 0x00, 0x6c, 0x16, 0x46, - 0x9b, 0xf0, 0xa4, 0xf6, 0x38, 0x4e, 0x4e, 0xd8, 0x12, 0x97, 0x1f, 0x4f, 0xed, 0xef, 0xcd, 0x3e, - 0xb9, 0x76, 0x10, 0x21, 0x3e, 0x98, 0x0f, 0xba, 0x05, 0xa7, 0x9d, 0x56, 0xe2, 0xed, 0x90, 0x3a, - 0x71, 0x5c, 0xdf, 0x0b, 0x88, 0x79, 0x25, 0xfb, 0xf1, 0xfd, 0xbd, 0xd9, 0xd3, 0x0b, 0x79, 0x04, - 0x38, 0xbf, 0x1c, 0xfa, 0x14, 0xd4, 0xdc, 0x20, 0x16, 0x63, 0x30, 0x64, 0xbc, 0x03, 0x54, 0xab, - 0xdf, 0x6c, 0xaa, 0xfe, 0xa7, 0x7f, 0x70, 0x5a, 0x00, 0xbd, 0xc3, 0x9f, 0x54, 0x56, 0x36, 0x09, - 0x7f, 0x7f, 0xea, 0xd5, 0x52, 0x56, 0xb0, 0x71, 0x55, 0x82, 0xfb, 0xcf, 0x54, 0x78, 0xa0, 0x71, - 0x8b, 0xc2, 0xa8, 0x02, 0x7d, 0x16, 0x50, 0x4c, 0xa2, 0x1d, 0xaf, 0x45, 0x16, 0x5a, 0x2c, 0xa7, - 0x25, 0x3b, 0xa8, 0x1b, 0x31, 0x62, 0xe4, 0x51, 0xb3, 0x8b, 0x02, 0xe7, 0x94, 0x42, 0x57, 0xa9, - 0xe4, 0xd1, 0xa1, 0x22, 0x9a, 0x53, 0xaa, 0x77, 0xd3, 0x75, 0xd2, 0x8e, 0x48, 0xcb, 0x49, 0x88, - 0x6b, 0x72, 0xc4, 0x99, 0x72, 0x74, 0x77, 0x51, 0xa9, 0xc5, 0xc1, 0x8c, 0x41, 0xec, 0x4e, 0x2f, - 0x4e, 0xad, 0xa5, 0xad, 0x30, 0x4e, 0x6e, 0x92, 0xe4, 0x7e, 0x18, 0xdd, 0x63, 0x7e, 0xf7, 0x11, - 0x2d, 0x45, 0x58, 0x8a, 0xc2, 0x3a, 0x1d, 0xd5, 0x84, 0xd8, 0x81, 0xcf, 0x6a, 0x9d, 0x79, 0xd3, - 0x47, 0xd2, 0xb5, 0x73, 0x95, 0x83, 0xb1, 0xc4, 0x4b, 0xd2, 0xd5, 0xc6, 0x12, 0xf3, 0x8c, 0x67, - 0x48, 0x57, 0x1b, 0x4b, 0x58, 0xe2, 0x51, 0xd8, 0xfd, 0xda, 0xd2, 0x44, 0x99, 0x53, 0x8a, 0x6e, - 0x49, 0x5e, 0xf2, 0xc1, 0xa5, 0x07, 0x30, 0xa5, 0x5e, 0x7c, 0xe2, 0xb9, 0x1b, 0xe3, 0xe9, 0xc9, - 0x32, 0x0f, 0x3a, 0xe7, 0xa6, 0x80, 0x54, 0xe1, 0xbb, 0xab, 0x19, 0x9e, 0xb8, 0xab, 0x16, 0x23, - 0xb5, 0xc0, 0x54, 0x61, 0xba, 0xf8, 0x79, 0xa8, 0xc5, 0x9d, 0x75, 0x37, 0xdc, 0x76, 0xbc, 0x80, - 0xb9, 0xaf, 0xf5, 0xe7, 0x89, 0x25, 0x02, 0xa7, 0x34, 0xa8, 0x01, 0x23, 0x8e, 0x7c, 0x99, 0x1b, - 0x95, 0xb9, 0x7a, 0xac, 0x9e, 0xe4, 0x66, 0xbe, 0x4d, 0xf5, 0x16, 0xb7, 0xe2, 0x32, 0xf3, 0x69, - 0x38, 0xd1, 0xb5, 0x4a, 0xfa, 0x8a, 0x60, 0xfb, 0x37, 0x03, 0x50, 0x53, 0xae, 0x22, 0x34, 0x6f, - 0x7a, 0x05, 0x1f, 0xcf, 0x7a, 0x05, 0x47, 0xe8, 0x9e, 0xae, 0x3b, 0x02, 0xbf, 0x98, 0xf3, 0xc2, - 0xe9, 0xf3, 0x85, 0xd3, 0xa2, 0xfc, 0x85, 0x92, 0x3e, 0xde, 0x81, 0x4d, 0xcd, 0x85, 0x81, 0x03, - 0xcd, 0x85, 0x92, 0x8f, 0x38, 0x51, 0xc3, 0xa0, 0x1d, 0xba, 0xab, 0x8d, 0xec, 0x1b, 0x25, 0x0d, - 0x0a, 0xc4, 0x1c, 0xc7, 0x14, 0x3a, 0x2a, 0xe6, 0x99, 0x42, 0x37, 0x7c, 0x48, 0x85, 0x4e, 0x32, - 0xc0, 0x29, 0x2f, 0xb4, 0x03, 0x27, 0x5a, 0xe6, 0x93, 0x33, 0xea, 0x9a, 0xc8, 0x8b, 0x7d, 0x3c, - 0xf9, 0xd2, 0xd1, 0xd2, 0xeb, 0x2f, 0x65, 0xf9, 0xe1, 0xee, 0x2a, 0xd0, 0x6b, 0x30, 0xf2, 0x4e, - 0x18, 0x2f, 0xf9, 0x4e, 0x1c, 0x0b, 0x59, 0x27, 0x43, 0xf2, 0x47, 0xde, 0xb8, 0xd5, 0x64, 0xf0, - 0x87, 0xfc, 0x0d, 0x7a, 0xf9, 0x17, 0xab, 0x02, 0xf6, 0x6f, 0x73, 0xb7, 0x94, 0x30, 0x54, 0x49, - 0xdc, 0xf1, 0x8f, 0x23, 0x83, 0xf5, 0x2d, 0xc3, 0x86, 0x7e, 0x04, 0x8e, 0xd1, 0x7f, 0x67, 0x31, - 0xc7, 0xe8, 0x1a, 0xd9, 0x6e, 0xfb, 0x4e, 0x72, 0x1c, 0xb1, 0x85, 0x5f, 0x80, 0x91, 0x44, 0xd4, - 0x56, 0x2e, 0xfd, 0xb6, 0xd6, 0x3c, 0xe6, 0x30, 0x56, 0x62, 0x4a, 0x42, 0xb1, 0x62, 0x68, 0xff, - 0x73, 0xfe, 0x55, 0x24, 0xe6, 0x18, 0xac, 0xbf, 0x9b, 0xa6, 0xf5, 0xf7, 0x5c, 0xe9, 0xbe, 0xf4, - 0xb0, 0x02, 0x7f, 0x60, 0xf6, 0x80, 0x69, 0x93, 0x3f, 0x3d, 0x9e, 0x7b, 0xfb, 0x16, 0x98, 0x4f, - 0xf3, 0xa0, 0xd7, 0x79, 0xb4, 0x2e, 0x17, 0xb2, 0x17, 0xfa, 0x8e, 0xd4, 0xb5, 0x7f, 0xbd, 0x02, - 0xa7, 0xb8, 0xef, 0x6e, 0x61, 0x27, 0xf4, 0xdc, 0x46, 0xe8, 0x8a, 0xd8, 0x65, 0x17, 0xc6, 0xda, - 0x9a, 0xb6, 0x5f, 0x2e, 0x31, 0x83, 0x6e, 0x1f, 0xa4, 0x1a, 0x96, 0x0e, 0xc5, 0x06, 0x57, 0x5a, - 0x0b, 0xd9, 0xf1, 0x5a, 0xca, 0x15, 0x54, 0xe9, 0x5b, 0xee, 0xa9, 0x5a, 0x96, 0x35, 0x3e, 0xd8, - 0xe0, 0x7a, 0x04, 0x99, 0xe2, 0xed, 0x5f, 0xb5, 0xe0, 0xb1, 0x1e, 0xc9, 0x1b, 0x68, 0x75, 0xf7, - 0x99, 0xbf, 0x54, 0xbc, 0xfd, 0xa4, 0xaa, 0xe3, 0x5e, 0x54, 0x2c, 0xb0, 0x68, 0x1d, 0x80, 0x7b, - 0x41, 0xd9, 0x2b, 0xbb, 0x95, 0x32, 0x41, 0x0b, 0x5d, 0x97, 0xa4, 0xb5, 0xfb, 0xb3, 0xea, 0x5d, - 0x5d, 0x8d, 0xab, 0xfd, 0x9d, 0x2a, 0x0c, 0xf2, 0x87, 0x3e, 0x1b, 0x30, 0xbc, 0xc5, 0x53, 0x48, - 0xf6, 0x97, 0xc1, 0x32, 0xd5, 0xe6, 0x38, 0x00, 0x4b, 0x36, 0xe8, 0x06, 0x9c, 0xa4, 0xaa, 0x83, - 0xe7, 0xf8, 0x75, 0xe2, 0x3b, 0xbb, 0xd2, 0x3c, 0xe0, 0xe9, 0xc3, 0x65, 0xa6, 0xdb, 0x93, 0xab, - 0xdd, 0x24, 0x38, 0xaf, 0x1c, 0x7a, 0xbd, 0x2b, 0xf7, 0x13, 0x4f, 0xcd, 0xa9, 0xae, 0x5d, 0x1d, - 0x9c, 0xff, 0x09, 0xbd, 0x06, 0xe3, 0xed, 0x2e, 0x43, 0x48, 0x7b, 0xc9, 0xd1, 0x34, 0x7e, 0x4c, - 0x5a, 0x54, 0x87, 0xa9, 0xb8, 0xc3, 0x8e, 0x90, 0xd7, 0xb6, 0x22, 0x12, 0x6f, 0x85, 0xbe, 0x2b, - 0x1e, 0x21, 0x53, 0x4a, 0x5f, 0x33, 0x83, 0xc7, 0x5d, 0x25, 0x28, 0x97, 0x0d, 0xc7, 0xf3, 0x3b, - 0x11, 0x49, 0xb9, 0x0c, 0x99, 0x5c, 0x56, 0x32, 0x78, 0xdc, 0x55, 0xc2, 0xfe, 0x13, 0x0b, 0x4e, - 0xe6, 0xc4, 0x59, 0xf0, 0xe8, 0xbf, 0x4d, 0x2f, 0x4e, 0x54, 0x92, 0x68, 0x2d, 0xfa, 0x8f, 0xc3, - 0xb1, 0xa2, 0xa0, 0xb3, 0x90, 0x5b, 0xb7, 0xd9, 0xf3, 0x4b, 0x71, 0x92, 0x2c, 0xb0, 0xfd, 0x65, - 0x72, 0x42, 0xe7, 0x60, 0xa0, 0x13, 0x13, 0xf9, 0x42, 0xbe, 0x12, 0x51, 0xcc, 0xa1, 0xc1, 0x30, - 0x54, 0xd9, 0xd9, 0x54, 0xbe, 0x04, 0x4d, 0xd9, 0xe1, 0xde, 0x04, 0x8e, 0xb3, 0xbf, 0x55, 0x85, - 0xc9, 0x4c, 0xbc, 0x15, 0x6d, 0xc8, 0x76, 0x18, 0x78, 0x49, 0xa8, 0xb2, 0x07, 0xf1, 0x67, 0x54, - 0x48, 0x7b, 0xeb, 0x86, 0x80, 0x63, 0x45, 0x81, 0x9e, 0x35, 0x5f, 0x5d, 0x4e, 0xdb, 0xbc, 0x58, - 0x37, 0x9e, 0x7e, 0x2b, 0x9b, 0xb8, 0xfe, 0x69, 0x18, 0x68, 0x87, 0xea, 0x19, 0x4f, 0x35, 0xe9, - 0xf1, 0x62, 0xbd, 0x11, 0x86, 0x3e, 0x66, 0x48, 0xf4, 0x8c, 0xe8, 0x7d, 0xc6, 0x91, 0x8a, 0x1d, - 0x37, 0x8c, 0xb5, 0x21, 0x78, 0x0e, 0x86, 0xef, 0x91, 0xdd, 0xc8, 0x0b, 0x36, 0xb3, 0x6e, 0xe4, - 0x6b, 0x1c, 0x8c, 0x25, 0xde, 0x4c, 0x4e, 0x3f, 0x7c, 0xc4, 0xc9, 0xe9, 0x47, 0x0a, 0x43, 0x46, - 0x7f, 0xc3, 0x82, 0x49, 0x96, 0x52, 0x4f, 0xdc, 0x68, 0xf5, 0xc2, 0xe0, 0x18, 0xb6, 0xc7, 0xa7, - 0x61, 0x30, 0xa2, 0x95, 0x66, 0xf3, 0x4b, 0xb3, 0x96, 0x60, 0x8e, 0x43, 0x4f, 0x88, 0x17, 0xf6, - 0xe9, 0x67, 0x1c, 0xe3, 0xf9, 0x7a, 0xd3, 0xa7, 0xf2, 0xd9, 0xf5, 0x04, 0x4c, 0xda, 0xbe, 0xc7, - 0x1b, 0x9d, 0xfa, 0x8d, 0x3e, 0x68, 0xd7, 0x13, 0x72, 0x1b, 0xf9, 0xa8, 0xae, 0x27, 0xe4, 0x33, - 0x3f, 0x58, 0x45, 0xfd, 0x6f, 0x15, 0x38, 0x9b, 0x5b, 0x2e, 0x3d, 0x90, 0x5a, 0x31, 0x0e, 0xa4, - 0x2e, 0x65, 0x0e, 0xa4, 0xec, 0x83, 0x4b, 0x3f, 0x9a, 0x23, 0xaa, 0xfc, 0x93, 0xa3, 0xea, 0x31, - 0x9e, 0x1c, 0x0d, 0x94, 0x55, 0x1d, 0x06, 0x0b, 0x54, 0x87, 0xdf, 0xb7, 0xe0, 0xf1, 0xdc, 0x21, - 0xfb, 0xc0, 0xdd, 0x07, 0xc9, 0x6d, 0x65, 0x0f, 0xc5, 0xfa, 0x17, 0xab, 0x3d, 0x7a, 0xc5, 0x54, - 0xec, 0xf3, 0x54, 0x0a, 0x31, 0x64, 0x2c, 0x94, 0xa2, 0x31, 0x2e, 0x81, 0x38, 0x0c, 0x2b, 0x2c, - 0x8a, 0xb5, 0xfb, 0x14, 0xbc, 0x91, 0xcb, 0x87, 0x5c, 0x50, 0x73, 0xa6, 0xc3, 0x4f, 0xbf, 0xa8, - 0x9b, 0xb9, 0x65, 0x81, 0xee, 0x6a, 0x46, 0x53, 0xf5, 0x30, 0x46, 0xd3, 0x58, 0xbe, 0xc1, 0x84, - 0x16, 0x60, 0x72, 0xdb, 0x0b, 0xd8, 0xbb, 0x73, 0xa6, 0x56, 0xa2, 0x2e, 0xb5, 0xdd, 0x30, 0xd1, - 0x38, 0x4b, 0x3f, 0xf3, 0x1a, 0x8c, 0x1f, 0xde, 0x27, 0xf3, 0x5e, 0x15, 0x3e, 0x7c, 0x80, 0x50, - 0xe0, 0xbb, 0x83, 0xf1, 0x5d, 0xb4, 0xdd, 0xa1, 0xeb, 0xdb, 0x34, 0xe0, 0xd4, 0x46, 0xc7, 0xf7, - 0x77, 0x59, 0x38, 0x07, 0x71, 0x25, 0x85, 0xd0, 0xf8, 0xd4, 0x8b, 0xb0, 0x2b, 0x39, 0x34, 0x38, - 0xb7, 0x24, 0xfa, 0x2c, 0xa0, 0x70, 0x9d, 0x25, 0x9d, 0x74, 0xd3, 0x8b, 0xc8, 0xec, 0x13, 0x54, - 0xd3, 0xa5, 0x7a, 0xab, 0x8b, 0x02, 0xe7, 0x94, 0xa2, 0xfa, 0x1f, 0x7b, 0x4c, 0x56, 0x35, 0x2b, - 0xa3, 0xff, 0x61, 0x1d, 0x89, 0x4d, 0x5a, 0x74, 0x05, 0x4e, 0x38, 0x3b, 0x8e, 0xc7, 0xd3, 0xc8, - 0x48, 0x06, 0x5c, 0x01, 0x54, 0x5e, 0x8f, 0x85, 0x2c, 0x01, 0xee, 0x2e, 0x83, 0xda, 0x86, 0x1b, - 0x8b, 0x27, 0x99, 0xfe, 0xd4, 0x21, 0x66, 0x70, 0x69, 0xc7, 0x96, 0xfd, 0xc7, 0x16, 0xdd, 0xfa, - 0x72, 0x9e, 0x3f, 0x33, 0xde, 0x36, 0xd7, 0xee, 0x98, 0x74, 0xbf, 0x6d, 0xce, 0x7c, 0xc6, 0x26, - 0x2d, 0x9f, 0x1a, 0x71, 0x1a, 0x15, 0x6a, 0x68, 0x9b, 0xe2, 0x6a, 0x95, 0xa2, 0x40, 0x77, 0x61, - 0xd8, 0xf5, 0x76, 0xbc, 0x38, 0x8c, 0x4a, 0xbc, 0x26, 0xdc, 0x15, 0x69, 0x98, 0x4a, 0xcb, 0x3a, - 0x67, 0x82, 0x25, 0x37, 0xfb, 0x97, 0x2b, 0x30, 0x2e, 0xeb, 0x7b, 0xa3, 0x13, 0x26, 0xce, 0x31, - 0x6c, 0xe8, 0x6f, 0x18, 0x1b, 0xfa, 0x7c, 0xb9, 0x7b, 0x66, 0xac, 0x71, 0x3d, 0x37, 0xf2, 0xcf, - 0x65, 0x36, 0xf2, 0x8b, 0xfd, 0x30, 0x3d, 0x78, 0x03, 0xff, 0x57, 0x16, 0x9c, 0x30, 0xe8, 0x8f, - 0x61, 0x1f, 0x69, 0x98, 0xfb, 0xc8, 0x0b, 0x7d, 0xf4, 0xa6, 0xc7, 0xfe, 0xf1, 0x9d, 0x4a, 0xa6, - 0x17, 0x6c, 0xdf, 0xf8, 0x2a, 0x0c, 0x6c, 0x39, 0x91, 0x5b, 0x2e, 0x9f, 0x5a, 0x57, 0xf1, 0xb9, - 0xab, 0x4e, 0xe4, 0x72, 0xe9, 0x7f, 0x41, 0x3d, 0xce, 0xe2, 0x44, 0x6e, 0x61, 0xa8, 0x34, 0xab, - 0x14, 0x5d, 0x86, 0xa1, 0xb8, 0x15, 0xb6, 0x55, 0x50, 0xda, 0x39, 0xfe, 0x70, 0x0b, 0x85, 0x3c, - 0xdc, 0x9b, 0x45, 0x66, 0x75, 0x14, 0x8c, 0x05, 0xfd, 0x0c, 0x81, 0x9a, 0xaa, 0xfa, 0x08, 0x83, - 0x72, 0xdf, 0xab, 0xc2, 0xc9, 0x9c, 0x99, 0x82, 0xbe, 0x66, 0x8c, 0xda, 0x6b, 0x7d, 0x4f, 0xb5, - 0xf7, 0x39, 0x6e, 0x5f, 0x63, 0x56, 0x92, 0x2b, 0xe6, 0xc6, 0x21, 0xaa, 0xbf, 0x1d, 0x93, 0x6c, - 0xf5, 0x14, 0x54, 0x5c, 0x3d, 0xad, 0xf6, 0x98, 0x06, 0x9f, 0x56, 0xa3, 0xda, 0x79, 0x84, 0xdf, - 0xf8, 0xdd, 0x01, 0x38, 0x95, 0x77, 0x95, 0x15, 0xfd, 0xbc, 0x95, 0x49, 0x97, 0xfe, 0x7a, 0xff, - 0xf7, 0x61, 0x79, 0x0e, 0x75, 0x91, 0xfe, 0x61, 0xce, 0x4c, 0xa0, 0x5e, 0x38, 0xda, 0xa2, 0x76, - 0x76, 0xbd, 0x21, 0xe2, 0x89, 0xef, 0xa5, 0x3c, 0xf8, 0xcc, 0x21, 0x9a, 0x22, 0x72, 0xe7, 0xc7, - 0x99, 0xeb, 0x0d, 0x12, 0x5c, 0x7c, 0xbd, 0x41, 0xb6, 0x61, 0x66, 0x13, 0x46, 0xb5, 0x7e, 0x1d, - 0xe1, 0x14, 0xf0, 0xe8, 0xd6, 0xa4, 0xb5, 0xfa, 0x08, 0xa7, 0xc1, 0x2f, 0x59, 0x90, 0x89, 0x38, - 0x51, 0xae, 0x18, 0xab, 0xa7, 0x2b, 0xe6, 0x1c, 0x0c, 0x44, 0xa1, 0x4f, 0xb2, 0x69, 0xbc, 0x71, - 0xe8, 0x13, 0xcc, 0x30, 0xea, 0x8d, 0xc6, 0x6a, 0xaf, 0x37, 0x1a, 0xa9, 0x6d, 0xee, 0x93, 0x1d, - 0x22, 0x1d, 0x23, 0x4a, 0x78, 0x5f, 0xa7, 0x40, 0xcc, 0x71, 0xf6, 0xef, 0x55, 0x61, 0x88, 0x7b, - 0x1f, 0x8e, 0x61, 0x77, 0x6e, 0x08, 0x47, 0x40, 0xa9, 0xeb, 0xa5, 0xbc, 0x55, 0x73, 0x75, 0x27, - 0x71, 0xf8, 0xc4, 0x52, 0x7d, 0x4c, 0x9d, 0x07, 0x68, 0xce, 0x18, 0x85, 0x99, 0x8c, 0x7d, 0x0b, - 0x9c, 0x87, 0x36, 0x26, 0x5b, 0x00, 0x31, 0x7b, 0x15, 0x8c, 0xf2, 0x10, 0xc9, 0xef, 0x5e, 0x2e, - 0xd5, 0x8e, 0xa6, 0x2a, 0xc6, 0x5b, 0x93, 0x66, 0xdd, 0x52, 0x08, 0xac, 0xf1, 0x9e, 0x79, 0x15, - 0x6a, 0x8a, 0xb8, 0x48, 0xf1, 0x1f, 0xd3, 0xa7, 0xe6, 0xff, 0x07, 0x93, 0x99, 0xba, 0xfa, 0xb2, - 0x1b, 0x7e, 0xd3, 0x82, 0x13, 0x5d, 0x8f, 0xcd, 0xa2, 0x77, 0x2d, 0x38, 0xe5, 0xe7, 0xb8, 0x9f, - 0xc4, 0x87, 0x3e, 0x8c, 0xe3, 0x4a, 0x19, 0x0d, 0x79, 0x58, 0x9c, 0x5b, 0x9b, 0x4c, 0xe7, 0x59, - 0xc9, 0x4f, 0xe7, 0x69, 0xff, 0xba, 0x05, 0xe2, 0x93, 0x1d, 0x83, 0x22, 0xb4, 0x6a, 0x2a, 0x42, - 0x1f, 0x29, 0x33, 0x0b, 0x7a, 0x68, 0x40, 0xbf, 0x6b, 0x01, 0xe2, 0x04, 0xd9, 0xc7, 0x01, 0xb9, - 0x37, 0x4f, 0xd3, 0xe0, 0xd3, 0x69, 0xa3, 0x30, 0x58, 0xa3, 0xea, 0x33, 0xd3, 0xbb, 0x7a, 0x54, - 0x2b, 0xbf, 0x61, 0xe8, 0x22, 0xe8, 0xaf, 0xfc, 0x0b, 0xaf, 0xfc, 0x24, 0x7b, 0xba, 0x31, 0x05, - 0x63, 0x9d, 0xc6, 0xfe, 0xed, 0x2a, 0x64, 0x83, 0x33, 0xd0, 0xdb, 0x30, 0xd6, 0x72, 0xda, 0xce, - 0xba, 0xe7, 0x7b, 0x89, 0x47, 0xe2, 0x72, 0x27, 0x4a, 0x4b, 0x5a, 0x09, 0xe1, 0x0f, 0xd6, 0x20, - 0xd8, 0xe0, 0x88, 0xe6, 0x00, 0xda, 0x91, 0xb7, 0xe3, 0xf9, 0x64, 0x93, 0xa9, 0x1f, 0x2c, 0x46, - 0x93, 0x1f, 0x8e, 0x48, 0x28, 0xd6, 0x28, 0x72, 0xa2, 0x01, 0xab, 0xc7, 0x11, 0x0d, 0x38, 0xd0, - 0x67, 0x34, 0xe0, 0x60, 0xa9, 0x68, 0x40, 0x0c, 0x67, 0xa4, 0x1b, 0x97, 0xfe, 0x5f, 0xf1, 0x7c, - 0xc2, 0xd3, 0xf7, 0x89, 0x18, 0xce, 0x99, 0xfd, 0xbd, 0xd9, 0x33, 0x38, 0x97, 0x02, 0xf7, 0x28, - 0x69, 0x77, 0xe0, 0x64, 0x93, 0x44, 0x1e, 0xcb, 0xaa, 0xe4, 0xa6, 0x0b, 0xf0, 0x8b, 0x50, 0x8b, - 0x32, 0x6b, 0xbf, 0xcf, 0x0b, 0x76, 0x5a, 0x1e, 0x0e, 0xb9, 0xd6, 0x53, 0x96, 0xf6, 0x5f, 0xac, - 0xc0, 0xb0, 0x08, 0x82, 0x3a, 0x86, 0xfd, 0xe4, 0x9a, 0x61, 0xed, 0x3d, 0x57, 0xb4, 0x82, 0x59, - 0xb3, 0x7a, 0xda, 0x79, 0xcd, 0x8c, 0x9d, 0xf7, 0x42, 0x39, 0x76, 0x07, 0x5b, 0x78, 0x3f, 0xac, - 0xc0, 0x84, 0x19, 0x14, 0x76, 0x0c, 0xc3, 0xf2, 0x26, 0x0c, 0xc7, 0x22, 0x62, 0xaa, 0x52, 0x26, - 0x58, 0x24, 0xfb, 0x89, 0x95, 0x49, 0x2f, 0x63, 0xa4, 0x24, 0xbb, 0xdc, 0xa0, 0xac, 0xea, 0x71, - 0x04, 0x65, 0xd9, 0xbf, 0xc3, 0x44, 0xac, 0x3e, 0x90, 0xc7, 0xb0, 0x45, 0xbc, 0x61, 0x0a, 0xe3, - 0x0b, 0xa5, 0x66, 0x84, 0x68, 0x5e, 0x8f, 0xad, 0xe2, 0x7b, 0x16, 0x8c, 0x0a, 0xc2, 0x63, 0xe8, - 0xc0, 0x67, 0xcd, 0x0e, 0x3c, 0x53, 0xaa, 0x03, 0x3d, 0x5a, 0xfe, 0x37, 0x2a, 0xaa, 0xe5, 0x0d, - 0xf1, 0x84, 0x6a, 0x61, 0x76, 0xc7, 0x91, 0x76, 0x14, 0x26, 0x61, 0x2b, 0xf4, 0xc5, 0x96, 0xff, - 0x44, 0x1a, 0x4c, 0xcf, 0xe1, 0x0f, 0xb5, 0xdf, 0x58, 0x51, 0xb3, 0x28, 0xf1, 0x30, 0x4a, 0xc4, - 0x86, 0x95, 0xf7, 0x80, 0xeb, 0xba, 0x7c, 0x20, 0x9b, 0xc2, 0xc4, 0x3d, 0x94, 0x7e, 0x1f, 0x86, - 0x4d, 0x63, 0xe3, 0x15, 0x27, 0xac, 0x71, 0x95, 0xe1, 0x9a, 0xac, 0x86, 0x41, 0xd3, 0xc5, 0x7a, - 0x53, 0xc0, 0xb1, 0xa2, 0xb0, 0x5f, 0x65, 0x12, 0x97, 0x0d, 0x4f, 0x7f, 0x01, 0xef, 0x7f, 0x61, - 0x48, 0x0d, 0x2c, 0xf3, 0x9c, 0xdc, 0x84, 0x41, 0xda, 0x45, 0x69, 0x1c, 0x96, 0x13, 0x6b, 0xb4, - 0x09, 0x7a, 0x78, 0x5a, 0x94, 0xc4, 0x98, 0xb3, 0x41, 0xa4, 0xcb, 0x2f, 0xff, 0x6a, 0x69, 0x49, - 0xd9, 0x87, 0x27, 0x9e, 0xa5, 0xc4, 0x61, 0x79, 0x40, 0x56, 0x1b, 0xd9, 0x8c, 0x9c, 0x4b, 0x12, - 0x81, 0x53, 0x1a, 0x34, 0x2f, 0x74, 0x77, 0xf3, 0x7d, 0x5d, 0xa9, 0xbb, 0xcb, 0x21, 0xd1, 0x94, - 0xf7, 0x8b, 0x30, 0xaa, 0x72, 0x92, 0x37, 0x78, 0x6a, 0xe9, 0x1a, 0xd7, 0x66, 0x96, 0x53, 0x30, - 0xd6, 0x69, 0xd0, 0x2a, 0x9c, 0x74, 0x55, 0x74, 0x6e, 0xa3, 0xb3, 0xee, 0x7b, 0x2d, 0x5a, 0x94, - 0xdf, 0x8f, 0x79, 0x6c, 0x7f, 0x6f, 0xf6, 0x64, 0xbd, 0x1b, 0x8d, 0xf3, 0xca, 0xa0, 0x35, 0x98, - 0x8c, 0x79, 0xee, 0x75, 0x19, 0x82, 0x29, 0x12, 0xd5, 0x3d, 0x2f, 0x0f, 0x04, 0x9a, 0x26, 0xfa, - 0x21, 0x03, 0x71, 0x99, 0x20, 0x83, 0x36, 0xb3, 0x2c, 0xd0, 0xeb, 0x30, 0xe1, 0xeb, 0xcf, 0x4a, - 0x35, 0x44, 0x90, 0xb2, 0x0a, 0x9d, 0x30, 0x1e, 0x9d, 0x6a, 0xe0, 0x0c, 0x35, 0x7a, 0x13, 0xa6, - 0x75, 0x88, 0xb8, 0xaf, 0xef, 0x04, 0x9b, 0x24, 0x16, 0x49, 0x9f, 0x9f, 0xd8, 0xdf, 0x9b, 0x9d, - 0xbe, 0xde, 0x83, 0x06, 0xf7, 0x2c, 0x8d, 0x2e, 0xc3, 0x98, 0x1c, 0x49, 0x2d, 0x60, 0x39, 0x0d, - 0xda, 0xd1, 0x70, 0xd8, 0xa0, 0x7c, 0x7f, 0xe7, 0x1e, 0x5f, 0xa5, 0x85, 0xb5, 0xad, 0x15, 0x7d, - 0x19, 0xc6, 0xf4, 0x36, 0x66, 0xf7, 0xcc, 0xe2, 0xa7, 0xba, 0xc4, 0x16, 0xad, 0x5a, 0xae, 0xe3, - 0xb0, 0xc1, 0xdb, 0xbe, 0x05, 0x43, 0xcd, 0xdd, 0xb8, 0x95, 0xf8, 0x8f, 0xea, 0x69, 0xe5, 0x16, - 0x4c, 0x66, 0xde, 0x20, 0x56, 0x8f, 0x59, 0x5b, 0x8f, 0xea, 0x31, 0x6b, 0xfb, 0xeb, 0x16, 0x0c, - 0xae, 0x39, 0x5e, 0xf1, 0x73, 0x09, 0x65, 0x9a, 0x8c, 0x5e, 0x81, 0x21, 0xb2, 0xb1, 0x41, 0x5a, - 0xf2, 0x71, 0xec, 0x27, 0xa5, 0x6a, 0xb3, 0xcc, 0xa0, 0x74, 0x69, 0xb2, 0xca, 0xf8, 0x5f, 0x2c, - 0x88, 0xed, 0x7f, 0x6b, 0x01, 0xac, 0x85, 0xbe, 0x3c, 0xd2, 0x29, 0x68, 0xc9, 0x62, 0xd7, 0xc3, - 0x0d, 0xcf, 0xe6, 0x3c, 0xdc, 0x80, 0x52, 0x86, 0x39, 0xcf, 0x36, 0xa8, 0xde, 0x54, 0x4b, 0xf5, - 0x66, 0xa0, 0x9f, 0xde, 0x7c, 0xd3, 0x02, 0x11, 0x6d, 0x53, 0x62, 0x26, 0xb8, 0x32, 0xd9, 0xba, - 0x91, 0x89, 0xe3, 0xf9, 0x32, 0x17, 0x5b, 0x44, 0xfe, 0x0d, 0x35, 0x37, 0x8d, 0xac, 0x1b, 0x06, - 0x57, 0x6a, 0xd8, 0x8f, 0x72, 0xf4, 0x0d, 0xa6, 0x47, 0x16, 0xb7, 0xab, 0xaf, 0x9c, 0x63, 0x2c, - 0x17, 0x39, 0x65, 0xac, 0x72, 0x4f, 0xe9, 0xb9, 0xc8, 0x25, 0x02, 0xa7, 0x34, 0xe8, 0x39, 0x18, - 0x8e, 0x3b, 0xeb, 0x8c, 0x3c, 0x13, 0x7a, 0xd3, 0xe4, 0x60, 0x2c, 0xf1, 0xf6, 0xcf, 0x21, 0x30, - 0xba, 0x66, 0xe4, 0xb9, 0xb2, 0x1e, 0x79, 0x9e, 0xab, 0xb7, 0x60, 0x84, 0x6c, 0xb7, 0x93, 0xdd, - 0xba, 0x17, 0x95, 0xcb, 0x38, 0xb8, 0x2c, 0xa8, 0xbb, 0xb9, 0x4b, 0x0c, 0x56, 0x1c, 0x7b, 0x64, - 0x2d, 0xab, 0x7e, 0x20, 0xb2, 0x96, 0x0d, 0xfc, 0x44, 0xb2, 0x96, 0xbd, 0x09, 0xc3, 0x9b, 0x5e, - 0x82, 0x49, 0x3b, 0x14, 0xf7, 0x19, 0x0b, 0xce, 0xc8, 0xae, 0x70, 0xe2, 0xee, 0x54, 0x44, 0x02, - 0x81, 0x25, 0x3b, 0xb4, 0x06, 0x43, 0xdc, 0xf6, 0x10, 0x89, 0xc0, 0x3e, 0x56, 0xc6, 0x4b, 0xd3, - 0x9d, 0x13, 0x4b, 0xc4, 0x57, 0x09, 0x5e, 0x32, 0x4b, 0xd9, 0xf0, 0xfb, 0xcf, 0x52, 0xa6, 0x72, - 0x8b, 0x8d, 0x3c, 0xaa, 0xdc, 0x62, 0x46, 0x8e, 0xb6, 0xda, 0x51, 0xe4, 0x68, 0xfb, 0xa6, 0x05, - 0xa7, 0xdb, 0x79, 0x19, 0x0e, 0x45, 0x96, 0xb0, 0x4f, 0x1f, 0x22, 0xe3, 0xa3, 0x51, 0x35, 0xbb, - 0x5f, 0x96, 0x4b, 0x86, 0xf3, 0x2b, 0x96, 0xc9, 0xde, 0x46, 0xdf, 0x7f, 0xb2, 0xb7, 0xa3, 0x4e, - 0x27, 0x96, 0xa6, 0x7e, 0x1b, 0x3f, 0x92, 0xd4, 0x6f, 0x13, 0x8f, 0x30, 0xf5, 0x9b, 0x96, 0xb4, - 0x6d, 0xf2, 0xd1, 0x26, 0x6d, 0xdb, 0x82, 0x51, 0x37, 0xbc, 0x1f, 0xdc, 0x77, 0x22, 0x77, 0xa1, - 0xb1, 0x2a, 0x72, 0x84, 0x15, 0x24, 0xa2, 0xa8, 0xa7, 0x05, 0x8c, 0x1a, 0xb8, 0x3b, 0x32, 0x45, - 0x62, 0x9d, 0xb5, 0x48, 0x5f, 0x77, 0xe2, 0x7d, 0xa6, 0xaf, 0x33, 0x92, 0xc0, 0xa1, 0xa3, 0x48, - 0x02, 0xf7, 0x36, 0xbb, 0x91, 0xbe, 0xe1, 0x6d, 0xde, 0x70, 0xda, 0xd3, 0x27, 0xcb, 0xd4, 0xb0, - 0x24, 0xc9, 0xbb, 0x6b, 0x50, 0x28, 0x9c, 0x32, 0xed, 0x4e, 0x33, 0x77, 0xea, 0xb8, 0xd3, 0xcc, - 0x9d, 0x3e, 0xc2, 0x34, 0x73, 0x67, 0x8e, 0x35, 0xcd, 0xdc, 0x63, 0x3f, 0x91, 0x34, 0x73, 0x7f, - 0x0e, 0xce, 0x1e, 0xfc, 0x39, 0xd2, 0x34, 0xc6, 0x8d, 0xd4, 0x65, 0x90, 0x49, 0x63, 0xcc, 0x54, - 0x1d, 0x8d, 0xaa, 0x74, 0xb6, 0xab, 0xef, 0x5a, 0xf0, 0x58, 0x8f, 0x64, 0x30, 0xa5, 0xef, 0x3d, - 0xb4, 0x61, 0xb2, 0x6d, 0x16, 0x2d, 0x7d, 0x53, 0xc9, 0x48, 0x3e, 0xa3, 0x62, 0xe8, 0x32, 0x08, - 0x9c, 0x65, 0xbf, 0xf8, 0x91, 0x1f, 0xbd, 0x77, 0xf6, 0x43, 0x3f, 0x7e, 0xef, 0xec, 0x87, 0xfe, - 0xf0, 0xbd, 0xb3, 0x1f, 0xfa, 0x99, 0xfd, 0xb3, 0xd6, 0x8f, 0xf6, 0xcf, 0x5a, 0x3f, 0xde, 0x3f, - 0x6b, 0xfd, 0xc9, 0xfe, 0x59, 0xeb, 0x9b, 0x7f, 0x7a, 0xf6, 0x43, 0x9f, 0xaf, 0xec, 0x5c, 0xfc, - 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x11, 0x03, 0x70, 0xb9, 0x1d, 0xb8, 0x00, 0x00, + // 10194 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x24, 0xc7, + 0x75, 0x98, 0x66, 0x17, 0x5f, 0xfb, 0xf0, 0x79, 0x7d, 0x1f, 0x04, 0x61, 0xf2, 0x70, 0x1c, 0x8a, + 0xd4, 0x91, 0x3c, 0x02, 0xba, 0x23, 0x29, 0x9e, 0x44, 0x85, 0x12, 0x80, 0x05, 0xee, 0xa0, 0x3b, + 0xdc, 0x2d, 0x7b, 0x71, 0x77, 0x94, 0xc4, 0x48, 0x1c, 0xec, 0x34, 0x80, 0xd1, 0xcd, 0xce, 0x2c, + 0x67, 0x66, 0x71, 0x07, 0x29, 0xaa, 0xb2, 0x65, 0x96, 0x5d, 0xa9, 0x28, 0x89, 0x52, 0x2e, 0x55, + 0xa5, 0xe2, 0xa4, 0xec, 0xa4, 0xca, 0x29, 0x25, 0xae, 0x7c, 0x28, 0x8a, 0x2d, 0xb9, 0xac, 0x24, + 0x95, 0xc4, 0x56, 0xe4, 0x7c, 0xb8, 0x94, 0x72, 0x55, 0xec, 0x58, 0x55, 0x88, 0x09, 0xa7, 0xf2, + 0x33, 0x3f, 0x92, 0x7f, 0x48, 0x2a, 0x49, 0xf5, 0xe7, 0x74, 0xcf, 0xee, 0x62, 0x66, 0xc1, 0x03, + 0x44, 0xb9, 0xf2, 0x6f, 0xf7, 0xbd, 0xd7, 0xaf, 0x3f, 0xa6, 0xfb, 0xf5, 0x7b, 0xaf, 0x5f, 0xbf, + 0x86, 0x4b, 0xf7, 0xaf, 0xc6, 0x73, 0x5e, 0x38, 0x7f, 0xbf, 0xbd, 0x41, 0xa2, 0x80, 0x24, 0x24, + 0x9e, 0x6f, 0xdd, 0xdf, 0x9a, 0x77, 0x5a, 0xde, 0xfc, 0xce, 0xe5, 0xf9, 0x2d, 0x12, 0x90, 0xc8, + 0x49, 0x88, 0x3b, 0xd7, 0x8a, 0xc2, 0x24, 0x44, 0x4f, 0x70, 0xea, 0xb9, 0x94, 0x7a, 0xae, 0x75, + 0x7f, 0x6b, 0xce, 0x69, 0x79, 0x73, 0x3b, 0x97, 0x67, 0x5e, 0xdc, 0xf2, 0x92, 0xed, 0xf6, 0xc6, + 0x5c, 0x23, 0x6c, 0xce, 0x6f, 0x85, 0x5b, 0xe1, 0x3c, 0x2b, 0xb4, 0xd1, 0xde, 0x64, 0xff, 0xd8, + 0x1f, 0xf6, 0x8b, 0x33, 0x9b, 0x79, 0x59, 0x54, 0xed, 0xb4, 0xbc, 0xa6, 0xd3, 0xd8, 0xf6, 0x02, + 0x12, 0xed, 0xca, 0xca, 0xe3, 0xf9, 0x26, 0x49, 0x9c, 0x2e, 0x4d, 0x98, 0x99, 0xef, 0x55, 0x2a, + 0x6a, 0x07, 0x89, 0xd7, 0x24, 0x1d, 0x05, 0x3e, 0x96, 0x57, 0x20, 0x6e, 0x6c, 0x93, 0xa6, 0xd3, + 0x51, 0xee, 0x4a, 0xef, 0x91, 0x89, 0x48, 0x1c, 0xb6, 0xa3, 0x46, 0x67, 0x5d, 0x97, 0xbb, 0x97, + 0x69, 0x27, 0x9e, 0x3f, 0xef, 0x05, 0x49, 0x9c, 0x44, 0xd9, 0x22, 0xf6, 0x1f, 0x5a, 0x70, 0x61, + 0xe1, 0x5e, 0x7d, 0xd9, 0x77, 0xe2, 0xc4, 0x6b, 0x2c, 0xfa, 0x61, 0xe3, 0x7e, 0x3d, 0x09, 0x23, + 0x72, 0x37, 0xf4, 0xdb, 0x4d, 0x52, 0x67, 0xf5, 0xa0, 0x4b, 0x30, 0xb2, 0xc3, 0xfe, 0xaf, 0x56, + 0xa7, 0xad, 0x0b, 0xd6, 0xc5, 0xca, 0xe2, 0xd4, 0x0f, 0xf7, 0x66, 0x3f, 0xb4, 0xbf, 0x37, 0x3b, + 0x72, 0x57, 0xc0, 0xb1, 0xa2, 0x40, 0xcf, 0xc2, 0xd0, 0x66, 0xbc, 0xbe, 0xdb, 0x22, 0xd3, 0x25, + 0x46, 0x3b, 0x21, 0x68, 0x87, 0x56, 0xea, 0x14, 0x8a, 0x05, 0x16, 0xcd, 0x43, 0xa5, 0xe5, 0x44, + 0x89, 0x97, 0x78, 0x61, 0x30, 0x5d, 0xbe, 0x60, 0x5d, 0x1c, 0x5c, 0x3c, 0x25, 0x48, 0x2b, 0x35, + 0x89, 0xc0, 0x29, 0x0d, 0x6d, 0x46, 0x44, 0x1c, 0xf7, 0x76, 0xe0, 0xef, 0x4e, 0x0f, 0x5c, 0xb0, + 0x2e, 0x8e, 0xa4, 0xcd, 0xc0, 0x02, 0x8e, 0x15, 0x85, 0xfd, 0xbd, 0x12, 0x8c, 0x2c, 0x6c, 0x6e, + 0x7a, 0x81, 0x97, 0xec, 0xa2, 0xb7, 0x61, 0x2c, 0x08, 0x5d, 0x22, 0xff, 0xb3, 0x5e, 0x8c, 0x5e, + 0x79, 0x7e, 0xee, 0xb0, 0x09, 0x35, 0x77, 0x4b, 0x2b, 0xb1, 0x38, 0xb5, 0xbf, 0x37, 0x3b, 0xa6, + 0x43, 0xb0, 0xc1, 0x11, 0xbd, 0x05, 0xa3, 0xad, 0xd0, 0x55, 0x15, 0x94, 0x58, 0x05, 0xcf, 0x1d, + 0x5e, 0x41, 0x2d, 0x2d, 0xb0, 0x38, 0xb9, 0xbf, 0x37, 0x3b, 0xaa, 0x01, 0xb0, 0xce, 0x0e, 0xf9, + 0x30, 0x49, 0xff, 0x06, 0x89, 0xa7, 0x6a, 0x28, 0xb3, 0x1a, 0x5e, 0xcc, 0xaf, 0x41, 0x2b, 0xb4, + 0x78, 0x7a, 0x7f, 0x6f, 0x76, 0x32, 0x03, 0xc4, 0x59, 0xd6, 0xf6, 0x97, 0x61, 0x62, 0x21, 0x49, + 0x9c, 0xc6, 0x36, 0x71, 0xf9, 0xf7, 0x45, 0x2f, 0xc3, 0x40, 0xe0, 0x34, 0x89, 0xf8, 0xfa, 0x17, + 0xc4, 0xb0, 0x0f, 0xdc, 0x72, 0x9a, 0xe4, 0x60, 0x6f, 0x76, 0xea, 0x4e, 0xe0, 0xbd, 0xd3, 0x16, + 0x73, 0x86, 0xc2, 0x30, 0xa3, 0x46, 0x57, 0x00, 0x5c, 0xb2, 0xe3, 0x35, 0x48, 0xcd, 0x49, 0xb6, + 0xc5, 0x6c, 0x40, 0xa2, 0x2c, 0x54, 0x15, 0x06, 0x6b, 0x54, 0xf6, 0xd7, 0x2c, 0xa8, 0x2c, 0xec, + 0x84, 0x9e, 0x5b, 0x0b, 0xdd, 0x18, 0xb5, 0x61, 0xb2, 0x15, 0x91, 0x4d, 0x12, 0x29, 0xd0, 0xb4, + 0x75, 0xa1, 0x7c, 0x71, 0xf4, 0xca, 0x95, 0x9c, 0x7e, 0x9b, 0x85, 0x96, 0x83, 0x24, 0xda, 0x5d, + 0x7c, 0x4c, 0x54, 0x3d, 0x99, 0xc1, 0xe2, 0x6c, 0x1d, 0xf6, 0x5f, 0x2b, 0xc1, 0xd9, 0x85, 0x2f, + 0xb7, 0x23, 0x52, 0xf5, 0xe2, 0xfb, 0xd9, 0xa5, 0xe0, 0x7a, 0xf1, 0xfd, 0x5b, 0xe9, 0x60, 0xa8, + 0x39, 0x58, 0x15, 0x70, 0xac, 0x28, 0xd0, 0x8b, 0x30, 0x4c, 0x7f, 0xdf, 0xc1, 0xab, 0xa2, 0xf7, + 0xa7, 0x05, 0xf1, 0x68, 0xd5, 0x49, 0x9c, 0x2a, 0x47, 0x61, 0x49, 0x83, 0xd6, 0x60, 0xb4, 0xc1, + 0x64, 0xc4, 0xd6, 0x5a, 0xe8, 0x12, 0xf6, 0x85, 0x2b, 0x8b, 0x2f, 0x50, 0xf2, 0xa5, 0x14, 0x7c, + 0xb0, 0x37, 0x3b, 0xcd, 0xdb, 0x26, 0x58, 0x68, 0x38, 0xac, 0x97, 0x47, 0xb6, 0x5a, 0x88, 0x03, + 0x8c, 0x13, 0x74, 0x59, 0x84, 0x17, 0xb5, 0x35, 0x35, 0xc8, 0xd6, 0xd4, 0x58, 0x8f, 0xf5, 0xf4, + 0xf7, 0x2d, 0x31, 0x26, 0x2b, 0x9e, 0x6f, 0x8a, 0x87, 0x2b, 0x00, 0x31, 0x69, 0x44, 0x24, 0xd1, + 0x46, 0x45, 0x7d, 0xe6, 0xba, 0xc2, 0x60, 0x8d, 0x8a, 0x2e, 0xfe, 0x78, 0xdb, 0x89, 0xd8, 0x6c, + 0x11, 0x63, 0xa3, 0x16, 0x7f, 0x5d, 0x22, 0x70, 0x4a, 0x63, 0x2c, 0xfe, 0x72, 0xee, 0xe2, 0xff, + 0x57, 0x16, 0x0c, 0x2f, 0x7a, 0x81, 0xeb, 0x05, 0x5b, 0xe8, 0x6d, 0x18, 0xa1, 0xd2, 0xdc, 0x75, + 0x12, 0x47, 0xac, 0xfb, 0x8f, 0xca, 0xc9, 0xa3, 0x0b, 0x65, 0x39, 0x7d, 0xe2, 0x39, 0x4a, 0x4d, + 0x27, 0xd1, 0xed, 0x8d, 0x2f, 0x91, 0x46, 0xb2, 0x46, 0x12, 0x27, 0xed, 0x4e, 0x0a, 0xc3, 0x8a, + 0x2b, 0xba, 0x03, 0x43, 0x89, 0x13, 0x6d, 0x91, 0x44, 0x2c, 0xfb, 0x9c, 0x45, 0xc9, 0x79, 0x60, + 0x3a, 0xe5, 0x48, 0xd0, 0x20, 0xa9, 0x80, 0x5c, 0x67, 0x4c, 0xb0, 0x60, 0x66, 0x37, 0x60, 0x6c, + 0xc9, 0x69, 0x39, 0x1b, 0x9e, 0xef, 0x25, 0x1e, 0x89, 0xd1, 0x47, 0xa0, 0xec, 0xb8, 0x2e, 0x5b, + 0x00, 0x95, 0xc5, 0xb3, 0xfb, 0x7b, 0xb3, 0xe5, 0x05, 0xd7, 0x3d, 0xd8, 0x9b, 0x05, 0x45, 0xb5, + 0x8b, 0x29, 0x05, 0x7a, 0x1e, 0x06, 0xdc, 0x28, 0x6c, 0x4d, 0x97, 0x18, 0xe5, 0x39, 0xba, 0x52, + 0xab, 0x51, 0xd8, 0xca, 0x90, 0x32, 0x1a, 0xfb, 0x77, 0x4b, 0x80, 0x96, 0x48, 0x6b, 0x7b, 0xa5, + 0x6e, 0x7c, 0xd3, 0x8b, 0x30, 0xd2, 0x0c, 0x03, 0x2f, 0x09, 0xa3, 0x58, 0x54, 0xc8, 0xe6, 0xc5, + 0x9a, 0x80, 0x61, 0x85, 0x45, 0x17, 0x60, 0xa0, 0x95, 0x2e, 0xef, 0x31, 0x29, 0x1a, 0xd8, 0xc2, + 0x66, 0x18, 0x4a, 0xd1, 0x8e, 0x49, 0x24, 0xe6, 0xb3, 0xa2, 0xb8, 0x13, 0x93, 0x08, 0x33, 0x4c, + 0x3a, 0x83, 0xe8, 0xdc, 0x12, 0xb3, 0x35, 0x33, 0x83, 0x28, 0x06, 0x6b, 0x54, 0xe8, 0x8b, 0x50, + 0xe1, 0xff, 0x30, 0xd9, 0x64, 0x53, 0x37, 0x57, 0x28, 0xdc, 0x0c, 0x1b, 0x8e, 0x9f, 0x1d, 0xfc, + 0x71, 0x36, 0xe3, 0x24, 0x23, 0x9c, 0xf2, 0x34, 0x66, 0xdc, 0x50, 0xee, 0x8c, 0xfb, 0xeb, 0x16, + 0xa0, 0x25, 0x2f, 0x70, 0x49, 0x74, 0x02, 0x5b, 0x67, 0x7f, 0x8b, 0xe1, 0xc7, 0xb4, 0x69, 0x61, + 0xb3, 0x15, 0x06, 0x24, 0x48, 0x96, 0xc2, 0xc0, 0xe5, 0xdb, 0xe9, 0x27, 0x60, 0x20, 0xa1, 0x55, + 0xf1, 0x66, 0x3d, 0x2b, 0x3f, 0x0b, 0xad, 0xe0, 0x60, 0x6f, 0xf6, 0x5c, 0x67, 0x09, 0xd6, 0x04, + 0x56, 0x06, 0x7d, 0x1c, 0x86, 0xe2, 0xc4, 0x49, 0xda, 0xb1, 0x68, 0xe8, 0x53, 0xb2, 0xa1, 0x75, + 0x06, 0x3d, 0xd8, 0x9b, 0x9d, 0x54, 0xc5, 0x38, 0x08, 0x8b, 0x02, 0xe8, 0x39, 0x18, 0x6e, 0x92, + 0x38, 0x76, 0xb6, 0xa4, 0x80, 0x9b, 0x14, 0x65, 0x87, 0xd7, 0x38, 0x18, 0x4b, 0x3c, 0x7a, 0x1a, + 0x06, 0x49, 0x14, 0x85, 0x91, 0x98, 0x11, 0xe3, 0x82, 0x70, 0x70, 0x99, 0x02, 0x31, 0xc7, 0xd9, + 0xff, 0xd9, 0x82, 0x49, 0xd5, 0x56, 0x5e, 0xd7, 0x09, 0x2c, 0x79, 0x17, 0xa0, 0x21, 0x3b, 0x18, + 0xb3, 0x85, 0xa6, 0xd5, 0xd1, 0x7d, 0xfa, 0x75, 0x0e, 0x68, 0x5a, 0x87, 0x02, 0xc5, 0x58, 0xe3, + 0x6b, 0xff, 0x1b, 0x0b, 0x4e, 0x67, 0xfa, 0x76, 0xd3, 0x8b, 0x13, 0xf4, 0x56, 0x47, 0xff, 0xe6, + 0x8a, 0xf5, 0x8f, 0x96, 0x66, 0xbd, 0x53, 0xf3, 0x45, 0x42, 0xb4, 0xbe, 0x61, 0x18, 0xf4, 0x12, + 0xd2, 0x94, 0xdd, 0x7a, 0xb1, 0x60, 0xb7, 0x78, 0xfb, 0xd2, 0xaf, 0xb4, 0x4a, 0x79, 0x60, 0xce, + 0xca, 0xfe, 0x5f, 0x16, 0x54, 0x96, 0xc2, 0x60, 0xd3, 0xdb, 0x5a, 0x73, 0x5a, 0x27, 0xf0, 0x7d, + 0xea, 0x30, 0xc0, 0xb8, 0xf3, 0x2e, 0x5c, 0xce, 0xeb, 0x82, 0x68, 0xd8, 0x1c, 0xdd, 0x53, 0xb9, + 0xb2, 0xa0, 0xc4, 0x14, 0x05, 0x61, 0xc6, 0x6c, 0xe6, 0x55, 0xa8, 0x28, 0x02, 0x34, 0x05, 0xe5, + 0xfb, 0x84, 0x6b, 0x92, 0x15, 0x4c, 0x7f, 0xa2, 0x33, 0x30, 0xb8, 0xe3, 0xf8, 0x6d, 0xb1, 0x78, + 0x31, 0xff, 0xf3, 0x89, 0xd2, 0x55, 0xcb, 0xfe, 0x65, 0xb6, 0x02, 0x45, 0x25, 0xcb, 0xc1, 0x8e, + 0x10, 0x0e, 0xef, 0x5a, 0x70, 0xc6, 0xef, 0x22, 0x94, 0xc4, 0x98, 0x1c, 0x45, 0x9c, 0x3d, 0x21, + 0x9a, 0x7d, 0xa6, 0x1b, 0x16, 0x77, 0xad, 0xcd, 0xfe, 0xbe, 0x05, 0x67, 0x54, 0xeb, 0x6e, 0x90, + 0xdd, 0x3a, 0xf1, 0x49, 0x23, 0x09, 0xa3, 0x0f, 0x48, 0xfb, 0xd0, 0x93, 0x7c, 0xa4, 0xb9, 0xa4, + 0x19, 0x15, 0x0c, 0xca, 0x37, 0xc8, 0x2e, 0x1b, 0x76, 0xfb, 0xb7, 0x2d, 0x18, 0x57, 0xcd, 0x3f, + 0x81, 0xe5, 0x71, 0xd3, 0x5c, 0x1e, 0x1f, 0x29, 0x38, 0xb7, 0x7a, 0x2c, 0x8c, 0x5f, 0x29, 0xc1, + 0x59, 0x45, 0x63, 0x6c, 0x1d, 0x1f, 0x90, 0xd1, 0xef, 0xaf, 0xbb, 0x37, 0xc8, 0xee, 0x7a, 0x48, + 0xf7, 0xfe, 0xee, 0xdd, 0x45, 0x97, 0x61, 0xd4, 0x25, 0x9b, 0x4e, 0xdb, 0x4f, 0x94, 0x8a, 0x3b, + 0xc8, 0x6d, 0x9f, 0x6a, 0x0a, 0xc6, 0x3a, 0x8d, 0xfd, 0x6b, 0xc0, 0x44, 0x47, 0xe2, 0xd0, 0x8f, + 0x46, 0x95, 0x09, 0xcd, 0x12, 0x19, 0xd3, 0x2d, 0x11, 0x61, 0x75, 0x3c, 0x0d, 0x83, 0x5e, 0x93, + 0x6e, 0x2f, 0x25, 0x73, 0xd7, 0x58, 0xa5, 0x40, 0xcc, 0x71, 0xe8, 0x19, 0x18, 0x6e, 0x84, 0xcd, + 0xa6, 0x13, 0xb8, 0xd3, 0x65, 0xa6, 0xde, 0x8c, 0xd2, 0x1d, 0x68, 0x89, 0x83, 0xb0, 0xc4, 0xa1, + 0x27, 0x60, 0xc0, 0x89, 0xb6, 0xe2, 0xe9, 0x01, 0x46, 0x33, 0x42, 0x6b, 0x5a, 0x88, 0xb6, 0x62, + 0xcc, 0xa0, 0x54, 0x6d, 0x79, 0x10, 0x46, 0xf7, 0xbd, 0x60, 0xab, 0xea, 0x45, 0x4c, 0x07, 0xd1, + 0xd4, 0x96, 0x7b, 0x0a, 0x83, 0x35, 0x2a, 0x54, 0x83, 0xc1, 0x56, 0x18, 0x25, 0xf1, 0xf4, 0x10, + 0x1b, 0xce, 0x17, 0x72, 0x67, 0x0f, 0xef, 0x77, 0x2d, 0x8c, 0x92, 0xb4, 0x2b, 0xf4, 0x5f, 0x8c, + 0x39, 0x23, 0xb4, 0x04, 0x65, 0x12, 0xec, 0x4c, 0x0f, 0x33, 0x7e, 0x1f, 0x3e, 0x9c, 0xdf, 0x72, + 0xb0, 0x73, 0xd7, 0x89, 0xd2, 0x45, 0xb4, 0x1c, 0xec, 0x60, 0x5a, 0x1a, 0x35, 0xa0, 0x22, 0xdd, + 0x0a, 0xf1, 0xf4, 0x48, 0x91, 0x09, 0x86, 0x05, 0x39, 0x26, 0xef, 0xb4, 0xbd, 0x88, 0x34, 0x49, + 0x90, 0xc4, 0xa9, 0x0e, 0x2f, 0xb1, 0x31, 0x4e, 0xf9, 0xa2, 0x06, 0x8c, 0x71, 0x55, 0x67, 0x2d, + 0x6c, 0x07, 0x49, 0x3c, 0x5d, 0x61, 0x4d, 0xce, 0x31, 0x92, 0xef, 0xa6, 0x25, 0x16, 0xcf, 0x08, + 0xf6, 0x63, 0x1a, 0x30, 0xc6, 0x06, 0x53, 0xf4, 0x16, 0x8c, 0xfb, 0xde, 0x0e, 0x09, 0x48, 0x1c, + 0xd7, 0xa2, 0x70, 0x83, 0x4c, 0x03, 0xeb, 0xcd, 0xd3, 0x79, 0x06, 0x63, 0xb8, 0x41, 0x16, 0x4f, + 0xed, 0xef, 0xcd, 0x8e, 0xdf, 0xd4, 0x4b, 0x63, 0x93, 0x19, 0xfa, 0x22, 0x4c, 0x50, 0xbd, 0xca, + 0x4b, 0xd9, 0x8f, 0x16, 0x67, 0x8f, 0xf6, 0xf7, 0x66, 0x27, 0xb0, 0x51, 0x1c, 0x67, 0xd8, 0xa1, + 0x75, 0xa8, 0xf8, 0xde, 0x26, 0x69, 0xec, 0x36, 0x7c, 0x32, 0x3d, 0xc6, 0x78, 0xe7, 0x2c, 0xb9, + 0x9b, 0x92, 0x9c, 0xeb, 0xb2, 0xea, 0x2f, 0x4e, 0x19, 0xa1, 0xbb, 0x70, 0x2e, 0x21, 0x51, 0xd3, + 0x0b, 0x1c, 0xaa, 0x58, 0x08, 0x45, 0x8b, 0x59, 0xe5, 0xe3, 0x6c, 0xd6, 0x9e, 0x17, 0x03, 0x7b, + 0x6e, 0xbd, 0x2b, 0x15, 0xee, 0x51, 0x1a, 0xdd, 0x86, 0x49, 0xb6, 0x9e, 0x6a, 0x6d, 0xdf, 0xaf, + 0x85, 0xbe, 0xd7, 0xd8, 0x9d, 0x9e, 0x60, 0x0c, 0x9f, 0x91, 0xb6, 0xf6, 0xaa, 0x89, 0xa6, 0x36, + 0x48, 0xfa, 0x0f, 0x67, 0x4b, 0x23, 0x1f, 0x26, 0x63, 0xd2, 0x68, 0x47, 0x5e, 0xb2, 0x4b, 0xe7, + 0x3e, 0x79, 0x98, 0x4c, 0x4f, 0x16, 0xb1, 0xa9, 0xea, 0x66, 0x21, 0xee, 0xe8, 0xc8, 0x00, 0x71, + 0x96, 0x35, 0x15, 0x15, 0x71, 0xe2, 0x7a, 0xc1, 0xf4, 0x14, 0x53, 0xa2, 0xd5, 0xfa, 0xaa, 0x53, + 0x20, 0xe6, 0x38, 0x66, 0xaa, 0xd2, 0x1f, 0xb7, 0xa9, 0xec, 0x3d, 0xc5, 0x08, 0x53, 0x53, 0x55, + 0x22, 0x70, 0x4a, 0x43, 0xf7, 0xab, 0x24, 0xd9, 0x9d, 0x46, 0x8c, 0x54, 0x2d, 0xb5, 0xf5, 0xf5, + 0xcf, 0x62, 0x0a, 0x47, 0x77, 0x61, 0x98, 0x04, 0x3b, 0x2b, 0x51, 0xd8, 0x9c, 0x3e, 0x5d, 0x44, + 0x06, 0x2c, 0x73, 0x62, 0xbe, 0x2b, 0xa4, 0xda, 0xb2, 0x00, 0x63, 0xc9, 0xcc, 0xde, 0x80, 0x09, + 0x25, 0x2e, 0xd8, 0xa8, 0xa3, 0x59, 0x18, 0xa4, 0x12, 0x51, 0x5a, 0x70, 0x15, 0xda, 0x35, 0x2a, + 0x28, 0x63, 0xcc, 0xe1, 0xac, 0x6b, 0xde, 0x97, 0xc9, 0xe2, 0x6e, 0x42, 0xb8, 0x26, 0x5f, 0xd6, + 0xba, 0x26, 0x11, 0x38, 0xa5, 0xb1, 0xff, 0x0f, 0xdf, 0x6b, 0x53, 0x99, 0x54, 0x40, 0x1e, 0x5f, + 0x82, 0x91, 0xed, 0x30, 0x4e, 0x28, 0x35, 0xab, 0x63, 0x30, 0xdd, 0x5d, 0xaf, 0x0b, 0x38, 0x56, + 0x14, 0xe8, 0x35, 0x18, 0x6f, 0xe8, 0x15, 0x88, 0x2d, 0xe2, 0xac, 0x28, 0x62, 0xd6, 0x8e, 0x4d, + 0x5a, 0x74, 0x15, 0x46, 0x98, 0x5b, 0xb3, 0x11, 0xfa, 0xc2, 0x66, 0x90, 0x3b, 0xde, 0x48, 0x4d, + 0xc0, 0x0f, 0xb4, 0xdf, 0x58, 0x51, 0x53, 0xcb, 0x8b, 0x36, 0x61, 0xb5, 0x26, 0xc4, 0xb8, 0xb2, + 0xbc, 0xae, 0x33, 0x28, 0x16, 0x58, 0xfb, 0x1f, 0x97, 0xb4, 0x51, 0xa6, 0x1a, 0x2f, 0x41, 0x9f, + 0x83, 0xe1, 0x07, 0x8e, 0x97, 0x78, 0xc1, 0x96, 0xd8, 0x99, 0x5f, 0x2a, 0x28, 0xd3, 0x59, 0xf1, + 0x7b, 0xbc, 0x28, 0xdf, 0x7f, 0xc4, 0x1f, 0x2c, 0x19, 0x52, 0xde, 0x51, 0x3b, 0x08, 0x28, 0xef, + 0x52, 0xff, 0xbc, 0x31, 0x2f, 0xca, 0x79, 0x8b, 0x3f, 0x58, 0x32, 0x44, 0x9b, 0x00, 0x72, 0x55, + 0x13, 0x57, 0xb8, 0x13, 0x3f, 0xd6, 0x0f, 0xfb, 0x75, 0x55, 0x7a, 0x71, 0x82, 0xee, 0x78, 0xe9, + 0x7f, 0xac, 0x71, 0xb6, 0x13, 0xa6, 0xe0, 0x74, 0x36, 0x0b, 0x7d, 0x9e, 0x2e, 0x2c, 0x27, 0x4a, + 0x88, 0xbb, 0x90, 0x64, 0x3d, 0xb2, 0x87, 0xeb, 0x69, 0xeb, 0x5e, 0x93, 0xe8, 0x8b, 0x50, 0x30, + 0xc1, 0x29, 0x3f, 0xfb, 0xbb, 0x65, 0x98, 0xee, 0xd5, 0x5c, 0x3a, 0x25, 0xc9, 0x43, 0x2f, 0x59, + 0xa2, 0x2a, 0x88, 0x65, 0x4e, 0xc9, 0x65, 0x01, 0xc7, 0x8a, 0x82, 0xce, 0x8d, 0xd8, 0xdb, 0x0a, + 0x1c, 0x5f, 0x4c, 0x5f, 0x35, 0x37, 0xea, 0x0c, 0x8a, 0x05, 0x96, 0xd2, 0x45, 0xc4, 0x89, 0x85, + 0x37, 0x5b, 0x9b, 0x43, 0x98, 0x41, 0xb1, 0xc0, 0xea, 0x16, 0xf0, 0x40, 0x8e, 0x05, 0x6c, 0x0c, + 0xd1, 0xe0, 0xa3, 0x1d, 0x22, 0xf4, 0x05, 0x80, 0x4d, 0x2f, 0xf0, 0xe2, 0x6d, 0xc6, 0x7d, 0xa8, + 0x6f, 0xee, 0x4a, 0xd5, 0x59, 0x51, 0x5c, 0xb0, 0xc6, 0x11, 0xbd, 0x02, 0xa3, 0x6a, 0x79, 0xae, + 0x56, 0xa7, 0x87, 0x4d, 0x0f, 0x68, 0x2a, 0xab, 0xaa, 0x58, 0xa7, 0xb3, 0xbf, 0x94, 0x9d, 0x2f, + 0x62, 0x55, 0x68, 0xe3, 0x6b, 0x15, 0x1d, 0xdf, 0xd2, 0xe1, 0xe3, 0x6b, 0xff, 0xa7, 0x32, 0x4c, + 0x1a, 0x95, 0xb5, 0xe3, 0x02, 0x12, 0xed, 0x0d, 0xba, 0x6d, 0x38, 0x09, 0x11, 0x6b, 0xf2, 0x52, + 0x3f, 0x8b, 0x46, 0xdf, 0x64, 0xe8, 0x5a, 0xe0, 0x9c, 0xd0, 0x36, 0x54, 0x7c, 0x27, 0x66, 0x36, + 0x34, 0x11, 0x6b, 0xb1, 0x3f, 0xb6, 0xa9, 0x6a, 0xef, 0xc4, 0x89, 0xb6, 0x8b, 0xf3, 0x5a, 0x52, + 0xe6, 0x74, 0xcf, 0xa3, 0x2a, 0x87, 0x3c, 0x42, 0x51, 0xcd, 0xa1, 0x7a, 0xc9, 0x2e, 0xe6, 0x38, + 0x74, 0x15, 0xc6, 0x22, 0xc2, 0x66, 0xca, 0x12, 0xd5, 0xaa, 0xd8, 0xd4, 0x1b, 0x4c, 0xd5, 0x2f, + 0xac, 0xe1, 0xb0, 0x41, 0x99, 0x6a, 0xdf, 0x43, 0x87, 0x68, 0xdf, 0xcf, 0xc1, 0x30, 0xfb, 0xa1, + 0x66, 0x85, 0xfa, 0x42, 0xab, 0x1c, 0x8c, 0x25, 0x3e, 0x3b, 0x89, 0x46, 0x0a, 0x4e, 0xa2, 0xe7, + 0x61, 0xa2, 0xea, 0x90, 0x66, 0x18, 0x2c, 0x07, 0x6e, 0x2b, 0xf4, 0x82, 0x04, 0x4d, 0xc3, 0x00, + 0xdb, 0x4f, 0xf8, 0x7a, 0x1f, 0xa0, 0x1c, 0xf0, 0x00, 0xd5, 0xa0, 0xed, 0xff, 0x6b, 0xc1, 0x78, + 0x95, 0xf8, 0x24, 0x21, 0xb7, 0x5b, 0xcc, 0xef, 0x82, 0x56, 0x00, 0x6d, 0x45, 0x4e, 0x83, 0xd4, + 0x48, 0xe4, 0x85, 0x6e, 0x9d, 0x34, 0xc2, 0x80, 0x9d, 0x3c, 0xd0, 0x0d, 0xf2, 0xdc, 0xfe, 0xde, + 0x2c, 0xba, 0xd6, 0x81, 0xc5, 0x5d, 0x4a, 0x20, 0x17, 0xc6, 0x5b, 0x11, 0x31, 0x1c, 0x45, 0x56, + 0xfe, 0x86, 0x5f, 0xd3, 0x8b, 0x70, 0x9d, 0xd4, 0x00, 0x61, 0x93, 0x29, 0xfa, 0x34, 0x4c, 0x85, + 0x51, 0x6b, 0xdb, 0x09, 0xaa, 0xa4, 0x45, 0x02, 0x97, 0x2a, 0xe2, 0xc2, 0x2b, 0x78, 0x66, 0x7f, + 0x6f, 0x76, 0xea, 0x76, 0x06, 0x87, 0x3b, 0xa8, 0xed, 0x5f, 0x2f, 0xc1, 0xd9, 0x6a, 0xf8, 0x20, + 0x78, 0xe0, 0x44, 0xee, 0x42, 0x6d, 0x95, 0x6b, 0xd7, 0xcc, 0xcb, 0x2a, 0xbd, 0xbb, 0x56, 0x4f, + 0xef, 0xee, 0xe7, 0x61, 0x64, 0xd3, 0x23, 0xbe, 0x8b, 0xc9, 0xa6, 0xe8, 0xde, 0xe5, 0x22, 0xee, + 0xef, 0x15, 0x5a, 0x46, 0x7a, 0x1a, 0xb8, 0x73, 0x79, 0x45, 0xb0, 0xc1, 0x8a, 0x21, 0x6a, 0xc3, + 0x94, 0x34, 0x1f, 0x24, 0x56, 0xac, 0x8e, 0x97, 0x8a, 0x59, 0x27, 0x66, 0x35, 0x6c, 0x3c, 0x70, + 0x86, 0x21, 0xee, 0xa8, 0x82, 0x9a, 0x7d, 0x4d, 0xba, 0x37, 0x0c, 0xb0, 0xb9, 0xc2, 0xcc, 0x3e, + 0x66, 0x97, 0x32, 0xa8, 0xfd, 0x77, 0x2d, 0x78, 0xac, 0x63, 0xb4, 0x84, 0xd1, 0xfe, 0xa6, 0xb4, + 0x96, 0xf9, 0x31, 0x55, 0x4e, 0x2b, 0xbb, 0x8e, 0x79, 0x31, 0xcb, 0xb9, 0x54, 0xc0, 0x72, 0xbe, + 0x0d, 0x67, 0x96, 0x9b, 0xad, 0x64, 0xb7, 0xea, 0x99, 0x4e, 0xe9, 0x57, 0x61, 0xa8, 0x49, 0x5c, + 0xaf, 0xdd, 0x14, 0x9f, 0x75, 0x56, 0x0a, 0xd2, 0x35, 0x06, 0x3d, 0xd8, 0x9b, 0x1d, 0xaf, 0x27, + 0x61, 0xe4, 0x6c, 0x11, 0x0e, 0xc0, 0x82, 0xdc, 0x7e, 0xcf, 0x82, 0x49, 0xb9, 0xa0, 0x16, 0x5c, + 0x37, 0x22, 0x71, 0x8c, 0x66, 0xa0, 0xe4, 0xb5, 0x04, 0x23, 0x10, 0x8c, 0x4a, 0xab, 0x35, 0x5c, + 0xf2, 0x5a, 0xe8, 0x73, 0x50, 0xe1, 0x67, 0x19, 0xe9, 0xe4, 0xe8, 0xf3, 0x6c, 0x84, 0x99, 0x34, + 0xeb, 0x92, 0x07, 0x4e, 0xd9, 0x49, 0xb5, 0x92, 0x89, 0xea, 0xb2, 0xe9, 0x59, 0xbf, 0x2e, 0xe0, + 0x58, 0x51, 0xa0, 0x8b, 0x30, 0x12, 0x84, 0x2e, 0x3f, 0x6e, 0xe2, 0x9b, 0x2e, 0x9b, 0x72, 0xb7, + 0x04, 0x0c, 0x2b, 0xac, 0xfd, 0x75, 0x0b, 0xc6, 0x64, 0x1f, 0x0b, 0x6a, 0xb8, 0x74, 0x91, 0xa4, + 0xda, 0x6d, 0xba, 0x48, 0xa8, 0x86, 0xca, 0x30, 0x86, 0x62, 0x5a, 0xee, 0x47, 0x31, 0xb5, 0x7f, + 0xab, 0x04, 0x13, 0xb2, 0x39, 0xf5, 0xf6, 0x46, 0x4c, 0xe8, 0xbe, 0x5d, 0x71, 0xf8, 0xe0, 0x13, + 0x39, 0xcf, 0x5e, 0xcc, 0x33, 0x21, 0x8c, 0x6f, 0x96, 0xea, 0x05, 0x0b, 0x92, 0x0f, 0x4e, 0x59, + 0xa2, 0x1d, 0x38, 0x15, 0x84, 0x09, 0xdb, 0x0f, 0x14, 0xbe, 0x98, 0x2f, 0x38, 0x5b, 0xcf, 0xe3, + 0xa2, 0x9e, 0x53, 0xb7, 0xb2, 0xfc, 0x70, 0x67, 0x15, 0xe8, 0xb6, 0x74, 0x8d, 0x94, 0x59, 0x5d, + 0xcf, 0x17, 0xab, 0xab, 0xb7, 0x67, 0xc4, 0xfe, 0x81, 0x05, 0x15, 0x49, 0x76, 0x12, 0x87, 0x02, + 0xf7, 0x60, 0x38, 0x66, 0x9f, 0x48, 0x0e, 0xd7, 0xa5, 0x62, 0x5d, 0xe0, 0xdf, 0x35, 0xdd, 0x04, + 0xf9, 0xff, 0x18, 0x4b, 0x6e, 0xcc, 0xc5, 0xa9, 0x3a, 0xf2, 0x81, 0x73, 0x71, 0xaa, 0x96, 0xf5, + 0x72, 0x71, 0xb2, 0xd6, 0x6b, 0x46, 0x2c, 0xd5, 0xe4, 0x5a, 0x11, 0xd9, 0xf4, 0x1e, 0x66, 0x35, + 0xb9, 0x1a, 0x83, 0x62, 0x81, 0x45, 0x9b, 0x30, 0xd6, 0x90, 0xbe, 0xd1, 0x54, 0x84, 0x7c, 0xb4, + 0xa0, 0xc7, 0x55, 0x39, 0xda, 0x79, 0xf0, 0xc6, 0x92, 0xc6, 0x09, 0x1b, 0x7c, 0xed, 0x6f, 0x59, + 0x30, 0xc4, 0x5d, 0x63, 0xc5, 0xfc, 0x8b, 0x9a, 0x9b, 0x3f, 0xed, 0xf3, 0x5d, 0x0a, 0x14, 0x5e, + 0x7f, 0x74, 0x0f, 0x2a, 0xec, 0x07, 0x33, 0xf3, 0xcb, 0x45, 0xa2, 0x4d, 0x78, 0xfd, 0xa2, 0xc1, + 0x4c, 0xec, 0xdd, 0x95, 0x0c, 0x70, 0xca, 0xcb, 0xfe, 0x7e, 0x99, 0x8a, 0xa7, 0x94, 0xd4, 0xd8, + 0x7f, 0xad, 0x93, 0xd8, 0x7f, 0x4b, 0xc7, 0xbf, 0xff, 0xbe, 0x03, 0x93, 0x0d, 0xed, 0x40, 0x22, + 0xdd, 0xf5, 0xaf, 0x14, 0xfc, 0xf4, 0xda, 0x29, 0x06, 0x77, 0x05, 0x2d, 0x99, 0xec, 0x70, 0x96, + 0x3f, 0x22, 0x30, 0xc6, 0x8f, 0x7e, 0x45, 0x7d, 0x03, 0xac, 0xbe, 0xf9, 0x5c, 0xaf, 0x13, 0x2f, + 0xa1, 0x2a, 0x63, 0x33, 0xad, 0xae, 0x31, 0xc2, 0x06, 0x5b, 0xfb, 0x6f, 0x0c, 0xc2, 0xe0, 0xf2, + 0x0e, 0x09, 0x92, 0x13, 0x10, 0x47, 0x4d, 0x98, 0xf0, 0x82, 0x9d, 0xd0, 0xdf, 0x21, 0x2e, 0xc7, + 0x1f, 0x6d, 0x0b, 0x3e, 0x27, 0x2a, 0x99, 0x58, 0x35, 0x98, 0xe1, 0x0c, 0xf3, 0xe3, 0x30, 0x7f, + 0xdf, 0x80, 0x21, 0x3e, 0x33, 0x84, 0xed, 0x9b, 0xe3, 0x2a, 0x66, 0x03, 0x2b, 0x56, 0x50, 0x6a, + 0xa4, 0x73, 0x2f, 0xb5, 0x60, 0x84, 0xbe, 0x04, 0x13, 0x9b, 0x5e, 0x14, 0x27, 0xd4, 0x82, 0x8d, + 0x13, 0xa7, 0xd9, 0x3a, 0x82, 0xe1, 0xab, 0x46, 0x64, 0xc5, 0xe0, 0x84, 0x33, 0x9c, 0xd1, 0x16, + 0x8c, 0x53, 0xbb, 0x2b, 0xad, 0x6a, 0xb8, 0xef, 0xaa, 0x94, 0xdf, 0xeb, 0xa6, 0xce, 0x08, 0x9b, + 0x7c, 0xa9, 0x48, 0x6a, 0x30, 0x3b, 0x6d, 0x84, 0x69, 0x20, 0x4a, 0x24, 0x71, 0x03, 0x8d, 0xe3, + 0xa8, 0x64, 0x63, 0xe7, 0xfd, 0x15, 0x53, 0xb2, 0xa5, 0xa7, 0xfa, 0xf6, 0x77, 0xe8, 0x7e, 0x49, + 0xc7, 0xf0, 0x04, 0xb6, 0x98, 0xeb, 0xe6, 0x16, 0xf3, 0x74, 0x81, 0x2f, 0xdb, 0x63, 0x7b, 0x79, + 0x1b, 0x46, 0xb5, 0x0f, 0x8f, 0xe6, 0xa1, 0xd2, 0x90, 0x47, 0xd2, 0x42, 0x8a, 0x2b, 0x75, 0x47, + 0x9d, 0x55, 0xe3, 0x94, 0x86, 0x8e, 0x0b, 0x55, 0x13, 0xb3, 0x01, 0x2c, 0x54, 0x89, 0xc4, 0x0c, + 0x63, 0xbf, 0x04, 0xb0, 0xfc, 0x90, 0x34, 0x16, 0x1a, 0x2c, 0x6e, 0x42, 0x3b, 0x3a, 0xb2, 0x7a, + 0x1f, 0x1d, 0xd9, 0xdf, 0xb6, 0x60, 0x62, 0x65, 0xc9, 0xd0, 0xbb, 0xe7, 0x00, 0xb8, 0xfe, 0x7a, + 0xef, 0xde, 0x2d, 0xe9, 0x94, 0xe5, 0x9e, 0x33, 0x05, 0xc5, 0x1a, 0x05, 0x7a, 0x1c, 0xca, 0x7e, + 0x3b, 0x10, 0x6a, 0xe5, 0xf0, 0xfe, 0xde, 0x6c, 0xf9, 0x66, 0x3b, 0xc0, 0x14, 0xa6, 0x45, 0x8a, + 0x94, 0x0b, 0x47, 0x8a, 0xe4, 0xc7, 0x4c, 0x7e, 0xb3, 0x0c, 0x53, 0x2b, 0x3e, 0x79, 0x68, 0xb4, + 0xfa, 0x59, 0x18, 0x72, 0x23, 0x6f, 0x87, 0x44, 0xd9, 0xcd, 0xba, 0xca, 0xa0, 0x58, 0x60, 0x0b, + 0x07, 0xaf, 0x18, 0x81, 0x3b, 0xe5, 0x63, 0x0e, 0xdc, 0xc9, 0xed, 0x33, 0xda, 0x84, 0xe1, 0x90, + 0x9b, 0xfd, 0xd3, 0x83, 0x6c, 0x2a, 0xbe, 0x76, 0x78, 0x63, 0xb2, 0xe3, 0x33, 0x27, 0x9c, 0x06, + 0x3c, 0x6c, 0x40, 0xc9, 0x32, 0x01, 0xc5, 0x92, 0xf9, 0xcc, 0x27, 0x60, 0x4c, 0xa7, 0xec, 0x2b, + 0x7e, 0xe0, 0xe7, 0x2d, 0x38, 0xbd, 0xe2, 0x87, 0x8d, 0xfb, 0x99, 0xe8, 0xa2, 0x57, 0x60, 0x94, + 0x2e, 0xa6, 0xd8, 0x08, 0xbd, 0x33, 0x62, 0x0c, 0x05, 0x0a, 0xeb, 0x74, 0x5a, 0xb1, 0x3b, 0x77, + 0x56, 0xab, 0xdd, 0x42, 0x13, 0x05, 0x0a, 0xeb, 0x74, 0xf6, 0xef, 0x5b, 0xf0, 0xe4, 0xb5, 0xa5, + 0xe5, 0x1a, 0x89, 0x62, 0x2f, 0x4e, 0x48, 0x90, 0x74, 0x44, 0x47, 0x52, 0xbd, 0xce, 0xd5, 0x9a, + 0x92, 0xea, 0x75, 0x55, 0xd6, 0x0a, 0x81, 0xfd, 0xa0, 0x84, 0x08, 0x7f, 0xcb, 0x82, 0xd3, 0xd7, + 0xbc, 0x04, 0x93, 0x56, 0x98, 0x0d, 0x68, 0x8c, 0x48, 0x2b, 0x8c, 0xbd, 0x24, 0x8c, 0x76, 0xb3, + 0x01, 0x8d, 0x58, 0x61, 0xb0, 0x46, 0xc5, 0x6b, 0xde, 0xf1, 0x62, 0xda, 0xd2, 0x92, 0x69, 0x8e, + 0x62, 0x01, 0xc7, 0x8a, 0x82, 0x76, 0xcc, 0xf5, 0x22, 0xa6, 0x32, 0xec, 0x8a, 0x15, 0xac, 0x3a, + 0x56, 0x95, 0x08, 0x9c, 0xd2, 0xd8, 0x7f, 0xd3, 0x82, 0xb3, 0xd7, 0xfc, 0x76, 0x9c, 0x90, 0x68, + 0x33, 0x36, 0x1a, 0xfb, 0x12, 0x54, 0x88, 0x54, 0xc0, 0x45, 0x5b, 0xd5, 0xa6, 0xa1, 0x34, 0x73, + 0x1e, 0x4d, 0xa9, 0xe8, 0x0a, 0x04, 0xed, 0xf5, 0x17, 0x62, 0xf6, 0xdb, 0x25, 0x18, 0xbf, 0xbe, + 0xbe, 0x5e, 0xbb, 0x46, 0x12, 0x21, 0x25, 0xf3, 0x1d, 0x47, 0x35, 0xcd, 0x6a, 0xd6, 0xf6, 0x96, + 0xcc, 0xaa, 0x6b, 0x27, 0x9e, 0x3f, 0xc7, 0x83, 0xd7, 0xe7, 0x56, 0x83, 0xe4, 0x76, 0x54, 0x4f, + 0x22, 0x2f, 0xd8, 0xea, 0x6a, 0x65, 0x4b, 0x49, 0x5e, 0xee, 0x25, 0xc9, 0xd1, 0x4b, 0x30, 0xc4, + 0xe2, 0xed, 0xa5, 0xea, 0xf1, 0x33, 0x4a, 0x4b, 0x60, 0xd0, 0x83, 0xbd, 0xd9, 0xca, 0x1d, 0xbc, + 0xca, 0xff, 0x60, 0x41, 0x8a, 0xbe, 0x08, 0xa3, 0xdb, 0x49, 0xd2, 0xba, 0x4e, 0x1c, 0x97, 0x44, + 0x52, 0x4a, 0x5c, 0x3c, 0x5c, 0x4a, 0xd0, 0xc1, 0xe0, 0x05, 0xd2, 0x85, 0x95, 0xc2, 0x62, 0xac, + 0x73, 0xb4, 0xeb, 0x00, 0x29, 0xee, 0x11, 0x59, 0x20, 0xf6, 0xcf, 0x95, 0x60, 0xf8, 0xba, 0x13, + 0xb8, 0x3e, 0x89, 0xd0, 0x0a, 0x0c, 0x90, 0x87, 0xa4, 0x21, 0xb6, 0xf1, 0x9c, 0xa6, 0xa7, 0x5b, + 0x1d, 0xf7, 0x7c, 0xd1, 0xff, 0x98, 0x95, 0x47, 0x18, 0x86, 0x69, 0xbb, 0xaf, 0xa9, 0x48, 0xd7, + 0x17, 0xf2, 0x47, 0x41, 0x4d, 0x09, 0xbe, 0x4f, 0x0a, 0x10, 0x96, 0x8c, 0x98, 0x8f, 0xa8, 0xd1, + 0xaa, 0x53, 0xe1, 0x96, 0x14, 0x0b, 0x6a, 0x5f, 0x5f, 0xaa, 0x71, 0x72, 0xc1, 0x97, 0xfb, 0x88, + 0x24, 0x10, 0xa7, 0xec, 0xec, 0xab, 0x70, 0x86, 0x1d, 0x31, 0x3a, 0xc9, 0xb6, 0xb1, 0x66, 0x72, + 0x27, 0xa7, 0xfd, 0xb7, 0x4b, 0x70, 0x6a, 0xb5, 0xbe, 0x54, 0x37, 0xbd, 0x7b, 0x57, 0x61, 0x8c, + 0x6f, 0xcf, 0x74, 0xd2, 0x39, 0xbe, 0x28, 0xaf, 0xdc, 0xe2, 0xeb, 0x1a, 0x0e, 0x1b, 0x94, 0xe8, + 0x49, 0x28, 0x7b, 0xef, 0x04, 0xd9, 0x18, 0xa6, 0xd5, 0x37, 0x6e, 0x61, 0x0a, 0xa7, 0x68, 0xba, + 0xd3, 0x73, 0x11, 0xa7, 0xd0, 0x6a, 0xb7, 0x7f, 0x1d, 0x26, 0xbc, 0xb8, 0x11, 0x7b, 0xab, 0x01, + 0x5d, 0xff, 0x4e, 0x43, 0x4e, 0xdf, 0x54, 0x35, 0xa7, 0x4d, 0x55, 0x58, 0x9c, 0xa1, 0xd6, 0xe4, + 0xed, 0x60, 0x61, 0x6d, 0x21, 0x3f, 0xe4, 0xf5, 0x4b, 0x50, 0x51, 0xe1, 0x3e, 0x32, 0x48, 0xcb, + 0xea, 0x1e, 0xa4, 0x55, 0x40, 0xe0, 0x48, 0x9f, 0x6b, 0xb9, 0xab, 0xcf, 0xf5, 0x1f, 0x58, 0x90, + 0x46, 0x36, 0x20, 0x0c, 0x95, 0x56, 0xc8, 0x0e, 0x34, 0x22, 0x79, 0x72, 0xf8, 0x4c, 0xce, 0x4c, + 0xe4, 0x2b, 0x81, 0xcf, 0x95, 0x9a, 0x2c, 0x8b, 0x53, 0x36, 0xe8, 0x26, 0x0c, 0xb7, 0x22, 0x52, + 0x4f, 0x58, 0xdc, 0x74, 0x1f, 0x1c, 0xd9, 0xac, 0xae, 0xf1, 0x92, 0x58, 0xb2, 0xb0, 0xff, 0xb9, + 0x05, 0x70, 0xd3, 0x6b, 0x7a, 0x09, 0x76, 0x82, 0x2d, 0x72, 0x02, 0xc6, 0xde, 0x2d, 0x18, 0x88, + 0x5b, 0xa4, 0x51, 0xec, 0x48, 0x2a, 0x6d, 0x59, 0xbd, 0x45, 0x1a, 0xe9, 0xe7, 0xa0, 0xff, 0x30, + 0xe3, 0x63, 0xff, 0x43, 0x80, 0x89, 0x94, 0x8c, 0x2a, 0xdc, 0xe8, 0x45, 0x23, 0x60, 0xf8, 0xf1, + 0x4c, 0xc0, 0x70, 0x85, 0x51, 0x6b, 0x31, 0xc2, 0x09, 0x94, 0x9b, 0xce, 0x43, 0xa1, 0xdf, 0xbf, + 0x52, 0xb4, 0x41, 0xb4, 0xa6, 0xb9, 0x35, 0xe7, 0x21, 0x57, 0xa7, 0x5e, 0x90, 0x13, 0x69, 0xcd, + 0x79, 0x78, 0xc0, 0x0f, 0x9e, 0xd8, 0x4a, 0xa4, 0x06, 0xc5, 0xd7, 0xfe, 0x4b, 0xfa, 0x9f, 0x09, + 0x47, 0x5a, 0x1d, 0xab, 0xd5, 0x0b, 0x84, 0x0b, 0xb1, 0xcf, 0x5a, 0xbd, 0x20, 0x5b, 0xab, 0x17, + 0x14, 0xa8, 0xd5, 0x0b, 0xd0, 0xbb, 0x16, 0x0c, 0x0b, 0xcf, 0x3b, 0x8b, 0x15, 0x1b, 0xbd, 0xf2, + 0xf1, 0xbe, 0xaa, 0x16, 0x2e, 0x7c, 0x5e, 0xfd, 0xbc, 0xd4, 0x21, 0x05, 0x34, 0xb7, 0x09, 0xb2, + 0x6a, 0xf4, 0xab, 0x16, 0x4c, 0x88, 0xdf, 0x98, 0xbc, 0xd3, 0x26, 0x71, 0x22, 0x76, 0xab, 0x4f, + 0x1f, 0xa5, 0x35, 0x82, 0x05, 0x6f, 0xd4, 0xc7, 0xa4, 0xa8, 0x31, 0x91, 0xb9, 0x6d, 0xcb, 0xb4, + 0x07, 0x7d, 0xcf, 0x82, 0x33, 0x4d, 0xe7, 0x21, 0xaf, 0x91, 0xc3, 0xb0, 0x93, 0x78, 0xa1, 0x88, + 0x87, 0x5b, 0xe9, 0x77, 0x9e, 0x74, 0x30, 0xe2, 0xcd, 0xfd, 0xa4, 0x3c, 0x0e, 0xed, 0x46, 0x92, + 0xdb, 0xe8, 0xae, 0x2d, 0x9c, 0x71, 0x61, 0x44, 0x4e, 0xcc, 0x2e, 0xda, 0xfb, 0xa2, 0xbe, 0x29, + 0x1f, 0xbe, 0x02, 0xa5, 0xbf, 0x6b, 0xee, 0x8d, 0xb6, 0x13, 0x24, 0x5e, 0xb2, 0xab, 0xe9, 0xfa, + 0xac, 0x16, 0x31, 0x11, 0x8f, 0xb1, 0x96, 0x6d, 0x18, 0xd3, 0xe7, 0xdc, 0x31, 0xd6, 0x14, 0xc2, + 0xe9, 0x2e, 0xf3, 0xe9, 0x18, 0x2b, 0x6c, 0xc3, 0xe3, 0x3d, 0xe7, 0xc5, 0xf1, 0x55, 0x6b, 0xff, + 0x33, 0x4b, 0x17, 0x98, 0x27, 0xe0, 0x41, 0x59, 0x33, 0x3d, 0x28, 0x17, 0x8b, 0xae, 0x9c, 0x1e, + 0x6e, 0x94, 0x4d, 0xbd, 0xf9, 0x74, 0x23, 0x40, 0xeb, 0x30, 0xe4, 0x53, 0x88, 0x3c, 0x64, 0xba, + 0xd4, 0xcf, 0xda, 0x4c, 0x75, 0x0c, 0x06, 0x8f, 0xb1, 0xe0, 0x65, 0x7f, 0xcf, 0x82, 0x81, 0x9f, + 0xe0, 0x25, 0x86, 0x0e, 0xd6, 0xe2, 0x1e, 0xee, 0x1c, 0x76, 0x1e, 0x2c, 0x3f, 0x4c, 0x48, 0x10, + 0x33, 0x95, 0xb2, 0xeb, 0x10, 0xfd, 0x7a, 0x09, 0x46, 0x69, 0x55, 0x32, 0x4c, 0xe0, 0x35, 0x18, + 0xf7, 0x9d, 0x0d, 0xe2, 0x4b, 0xef, 0x6f, 0xd6, 0xfc, 0xba, 0xa9, 0x23, 0xb1, 0x49, 0x4b, 0x0b, + 0x6f, 0xea, 0xce, 0x71, 0xa1, 0x1a, 0xa9, 0xc2, 0x86, 0xe7, 0x1c, 0x9b, 0xb4, 0xd4, 0x02, 0x78, + 0xe0, 0x24, 0x8d, 0x6d, 0x61, 0x9a, 0xa9, 0xe6, 0xde, 0xa3, 0x40, 0xcc, 0x71, 0x68, 0x01, 0x26, + 0xe5, 0x8c, 0xbd, 0x4b, 0x6d, 0xf6, 0x30, 0x10, 0x6a, 0xa3, 0xba, 0x08, 0x89, 0x4d, 0x34, 0xce, + 0xd2, 0xa3, 0x4f, 0xc0, 0x04, 0x1d, 0x9c, 0xb0, 0x9d, 0xc8, 0x20, 0x88, 0x41, 0x16, 0x04, 0xc1, + 0x22, 0x59, 0xd7, 0x0d, 0x0c, 0xce, 0x50, 0xda, 0x5f, 0x84, 0xd3, 0x37, 0x43, 0xc7, 0x5d, 0x74, + 0x7c, 0x27, 0x68, 0x90, 0x68, 0x35, 0xd8, 0xca, 0x3d, 0x2f, 0xd6, 0xcf, 0x74, 0x4b, 0x79, 0x67, + 0xba, 0x76, 0x04, 0x48, 0xaf, 0x40, 0x84, 0xef, 0xbc, 0x05, 0xc3, 0x1e, 0xaf, 0x4a, 0x4c, 0xdb, + 0xcb, 0x79, 0xce, 0xa5, 0x8e, 0x36, 0x6a, 0xe1, 0x28, 0x1c, 0x80, 0x25, 0x4b, 0x6a, 0x51, 0x74, + 0xf3, 0x46, 0xe5, 0x1b, 0x6d, 0xf6, 0x5f, 0xb4, 0x60, 0xf2, 0x56, 0xe6, 0x96, 0xdd, 0xb3, 0x30, + 0x14, 0x93, 0xa8, 0x8b, 0x6b, 0xad, 0xce, 0xa0, 0x58, 0x60, 0x1f, 0xb9, 0xb9, 0xfe, 0x4b, 0x25, + 0xa8, 0xb0, 0x40, 0xd0, 0x16, 0xb5, 0x0e, 0x8e, 0x5f, 0x39, 0x5d, 0x33, 0x94, 0xd3, 0x1c, 0xa3, + 0x51, 0x35, 0xac, 0x97, 0x6e, 0x8a, 0xee, 0xa8, 0xdb, 0x67, 0x85, 0xec, 0xc5, 0x94, 0x21, 0xbf, + 0xa1, 0x34, 0x61, 0x5e, 0x56, 0x93, 0x37, 0xd3, 0xd8, 0x29, 0xab, 0xa2, 0xfd, 0xc0, 0x9d, 0xb2, + 0xaa, 0x96, 0xf5, 0x10, 0x4e, 0x35, 0xad, 0xf1, 0x4c, 0x7c, 0x7f, 0x8a, 0x85, 0xf7, 0x39, 0xbe, + 0xf7, 0x65, 0xa2, 0x2e, 0x71, 0xce, 0x8a, 0x70, 0x3d, 0x01, 0x3d, 0x60, 0x72, 0x46, 0xfc, 0xe3, + 0x77, 0x74, 0xd3, 0x22, 0xf6, 0x75, 0x98, 0xcc, 0x0c, 0x1d, 0x7a, 0x05, 0x06, 0x5b, 0xdb, 0x4e, + 0x4c, 0x32, 0x81, 0x23, 0x83, 0x35, 0x0a, 0x3c, 0xd8, 0x9b, 0x9d, 0x50, 0x05, 0x18, 0x04, 0x73, + 0x6a, 0xfb, 0xdd, 0x12, 0x0c, 0xdc, 0x0a, 0xdd, 0x93, 0x98, 0x6a, 0xd7, 0x8d, 0xa9, 0xf6, 0x6c, + 0xfe, 0x0d, 0xff, 0x9e, 0xb3, 0xac, 0x96, 0x99, 0x65, 0x17, 0x0b, 0xf0, 0x3a, 0x7c, 0x82, 0x35, + 0x61, 0x94, 0x65, 0x10, 0x10, 0x91, 0x33, 0x2f, 0x19, 0xf6, 0xd4, 0x6c, 0xc6, 0x9e, 0x9a, 0xd4, + 0x48, 0x35, 0xab, 0xea, 0x39, 0x18, 0x16, 0x91, 0x1a, 0xd9, 0xe0, 0x46, 0x41, 0x8b, 0x25, 0xde, + 0xfe, 0x27, 0x65, 0x30, 0x32, 0x16, 0xa0, 0x1f, 0x58, 0x30, 0x17, 0xf1, 0xeb, 0x1a, 0x6e, 0xb5, + 0x1d, 0x79, 0xc1, 0x56, 0xbd, 0xb1, 0x4d, 0xdc, 0xb6, 0xef, 0x05, 0x5b, 0xab, 0x5b, 0x41, 0xa8, + 0xc0, 0xcb, 0x0f, 0x49, 0xa3, 0xcd, 0x9c, 0xae, 0x85, 0x13, 0x25, 0xa8, 0x13, 0xd0, 0x2b, 0xfb, + 0x7b, 0xb3, 0x73, 0xb8, 0xaf, 0x5a, 0x70, 0x9f, 0xad, 0x42, 0x7f, 0x64, 0xc1, 0x3c, 0xbf, 0xb3, + 0x5f, 0xbc, 0x27, 0x85, 0xec, 0xd0, 0x9a, 0x64, 0x9a, 0xb2, 0x5b, 0x27, 0x51, 0x73, 0xf1, 0x55, + 0x31, 0xc8, 0xf3, 0xb5, 0xfe, 0x6a, 0xc5, 0xfd, 0x36, 0xd3, 0xfe, 0x97, 0x65, 0x18, 0xa7, 0xe3, + 0x99, 0xde, 0xd3, 0x7d, 0xc5, 0x98, 0x26, 0x4f, 0x65, 0xa6, 0xc9, 0x29, 0x83, 0xf8, 0xd1, 0x5c, + 0xd1, 0x8d, 0xe1, 0x94, 0xef, 0xc4, 0xc9, 0x75, 0xe2, 0x44, 0xc9, 0x06, 0x71, 0xd8, 0x41, 0x63, + 0x36, 0x88, 0xa1, 0xc0, 0xd9, 0xa5, 0x8a, 0xfe, 0xb9, 0x99, 0x65, 0x86, 0x3b, 0xf9, 0xa3, 0x1d, + 0x40, 0xec, 0x50, 0x33, 0x72, 0x82, 0x98, 0xf7, 0xc5, 0x13, 0x6e, 0xda, 0xfe, 0x6a, 0x9d, 0x11, + 0xb5, 0xa2, 0x9b, 0x1d, 0xdc, 0x70, 0x97, 0x1a, 0xb4, 0x63, 0xeb, 0xc1, 0xa2, 0xc7, 0xd6, 0x43, + 0x39, 0x51, 0xc5, 0xbf, 0x60, 0xc1, 0x69, 0xfa, 0x59, 0xcc, 0x08, 0xd4, 0x18, 0x85, 0x30, 0x49, + 0xa7, 0x9d, 0x4f, 0x12, 0x09, 0x13, 0xeb, 0x2b, 0x47, 0xb3, 0x36, 0xf9, 0xa4, 0xea, 0xdb, 0x0d, + 0x93, 0x19, 0xce, 0x72, 0xb7, 0xbf, 0x6d, 0x01, 0x0b, 0x71, 0x3b, 0x81, 0xcd, 0xec, 0x9a, 0xb9, + 0x99, 0xd9, 0xf9, 0x12, 0xa3, 0xc7, 0x3e, 0xf6, 0x32, 0x4c, 0x51, 0x6c, 0x2d, 0x0a, 0x1f, 0xee, + 0x4a, 0x45, 0x3b, 0xdf, 0x5f, 0xfb, 0x6e, 0x89, 0x2f, 0x1b, 0x75, 0xef, 0x0c, 0xfd, 0xa2, 0x05, + 0x23, 0x0d, 0xa7, 0xe5, 0x34, 0x78, 0xbe, 0x97, 0x02, 0x3e, 0x19, 0xa3, 0xfc, 0xdc, 0x92, 0x28, + 0xcb, 0xfd, 0x09, 0x1f, 0x95, 0x5d, 0x97, 0xe0, 0x5c, 0x1f, 0x82, 0xaa, 0x7c, 0xc6, 0x83, 0x71, + 0x83, 0xd9, 0x31, 0x1a, 0xa1, 0xbf, 0x68, 0x71, 0x91, 0xaf, 0x0c, 0x85, 0x07, 0x70, 0x2a, 0xd0, + 0xfe, 0x53, 0x61, 0x26, 0xf5, 0xe2, 0xb9, 0xe2, 0x42, 0x9d, 0xc9, 0x40, 0x2d, 0x98, 0x2f, 0xc3, + 0x10, 0x77, 0xd6, 0x61, 0xff, 0x1d, 0x0b, 0x1e, 0xd3, 0x09, 0xb5, 0x6b, 0x82, 0x79, 0xbe, 0xe2, + 0x2a, 0x8c, 0x84, 0x2d, 0x12, 0x39, 0xa9, 0x51, 0x74, 0x51, 0x8e, 0xfe, 0x6d, 0x01, 0x3f, 0xd8, + 0x9b, 0x3d, 0xa3, 0x73, 0x97, 0x70, 0xac, 0x4a, 0x22, 0x1b, 0x86, 0xd8, 0xb8, 0xc4, 0xe2, 0x82, + 0x27, 0xcb, 0x7e, 0xc2, 0x4e, 0x48, 0x62, 0x2c, 0x30, 0xf6, 0x5f, 0xb5, 0xf8, 0x64, 0xd3, 0x9b, + 0x8e, 0xbe, 0x02, 0x53, 0x4d, 0x6a, 0x3f, 0x2d, 0x3f, 0x6c, 0xd1, 0x6d, 0x94, 0x9d, 0x0c, 0x5b, + 0x45, 0x36, 0x8f, 0x1e, 0xdd, 0x5d, 0x9c, 0x16, 0xad, 0x9f, 0x5a, 0xcb, 0xb0, 0xc5, 0x1d, 0x15, + 0xd9, 0x7f, 0x2c, 0x56, 0x2c, 0xd3, 0xe0, 0x9e, 0x83, 0xe1, 0x56, 0xe8, 0x2e, 0xad, 0x56, 0xb1, + 0x18, 0x2b, 0x25, 0x72, 0x6a, 0x1c, 0x8c, 0x25, 0x1e, 0x5d, 0x01, 0x20, 0x0f, 0x13, 0x12, 0x05, + 0x8e, 0xaf, 0x4e, 0x74, 0x95, 0xa2, 0xb4, 0xac, 0x30, 0x58, 0xa3, 0xa2, 0x65, 0x5a, 0x51, 0xb8, + 0xe3, 0xb9, 0x2c, 0xb2, 0xbe, 0x6c, 0x96, 0xa9, 0x29, 0x0c, 0xd6, 0xa8, 0xa8, 0xd5, 0xda, 0x0e, + 0x62, 0xbe, 0x89, 0x39, 0x1b, 0x22, 0x59, 0xc7, 0x48, 0x6a, 0xb5, 0xde, 0xd1, 0x91, 0xd8, 0xa4, + 0xb5, 0xff, 0x63, 0x05, 0x20, 0x55, 0x93, 0xd0, 0xbb, 0x9d, 0x2b, 0xf4, 0x63, 0x45, 0x75, 0xac, + 0x47, 0xb7, 0x3c, 0xd1, 0x37, 0x2c, 0x18, 0x75, 0x7c, 0x3f, 0x6c, 0x38, 0x09, 0xeb, 0x51, 0xa9, + 0xa8, 0xac, 0x10, 0x2d, 0x59, 0x48, 0xcb, 0xf2, 0xc6, 0xbc, 0x24, 0x0f, 0xfc, 0x34, 0x4c, 0x6e, + 0x7b, 0xf4, 0x26, 0xa0, 0x8f, 0x4a, 0x35, 0x9b, 0x7f, 0x94, 0x99, 0xac, 0x9a, 0x5d, 0x61, 0x12, + 0x52, 0xd3, 0xb0, 0xd1, 0x17, 0x8d, 0x7c, 0x14, 0x03, 0x45, 0xee, 0x15, 0x1a, 0x8a, 0x43, 0x5e, + 0x2a, 0x0a, 0xf4, 0x39, 0x3d, 0xe8, 0x78, 0xb0, 0xc8, 0xc5, 0x5d, 0x4d, 0x7f, 0xcd, 0x09, 0x38, + 0x4e, 0x60, 0xd2, 0x35, 0xb7, 0x4a, 0x11, 0x94, 0x75, 0x39, 0xbf, 0x86, 0xcc, 0x1e, 0x9b, 0x6e, + 0x8e, 0x19, 0x04, 0xce, 0x56, 0x81, 0x3e, 0xc7, 0x43, 0xc2, 0x57, 0x83, 0xcd, 0x50, 0x04, 0x66, + 0x5d, 0x2a, 0xf0, 0xcd, 0x77, 0xe3, 0x84, 0x34, 0x69, 0x99, 0x74, 0x37, 0xbc, 0x25, 0xb8, 0x60, + 0xc5, 0x0f, 0xad, 0xc3, 0x10, 0xbb, 0xc0, 0x12, 0x4f, 0x8f, 0x14, 0x71, 0x9d, 0x99, 0xf7, 0x36, + 0x53, 0x15, 0x84, 0xfd, 0x8d, 0xb1, 0xe0, 0x85, 0xae, 0xcb, 0xfb, 0xd3, 0xf1, 0x6a, 0x70, 0x27, + 0x26, 0xec, 0xfe, 0x74, 0x65, 0xf1, 0xc3, 0xe9, 0x85, 0x68, 0x0e, 0xef, 0x9a, 0x91, 0xcb, 0x28, + 0x49, 0x35, 0x11, 0xf1, 0x5f, 0x26, 0xfa, 0x9a, 0x86, 0x22, 0x0d, 0x35, 0xd3, 0x82, 0xa5, 0x83, + 0x7d, 0xd7, 0x64, 0x86, 0xb3, 0xdc, 0x4f, 0x70, 0x0f, 0x9c, 0xf1, 0x61, 0x2a, 0xbb, 0x24, 0x8f, + 0x71, 0xc7, 0xfd, 0xd3, 0x01, 0x98, 0x30, 0x27, 0x06, 0x9a, 0x87, 0x8a, 0xd0, 0xa6, 0x54, 0xd2, + 0x1f, 0x35, 0xff, 0xd7, 0x24, 0x02, 0xa7, 0x34, 0x2c, 0xfd, 0x11, 0x2b, 0xae, 0x85, 0xe3, 0xa4, + 0xe9, 0x8f, 0x14, 0x06, 0x6b, 0x54, 0x54, 0x6d, 0xdd, 0x08, 0xc3, 0x44, 0x09, 0x6e, 0x35, 0x67, + 0x16, 0x19, 0x14, 0x0b, 0x2c, 0x15, 0xd8, 0xf7, 0x69, 0x87, 0x7c, 0xd3, 0x05, 0xa8, 0x04, 0xf6, + 0x0d, 0x1d, 0x89, 0x4d, 0x5a, 0xba, 0x01, 0x85, 0x31, 0x9b, 0x84, 0x42, 0x39, 0x4e, 0xc3, 0x9b, + 0xea, 0xfc, 0x42, 0x97, 0xc4, 0xa3, 0xcf, 0xc2, 0x63, 0xea, 0xfe, 0x15, 0xe6, 0x2e, 0x55, 0x59, + 0xe3, 0x90, 0x61, 0xdf, 0x3e, 0xb6, 0xd4, 0x9d, 0x0c, 0xf7, 0x2a, 0x8f, 0x5e, 0x87, 0x09, 0xa1, + 0xd8, 0x4a, 0x8e, 0xc3, 0xe6, 0xe9, 0xf7, 0x0d, 0x03, 0x8b, 0x33, 0xd4, 0xa8, 0x0a, 0x53, 0x14, + 0xc2, 0x34, 0x4a, 0xc9, 0x81, 0xdf, 0x23, 0x53, 0x3b, 0xf3, 0x8d, 0x0c, 0x1e, 0x77, 0x94, 0x40, + 0x0b, 0x30, 0xc9, 0x75, 0x0b, 0x6a, 0xc5, 0xb1, 0xef, 0x20, 0x22, 0x29, 0xd5, 0x22, 0xb8, 0x6d, + 0xa2, 0x71, 0x96, 0x1e, 0x5d, 0x85, 0x31, 0x27, 0x6a, 0x6c, 0x7b, 0x09, 0x69, 0x24, 0xed, 0x88, + 0x67, 0x26, 0xd0, 0xc2, 0x07, 0x16, 0x34, 0x1c, 0x36, 0x28, 0xed, 0x2f, 0xc3, 0xe9, 0x2e, 0x61, + 0xdb, 0x74, 0xe2, 0x38, 0x2d, 0x4f, 0xf6, 0x29, 0x13, 0xa8, 0xb4, 0x50, 0x5b, 0x95, 0xbd, 0xd1, + 0xa8, 0xe8, 0xec, 0x64, 0xbe, 0x64, 0x2d, 0x27, 0x9f, 0x9a, 0x9d, 0x2b, 0x12, 0x81, 0x53, 0x1a, + 0xfb, 0x7f, 0x56, 0x40, 0x73, 0xb5, 0x14, 0x08, 0x4f, 0xb9, 0x0a, 0x63, 0x32, 0xcd, 0xa4, 0x96, + 0xde, 0x4d, 0x75, 0xf3, 0x9a, 0x86, 0xc3, 0x06, 0x25, 0x6d, 0x5b, 0x20, 0x1d, 0x48, 0xd9, 0xb0, + 0x28, 0xe5, 0x59, 0xc2, 0x29, 0x0d, 0xba, 0x04, 0x23, 0x31, 0xf1, 0x37, 0x6f, 0x7a, 0xc1, 0x7d, + 0x31, 0xb1, 0x95, 0x54, 0xae, 0x0b, 0x38, 0x56, 0x14, 0x68, 0x11, 0xca, 0x6d, 0xcf, 0x15, 0x53, + 0x59, 0xaa, 0x0c, 0xe5, 0x3b, 0xab, 0xd5, 0x83, 0xbd, 0xd9, 0xa7, 0x7a, 0xe5, 0xe9, 0xa4, 0xc6, + 0x74, 0x3c, 0x47, 0x97, 0x1f, 0x2d, 0xdc, 0xcd, 0xa9, 0x3e, 0xd4, 0xa7, 0x53, 0xfd, 0x0a, 0x80, + 0xe8, 0xb5, 0x9c, 0xcb, 0xe5, 0xf4, 0xab, 0x5d, 0x53, 0x18, 0xac, 0x51, 0x51, 0x93, 0xbc, 0x11, + 0x11, 0x47, 0x5a, 0xad, 0x3c, 0x9c, 0x78, 0xe4, 0xe8, 0x26, 0xf9, 0x52, 0x96, 0x19, 0xee, 0xe4, + 0x8f, 0x42, 0x38, 0xe5, 0xd2, 0x85, 0x64, 0x54, 0x5a, 0xe9, 0x3f, 0x86, 0x99, 0x56, 0x58, 0xcd, + 0x32, 0xc2, 0x9d, 0xbc, 0xd1, 0x17, 0x60, 0x46, 0x02, 0x3b, 0x6f, 0x58, 0xb2, 0xe5, 0x52, 0x5e, + 0x3c, 0xbf, 0xbf, 0x37, 0x3b, 0x53, 0xed, 0x49, 0x85, 0x0f, 0xe1, 0x80, 0xde, 0x82, 0x21, 0x76, + 0x08, 0x13, 0x4f, 0x8f, 0xb2, 0xdd, 0xee, 0xe5, 0x22, 0x91, 0xf0, 0x74, 0xd6, 0xcf, 0xb1, 0xa3, + 0x1c, 0x11, 0xe3, 0x99, 0x9e, 0x6c, 0x31, 0x20, 0x16, 0x3c, 0x51, 0x0b, 0x46, 0x9d, 0x20, 0x08, + 0x13, 0x87, 0x2b, 0x61, 0x63, 0x45, 0xf4, 0x48, 0xad, 0x8a, 0x85, 0xb4, 0x2c, 0xaf, 0x47, 0x05, + 0x8e, 0x69, 0x18, 0xac, 0x57, 0x81, 0x1e, 0xc0, 0x64, 0xf8, 0x80, 0x0a, 0x4c, 0x79, 0x0e, 0x11, + 0x4f, 0x8f, 0x9b, 0x1d, 0xcb, 0xf1, 0xaa, 0x1a, 0x85, 0x35, 0x49, 0x66, 0x32, 0xc5, 0xd9, 0x5a, + 0xd0, 0x9c, 0xe1, 0x5b, 0x9e, 0x48, 0x23, 0x99, 0x53, 0xdf, 0xb2, 0xee, 0x4a, 0x66, 0xb7, 0x78, + 0x79, 0xf4, 0x22, 0x93, 0x08, 0x93, 0x99, 0x5b, 0xbc, 0x29, 0x0a, 0xeb, 0x74, 0x33, 0x1f, 0x87, + 0x51, 0x6d, 0xe0, 0xfb, 0x09, 0x99, 0x9d, 0x79, 0x1d, 0xa6, 0xb2, 0x03, 0xda, 0x57, 0xc8, 0xed, + 0xff, 0x28, 0xc1, 0x64, 0x97, 0x43, 0x9e, 0xfb, 0x1e, 0x0b, 0xfb, 0x36, 0x44, 0xdf, 0x0d, 0x2f, + 0x70, 0x31, 0xc3, 0x98, 0x02, 0xac, 0x54, 0x40, 0x80, 0x49, 0x69, 0x5a, 0xee, 0x29, 0x4d, 0x85, + 0xd0, 0x1a, 0x78, 0x3f, 0x42, 0xcb, 0xdc, 0x27, 0x06, 0x0b, 0xed, 0x13, 0x8f, 0x40, 0xd0, 0x19, + 0x5b, 0xcd, 0x70, 0x81, 0xad, 0xe6, 0x5b, 0x25, 0x98, 0x4a, 0xc3, 0x8b, 0x45, 0xee, 0xd9, 0xe3, + 0x3f, 0x33, 0x58, 0x37, 0xce, 0x0c, 0xf2, 0x52, 0xcb, 0x66, 0xda, 0xd7, 0xf3, 0xfc, 0xe0, 0xad, + 0xcc, 0xf9, 0xc1, 0xcb, 0x7d, 0xf2, 0x3d, 0xfc, 0x2c, 0xe1, 0xbb, 0x25, 0x38, 0x9b, 0x2d, 0xb2, + 0xe4, 0x3b, 0x5e, 0xf3, 0x04, 0xc6, 0xeb, 0xb3, 0xc6, 0x78, 0xbd, 0xda, 0x5f, 0xbf, 0x58, 0x23, + 0x7b, 0x0e, 0x9a, 0x93, 0x19, 0xb4, 0x8f, 0x1f, 0x85, 0xf9, 0xe1, 0x23, 0xf7, 0x07, 0x16, 0x3c, + 0xde, 0xb5, 0xdc, 0x09, 0x78, 0x49, 0xdf, 0x34, 0xbd, 0xa4, 0x2f, 0x1d, 0xa1, 0x77, 0x3d, 0xdc, + 0xa6, 0xff, 0xb5, 0xd4, 0xa3, 0x57, 0xcc, 0x93, 0x74, 0x1b, 0x46, 0x9d, 0x46, 0x83, 0xc4, 0xf1, + 0x5a, 0xe8, 0xaa, 0x7c, 0x40, 0x2f, 0xb2, 0xbd, 0x25, 0x05, 0x1f, 0xec, 0xcd, 0xce, 0x64, 0x59, + 0xa4, 0x68, 0xac, 0x73, 0x30, 0xf3, 0x85, 0x95, 0x8e, 0x29, 0x5f, 0xd8, 0x15, 0x80, 0x1d, 0x65, + 0xc1, 0x66, 0x1d, 0x54, 0x9a, 0x6d, 0xab, 0x51, 0xa1, 0x3f, 0xcf, 0x34, 0x42, 0x1e, 0x51, 0x31, + 0x60, 0xde, 0x54, 0xcc, 0xf9, 0x7e, 0x7a, 0x74, 0x06, 0xbf, 0x10, 0xa9, 0x9c, 0x79, 0x8a, 0xa5, + 0xfd, 0x4f, 0xcb, 0xf0, 0x33, 0x87, 0x4c, 0x3a, 0xb4, 0x60, 0x1e, 0x90, 0xbe, 0x90, 0xf5, 0xdc, + 0xcc, 0x74, 0x2d, 0x6c, 0xb8, 0x72, 0x32, 0xdf, 0xaa, 0xf4, 0xbe, 0xbf, 0xd5, 0x37, 0x75, 0x3f, + 0x1b, 0x0f, 0x8c, 0xbc, 0x76, 0xe4, 0x65, 0xf5, 0xd3, 0xe9, 0x17, 0xff, 0x9a, 0x05, 0x4f, 0x75, + 0xed, 0x94, 0x11, 0x8e, 0x31, 0x0f, 0x95, 0x06, 0x05, 0x6a, 0x37, 0x58, 0xd2, 0xab, 0x63, 0x12, + 0x81, 0x53, 0x1a, 0x23, 0xea, 0xa2, 0x94, 0x1b, 0x75, 0xf1, 0x7b, 0x16, 0x9c, 0xc9, 0x36, 0xe2, + 0x04, 0x64, 0x4e, 0xdd, 0x94, 0x39, 0x73, 0xfd, 0x7d, 0xfa, 0x1e, 0xe2, 0xe6, 0x57, 0xc7, 0xe1, + 0x5c, 0xc7, 0x8e, 0xc5, 0x47, 0xf1, 0x67, 0x2d, 0x38, 0xb5, 0xc5, 0x34, 0x6f, 0xed, 0x9a, 0x90, + 0xe8, 0x57, 0xce, 0xdd, 0xaa, 0x43, 0x6f, 0x17, 0x71, 0x3b, 0xa2, 0x83, 0x04, 0x77, 0x56, 0x86, + 0xbe, 0x6e, 0xc1, 0x19, 0xe7, 0x41, 0xdc, 0xf1, 0xaa, 0x81, 0x98, 0x46, 0xaf, 0xe7, 0x38, 0xb9, + 0x72, 0xde, 0x43, 0x58, 0x9c, 0xde, 0xdf, 0x9b, 0x3d, 0xd3, 0x8d, 0x0a, 0x77, 0xad, 0x95, 0x7e, + 0xdf, 0x6d, 0x71, 0x0d, 0xa1, 0xd8, 0x85, 0xb7, 0x6e, 0x97, 0x16, 0xb8, 0x48, 0x92, 0x18, 0xac, + 0x38, 0xa2, 0xb7, 0xa1, 0xb2, 0x25, 0x6f, 0x06, 0x65, 0x45, 0x5e, 0x8f, 0x61, 0xee, 0x76, 0x91, + 0x88, 0x87, 0xc6, 0x2b, 0x14, 0x4e, 0x99, 0xa2, 0xeb, 0x50, 0x0e, 0x36, 0x63, 0x71, 0x07, 0x37, + 0x2f, 0xd8, 0xc6, 0x0c, 0x71, 0xe2, 0xd7, 0x16, 0x6f, 0xad, 0xd4, 0x31, 0x65, 0x41, 0x39, 0x45, + 0x1b, 0xae, 0xf0, 0xee, 0xe6, 0x70, 0xc2, 0x8b, 0xd5, 0x4e, 0x4e, 0x78, 0xb1, 0x8a, 0x29, 0x0b, + 0x54, 0x83, 0x41, 0x76, 0xc9, 0x41, 0xb8, 0x6e, 0x73, 0x2e, 0x6a, 0x77, 0x5c, 0xe5, 0xe0, 0xc9, + 0xf0, 0x18, 0x18, 0x73, 0x46, 0x68, 0x1d, 0x86, 0x1a, 0x2c, 0x81, 0xb7, 0xb0, 0xab, 0xf3, 0xd2, + 0x0c, 0x74, 0x24, 0xfb, 0xe6, 0x47, 0x4c, 0x1c, 0x8e, 0x05, 0x2f, 0xc6, 0x95, 0xb4, 0xb6, 0x37, + 0x63, 0x61, 0x38, 0xe7, 0x71, 0xed, 0x48, 0xc5, 0x2e, 0xb8, 0x32, 0x38, 0x16, 0xbc, 0x50, 0x15, + 0x4a, 0x9b, 0x0d, 0x91, 0xd9, 0x32, 0xc7, 0x65, 0x6b, 0xde, 0x41, 0x5d, 0x1c, 0xda, 0xdf, 0x9b, + 0x2d, 0xad, 0x2c, 0xe1, 0xd2, 0x66, 0x03, 0xbd, 0x09, 0xc3, 0x9b, 0xfc, 0x56, 0xa1, 0xc8, 0x62, + 0x79, 0x39, 0xef, 0xea, 0x63, 0xc7, 0x15, 0x44, 0x7e, 0xfd, 0x41, 0x20, 0xb0, 0x64, 0xc7, 0x52, + 0x8b, 0xa9, 0x7b, 0x92, 0x22, 0x8d, 0xe5, 0x5c, 0x7f, 0xf7, 0x2a, 0x85, 0x3d, 0xa9, 0xa0, 0x58, + 0xe3, 0x48, 0xe7, 0xbc, 0x23, 0xdf, 0x22, 0x60, 0x29, 0x2c, 0x73, 0xe7, 0x7c, 0xd7, 0xa7, 0x0b, + 0xf8, 0x9c, 0x57, 0x28, 0x9c, 0x32, 0x45, 0x6d, 0x18, 0xdf, 0x89, 0x5b, 0xdb, 0x44, 0x2e, 0x7d, + 0x96, 0xd7, 0x72, 0xf4, 0xca, 0x27, 0x73, 0x92, 0x95, 0x8a, 0x22, 0x5e, 0x94, 0xb4, 0x1d, 0xbf, + 0x43, 0x82, 0xb1, 0x5c, 0x4e, 0x77, 0x75, 0xb6, 0xd8, 0xac, 0x85, 0x7e, 0x92, 0x77, 0xda, 0xe1, + 0xc6, 0x6e, 0x42, 0x44, 0xde, 0xcb, 0x9c, 0x4f, 0xf2, 0x06, 0x27, 0xee, 0xfc, 0x24, 0x02, 0x81, + 0x25, 0x3b, 0x35, 0x64, 0x4c, 0x1a, 0x4f, 0x15, 0x1e, 0xb2, 0x8e, 0x3e, 0xa4, 0x43, 0xc6, 0xa4, + 0x6f, 0xca, 0x94, 0x49, 0xdd, 0xd6, 0x76, 0x98, 0x84, 0x41, 0x46, 0xf6, 0x9f, 0x2a, 0x22, 0x75, + 0x6b, 0x5d, 0x4a, 0x76, 0x4a, 0xdd, 0x6e, 0x54, 0xb8, 0x6b, 0xad, 0xf6, 0x1f, 0x0f, 0x76, 0x6e, + 0xb7, 0x4c, 0x19, 0xfe, 0x2b, 0x9d, 0xe7, 0x8e, 0x9f, 0xee, 0xdf, 0xe6, 0x7b, 0x84, 0x27, 0x90, + 0x5f, 0xb7, 0xe0, 0x5c, 0xab, 0xeb, 0x66, 0x2a, 0x36, 0xac, 0x7e, 0x4d, 0x47, 0x3e, 0x60, 0x2a, + 0xa9, 0x6b, 0x77, 0x3c, 0xee, 0x51, 0x67, 0x56, 0x01, 0x2d, 0xbf, 0x6f, 0x05, 0xf4, 0x1e, 0x8c, + 0x30, 0x9d, 0x29, 0xcd, 0xab, 0xd1, 0x67, 0x0a, 0x0a, 0xb6, 0xf5, 0x2d, 0x09, 0x16, 0x58, 0x31, + 0xa3, 0x03, 0xf7, 0x64, 0xb6, 0x13, 0x98, 0x30, 0xb4, 0xc8, 0x46, 0xcb, 0x7d, 0x1d, 0x2b, 0x62, + 0x24, 0x9e, 0xac, 0x1d, 0x46, 0x7c, 0x90, 0x47, 0x80, 0x0f, 0xaf, 0xec, 0x24, 0x15, 0xda, 0xbf, + 0x67, 0x75, 0xd1, 0xbf, 0xb8, 0x09, 0xf2, 0x49, 0xd3, 0x04, 0x79, 0x36, 0x6b, 0x82, 0x74, 0xb8, + 0x0d, 0x0c, 0xeb, 0xa3, 0x78, 0xf2, 0xc4, 0xa2, 0x09, 0x3f, 0x6c, 0x1f, 0x2e, 0xe4, 0x2d, 0x6e, + 0x16, 0xe1, 0xe3, 0xaa, 0xe3, 0xb2, 0x34, 0xc2, 0xc7, 0x5d, 0xad, 0x62, 0x86, 0x29, 0x7a, 0x67, + 0xdc, 0xfe, 0xb9, 0x12, 0x94, 0x6b, 0xa1, 0x7b, 0x02, 0x6e, 0x90, 0x6b, 0x86, 0x1b, 0xe4, 0x99, + 0xdc, 0x97, 0x98, 0x7a, 0x3a, 0x3d, 0x6e, 0x67, 0x9c, 0x1e, 0x1f, 0xc9, 0x67, 0x75, 0xb8, 0x8b, + 0xe3, 0x7b, 0x65, 0xd0, 0xdf, 0x92, 0x42, 0xff, 0xe1, 0x28, 0x81, 0x9f, 0xe5, 0x62, 0xcf, 0x4b, + 0x89, 0x3a, 0x58, 0x88, 0x90, 0xbc, 0x24, 0xf6, 0x53, 0x1b, 0xff, 0x79, 0x8f, 0x78, 0x5b, 0xdb, + 0x09, 0x71, 0xb3, 0x1d, 0x3b, 0xb9, 0xf8, 0xcf, 0xff, 0x66, 0xc1, 0x64, 0xa6, 0x76, 0xe4, 0x77, + 0xbb, 0x67, 0x72, 0x44, 0xc7, 0xc6, 0xa9, 0xdc, 0x8b, 0x29, 0x73, 0x00, 0xca, 0x3f, 0x2d, 0xdd, + 0x0f, 0x4c, 0x17, 0x53, 0x0e, 0xec, 0x18, 0x6b, 0x14, 0xe8, 0x15, 0x18, 0x4d, 0xc2, 0x56, 0xe8, + 0x87, 0x5b, 0xbb, 0x37, 0x88, 0xcc, 0x66, 0xa0, 0x7c, 0xfb, 0xeb, 0x29, 0x0a, 0xeb, 0x74, 0xf6, + 0xf7, 0xcb, 0x90, 0x7d, 0x89, 0xec, 0xff, 0xcf, 0xd3, 0x9f, 0x9e, 0x79, 0xfa, 0x87, 0x16, 0x4c, + 0xd1, 0xda, 0x59, 0x80, 0x87, 0x8c, 0xd3, 0x54, 0xf9, 0xd4, 0xad, 0x43, 0xf2, 0xa9, 0x3f, 0x4b, + 0xa5, 0x9d, 0x1b, 0xb6, 0x13, 0xe1, 0x32, 0xd1, 0x84, 0x18, 0x85, 0x62, 0x81, 0x15, 0x74, 0x24, + 0x8a, 0xc4, 0x85, 0x16, 0x9d, 0x8e, 0x44, 0x11, 0x16, 0x58, 0x99, 0x6e, 0x7d, 0xa0, 0x47, 0xba, + 0x75, 0x96, 0x0f, 0x48, 0x04, 0x16, 0x08, 0x75, 0x40, 0xcb, 0x07, 0x24, 0x23, 0x0e, 0x52, 0x1a, + 0xfb, 0x3b, 0x65, 0x18, 0xab, 0x85, 0x6e, 0x1a, 0x80, 0xfd, 0xb2, 0x11, 0x80, 0x7d, 0x21, 0x13, + 0x80, 0x3d, 0xa5, 0xd3, 0x3e, 0x9a, 0xf8, 0x6b, 0x91, 0x37, 0x8a, 0x3d, 0x08, 0x70, 0xc4, 0xd8, + 0x6b, 0x23, 0x6f, 0x94, 0x62, 0x84, 0x4d, 0xbe, 0x7f, 0x96, 0x62, 0xae, 0xff, 0xb7, 0x05, 0x13, + 0xb5, 0xd0, 0xa5, 0x13, 0xf4, 0xcf, 0xd2, 0x6c, 0xd4, 0xb3, 0x4d, 0x0d, 0x1d, 0x92, 0x6d, 0xea, + 0x1f, 0x59, 0x30, 0x5c, 0x0b, 0xdd, 0x13, 0x70, 0x27, 0xae, 0x98, 0xee, 0xc4, 0xa7, 0x72, 0x25, + 0x6f, 0x0f, 0x0f, 0xe2, 0x6f, 0x96, 0x61, 0x9c, 0xb6, 0x38, 0xdc, 0x92, 0xdf, 0xcb, 0x18, 0x1b, + 0xab, 0xc0, 0xd8, 0x50, 0x95, 0x30, 0xf4, 0xfd, 0xf0, 0x41, 0xf6, 0xdb, 0xad, 0x30, 0x28, 0x16, + 0x58, 0x74, 0x09, 0x46, 0x5a, 0x11, 0xd9, 0xf1, 0xc2, 0x76, 0x9c, 0xbd, 0x1c, 0x57, 0x13, 0x70, + 0xac, 0x28, 0xd0, 0xcb, 0x30, 0x16, 0x7b, 0x41, 0x83, 0xc8, 0xb0, 0x83, 0x01, 0x16, 0x76, 0xc0, + 0x13, 0xfb, 0x69, 0x70, 0x6c, 0x50, 0xa1, 0x7b, 0x50, 0x61, 0xff, 0xd9, 0x0a, 0xea, 0x3f, 0x53, + 0x3b, 0xcf, 0x66, 0x25, 0x19, 0xe0, 0x94, 0x17, 0xba, 0x02, 0x90, 0xc8, 0x00, 0x89, 0x58, 0x64, + 0xe5, 0x50, 0x7a, 0xa9, 0x0a, 0x9d, 0x88, 0xb1, 0x46, 0x85, 0x5e, 0x80, 0x4a, 0xe2, 0x78, 0xfe, + 0x4d, 0x2f, 0x20, 0xb1, 0x08, 0x30, 0x11, 0x89, 0x74, 0x05, 0x10, 0xa7, 0x78, 0xba, 0xdf, 0xb3, + 0xab, 0xb9, 0xfc, 0x15, 0x88, 0x11, 0x46, 0xcd, 0xf6, 0xfb, 0x9b, 0x0a, 0x8a, 0x35, 0x0a, 0xfb, + 0x25, 0xb6, 0x6f, 0xf7, 0x19, 0x9f, 0xff, 0xa3, 0x12, 0xa0, 0x1a, 0x0b, 0xc4, 0x30, 0x1e, 0xe0, + 0xd8, 0x86, 0x89, 0x98, 0xdc, 0xf4, 0x82, 0xf6, 0x43, 0xc1, 0xaa, 0xd8, 0x85, 0x88, 0xfa, 0xb2, + 0x5e, 0x86, 0xdf, 0x46, 0x35, 0x61, 0x38, 0xc3, 0x97, 0x0e, 0x49, 0xd4, 0x0e, 0x16, 0xe2, 0x3b, + 0x31, 0x89, 0xc4, 0x53, 0x17, 0x6c, 0x48, 0xb0, 0x04, 0xe2, 0x14, 0x4f, 0xa7, 0x00, 0xfb, 0x73, + 0x2b, 0x0c, 0x70, 0x18, 0x26, 0x72, 0xd2, 0xb0, 0xd4, 0xe7, 0x1a, 0x1c, 0x1b, 0x54, 0x68, 0x05, + 0x50, 0xdc, 0x6e, 0xb5, 0x7c, 0x76, 0xb6, 0xe5, 0xf8, 0xd7, 0xa2, 0xb0, 0xdd, 0xe2, 0xb1, 0xb8, + 0x22, 0x6b, 0x78, 0xbd, 0x03, 0x8b, 0xbb, 0x94, 0xa0, 0x4b, 0x7e, 0x33, 0x66, 0xbf, 0xc5, 0x6d, + 0x5b, 0xee, 0x63, 0xab, 0x33, 0x10, 0x96, 0x38, 0xfb, 0xab, 0x6c, 0x9b, 0x62, 0x6f, 0x10, 0x24, + 0xed, 0x88, 0xa0, 0x26, 0x8c, 0xb7, 0xd8, 0x56, 0x94, 0x44, 0xa1, 0xef, 0x13, 0xa9, 0x25, 0x1e, + 0x2d, 0x14, 0x84, 0x67, 0x1d, 0xd7, 0xd9, 0x61, 0x93, 0xbb, 0xfd, 0xe3, 0x51, 0x26, 0x71, 0xc4, + 0xf1, 0xe2, 0xb0, 0x08, 0xf8, 0x14, 0xfa, 0xd8, 0x87, 0x8b, 0xbc, 0xe9, 0x93, 0x4a, 0x73, 0x11, + 0x3e, 0x8a, 0x25, 0x17, 0xf4, 0x79, 0x16, 0xce, 0xcc, 0x97, 0x79, 0xf1, 0x87, 0xb6, 0x38, 0xbd, + 0x11, 0xca, 0x2c, 0x58, 0x60, 0x8d, 0x1d, 0xba, 0x09, 0xe3, 0x22, 0x65, 0xbd, 0x70, 0x12, 0x94, + 0x0d, 0x43, 0x79, 0x1c, 0xeb, 0xc8, 0x83, 0x2c, 0x00, 0x9b, 0x85, 0xd1, 0x16, 0x3c, 0xa9, 0x3d, + 0x8e, 0xd3, 0x25, 0x6c, 0x89, 0xcb, 0x8f, 0xa7, 0xf6, 0xf7, 0x66, 0x9f, 0x5c, 0x3f, 0x8c, 0x10, + 0x1f, 0xce, 0x07, 0xdd, 0x86, 0xb3, 0x4e, 0x23, 0xf1, 0x76, 0x48, 0x95, 0x38, 0xae, 0xef, 0x05, + 0xc4, 0xbc, 0x92, 0xfd, 0xf8, 0xfe, 0xde, 0xec, 0xd9, 0x85, 0x6e, 0x04, 0xb8, 0x7b, 0x39, 0xf4, + 0x49, 0xa8, 0xb8, 0x41, 0x2c, 0xc6, 0x60, 0xc8, 0x78, 0x07, 0xa8, 0x52, 0xbd, 0x55, 0x57, 0xfd, + 0x4f, 0xff, 0xe0, 0xb4, 0x00, 0x7a, 0x87, 0x3f, 0xa9, 0xac, 0x6c, 0x12, 0xfe, 0xfe, 0xd4, 0xab, + 0x85, 0xac, 0x60, 0xe3, 0xaa, 0x04, 0xf7, 0x9f, 0xa9, 0xf0, 0x40, 0xe3, 0x16, 0x85, 0x51, 0x05, + 0xfa, 0x0c, 0xa0, 0x98, 0x44, 0x3b, 0x5e, 0x83, 0x2c, 0x34, 0x58, 0x4e, 0x4b, 0x76, 0x50, 0x37, + 0x62, 0xc4, 0xc8, 0xa3, 0x7a, 0x07, 0x05, 0xee, 0x52, 0x0a, 0x5d, 0xa7, 0x92, 0x47, 0x87, 0x8a, + 0x68, 0x4e, 0xa9, 0xde, 0x4d, 0x57, 0x49, 0x2b, 0x22, 0x0d, 0x27, 0x21, 0xae, 0xc9, 0x11, 0x67, + 0xca, 0xd1, 0xdd, 0x45, 0xa5, 0x16, 0x07, 0x33, 0x06, 0xb1, 0x33, 0xbd, 0x38, 0xb5, 0x96, 0xb6, + 0xc3, 0x38, 0xb9, 0x45, 0x92, 0x07, 0x61, 0x74, 0x9f, 0xf9, 0xdd, 0x47, 0xb4, 0x14, 0x61, 0x29, + 0x0a, 0xeb, 0x74, 0x54, 0x13, 0x62, 0x07, 0x3e, 0xab, 0x55, 0xe6, 0x4d, 0x1f, 0x49, 0xd7, 0xce, + 0x75, 0x0e, 0xc6, 0x12, 0x2f, 0x49, 0x57, 0x6b, 0x4b, 0xcc, 0x33, 0x9e, 0x21, 0x5d, 0xad, 0x2d, + 0x61, 0x89, 0x47, 0x61, 0xe7, 0x6b, 0x4b, 0x13, 0x45, 0x4e, 0x29, 0x3a, 0x25, 0x79, 0xc1, 0x07, + 0x97, 0x1e, 0xc2, 0x94, 0x7a, 0xf1, 0x89, 0xe7, 0x6e, 0x8c, 0xa7, 0x27, 0x8b, 0x3c, 0xe8, 0xdc, + 0x35, 0x05, 0xa4, 0x0a, 0xdf, 0x5d, 0xcd, 0xf0, 0xc4, 0x1d, 0xb5, 0x18, 0xa9, 0x05, 0xa6, 0x72, + 0xd3, 0xc5, 0xcf, 0x43, 0x25, 0x6e, 0x6f, 0xb8, 0x61, 0xd3, 0xf1, 0x02, 0xe6, 0xbe, 0xd6, 0x9f, + 0x27, 0x96, 0x08, 0x9c, 0xd2, 0xa0, 0x1a, 0x8c, 0x38, 0xf2, 0x65, 0x6e, 0x54, 0xe4, 0xea, 0xb1, + 0x7a, 0x92, 0x9b, 0xf9, 0x36, 0xd5, 0x5b, 0xdc, 0x8a, 0x0b, 0x7a, 0x0d, 0xc6, 0xc5, 0xdd, 0x19, + 0x12, 0xb1, 0x56, 0x9f, 0x36, 0x03, 0xb7, 0xeb, 0x12, 0xc9, 0x26, 0x98, 0x49, 0x3b, 0xf3, 0x29, + 0x38, 0xd5, 0xb1, 0xc4, 0xfa, 0x0a, 0x7f, 0xfb, 0xb7, 0x03, 0x50, 0x51, 0x7e, 0x26, 0x34, 0x6f, + 0xba, 0x14, 0x1f, 0xcf, 0xba, 0x14, 0x47, 0xa8, 0x42, 0xa0, 0x7b, 0x11, 0xbf, 0xd0, 0xe5, 0x79, + 0xd4, 0xe7, 0x73, 0xe7, 0x54, 0xf1, 0xdb, 0x28, 0x7d, 0x3c, 0x22, 0x9b, 0xda, 0x1a, 0x03, 0x87, + 0xda, 0x1a, 0x05, 0x5f, 0x80, 0xa2, 0x56, 0x45, 0x2b, 0x74, 0x57, 0x6b, 0xd9, 0x07, 0x4e, 0x6a, + 0x14, 0x88, 0x39, 0x8e, 0x69, 0x83, 0x74, 0x8f, 0x60, 0xda, 0xe0, 0xf0, 0x11, 0xb5, 0x41, 0xc9, + 0x00, 0xa7, 0xbc, 0xd0, 0x0e, 0x9c, 0x6a, 0x98, 0xef, 0xd5, 0xa8, 0x3b, 0x26, 0x2f, 0xf6, 0xf1, + 0x5e, 0x4c, 0x5b, 0xcb, 0xcd, 0xbf, 0x94, 0xe5, 0x87, 0x3b, 0xab, 0x40, 0xaf, 0xc1, 0xc8, 0x3b, + 0x61, 0xbc, 0xe4, 0x3b, 0x71, 0x2c, 0x04, 0xa5, 0x8c, 0xe7, 0x1f, 0x79, 0xe3, 0x76, 0x9d, 0xc1, + 0x0f, 0xf8, 0x03, 0xf6, 0xf2, 0x2f, 0x56, 0x05, 0xec, 0xdf, 0xe1, 0x3e, 0x2d, 0x61, 0xe5, 0x92, + 0xb8, 0xed, 0x9f, 0x44, 0xfa, 0xeb, 0xdb, 0x86, 0x01, 0xfe, 0x08, 0xbc, 0xaa, 0xff, 0xde, 0x62, + 0x5e, 0xd5, 0x75, 0xd2, 0x6c, 0xf9, 0x4e, 0x72, 0x12, 0x81, 0x89, 0x9f, 0x87, 0x91, 0x44, 0xd4, + 0x56, 0x2c, 0x77, 0xb7, 0xd6, 0x3c, 0xe6, 0x6d, 0x56, 0x32, 0x4e, 0x42, 0xb1, 0x62, 0x68, 0xff, + 0x0b, 0xfe, 0x55, 0x24, 0xe6, 0x04, 0x4c, 0xc7, 0x5b, 0xa6, 0xe9, 0xf8, 0x5c, 0xe1, 0xbe, 0xf4, + 0x30, 0x21, 0xbf, 0x6f, 0xf6, 0x80, 0xa9, 0xa2, 0x3f, 0x3d, 0x6e, 0x7f, 0xfb, 0x36, 0x98, 0xef, + 0xfa, 0xa0, 0xd7, 0x79, 0xa8, 0x2f, 0x17, 0xb2, 0x97, 0xfa, 0x0e, 0xf3, 0xb5, 0x7f, 0xa3, 0x04, + 0x67, 0xb8, 0xe3, 0x6f, 0x61, 0x27, 0xf4, 0xdc, 0x5a, 0xe8, 0x8a, 0xc0, 0x67, 0x17, 0xc6, 0x5a, + 0x9a, 0xa9, 0x50, 0x2c, 0xab, 0x83, 0x6e, 0x5c, 0xa4, 0xea, 0x99, 0x0e, 0xc5, 0x06, 0x57, 0x5a, + 0x0b, 0xd9, 0xf1, 0x1a, 0xca, 0x8f, 0x54, 0xea, 0x5b, 0xee, 0xa9, 0x5a, 0x96, 0x35, 0x3e, 0xd8, + 0xe0, 0x7a, 0x0c, 0x69, 0xe6, 0xed, 0x5f, 0xb3, 0xe0, 0xb1, 0x1e, 0x99, 0x1f, 0x68, 0x75, 0x0f, + 0x98, 0xb3, 0x55, 0x3c, 0x1c, 0xa5, 0xaa, 0xe3, 0x2e, 0x58, 0x2c, 0xb0, 0x68, 0x03, 0x80, 0xbb, + 0x50, 0xd9, 0x13, 0xbd, 0xa5, 0x22, 0x11, 0x0f, 0x1d, 0x37, 0xac, 0xb5, 0xcb, 0xb7, 0xea, 0x51, + 0x5e, 0x8d, 0xab, 0xfd, 0xed, 0x32, 0x0c, 0xf2, 0x57, 0x42, 0x6b, 0x30, 0xbc, 0xcd, 0xf3, 0x4f, + 0xf6, 0x97, 0xfe, 0x32, 0x55, 0x05, 0x39, 0x00, 0x4b, 0x36, 0x68, 0x0d, 0x4e, 0x53, 0xbd, 0xc3, + 0x73, 0xfc, 0x2a, 0xf1, 0x9d, 0x5d, 0x69, 0x5b, 0xf0, 0xdc, 0xe3, 0x32, 0x4d, 0xee, 0xe9, 0xd5, + 0x4e, 0x12, 0xdc, 0xad, 0x1c, 0x7a, 0xbd, 0x23, 0x71, 0x14, 0xcf, 0xeb, 0xa9, 0xee, 0x6c, 0x1d, + 0x9e, 0x3c, 0x8a, 0x6a, 0x3f, 0xad, 0x0e, 0x2b, 0x4a, 0x7b, 0x06, 0xd2, 0xb4, 0x9c, 0x4c, 0x5a, + 0x54, 0x85, 0xa9, 0xb8, 0xcd, 0xce, 0x9f, 0xd7, 0xb7, 0x23, 0x12, 0x6f, 0x87, 0xbe, 0x2b, 0x5e, + 0x30, 0x53, 0x1a, 0x63, 0x3d, 0x83, 0xc7, 0x1d, 0x25, 0x28, 0x97, 0x4d, 0xc7, 0xf3, 0xdb, 0x11, + 0x49, 0xb9, 0x0c, 0x99, 0x5c, 0x56, 0x32, 0x78, 0xdc, 0x51, 0xc2, 0xfe, 0x13, 0x0b, 0x4e, 0x77, + 0x09, 0xd2, 0xe0, 0xa1, 0x83, 0x5b, 0x5e, 0x9c, 0xa8, 0x0c, 0xd3, 0x5a, 0xe8, 0x20, 0x87, 0x63, + 0x45, 0x41, 0x67, 0x21, 0x37, 0x8d, 0xb3, 0x87, 0x9f, 0xe2, 0x18, 0x5a, 0x60, 0xfb, 0x4b, 0x03, + 0x85, 0x2e, 0xc0, 0x40, 0x3b, 0x26, 0xf2, 0x79, 0x7d, 0x25, 0xa2, 0x98, 0x37, 0x84, 0x61, 0xa8, + 0xb2, 0xb3, 0xa5, 0x1c, 0x11, 0x9a, 0xb2, 0xc3, 0x5d, 0x11, 0x1c, 0x67, 0x7f, 0xb3, 0x0c, 0x93, + 0x99, 0x60, 0x2d, 0xda, 0x90, 0x66, 0x18, 0x78, 0x49, 0xa8, 0x52, 0x0f, 0xf1, 0x37, 0x58, 0x48, + 0x6b, 0x7b, 0x4d, 0xc0, 0xb1, 0xa2, 0x40, 0xcf, 0x9a, 0x4f, 0x36, 0xa7, 0x6d, 0x5e, 0xac, 0x1a, + 0xef, 0xc6, 0x15, 0xcd, 0x7a, 0xff, 0x34, 0x0c, 0xb4, 0x42, 0xf5, 0x06, 0xa8, 0x9a, 0xf4, 0x78, + 0xb1, 0x5a, 0x0b, 0x43, 0x1f, 0x33, 0x24, 0x7a, 0x46, 0xf4, 0x3e, 0xe3, 0x85, 0xc5, 0x8e, 0x1b, + 0xc6, 0xda, 0x10, 0x3c, 0x07, 0xc3, 0xf7, 0xc9, 0x6e, 0xe4, 0x05, 0x5b, 0x59, 0x1f, 0xf4, 0x0d, + 0x0e, 0xc6, 0x12, 0x6f, 0x66, 0xb6, 0x1f, 0x3e, 0xe6, 0xcc, 0xf6, 0x23, 0xb9, 0xf1, 0xa6, 0xbf, + 0x69, 0xc1, 0x24, 0xcb, 0xc7, 0x27, 0xae, 0xc3, 0x7a, 0x61, 0x70, 0x02, 0xdb, 0xe3, 0xd3, 0x30, + 0x18, 0xd1, 0x4a, 0xb3, 0xc9, 0xa9, 0x59, 0x4b, 0x30, 0xc7, 0xa1, 0x27, 0xc4, 0xf3, 0xfc, 0xf4, + 0x33, 0x8e, 0xf1, 0x64, 0xbf, 0xe9, 0x3b, 0xfb, 0xec, 0x6e, 0x03, 0x26, 0x2d, 0xdf, 0xe3, 0x8d, + 0x4e, 0x9d, 0x4e, 0x1f, 0xb4, 0xbb, 0x0d, 0x5d, 0x1b, 0xf9, 0xa8, 0xee, 0x36, 0x74, 0x67, 0x7e, + 0xb8, 0x8a, 0xfa, 0xdf, 0x4b, 0x70, 0xbe, 0x6b, 0xb9, 0xf4, 0x34, 0x6b, 0xc5, 0x38, 0xcd, 0xba, + 0x92, 0x39, 0xcd, 0xb2, 0x0f, 0x2f, 0xfd, 0x68, 0xce, 0xb7, 0xba, 0x1f, 0x3b, 0x95, 0x4f, 0xf0, + 0xd8, 0x69, 0xa0, 0xa8, 0xea, 0x30, 0x98, 0xa3, 0x3a, 0xfc, 0x81, 0x05, 0x8f, 0x77, 0x1d, 0xb2, + 0x0f, 0xdc, 0x65, 0x92, 0xae, 0xad, 0xec, 0xa1, 0x58, 0xff, 0x52, 0xb9, 0x47, 0xaf, 0x98, 0x8a, + 0x7d, 0x91, 0x4a, 0x21, 0x86, 0x8c, 0x85, 0x52, 0x34, 0xc6, 0x25, 0x10, 0x87, 0x61, 0x85, 0x45, + 0xb1, 0x76, 0x19, 0x83, 0x37, 0x72, 0xf9, 0x88, 0x0b, 0x6a, 0xce, 0xf4, 0x16, 0xea, 0xb7, 0x7c, + 0x33, 0x57, 0x34, 0xd0, 0x3d, 0xcd, 0x68, 0x2a, 0x1f, 0xc5, 0x68, 0x1a, 0xeb, 0x6e, 0x30, 0xa1, + 0x05, 0x98, 0x6c, 0x7a, 0x01, 0x7b, 0xb4, 0xce, 0xd4, 0x4a, 0xd4, 0x8d, 0xb8, 0x35, 0x13, 0x8d, + 0xb3, 0xf4, 0x33, 0xaf, 0xc1, 0xf8, 0xd1, 0x7d, 0x32, 0xef, 0x95, 0xe1, 0x67, 0x0e, 0x11, 0x0a, + 0x7c, 0x77, 0x30, 0xbe, 0x8b, 0xb6, 0x3b, 0x74, 0x7c, 0x9b, 0x1a, 0x9c, 0xd9, 0x6c, 0xfb, 0xfe, + 0x2e, 0x8b, 0x05, 0x21, 0xae, 0xa4, 0x10, 0x1a, 0x9f, 0x7a, 0x4e, 0x76, 0xa5, 0x0b, 0x0d, 0xee, + 0x5a, 0x12, 0x7d, 0x06, 0x50, 0xb8, 0xc1, 0x32, 0x56, 0xba, 0xe9, 0x2d, 0x66, 0xf6, 0x09, 0xca, + 0xe9, 0x52, 0xbd, 0xdd, 0x41, 0x81, 0xbb, 0x94, 0xa2, 0xfa, 0x1f, 0x7b, 0x89, 0x56, 0x35, 0x2b, + 0xa3, 0xff, 0x61, 0x1d, 0x89, 0x4d, 0x5a, 0x74, 0x0d, 0x4e, 0x39, 0x3b, 0x8e, 0xc7, 0x73, 0xd0, + 0x48, 0x06, 0x5c, 0x01, 0x54, 0x5e, 0x8f, 0x85, 0x2c, 0x01, 0xee, 0x2c, 0x83, 0x5a, 0x86, 0x1b, + 0x8b, 0x67, 0xa8, 0xfe, 0xe4, 0x11, 0x66, 0x70, 0x61, 0xc7, 0x96, 0xfd, 0x63, 0x8b, 0x6e, 0x7d, + 0x5d, 0xde, 0x4e, 0x33, 0x1e, 0x46, 0xd7, 0x2e, 0xa8, 0x74, 0x3e, 0x8c, 0xce, 0xfd, 0x81, 0x06, + 0x2d, 0x9f, 0x1a, 0x71, 0x1a, 0x52, 0x6a, 0x68, 0x9b, 0xe2, 0x5e, 0x96, 0xa2, 0x40, 0xf7, 0x60, + 0xd8, 0xf5, 0x76, 0xbc, 0x38, 0x8c, 0x0a, 0x3c, 0x45, 0xdc, 0x11, 0xa6, 0x98, 0x4a, 0xcb, 0x2a, + 0x67, 0x82, 0x25, 0x37, 0xfb, 0x57, 0x4a, 0x30, 0x2e, 0xeb, 0x7b, 0xa3, 0x1d, 0x26, 0xce, 0x09, + 0x6c, 0xe8, 0x6f, 0x18, 0x1b, 0xfa, 0x7c, 0xb1, 0x4b, 0x6a, 0xac, 0x71, 0x3d, 0x37, 0xf2, 0xcf, + 0x66, 0x36, 0xf2, 0xcb, 0xfd, 0x30, 0x3d, 0x7c, 0x03, 0xff, 0xd7, 0x16, 0x9c, 0x32, 0xe8, 0x4f, + 0x60, 0x1f, 0xa9, 0x99, 0xfb, 0xc8, 0x0b, 0x7d, 0xf4, 0xa6, 0xc7, 0xfe, 0xf1, 0xed, 0x52, 0xa6, + 0x17, 0x6c, 0xdf, 0xf8, 0x0a, 0x0c, 0x6c, 0x3b, 0x91, 0x5b, 0x2c, 0x19, 0x5b, 0x47, 0xf1, 0xb9, + 0xeb, 0x4e, 0xe4, 0x72, 0xe9, 0x7f, 0x49, 0xbd, 0xec, 0xe2, 0x44, 0x6e, 0x6e, 0x9c, 0x35, 0xab, + 0x14, 0x5d, 0x85, 0xa1, 0xb8, 0x11, 0xb6, 0x54, 0x44, 0xdb, 0x05, 0xfe, 0xea, 0x0b, 0x85, 0x1c, + 0xec, 0xcd, 0x22, 0xb3, 0x3a, 0x0a, 0xc6, 0x82, 0x7e, 0x86, 0x40, 0x45, 0x55, 0x7d, 0x8c, 0x11, + 0xbd, 0xef, 0x95, 0xe1, 0x74, 0x97, 0x99, 0x82, 0xbe, 0x6a, 0x8c, 0xda, 0x6b, 0x7d, 0x4f, 0xb5, + 0xf7, 0x39, 0x6e, 0x5f, 0x65, 0x56, 0x92, 0x2b, 0xe6, 0xc6, 0x11, 0xaa, 0xbf, 0x13, 0x93, 0x6c, + 0xf5, 0x14, 0x94, 0x5f, 0x3d, 0xad, 0xf6, 0x84, 0x06, 0x9f, 0x56, 0xa3, 0xda, 0x79, 0x8c, 0xdf, + 0xf8, 0xdd, 0x01, 0x38, 0xd3, 0xed, 0x1e, 0x2c, 0xfa, 0x05, 0x2b, 0x93, 0x6b, 0xfd, 0xf5, 0xfe, + 0x2f, 0xd3, 0xf2, 0x04, 0xec, 0x22, 0x77, 0xc4, 0x9c, 0x99, 0x7d, 0x3d, 0x77, 0xb4, 0x45, 0xed, + 0xec, 0x6e, 0x44, 0xc4, 0xb3, 0xe6, 0x4b, 0x79, 0xf0, 0xe9, 0x23, 0x34, 0x45, 0x24, 0xde, 0x8f, + 0x33, 0x77, 0x23, 0x24, 0x38, 0xff, 0x6e, 0x84, 0x6c, 0xc3, 0xcc, 0x16, 0x8c, 0x6a, 0xfd, 0x3a, + 0xc6, 0x29, 0xe0, 0xd1, 0xad, 0x49, 0x6b, 0xf5, 0x31, 0x4e, 0x83, 0x5f, 0xb6, 0x20, 0x13, 0xae, + 0xa2, 0x5c, 0x31, 0x56, 0x4f, 0x57, 0xcc, 0x05, 0x18, 0x88, 0x42, 0x9f, 0x64, 0x73, 0x80, 0xe3, + 0xd0, 0x27, 0x98, 0x61, 0xd4, 0x03, 0x8f, 0xe5, 0x5e, 0x0f, 0x3c, 0x52, 0xdb, 0xdc, 0x27, 0x3b, + 0x44, 0x3a, 0x46, 0x94, 0xf0, 0xbe, 0x49, 0x81, 0x98, 0xe3, 0xec, 0xdf, 0x2f, 0xc3, 0x10, 0xf7, + 0x3e, 0x9c, 0xc0, 0xee, 0x5c, 0x13, 0x8e, 0x80, 0x42, 0x77, 0x53, 0x79, 0xab, 0xe6, 0xaa, 0x4e, + 0xe2, 0xf0, 0x89, 0xa5, 0xfa, 0x98, 0x3a, 0x0f, 0xd0, 0x9c, 0x31, 0x0a, 0x33, 0x19, 0xfb, 0x16, + 0x38, 0x0f, 0x6d, 0x4c, 0xb6, 0x01, 0x62, 0xf6, 0xa4, 0x18, 0xe5, 0x21, 0x32, 0xe7, 0xbd, 0x5c, + 0xa8, 0x1d, 0x75, 0x55, 0x8c, 0xb7, 0x26, 0x4d, 0xd9, 0xa5, 0x10, 0x58, 0xe3, 0x3d, 0xf3, 0x2a, + 0x54, 0x14, 0x71, 0x9e, 0xe2, 0x3f, 0xa6, 0x4f, 0xcd, 0x3f, 0x07, 0x93, 0x99, 0xba, 0xfa, 0xb2, + 0x1b, 0x7e, 0xcb, 0x82, 0x53, 0x1d, 0x2f, 0xd5, 0xa2, 0x77, 0x2d, 0x38, 0xe3, 0x77, 0x71, 0x3f, + 0x89, 0x0f, 0x7d, 0x14, 0xc7, 0x95, 0x32, 0x1a, 0xba, 0x61, 0x71, 0xd7, 0xda, 0x64, 0x2e, 0xd0, + 0x52, 0xf7, 0x5c, 0xa0, 0xf6, 0x6f, 0x58, 0x20, 0x3e, 0xd9, 0x09, 0x28, 0x42, 0xab, 0xa6, 0x22, + 0xf4, 0xe1, 0x22, 0xb3, 0xa0, 0x87, 0x06, 0xf4, 0x7b, 0x16, 0x20, 0x4e, 0x90, 0x7d, 0x59, 0x90, + 0x7b, 0xf3, 0x34, 0x0d, 0x3e, 0x9d, 0x36, 0x0a, 0x83, 0x35, 0xaa, 0x3e, 0xd3, 0xc4, 0xab, 0x17, + 0xb9, 0xba, 0x37, 0x0c, 0x5d, 0x86, 0x51, 0xf1, 0x22, 0xcf, 0x5a, 0xfa, 0xda, 0xd6, 0x24, 0x7b, + 0xf7, 0x31, 0x05, 0x63, 0x9d, 0xc6, 0xfe, 0x9d, 0x32, 0x64, 0x23, 0x3b, 0xd0, 0xdb, 0x30, 0xd6, + 0x70, 0x5a, 0xce, 0x86, 0xe7, 0x7b, 0x89, 0x47, 0xe2, 0x62, 0x27, 0x4a, 0x4b, 0x5a, 0x09, 0xe1, + 0x0f, 0xd6, 0x20, 0xd8, 0xe0, 0x88, 0xe6, 0x00, 0x5a, 0x91, 0xb7, 0xe3, 0xf9, 0x64, 0x8b, 0xa9, + 0x1f, 0x2c, 0xc0, 0x93, 0x1f, 0x8e, 0x48, 0x28, 0xd6, 0x28, 0xba, 0x84, 0x12, 0x96, 0x4f, 0x22, + 0x94, 0x70, 0xa0, 0xcf, 0x50, 0xc2, 0xc1, 0x42, 0xa1, 0x84, 0x18, 0xce, 0x49, 0x37, 0x2e, 0xfd, + 0xbf, 0xe2, 0xf9, 0x84, 0xe7, 0xfe, 0x13, 0x01, 0xa0, 0x33, 0xfb, 0x7b, 0xb3, 0xe7, 0x70, 0x57, + 0x0a, 0xdc, 0xa3, 0xa4, 0xdd, 0x86, 0xd3, 0x75, 0x12, 0x79, 0x2c, 0x25, 0x93, 0x9b, 0x2e, 0xc0, + 0x2f, 0x40, 0x25, 0xca, 0xac, 0xfd, 0x3e, 0x6f, 0xe7, 0x69, 0x49, 0x3c, 0xe4, 0x5a, 0x4f, 0x59, + 0xda, 0x7f, 0xb9, 0x04, 0xc3, 0x22, 0x82, 0xea, 0x04, 0xf6, 0x93, 0x1b, 0x86, 0xb5, 0xf7, 0x5c, + 0xde, 0x0a, 0x66, 0xcd, 0xea, 0x69, 0xe7, 0xd5, 0x33, 0x76, 0xde, 0x0b, 0xc5, 0xd8, 0x1d, 0x6e, + 0xe1, 0xfd, 0xa0, 0x04, 0x13, 0x66, 0x44, 0xd9, 0x09, 0x0c, 0xcb, 0x9b, 0x30, 0x1c, 0x8b, 0x70, + 0xab, 0x52, 0x91, 0x60, 0x91, 0xec, 0x27, 0x56, 0x26, 0xbd, 0x0c, 0xb0, 0x92, 0xec, 0xba, 0x46, + 0x74, 0x95, 0x4f, 0x22, 0xa2, 0xcb, 0xfe, 0x5d, 0x26, 0x62, 0xf5, 0x81, 0x3c, 0x81, 0x2d, 0xe2, + 0x0d, 0x53, 0x18, 0x5f, 0x2a, 0x34, 0x23, 0x44, 0xf3, 0x7a, 0x6c, 0x15, 0xdf, 0xb5, 0x60, 0x54, + 0x10, 0x9e, 0x40, 0x07, 0x3e, 0x63, 0x76, 0xe0, 0x99, 0x42, 0x1d, 0xe8, 0xd1, 0xf2, 0xbf, 0x55, + 0x52, 0x2d, 0xaf, 0x89, 0xf7, 0x57, 0x73, 0x53, 0x43, 0x8e, 0xb4, 0xa2, 0x30, 0x09, 0x1b, 0xa1, + 0x2f, 0xb6, 0xfc, 0x27, 0xd2, 0x48, 0x7c, 0x0e, 0x3f, 0xd0, 0x7e, 0x63, 0x45, 0xcd, 0x42, 0xcc, + 0xc3, 0x28, 0x11, 0x1b, 0x56, 0xb7, 0xd7, 0x5f, 0x37, 0xe4, 0xeb, 0xda, 0x14, 0x26, 0x2e, 0xb1, + 0xf4, 0xfb, 0xaa, 0x6c, 0x1a, 0x58, 0xaf, 0x38, 0x61, 0x8d, 0xab, 0x8c, 0xf5, 0x64, 0x35, 0x0c, + 0x9a, 0x2e, 0xd6, 0x5b, 0x02, 0x8e, 0x15, 0x85, 0xfd, 0x2a, 0x93, 0xb8, 0x6c, 0x78, 0xfa, 0x8b, + 0x96, 0xff, 0x4b, 0x43, 0x6a, 0x60, 0x99, 0xe7, 0xe4, 0x16, 0x0c, 0xd2, 0x2e, 0x4a, 0xe3, 0xb0, + 0x98, 0x58, 0xa3, 0x4d, 0xd0, 0xc3, 0xd3, 0xa2, 0x24, 0xc6, 0x9c, 0x0d, 0x22, 0x1d, 0x7e, 0xf9, + 0x57, 0x0b, 0x4b, 0xca, 0x3e, 0x3c, 0xf1, 0x2c, 0x9f, 0x0e, 0x4b, 0x22, 0xb2, 0x5a, 0xcb, 0xa6, + 0xf3, 0x5c, 0x92, 0x08, 0x9c, 0xd2, 0xa0, 0x79, 0xa1, 0xbb, 0x9b, 0x8f, 0xf3, 0x4a, 0xdd, 0x5d, + 0x0e, 0x89, 0xa6, 0xbc, 0x5f, 0x86, 0x51, 0x95, 0xd0, 0xbc, 0xc6, 0xf3, 0x52, 0x57, 0xb8, 0x36, + 0xb3, 0x9c, 0x82, 0xb1, 0x4e, 0x83, 0x56, 0xe1, 0xb4, 0xab, 0x42, 0x7b, 0x6b, 0xed, 0x0d, 0xdf, + 0x6b, 0xd0, 0xa2, 0xfc, 0x72, 0xcd, 0x63, 0xfb, 0x7b, 0xb3, 0xa7, 0xab, 0x9d, 0x68, 0xdc, 0xad, + 0x0c, 0x5a, 0x87, 0xc9, 0x98, 0x27, 0x6e, 0x97, 0xf1, 0x9b, 0x22, 0xcb, 0xdd, 0xf3, 0xf2, 0x40, + 0xa0, 0x6e, 0xa2, 0x0f, 0x18, 0x88, 0xcb, 0x04, 0x19, 0xf1, 0x99, 0x65, 0x81, 0x5e, 0x87, 0x09, + 0x5f, 0x7f, 0x93, 0xaa, 0x26, 0x22, 0x9c, 0x55, 0xe8, 0x84, 0xf1, 0x62, 0x55, 0x0d, 0x67, 0xa8, + 0xd1, 0x9b, 0x30, 0xad, 0x43, 0xc4, 0x65, 0x7f, 0x27, 0xd8, 0x22, 0xb1, 0xc8, 0x18, 0xfd, 0xc4, + 0xfe, 0xde, 0xec, 0xf4, 0xcd, 0x1e, 0x34, 0xb8, 0x67, 0x69, 0x74, 0x15, 0xc6, 0xe4, 0x48, 0x6a, + 0xd1, 0xce, 0x69, 0xd0, 0x8e, 0x86, 0xc3, 0x06, 0xe5, 0xfb, 0x3b, 0xf7, 0xf8, 0x0a, 0x2d, 0xac, + 0x6d, 0xad, 0xe8, 0x4b, 0x30, 0xa6, 0xb7, 0x31, 0xbb, 0x67, 0xe6, 0xbf, 0xf3, 0x25, 0xb6, 0x68, + 0xd5, 0x72, 0x1d, 0x87, 0x0d, 0xde, 0xf6, 0x6d, 0x18, 0xaa, 0xef, 0xc6, 0x8d, 0xc4, 0x7f, 0x54, + 0xef, 0x32, 0x37, 0x60, 0x32, 0xf3, 0x80, 0xb1, 0x7a, 0x09, 0xdb, 0x7a, 0x54, 0x2f, 0x61, 0xdb, + 0x5f, 0xb3, 0x60, 0x70, 0xdd, 0xf1, 0xf2, 0xdf, 0x5a, 0x28, 0xd2, 0x64, 0xf4, 0x0a, 0x0c, 0x91, + 0xcd, 0x4d, 0xd2, 0x90, 0x2f, 0x6b, 0x3f, 0x29, 0x55, 0x9b, 0x65, 0x06, 0xa5, 0x4b, 0x93, 0x55, + 0xc6, 0xff, 0x62, 0x41, 0x6c, 0xff, 0x3b, 0x0b, 0x60, 0x3d, 0xf4, 0xe5, 0x91, 0x4e, 0x4e, 0x4b, + 0x16, 0x3b, 0x5e, 0x7d, 0x78, 0xb6, 0xcb, 0xab, 0x0f, 0x28, 0x65, 0xd8, 0xe5, 0xcd, 0x07, 0xd5, + 0x9b, 0x72, 0xa1, 0xde, 0x0c, 0xf4, 0xd3, 0x9b, 0x6f, 0x58, 0x20, 0xa2, 0x6d, 0x0a, 0xcc, 0x04, + 0x57, 0x66, 0x6a, 0x37, 0xd2, 0x78, 0x3c, 0x5f, 0xe4, 0x56, 0x8c, 0x48, 0xde, 0xa1, 0xe6, 0xa6, + 0x91, 0xb2, 0xc3, 0xe0, 0x4a, 0x0d, 0xfb, 0x51, 0x8e, 0x5e, 0x63, 0x7a, 0x64, 0x7e, 0xbb, 0xfa, + 0x4a, 0x58, 0xc6, 0x12, 0x99, 0x53, 0xc6, 0x2a, 0x71, 0x95, 0x9e, 0xc8, 0x5c, 0x22, 0x70, 0x4a, + 0x83, 0x9e, 0x83, 0xe1, 0xb8, 0xbd, 0xc1, 0xc8, 0x33, 0xa1, 0x37, 0x75, 0x0e, 0xc6, 0x12, 0x6f, + 0xff, 0x3c, 0x02, 0xa3, 0x6b, 0x46, 0x92, 0x2c, 0xeb, 0x91, 0x27, 0xc9, 0x7a, 0x0b, 0x46, 0x48, + 0xb3, 0x95, 0xec, 0x56, 0xbd, 0xa8, 0x58, 0xba, 0xc2, 0x65, 0x41, 0xdd, 0xc9, 0x5d, 0x62, 0xb0, + 0xe2, 0xd8, 0x23, 0xe5, 0x59, 0xf9, 0x03, 0x91, 0xf2, 0x6c, 0xe0, 0x27, 0x92, 0xf2, 0xec, 0x4d, + 0x18, 0xde, 0xf2, 0x12, 0x4c, 0x5a, 0xa1, 0xb8, 0x0c, 0x99, 0x73, 0x46, 0x76, 0x8d, 0x13, 0x77, + 0xe6, 0x31, 0x12, 0x08, 0x2c, 0xd9, 0xa1, 0x75, 0x18, 0xe2, 0xb6, 0x87, 0xc8, 0x22, 0xf6, 0xd1, + 0x22, 0x5e, 0x9a, 0xce, 0x84, 0x5a, 0x22, 0xbe, 0x4a, 0xf0, 0x92, 0x29, 0xce, 0x86, 0xdf, 0x7f, + 0x8a, 0x33, 0x95, 0x98, 0x6c, 0xe4, 0x51, 0x25, 0x26, 0x33, 0x12, 0xbc, 0x55, 0x8e, 0x23, 0xc1, + 0xdb, 0x37, 0x2c, 0x38, 0xdb, 0xea, 0x96, 0x1e, 0x51, 0xa4, 0x18, 0xfb, 0xd4, 0x11, 0xd2, 0x45, + 0x1a, 0x55, 0xb3, 0xcb, 0x69, 0x5d, 0xc9, 0x70, 0xf7, 0x8a, 0x65, 0xa6, 0xb8, 0xd1, 0xf7, 0x9f, + 0x29, 0xee, 0xb8, 0x73, 0x91, 0xa5, 0x79, 0xe3, 0xc6, 0x8f, 0x25, 0x6f, 0xdc, 0xc4, 0x23, 0xcc, + 0x1b, 0xa7, 0x65, 0x7c, 0x9b, 0x7c, 0xb4, 0x19, 0xdf, 0xb6, 0x61, 0xd4, 0x0d, 0x1f, 0x04, 0x0f, + 0x9c, 0xc8, 0x5d, 0xa8, 0xad, 0x8a, 0x04, 0x63, 0x39, 0x59, 0x2c, 0xaa, 0x69, 0x01, 0xa3, 0x06, + 0xee, 0x8e, 0x4c, 0x91, 0x58, 0x67, 0x2d, 0x72, 0xdf, 0x9d, 0x7a, 0x9f, 0xb9, 0xef, 0x8c, 0x0c, + 0x72, 0xe8, 0x38, 0x32, 0xc8, 0xbd, 0xcd, 0xae, 0xb3, 0x6f, 0x7a, 0x5b, 0x6b, 0x4e, 0x8b, 0x5d, + 0xde, 0xca, 0xad, 0x61, 0x49, 0x92, 0x77, 0xd6, 0xa0, 0x50, 0x38, 0x65, 0xda, 0x99, 0xa3, 0xee, + 0xcc, 0x49, 0xe7, 0xa8, 0x3b, 0x7b, 0x8c, 0x39, 0xea, 0xce, 0x9d, 0x68, 0x8e, 0xba, 0xc7, 0x7e, + 0x22, 0x39, 0xea, 0xfe, 0x02, 0x9c, 0x3f, 0xfc, 0x73, 0xa4, 0x39, 0x90, 0x6b, 0xa9, 0xcb, 0x20, + 0x93, 0x03, 0x99, 0xa9, 0x3a, 0x1a, 0x55, 0xe1, 0x54, 0x59, 0xdf, 0xb1, 0xe0, 0xb1, 0x1e, 0x99, + 0x64, 0x0a, 0xdf, 0x7b, 0x68, 0xc1, 0x64, 0xcb, 0x2c, 0x5a, 0xf8, 0xa6, 0x92, 0x91, 0xb9, 0x46, + 0xc5, 0xd0, 0x65, 0x10, 0x38, 0xcb, 0x7e, 0xf1, 0xc3, 0x3f, 0x7c, 0xef, 0xfc, 0x87, 0x7e, 0xf4, + 0xde, 0xf9, 0x0f, 0xfd, 0xd1, 0x7b, 0xe7, 0x3f, 0xf4, 0xb3, 0xfb, 0xe7, 0xad, 0x1f, 0xee, 0x9f, + 0xb7, 0x7e, 0xb4, 0x7f, 0xde, 0xfa, 0x93, 0xfd, 0xf3, 0xd6, 0x37, 0xfe, 0xf4, 0xfc, 0x87, 0x3e, + 0x57, 0xda, 0xb9, 0xfc, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x7a, 0x75, 0x32, 0x32, 0x5a, 0xb8, + 0x00, 0x00, } diff --git a/pkg/api/v1/generated.proto b/pkg/api/v1/generated.proto index d5ffcae7..4693f988 100644 --- a/pkg/api/v1/generated.proto +++ b/pkg/api/v1/generated.proto @@ -2553,6 +2553,11 @@ message PodSpec { // If specified, the pod's scheduling constraints // +optional optional Affinity affinity = 18; + + // If specified, the pod will be dispatched by specified scheduler. + // If not specified, the pod will be dispatched by default scheduler. + // +optional + optional string schedulername = 19; } // PodStatus represents information about the status of a pod. Status may trail the actual diff --git a/pkg/api/v1/helpers.go b/pkg/api/v1/helpers.go index b881c8bf..8b5b2b22 100644 --- a/pkg/api/v1/helpers.go +++ b/pkg/api/v1/helpers.go @@ -22,12 +22,12 @@ import ( "strings" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/selection" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/client-go/pkg/api" - "k8s.io/client-go/pkg/fields" ) // IsOpaqueIntResourceName returns true if the resource name has the opaque diff --git a/pkg/api/v1/types.generated.go b/pkg/api/v1/types.generated.go index f753506c..f1edbef6 100644 --- a/pkg/api/v1/types.generated.go +++ b/pkg/api/v1/types.generated.go @@ -29772,7 +29772,7 @@ func (x *PodSpec) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [18]bool + var yyq2 [19]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[0] = len(x.Volumes) != 0 @@ -29792,9 +29792,10 @@ func (x *PodSpec) CodecEncodeSelf(e *codec1978.Encoder) { yyq2[15] = x.Hostname != "" yyq2[16] = x.Subdomain != "" yyq2[17] = x.Affinity != nil + yyq2[18] = x.SchedulerName != "" var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(18) + r.EncodeArrayStart(19) } else { yynn2 = 1 for _, b := range yyq2 { @@ -30277,6 +30278,31 @@ func (x *PodSpec) CodecEncodeSelf(e *codec1978.Encoder) { } } } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[18] { + yym62 := z.EncBinary() + _ = yym62 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.SchedulerName)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[18] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("schedulername")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym63 := z.EncBinary() + _ = yym63 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.SchedulerName)) + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -30550,6 +30576,18 @@ func (x *PodSpec) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { } x.Affinity.CodecDecodeSelf(d) } + case "schedulername": + if r.TryDecodeAsNil() { + x.SchedulerName = "" + } else { + yyv36 := &x.SchedulerName + yym37 := z.DecBinary() + _ = yym37 + if false { + } else { + *((*string)(yyv36)) = r.DecodeString() + } + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -30561,16 +30599,16 @@ func (x *PodSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj36 int - var yyb36 bool - var yyhl36 bool = l >= 0 - yyj36++ - if yyhl36 { - yyb36 = yyj36 > l + var yyj38 int + var yyb38 bool + var yyhl38 bool = l >= 0 + yyj38++ + if yyhl38 { + yyb38 = yyj38 > l } else { - yyb36 = r.CheckBreak() + yyb38 = r.CheckBreak() } - if yyb36 { + if yyb38 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -30578,21 +30616,21 @@ func (x *PodSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.Volumes = nil } else { - yyv37 := &x.Volumes - yym38 := z.DecBinary() - _ = yym38 + yyv39 := &x.Volumes + yym40 := z.DecBinary() + _ = yym40 if false { } else { - h.decSliceVolume((*[]Volume)(yyv37), d) + h.decSliceVolume((*[]Volume)(yyv39), d) } } - yyj36++ - if yyhl36 { - yyb36 = yyj36 > l + yyj38++ + if yyhl38 { + yyb38 = yyj38 > l } else { - yyb36 = r.CheckBreak() + yyb38 = r.CheckBreak() } - if yyb36 { + if yyb38 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -30600,21 +30638,21 @@ func (x *PodSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.Containers = nil } else { - yyv39 := &x.Containers - yym40 := z.DecBinary() - _ = yym40 + yyv41 := &x.Containers + yym42 := z.DecBinary() + _ = yym42 if false { } else { - h.decSliceContainer((*[]Container)(yyv39), d) + h.decSliceContainer((*[]Container)(yyv41), d) } } - yyj36++ - if yyhl36 { - yyb36 = yyj36 > l + yyj38++ + if yyhl38 { + yyb38 = yyj38 > l } else { - yyb36 = r.CheckBreak() + yyb38 = r.CheckBreak() } - if yyb36 { + if yyb38 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -30622,16 +30660,16 @@ func (x *PodSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.RestartPolicy = "" } else { - yyv41 := &x.RestartPolicy - yyv41.CodecDecodeSelf(d) + yyv43 := &x.RestartPolicy + yyv43.CodecDecodeSelf(d) } - yyj36++ - if yyhl36 { - yyb36 = yyj36 > l + yyj38++ + if yyhl38 { + yyb38 = yyj38 > l } else { - yyb36 = r.CheckBreak() + yyb38 = r.CheckBreak() } - if yyb36 { + if yyb38 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -30644,20 +30682,20 @@ func (x *PodSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.TerminationGracePeriodSeconds == nil { x.TerminationGracePeriodSeconds = new(int64) } - yym43 := z.DecBinary() - _ = yym43 + yym45 := z.DecBinary() + _ = yym45 if false { } else { *((*int64)(x.TerminationGracePeriodSeconds)) = int64(r.DecodeInt(64)) } } - yyj36++ - if yyhl36 { - yyb36 = yyj36 > l + yyj38++ + if yyhl38 { + yyb38 = yyj38 > l } else { - yyb36 = r.CheckBreak() + yyb38 = r.CheckBreak() } - if yyb36 { + if yyb38 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -30670,20 +30708,20 @@ func (x *PodSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.ActiveDeadlineSeconds == nil { x.ActiveDeadlineSeconds = new(int64) } - yym45 := z.DecBinary() - _ = yym45 + yym47 := z.DecBinary() + _ = yym47 if false { } else { *((*int64)(x.ActiveDeadlineSeconds)) = int64(r.DecodeInt(64)) } } - yyj36++ - if yyhl36 { - yyb36 = yyj36 > l + yyj38++ + if yyhl38 { + yyb38 = yyj38 > l } else { - yyb36 = r.CheckBreak() + yyb38 = r.CheckBreak() } - if yyb36 { + if yyb38 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -30691,16 +30729,16 @@ func (x *PodSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.DNSPolicy = "" } else { - yyv46 := &x.DNSPolicy - yyv46.CodecDecodeSelf(d) + yyv48 := &x.DNSPolicy + yyv48.CodecDecodeSelf(d) } - yyj36++ - if yyhl36 { - yyb36 = yyj36 > l + yyj38++ + if yyhl38 { + yyb38 = yyj38 > l } else { - yyb36 = r.CheckBreak() + yyb38 = r.CheckBreak() } - if yyb36 { + if yyb38 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -30708,21 +30746,21 @@ func (x *PodSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.NodeSelector = nil } else { - yyv47 := &x.NodeSelector - yym48 := z.DecBinary() - _ = yym48 + yyv49 := &x.NodeSelector + yym50 := z.DecBinary() + _ = yym50 if false { } else { - z.F.DecMapStringStringX(yyv47, false, d) + z.F.DecMapStringStringX(yyv49, false, d) } } - yyj36++ - if yyhl36 { - yyb36 = yyj36 > l + yyj38++ + if yyhl38 { + yyb38 = yyj38 > l } else { - yyb36 = r.CheckBreak() + yyb38 = r.CheckBreak() } - if yyb36 { + if yyb38 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -30730,29 +30768,7 @@ func (x *PodSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.ServiceAccountName = "" } else { - yyv49 := &x.ServiceAccountName - yym50 := z.DecBinary() - _ = yym50 - if false { - } else { - *((*string)(yyv49)) = r.DecodeString() - } - } - yyj36++ - if yyhl36 { - yyb36 = yyj36 > l - } else { - yyb36 = r.CheckBreak() - } - if yyb36 { - z.DecSendContainerState(codecSelfer_containerArrayEnd1234) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem1234) - if r.TryDecodeAsNil() { - x.DeprecatedServiceAccount = "" - } else { - yyv51 := &x.DeprecatedServiceAccount + yyv51 := &x.ServiceAccountName yym52 := z.DecBinary() _ = yym52 if false { @@ -30760,21 +30776,21 @@ func (x *PodSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { *((*string)(yyv51)) = r.DecodeString() } } - yyj36++ - if yyhl36 { - yyb36 = yyj36 > l + yyj38++ + if yyhl38 { + yyb38 = yyj38 > l } else { - yyb36 = r.CheckBreak() + yyb38 = r.CheckBreak() } - if yyb36 { + if yyb38 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } z.DecSendContainerState(codecSelfer_containerArrayElem1234) if r.TryDecodeAsNil() { - x.NodeName = "" + x.DeprecatedServiceAccount = "" } else { - yyv53 := &x.NodeName + yyv53 := &x.DeprecatedServiceAccount yym54 := z.DecBinary() _ = yym54 if false { @@ -30782,13 +30798,35 @@ func (x *PodSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { *((*string)(yyv53)) = r.DecodeString() } } - yyj36++ - if yyhl36 { - yyb36 = yyj36 > l + yyj38++ + if yyhl38 { + yyb38 = yyj38 > l } else { - yyb36 = r.CheckBreak() + yyb38 = r.CheckBreak() } - if yyb36 { + if yyb38 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.NodeName = "" + } else { + yyv55 := &x.NodeName + yym56 := z.DecBinary() + _ = yym56 + if false { + } else { + *((*string)(yyv55)) = r.DecodeString() + } + } + yyj38++ + if yyhl38 { + yyb38 = yyj38 > l + } else { + yyb38 = r.CheckBreak() + } + if yyb38 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -30796,29 +30834,7 @@ func (x *PodSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.HostNetwork = false } else { - yyv55 := &x.HostNetwork - yym56 := z.DecBinary() - _ = yym56 - if false { - } else { - *((*bool)(yyv55)) = r.DecodeBool() - } - } - yyj36++ - if yyhl36 { - yyb36 = yyj36 > l - } else { - yyb36 = r.CheckBreak() - } - if yyb36 { - z.DecSendContainerState(codecSelfer_containerArrayEnd1234) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem1234) - if r.TryDecodeAsNil() { - x.HostPID = false - } else { - yyv57 := &x.HostPID + yyv57 := &x.HostNetwork yym58 := z.DecBinary() _ = yym58 if false { @@ -30826,21 +30842,21 @@ func (x *PodSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { *((*bool)(yyv57)) = r.DecodeBool() } } - yyj36++ - if yyhl36 { - yyb36 = yyj36 > l + yyj38++ + if yyhl38 { + yyb38 = yyj38 > l } else { - yyb36 = r.CheckBreak() + yyb38 = r.CheckBreak() } - if yyb36 { + if yyb38 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } z.DecSendContainerState(codecSelfer_containerArrayElem1234) if r.TryDecodeAsNil() { - x.HostIPC = false + x.HostPID = false } else { - yyv59 := &x.HostIPC + yyv59 := &x.HostPID yym60 := z.DecBinary() _ = yym60 if false { @@ -30848,13 +30864,35 @@ func (x *PodSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { *((*bool)(yyv59)) = r.DecodeBool() } } - yyj36++ - if yyhl36 { - yyb36 = yyj36 > l + yyj38++ + if yyhl38 { + yyb38 = yyj38 > l } else { - yyb36 = r.CheckBreak() + yyb38 = r.CheckBreak() } - if yyb36 { + if yyb38 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.HostIPC = false + } else { + yyv61 := &x.HostIPC + yym62 := z.DecBinary() + _ = yym62 + if false { + } else { + *((*bool)(yyv61)) = r.DecodeBool() + } + } + yyj38++ + if yyhl38 { + yyb38 = yyj38 > l + } else { + yyb38 = r.CheckBreak() + } + if yyb38 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -30869,13 +30907,13 @@ func (x *PodSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.SecurityContext.CodecDecodeSelf(d) } - yyj36++ - if yyhl36 { - yyb36 = yyj36 > l + yyj38++ + if yyhl38 { + yyb38 = yyj38 > l } else { - yyb36 = r.CheckBreak() + yyb38 = r.CheckBreak() } - if yyb36 { + if yyb38 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -30883,21 +30921,21 @@ func (x *PodSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.ImagePullSecrets = nil } else { - yyv62 := &x.ImagePullSecrets - yym63 := z.DecBinary() - _ = yym63 + yyv64 := &x.ImagePullSecrets + yym65 := z.DecBinary() + _ = yym65 if false { } else { - h.decSliceLocalObjectReference((*[]LocalObjectReference)(yyv62), d) + h.decSliceLocalObjectReference((*[]LocalObjectReference)(yyv64), d) } } - yyj36++ - if yyhl36 { - yyb36 = yyj36 > l + yyj38++ + if yyhl38 { + yyb38 = yyj38 > l } else { - yyb36 = r.CheckBreak() + yyb38 = r.CheckBreak() } - if yyb36 { + if yyb38 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -30905,29 +30943,7 @@ func (x *PodSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.Hostname = "" } else { - yyv64 := &x.Hostname - yym65 := z.DecBinary() - _ = yym65 - if false { - } else { - *((*string)(yyv64)) = r.DecodeString() - } - } - yyj36++ - if yyhl36 { - yyb36 = yyj36 > l - } else { - yyb36 = r.CheckBreak() - } - if yyb36 { - z.DecSendContainerState(codecSelfer_containerArrayEnd1234) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem1234) - if r.TryDecodeAsNil() { - x.Subdomain = "" - } else { - yyv66 := &x.Subdomain + yyv66 := &x.Hostname yym67 := z.DecBinary() _ = yym67 if false { @@ -30935,13 +30951,35 @@ func (x *PodSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { *((*string)(yyv66)) = r.DecodeString() } } - yyj36++ - if yyhl36 { - yyb36 = yyj36 > l + yyj38++ + if yyhl38 { + yyb38 = yyj38 > l } else { - yyb36 = r.CheckBreak() + yyb38 = r.CheckBreak() } - if yyb36 { + if yyb38 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Subdomain = "" + } else { + yyv68 := &x.Subdomain + yym69 := z.DecBinary() + _ = yym69 + if false { + } else { + *((*string)(yyv68)) = r.DecodeString() + } + } + yyj38++ + if yyhl38 { + yyb38 = yyj38 > l + } else { + yyb38 = r.CheckBreak() + } + if yyb38 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -30956,18 +30994,40 @@ func (x *PodSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.Affinity.CodecDecodeSelf(d) } - for { - yyj36++ - if yyhl36 { - yyb36 = yyj36 > l + yyj38++ + if yyhl38 { + yyb38 = yyj38 > l + } else { + yyb38 = r.CheckBreak() + } + if yyb38 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.SchedulerName = "" + } else { + yyv71 := &x.SchedulerName + yym72 := z.DecBinary() + _ = yym72 + if false { } else { - yyb36 = r.CheckBreak() + *((*string)(yyv71)) = r.DecodeString() } - if yyb36 { + } + for { + yyj38++ + if yyhl38 { + yyb38 = yyj38 > l + } else { + yyb38 = r.CheckBreak() + } + if yyb38 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj36-1, "") + z.DecStructFieldNotFound(yyj38-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -64225,7 +64285,7 @@ func (x codecSelfer1234) decSlicePod(v *[]Pod, d *codec1978.Decoder) { yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 688) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 704) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] @@ -64344,7 +64404,7 @@ func (x codecSelfer1234) decSlicePodTemplate(v *[]PodTemplate, d *codec1978.Deco yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 736) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 752) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] diff --git a/pkg/api/v1/types.go b/pkg/api/v1/types.go index ff9241dc..25c7b410 100644 --- a/pkg/api/v1/types.go +++ b/pkg/api/v1/types.go @@ -2140,6 +2140,10 @@ type PodSpec struct { // If specified, the pod's scheduling constraints // +optional Affinity *Affinity `json:"affinity,omitempty" protobuf:"bytes,18,opt,name=affinity"` + // If specified, the pod will be dispatched by specified scheduler. + // If not specified, the pod will be dispatched by default scheduler. + // +optional + SchedulerName string `json:"schedulername,omitempty" protobuf:"bytes,19,opt,name=schedulername"` } // PodSecurityContext holds pod-level security attributes and common container settings. diff --git a/pkg/api/v1/types_swagger_doc_generated.go b/pkg/api/v1/types_swagger_doc_generated.go index 010bfb7f..36c9ced8 100644 --- a/pkg/api/v1/types_swagger_doc_generated.go +++ b/pkg/api/v1/types_swagger_doc_generated.go @@ -1294,6 +1294,7 @@ var map_PodSpec = map[string]string{ "hostname": "Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value.", "subdomain": "If specified, the fully qualified Pod hostname will be \"...svc.\". If not specified, the pod will not have a domainname at all.", "affinity": "If specified, the pod's scheduling constraints", + "schedulername": "If specified, the pod will be dispatched by specified scheduler. If not specified, the pod will be dispatched by default scheduler.", } func (PodSpec) SwaggerDoc() map[string]string { diff --git a/pkg/api/v1/zz_generated.conversion.go b/pkg/api/v1/zz_generated.conversion.go index ecc51a33..aa7aabae 100644 --- a/pkg/api/v1/zz_generated.conversion.go +++ b/pkg/api/v1/zz_generated.conversion.go @@ -3069,6 +3069,7 @@ func autoConvert_v1_PodSpec_To_api_PodSpec(in *PodSpec, out *api.PodSpec, s conv out.Hostname = in.Hostname out.Subdomain = in.Subdomain out.Affinity = (*api.Affinity)(unsafe.Pointer(in.Affinity)) + out.SchedulerName = in.SchedulerName return nil } @@ -3106,6 +3107,7 @@ func autoConvert_api_PodSpec_To_v1_PodSpec(in *api.PodSpec, out *PodSpec, s conv out.Hostname = in.Hostname out.Subdomain = in.Subdomain out.Affinity = (*Affinity)(unsafe.Pointer(in.Affinity)) + out.SchedulerName = in.SchedulerName return nil } diff --git a/pkg/api/validation/path/name.go b/pkg/api/validation/path/name.go deleted file mode 100644 index a50cd089..00000000 --- a/pkg/api/validation/path/name.go +++ /dev/null @@ -1,68 +0,0 @@ -/* -Copyright 2015 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 path - -import ( - "fmt" - "strings" -) - -// NameMayNotBe specifies strings that cannot be used as names specified as path segments (like the REST API or etcd store) -var NameMayNotBe = []string{".", ".."} - -// NameMayNotContain specifies substrings that cannot be used in names specified as path segments (like the REST API or etcd store) -var NameMayNotContain = []string{"/", "%"} - -// IsValidPathSegmentName validates the name can be safely encoded as a path segment -func IsValidPathSegmentName(name string) []string { - for _, illegalName := range NameMayNotBe { - if name == illegalName { - return []string{fmt.Sprintf(`may not be '%s'`, illegalName)} - } - } - - var errors []string - for _, illegalContent := range NameMayNotContain { - if strings.Contains(name, illegalContent) { - errors = append(errors, fmt.Sprintf(`may not contain '%s'`, illegalContent)) - } - } - - return errors -} - -// IsValidPathSegmentPrefix validates the name can be used as a prefix for a name which will be encoded as a path segment -// It does not check for exact matches with disallowed names, since an arbitrary suffix might make the name valid -func IsValidPathSegmentPrefix(name string) []string { - var errors []string - for _, illegalContent := range NameMayNotContain { - if strings.Contains(name, illegalContent) { - errors = append(errors, fmt.Sprintf(`may not contain '%s'`, illegalContent)) - } - } - - return errors -} - -// ValidatePathSegmentName validates the name can be safely encoded as a path segment -func ValidatePathSegmentName(name string, prefix bool) []string { - if prefix { - return IsValidPathSegmentPrefix(name) - } else { - return IsValidPathSegmentName(name) - } -} diff --git a/pkg/api/zz_generated.deepcopy.go b/pkg/api/zz_generated.deepcopy.go index ce8a0d6e..59a75f26 100644 --- a/pkg/api/zz_generated.deepcopy.go +++ b/pkg/api/zz_generated.deepcopy.go @@ -23,10 +23,10 @@ package api import ( v1 "k8s.io/apimachinery/pkg/apis/meta/v1" conversion "k8s.io/apimachinery/pkg/conversion" + fields "k8s.io/apimachinery/pkg/fields" labels "k8s.io/apimachinery/pkg/labels" runtime "k8s.io/apimachinery/pkg/runtime" types "k8s.io/apimachinery/pkg/types" - fields "k8s.io/client-go/pkg/fields" reflect "reflect" ) diff --git a/pkg/apis/apps/v1beta1/types.generated.go b/pkg/apis/apps/v1beta1/types.generated.go index f9190224..5effa1be 100644 --- a/pkg/apis/apps/v1beta1/types.generated.go +++ b/pkg/apis/apps/v1beta1/types.generated.go @@ -1679,7 +1679,7 @@ func (x codecSelfer1234) decSliceStatefulSet(v *[]StatefulSet, d *codec1978.Deco yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 808) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 824) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] diff --git a/pkg/apis/batch/v1/types.generated.go b/pkg/apis/batch/v1/types.generated.go index 62ab84c0..be841598 100644 --- a/pkg/apis/batch/v1/types.generated.go +++ b/pkg/apis/batch/v1/types.generated.go @@ -2481,7 +2481,7 @@ func (x codecSelfer1234) decSliceJob(v *[]Job, d *codec1978.Decoder) { yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 832) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 848) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] diff --git a/pkg/apis/batch/v2alpha1/types.generated.go b/pkg/apis/batch/v2alpha1/types.generated.go index 6c81a390..e5815f46 100644 --- a/pkg/apis/batch/v2alpha1/types.generated.go +++ b/pkg/apis/batch/v2alpha1/types.generated.go @@ -4534,7 +4534,7 @@ func (x codecSelfer1234) decSliceJob(v *[]Job, d *codec1978.Decoder) { yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 832) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 848) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] @@ -4772,7 +4772,7 @@ func (x codecSelfer1234) decSliceCronJob(v *[]CronJob, d *codec1978.Decoder) { yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 1080) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 1096) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] diff --git a/pkg/apis/extensions/v1beta1/types.generated.go b/pkg/apis/extensions/v1beta1/types.generated.go index 6e69e1da..bad0b479 100644 --- a/pkg/apis/extensions/v1beta1/types.generated.go +++ b/pkg/apis/extensions/v1beta1/types.generated.go @@ -21093,7 +21093,7 @@ func (x codecSelfer1234) decSliceDeployment(v *[]Deployment, d *codec1978.Decode yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 872) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 888) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] @@ -21212,7 +21212,7 @@ func (x codecSelfer1234) decSliceDaemonSet(v *[]DaemonSet, d *codec1978.Decoder) yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 768) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 784) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] @@ -21926,7 +21926,7 @@ func (x codecSelfer1234) decSliceReplicaSet(v *[]ReplicaSet, d *codec1978.Decode yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 808) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 824) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] diff --git a/pkg/apis/kubeadm/types.go b/pkg/apis/kubeadm/types.go index f922bf0e..aa6f6e00 100644 --- a/pkg/apis/kubeadm/types.go +++ b/pkg/apis/kubeadm/types.go @@ -39,6 +39,7 @@ type MasterConfiguration struct { Networking Networking KubernetesVersion string CloudProvider string + AuthorizationMode string } type API struct { diff --git a/pkg/apis/kubeadm/v1alpha1/defaults.go b/pkg/apis/kubeadm/v1alpha1/defaults.go index f676020e..2d5c0d27 100644 --- a/pkg/apis/kubeadm/v1alpha1/defaults.go +++ b/pkg/apis/kubeadm/v1alpha1/defaults.go @@ -16,9 +16,7 @@ limitations under the License. package v1alpha1 -import ( - "k8s.io/apimachinery/pkg/runtime" -) +import "k8s.io/apimachinery/pkg/runtime" const ( DefaultServiceDNSDomain = "cluster.local" @@ -27,6 +25,7 @@ const ( DefaultKubernetesFallbackVersion = "v1.5.0" DefaultAPIBindPort = 6443 DefaultDiscoveryBindPort = 9898 + DefaultAuthorizationMode = "RBAC" ) func addDefaultingFuncs(scheme *runtime.Scheme) error { @@ -56,4 +55,8 @@ func SetDefaults_MasterConfiguration(obj *MasterConfiguration) { if obj.Discovery.Token == nil && obj.Discovery.File == nil && obj.Discovery.HTTPS == nil { obj.Discovery.Token = &TokenDiscovery{} } + + if obj.AuthorizationMode == "" { + obj.AuthorizationMode = DefaultAuthorizationMode + } } diff --git a/pkg/apis/kubeadm/v1alpha1/types.go b/pkg/apis/kubeadm/v1alpha1/types.go index cc26c3de..91dca1f9 100644 --- a/pkg/apis/kubeadm/v1alpha1/types.go +++ b/pkg/apis/kubeadm/v1alpha1/types.go @@ -29,6 +29,7 @@ type MasterConfiguration struct { Networking Networking `json:"networking"` KubernetesVersion string `json:"kubernetesVersion"` CloudProvider string `json:"cloudProvider"` + AuthorizationMode string `json:"authorizationMode"` } type API struct { diff --git a/pkg/apis/policy/v1alpha1/doc.go b/pkg/apis/policy/v1alpha1/doc.go deleted file mode 100644 index 65d58233..00000000 --- a/pkg/apis/policy/v1alpha1/doc.go +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright 2016 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 policy is for any kind of policy object. Suitable examples, even if -// they aren't all here, are PodDisruptionBudget, PodSecurityPolicy, -// NetworkPolicy, etc. -package v1alpha1 diff --git a/pkg/apis/policy/v1alpha1/register.go b/pkg/apis/policy/v1alpha1/register.go deleted file mode 100644 index ac924635..00000000 --- a/pkg/apis/policy/v1alpha1/register.go +++ /dev/null @@ -1,56 +0,0 @@ -/* -Copyright 2015 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 v1alpha1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/client-go/pkg/api/v1" -) - -// GroupName is the group name use in this package -const GroupName = "policy" - -// SchemeGroupVersion is group version used to register these objects -var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1alpha1"} - -// Resource takes an unqualified resource and returns a Group qualified GroupResource -func Resource(resource string) schema.GroupResource { - return SchemeGroupVersion.WithResource(resource).GroupResource() -} - -var ( - SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) - AddToScheme = SchemeBuilder.AddToScheme -) - -// Adds the list of known types to api.Scheme. -func addKnownTypes(scheme *runtime.Scheme) error { - scheme.AddKnownTypes(SchemeGroupVersion, - &PodDisruptionBudget{}, - &PodDisruptionBudgetList{}, - &Eviction{}, - &v1.ListOptions{}, - &v1.DeleteOptions{}, - &metav1.ExportOptions{}, - &metav1.GetOptions{}, - ) - // Add the watch version that applies - metav1.AddToGroupVersion(scheme, SchemeGroupVersion) - return nil -} diff --git a/pkg/apis/policy/v1alpha1/types.go b/pkg/apis/policy/v1alpha1/types.go deleted file mode 100644 index 6c875028..00000000 --- a/pkg/apis/policy/v1alpha1/types.go +++ /dev/null @@ -1,93 +0,0 @@ -/* -Copyright 2016 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 v1alpha1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/pkg/api/v1" - "k8s.io/client-go/pkg/util/intstr" -) - -// PodDisruptionBudgetSpec is a description of a PodDisruptionBudget. -type PodDisruptionBudgetSpec struct { - // An eviction is allowed if at least "minAvailable" pods selected by - // "selector" will still be available after the eviction, i.e. even in the - // absence of the evicted pod. So for example you can prevent all voluntary - // evictions by specifying "100%". - // +optional - MinAvailable intstr.IntOrString `json:"minAvailable,omitempty" protobuf:"bytes,1,opt,name=minAvailable"` - - // Label query over pods whose evictions are managed by the disruption - // budget. - // +optional - Selector *metav1.LabelSelector `json:"selector,omitempty" protobuf:"bytes,2,opt,name=selector"` -} - -// PodDisruptionBudgetStatus represents information about the status of a -// PodDisruptionBudget. Status may trail the actual state of a system. -type PodDisruptionBudgetStatus struct { - // Whether or not a disruption is currently allowed. - PodDisruptionAllowed bool `json:"disruptionAllowed" protobuf:"varint,1,opt,name=disruptionAllowed"` - - // current number of healthy pods - CurrentHealthy int32 `json:"currentHealthy" protobuf:"varint,2,opt,name=currentHealthy"` - - // minimum desired number of healthy pods - DesiredHealthy int32 `json:"desiredHealthy" protobuf:"varint,3,opt,name=desiredHealthy"` - - // total number of pods counted by this disruption budget - ExpectedPods int32 `json:"expectedPods" protobuf:"varint,4,opt,name=expectedPods"` -} - -// +genclient=true - -// PodDisruptionBudget is an object to define the max disruption that can be caused to a collection of pods -type PodDisruptionBudget struct { - metav1.TypeMeta `json:",inline"` - // +optional - metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - - // Specification of the desired behavior of the PodDisruptionBudget. - // +optional - Spec PodDisruptionBudgetSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` - // Most recently observed status of the PodDisruptionBudget. - // +optional - Status PodDisruptionBudgetStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` -} - -// PodDisruptionBudgetList is a collection of PodDisruptionBudgets. -type PodDisruptionBudgetList struct { - metav1.TypeMeta `json:",inline"` - // +optional - metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - Items []PodDisruptionBudget `json:"items" protobuf:"bytes,2,rep,name=items"` -} - -// Eviction evicts a pod from its node subject to certain policies and safety constraints. -// This is a subresource of Pod. A request to cause such an eviction is -// created by POSTing to .../pods//eviction. -type Eviction struct { - metav1.TypeMeta `json:",inline"` - - // ObjectMeta describes the pod that is being evicted. - // +optional - metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - - // DeleteOptions may be provided - // +optional - DeleteOptions *v1.DeleteOptions `json:"deleteOptions,omitempty" protobuf:"bytes,2,opt,name=deleteOptions"` -} diff --git a/pkg/util/cert/cert.go b/pkg/util/cert/cert.go index fff5b38d..941d6db6 100644 --- a/pkg/util/cert/cert.go +++ b/pkg/util/cert/cert.go @@ -25,6 +25,7 @@ import ( "crypto/x509" "crypto/x509/pkix" "encoding/pem" + "errors" "fmt" "math" "math/big" @@ -42,6 +43,7 @@ type Config struct { CommonName string Organization []string AltNames AltNames + Usages []x509.ExtKeyUsage } // AltNames contains the domain names and IP addresses that will be added @@ -86,11 +88,17 @@ func NewSignedCert(cfg Config, key *rsa.PrivateKey, caCert *x509.Certificate, ca if err != nil { return nil, err } + if len(cfg.CommonName) == 0 { + return nil, errors.New("must specify a CommonName") + } + if len(cfg.Usages) == 0 { + return nil, errors.New("must specify at least one ExtKeyUsage") + } certTmpl := x509.Certificate{ Subject: pkix.Name{ CommonName: cfg.CommonName, - Organization: caCert.Subject.Organization, + Organization: cfg.Organization, }, DNSNames: cfg.AltNames.DNSNames, IPAddresses: cfg.AltNames.IPs, @@ -98,7 +106,7 @@ func NewSignedCert(cfg Config, key *rsa.PrivateKey, caCert *x509.Certificate, ca NotBefore: caCert.NotBefore, NotAfter: time.Now().Add(duration365d).UTC(), KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, - ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth, x509.ExtKeyUsageClientAuth}, + ExtKeyUsage: cfg.Usages, } certDERBytes, err := x509.CreateCertificate(cryptorand.Reader, &certTmpl, caCert, key.Public(), caKey) if err != nil { diff --git a/kubernetes/typed/policy/v1alpha1/doc.go b/pkg/util/cert/csr_test.go similarity index 52% rename from kubernetes/typed/policy/v1alpha1/doc.go rename to pkg/util/cert/csr_test.go index bc5df818..96973f7a 100644 --- a/kubernetes/typed/policy/v1alpha1/doc.go +++ b/pkg/util/cert/csr_test.go @@ -14,7 +14,33 @@ See the License for the specific language governing permissions and limitations under the License. */ -// This package is generated by client-gen with arguments: --clientset-name=release_1_5 --input=[api/v1,apps/v1beta1,authentication/v1beta1,authorization/v1beta1,autoscaling/v1,batch/v1,batch/v2alpha1,certificates/v1alpha1,extensions/v1beta1,policy/v1alpha1,rbac/v1alpha1,storage/v1beta1] +package cert -// This package has the automatically generated typed clients. -package v1alpha1 +import ( + "crypto/x509/pkix" + "io/ioutil" + "net" + "testing" +) + +func TestMakeCSR(t *testing.T) { + keyFile := "testdata/dontUseThisKey.pem" + subject := &pkix.Name{ + CommonName: "kube-worker", + } + dnsSANs := []string{"localhost"} + ipSANs := []net.IP{net.ParseIP("127.0.0.1")} + + keyData, err := ioutil.ReadFile(keyFile) + if err != nil { + t.Fatal(err) + } + key, err := ParsePrivateKeyPEM(keyData) + if err != nil { + t.Fatal(err) + } + _, err = MakeCSR(key, subject, dnsSANs, ipSANs) + if err != nil { + t.Error(err) + } +} diff --git a/pkg/util/cert/testdata/dontUseThisKey.pem b/pkg/util/cert/testdata/dontUseThisKey.pem new file mode 100644 index 00000000..d6432631 --- /dev/null +++ b/pkg/util/cert/testdata/dontUseThisKey.pem @@ -0,0 +1,6 @@ +-----BEGIN EC PRIVATE KEY----- +MIGkAgEBBDAPEbSXwyDfWf0+61Oofd7aHkmdX69mrzD2Xb1CHF5syfsoRIhnG0dJ +ozBulPZCDDWgBwYFK4EEACKhZANiAATjlMJAtKhEPqU/i7MsrgKcK/RmXHC6He7W +0p69+9qFXg2raJ9zvvbKxkiu2ELOYRDAz0utcFTBOIgoUJEzBVmsjZQ7dvFa1BKP +Ym7MFAKG3O2espBqXn+audgdHGh5B0I= +-----END EC PRIVATE KEY----- diff --git a/pkg/util/cert/triple/triple.go b/pkg/util/cert/triple/triple.go new file mode 100644 index 00000000..8719b82e --- /dev/null +++ b/pkg/util/cert/triple/triple.go @@ -0,0 +1,116 @@ +/* +Copyright 2016 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 triple generates key-certificate pairs for the +// triple (CA, Server, Client). +package triple + +import ( + "crypto/rsa" + "crypto/x509" + "fmt" + "net" + + certutil "k8s.io/client-go/pkg/util/cert" +) + +type KeyPair struct { + Key *rsa.PrivateKey + Cert *x509.Certificate +} + +func NewCA(name string) (*KeyPair, error) { + key, err := certutil.NewPrivateKey() + if err != nil { + return nil, fmt.Errorf("unable to create a private key for a new CA: %v", err) + } + + config := certutil.Config{ + CommonName: name, + } + + cert, err := certutil.NewSelfSignedCACert(config, key) + if err != nil { + return nil, fmt.Errorf("unable to create a self-signed certificate for a new CA: %v", err) + } + + return &KeyPair{ + Key: key, + Cert: cert, + }, nil +} + +func NewServerKeyPair(ca *KeyPair, commonName, svcName, svcNamespace, dnsDomain string, ips, hostnames []string) (*KeyPair, error) { + key, err := certutil.NewPrivateKey() + if err != nil { + return nil, fmt.Errorf("unable to create a server private key: %v", err) + } + + namespacedName := fmt.Sprintf("%s.%s", svcName, svcNamespace) + internalAPIServerFQDN := []string{ + svcName, + namespacedName, + fmt.Sprintf("%s.svc", namespacedName), + fmt.Sprintf("%s.svc.%s", namespacedName, dnsDomain), + } + + altNames := certutil.AltNames{} + for _, ipStr := range ips { + ip := net.ParseIP(ipStr) + if ip != nil { + altNames.IPs = append(altNames.IPs, ip) + } + } + altNames.DNSNames = append(altNames.DNSNames, hostnames...) + altNames.DNSNames = append(altNames.DNSNames, internalAPIServerFQDN...) + + config := certutil.Config{ + CommonName: commonName, + AltNames: altNames, + Usages: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, + } + cert, err := certutil.NewSignedCert(config, key, ca.Cert, ca.Key) + if err != nil { + return nil, fmt.Errorf("unable to sign the server certificate: %v", err) + } + + return &KeyPair{ + Key: key, + Cert: cert, + }, nil +} + +func NewClientKeyPair(ca *KeyPair, commonName string, organizations []string) (*KeyPair, error) { + key, err := certutil.NewPrivateKey() + if err != nil { + return nil, fmt.Errorf("unable to create a client private key: %v", err) + } + + config := certutil.Config{ + CommonName: commonName, + Organization: organizations, + Usages: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth}, + } + cert, err := certutil.NewSignedCert(config, key, ca.Cert, ca.Key) + if err != nil { + return nil, fmt.Errorf("unable to sign the client certificate: %v", err) + } + + return &KeyPair{ + Key: key, + Cert: cert, + }, nil +} diff --git a/pkg/util/clock/clock_test.go b/pkg/util/clock/clock_test.go new file mode 100644 index 00000000..27d34605 --- /dev/null +++ b/pkg/util/clock/clock_test.go @@ -0,0 +1,184 @@ +/* +Copyright 2015 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 clock + +import ( + "testing" + "time" +) + +func TestFakeClock(t *testing.T) { + startTime := time.Now() + tc := NewFakeClock(startTime) + tc.Step(time.Second) + now := tc.Now() + if now.Sub(startTime) != time.Second { + t.Errorf("input: %s now=%s gap=%s expected=%s", startTime, now, now.Sub(startTime), time.Second) + } + + tt := tc.Now() + tc.SetTime(tt.Add(time.Hour)) + if tc.Now().Sub(tt) != time.Hour { + t.Errorf("input: %s now=%s gap=%s expected=%s", tt, tc.Now(), tc.Now().Sub(tt), time.Hour) + } +} + +func TestFakeClockSleep(t *testing.T) { + startTime := time.Now() + tc := NewFakeClock(startTime) + tc.Sleep(time.Duration(1) * time.Hour) + now := tc.Now() + if now.Sub(startTime) != time.Hour { + t.Errorf("Fake sleep failed, expected time to advance by one hour, instead, its %v", now.Sub(startTime)) + } +} + +func TestFakeAfter(t *testing.T) { + tc := NewFakeClock(time.Now()) + if tc.HasWaiters() { + t.Errorf("unexpected waiter?") + } + oneSec := tc.After(time.Second) + if !tc.HasWaiters() { + t.Errorf("unexpected lack of waiter?") + } + + oneOhOneSec := tc.After(time.Second + time.Millisecond) + twoSec := tc.After(2 * time.Second) + select { + case <-oneSec: + t.Errorf("unexpected channel read") + case <-oneOhOneSec: + t.Errorf("unexpected channel read") + case <-twoSec: + t.Errorf("unexpected channel read") + default: + } + + tc.Step(999 * time.Millisecond) + select { + case <-oneSec: + t.Errorf("unexpected channel read") + case <-oneOhOneSec: + t.Errorf("unexpected channel read") + case <-twoSec: + t.Errorf("unexpected channel read") + default: + } + + tc.Step(time.Millisecond) + select { + case <-oneSec: + // Expected! + case <-oneOhOneSec: + t.Errorf("unexpected channel read") + case <-twoSec: + t.Errorf("unexpected channel read") + default: + t.Errorf("unexpected non-channel read") + } + tc.Step(time.Millisecond) + select { + case <-oneSec: + // should not double-trigger! + t.Errorf("unexpected channel read") + case <-oneOhOneSec: + // Expected! + case <-twoSec: + t.Errorf("unexpected channel read") + default: + t.Errorf("unexpected non-channel read") + } +} + +func TestFakeTick(t *testing.T) { + tc := NewFakeClock(time.Now()) + if tc.HasWaiters() { + t.Errorf("unexpected waiter?") + } + oneSec := tc.Tick(time.Second) + if !tc.HasWaiters() { + t.Errorf("unexpected lack of waiter?") + } + + oneOhOneSec := tc.Tick(time.Second + time.Millisecond) + twoSec := tc.Tick(2 * time.Second) + select { + case <-oneSec: + t.Errorf("unexpected channel read") + case <-oneOhOneSec: + t.Errorf("unexpected channel read") + case <-twoSec: + t.Errorf("unexpected channel read") + default: + } + + tc.Step(999 * time.Millisecond) // t=.999 + select { + case <-oneSec: + t.Errorf("unexpected channel read") + case <-oneOhOneSec: + t.Errorf("unexpected channel read") + case <-twoSec: + t.Errorf("unexpected channel read") + default: + } + + tc.Step(time.Millisecond) // t=1.000 + select { + case <-oneSec: + // Expected! + case <-oneOhOneSec: + t.Errorf("unexpected channel read") + case <-twoSec: + t.Errorf("unexpected channel read") + default: + t.Errorf("unexpected non-channel read") + } + tc.Step(time.Millisecond) // t=1.001 + select { + case <-oneSec: + // should not double-trigger! + t.Errorf("unexpected channel read") + case <-oneOhOneSec: + // Expected! + case <-twoSec: + t.Errorf("unexpected channel read") + default: + t.Errorf("unexpected non-channel read") + } + + tc.Step(time.Second) // t=2.001 + tc.Step(time.Second) // t=3.001 + tc.Step(time.Second) // t=4.001 + tc.Step(time.Second) // t=5.001 + + // The one second ticker should not accumulate ticks + accumulatedTicks := 0 + drained := false + for !drained { + select { + case <-oneSec: + accumulatedTicks++ + default: + drained = true + } + } + if accumulatedTicks != 1 { + t.Errorf("unexpected number of accumulated ticks: %d", accumulatedTicks) + } +} diff --git a/pkg/util/flowcontrol/backoff_test.go b/pkg/util/flowcontrol/backoff_test.go new file mode 100644 index 00000000..9cd9bb5c --- /dev/null +++ b/pkg/util/flowcontrol/backoff_test.go @@ -0,0 +1,195 @@ +/* +Copyright 2015 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 flowcontrol + +import ( + "testing" + "time" + + "k8s.io/client-go/pkg/util/clock" +) + +func TestSlowBackoff(t *testing.T) { + id := "_idSlow" + tc := clock.NewFakeClock(time.Now()) + step := time.Second + maxDuration := 50 * step + + b := NewFakeBackOff(step, maxDuration, tc) + cases := []time.Duration{0, 1, 2, 4, 8, 16, 32, 50, 50, 50} + for ix, c := range cases { + tc.Step(step) + w := b.Get(id) + if w != c*step { + t.Errorf("input: '%d': expected %s, got %s", ix, c*step, w) + } + b.Next(id, tc.Now()) + } + + //Now confirm that the Reset cancels backoff. + b.Next(id, tc.Now()) + b.Reset(id) + if b.Get(id) != 0 { + t.Errorf("Reset didn't clear the backoff.") + } + +} + +func TestBackoffReset(t *testing.T) { + id := "_idReset" + tc := clock.NewFakeClock(time.Now()) + step := time.Second + maxDuration := step * 5 + b := NewFakeBackOff(step, maxDuration, tc) + startTime := tc.Now() + + // get to backoff = maxDuration + for i := 0; i <= int(maxDuration/step); i++ { + tc.Step(step) + b.Next(id, tc.Now()) + } + + // backoff should be capped at maxDuration + if !b.IsInBackOffSince(id, tc.Now()) { + t.Errorf("expected to be in Backoff got %s", b.Get(id)) + } + + lastUpdate := tc.Now() + tc.Step(2*maxDuration + step) // time += 11s, 11 > 2*maxDuration + if b.IsInBackOffSince(id, lastUpdate) { + t.Errorf("expected to not be in Backoff after reset (start=%s, now=%s, lastUpdate=%s), got %s", startTime, tc.Now(), lastUpdate, b.Get(id)) + } +} + +func TestBackoffHightWaterMark(t *testing.T) { + id := "_idHiWaterMark" + tc := clock.NewFakeClock(time.Now()) + step := time.Second + maxDuration := 5 * step + b := NewFakeBackOff(step, maxDuration, tc) + + // get to backoff = maxDuration + for i := 0; i <= int(maxDuration/step); i++ { + tc.Step(step) + b.Next(id, tc.Now()) + } + + // backoff high watermark expires after 2*maxDuration + tc.Step(maxDuration + step) + b.Next(id, tc.Now()) + + if b.Get(id) != maxDuration { + t.Errorf("expected Backoff to stay at high watermark %s got %s", maxDuration, b.Get(id)) + } +} + +func TestBackoffGC(t *testing.T) { + id := "_idGC" + tc := clock.NewFakeClock(time.Now()) + step := time.Second + maxDuration := 5 * step + + b := NewFakeBackOff(step, maxDuration, tc) + + for i := 0; i <= int(maxDuration/step); i++ { + tc.Step(step) + b.Next(id, tc.Now()) + } + lastUpdate := tc.Now() + tc.Step(maxDuration + step) + b.GC() + _, found := b.perItemBackoff[id] + if !found { + t.Errorf("expected GC to skip entry, elapsed time=%s maxDuration=%s", tc.Now().Sub(lastUpdate), maxDuration) + } + + tc.Step(maxDuration + step) + b.GC() + r, found := b.perItemBackoff[id] + if found { + t.Errorf("expected GC of entry after %s got entry %v", tc.Now().Sub(lastUpdate), r) + } +} + +func TestIsInBackOffSinceUpdate(t *testing.T) { + id := "_idIsInBackOffSinceUpdate" + tc := clock.NewFakeClock(time.Now()) + step := time.Second + maxDuration := 10 * step + b := NewFakeBackOff(step, maxDuration, tc) + startTime := tc.Now() + + cases := []struct { + tick time.Duration + inBackOff bool + value int + }{ + {tick: 0, inBackOff: false, value: 0}, + {tick: 1, inBackOff: false, value: 1}, + {tick: 2, inBackOff: true, value: 2}, + {tick: 3, inBackOff: false, value: 2}, + {tick: 4, inBackOff: true, value: 4}, + {tick: 5, inBackOff: true, value: 4}, + {tick: 6, inBackOff: true, value: 4}, + {tick: 7, inBackOff: false, value: 4}, + {tick: 8, inBackOff: true, value: 8}, + {tick: 9, inBackOff: true, value: 8}, + {tick: 10, inBackOff: true, value: 8}, + {tick: 11, inBackOff: true, value: 8}, + {tick: 12, inBackOff: true, value: 8}, + {tick: 13, inBackOff: true, value: 8}, + {tick: 14, inBackOff: true, value: 8}, + {tick: 15, inBackOff: false, value: 8}, + {tick: 16, inBackOff: true, value: 10}, + {tick: 17, inBackOff: true, value: 10}, + {tick: 18, inBackOff: true, value: 10}, + {tick: 19, inBackOff: true, value: 10}, + {tick: 20, inBackOff: true, value: 10}, + {tick: 21, inBackOff: true, value: 10}, + {tick: 22, inBackOff: true, value: 10}, + {tick: 23, inBackOff: true, value: 10}, + {tick: 24, inBackOff: true, value: 10}, + {tick: 25, inBackOff: false, value: 10}, + {tick: 26, inBackOff: true, value: 10}, + {tick: 27, inBackOff: true, value: 10}, + {tick: 28, inBackOff: true, value: 10}, + {tick: 29, inBackOff: true, value: 10}, + {tick: 30, inBackOff: true, value: 10}, + {tick: 31, inBackOff: true, value: 10}, + {tick: 32, inBackOff: true, value: 10}, + {tick: 33, inBackOff: true, value: 10}, + {tick: 34, inBackOff: true, value: 10}, + {tick: 35, inBackOff: false, value: 10}, + {tick: 56, inBackOff: false, value: 0}, + {tick: 57, inBackOff: false, value: 1}, + } + + for _, c := range cases { + tc.SetTime(startTime.Add(c.tick * step)) + if c.inBackOff != b.IsInBackOffSinceUpdate(id, tc.Now()) { + t.Errorf("expected IsInBackOffSinceUpdate %v got %v at tick %s", c.inBackOff, b.IsInBackOffSinceUpdate(id, tc.Now()), c.tick*step) + } + + if c.inBackOff && (time.Duration(c.value)*step != b.Get(id)) { + t.Errorf("expected backoff value=%s got %s at tick %s", time.Duration(c.value)*step, b.Get(id), c.tick*step) + } + + if !c.inBackOff { + b.Next(id, tc.Now()) + } + } +} diff --git a/pkg/util/flowcontrol/throttle_test.go b/pkg/util/flowcontrol/throttle_test.go new file mode 100644 index 00000000..642020fe --- /dev/null +++ b/pkg/util/flowcontrol/throttle_test.go @@ -0,0 +1,177 @@ +/* +Copyright 2014 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 flowcontrol + +import ( + "math" + "sync" + "testing" + "time" +) + +func TestMultithreadedThrottling(t *testing.T) { + // Bucket with 100QPS and no burst + r := NewTokenBucketRateLimiter(100, 1) + + // channel to collect 100 tokens + taken := make(chan bool, 100) + + // Set up goroutines to hammer the throttler + startCh := make(chan bool) + endCh := make(chan bool) + for i := 0; i < 10; i++ { + go func() { + // wait for the starting signal + <-startCh + for { + // get a token + r.Accept() + select { + // try to add it to the taken channel + case taken <- true: + continue + // if taken is full, notify and return + default: + endCh <- true + return + } + } + }() + } + + // record wall time + startTime := time.Now() + // take the initial capacity so all tokens are the result of refill + r.Accept() + // start the thundering herd + close(startCh) + // wait for the first signal that we collected 100 tokens + <-endCh + // record wall time + endTime := time.Now() + + // tolerate a 1% clock change because these things happen + if duration := endTime.Sub(startTime); duration < (time.Second * 99 / 100) { + // We shouldn't be able to get 100 tokens out of the bucket in less than 1 second of wall clock time, no matter what + t.Errorf("Expected it to take at least 1 second to get 100 tokens, took %v", duration) + } else { + t.Logf("Took %v to get 100 tokens", duration) + } +} + +func TestBasicThrottle(t *testing.T) { + r := NewTokenBucketRateLimiter(1, 3) + for i := 0; i < 3; i++ { + if !r.TryAccept() { + t.Error("unexpected false accept") + } + } + if r.TryAccept() { + t.Error("unexpected true accept") + } +} + +func TestIncrementThrottle(t *testing.T) { + r := NewTokenBucketRateLimiter(1, 1) + if !r.TryAccept() { + t.Error("unexpected false accept") + } + if r.TryAccept() { + t.Error("unexpected true accept") + } + + // Allow to refill + time.Sleep(2 * time.Second) + + if !r.TryAccept() { + t.Error("unexpected false accept") + } +} + +func TestThrottle(t *testing.T) { + r := NewTokenBucketRateLimiter(10, 5) + + // Should consume 5 tokens immediately, then + // the remaining 11 should take at least 1 second (0.1s each) + expectedFinish := time.Now().Add(time.Second * 1) + for i := 0; i < 16; i++ { + r.Accept() + } + if time.Now().Before(expectedFinish) { + t.Error("rate limit was not respected, finished too early") + } +} + +func TestRateLimiterSaturation(t *testing.T) { + const e = 0.000001 + tests := []struct { + capacity int + take int + + expectedSaturation float64 + }{ + {1, 1, 1}, + {10, 3, 0.3}, + } + for i, tt := range tests { + rl := NewTokenBucketRateLimiter(1, tt.capacity) + for i := 0; i < tt.take; i++ { + rl.Accept() + } + if math.Abs(rl.Saturation()-tt.expectedSaturation) > e { + t.Fatalf("#%d: Saturation rate difference isn't within tolerable range\n want=%f, get=%f", + i, tt.expectedSaturation, rl.Saturation()) + } + } +} + +func TestAlwaysFake(t *testing.T) { + rl := NewFakeAlwaysRateLimiter() + if !rl.TryAccept() { + t.Error("TryAccept in AlwaysFake should return true.") + } + // If this will block the test will timeout + rl.Accept() +} + +func TestNeverFake(t *testing.T) { + rl := NewFakeNeverRateLimiter() + if rl.TryAccept() { + t.Error("TryAccept in NeverFake should return false.") + } + + finished := false + wg := sync.WaitGroup{} + wg.Add(1) + go func() { + rl.Accept() + finished = true + wg.Done() + }() + + // Wait some time to make sure it never finished. + time.Sleep(time.Second) + if finished { + t.Error("Accept should block forever in NeverFake.") + } + + rl.Stop() + wg.Wait() + if !finished { + t.Error("Stop should make Accept unblock in NeverFake.") + } +} diff --git a/pkg/util/integer/integer_test.go b/pkg/util/integer/integer_test.go new file mode 100644 index 00000000..e9f58688 --- /dev/null +++ b/pkg/util/integer/integer_test.go @@ -0,0 +1,244 @@ +/* +Copyright 2016 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 integer + +import "testing" + +func TestIntMax(t *testing.T) { + tests := []struct { + nums []int + expectedMax int + }{ + { + nums: []int{-1, 0}, + expectedMax: 0, + }, + { + nums: []int{-1, -2}, + expectedMax: -1, + }, + { + nums: []int{0, 1}, + expectedMax: 1, + }, + { + nums: []int{1, 2}, + expectedMax: 2, + }, + } + + for i, test := range tests { + t.Logf("executing scenario %d", i) + if max := IntMax(test.nums[0], test.nums[1]); max != test.expectedMax { + t.Errorf("expected %v, got %v", test.expectedMax, max) + } + } +} + +func TestIntMin(t *testing.T) { + tests := []struct { + nums []int + expectedMin int + }{ + { + nums: []int{-1, 0}, + expectedMin: -1, + }, + { + nums: []int{-1, -2}, + expectedMin: -2, + }, + { + nums: []int{0, 1}, + expectedMin: 0, + }, + { + nums: []int{1, 2}, + expectedMin: 1, + }, + } + + for i, test := range tests { + t.Logf("executing scenario %d", i) + if min := IntMin(test.nums[0], test.nums[1]); min != test.expectedMin { + t.Errorf("expected %v, got %v", test.expectedMin, min) + } + } +} + +func TestInt32Max(t *testing.T) { + tests := []struct { + nums []int32 + expectedMax int32 + }{ + { + nums: []int32{-1, 0}, + expectedMax: 0, + }, + { + nums: []int32{-1, -2}, + expectedMax: -1, + }, + { + nums: []int32{0, 1}, + expectedMax: 1, + }, + { + nums: []int32{1, 2}, + expectedMax: 2, + }, + } + + for i, test := range tests { + t.Logf("executing scenario %d", i) + if max := Int32Max(test.nums[0], test.nums[1]); max != test.expectedMax { + t.Errorf("expected %v, got %v", test.expectedMax, max) + } + } +} + +func TestInt32Min(t *testing.T) { + tests := []struct { + nums []int32 + expectedMin int32 + }{ + { + nums: []int32{-1, 0}, + expectedMin: -1, + }, + { + nums: []int32{-1, -2}, + expectedMin: -2, + }, + { + nums: []int32{0, 1}, + expectedMin: 0, + }, + { + nums: []int32{1, 2}, + expectedMin: 1, + }, + } + + for i, test := range tests { + t.Logf("executing scenario %d", i) + if min := Int32Min(test.nums[0], test.nums[1]); min != test.expectedMin { + t.Errorf("expected %v, got %v", test.expectedMin, min) + } + } +} + +func TestInt64Max(t *testing.T) { + tests := []struct { + nums []int64 + expectedMax int64 + }{ + { + nums: []int64{-1, 0}, + expectedMax: 0, + }, + { + nums: []int64{-1, -2}, + expectedMax: -1, + }, + { + nums: []int64{0, 1}, + expectedMax: 1, + }, + { + nums: []int64{1, 2}, + expectedMax: 2, + }, + } + + for i, test := range tests { + t.Logf("executing scenario %d", i) + if max := Int64Max(test.nums[0], test.nums[1]); max != test.expectedMax { + t.Errorf("expected %v, got %v", test.expectedMax, max) + } + } +} + +func TestInt64Min(t *testing.T) { + tests := []struct { + nums []int64 + expectedMin int64 + }{ + { + nums: []int64{-1, 0}, + expectedMin: -1, + }, + { + nums: []int64{-1, -2}, + expectedMin: -2, + }, + { + nums: []int64{0, 1}, + expectedMin: 0, + }, + { + nums: []int64{1, 2}, + expectedMin: 1, + }, + } + + for i, test := range tests { + t.Logf("executing scenario %d", i) + if min := Int64Min(test.nums[0], test.nums[1]); min != test.expectedMin { + t.Errorf("expected %v, got %v", test.expectedMin, min) + } + } +} + +func TestRoundToInt32(t *testing.T) { + tests := []struct { + num float64 + exp int32 + }{ + { + num: 5.5, + exp: 6, + }, + { + num: -3.7, + exp: -4, + }, + { + num: 3.49, + exp: 3, + }, + { + num: -7.9, + exp: -8, + }, + { + num: -4.499999, + exp: -4, + }, + { + num: 0, + exp: 0, + }, + } + + for i, test := range tests { + t.Logf("executing scenario %d", i) + if got := RoundToInt32(test.num); got != test.exp { + t.Errorf("expected %d, got %d", test.exp, got) + } + } +} diff --git a/pkg/util/jsonpath/doc.go b/pkg/util/jsonpath/doc.go index 2a6e1706..bdbd056c 100644 --- a/pkg/util/jsonpath/doc.go +++ b/pkg/util/jsonpath/doc.go @@ -17,4 +17,4 @@ limitations under the License. // package jsonpath is a template engine using jsonpath syntax, // which can be seen at http://goessner.net/articles/JsonPath/. // In addition, it has {range} {end} function to iterate list and slice. -package jsonpath +package jsonpath // import "k8s.io/client-go/pkg/util/jsonpath" diff --git a/pkg/util/jsonpath/jsonpath_test.go b/pkg/util/jsonpath/jsonpath_test.go new file mode 100644 index 00000000..72d54710 --- /dev/null +++ b/pkg/util/jsonpath/jsonpath_test.go @@ -0,0 +1,282 @@ +/* +Copyright 2015 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 jsonpath + +import ( + "bytes" + "encoding/json" + "fmt" + "reflect" + "sort" + "strings" + "testing" +) + +type jsonpathTest struct { + name string + template string + input interface{} + expect string +} + +func testJSONPath(tests []jsonpathTest, allowMissingKeys bool, t *testing.T) { + for _, test := range tests { + j := New(test.name) + j.AllowMissingKeys(allowMissingKeys) + err := j.Parse(test.template) + if err != nil { + t.Errorf("in %s, parse %s error %v", test.name, test.template, err) + } + buf := new(bytes.Buffer) + err = j.Execute(buf, test.input) + if err != nil { + t.Errorf("in %s, execute error %v", test.name, err) + } + out := buf.String() + if out != test.expect { + t.Errorf(`in %s, expect to get "%s", got "%s"`, test.name, test.expect, out) + } + } +} + +// testJSONPathSortOutput test cases related to map, the results may print in random order +func testJSONPathSortOutput(tests []jsonpathTest, t *testing.T) { + for _, test := range tests { + j := New(test.name) + err := j.Parse(test.template) + if err != nil { + t.Errorf("in %s, parse %s error %v", test.name, test.template, err) + } + buf := new(bytes.Buffer) + err = j.Execute(buf, test.input) + if err != nil { + t.Errorf("in %s, execute error %v", test.name, err) + } + out := buf.String() + //since map is visited in random order, we need to sort the results. + sortedOut := strings.Fields(out) + sort.Strings(sortedOut) + sortedExpect := strings.Fields(test.expect) + sort.Strings(sortedExpect) + if !reflect.DeepEqual(sortedOut, sortedExpect) { + t.Errorf(`in %s, expect to get "%s", got "%s"`, test.name, test.expect, out) + } + } +} + +func testFailJSONPath(tests []jsonpathTest, t *testing.T) { + for _, test := range tests { + j := New(test.name) + err := j.Parse(test.template) + if err != nil { + t.Errorf("in %s, parse %s error %v", test.name, test.template, err) + } + buf := new(bytes.Buffer) + err = j.Execute(buf, test.input) + var out string + if err == nil { + out = "nil" + } else { + out = err.Error() + } + if out != test.expect { + t.Errorf("in %s, expect to get error %q, got %q", test.name, test.expect, out) + } + } +} + +type book struct { + Category string + Author string + Title string + Price float32 +} + +func (b book) String() string { + return fmt.Sprintf("{Category: %s, Author: %s, Title: %s, Price: %v}", b.Category, b.Author, b.Title, b.Price) +} + +type bicycle struct { + Color string + Price float32 +} + +type empName string +type job string +type store struct { + Book []book + Bicycle bicycle + Name string + Labels map[string]int + Employees map[empName]job +} + +func TestStructInput(t *testing.T) { + + storeData := store{ + Name: "jsonpath", + Book: []book{ + {"reference", "Nigel Rees", "Sayings of the Centurey", 8.95}, + {"fiction", "Evelyn Waugh", "Sword of Honour", 12.99}, + {"fiction", "Herman Melville", "Moby Dick", 8.99}, + }, + Bicycle: bicycle{"red", 19.95}, + Labels: map[string]int{ + "engieer": 10, + "web/html": 15, + "k8s-app": 20, + }, + Employees: map[empName]job{ + "jason": "manager", + "dan": "clerk", + }, + } + + storeTests := []jsonpathTest{ + {"plain", "hello jsonpath", nil, "hello jsonpath"}, + {"recursive", "{..}", []int{1, 2, 3}, "[1 2 3]"}, + {"filter", "{[?(@<5)]}", []int{2, 6, 3, 7}, "2 3"}, + {"quote", `{"{"}`, nil, "{"}, + {"union", "{[1,3,4]}", []int{0, 1, 2, 3, 4}, "1 3 4"}, + {"array", "{[0:2]}", []string{"Monday", "Tudesday"}, "Monday Tudesday"}, + {"variable", "hello {.Name}", storeData, "hello jsonpath"}, + {"dict/", "{$.Labels.web/html}", storeData, "15"}, + {"dict/", "{$.Employees.jason}", storeData, "manager"}, + {"dict/", "{$.Employees.dan}", storeData, "clerk"}, + {"dict-", "{.Labels.k8s-app}", storeData, "20"}, + {"nest", "{.Bicycle.Color}", storeData, "red"}, + {"allarray", "{.Book[*].Author}", storeData, "Nigel Rees Evelyn Waugh Herman Melville"}, + {"allfileds", "{.Bicycle.*}", storeData, "red 19.95"}, + {"recurfileds", "{..Price}", storeData, "8.95 12.99 8.99 19.95"}, + {"lastarray", "{.Book[-1:]}", storeData, + "{Category: fiction, Author: Herman Melville, Title: Moby Dick, Price: 8.99}"}, + {"recurarray", "{..Book[2]}", storeData, + "{Category: fiction, Author: Herman Melville, Title: Moby Dick, Price: 8.99}"}, + } + testJSONPath(storeTests, false, t) + + missingKeyTests := []jsonpathTest{ + {"nonexistent field", "{.hello}", storeData, ""}, + } + testJSONPath(missingKeyTests, true, t) + + failStoreTests := []jsonpathTest{ + {"invalid identifier", "{hello}", storeData, "unrecognized identifier hello"}, + {"nonexistent field", "{.hello}", storeData, "hello is not found"}, + {"invalid array", "{.Labels[0]}", storeData, "map[string]int is not array or slice"}, + {"invalid filter operator", "{.Book[?(@.Price<>10)]}", storeData, "unrecognized filter operator <>"}, + {"redundent end", "{range .Labels.*}{@}{end}{end}", storeData, "not in range, nothing to end"}, + } + testFailJSONPath(failStoreTests, t) +} + +func TestJSONInput(t *testing.T) { + var pointsJSON = []byte(`[ + {"id": "i1", "x":4, "y":-5}, + {"id": "i2", "x":-2, "y":-5, "z":1}, + {"id": "i3", "x": 8, "y": 3 }, + {"id": "i4", "x": -6, "y": -1 }, + {"id": "i5", "x": 0, "y": 2, "z": 1 }, + {"id": "i6", "x": 1, "y": 4 } + ]`) + var pointsData interface{} + err := json.Unmarshal(pointsJSON, &pointsData) + if err != nil { + t.Error(err) + } + pointsTests := []jsonpathTest{ + {"exists filter", "{[?(@.z)].id}", pointsData, "i2 i5"}, + {"bracket key", "{[0]['id']}", pointsData, "i1"}, + } + testJSONPath(pointsTests, false, t) +} + +// TestKubernetes tests some use cases from kubernetes +func TestKubernetes(t *testing.T) { + var input = []byte(`{ + "kind": "List", + "items":[ + { + "kind":"None", + "metadata":{ + "name":"127.0.0.1", + "labels":{ + "kubernetes.io/hostname":"127.0.0.1" + } + }, + "status":{ + "capacity":{"cpu":"4"}, + "addresses":[{"type": "LegacyHostIP", "address":"127.0.0.1"}] + } + }, + { + "kind":"None", + "metadata":{ + "name":"127.0.0.2", + "labels":{ + "kubernetes.io/hostname":"127.0.0.2" + } + }, + "status":{ + "capacity":{"cpu":"8"}, + "addresses":[ + {"type": "LegacyHostIP", "address":"127.0.0.2"}, + {"type": "another", "address":"127.0.0.3"} + ] + } + } + ], + "users":[ + { + "name": "myself", + "user": {} + }, + { + "name": "e2e", + "user": {"username": "admin", "password": "secret"} + } + ] + }`) + var nodesData interface{} + err := json.Unmarshal(input, &nodesData) + if err != nil { + t.Error(err) + } + + nodesTests := []jsonpathTest{ + {"range item", `{range .items[*]}{.metadata.name}, {end}{.kind}`, nodesData, "127.0.0.1, 127.0.0.2, List"}, + {"range item with quote", `{range .items[*]}{.metadata.name}{"\t"}{end}`, nodesData, "127.0.0.1\t127.0.0.2\t"}, + {"range addresss", `{.items[*].status.addresses[*].address}`, nodesData, + "127.0.0.1 127.0.0.2 127.0.0.3"}, + {"double range", `{range .items[*]}{range .status.addresses[*]}{.address}, {end}{end}`, nodesData, + "127.0.0.1, 127.0.0.2, 127.0.0.3, "}, + {"item name", `{.items[*].metadata.name}`, nodesData, "127.0.0.1 127.0.0.2"}, + {"union nodes capacity", `{.items[*]['metadata.name', 'status.capacity']}`, nodesData, + "127.0.0.1 127.0.0.2 map[cpu:4] map[cpu:8]"}, + {"range nodes capacity", `{range .items[*]}[{.metadata.name}, {.status.capacity}] {end}`, nodesData, + "[127.0.0.1, map[cpu:4]] [127.0.0.2, map[cpu:8]] "}, + {"user password", `{.users[?(@.name=="e2e")].user.password}`, &nodesData, "secret"}, + {"hostname", `{.items[0].metadata.labels.kubernetes\.io/hostname}`, &nodesData, "127.0.0.1"}, + {"hostname filter", `{.items[?(@.metadata.labels.kubernetes\.io/hostname=="127.0.0.1")].kind}`, &nodesData, "None"}, + } + testJSONPath(nodesTests, false, t) + + randomPrintOrderTests := []jsonpathTest{ + {"recursive name", "{..name}", nodesData, `127.0.0.1 127.0.0.2 myself e2e`}, + } + testJSONPathSortOutput(randomPrintOrderTests, t) +} diff --git a/pkg/util/jsonpath/parser_test.go b/pkg/util/jsonpath/parser_test.go new file mode 100644 index 00000000..48dd4f61 --- /dev/null +++ b/pkg/util/jsonpath/parser_test.go @@ -0,0 +1,136 @@ +/* +Copyright 2015 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 jsonpath + +import ( + "testing" +) + +type parserTest struct { + name string + text string + nodes []Node + shouldError bool +} + +var parserTests = []parserTest{ + {"plain", `hello jsonpath`, []Node{newText("hello jsonpath")}, false}, + {"variable", `hello {.jsonpath}`, + []Node{newText("hello "), newList(), newField("jsonpath")}, false}, + {"arrayfiled", `hello {['jsonpath']}`, + []Node{newText("hello "), newList(), newField("jsonpath")}, false}, + {"quote", `{"{"}`, []Node{newList(), newText("{")}, false}, + {"array", `{[1:3]}`, []Node{newList(), + newArray([3]ParamsEntry{{1, true}, {3, true}, {0, false}})}, false}, + {"allarray", `{.book[*].author}`, + []Node{newList(), newField("book"), + newArray([3]ParamsEntry{{0, false}, {0, false}, {0, false}}), newField("author")}, false}, + {"wildcard", `{.bicycle.*}`, + []Node{newList(), newField("bicycle"), newWildcard()}, false}, + {"filter", `{[?(@.price<3)]}`, + []Node{newList(), newFilter(newList(), newList(), "<"), + newList(), newField("price"), newList(), newInt(3)}, false}, + {"recursive", `{..}`, []Node{newList(), newRecursive()}, false}, + {"recurField", `{..price}`, + []Node{newList(), newRecursive(), newField("price")}, false}, + {"arraydict", `{['book.price']}`, []Node{newList(), + newField("book"), newField("price"), + }, false}, + {"union", `{['bicycle.price', 3, 'book.price']}`, []Node{newList(), newUnion([]*ListNode{}), + newList(), newField("bicycle"), newField("price"), + newList(), newArray([3]ParamsEntry{{3, true}, {4, true}, {0, false}}), + newList(), newField("book"), newField("price"), + }, false}, + {"range", `{range .items}{.name},{end}`, []Node{ + newList(), newIdentifier("range"), newField("items"), + newList(), newField("name"), newText(","), + newList(), newIdentifier("end"), + }, false}, + {"malformat input", `{\\\}`, []Node{}, true}, +} + +func collectNode(nodes []Node, cur Node) []Node { + nodes = append(nodes, cur) + switch cur.Type() { + case NodeList: + for _, node := range cur.(*ListNode).Nodes { + nodes = collectNode(nodes, node) + } + case NodeFilter: + nodes = collectNode(nodes, cur.(*FilterNode).Left) + nodes = collectNode(nodes, cur.(*FilterNode).Right) + case NodeUnion: + for _, node := range cur.(*UnionNode).Nodes { + nodes = collectNode(nodes, node) + } + } + return nodes +} + +func TestParser(t *testing.T) { + for _, test := range parserTests { + parser, err := Parse(test.name, test.text) + if test.shouldError { + if err == nil { + t.Errorf("unexpected non-error when parsing %s", test.name) + } + continue + } + if err != nil { + t.Errorf("parse %s error %v", test.name, err) + } + result := collectNode([]Node{}, parser.Root)[1:] + if len(result) != len(test.nodes) { + t.Errorf("in %s, expect to get %d nodes, got %d nodes", test.name, len(test.nodes), len(result)) + t.Error(result) + } + for i, expect := range test.nodes { + if result[i].String() != expect.String() { + t.Errorf("in %s, %dth node, expect %v, got %v", test.name, i, expect, result[i]) + } + } + } +} + +type failParserTest struct { + name string + text string + err string +} + +func TestFailParser(t *testing.T) { + failParserTests := []failParserTest{ + {"unclosed action", "{.hello", "unclosed action"}, + {"unrecognized character", "{*}", "unrecognized character in action: U+002A '*'"}, + {"invalid number", "{+12.3.0}", "cannot parse number +12.3.0"}, + {"unterminated array", "{[1}", "unterminated array"}, + {"invalid index", "{[::-1]}", "invalid array index ::-1"}, + {"unterminated filter", "{[?(.price]}", "unterminated filter"}, + } + for _, test := range failParserTests { + _, err := Parse(test.name, test.text) + var out string + if err == nil { + out = "nil" + } else { + out = err.Error() + } + if out != test.err { + t.Errorf("in %s, expect to get error %v, got %v", test.name, test.err, out) + } + } +} diff --git a/pkg/util/strategicpatch/patch.go b/pkg/util/strategicpatch/patch.go index 49179313..1c1319ea 100644 --- a/pkg/util/strategicpatch/patch.go +++ b/pkg/util/strategicpatch/patch.go @@ -48,6 +48,13 @@ const ( deleteFromPrimitiveListDirectivePrefix = "$deleteFromPrimitiveList" ) +// JSONMap is a representations of JSON object encoded as map[string]interface{} +// where the children can be either map[string]interface{}, []interface{} or +// primitive type). +// Operating on JSONMap representation is much faster as it doesn't require any +// json marshaling and/or unmarshaling operations. +type JSONMap map[string]interface{} + // IsPreconditionFailed returns true if the provided error indicates // a precondition failed. func IsPreconditionFailed(err error) bool { @@ -136,11 +143,6 @@ func RequireMetadataKeyUnchanged(key string) PreconditionFunc { } } -// Deprecated: Use the synonym CreateTwoWayMergePatch, instead. -func CreateStrategicMergePatch(original, modified []byte, dataStruct interface{}) ([]byte, error) { - return CreateTwoWayMergePatch(original, modified, dataStruct) -} - // CreateTwoWayMergePatch creates a patch that can be passed to StrategicMergePatch from an original // document and a modified document, which are passed to the method as json encoded content. It will // return a patch that yields the modified document when applied to the original document, or an error @@ -160,12 +162,24 @@ func CreateTwoWayMergePatch(original, modified []byte, dataStruct interface{}, f } } + patchMap, err := CreateTwoWayMergeMapPatch(originalMap, modifiedMap, dataStruct, fns...) + if err != nil { + return nil, err + } + + return json.Marshal(patchMap) +} + +// CreateTwoWayMergeMapPatch creates a patch from an original and modified JSON objects, +// encoded JSONMap. +// The serialized version of the map can then be passed to StrategicMergeMapPatch. +func CreateTwoWayMergeMapPatch(original, modified JSONMap, dataStruct interface{}, fns ...PreconditionFunc) (JSONMap, error) { t, err := getTagStructType(dataStruct) if err != nil { return nil, err } - patchMap, err := diffMaps(originalMap, modifiedMap, t, false, false) + patchMap, err := diffMaps(original, modified, t, false, false) if err != nil { return nil, err } @@ -177,7 +191,7 @@ func CreateTwoWayMergePatch(original, modified []byte, dataStruct interface{}, f } } - return json.Marshal(patchMap) + return patchMap, nil } // Returns a (recursive) strategic merge patch that yields modified when applied to original. @@ -494,12 +508,6 @@ loopB: return patch, nil } -// Deprecated: StrategicMergePatchData is deprecated. Use the synonym StrategicMergePatch, -// instead, which follows the naming convention of evanphx/json-patch. -func StrategicMergePatchData(original, patch []byte, dataStruct interface{}) ([]byte, error) { - return StrategicMergePatch(original, patch, dataStruct) -} - // StrategicMergePatch applies a strategic merge patch. The patch and the original document // must be json encoded content. A patch can be created from an original and a modified document // by calling CreateStrategicMergePatch. @@ -524,12 +532,7 @@ func StrategicMergePatch(original, patch []byte, dataStruct interface{}) ([]byte return nil, errBadJSONDoc } - t, err := getTagStructType(dataStruct) - if err != nil { - return nil, err - } - - result, err := mergeMap(originalMap, patchMap, t, true) + result, err := StrategicMergeMapPatch(originalMap, patchMap, dataStruct) if err != nil { return nil, err } @@ -537,6 +540,17 @@ func StrategicMergePatch(original, patch []byte, dataStruct interface{}) ([]byte return json.Marshal(result) } +// StrategicMergePatch applies a strategic merge patch. The original and patch documents +// must be JSONMap. A patch can be created from an original and modified document by +// calling CreateTwoWayMergeMapPatch. +func StrategicMergeMapPatch(original, patch JSONMap, dataStruct interface{}) (JSONMap, error) { + t, err := getTagStructType(dataStruct) + if err != nil { + return nil, err + } + return mergeMap(original, patch, t, true) +} + func getTagStructType(dataStruct interface{}) (reflect.Type, error) { if dataStruct == nil { return nil, fmt.Errorf(errBadArgTypeFmt, "struct", "nil") diff --git a/pkg/util/testing/fake_handler_test.go b/pkg/util/testing/fake_handler_test.go new file mode 100644 index 00000000..0d2c3e42 --- /dev/null +++ b/pkg/util/testing/fake_handler_test.go @@ -0,0 +1,180 @@ +/* +Copyright 2014 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 testing + +import ( + "bytes" + "net/http" + "net/http/httptest" + "testing" +) + +func TestFakeHandlerPath(t *testing.T) { + handler := FakeHandler{StatusCode: http.StatusOK} + server := httptest.NewServer(&handler) + defer server.Close() + method := "GET" + path := "/foo/bar" + body := "somebody" + + req, err := http.NewRequest(method, server.URL+path, bytes.NewBufferString(body)) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + client := http.Client{} + _, err = client.Do(req) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + handler.ValidateRequest(t, path, method, &body) +} + +func TestFakeHandlerPathNoBody(t *testing.T) { + handler := FakeHandler{StatusCode: http.StatusOK} + server := httptest.NewServer(&handler) + defer server.Close() + method := "GET" + path := "/foo/bar" + + req, err := http.NewRequest(method, server.URL+path, nil) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + client := http.Client{} + _, err = client.Do(req) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + handler.ValidateRequest(t, path, method, nil) +} + +type fakeError struct { + errors []string +} + +func (f *fakeError) Errorf(format string, args ...interface{}) { + f.errors = append(f.errors, format) +} + +func (f *fakeError) Logf(format string, args ...interface{}) {} + +func TestFakeHandlerWrongPath(t *testing.T) { + handler := FakeHandler{StatusCode: http.StatusOK} + server := httptest.NewServer(&handler) + defer server.Close() + method := "GET" + path := "/foo/bar" + fakeT := fakeError{} + + req, err := http.NewRequest(method, server.URL+"/foo/baz", nil) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + client := http.Client{} + _, err = client.Do(req) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + handler.ValidateRequest(&fakeT, path, method, nil) + if len(fakeT.errors) != 1 { + t.Errorf("Unexpected error set: %#v", fakeT.errors) + } +} + +func TestFakeHandlerWrongMethod(t *testing.T) { + handler := FakeHandler{StatusCode: http.StatusOK} + server := httptest.NewServer(&handler) + defer server.Close() + method := "GET" + path := "/foo/bar" + fakeT := fakeError{} + + req, err := http.NewRequest("PUT", server.URL+path, nil) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + client := http.Client{} + _, err = client.Do(req) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + handler.ValidateRequest(&fakeT, path, method, nil) + if len(fakeT.errors) != 1 { + t.Errorf("Unexpected error set: %#v", fakeT.errors) + } +} + +func TestFakeHandlerWrongBody(t *testing.T) { + handler := FakeHandler{StatusCode: http.StatusOK} + server := httptest.NewServer(&handler) + defer server.Close() + method := "GET" + path := "/foo/bar" + body := "somebody" + fakeT := fakeError{} + + req, err := http.NewRequest(method, server.URL+path, bytes.NewBufferString(body)) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + client := http.Client{} + _, err = client.Do(req) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + otherbody := "otherbody" + handler.ValidateRequest(&fakeT, path, method, &otherbody) + if len(fakeT.errors) != 1 { + t.Errorf("Unexpected error set: %#v", fakeT.errors) + } +} + +func TestFakeHandlerNilBody(t *testing.T) { + handler := FakeHandler{StatusCode: http.StatusOK} + server := httptest.NewServer(&handler) + defer server.Close() + method := "GET" + path := "/foo/bar" + body := "somebody" + fakeT := fakeError{} + + req, err := http.NewRequest(method, server.URL+path, nil) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + client := http.Client{} + _, err = client.Do(req) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + handler.ValidateRequest(&fakeT, path, method, &body) + if len(fakeT.errors) != 1 { + t.Errorf("Unexpected error set: %#v", fakeT.errors) + } +} diff --git a/plugin/pkg/client/auth/gcp/gcp.go b/plugin/pkg/client/auth/gcp/gcp.go index 84a95767..a891fd57 100644 --- a/plugin/pkg/client/auth/gcp/gcp.go +++ b/plugin/pkg/client/auth/gcp/gcp.go @@ -32,11 +32,11 @@ import ( "golang.org/x/oauth2/google" "k8s.io/apimachinery/pkg/util/yaml" "k8s.io/client-go/pkg/util/jsonpath" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" ) func init() { - if err := rest.RegisterAuthProviderPlugin("gcp", newGCPAuthProvider); err != nil { + if err := restclient.RegisterAuthProviderPlugin("gcp", newGCPAuthProvider); err != nil { glog.Fatalf("Failed to register gcp auth plugin: %v", err) } } @@ -85,10 +85,10 @@ func init() { // type gcpAuthProvider struct { tokenSource oauth2.TokenSource - persister rest.AuthProviderConfigPersister + persister restclient.AuthProviderConfigPersister } -func newGCPAuthProvider(_ string, gcpConfig map[string]string, persister rest.AuthProviderConfigPersister) (rest.AuthProvider, error) { +func newGCPAuthProvider(_ string, gcpConfig map[string]string, persister restclient.AuthProviderConfigPersister) (restclient.AuthProvider, error) { cmd, useCmd := gcpConfig["cmd-path"] var ts oauth2.TokenSource var err error @@ -121,11 +121,11 @@ type cachedTokenSource struct { source oauth2.TokenSource accessToken string expiry time.Time - persister rest.AuthProviderConfigPersister + persister restclient.AuthProviderConfigPersister cache map[string]string } -func newCachedTokenSource(accessToken, expiry string, persister rest.AuthProviderConfigPersister, ts oauth2.TokenSource, cache map[string]string) (*cachedTokenSource, error) { +func newCachedTokenSource(accessToken, expiry string, persister restclient.AuthProviderConfigPersister, ts oauth2.TokenSource, cache map[string]string) (*cachedTokenSource, error) { var expiryTime time.Time if parsedTime, err := time.Parse(time.RFC3339Nano, expiry); err == nil { expiryTime = parsedTime diff --git a/plugin/pkg/client/auth/oidc/oidc.go b/plugin/pkg/client/auth/oidc/oidc.go index 606be453..ca5b72cb 100644 --- a/plugin/pkg/client/auth/oidc/oidc.go +++ b/plugin/pkg/client/auth/oidc/oidc.go @@ -30,7 +30,7 @@ import ( "github.com/coreos/go-oidc/oidc" "github.com/golang/glog" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" ) const ( @@ -45,7 +45,7 @@ const ( ) func init() { - if err := rest.RegisterAuthProviderPlugin("oidc", newOIDCAuthProvider); err != nil { + if err := restclient.RegisterAuthProviderPlugin("oidc", newOIDCAuthProvider); err != nil { glog.Fatalf("Failed to register oidc auth plugin: %v", err) } } @@ -106,7 +106,7 @@ func (c *clientCache) setClient(issuer, clientID, clientSecret string, client *o return client } -func newOIDCAuthProvider(_ string, cfg map[string]string, persister rest.AuthProviderConfigPersister) (rest.AuthProvider, error) { +func newOIDCAuthProvider(_ string, cfg map[string]string, persister restclient.AuthProviderConfigPersister) (restclient.AuthProvider, error) { issuer := cfg[cfgIssuerUrl] if issuer == "" { return nil, fmt.Errorf("Must provide %s", cfgIssuerUrl) @@ -136,14 +136,14 @@ func newOIDCAuthProvider(_ string, cfg map[string]string, persister rest.AuthPro } } - clientConfig := rest.Config{ - TLSClientConfig: rest.TLSClientConfig{ + clientConfig := restclient.Config{ + TLSClientConfig: restclient.TLSClientConfig{ CAFile: cfg[cfgCertificateAuthority], CAData: certAuthData, }, } - trans, err := rest.TransportFor(&clientConfig) + trans, err := restclient.TransportFor(&clientConfig) if err != nil { return nil, err } @@ -191,7 +191,7 @@ type oidcAuthProvider struct { // the RoundTripper only trigger a single refresh request. mu sync.Mutex cfg map[string]string - persister rest.AuthProviderConfigPersister + persister restclient.AuthProviderConfigPersister } func (p *oidcAuthProvider) WrapTransport(rt http.RoundTripper) http.RoundTripper { diff --git a/plugin/pkg/client/auth/oidc/oidc_test.go b/plugin/pkg/client/auth/oidc/oidc_test.go index 7ef319b2..16e11492 100644 --- a/plugin/pkg/client/auth/oidc/oidc_test.go +++ b/plugin/pkg/client/auth/oidc/oidc_test.go @@ -30,7 +30,7 @@ import ( "github.com/coreos/go-oidc/key" "github.com/coreos/go-oidc/oauth2" - oidctesting "k8s.io/client-go/plugin/pkg/auth/authenticator/token/oidc/testing" + oidctesting "k8s.io/kubernetes/plugin/pkg/auth/authenticator/token/oidc/testing" ) func clearCache() { diff --git a/rest/fake/fake.go b/rest/fake/fake.go index 7882006f..f3447f44 100644 --- a/rest/fake/fake.go +++ b/rest/fake/fake.go @@ -28,7 +28,7 @@ import ( "k8s.io/client-go/pkg/api" "k8s.io/client-go/pkg/api/testapi" "k8s.io/client-go/pkg/util/flowcontrol" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" ) func CreateHTTPClient(roundTripper func(*http.Request) (*http.Response, error)) *http.Client { @@ -54,27 +54,27 @@ type RESTClient struct { Err error } -func (c *RESTClient) Get() *rest.Request { +func (c *RESTClient) Get() *restclient.Request { return c.request("GET") } -func (c *RESTClient) Put() *rest.Request { +func (c *RESTClient) Put() *restclient.Request { return c.request("PUT") } -func (c *RESTClient) Patch(_ types.PatchType) *rest.Request { +func (c *RESTClient) Patch(_ types.PatchType) *restclient.Request { return c.request("PATCH") } -func (c *RESTClient) Post() *rest.Request { +func (c *RESTClient) Post() *restclient.Request { return c.request("POST") } -func (c *RESTClient) Delete() *rest.Request { +func (c *RESTClient) Delete() *restclient.Request { return c.request("DELETE") } -func (c *RESTClient) Verb(verb string) *rest.Request { +func (c *RESTClient) Verb(verb string) *restclient.Request { return c.request(verb) } @@ -86,8 +86,8 @@ func (c *RESTClient) GetRateLimiter() flowcontrol.RateLimiter { return nil } -func (c *RESTClient) request(verb string) *rest.Request { - config := rest.ContentConfig{ +func (c *RESTClient) request(verb string) *restclient.Request { + config := restclient.ContentConfig{ ContentType: runtime.ContentTypeJSON, GroupVersion: &api.Registry.GroupOrDie(api.GroupName).GroupVersion, NegotiatedSerializer: c.NegotiatedSerializer, @@ -104,7 +104,7 @@ func (c *RESTClient) request(verb string) *rest.Request { Version: runtime.APIVersionInternal, } internalVersion.Version = runtime.APIVersionInternal - serializers := rest.Serializers{ + serializers := restclient.Serializers{ Encoder: ns.EncoderForVersion(info.Serializer, api.Registry.GroupOrDie(api.GroupName).GroupVersion), Decoder: ns.DecoderToVersion(info.Serializer, internalVersion), } @@ -112,7 +112,7 @@ func (c *RESTClient) request(verb string) *rest.Request { serializers.StreamingSerializer = info.StreamSerializer.Serializer serializers.Framer = info.StreamSerializer.Framer } - return rest.NewRequest(c, verb, &url.URL{Host: "localhost"}, "", config, serializers, nil, nil) + return restclient.NewRequest(c, verb, &url.URL{Host: "localhost"}, "", config, serializers, nil, nil) } func (c *RESTClient) Do(req *http.Request) (*http.Response, error) { diff --git a/rest/request.go b/rest/request.go index 59b66569..875dd6c7 100644 --- a/rest/request.go +++ b/rest/request.go @@ -35,6 +35,7 @@ import ( "github.com/golang/glog" "k8s.io/apimachinery/pkg/api/errors" 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/schema" @@ -43,8 +44,6 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/watch" "k8s.io/client-go/pkg/api/v1" - pathvalidation "k8s.io/client-go/pkg/api/validation/path" - "k8s.io/client-go/pkg/fields" "k8s.io/client-go/pkg/util/flowcontrol" restclientwatch "k8s.io/client-go/rest/watch" "k8s.io/client-go/tools/metrics" @@ -179,7 +178,7 @@ func (r *Request) Resource(resource string) *Request { r.err = fmt.Errorf("resource already set to %q, cannot change to %q", r.resource, resource) return r } - if msgs := pathvalidation.IsValidPathSegmentName(resource); len(msgs) != 0 { + if msgs := IsValidPathSegmentName(resource); len(msgs) != 0 { r.err = fmt.Errorf("invalid resource %q: %v", resource, msgs) return r } @@ -199,7 +198,7 @@ func (r *Request) SubResource(subresources ...string) *Request { return r } for _, s := range subresources { - if msgs := pathvalidation.IsValidPathSegmentName(s); len(msgs) != 0 { + if msgs := IsValidPathSegmentName(s); len(msgs) != 0 { r.err = fmt.Errorf("invalid subresource %q: %v", s, msgs) return r } @@ -221,7 +220,7 @@ func (r *Request) Name(resourceName string) *Request { r.err = fmt.Errorf("resource name already set to %q, cannot change to %q", r.resourceName, resourceName) return r } - if msgs := pathvalidation.IsValidPathSegmentName(resourceName); len(msgs) != 0 { + if msgs := IsValidPathSegmentName(resourceName); len(msgs) != 0 { r.err = fmt.Errorf("invalid resource name %q: %v", resourceName, msgs) return r } @@ -238,7 +237,7 @@ func (r *Request) Namespace(namespace string) *Request { r.err = fmt.Errorf("namespace already set to %q, cannot change to %q", r.namespace, namespace) return r } - if msgs := pathvalidation.IsValidPathSegmentName(namespace); len(msgs) != 0 { + if msgs := IsValidPathSegmentName(namespace); len(msgs) != 0 { r.err = fmt.Errorf("invalid namespace %q: %v", namespace, msgs) return r } @@ -760,10 +759,11 @@ func (r *Request) Stream() (io.ReadCloser, error) { defer resp.Body.Close() result := r.transformResponse(resp, req) - if result.err != nil { - return nil, result.err + err := result.Error() + if err == nil { + err = fmt.Errorf("%d while accessing %v: %s", result.statusCode, url, string(result.body)) } - return nil, fmt.Errorf("%d while accessing %v: %s", result.statusCode, url, string(result.body)) + return nil, err } } @@ -1197,3 +1197,49 @@ func (r Result) Error() error { } return r.err } + +// NameMayNotBe specifies strings that cannot be used as names specified as path segments (like the REST API or etcd store) +var NameMayNotBe = []string{".", ".."} + +// NameMayNotContain specifies substrings that cannot be used in names specified as path segments (like the REST API or etcd store) +var NameMayNotContain = []string{"/", "%"} + +// IsValidPathSegmentName validates the name can be safely encoded as a path segment +func IsValidPathSegmentName(name string) []string { + for _, illegalName := range NameMayNotBe { + if name == illegalName { + return []string{fmt.Sprintf(`may not be '%s'`, illegalName)} + } + } + + var errors []string + for _, illegalContent := range NameMayNotContain { + if strings.Contains(name, illegalContent) { + errors = append(errors, fmt.Sprintf(`may not contain '%s'`, illegalContent)) + } + } + + return errors +} + +// IsValidPathSegmentPrefix validates the name can be used as a prefix for a name which will be encoded as a path segment +// It does not check for exact matches with disallowed names, since an arbitrary suffix might make the name valid +func IsValidPathSegmentPrefix(name string) []string { + var errors []string + for _, illegalContent := range NameMayNotContain { + if strings.Contains(name, illegalContent) { + errors = append(errors, fmt.Sprintf(`may not contain '%s'`, illegalContent)) + } + } + + return errors +} + +// ValidatePathSegmentName validates the name can be safely encoded as a path segment +func ValidatePathSegmentName(name string, prefix bool) []string { + if prefix { + return IsValidPathSegmentPrefix(name) + } else { + return IsValidPathSegmentName(name) + } +} diff --git a/rest/request_test.go b/rest/request_test.go index 05e9276b..223dc783 100755 --- a/rest/request_test.go +++ b/rest/request_test.go @@ -868,6 +868,7 @@ func TestRequestStream(t *testing.T) { testCases := []struct { Request *Request Err bool + ErrFn func(error) bool }{ { Request: &Request{err: errors.New("bail")}, @@ -903,6 +904,26 @@ func TestRequestStream(t *testing.T) { }, Err: true, }, + { + Request: &Request{ + client: clientFunc(func(req *http.Request) (*http.Response, error) { + return &http.Response{ + StatusCode: http.StatusBadRequest, + Body: ioutil.NopCloser(bytes.NewReader([]byte(`{"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"a container name must be specified for pod kube-dns-v20-mz5cv, choose one of: [kubedns dnsmasq healthz]","reason":"BadRequest","code":400}`))), + }, nil + }), + content: defaultContentConfig(), + serializers: defaultSerializers(), + baseURL: &url.URL{}, + }, + Err: true, + ErrFn: func(err error) bool { + if err.Error() == "a container name must be specified for pod kube-dns-v20-mz5cv, choose one of: [kubedns dnsmasq healthz]" { + return true + } + return false + }, + }, } for i, testCase := range testCases { testCase.Request.backoffMgr = &NoBackoff{} @@ -914,6 +935,12 @@ func TestRequestStream(t *testing.T) { if hasErr && body != nil { t.Errorf("%d: body should be nil when error is returned", i) } + + if hasErr { + if testCase.ErrFn != nil && !testCase.ErrFn(err) { + t.Errorf("unexpected error: %v", err) + } + } } } diff --git a/testing/actions.go b/testing/actions.go index 3af5f74d..44656b2e 100644 --- a/testing/actions.go +++ b/testing/actions.go @@ -21,12 +21,12 @@ import ( "path" "strings" + "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/pkg/api" "k8s.io/client-go/pkg/api/v1" - "k8s.io/client-go/pkg/fields" ) func NewRootGetAction(resource schema.GroupVersionResource, name string) GetActionImpl { diff --git a/testing/fake.go b/testing/fake.go index 32a860f8..da47b23b 100644 --- a/testing/fake.go +++ b/testing/fake.go @@ -26,7 +26,7 @@ import ( "k8s.io/apimachinery/pkg/version" "k8s.io/apimachinery/pkg/watch" kubeversion "k8s.io/client-go/pkg/version" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" ) // Fake implements client.Interface. Meant to be embedded into a struct to get @@ -77,7 +77,7 @@ type ProxyReactor interface { Handles(action Action) bool // React handles a watch action and returns results. It may choose to // delegate by indicating handled=false. - React(action Action) (handled bool, ret rest.ResponseWrapper, err error) + React(action Action) (handled bool, ret restclient.ResponseWrapper, err error) } // ReactionFunc is a function that returns an object or error for a given @@ -95,7 +95,7 @@ type WatchReactionFunc func(action Action) (handled bool, ret watch.Interface, e // ProxyReactionFunc is a function that returns a ResponseWrapper interface // for a given Action. If "handled" is false, then the test client will // ignore the results and continue to the next ProxyReactionFunc. -type ProxyReactionFunc func(action Action) (handled bool, ret rest.ResponseWrapper, err error) +type ProxyReactionFunc func(action Action) (handled bool, ret restclient.ResponseWrapper, err error) // AddReactor appends a reactor to the end of the chain. func (c *Fake) AddReactor(verb, resource string, reaction ReactionFunc) { @@ -176,7 +176,7 @@ func (c *Fake) InvokesWatch(action Action) (watch.Interface, error) { // InvokesProxy records the provided Action and then invokes the ReactionFunc // that handles the action if one exists. -func (c *Fake) InvokesProxy(action Action) rest.ResponseWrapper { +func (c *Fake) InvokesProxy(action Action) restclient.ResponseWrapper { c.Lock() defer c.Unlock() diff --git a/testing/fixture.go b/testing/fixture.go index 06502218..64a617cf 100644 --- a/testing/fixture.go +++ b/testing/fixture.go @@ -27,7 +27,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/watch" "k8s.io/client-go/pkg/api" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" ) // ObjectTracker keeps track of objects. It is intended to be used to @@ -511,6 +511,6 @@ func (r *SimpleProxyReactor) Handles(action Action) bool { return true } -func (r *SimpleProxyReactor) React(action Action) (bool, rest.ResponseWrapper, error) { +func (r *SimpleProxyReactor) React(action Action) (bool, restclient.ResponseWrapper, error) { return r.Reaction(action) } diff --git a/tools/auth/clientauth.go b/tools/auth/clientauth.go index d820adca..2213b987 100644 --- a/tools/auth/clientauth.go +++ b/tools/auth/clientauth.go @@ -68,7 +68,7 @@ import ( "io/ioutil" "os" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" ) // Info holds Kubernetes API authorization config. It is intended @@ -104,8 +104,8 @@ func LoadFromFile(path string) (*Info, error) { // MergeWithConfig returns a copy of a client.Config with values from the Info. // The fields of client.Config with a corresponding field in the Info are set // with the value from the Info. -func (info Info) MergeWithConfig(c rest.Config) (rest.Config, error) { - var config rest.Config = c +func (info Info) MergeWithConfig(c restclient.Config) (restclient.Config, error) { + var config restclient.Config = c config.Username = info.User config.Password = info.Password config.CAFile = info.CAFile diff --git a/tools/cache/listwatch.go b/tools/cache/listwatch.go index c3b6177a..c3d1eece 100644 --- a/tools/cache/listwatch.go +++ b/tools/cache/listwatch.go @@ -20,12 +20,12 @@ import ( "time" "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/watch" "k8s.io/client-go/pkg/api" "k8s.io/client-go/pkg/api/v1" - "k8s.io/client-go/pkg/fields" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" ) // ListerWatcher is any object that knows how to perform an initial list and start a watch on a resource. @@ -53,7 +53,7 @@ type ListWatch struct { // Getter interface knows how to access Get method from RESTClient. type Getter interface { - Get() *rest.Request + Get() *restclient.Request } // NewListWatchFromClient creates a new ListWatch from the specified client, resource, namespace and field selector. diff --git a/tools/clientcmd/client_config.go b/tools/clientcmd/client_config.go index 66206879..39e923ea 100644 --- a/tools/clientcmd/client_config.go +++ b/tools/clientcmd/client_config.go @@ -28,7 +28,7 @@ import ( "github.com/imdario/mergo" "k8s.io/client-go/pkg/api" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" clientauth "k8s.io/client-go/tools/auth" clientcmdapi "k8s.io/client-go/tools/clientcmd/api" ) @@ -58,7 +58,7 @@ type ClientConfig interface { // RawConfig returns the merged result of all overrides RawConfig() (clientcmdapi.Config, error) // ClientConfig returns a complete client config - ClientConfig() (*rest.Config, error) + ClientConfig() (*restclient.Config, error) // Namespace returns the namespace resulting from the merged // result of all overrides and a boolean indicating if it was // overridden @@ -67,7 +67,7 @@ type ClientConfig interface { ConfigAccess() ConfigAccess } -type PersistAuthProviderConfigForUser func(user string) rest.AuthProviderConfigPersister +type PersistAuthProviderConfigForUser func(user string) restclient.AuthProviderConfigPersister type promptedCredentials struct { username string @@ -105,7 +105,7 @@ func (config *DirectClientConfig) RawConfig() (clientcmdapi.Config, error) { } // ClientConfig implements ClientConfig -func (config *DirectClientConfig) ClientConfig() (*rest.Config, error) { +func (config *DirectClientConfig) ClientConfig() (*restclient.Config, error) { // check that getAuthInfo, getContext, and getCluster do not return an error. // Do this before checking if the curent config is usable in the event that an // AuthInfo, Context, or Cluster config with user-defined names are not found. @@ -129,7 +129,7 @@ func (config *DirectClientConfig) ClientConfig() (*rest.Config, error) { return nil, err } - clientConfig := &rest.Config{} + clientConfig := &restclient.Config{} clientConfig.Host = configClusterInfo.Server if len(config.overrides.Timeout) > 0 { @@ -146,17 +146,17 @@ func (config *DirectClientConfig) ClientConfig() (*rest.Config, error) { clientConfig.Host = u.String() } if len(configAuthInfo.Impersonate) > 0 { - clientConfig.Impersonate = rest.ImpersonationConfig{UserName: configAuthInfo.Impersonate} + clientConfig.Impersonate = restclient.ImpersonationConfig{UserName: configAuthInfo.Impersonate} } // only try to read the auth information if we are secure - if rest.IsConfigTransportTLS(*clientConfig) { + if restclient.IsConfigTransportTLS(*clientConfig) { var err error // mergo is a first write wins for map value and a last writing wins for interface values // NOTE: This behavior changed with https://github.com/imdario/mergo/commit/d304790b2ed594794496464fadd89d2bb266600a. // Our mergo.Merge version is older than this change. - var persister rest.AuthProviderConfigPersister + var persister restclient.AuthProviderConfigPersister if config.configAccess != nil { authInfoName, _ := config.getAuthInfoName() persister = PersisterForUser(config.configAccess, authInfoName) @@ -183,11 +183,11 @@ func (config *DirectClientConfig) ClientConfig() (*rest.Config, error) { // 1. configClusterInfo (the final result of command line flags and merged .kubeconfig files) // 2. configAuthInfo.auth-path (this file can contain information that conflicts with #1, and we want #1 to win the priority) // 3. load the ~/.kubernetes_auth file as a default -func getServerIdentificationPartialConfig(configAuthInfo clientcmdapi.AuthInfo, configClusterInfo clientcmdapi.Cluster) (*rest.Config, error) { - mergedConfig := &rest.Config{} +func getServerIdentificationPartialConfig(configAuthInfo clientcmdapi.AuthInfo, configClusterInfo clientcmdapi.Cluster) (*restclient.Config, error) { + mergedConfig := &restclient.Config{} // configClusterInfo holds the information identify the server provided by .kubeconfig - configClientConfig := &rest.Config{} + configClientConfig := &restclient.Config{} configClientConfig.CAFile = configClusterInfo.CertificateAuthority configClientConfig.CAData = configClusterInfo.CertificateAuthorityData configClientConfig.Insecure = configClusterInfo.InsecureSkipTLSVerify @@ -203,8 +203,8 @@ func getServerIdentificationPartialConfig(configAuthInfo clientcmdapi.AuthInfo, // 2. configAuthInfo.auth-path (this file can contain information that conflicts with #1, and we want #1 to win the priority) // 3. if there is not enough information to idenfity the user, load try the ~/.kubernetes_auth file // 4. if there is not enough information to identify the user, prompt if possible -func (config *DirectClientConfig) getUserIdentificationPartialConfig(configAuthInfo clientcmdapi.AuthInfo, fallbackReader io.Reader, persistAuthConfig rest.AuthProviderConfigPersister) (*rest.Config, error) { - mergedConfig := &rest.Config{} +func (config *DirectClientConfig) getUserIdentificationPartialConfig(configAuthInfo clientcmdapi.AuthInfo, fallbackReader io.Reader, persistAuthConfig restclient.AuthProviderConfigPersister) (*restclient.Config, error) { + mergedConfig := &restclient.Config{} // blindly overwrite existing values based on precedence if len(configAuthInfo.Token) > 0 { @@ -217,7 +217,7 @@ func (config *DirectClientConfig) getUserIdentificationPartialConfig(configAuthI mergedConfig.BearerToken = string(tokenBytes) } if len(configAuthInfo.Impersonate) > 0 { - mergedConfig.Impersonate = rest.ImpersonationConfig{UserName: configAuthInfo.Impersonate} + mergedConfig.Impersonate = restclient.ImpersonationConfig{UserName: configAuthInfo.Impersonate} } if len(configAuthInfo.ClientCertificate) > 0 || len(configAuthInfo.ClientCertificateData) > 0 { mergedConfig.CertFile = configAuthInfo.ClientCertificate @@ -248,7 +248,7 @@ func (config *DirectClientConfig) getUserIdentificationPartialConfig(configAuthI } promptedConfig := makeUserIdentificationConfig(*promptedAuthInfo) previouslyMergedConfig := mergedConfig - mergedConfig = &rest.Config{} + mergedConfig = &restclient.Config{} mergo.Merge(mergedConfig, promptedConfig) mergo.Merge(mergedConfig, previouslyMergedConfig) config.promptedCredentials.username = mergedConfig.Username @@ -259,8 +259,8 @@ func (config *DirectClientConfig) getUserIdentificationPartialConfig(configAuthI } // makeUserIdentificationFieldsConfig returns a client.Config capable of being merged using mergo for only user identification information -func makeUserIdentificationConfig(info clientauth.Info) *rest.Config { - config := &rest.Config{} +func makeUserIdentificationConfig(info clientauth.Info) *restclient.Config { + config := &restclient.Config{} config.Username = info.User config.Password = info.Password config.CertFile = info.CertFile @@ -270,8 +270,8 @@ func makeUserIdentificationConfig(info clientauth.Info) *rest.Config { } // makeUserIdentificationFieldsConfig returns a client.Config capable of being merged using mergo for only server identification information -func makeServerIdentificationConfig(info clientauth.Info) rest.Config { - config := rest.Config{} +func makeServerIdentificationConfig(info clientauth.Info) restclient.Config { + config := restclient.Config{} config.CAFile = info.CAFile if info.Insecure != nil { config.Insecure = *info.Insecure @@ -279,7 +279,7 @@ func makeServerIdentificationConfig(info clientauth.Info) rest.Config { return config } -func canIdentifyUser(config rest.Config) bool { +func canIdentifyUser(config restclient.Config) bool { return len(config.Username) > 0 || (len(config.CertFile) > 0 || len(config.CertData) > 0) || len(config.BearerToken) > 0 || @@ -442,7 +442,7 @@ func (config *DirectClientConfig) getCluster() (clientcmdapi.Cluster, error) { // Can take options overrides for flags explicitly provided to the command inside the cluster container. type inClusterClientConfig struct { overrides *ConfigOverrides - inClusterConfigProvider func() (*rest.Config, error) + inClusterConfigProvider func() (*restclient.Config, error) } var _ ClientConfig = &inClusterClientConfig{} @@ -451,9 +451,9 @@ func (config *inClusterClientConfig) RawConfig() (clientcmdapi.Config, error) { return clientcmdapi.Config{}, fmt.Errorf("inCluster environment config doesn't support multiple clusters") } -func (config *inClusterClientConfig) ClientConfig() (*rest.Config, error) { +func (config *inClusterClientConfig) ClientConfig() (*restclient.Config, error) { if config.inClusterConfigProvider == nil { - config.inClusterConfigProvider = rest.InClusterConfig + config.inClusterConfigProvider = restclient.InClusterConfig } icc, err := config.inClusterConfigProvider() @@ -512,10 +512,10 @@ func (config *inClusterClientConfig) Possible() bool { // components. Warnings should reflect this usage. If neither masterUrl or kubeconfigPath // are passed in we fallback to inClusterConfig. If inClusterConfig fails, we fallback // to the default config. -func BuildConfigFromFlags(masterUrl, kubeconfigPath string) (*rest.Config, error) { +func BuildConfigFromFlags(masterUrl, kubeconfigPath string) (*restclient.Config, error) { if kubeconfigPath == "" && masterUrl == "" { glog.Warningf("Neither --kubeconfig nor --master was specified. Using the inClusterConfig. This might not work.") - kubeconfig, err := rest.InClusterConfig() + kubeconfig, err := restclient.InClusterConfig() if err == nil { return kubeconfig, nil } @@ -528,7 +528,7 @@ func BuildConfigFromFlags(masterUrl, kubeconfigPath string) (*rest.Config, error // BuildConfigFromKubeconfigGetter is a helper function that builds configs from a master // url and a kubeconfigGetter. -func BuildConfigFromKubeconfigGetter(masterUrl string, kubeconfigGetter KubeconfigGetter) (*rest.Config, error) { +func BuildConfigFromKubeconfigGetter(masterUrl string, kubeconfigGetter KubeconfigGetter) (*restclient.Config, error) { // TODO: We do not need a DeferredLoader here. Refactor code and see if we can use DirectClientConfig here. cc := NewNonInteractiveDeferredLoadingClientConfig( &ClientConfigGetter{kubeconfigGetter: kubeconfigGetter}, diff --git a/tools/clientcmd/client_config_test.go b/tools/clientcmd/client_config_test.go index c78cca27..0cbff3f8 100644 --- a/tools/clientcmd/client_config_test.go +++ b/tools/clientcmd/client_config_test.go @@ -24,7 +24,7 @@ import ( "testing" "github.com/imdario/mergo" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" clientcmdapi "k8s.io/client-go/tools/clientcmd/api" ) @@ -448,11 +448,11 @@ func TestInClusterClientConfigPrecedence(t *testing.T) { expectedCAFile := "/path/to/ca-from-cluster.crt" icc := &inClusterClientConfig{ - inClusterConfigProvider: func() (*rest.Config, error) { - return &rest.Config{ + inClusterConfigProvider: func() (*restclient.Config, error) { + return &restclient.Config{ Host: expectedServer, BearerToken: expectedToken, - TLSClientConfig: rest.TLSClientConfig{ + TLSClientConfig: restclient.TLSClientConfig{ CAFile: expectedCAFile, }, }, nil diff --git a/tools/clientcmd/config.go b/tools/clientcmd/config.go index 3e5aa49a..16ccdaf2 100644 --- a/tools/clientcmd/config.go +++ b/tools/clientcmd/config.go @@ -26,7 +26,7 @@ import ( "github.com/golang/glog" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" clientcmdapi "k8s.io/client-go/tools/clientcmd/api" ) @@ -325,7 +325,7 @@ func ModifyConfig(configAccess ConfigAccess, newConfig clientcmdapi.Config, rela return nil } -func PersisterForUser(configAccess ConfigAccess, user string) rest.AuthProviderConfigPersister { +func PersisterForUser(configAccess ConfigAccess, user string) restclient.AuthProviderConfigPersister { return &persister{configAccess, user} } diff --git a/tools/clientcmd/loader.go b/tools/clientcmd/loader.go index 5fcc0ad5..9d8b6592 100644 --- a/tools/clientcmd/loader.go +++ b/tools/clientcmd/loader.go @@ -34,7 +34,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/client-go/pkg/util/homedir" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" clientcmdapi "k8s.io/client-go/tools/clientcmd/api" clientcmdlatest "k8s.io/client-go/tools/clientcmd/api/latest" ) @@ -68,7 +68,7 @@ func currentMigrationRules() map[string]string { type ClientConfigLoader interface { ConfigAccess // IsDefaultConfig returns true if the returned config matches the defaults. - IsDefaultConfig(*rest.Config) bool + IsDefaultConfig(*restclient.Config) bool // Load returns the latest config Load() (*clientcmdapi.Config, error) } @@ -101,7 +101,7 @@ func (g *ClientConfigGetter) IsExplicitFile() bool { func (g *ClientConfigGetter) GetExplicitFile() string { return "" } -func (g *ClientConfigGetter) IsDefaultConfig(config *rest.Config) bool { +func (g *ClientConfigGetter) IsDefaultConfig(config *restclient.Config) bool { return false } @@ -330,7 +330,7 @@ func (rules *ClientConfigLoadingRules) GetExplicitFile() string { } // IsDefaultConfig returns true if the provided configuration matches the default -func (rules *ClientConfigLoadingRules) IsDefaultConfig(config *rest.Config) bool { +func (rules *ClientConfigLoadingRules) IsDefaultConfig(config *restclient.Config) bool { if rules.DefaultClientConfig == nil { return false } diff --git a/tools/clientcmd/merged_client_builder.go b/tools/clientcmd/merged_client_builder.go index ef15deed..92c1a5a0 100644 --- a/tools/clientcmd/merged_client_builder.go +++ b/tools/clientcmd/merged_client_builder.go @@ -22,7 +22,7 @@ import ( "github.com/golang/glog" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" clientcmdapi "k8s.io/client-go/tools/clientcmd/api" ) @@ -94,7 +94,7 @@ func (config *DeferredLoadingClientConfig) RawConfig() (clientcmdapi.Config, err } // ClientConfig implements ClientConfig -func (config *DeferredLoadingClientConfig) ClientConfig() (*rest.Config, error) { +func (config *DeferredLoadingClientConfig) ClientConfig() (*restclient.Config, error) { mergedClientConfig, err := config.createClientConfig() if err != nil { return nil, err diff --git a/tools/clientcmd/merged_client_builder_test.go b/tools/clientcmd/merged_client_builder_test.go index e73fc93b..8b038676 100644 --- a/tools/clientcmd/merged_client_builder_test.go +++ b/tools/clientcmd/merged_client_builder_test.go @@ -20,7 +20,7 @@ import ( "fmt" "testing" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" clientcmdapi "k8s.io/client-go/tools/clientcmd/api" ) @@ -38,7 +38,7 @@ func (l *testLoader) Load() (*clientcmdapi.Config, error) { } type testClientConfig struct { - config *rest.Config + config *restclient.Config namespace string namespaceSpecified bool err error @@ -47,7 +47,7 @@ type testClientConfig struct { func (c *testClientConfig) RawConfig() (clientcmdapi.Config, error) { return clientcmdapi.Config{}, fmt.Errorf("unexpected call") } -func (c *testClientConfig) ClientConfig() (*rest.Config, error) { +func (c *testClientConfig) ClientConfig() (*restclient.Config, error) { return c.config, c.err } func (c *testClientConfig) Namespace() (string, bool, error) { @@ -95,7 +95,7 @@ func TestInClusterConfig(t *testing.T) { if err != nil { t.Fatal(err) } - config2 := &rest.Config{Host: "config2"} + config2 := &restclient.Config{Host: "config2"} err1 := fmt.Errorf("unique error") testCases := map[string]struct { @@ -104,7 +104,7 @@ func TestInClusterConfig(t *testing.T) { defaultConfig *DirectClientConfig checkedICC bool - result *rest.Config + result *restclient.Config err error }{ "in-cluster checked on other error": { diff --git a/tools/record/event.go b/tools/record/event.go index 9162fc0c..e195cc83 100644 --- a/tools/record/event.go +++ b/tools/record/event.go @@ -28,7 +28,7 @@ import ( "k8s.io/apimachinery/pkg/watch" "k8s.io/client-go/pkg/api/v1" "k8s.io/client-go/pkg/util/clock" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" "net/http" @@ -188,7 +188,7 @@ func recordEvent(sink EventSink, event *v1.Event, patch []byte, updateExistingEv // If we can't contact the server, then hold everything while we keep trying. // Otherwise, something about the event is malformed and we should abandon it. switch err.(type) { - case *rest.RequestConstructionError: + case *restclient.RequestConstructionError: // We will construct the request the same next time, so don't keep trying. glog.Errorf("Unable to construct event '%#v': '%v' (will not retry!)", event, err) return true diff --git a/tools/record/event_test.go b/tools/record/event_test.go index cfef4fb8..60bc928e 100644 --- a/tools/record/event_test.go +++ b/tools/record/event_test.go @@ -32,7 +32,7 @@ import ( "k8s.io/client-go/pkg/api/v1" "k8s.io/client-go/pkg/util/clock" "k8s.io/client-go/pkg/util/strategicpatch" - "k8s.io/client-go/rest" + restclient "k8s.io/client-go/rest" ) type testEventSink struct { @@ -387,7 +387,7 @@ func TestWriteEventError(t *testing.T) { "giveUp1": { timesToSendError: 1000, attemptsWanted: 1, - err: &rest.RequestConstructionError{}, + err: &restclient.RequestConstructionError{}, }, "giveUp2": { timesToSendError: 1000, diff --git a/tools/record/events_cache.go b/tools/record/events_cache.go index caa8f60d..abb03ebb 100644 --- a/tools/record/events_cache.go +++ b/tools/record/events_cache.go @@ -244,7 +244,7 @@ func (e *eventLogger) eventObserve(newEvent *v1.Event) (*v1.Event, []byte, error newData, _ := json.Marshal(event) oldData, _ := json.Marshal(eventCopy2) - patch, err = strategicpatch.CreateStrategicMergePatch(oldData, newData, event) + patch, err = strategicpatch.CreateTwoWayMergePatch(oldData, newData, event) } // record our new observation diff --git a/pkg/fields/doc.go b/vendor/k8s.io/apimachinery/pkg/fields/doc.go similarity index 100% rename from pkg/fields/doc.go rename to vendor/k8s.io/apimachinery/pkg/fields/doc.go diff --git a/pkg/fields/fields.go b/vendor/k8s.io/apimachinery/pkg/fields/fields.go similarity index 100% rename from pkg/fields/fields.go rename to vendor/k8s.io/apimachinery/pkg/fields/fields.go diff --git a/pkg/fields/requirements.go b/vendor/k8s.io/apimachinery/pkg/fields/requirements.go similarity index 100% rename from pkg/fields/requirements.go rename to vendor/k8s.io/apimachinery/pkg/fields/requirements.go diff --git a/pkg/fields/selector.go b/vendor/k8s.io/apimachinery/pkg/fields/selector.go similarity index 100% rename from pkg/fields/selector.go rename to vendor/k8s.io/apimachinery/pkg/fields/selector.go diff --git a/kubernetes/typed/policy/v1alpha1/generated_expansion.go b/vendor/k8s.io/apimachinery/pkg/openapi/doc.go similarity index 83% rename from kubernetes/typed/policy/v1alpha1/generated_expansion.go rename to vendor/k8s.io/apimachinery/pkg/openapi/doc.go index a2e74c84..5ed572cc 100644 --- a/kubernetes/typed/policy/v1alpha1/generated_expansion.go +++ b/vendor/k8s.io/apimachinery/pkg/openapi/doc.go @@ -14,6 +14,5 @@ See the License for the specific language governing permissions and limitations under the License. */ -package v1alpha1 - -type PodDisruptionBudgetExpansion interface{} +// package openapi holds shared codes and types between open API code generator and spec generator. +package openapi